) // ——————————————————————————————————————————————————————————— add_action('admin_menu', function(){ add_menu_page( 'Reijnders Plugin Creator AI','RPC AI','manage_options', 'reijnders-plugin-creator-ai','rpvea_render','dashicons-hammer',58 ); }); add_action('admin_enqueue_scripts', function($hook){ if ( strpos($hook,'reijnders-plugin-creator-ai') === false ) return; // CSS inline wp_add_inline_style('wp-admin', ' .rpvea-grid{display:grid;grid-template-columns:300px 1fr 380px;gap:12px} .rpvea-card{background:#fff;border:1px solid #e2e4e7;padding:12px;border-radius:10px;box-shadow:0 1px 1px rgba(0,0,0,.03)} .rpvea-row{display:flex;gap:8px;align-items:center}.rpvea-row.between{justify-content:space-between} .rpvea-console{background:#111;color:#e8e8e8;font-family:monospace;min-height:140px;padding:10px;border-radius:8px;white-space:pre-wrap} .rpvea-tree{max-height:360px;overflow:auto;background:#fafafa;border:1px dashed #ddd;border-radius:8px;padding:8px} .rpvea-tree .item{padding:4px 6px;border-radius:6px;cursor:pointer} .rpvea-tree .item.active{background:#e7f1ff} .rpvea-tree .dir{font-weight:600} textarea#rpvea-prompt{width:100%} .rpvea-upload{margin-top:8px;display:flex;gap:8px;align-items:center;flex-wrap:wrap} .rpvea-bad{color:#b32d2e}.rpvea-warn{color:#d9881d}.rpvea-ok{color:#2a7} @media(max-width:1280px){.rpvea-grid{grid-template-columns:260px 1fr 300px}} @media(max-width:1024px){.rpvea-grid{grid-template-columns:1fr}.rpvea-col.preview,.rpvea-col.files{order:2}.rpvea-col.main{order:1}} '); // JS inline (jQuery aanwezig in admin) $nonce = wp_create_nonce('rpvea_nonce'); wp_add_inline_script('jquery-core', '(function($){ const SK="rpvea_state_v200"; const st = Object.assign({project:null,selectedPath:"",prompt:""}, JSON.parse(localStorage.getItem(SK)||"{}")); function save(){ localStorage.setItem(SK, JSON.stringify(st)); } function log(t){ const el=$("#rpvea-console"); el.append((el.text()?"\\n":"")+t); el.scrollTop(el[0].scrollHeight); } function badge(scan){ if(!scan) return ""; let e="🟢"; if(scan.status==="orange") e="🟠"; if(scan.status==="red") e="🔴"; return " "+e; } function listProjects(){ $.post(ajaxurl,{action:"rpvea_list_projects",_wpnonce:"'.$nonce.'"}, function(res){ const box=$("#rpvea-projects").empty(); if(!res.success){ box.text(res.data&&res.data.message||"Fout bij laden."); return; } (res.data.projects||[]).forEach(p=>{ const b=$("").html(p.slug+badge(p.scan)); b.on("click",()=>{ st.project=p.slug; save(); tree(); log("📁 Project: "+p.slug); }); if(st.project===p.slug) b.addClass("button-primary"); box.append($("
").append(b)); }); if(!st.project && res.data.projects && res.data.projects[0]){ st.project=res.data.projects[0].slug; save(); tree(); } if(st.project) tree(); }); } function tree(){ if(!st.project){ $("#rpvea-tree").html("Geen project geselecteerd.
"); return; } $.post(ajaxurl,{action:"rpvea_list_files",_wpnonce:"'.$nonce.'",project:st.project}, function(res){ const c=$("#rpvea-tree").empty(); if(!res.success){ c.html("❌ "+(res.data&&res.data.message||"Error")+"
"); return; } const t=res.data.tree||[]; const dirs={}; t.forEach(n=>{ const top=n.path.split("/")[0]; (dirs[top]=dirs[top]||[]).push(n); }); Object.keys(dirs).sort().forEach(top=>{ const h=$("").text("📁 "+top).data("path", top).on("click",function(){ $(".rpvea-tree .item").removeClass("active"); $(this).addClass("active"); st.selectedPath=top; save(); }); c.append(h); dirs[top].forEach(n=>{ if(n.path===top) return; const it=$("").css("padding-left","18px").text((n.type==="file"?"📄 ":"📁 ")+n.path).data("path",n.path).on("click",function(){ $(".rpvea-tree .item").removeClass("active"); $(this).addClass("active"); st.selectedPath=n.path; save(); preview(n); }); c.append(it); }); }); if(st.selectedPath){ const it=$(".rpvea-tree .item").filter((i,el)=>$(el).data("path")===st.selectedPath); if(it.length) it.addClass("active"); } }); } function preview(n){ if(n.type==="dir"){ $("#rpvea-preview").html("Map geselecteerd.
"); return; } $.post(ajaxurl,{action:"rpvea_preview_file",_wpnonce:"'.$nonce.'",project:st.project,file:n.path}, function(res){ const box=$("#rpvea-preview"); if(!res.success){ box.html("❌ "+(res.data&&res.data.message||"Error")+"
"); return; } const d=res.data; if(["png","jpg","jpeg","gif","webp","svg"].includes(d.type)){ box.html(""+(d.content||"")+""); } }); } $("#rpvea-upload-btn").on("click", function(){ if(!st.project){ alert("Selecteer een project."); return; } const f=$("#rpvea-upload-file")[0].files[0]; if(!f){ alert("Kies een bestand."); return; } const fd=new FormData(); fd.append("action","rpvea_upload_file"); fd.append("_wpnonce","'.$nonce.'"); fd.append("project",st.project); const target=(st.selectedPath && st.selectedPath.indexOf(".")===-1)? st.selectedPath : ""; fd.append("target", target); fd.append("file", f); $.ajax({url:ajaxurl,type:"POST",data:fd,processData:false,contentType:false}).done(function(res){ if(res.success){ log("📤 Geüpload: "+res.data.path); tree(); } else { log("❌ "+(res.data&&res.data.message||"Upload fout")); } }); }); $("#rpvea-generate").on("click", function(){ const p=$("#rpvea-prompt").val(); st.prompt=p; save(); log("🧠 Prompt verwerken..."); $.post(ajaxurl,{action:"rpvea_generate",_wpnonce:"'.$nonce.'",prompt:p}, function(res){ if(!res.success){ log("❌ "+(res.data&&res.data.message||"Fout")); return; } log("✅ Gereed: "+res.data.slug); st.project=res.data.slug; save(); listProjects(); }); }); $("#rpvea-zip").on("click", function(){ if(!st.project){ alert("Selecteer een project."); return; } $.post(ajaxurl,{action:"rpvea_zip_project",_wpnonce:"'.$nonce.'",slug:st.project}, function(res){ if(res.success && res.data && res.data.url){ window.open(res.data.url,"_blank"); } else { log("❌ ZIP fout"); } }); }); $("#rpvea-install").on("click", function(){ if(!st.project){ alert("Selecteer een project."); return; } $.post(ajaxurl,{action:"rpvea_install_project",_wpnonce:"'.$nonce.'",slug:st.project}, function(res){ if(res.success){ alert(res.data.message); } else { alert("❌ "+(res.data&&res.data.message||"Install fout")); } }); }); $("#rpvea-delete").on("click", function(){ if(!st.project){ alert("Selecteer een project."); return; } if(!confirm("Weet je zeker dat je dit project wilt verwijderen?")) return; $.post(ajaxurl,{action:"rpvea_delete_project",_wpnonce:"'.$nonce.'",slug:st.project}, function(res){ if(res.success){ log("🗑️ Verwijderd."); st.project=null; save(); listProjects(); $("#rpvea-preview").empty(); } else { log("❌ "+(res.data&&res.data.message||"Delete fout")); } }); }); $("#rpvea-refresh").on("click", listProjects); $(function(){ if(st.prompt) $("#rpvea-prompt").val(st.prompt); listProjects(); }); })(jQuery);'); }); // ——————————————————————————————————————————————————————————— // Render admin dashboard (HTML) // ——————————————————————————————————————————————————————————— function rpvea_render(){ if ( ! current_user_can('manage_options') ) { wp_die(__('Geen toestemming.', 'reijnders-plugin-creator-ai')); } ?>