diff --git a/hifi/assets/index-CEtUzIVu.js b/hifi/assets/index-Ds-1nrOk.js similarity index 94% rename from hifi/assets/index-CEtUzIVu.js rename to hifi/assets/index-Ds-1nrOk.js index b7feda8..196f7ce 100644 --- a/hifi/assets/index-CEtUzIVu.js +++ b/hifi/assets/index-Ds-1nrOk.js @@ -74,5 +74,5 @@ Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}};var d4 The chosen QR Code version cannot contain this amount of data. Minimum version required to store current data is: `+i+`. `);const l=S4(t,n,s),o=jl.getSymbolSize(t),u=new f4(o);return y4(u,t),k4(u),w4(u,t),jo(u,n,0),t>=7&&j4(u,t),N4(u,l),isNaN(r)&&(r=Ju.getBestMask(u,jo.bind(null,u,n))),Ju.applyMask(r,u),jo(u,n,r),{modules:u,version:t,errorCorrectionLevel:n,maskPattern:r,segments:s}}gb.create=function(t,n){if(typeof t>"u"||t==="")throw new Error("No input text");let r=ko.M,s,i;return typeof n<"u"&&(r=ko.from(n.errorCorrectionLevel,ko.M),s=Gi.from(n.version),i=Ju.from(n.maskPattern),n.toSJISFunc&&jl.setToSJISFunction(n.toSJISFunc)),P4(t,s,r,i)};var Tb={},Ad={};(function(e){function t(n){if(typeof n=="number"&&(n=n.toString()),typeof n!="string")throw new Error("Color should be defined as hex string");let r=n.slice().replace("#","").split("");if(r.length<3||r.length===5||r.length>8)throw new Error("Invalid hex color: "+n);(r.length===3||r.length===4)&&(r=Array.prototype.concat.apply([],r.map(function(i){return[i,i]}))),r.length===6&&r.push("F","F");const s=parseInt(r.join(""),16);return{r:s>>24&255,g:s>>16&255,b:s>>8&255,a:s&255,hex:"#"+r.slice(0,6).join("")}}e.getOptions=function(r){r||(r={}),r.color||(r.color={});const s=typeof r.margin>"u"||r.margin===null||r.margin<0?4:r.margin,i=r.width&&r.width>=21?r.width:void 0,l=r.scale||4;return{width:i,scale:i?4:l,margin:s,color:{dark:t(r.color.dark||"#000000ff"),light:t(r.color.light||"#ffffffff")},type:r.type,rendererOpts:r.rendererOpts||{}}},e.getScale=function(r,s){return s.width&&s.width>=r+s.margin*2?s.width/(r+s.margin*2):s.scale},e.getImageWidth=function(r,s){const i=e.getScale(r,s);return Math.floor((r+s.margin*2)*i)},e.qrToImageData=function(r,s,i){const l=s.modules.size,o=s.modules.data,u=e.getScale(l,i),c=Math.floor((l+i.margin*2)*u),d=i.margin*u,h=[i.color.light,i.color.dark];for(let m=0;m=d&&f>=d&&m"u"&&(!l||!l.getContext)&&(u=l,l=void 0),l||(c=r()),u=t.getOptions(u);const d=t.getImageWidth(i.modules.size,u),h=c.getContext("2d"),m=h.createImageData(d,d);return t.qrToImageData(m.data,i,u),n(h,c,d),h.putImageData(m,0,0),c},e.renderToDataURL=function(i,l,o){let u=o;typeof u>"u"&&(!l||!l.getContext)&&(u=l,l=void 0),u||(u={});const c=e.render(i,l,u),d=u.type||"image/png",h=u.rendererOpts||{};return c.toDataURL(d,h.quality)}})(Tb);var Ab={};const E4=Ad;function Hf(e,t){const n=e.a/255,r=t+'="'+e.hex+'"';return n<1?r+" "+t+'-opacity="'+n.toFixed(2).slice(1)+'"':r}function No(e,t,n){let r=e+t;return typeof n<"u"&&(r+=" "+n),r}function T4(e,t,n){let r="",s=0,i=!1,l=0;for(let o=0;o0&&u>0&&e[o-1]||(r+=i?No("M",u+n,.5+c+n):No("m",s,0),s=0,i=!1),u+1':"",c="',d='viewBox="0 0 '+o+" "+o+'"',m=''+u+c+` -`;return typeof r=="function"&&r(null,m),m};const A4=$P,tc=gb,Mb=Tb,M4=Ab;function Md(e,t,n,r,s){const i=[].slice.call(arguments,1),l=i.length,o=typeof i[l-1]=="function";if(!o&&!A4())throw new Error("Callback required as last argument");if(o){if(l<2)throw new Error("Too few arguments provided");l===2?(s=n,n=t,t=r=void 0):l===3&&(t.getContext&&typeof s>"u"?(s=r,r=void 0):(s=r,r=n,n=t,t=void 0))}else{if(l<1)throw new Error("Too few arguments provided");return l===1?(n=t,t=r=void 0):l===2&&!t.getContext&&(r=n,n=t,t=void 0),new Promise(function(u,c){try{const d=tc.create(n,r);u(e(d,t,r))}catch(d){c(d)}})}try{const u=tc.create(n,r);s(null,e(u,t,r))}catch(u){s(u)}}ha.create=tc.create;ha.toCanvas=Md.bind(null,Mb.render);ha.toDataURL=Md.bind(null,Mb.renderToDataURL);ha.toString=Md.bind(null,function(e,t,n){return M4.render(e,n)});const $f={current_password:"",new_password:"",new_password_confirmation:"",two_factor_code:""};function _4(){const{user:e,refreshUser:t}=Bt(),[n,r]=g.useState("idle"),[s,i]=g.useState(""),[l,o]=g.useState(""),[u,c]=g.useState(""),[d,h]=g.useState(""),[m,f]=g.useState([]),[b,y]=g.useState(""),[w,x]=g.useState(!1),[p,v]=g.useState($f),[k,j]=g.useState(""),[C,S]=g.useState(""),[P,M]=g.useState(!1),E=async z=>{if(z.preventDefault(),j(""),S(""),p.new_password!==p.new_password_confirmation){j("Die neuen Passwörter stimmen nicht überein");return}M(!0);try{await A.post("/auth/change-password",p),v($f),S("Passwort erfolgreich geändert.")}catch($){j($.message)}finally{M(!1)}},N=async()=>{y(""),x(!0);try{const z=await A.get("/auth/2fa/setup");o(z.secret),i(await ha.toDataURL(z.otpauth_url)),c(""),r("setup")}catch(z){y(z.message)}finally{x(!1)}},L=async z=>{z.preventDefault(),y(""),x(!0);try{const $=await A.post("/auth/2fa/enable",{code:u});f($.recovery_codes),r("recovery-codes"),await t()}catch($){y($.message)}finally{x(!1)}},U=()=>{r("idle"),f([]),h("")},W=async z=>{z.preventDefault(),y(""),x(!0);try{await A.post("/auth/2fa/disable",{password:d}),h(""),r("idle"),await t()}catch($){y($.message)}finally{x(!1)}},q=async z=>{z.preventDefault(),y(""),x(!0);try{const $=await A.post("/auth/2fa/recovery-codes",{password:d});f($.recovery_codes),r("recovery-codes")}catch($){y($.message)}finally{x(!1)}};return a.jsxs("div",{className:"max-w-xl",children:[a.jsx("h1",{className:"mb-1 text-xl font-bold text-neutral-900 dark:text-white",children:"Mein Konto"}),a.jsxs("p",{className:"mb-6 text-sm text-neutral-500 dark:text-neutral-400",children:["Angemeldet als ",a.jsx("strong",{children:e==null?void 0:e.username}),e!=null&&e.is_super_admin?" (Super-Admin)":"","."]}),a.jsxs("div",{className:"mb-6 rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Passwort ändern"}),a.jsxs("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:["Vergib ein neues Passwort für dein Konto.",(e==null?void 0:e.two_factor_enabled)&&" Da 2FA aktiv ist, musst du die Änderung zusätzlich mit deinem Code bestätigen."]}),a.jsxs("form",{onSubmit:E,children:[a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Aktuelles Passwort"}),a.jsx("input",{type:"password",value:p.current_password,onChange:z=>v({...p,current_password:z.target.value}),required:!0,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Neues Passwort"}),a.jsx("input",{type:"password",value:p.new_password,onChange:z=>v({...p,new_password:z.target.value}),required:!0,minLength:8,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Neues Passwort wiederholen"}),a.jsx("input",{type:"password",value:p.new_password_confirmation,onChange:z=>v({...p,new_password_confirmation:z.target.value}),required:!0,minLength:8,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),(e==null?void 0:e.two_factor_enabled)&&a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"2FA-Code zur Bestätigung"}),a.jsx("input",{value:p.two_factor_code,onChange:z=>v({...p,two_factor_code:z.target.value}),required:!0,inputMode:"numeric",placeholder:"123456 oder Wiederherstellungscode",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),k&&a.jsx("p",{className:"mb-4 text-sm text-red-600",children:k}),C&&a.jsx("p",{className:"mb-4 text-sm text-green-600 dark:text-green-400",children:C}),a.jsx("button",{type:"submit",disabled:P,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-60",children:P?"Wird geändert…":"Passwort ändern"})]})]}),a.jsxs("div",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Zwei-Faktor-Authentifizierung"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Schützt dein Konto zusätzlich mit einem Code aus der Google Authenticator App."}),n==="idle"&&a.jsxs(a.Fragment,{children:[a.jsxs("p",{className:"mb-4 text-sm",children:["Status:"," ",e!=null&&e.two_factor_enabled?a.jsx("span",{className:"font-semibold text-green-600 dark:text-green-400",children:"Aktiv"}):a.jsx("span",{className:"font-semibold text-neutral-500 dark:text-neutral-400",children:"Nicht aktiv"})]}),e!=null&&e.two_factor_enabled?a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx("button",{onClick:()=>{r("regenerate"),y("")},className:"rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:"Neue Wiederherstellungscodes erzeugen"}),a.jsx("button",{onClick:()=>{r("disable"),y("")},className:"rounded-md border border-red-300 px-4 py-2 text-sm font-medium text-red-600 hover:bg-red-50 dark:border-red-900 dark:hover:bg-red-900/20",children:"2FA deaktivieren"})]}):a.jsx("button",{onClick:N,disabled:w,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-60",children:"2FA aktivieren"})]}),n==="setup"&&a.jsxs("form",{onSubmit:L,children:[a.jsxs("ol",{className:"mb-4 list-decimal space-y-2 pl-5 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("li",{children:"Öffne die Google Authenticator App (oder eine kompatible App)."}),a.jsx("li",{children:"Scanne den folgenden QR-Code:"})]}),a.jsx("div",{className:"mb-4 flex justify-center",children:s&&a.jsx("img",{src:s,alt:"QR-Code für Zwei-Faktor-Authentifizierung",className:"h-48 w-48 rounded-lg border border-neutral-200 dark:border-neutral-700"})}),a.jsxs("p",{className:"mb-4 text-center text-xs text-neutral-500 dark:text-neutral-400",children:["Geht das Scannen nicht? Gib diesen Code manuell ein: ",a.jsx("br",{}),a.jsx("code",{className:"mt-1 inline-block rounded bg-neutral-100 px-2 py-1 font-mono tracking-wider dark:bg-neutral-800",children:l})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Bestätigungscode aus der App"}),a.jsx("input",{value:u,onChange:z=>c(z.target.value),required:!0,autoFocus:!0,inputMode:"numeric",placeholder:"123456",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-center text-lg tracking-widest dark:border-neutral-700 dark:bg-neutral-900"})]}),b&&a.jsx("p",{className:"mb-4 text-sm text-red-600",children:b}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",disabled:w,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-60",children:"Bestätigen & aktivieren"}),a.jsx("button",{type:"button",onClick:()=>r("idle"),className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]}),n==="recovery-codes"&&a.jsxs("div",{children:[a.jsx("p",{className:"mb-3 text-sm font-semibold text-neutral-900 dark:text-white",children:"Wiederherstellungscodes – jetzt sicher speichern!"}),a.jsx("p",{className:"mb-3 text-sm text-neutral-500 dark:text-neutral-400",children:"Jeder Code funktioniert einmalig, falls du keinen Zugriff mehr auf die Authenticator-App hast. Diese Codes werden nur jetzt angezeigt."}),a.jsx("div",{className:"mb-4 grid grid-cols-2 gap-2 rounded-md bg-neutral-100 p-4 font-mono text-sm dark:bg-neutral-800",children:m.map(z=>a.jsx("span",{children:z},z))}),a.jsx("button",{onClick:U,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600",children:"Ich habe die Codes gespeichert"})]}),n==="disable"&&a.jsxs("form",{onSubmit:W,children:[a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Passwort zur Bestätigung"}),a.jsx("input",{type:"password",value:d,onChange:z=>h(z.target.value),required:!0,autoFocus:!0,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),b&&a.jsx("p",{className:"mb-4 text-sm text-red-600",children:b}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",disabled:w,className:"rounded-md bg-red-600 px-4 py-2 text-sm font-semibold text-white hover:bg-red-700 disabled:opacity-60",children:"2FA jetzt deaktivieren"}),a.jsx("button",{type:"button",onClick:()=>{r("idle"),h("")},className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]}),n==="regenerate"&&a.jsxs("form",{onSubmit:q,children:[a.jsx("p",{className:"mb-3 text-sm text-neutral-500 dark:text-neutral-400",children:"Die bisherigen Wiederherstellungscodes werden ungültig."}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Passwort zur Bestätigung"}),a.jsx("input",{type:"password",value:d,onChange:z=>h(z.target.value),required:!0,autoFocus:!0,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),b&&a.jsx("p",{className:"mb-4 text-sm text-red-600",children:b}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",disabled:w,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-60",children:"Neue Codes erzeugen"}),a.jsx("button",{type:"button",onClick:()=>{r("idle"),h("")},className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]})]})]})}const Gf={username:"",password:"",is_super_admin:!1,permissions:[],group_ids:[]};function L4(){const{user:e,hasPermission:t}=Bt(),[n,r]=g.useState([]),[s,i]=g.useState([]),[l,o]=g.useState([]),[u,c]=g.useState(Gf),[d,h]=g.useState(null),[m,f]=g.useState(""),b=()=>{A.get("/admin-users").then(r),A.get("/permissions/catalog").then(i),(t("permission_groups.manage")||t("users.manage"))&&A.get("/permission-groups").then(o)};g.useEffect(b,[]);const y=j=>{h(j.id),c({username:j.username,password:"",is_super_admin:j.is_super_admin,permissions:j.permissions,group_ids:j.groups.map(C=>C.id)})},w=()=>{h(null),c(Gf)},x=j=>{c(C=>({...C,permissions:C.permissions.includes(j)?C.permissions.filter(S=>S!==j):[...C.permissions,j]}))},p=j=>{c(C=>({...C,group_ids:C.group_ids.includes(j)?C.group_ids.filter(S=>S!==j):[...C.group_ids,j]}))},v=async j=>{j.preventDefault(),f("");try{if(d)await A.put(`/admin-users/${d}`,u);else{if(u.password.length<8){f("Passwort muss mindestens 8 Zeichen lang sein");return}await A.post("/admin-users",u)}w(),b()}catch(C){f(C.message)}},k=async j=>{if(confirm("Diesen Benutzer wirklich löschen?"))try{await A.delete(`/admin-users/${j}`),b()}catch(C){alert(C.message)}};return a.jsxs("div",{className:"grid gap-6 lg:grid-cols-3",children:[a.jsxs("div",{className:"lg:col-span-2",children:[a.jsx("h1",{className:"mb-1 text-xl font-bold text-neutral-900 dark:text-white",children:"Benutzer"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Jeder Mitarbeiter bekommt ein eigenes Konto mit genau den Rechten, die er braucht."}),a.jsx("div",{className:"overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-800",children:a.jsxs("table",{className:"w-full text-left text-sm",children:[a.jsx("thead",{className:"bg-neutral-50 text-neutral-500 dark:bg-neutral-900 dark:text-neutral-400",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-4 py-2",children:"Benutzername"}),a.jsx("th",{className:"px-4 py-2",children:"Rolle"}),a.jsx("th",{className:"px-4 py-2",children:"Berechtigungsgruppen"}),a.jsx("th",{className:"px-4 py-2 text-right",children:"Aktionen"})]})}),a.jsxs("tbody",{className:"divide-y divide-neutral-100 dark:divide-neutral-800",children:[n.map(j=>a.jsxs("tr",{className:"bg-white dark:bg-neutral-950",children:[a.jsxs("td",{className:"px-4 py-2 font-medium text-neutral-800 dark:text-neutral-100",children:[j.username,j.id===(e==null?void 0:e.id)&&a.jsx("span",{className:"ml-1 text-xs text-neutral-400",children:"(du)"})]}),a.jsx("td",{className:"px-4 py-2",children:j.is_super_admin?a.jsx("span",{className:"rounded-full bg-brand-100 px-2 py-0.5 text-xs font-medium text-brand-700 dark:bg-brand-900/40 dark:text-brand-300",children:"Super-Admin"}):a.jsxs("span",{className:"text-neutral-500 dark:text-neutral-400",children:[j.permissions.length," Einzelrechte"]})}),a.jsx("td",{className:"px-4 py-2",children:a.jsxs("div",{className:"flex flex-wrap gap-1",children:[j.groups.map(C=>a.jsx("span",{className:"rounded-full bg-neutral-100 px-2 py-0.5 text-xs text-neutral-600 dark:bg-neutral-800 dark:text-neutral-300",children:C.name},C.id)),j.groups.length===0&&"–"]})}),a.jsxs("td",{className:"px-4 py-2 text-right",children:[a.jsx("button",{onClick:()=>y(j),className:"mr-3 text-brand-600 hover:underline",children:"Bearbeiten"}),j.id!==(e==null?void 0:e.id)&&a.jsx("button",{onClick:()=>k(j.id),className:"text-red-600 hover:underline",children:"Löschen"})]})]},j.id)),n.length===0&&a.jsx("tr",{children:a.jsx("td",{colSpan:4,className:"px-4 py-6 text-center text-neutral-400",children:"Noch keine Benutzer angelegt."})})]})]})})]}),a.jsxs("form",{onSubmit:v,className:"h-fit space-y-4 rounded-xl border border-neutral-200 bg-white p-5 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"font-bold text-neutral-900 dark:text-white",children:d?"Benutzer bearbeiten":"Neuer Benutzer"}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Benutzername *"}),a.jsx("input",{required:!0,value:u.username,onChange:j=>c({...u,username:j.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Passwort ",d?"(leer lassen = unverändert)":"*"]}),a.jsx("input",{type:"password",required:!d,value:u.password,onChange:j=>c({...u,password:j.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),(e==null?void 0:e.is_super_admin)&&a.jsxs("label",{className:"flex items-center gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:u.is_super_admin,onChange:j=>c({...u,is_super_admin:j.target.checked}),className:"h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),"Super-Admin (hat automatisch alle Rechte)"]}),!u.is_super_admin&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("p",{className:"mb-1 text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Einzelne Berechtigungen"}),a.jsx("div",{className:"space-y-1.5 rounded-md border border-neutral-200 p-3 dark:border-neutral-700",children:s.map(j=>a.jsxs("label",{className:"flex items-center gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:u.permissions.includes(j.key),onChange:()=>x(j.key),className:"h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),j.label]},j.key))})]}),a.jsxs("div",{children:[a.jsx("p",{className:"mb-1 text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Berechtigungsgruppen"}),a.jsxs("div",{className:"space-y-1.5 rounded-md border border-neutral-200 p-3 dark:border-neutral-700",children:[l.map(j=>a.jsxs("label",{className:"flex items-center gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:u.group_ids.includes(j.id),onChange:()=>p(j.id),className:"h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),j.name]},j.id)),l.length===0&&a.jsx("p",{className:"text-sm text-neutral-400",children:"Noch keine Berechtigungsgruppen angelegt."})]})]})]}),m&&a.jsx("p",{className:"text-sm text-red-600",children:m}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600",children:d?"Speichern":"Anlegen"}),d&&a.jsx("button",{type:"button",onClick:w,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]})]})}const Kf={name:"",description:"",permissions:[]};function D4(){const[e,t]=g.useState([]),[n,r]=g.useState([]),[s,i]=g.useState(Kf),[l,o]=g.useState(null),[u,c]=g.useState(""),d=()=>{A.get("/permission-groups").then(t),A.get("/permissions/catalog").then(r)};g.useEffect(d,[]);const h=w=>{o(w.id),i({name:w.name,description:w.description||"",permissions:w.permissions})},m=()=>{o(null),i(Kf)},f=w=>{i(x=>({...x,permissions:x.permissions.includes(w)?x.permissions.filter(p=>p!==w):[...x.permissions,w]}))},b=async w=>{w.preventDefault(),c("");try{l?await A.put(`/permission-groups/${l}`,s):await A.post("/permission-groups",s),m(),d()}catch(x){c(x.message)}},y=async w=>{confirm("Diese Berechtigungsgruppe wirklich löschen? Benutzer behalten ihre sonstigen Rechte.")&&(await A.delete(`/permission-groups/${w}`),d())};return a.jsxs("div",{className:"grid gap-6 lg:grid-cols-3",children:[a.jsxs("div",{className:"lg:col-span-2",children:[a.jsx("h1",{className:"mb-1 text-xl font-bold text-neutral-900 dark:text-white",children:"Berechtigungsgruppen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:'Fasse mehrere Berechtigungen zu einer Gruppe zusammen (z. B. „Werkstatt"), die du dann bequem einem oder mehreren Benutzern zuweisen kannst.'}),a.jsx("div",{className:"overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-800",children:a.jsxs("table",{className:"w-full text-left text-sm",children:[a.jsx("thead",{className:"bg-neutral-50 text-neutral-500 dark:bg-neutral-900 dark:text-neutral-400",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-4 py-2",children:"Name"}),a.jsx("th",{className:"px-4 py-2",children:"Berechtigungen"}),a.jsx("th",{className:"px-4 py-2 text-right",children:"Aktionen"})]})}),a.jsxs("tbody",{className:"divide-y divide-neutral-100 dark:divide-neutral-800",children:[e.map(w=>a.jsxs("tr",{className:"bg-white dark:bg-neutral-950",children:[a.jsxs("td",{className:"px-4 py-2",children:[a.jsx("p",{className:"font-medium text-neutral-800 dark:text-neutral-100",children:w.name}),w.description&&a.jsx("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w.description})]}),a.jsxs("td",{className:"px-4 py-2 text-neutral-500 dark:text-neutral-400",children:[w.permissions.length," von ",n.length]}),a.jsxs("td",{className:"px-4 py-2 text-right",children:[a.jsx("button",{onClick:()=>h(w),className:"mr-3 text-brand-600 hover:underline",children:"Bearbeiten"}),a.jsx("button",{onClick:()=>y(w.id),className:"text-red-600 hover:underline",children:"Löschen"})]})]},w.id)),e.length===0&&a.jsx("tr",{children:a.jsx("td",{colSpan:3,className:"px-4 py-6 text-center text-neutral-400",children:"Noch keine Berechtigungsgruppen angelegt."})})]})]})})]}),a.jsxs("form",{onSubmit:b,className:"h-fit space-y-4 rounded-xl border border-neutral-200 bg-white p-5 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"font-bold text-neutral-900 dark:text-white",children:l?"Gruppe bearbeiten":"Neue Gruppe"}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Name *"}),a.jsx("input",{required:!0,value:s.name,onChange:w=>i({...s,name:w.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Beschreibung"}),a.jsx("textarea",{rows:2,value:s.description,onChange:w=>i({...s,description:w.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("p",{className:"mb-1 text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Berechtigungen"}),a.jsx("div",{className:"space-y-1.5 rounded-md border border-neutral-200 p-3 dark:border-neutral-700",children:n.map(w=>a.jsxs("label",{className:"flex items-center gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:s.permissions.includes(w.key),onChange:()=>f(w.key),className:"h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),w.label]},w.key))})]}),u&&a.jsx("p",{className:"text-sm text-red-600",children:u}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600",children:l?"Speichern":"Anlegen"}),l&&a.jsx("button",{type:"button",onClick:m,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]})]})}const B4=[{to:"/admin/settings/website",label:"Website"},{to:"/admin/settings/email",label:"E-Mail"},{to:"/admin/settings/database",label:"Datenbank"},{to:"/admin/settings/export-import",label:"Export & Import"},{to:"/admin/settings/maintenance",label:"Wartungsmodus"},{to:"/admin/settings/reset",label:"Zurücksetzen"}];function z4(){const e=({isActive:t})=>`rounded-md px-4 py-2 text-sm font-medium transition ${t?"bg-brand-500 text-white":"text-neutral-600 hover:bg-neutral-100 dark:text-neutral-300 dark:hover:bg-neutral-800"}`;return a.jsxs("div",{children:[a.jsx("h1",{className:"mb-1 text-xl font-bold text-neutral-900 dark:text-white",children:"Einstellungen"}),a.jsx("p",{className:"mb-5 text-sm text-neutral-500 dark:text-neutral-400",children:"Werkzeuge rund um Datenbank, Server-Umzug und Zurücksetzen dieser Seite."}),a.jsx("nav",{className:"mb-6 flex flex-wrap gap-2",children:B4.map(t=>a.jsx(ug,{to:t.to,className:e,children:t.label},t.to))}),a.jsx(hl,{})]})}const R4={phone:"",whatsapp:"",contact_email:"",hero_image_path:"",ga_measurement_id:"",package_card_theme:"graphite",package_card_layout:"strip",package_wheel_hint_interval:8},I4=[{value:"graphite",label:"Graphite Green",description:"Graphit über Bronze/Silber/Gold/Platin bis zur Onyx-Krönung."},{value:"deep-blue",label:"Deep Blue Luxury",description:"Kühles Blau, das sich über Grün zu Gold erwärmt."},{value:"warm-bronze",label:"Warm Bronze",description:"Durchgehend warmes Kupfer/Bronze/Amber bis zum Gold."}],F4=[{value:"grid",label:"Raster",description:"Breite Kacheln, die responsiv in mehrere Zeilen umbrechen."},{value:"strip",label:"Scroll-Band",description:"Schmale, hochkant Kacheln in einer horizontal scrollbaren Reihe."},{value:"coverflow",label:"3D-Coverflow",description:"Kacheln drehen sich beim Wischen räumlich – die mittlere steht im Fokus."}];function V4(){const[e,t]=g.useState(R4),[n,r]=g.useState(!0),[s,i]=g.useState(!1),[l,o]=g.useState(!1),[u,c]=g.useState(""),[d,h]=g.useState(""),[m,f]=g.useState(""),[b,y]=g.useState(!1),[w,x]=g.useState(!1),[p,v]=g.useState(""),[k,j]=g.useState(!1),[C,S]=g.useState(""),[P,M]=g.useState(""),[E,N]=g.useState(!1),[L,U]=g.useState(null),[W,q]=g.useState(!1),[z,$]=g.useState(""),[_,B]=g.useState(!1),[F,O]=g.useState(!1);g.useEffect(()=>{A.get("/site-settings").then(R=>t({phone:R.phone||"",whatsapp:R.whatsapp||"",contact_email:R.contact_email||"",hero_image_path:R.hero_image_path||"",ga_measurement_id:R.ga_measurement_id||"",package_card_theme:R.package_card_theme||"graphite",package_card_layout:R.package_card_layout||"strip",package_wheel_hint_interval:R.package_wheel_hint_interval||8})).finally(()=>r(!1)),A.get("/settings/analytics").then(R=>{h(R.ga_property_id||""),y(R.has_credentials)}),X()},[]);const X=()=>{A.get("/settings/google-reviews").then(R=>{S(R.place_id||""),N(R.has_api_key),U(R)})},fe=async()=>{q(!0),$(""),B(!1);try{const R=await A.post("/settings/google-reviews",{place_id:C,api_key:P});N(R.has_api_key),U(R),M(""),B(!0)}catch(R){$(R.message)}finally{q(!1)}},Y=async()=>{O(!0),$("");try{const R=await A.post("/settings/google-reviews/refresh",{});U(R)}catch(R){$(R.message),X()}finally{O(!1)}},ne=async()=>{x(!0),v(""),j(!1);try{const R=await A.post("/settings/analytics",{ga_property_id:d,service_account_json:m});y(R.has_credentials),f(""),j(!0)}catch(R){v(R.message)}finally{x(!1)}},te=(R,Rt)=>{t($r=>({...$r,[R]:Rt})),o(!1)},qe=async R=>{R.preventDefault(),i(!0),c(""),o(!1);try{await A.post("/site-settings",e),o(!0)}catch(Rt){c(Rt.message)}finally{i(!1)}};return n?a.jsx("p",{className:"text-sm text-neutral-400",children:"Lädt…"}):a.jsxs("form",{onSubmit:qe,className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Startseiten-Bild"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Das große Hero-Bild ganz oben auf der Startseite. Ohne eigenes Bild wird das Standardbild verwendet."}),a.jsx(vl,{value:e.hero_image_path,onChange:R=>te("hero_image_path",R),label:"Bild"})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Kontaktdaten"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Wird im Header, Footer und auf der Kontaktseite angezeigt."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Telefon"}),a.jsx("input",{value:e.phone,onChange:R=>te("phone",R.target.value),placeholder:"09373 20 62 390",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"WhatsApp Business Nummer"}),a.jsx("input",{value:e.whatsapp,onChange:R=>te("whatsapp",R.target.value),placeholder:"z. B. 09373 20 62 390",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("p",{className:"mt-1 text-xs text-neutral-400",children:"Leer lassen, um den WhatsApp-Link im Header auszublenden."})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"E-Mail"}),a.jsx("input",{type:"email",value:e.contact_email,onChange:R=>te("contact_email",R.target.value),placeholder:"info@hifi-planet-amorbach.de",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Paket-Kachel-Design"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Bestimmt die Farbgebung der Paket-Stufen auf jeder Fahrzeug-Modell-Seite (von der günstigsten bis zur teuersten Option)."}),a.jsx("div",{className:"grid gap-3 sm:grid-cols-3",children:I4.map(R=>a.jsxs("label",{className:`cursor-pointer rounded-lg border p-3 text-sm transition ${e.package_card_theme===R.value?"border-brand-500 ring-2 ring-brand-500/40":"border-neutral-300 hover:border-neutral-400 dark:border-neutral-700 dark:hover:border-neutral-600"}`,children:[a.jsx("input",{type:"radio",name:"package_card_theme",value:R.value,checked:e.package_card_theme===R.value,onChange:Rt=>te("package_card_theme",Rt.target.value),className:"sr-only"}),a.jsx("p",{className:"font-semibold text-neutral-900 dark:text-white",children:R.label}),a.jsx("p",{className:"mt-1 text-xs text-neutral-500 dark:text-neutral-400",children:R.description})]},R.value))})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Kachel-Layout"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Bestimmt, wie die Paket-Stufen auf jeder Fahrzeug-Modell-Seite angeordnet werden."}),a.jsx("div",{className:"grid gap-3 sm:grid-cols-3",children:F4.map(R=>a.jsxs("label",{className:`cursor-pointer rounded-lg border p-3 text-sm transition ${e.package_card_layout===R.value?"border-brand-500 ring-2 ring-brand-500/40":"border-neutral-300 hover:border-neutral-400 dark:border-neutral-700 dark:hover:border-neutral-600"}`,children:[a.jsx("input",{type:"radio",name:"package_card_layout",value:R.value,checked:e.package_card_layout===R.value,onChange:Rt=>te("package_card_layout",Rt.target.value),className:"sr-only"}),a.jsx("p",{className:"font-semibold text-neutral-900 dark:text-white",children:R.label}),a.jsx("p",{className:"mt-1 text-xs text-neutral-500 dark:text-neutral-400",children:R.description})]},R.value))}),a.jsxs("div",{className:"mt-5 max-w-xs",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Mausrad-Hinweis: Wiederholung (Sekunden)"}),a.jsx("input",{type:"number",min:"2",max:"120",value:e.package_wheel_hint_interval,onChange:R=>te("package_wheel_hint_interval",R.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("p",{className:"mt-1 text-xs text-neutral-400",children:'Nur bei Scroll-Band/3D-Coverflow: Solange ein Besucher noch auf der ersten Kachel steht, wird der "mit dem Mausrad blättern"-Hinweis in diesem Abstand wiederholt.'})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Google Analytics"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Wird erst geladen, nachdem ein Besucher der Statistik-Kategorie im Cookie-Banner zugestimmt hat. Leer lassen, um Google Analytics zu deaktivieren."}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Measurement-ID"}),a.jsx("input",{value:e.ga_measurement_id,onChange:R=>te("ga_measurement_id",R.target.value),placeholder:"G-XXXXXXXXXX",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{className:"mt-5 border-t border-neutral-200 pt-5 dark:border-neutral-800",children:[a.jsx("h3",{className:"mb-1 text-sm font-semibold text-neutral-900 dark:text-white",children:"Dashboard-Anbindung (optional)"}),a.jsx("p",{className:"mb-3 text-sm text-neutral-500 dark:text-neutral-400",children:"Zeigt Besucherzahlen direkt in deinem Admin-Dashboard an. Braucht ein Google-Cloud-Service-Account mit Lesezugriff auf diese GA4-Property."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Property-ID"}),a.jsx("input",{value:d,onChange:R=>{h(R.target.value),j(!1)},placeholder:"z. B. 123456789",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("p",{className:"mt-1 text-xs text-neutral-400",children:"Nicht die Measurement-ID (G-...) - zu finden unter GA4 → Verwaltung → Property-Details."})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Service-Account-JSON-Schlüssel ",b?"(leer lassen = unverändert)":""]}),a.jsx("textarea",{rows:4,value:m,onChange:R=>{f(R.target.value),j(!1)},placeholder:b?'{ "type": "service_account", ... } (bereits hinterlegt)':'{ "type": "service_account", ... }',className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 font-mono text-xs dark:border-neutral-700 dark:bg-neutral-900"})]})]}),p&&a.jsx("p",{className:"mt-2 text-sm text-red-600",children:p}),k&&a.jsx("p",{className:"mt-2 text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsx("button",{type:"button",onClick:ne,disabled:w,className:"mt-3 rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 disabled:opacity-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:w?"Speichere…":"Dashboard-Anbindung speichern"})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Google-Rezensionen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Zeigt die echte Google-Bewertung und die aktuellsten Rezensionen auf der Startseite an, statt der fest eingetragenen Beispiel-Texte. Wird einmal täglich automatisch aktualisiert (nie bei einem Seitenbesuch selbst) – die Seite zeigt also immer den letzten erfolgreich abgerufenen Stand."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Place-ID"}),a.jsx("input",{value:C,onChange:R=>{S(R.target.value),B(!1)},placeholder:"z. B. ChIJN1t_tDeuEmsRUsoyG83frY4",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsxs("p",{className:"mt-1 text-xs text-neutral-400",children:["Eindeutige Google-Kennung eures Eintrags – zu finden über den"," ",a.jsx("a",{href:"https://developers.google.com/maps/documentation/places/web-service/place-id#find-id",target:"_blank",rel:"noopener noreferrer",className:"underline hover:text-brand-600",children:"Google Place ID Finder"}),"."]})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Places-API-Key ",E?"(leer lassen = unverändert)":""]}),a.jsx("input",{value:P,onChange:R=>{M(R.target.value),B(!1)},placeholder:E?"••••••••••••••••••••• (bereits hinterlegt)":"AIzaSy…",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 font-mono text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("p",{className:"mt-1 text-xs text-neutral-400",children:"Aus der Google-Cloud-Console, mit aktivierter „Places API (New)“."})]})]}),z&&a.jsx("p",{className:"mt-3 text-sm text-red-600",children:z}),_&&a.jsx("p",{className:"mt-3 text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-3",children:[a.jsx("button",{type:"button",onClick:fe,disabled:W,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 disabled:opacity-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:W?"Speichere…":"Google-Rezensionen-Einstellungen speichern"}),a.jsx("button",{type:"button",onClick:Y,disabled:F||!C||!E,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:F?"Aktualisiere…":"Jetzt aktualisieren"})]}),L&&a.jsxs("div",{className:"mt-4 rounded-md bg-neutral-50 p-3 text-sm dark:bg-neutral-800/50",children:[L.rating!=null?a.jsxs("p",{className:"text-neutral-700 dark:text-neutral-300",children:["Aktuell hinterlegt: ",a.jsxs("strong",{children:[L.rating," ★"]})," (",L.rating_count," Bewertungen)",L.updated_at&&a.jsxs(a.Fragment,{children:[" – zuletzt aktualisiert am ",new Date(L.updated_at.replace(" ","T")).toLocaleString("de-DE")]})]}):a.jsx("p",{className:"text-neutral-500 dark:text-neutral-400",children:"Noch keine erfolgreiche Aktualisierung – die Startseite zeigt bis dahin weiter die Beispiel-Rezensionen."}),L.error&&a.jsxs("p",{className:"mt-1 text-red-600",children:["Letzter Fehler: ",L.error]})]})]}),u&&a.jsx("p",{className:"text-sm text-red-600",children:u}),l&&a.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsx("button",{type:"submit",disabled:s,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:s?"Speichere…":"Speichern"})]})}const O4={mail_host:"",mail_port:587,mail_username:"",mail_password:"",mail_encryption:"tls",mail_from_email:"",mail_from_name:"",mail_notify_email:"",mail_customer_subject:"",mail_customer_body:"",mail_owner_subject:"",mail_owner_body:""},U4=[["{{name}}","Name des Kunden"],["{{email}}","E-Mail des Kunden"],["{{phone}}","Telefonnummer"],["{{vin}}","Fahrgestellnummer (FIN)"],["{{message}}","Nachricht des Kunden"],["{{brand}}","Marke"],["{{model}}","Modell"],["{{package}}","Paket"],["{{product}}","Produkt"],["{{upgrades}}","Gewählte Upgrades"]];function qf(){return a.jsx("div",{className:"mt-3 flex flex-wrap gap-1.5",children:U4.map(([e,t])=>a.jsx("span",{title:t,className:"rounded-md bg-neutral-100 px-2 py-1 font-mono text-xs text-neutral-600 dark:bg-neutral-800 dark:text-neutral-300",children:e},e))})}function W4(){const[e,t]=g.useState(O4),[n,r]=g.useState(!1),[s,i]=g.useState(!0),[l,o]=g.useState(!1),[u,c]=g.useState(!1),[d,h]=g.useState(""),[m,f]=g.useState(!1),[b,y]=g.useState(!1),[w,x]=g.useState(""),[p,v]=g.useState(""),[k,j]=g.useState(""),[C,S]=g.useState(null);g.useEffect(()=>{A.get("/settings/mail").then(N=>{t({...N,mail_password:""}),r(N.has_password)}).finally(()=>i(!1))},[]);const P=(N,L)=>{t(U=>({...U,[N]:L})),f(!1)},M=async N=>{N.preventDefault(),c(!0),h(""),f(!1);try{const L=await A.post("/settings/mail",e);t({...L,mail_password:""}),r(L.has_password),f(!0)}catch(L){h(L.message)}finally{c(!1)}},E=async()=>{y(!0),x(""),v(""),j(""),S(null);try{const N=await A.post("/settings/mail/test",e);v(`Testmail gesendet an ${N.sent_to}. Der Server hat die Mail angenommen - prüfe auch den Spam-Ordner, das ist noch keine Garantie für die Zustellung.`),j(N.warning||""),S(N.smtp_log||null)}catch(N){x(N.message)}finally{y(!1)}};return s?a.jsx("p",{className:"text-sm text-neutral-400",children:"Lädt…"}):a.jsxs("form",{onSubmit:M,className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"SMTP-Server"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Zugangsdaten deines Mail-Postfachs oder Transactional-Mail-Anbieters. Solange kein Server eingetragen ist, werden keine E-Mails verschickt (Kontaktanfragen werden trotzdem in der Datenbank gespeichert)."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-[1fr_120px]",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Server (Host)"}),a.jsx("input",{value:e.mail_host,onChange:N=>P("mail_host",N.target.value),placeholder:"smtp.beispiel.de",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Port"}),a.jsx("input",{type:"number",value:e.mail_port,onChange:N=>P("mail_port",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Verschlüsselung"}),a.jsxs("select",{value:e.mail_encryption,onChange:N=>P("mail_encryption",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900",children:[a.jsx("option",{value:"tls",children:"STARTTLS"}),a.jsx("option",{value:"ssl",children:"SSL"}),a.jsx("option",{value:"none",children:"Keine"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Benutzername"}),a.jsx("input",{value:e.mail_username,onChange:N=>P("mail_username",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Passwort ",n?"(leer lassen = unverändert)":""]}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("input",{type:l?"text":"password",value:e.mail_password,onChange:N=>P("mail_password",N.target.value),placeholder:n?"••••••••":"",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("button",{type:"button",onClick:()=>o(N=>!N),className:"shrink-0 rounded-md border border-neutral-300 px-3 text-sm dark:border-neutral-700",children:l?"Verbergen":"Anzeigen"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Absender-E-Mail"}),a.jsx("input",{type:"email",value:e.mail_from_email,onChange:N=>P("mail_from_email",N.target.value),placeholder:"info@hifi-planet-amorbach.de",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Absender-Name"}),a.jsx("input",{value:e.mail_from_name,onChange:N=>P("mail_from_name",N.target.value),placeholder:"HifiPlanet",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]}),a.jsxs("div",{className:"mt-4 border-t border-neutral-200 pt-4 dark:border-neutral-800",children:[w&&a.jsx("p",{className:"mb-2 whitespace-pre-wrap text-sm text-red-600",children:w}),p&&a.jsx("p",{className:"mb-2 text-sm text-green-600 dark:text-green-400",children:p}),k&&a.jsx("p",{className:"mb-2 rounded-md bg-amber-50 p-2 text-sm text-amber-800 dark:bg-amber-900/20 dark:text-amber-300",children:k}),a.jsx("button",{type:"button",onClick:E,disabled:b,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 disabled:opacity-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:b?"Sende Testmail…":"Verbindung testen"}),C&&C.length>0&&a.jsxs("details",{className:"mt-3",children:[a.jsx("summary",{className:"cursor-pointer text-xs text-neutral-500 dark:text-neutral-400",children:"SMTP-Protokoll anzeigen"}),a.jsx("pre",{className:"mt-2 max-h-64 overflow-auto rounded-md bg-neutral-900 p-3 text-xs text-neutral-200",children:C.join(` -`)})]})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Empfänger"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"An diese Adresse geht die Benachrichtigung bei jeder neuen Kontaktanfrage."}),a.jsx("input",{type:"email",value:e.mail_notify_email,onChange:N=>P("mail_notify_email",N.target.value),placeholder:"info@hifi-planet-amorbach.de",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"E-Mail an den Kunden (Bestätigung)"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Geht automatisch an den Kunden, sobald er eine Kontaktanfrage abschickt."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Betreff"}),a.jsx("input",{value:e.mail_customer_subject,onChange:N=>P("mail_customer_subject",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Text"}),a.jsx("textarea",{rows:8,value:e.mail_customer_body,onChange:N=>P("mail_customer_body",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]}),a.jsx(qf,{})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"E-Mail an den Shop (Benachrichtigung)"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Geht an die oben eingestellte Empfänger-Adresse, sobald eine neue Kontaktanfrage eingeht."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Betreff"}),a.jsx("input",{value:e.mail_owner_subject,onChange:N=>P("mail_owner_subject",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Text"}),a.jsx("textarea",{rows:8,value:e.mail_owner_body,onChange:N=>P("mail_owner_body",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]}),a.jsx(qf,{})]}),d&&a.jsx("p",{className:"text-sm text-red-600",children:d}),m&&a.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsx("button",{type:"submit",disabled:u,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:u?"Speichere…":"Speichern"})]})}function H4(){const[e,t]=g.useState({host:"",name:"",user:"",password:"",charset:"utf8mb4"}),[n,r]=g.useState(!1),[s,i]=g.useState(!0),[l,o]=g.useState(!1),[u,c]=g.useState(!1),[d,h]=g.useState(""),[m,f]=g.useState(!1),[b,y]=g.useState(null),[w,x]=g.useState(!0),[p,v]=g.useState(!1),[k,j]=g.useState(null),C=()=>{i(!0),A.get("/settings/database").then(E=>{t({...E.config,password:""}),r(E.has_password)}).finally(()=>i(!1))},S=()=>{x(!0),A.get("/settings/schema-check").then(y).catch(E=>y({ok:!1,error:E.message,tables:[]})).finally(()=>x(!1))};g.useEffect(()=>{C(),S()},[]);const P=async()=>{v(!0),j(null);try{const E=await A.post("/settings/schema-migrate",{});j(E.actions),y(E.report)}catch(E){j(["Fehler: "+E.message])}finally{v(!1)}},M=async E=>{E.preventDefault(),c(!0),h(""),f(!1);try{await A.post("/settings/database",e),f(!0),t(N=>({...N,password:""})),r(!0),S()}catch(N){h(N.message)}finally{c(!1)}};return a.jsxs("div",{className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Datenbank-Zugangsdaten"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Wichtig für einen Umzug auf einen anderen Server/Webspace: Trage hier die Zugangsdaten der dortigen Datenbank ein. Die Verbindung wird vor dem Speichern getestet, damit du dich nicht aussperrst."}),s?a.jsx("p",{className:"text-sm text-neutral-400",children:"Lädt…"}):a.jsxs("form",{onSubmit:M,className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Host *"}),a.jsx("input",{required:!0,value:e.host,onChange:E=>t({...e,host:E.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Datenbankname *"}),a.jsx("input",{required:!0,value:e.name,onChange:E=>t({...e,name:E.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Benutzer *"}),a.jsx("input",{required:!0,value:e.user,onChange:E=>t({...e,user:E.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Passwort ",n?"(leer lassen = unverändert)":""]}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("input",{type:l?"text":"password",value:e.password,onChange:E=>t({...e,password:E.target.value}),placeholder:n?"••••••••":"",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("button",{type:"button",onClick:()=>o(E=>!E),className:"shrink-0 rounded-md border border-neutral-300 px-3 text-sm dark:border-neutral-700",children:l?"Verbergen":"Anzeigen"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Zeichensatz"}),a.jsx("input",{value:e.charset,onChange:E=>t({...e,charset:E.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),d&&a.jsx("p",{className:"text-sm text-red-600",children:d}),m&&a.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:"Verbindung erfolgreich getestet und gespeichert."}),a.jsx("button",{type:"submit",disabled:u,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:u?"Teste & speichere…":"Verbindung testen & speichern"})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsxs("div",{className:"mb-1 flex items-center justify-between gap-3",children:[a.jsx("h2",{className:"font-semibold text-neutral-900 dark:text-white",children:"Datenbankstruktur"}),!w&&b&&a.jsx("span",{className:`rounded-full px-3 py-1 text-xs font-semibold ${b.ok?"bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-300":"bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300"}`,children:b.ok?"Datenbank OK":"Datenbank nicht OK"})]}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Prüft, ob diese Datenbank alle Tabellen und Spalten hat, die der aktuelle Code-Stand braucht – wichtig, wenn deine Live-Version auf einem anderen Server einen älteren Stand hat."}),w&&a.jsx("p",{className:"text-sm text-neutral-400",children:"Prüfe…"}),!w&&b&&!b.ok&&a.jsx("ul",{className:"mb-4 space-y-1 rounded-md bg-red-50 p-3 text-sm text-red-800 dark:bg-red-900/20 dark:text-red-300",children:b.tables.filter(E=>!E.ok).map(E=>a.jsx("li",{children:E.exists?a.jsxs(a.Fragment,{children:["Tabelle ",a.jsx("code",{className:"font-mono",children:E.table}),": Spalte(n) fehlen – ",E.missing_columns.join(", ")]}):a.jsxs(a.Fragment,{children:["Tabelle ",a.jsx("code",{className:"font-mono",children:E.table})," fehlt komplett"]})},E.table))}),a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx("button",{onClick:S,disabled:w,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 disabled:opacity-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:"Erneut prüfen"}),b&&!b.ok&&a.jsx("button",{onClick:P,disabled:p,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:p?"Aktualisiere…":"Datenbankstruktur aktualisieren"})]}),k&&a.jsx("ul",{className:"mt-3 space-y-1 rounded-md bg-neutral-50 p-3 text-sm text-neutral-700 dark:bg-neutral-800 dark:text-neutral-300",children:k.map((E,N)=>a.jsx("li",{children:E},N))})]})]})}const Ua=[{key:"catalog",label:"Fahrzeug-Katalog",hint:"Marken, Modelle, Pakete, Produkte, Upgrades",tables:["brands","car_models","packages","package_products","package_upgrades"]},{key:"services",label:"Leistungen",hint:"Die Leistungen-Übersicht",tables:["services"]},{key:"faqs",label:"FAQs",hint:"Häufig gestellte Fragen",tables:["faqs"]},{key:"gallery",label:"Bildergalerie",hint:"Galerie-Marken, Projekte und Fotos (inkl. Bilder)",tables:["gallery_brands","gallery_projects","gallery_photos"]}],_b={brands:"Marken",car_models:"Modelle",packages:"Pakete",package_products:"Produkte",package_upgrades:"Upgrades",services:"Leistungen",faqs:"FAQs",gallery_brands:"Galerie-Marken",gallery_projects:"Galerie-Projekte",gallery_photos:"Galerie-Fotos"},$4=(e,t)=>{if(!e)return null;const n=t.map(r=>[r,Array.isArray(e[r])?e[r].length:0]).filter(([,r])=>r>0).map(([r,s])=>`${s} ${_b[r]||r}`);return n.length?n.join(", "):"leer in dieser Datei"};function G4(){const[e,t]=g.useState(null),[n,r]=g.useState(null),[s,i]=g.useState(""),[l,o]=g.useState(()=>new Set(Ua.map(k=>k.key))),[u,c]=g.useState(!1),[d,h]=g.useState(!1),[m,f]=g.useState(null),[b,y]=g.useState(""),w=async k=>{var C;const j=((C=k.target.files)==null?void 0:C[0])||null;if(t(j),f(null),y(""),r(null),i(""),o(new Set(Ua.map(S=>S.key))),!!j)try{const S=await j.text(),P=JSON.parse(S);if(!P||typeof P.data!="object")throw new Error("kein gültiges Export-Format");r(P.data)}catch{i("Datei konnte nicht gelesen werden – Vorschau der Inhalte nicht möglich. Import würde trotzdem versucht (alle Bereiche).")}},x=k=>{o(j=>{const C=new Set(j);return C.has(k)?C.delete(k):C.add(k),C})},p=async k=>{if(k.preventDefault(),!(!e||!u||l.size===0)){h(!0),y(""),f(null);try{const j=new FormData;j.append("file",e),j.append("sections",JSON.stringify([...l]));const C=await A.post("/settings/import",j);f(C),t(null),r(null),c(!1),k.target.reset()}catch(j){y(j.message)}finally{h(!1)}}},v=Ua.filter(k=>l.has(k.key)).map(k=>k.label);return a.jsxs("div",{className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Daten exportieren"}),a.jsxs("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:["Lädt eine Datei mit allen Marken, Modellen, Paketen, Produkten, Upgrades, Leistungen, FAQs und der kompletten Bildergalerie (inkl. Bilder) herunter. Benutzerkonten und Kontaktanfragen sind bewusst",a.jsx("strong",{children:" nicht"})," enthalten."]}),a.jsx("a",{href:`${cg}/settings/export`,className:"inline-block rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600",children:"Jetzt exportieren"})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Daten importieren"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Lädt eine zuvor exportierte Datei auf diesen Server. Ersetzt dabei die ausgewählten Bereiche komplett durch den Inhalt der Datei – das kann nicht rückgängig gemacht werden. Kontaktanfragen und Benutzerkonten bleiben immer unangetastet."}),a.jsxs("form",{onSubmit:p,className:"space-y-4",children:[a.jsx("input",{type:"file",accept:"application/json,.json",onChange:w,className:"text-sm"}),e&&a.jsxs("div",{className:"rounded-lg border border-neutral-200 dark:border-neutral-700",children:[a.jsx("div",{className:"border-b border-neutral-200 px-4 py-2 text-xs font-semibold uppercase tracking-wide text-neutral-500 dark:border-neutral-700 dark:text-neutral-400",children:"Was soll importiert werden?"}),s&&a.jsx("p",{className:"px-4 pt-3 text-sm text-amber-600 dark:text-amber-400",children:s}),a.jsx("div",{className:"divide-y divide-neutral-100 dark:divide-neutral-800",children:Ua.map(k=>a.jsxs("label",{className:"flex cursor-pointer items-start gap-3 px-4 py-3 hover:bg-neutral-50 dark:hover:bg-neutral-800/50",children:[a.jsx("input",{type:"checkbox",checked:l.has(k.key),onChange:()=>x(k.key),className:"mt-0.5 h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),a.jsxs("span",{className:"flex-1",children:[a.jsx("span",{className:"block text-sm font-medium text-neutral-800 dark:text-neutral-100",children:k.label}),a.jsx("span",{className:"block text-xs text-neutral-500 dark:text-neutral-400",children:n?$4(n,k.tables):k.hint})]})]},k.key))})]}),a.jsxs("label",{className:"flex items-start gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:u,onChange:k=>c(k.target.checked),className:"mt-0.5 h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),"Mir ist bewusst, dass dies"," ",v.length?a.jsx("strong",{children:v.join(", ")}):"die ausgewählten Bereiche"," auf diesem Server unwiderruflich ersetzt."]}),a.jsx("button",{type:"submit",disabled:!e||!u||d||l.size===0,className:"rounded-md bg-red-600 px-4 py-2 text-sm font-semibold text-white hover:bg-red-700 disabled:opacity-50",children:d?"Importiere…":"Importieren"})]}),b&&a.jsx("p",{className:"mt-3 text-sm text-red-600",children:b}),m&&a.jsxs("div",{className:"mt-3 rounded-md bg-green-50 p-3 text-sm text-green-800 dark:bg-green-900/20 dark:text-green-300",children:[a.jsx("p",{className:"mb-1 font-semibold",children:"Import erfolgreich:"}),a.jsxs("ul",{className:"list-disc pl-5",children:[Object.entries(m.counts).map(([k,j])=>a.jsxs("li",{children:[j," ",_b[k]||k]},k)),m.images_restored>0&&a.jsxs("li",{children:[m.images_restored," Bilder wiederhergestellt"]})]})]})]})]})}const K4={global:{enabled:!1,message:""},services:{enabled:!1,message:""},vehicles:{enabled:!1,message:""}};function q4(){const[e,t]=g.useState(K4),[n,r]=g.useState(!0),[s,i]=g.useState(!1),[l,o]=g.useState(!1),[u,c]=g.useState("");g.useEffect(()=>{A.get("/maintenance").then(f=>{t({global:{enabled:f.global.enabled,message:f.global.message||""},services:{enabled:f.services.enabled,message:f.services.message||""},vehicles:{enabled:f.vehicles.enabled,message:f.vehicles.message||""}})}).finally(()=>r(!1))},[]);const d=(f,b,y)=>{t(w=>({...w,[f]:{...w[f],[b]:y}})),o(!1)},h=async f=>{f.preventDefault(),i(!0),c(""),o(!1);try{const b=await A.post("/maintenance",e);t({global:{enabled:b.global.enabled,message:b.global.message||""},services:{enabled:b.services.enabled,message:b.services.message||""},vehicles:{enabled:b.vehicles.enabled,message:b.vehicles.message||""}}),o(!0)}catch(b){c(b.message)}finally{i(!1)}},m=[{key:"global",title:"Gesamte Seite",hint:"Besucher sehen nur noch eine Wartungsmeldung – egal welche Seite sie aufrufen. Das Admin-Panel bleibt für dich erreichbar."},{key:"services",title:"Nur Leistungen",hint:"Nur die Leistungen-Seite zeigt eine Wartungsmeldung, der Rest der Website funktioniert normal."},{key:"vehicles",title:"Nur Fahrzeugkatalog",hint:"Nur die Fahrzeugauswahl (Marke → Modell → Pakete) zeigt eine Wartungsmeldung, der Rest der Website funktioniert normal."}];return n?a.jsx("p",{className:"text-sm text-neutral-400",children:"Lädt…"}):a.jsxs("form",{onSubmit:h,className:"max-w-2xl space-y-6",children:[a.jsx("p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:'Ist "Gesamte Seite" aktiv, gewinnt das immer – die beiden anderen Schalter spielen dann keine Rolle mehr.'}),m.map(f=>a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsxs("div",{className:"mb-1 flex items-center justify-between gap-3",children:[a.jsx("h2",{className:"font-semibold text-neutral-900 dark:text-white",children:f.title}),a.jsxs("label",{className:"relative inline-flex cursor-pointer items-center",children:[a.jsx("input",{type:"checkbox",checked:e[f.key].enabled,onChange:b=>d(f.key,"enabled",b.target.checked),className:"peer sr-only"}),a.jsx("div",{className:"h-6 w-11 rounded-full bg-neutral-200 transition peer-checked:bg-brand-500 dark:bg-neutral-700"}),a.jsx("div",{className:"absolute left-1 top-1 h-4 w-4 rounded-full bg-white transition peer-checked:translate-x-5"})]})]}),a.jsx("p",{className:"mb-3 text-sm text-neutral-500 dark:text-neutral-400",children:f.hint}),a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Eigene Nachricht (optional)"}),a.jsx("textarea",{rows:2,value:e[f.key].message,onChange:b=>d(f.key,"message",b.target.value),placeholder:"z. B. Wir aktualisieren gerade unser Angebot. Schau bald wieder vorbei!",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]},f.key)),u&&a.jsx("p",{className:"text-sm text-red-600",children:u}),l&&a.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsx("button",{type:"submit",disabled:s,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:s?"Speichere…":"Speichern"})]})}function Y4(){const[e,t]=g.useState(!1),[n,r]=g.useState(""),[s,i]=g.useState(!1),[l,o]=g.useState(""),[u,c]=g.useState(!1),[d,h]=g.useState(""),[m,f]=g.useState(!1),[b,y]=g.useState(""),[w,x]=g.useState(!1),[p,v]=g.useState(""),k=async()=>{if(confirm("Alle aktuellen Leistungen werden gelöscht und durch die 8 Standard-Leistungen ersetzt. Fortfahren?")){t(!0),r("");try{const M=await A.post("/settings/reset-services",{});r(`${M.count} Standard-Leistungen wiederhergestellt.`)}catch(M){r("Fehler: "+M.message)}finally{t(!1)}}},j=async()=>{if(confirm("Alle aktuellen FAQ-Einträge werden gelöscht und durch die 6 Standard-Fragen ersetzt. Fortfahren?")){i(!0),o("");try{const M=await A.post("/settings/reset-faqs",{});o(`${M.count} Standard-Fragen wiederhergestellt.`)}catch(M){o("Fehler: "+M.message)}finally{i(!1)}}},C=async()=>{if(confirm("Die komplette Bildergalerie wird gelöscht und durch die 13 Marken/29 Projekte/207 Fotos der alten hifi-planet.de-Seite ersetzt. Fortfahren?")){c(!0),h("");try{const M=await A.post("/settings/reset-gallery",{});h(`${M.photos} Fotos wiederhergestellt.`)}catch(M){h("Fehler: "+M.message)}finally{c(!1)}}},S=async()=>{if(confirm("Alle Marken, Modelle, Pakete, Produkte und Upgrades werden unwiderruflich gelöscht. Leistungen und Kontaktanfragen bleiben erhalten. Fortfahren?")){f(!0),y("");try{const M=await A.post("/settings/reset-catalog",{});y(`Fahrzeugkatalog geleert (${M.brands_removed} Marken entfernt).`)}catch(M){y("Fehler: "+M.message)}finally{f(!1)}}},P=async()=>{if(confirm("WIRKLICH ALLES zurücksetzen? Marken, Modelle, Pakete, Produkte und Upgrades werden gelöscht, Leistungen, FAQs und die Bildergalerie auf Standard zurückgesetzt. Kontaktanfragen und Benutzerkonten bleiben erhalten. Das kann nicht rückgängig gemacht werden!")){x(!0),v("");try{const M=await A.post("/settings/reset-all",{});v(`Erledigt: ${M.brands_removed} Marken entfernt, ${M.services_reset} Standard-Leistungen, ${M.faqs_reset} Standard-Fragen und ${M.gallery_photos_reset} Galerie-Fotos wiederhergestellt.`)}catch(M){v("Fehler: "+M.message)}finally{x(!1)}}};return a.jsxs("div",{className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Nur Leistungen zurücksetzen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Löscht alle aktuellen Leistungen-Karten und stellt die 8 mitgelieferten Standard-Leistungen wieder her. Marken, Modelle und Pakete bleiben unangetastet."}),a.jsx("button",{onClick:k,disabled:e,className:"rounded-md border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:hover:bg-red-900/20",children:e?"Setze zurück…":"Leistungen auf Standard zurücksetzen"}),n&&a.jsx("p",{className:"mt-3 text-sm text-neutral-600 dark:text-neutral-300",children:n})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Nur FAQs zurücksetzen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Löscht alle aktuellen Fragen und stellt die 6 mitgelieferten Standard-Fragen (Deutsch & Englisch) wieder her. Leistungen, Marken, Modelle und Pakete bleiben unangetastet."}),a.jsx("button",{onClick:j,disabled:s,className:"rounded-md border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:hover:bg-red-900/20",children:s?"Setze zurück…":"FAQs auf Standard zurücksetzen"}),l&&a.jsx("p",{className:"mt-3 text-sm text-neutral-600 dark:text-neutral-300",children:l})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Nur Bildergalerie zurücksetzen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Löscht alle aktuellen Galerie-Marken, -Projekte und -Fotos und stellt die komplette Galerie der alten hifi-planet.de-Seite wieder her (13 Marken, 29 Projekte, 207 Fotos). Fahrzeugkatalog, Leistungen und FAQs bleiben unangetastet."}),a.jsx("button",{onClick:C,disabled:u,className:"rounded-md border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:hover:bg-red-900/20",children:u?"Setze zurück…":"Galerie auf Standard zurücksetzen"}),d&&a.jsx("p",{className:"mt-3 text-sm text-neutral-600 dark:text-neutral-300",children:d})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Nur Fahrzeugkatalog leeren"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Löscht alle Marken, Modelle, Pakete, Produkte und Upgrades unwiderruflich. Leistungen, Kontaktanfragen und Benutzerkonten bleiben erhalten."}),a.jsx("button",{onClick:S,disabled:m,className:"rounded-md border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:hover:bg-red-900/20",children:m?"Leere…":"Fahrzeugkatalog leeren"}),b&&a.jsx("p",{className:"mt-3 text-sm text-neutral-600 dark:text-neutral-300",children:b})]}),a.jsxs("section",{className:"rounded-xl border border-red-300 bg-red-50/40 p-6 dark:border-red-900 dark:bg-red-900/10",children:[a.jsx("h2",{className:"mb-1 font-semibold text-red-700 dark:text-red-300",children:"Alles zurücksetzen"}),a.jsxs("p",{className:"mb-4 text-sm text-neutral-600 dark:text-neutral-300",children:["Kombiniert alles: Fahrzeugkatalog wird komplett geleert ",a.jsx("strong",{children:"und"})," Leistungen, FAQs sowie die Bildergalerie werden auf Standard zurückgesetzt. Kontaktanfragen und Benutzerkonten bleiben erhalten. Nicht rückgängig zu machen."]}),a.jsx("button",{onClick:P,disabled:w,className:"rounded-md bg-red-600 px-4 py-2 text-sm font-semibold text-white hover:bg-red-700 disabled:opacity-50",children:w?"Setze zurück…":"Wirklich alles zurücksetzen"}),p&&a.jsx("p",{className:"mt-3 text-sm text-neutral-700 dark:text-neutral-300",children:p})]})]})}function X4(){return a.jsxs(a.Fragment,{children:[a.jsx(cw,{}),a.jsx(mw,{}),a.jsx(fw,{children:a.jsxs(qk,{children:[a.jsx(K,{path:"/setup",element:a.jsx(mP,{})}),a.jsxs(K,{element:a.jsx(mC,{}),children:[a.jsx(K,{path:"/",element:a.jsx(DC,{})}),a.jsx(K,{path:"/fahrzeuge",element:a.jsx(BC,{})}),a.jsx(K,{path:"/fahrzeuge/:brandSlug",element:a.jsx(zC,{})}),a.jsx(K,{path:"/fahrzeuge/:brandSlug/:modelSlug",element:a.jsx(XC,{})}),a.jsx(K,{path:"/galerie",element:a.jsx(ZC,{})}),a.jsx(K,{path:"/galerie/:brandSlug",element:a.jsx(QC,{})}),a.jsx(K,{path:"/galerie/:brandSlug/:projectSlug",element:a.jsx(eP,{})}),a.jsx(K,{path:"/leistungen",element:a.jsx(tP,{})}),a.jsx(K,{path:"/kontakt",element:a.jsx(lP,{})}),a.jsx(K,{path:"/impressum",element:a.jsx(oP,{})}),a.jsx(K,{path:"/datenschutz",element:a.jsx(uP,{})}),a.jsx(K,{path:"/agb",element:a.jsx(cP,{})})]}),a.jsx(K,{path:"/admin/login",element:a.jsx(fP,{})}),a.jsx(K,{path:"/admin",element:a.jsx(xC,{}),children:a.jsxs(K,{element:a.jsx(gC,{}),children:[a.jsx(K,{index:!0,element:a.jsx(bP,{})}),a.jsx(K,{path:"account",element:a.jsx(_4,{})}),a.jsx(K,{path:"brands",element:a.jsx(Ve,{permission:"brands.manage",children:a.jsx(vP,{})})}),a.jsx(K,{path:"models",element:a.jsx(Ve,{permission:"models.manage",children:a.jsx(yP,{})})}),a.jsx(K,{path:"gallery-brands",element:a.jsx(Ve,{permission:"gallery.manage",children:a.jsx(kP,{})})}),a.jsx(K,{path:"gallery-projects",element:a.jsx(Ve,{permission:"gallery.manage",children:a.jsx(wP,{})})}),a.jsx(K,{path:"gallery-projects/:projectId/photos",element:a.jsx(Ve,{permission:"gallery.manage",children:a.jsx(jP,{})})}),a.jsx(K,{path:"packages",element:a.jsx(Ve,{permission:"packages.manage",children:a.jsx(TP,{})})}),a.jsx(K,{path:"packages/:packageId/products",element:a.jsx(Ve,{permission:"packages.manage",children:a.jsx(RP,{})})}),a.jsx(K,{path:"packages/:packageId/upgrades",element:a.jsx(Ve,{permission:"packages.manage",children:a.jsx(FP,{})})}),a.jsx(K,{path:"services",element:a.jsx(Ve,{permission:"services.manage",children:a.jsx(LP,{})})}),a.jsx(K,{path:"faqs",element:a.jsx(Ve,{permission:"content.manage",children:a.jsx(DP,{})})}),a.jsx(K,{path:"contact-requests",element:a.jsx(Ve,{permission:"contact.manage",children:a.jsx(HP,{})})}),a.jsx(K,{path:"users",element:a.jsx(Ve,{permission:"users.manage",children:a.jsx(L4,{})})}),a.jsx(K,{path:"permission-groups",element:a.jsx(Ve,{permission:"permission_groups.manage",children:a.jsx(D4,{})})}),a.jsxs(K,{path:"settings",element:a.jsx(Ve,{permission:"settings.manage",children:a.jsx(z4,{})}),children:[a.jsx(K,{index:!0,element:a.jsx(Gs,{to:"website",replace:!0})}),a.jsx(K,{path:"website",element:a.jsx(V4,{})}),a.jsx(K,{path:"email",element:a.jsx(W4,{})}),a.jsx(K,{path:"database",element:a.jsx(H4,{})}),a.jsx(K,{path:"export-import",element:a.jsx(G4,{})}),a.jsx(K,{path:"maintenance",element:a.jsx(q4,{})}),a.jsx(K,{path:"reset",element:a.jsx(Y4,{})})]})]})})]})})]})}So.createRoot(document.getElementById("root")).render(a.jsx(Gb.StrictMode,{children:a.jsx(rw,{basename:"/".replace(/\/$/,"")||"/",children:a.jsx(gw,{children:a.jsx(kw,{children:a.jsx(Tw,{children:a.jsx(X4,{})})})})})})); +`;return typeof r=="function"&&r(null,m),m};const A4=$P,tc=gb,Mb=Tb,M4=Ab;function Md(e,t,n,r,s){const i=[].slice.call(arguments,1),l=i.length,o=typeof i[l-1]=="function";if(!o&&!A4())throw new Error("Callback required as last argument");if(o){if(l<2)throw new Error("Too few arguments provided");l===2?(s=n,n=t,t=r=void 0):l===3&&(t.getContext&&typeof s>"u"?(s=r,r=void 0):(s=r,r=n,n=t,t=void 0))}else{if(l<1)throw new Error("Too few arguments provided");return l===1?(n=t,t=r=void 0):l===2&&!t.getContext&&(r=n,n=t,t=void 0),new Promise(function(u,c){try{const d=tc.create(n,r);u(e(d,t,r))}catch(d){c(d)}})}try{const u=tc.create(n,r);s(null,e(u,t,r))}catch(u){s(u)}}ha.create=tc.create;ha.toCanvas=Md.bind(null,Mb.render);ha.toDataURL=Md.bind(null,Mb.renderToDataURL);ha.toString=Md.bind(null,function(e,t,n){return M4.render(e,n)});const $f={current_password:"",new_password:"",new_password_confirmation:"",two_factor_code:""};function _4(){const{user:e,refreshUser:t}=Bt(),[n,r]=g.useState("idle"),[s,i]=g.useState(""),[l,o]=g.useState(""),[u,c]=g.useState(""),[d,h]=g.useState(""),[m,f]=g.useState([]),[b,y]=g.useState(""),[w,x]=g.useState(!1),[p,v]=g.useState($f),[k,j]=g.useState(""),[C,S]=g.useState(""),[P,M]=g.useState(!1),E=async z=>{if(z.preventDefault(),j(""),S(""),p.new_password!==p.new_password_confirmation){j("Die neuen Passwörter stimmen nicht überein");return}M(!0);try{await A.post("/auth/change-password",p),v($f),S("Passwort erfolgreich geändert.")}catch($){j($.message)}finally{M(!1)}},N=async()=>{y(""),x(!0);try{const z=await A.get("/auth/2fa/setup");o(z.secret),i(await ha.toDataURL(z.otpauth_url)),c(""),r("setup")}catch(z){y(z.message)}finally{x(!1)}},L=async z=>{z.preventDefault(),y(""),x(!0);try{const $=await A.post("/auth/2fa/enable",{code:u});f($.recovery_codes),r("recovery-codes"),await t()}catch($){y($.message)}finally{x(!1)}},U=()=>{r("idle"),f([]),h("")},W=async z=>{z.preventDefault(),y(""),x(!0);try{await A.post("/auth/2fa/disable",{password:d}),h(""),r("idle"),await t()}catch($){y($.message)}finally{x(!1)}},q=async z=>{z.preventDefault(),y(""),x(!0);try{const $=await A.post("/auth/2fa/recovery-codes",{password:d});f($.recovery_codes),r("recovery-codes")}catch($){y($.message)}finally{x(!1)}};return a.jsxs("div",{className:"max-w-xl",children:[a.jsx("h1",{className:"mb-1 text-xl font-bold text-neutral-900 dark:text-white",children:"Mein Konto"}),a.jsxs("p",{className:"mb-6 text-sm text-neutral-500 dark:text-neutral-400",children:["Angemeldet als ",a.jsx("strong",{children:e==null?void 0:e.username}),e!=null&&e.is_super_admin?" (Super-Admin)":"","."]}),a.jsxs("div",{className:"mb-6 rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Passwort ändern"}),a.jsxs("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:["Vergib ein neues Passwort für dein Konto.",(e==null?void 0:e.two_factor_enabled)&&" Da 2FA aktiv ist, musst du die Änderung zusätzlich mit deinem Code bestätigen."]}),a.jsxs("form",{onSubmit:E,children:[a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Aktuelles Passwort"}),a.jsx("input",{type:"password",value:p.current_password,onChange:z=>v({...p,current_password:z.target.value}),required:!0,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Neues Passwort"}),a.jsx("input",{type:"password",value:p.new_password,onChange:z=>v({...p,new_password:z.target.value}),required:!0,minLength:8,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Neues Passwort wiederholen"}),a.jsx("input",{type:"password",value:p.new_password_confirmation,onChange:z=>v({...p,new_password_confirmation:z.target.value}),required:!0,minLength:8,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),(e==null?void 0:e.two_factor_enabled)&&a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"2FA-Code zur Bestätigung"}),a.jsx("input",{value:p.two_factor_code,onChange:z=>v({...p,two_factor_code:z.target.value}),required:!0,inputMode:"numeric",placeholder:"123456 oder Wiederherstellungscode",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),k&&a.jsx("p",{className:"mb-4 text-sm text-red-600",children:k}),C&&a.jsx("p",{className:"mb-4 text-sm text-green-600 dark:text-green-400",children:C}),a.jsx("button",{type:"submit",disabled:P,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-60",children:P?"Wird geändert…":"Passwort ändern"})]})]}),a.jsxs("div",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Zwei-Faktor-Authentifizierung"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Schützt dein Konto zusätzlich mit einem Code aus der Google Authenticator App."}),n==="idle"&&a.jsxs(a.Fragment,{children:[a.jsxs("p",{className:"mb-4 text-sm",children:["Status:"," ",e!=null&&e.two_factor_enabled?a.jsx("span",{className:"font-semibold text-green-600 dark:text-green-400",children:"Aktiv"}):a.jsx("span",{className:"font-semibold text-neutral-500 dark:text-neutral-400",children:"Nicht aktiv"})]}),e!=null&&e.two_factor_enabled?a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx("button",{onClick:()=>{r("regenerate"),y("")},className:"rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:"Neue Wiederherstellungscodes erzeugen"}),a.jsx("button",{onClick:()=>{r("disable"),y("")},className:"rounded-md border border-red-300 px-4 py-2 text-sm font-medium text-red-600 hover:bg-red-50 dark:border-red-900 dark:hover:bg-red-900/20",children:"2FA deaktivieren"})]}):a.jsx("button",{onClick:N,disabled:w,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-60",children:"2FA aktivieren"})]}),n==="setup"&&a.jsxs("form",{onSubmit:L,children:[a.jsxs("ol",{className:"mb-4 list-decimal space-y-2 pl-5 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("li",{children:"Öffne die Google Authenticator App (oder eine kompatible App)."}),a.jsx("li",{children:"Scanne den folgenden QR-Code:"})]}),a.jsx("div",{className:"mb-4 flex justify-center",children:s&&a.jsx("img",{src:s,alt:"QR-Code für Zwei-Faktor-Authentifizierung",className:"h-48 w-48 rounded-lg border border-neutral-200 dark:border-neutral-700"})}),a.jsxs("p",{className:"mb-4 text-center text-xs text-neutral-500 dark:text-neutral-400",children:["Geht das Scannen nicht? Gib diesen Code manuell ein: ",a.jsx("br",{}),a.jsx("code",{className:"mt-1 inline-block rounded bg-neutral-100 px-2 py-1 font-mono tracking-wider dark:bg-neutral-800",children:l})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Bestätigungscode aus der App"}),a.jsx("input",{value:u,onChange:z=>c(z.target.value),required:!0,autoFocus:!0,inputMode:"numeric",placeholder:"123456",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-center text-lg tracking-widest dark:border-neutral-700 dark:bg-neutral-900"})]}),b&&a.jsx("p",{className:"mb-4 text-sm text-red-600",children:b}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",disabled:w,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-60",children:"Bestätigen & aktivieren"}),a.jsx("button",{type:"button",onClick:()=>r("idle"),className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]}),n==="recovery-codes"&&a.jsxs("div",{children:[a.jsx("p",{className:"mb-3 text-sm font-semibold text-neutral-900 dark:text-white",children:"Wiederherstellungscodes – jetzt sicher speichern!"}),a.jsx("p",{className:"mb-3 text-sm text-neutral-500 dark:text-neutral-400",children:"Jeder Code funktioniert einmalig, falls du keinen Zugriff mehr auf die Authenticator-App hast. Diese Codes werden nur jetzt angezeigt."}),a.jsx("div",{className:"mb-4 grid grid-cols-2 gap-2 rounded-md bg-neutral-100 p-4 font-mono text-sm dark:bg-neutral-800",children:m.map(z=>a.jsx("span",{children:z},z))}),a.jsx("button",{onClick:U,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600",children:"Ich habe die Codes gespeichert"})]}),n==="disable"&&a.jsxs("form",{onSubmit:W,children:[a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Passwort zur Bestätigung"}),a.jsx("input",{type:"password",value:d,onChange:z=>h(z.target.value),required:!0,autoFocus:!0,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),b&&a.jsx("p",{className:"mb-4 text-sm text-red-600",children:b}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",disabled:w,className:"rounded-md bg-red-600 px-4 py-2 text-sm font-semibold text-white hover:bg-red-700 disabled:opacity-60",children:"2FA jetzt deaktivieren"}),a.jsx("button",{type:"button",onClick:()=>{r("idle"),h("")},className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]}),n==="regenerate"&&a.jsxs("form",{onSubmit:q,children:[a.jsx("p",{className:"mb-3 text-sm text-neutral-500 dark:text-neutral-400",children:"Die bisherigen Wiederherstellungscodes werden ungültig."}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Passwort zur Bestätigung"}),a.jsx("input",{type:"password",value:d,onChange:z=>h(z.target.value),required:!0,autoFocus:!0,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),b&&a.jsx("p",{className:"mb-4 text-sm text-red-600",children:b}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",disabled:w,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-60",children:"Neue Codes erzeugen"}),a.jsx("button",{type:"button",onClick:()=>{r("idle"),h("")},className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]})]})]})}const Gf={username:"",password:"",is_super_admin:!1,permissions:[],group_ids:[]};function L4(e){return e?new Date(e.replace(" ","T")).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"}):"Noch nie"}function D4(){const{user:e,hasPermission:t}=Bt(),[n,r]=g.useState([]),[s,i]=g.useState([]),[l,o]=g.useState([]),[u,c]=g.useState(Gf),[d,h]=g.useState(null),[m,f]=g.useState(""),b=()=>{A.get("/admin-users").then(r),A.get("/permissions/catalog").then(i),(t("permission_groups.manage")||t("users.manage"))&&A.get("/permission-groups").then(o)};g.useEffect(b,[]);const y=j=>{h(j.id),c({username:j.username,password:"",is_super_admin:j.is_super_admin,permissions:j.permissions,group_ids:j.groups.map(C=>C.id)})},w=()=>{h(null),c(Gf)},x=j=>{c(C=>({...C,permissions:C.permissions.includes(j)?C.permissions.filter(S=>S!==j):[...C.permissions,j]}))},p=j=>{c(C=>({...C,group_ids:C.group_ids.includes(j)?C.group_ids.filter(S=>S!==j):[...C.group_ids,j]}))},v=async j=>{j.preventDefault(),f("");try{if(d)await A.put(`/admin-users/${d}`,u);else{if(u.password.length<8){f("Passwort muss mindestens 8 Zeichen lang sein");return}await A.post("/admin-users",u)}w(),b()}catch(C){f(C.message)}},k=async j=>{if(confirm("Diesen Benutzer wirklich löschen?"))try{await A.delete(`/admin-users/${j}`),b()}catch(C){alert(C.message)}};return a.jsxs("div",{className:"grid gap-6 lg:grid-cols-3",children:[a.jsxs("div",{className:"lg:col-span-2",children:[a.jsx("h1",{className:"mb-1 text-xl font-bold text-neutral-900 dark:text-white",children:"Benutzer"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Jeder Mitarbeiter bekommt ein eigenes Konto mit genau den Rechten, die er braucht."}),a.jsx("div",{className:"overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-800",children:a.jsxs("table",{className:"w-full text-left text-sm",children:[a.jsx("thead",{className:"bg-neutral-50 text-neutral-500 dark:bg-neutral-900 dark:text-neutral-400",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-4 py-2",children:"Benutzername"}),a.jsx("th",{className:"px-4 py-2",children:"Rolle"}),a.jsx("th",{className:"px-4 py-2",children:"Berechtigungsgruppen"}),a.jsx("th",{className:"px-4 py-2",children:"Zuletzt aktiv"}),a.jsx("th",{className:"px-4 py-2 text-right",children:"Aktionen"})]})}),a.jsxs("tbody",{className:"divide-y divide-neutral-100 dark:divide-neutral-800",children:[n.map(j=>a.jsxs("tr",{className:"bg-white dark:bg-neutral-950",children:[a.jsxs("td",{className:"px-4 py-2 font-medium text-neutral-800 dark:text-neutral-100",children:[j.username,j.id===(e==null?void 0:e.id)&&a.jsx("span",{className:"ml-1 text-xs text-neutral-400",children:"(du)"})]}),a.jsx("td",{className:"px-4 py-2",children:j.is_super_admin?a.jsx("span",{className:"rounded-full bg-brand-100 px-2 py-0.5 text-xs font-medium text-brand-700 dark:bg-brand-900/40 dark:text-brand-300",children:"Super-Admin"}):a.jsxs("span",{className:"text-neutral-500 dark:text-neutral-400",children:[j.permissions.length," Einzelrechte"]})}),a.jsx("td",{className:"px-4 py-2",children:a.jsxs("div",{className:"flex flex-wrap gap-1",children:[j.groups.map(C=>a.jsx("span",{className:"rounded-full bg-neutral-100 px-2 py-0.5 text-xs text-neutral-600 dark:bg-neutral-800 dark:text-neutral-300",children:C.name},C.id)),j.groups.length===0&&"–"]})}),a.jsx("td",{className:"px-4 py-2 text-neutral-500 dark:text-neutral-400",children:L4(j.last_active_at)}),a.jsxs("td",{className:"px-4 py-2 text-right",children:[a.jsx("button",{onClick:()=>y(j),className:"mr-3 text-brand-600 hover:underline",children:"Bearbeiten"}),j.id!==(e==null?void 0:e.id)&&a.jsx("button",{onClick:()=>k(j.id),className:"text-red-600 hover:underline",children:"Löschen"})]})]},j.id)),n.length===0&&a.jsx("tr",{children:a.jsx("td",{colSpan:5,className:"px-4 py-6 text-center text-neutral-400",children:"Noch keine Benutzer angelegt."})})]})]})})]}),a.jsxs("form",{onSubmit:v,className:"h-fit space-y-4 rounded-xl border border-neutral-200 bg-white p-5 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"font-bold text-neutral-900 dark:text-white",children:d?"Benutzer bearbeiten":"Neuer Benutzer"}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Benutzername *"}),a.jsx("input",{required:!0,value:u.username,onChange:j=>c({...u,username:j.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Passwort ",d?"(leer lassen = unverändert)":"*"]}),a.jsx("input",{type:"password",required:!d,value:u.password,onChange:j=>c({...u,password:j.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),(e==null?void 0:e.is_super_admin)&&a.jsxs("label",{className:"flex items-center gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:u.is_super_admin,onChange:j=>c({...u,is_super_admin:j.target.checked}),className:"h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),"Super-Admin (hat automatisch alle Rechte)"]}),!u.is_super_admin&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("p",{className:"mb-1 text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Einzelne Berechtigungen"}),a.jsx("div",{className:"space-y-1.5 rounded-md border border-neutral-200 p-3 dark:border-neutral-700",children:s.map(j=>a.jsxs("label",{className:"flex items-center gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:u.permissions.includes(j.key),onChange:()=>x(j.key),className:"h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),j.label]},j.key))})]}),a.jsxs("div",{children:[a.jsx("p",{className:"mb-1 text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Berechtigungsgruppen"}),a.jsxs("div",{className:"space-y-1.5 rounded-md border border-neutral-200 p-3 dark:border-neutral-700",children:[l.map(j=>a.jsxs("label",{className:"flex items-center gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:u.group_ids.includes(j.id),onChange:()=>p(j.id),className:"h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),j.name]},j.id)),l.length===0&&a.jsx("p",{className:"text-sm text-neutral-400",children:"Noch keine Berechtigungsgruppen angelegt."})]})]})]}),m&&a.jsx("p",{className:"text-sm text-red-600",children:m}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600",children:d?"Speichern":"Anlegen"}),d&&a.jsx("button",{type:"button",onClick:w,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]})]})}const Kf={name:"",description:"",permissions:[]};function B4(){const[e,t]=g.useState([]),[n,r]=g.useState([]),[s,i]=g.useState(Kf),[l,o]=g.useState(null),[u,c]=g.useState(""),d=()=>{A.get("/permission-groups").then(t),A.get("/permissions/catalog").then(r)};g.useEffect(d,[]);const h=w=>{o(w.id),i({name:w.name,description:w.description||"",permissions:w.permissions})},m=()=>{o(null),i(Kf)},f=w=>{i(x=>({...x,permissions:x.permissions.includes(w)?x.permissions.filter(p=>p!==w):[...x.permissions,w]}))},b=async w=>{w.preventDefault(),c("");try{l?await A.put(`/permission-groups/${l}`,s):await A.post("/permission-groups",s),m(),d()}catch(x){c(x.message)}},y=async w=>{confirm("Diese Berechtigungsgruppe wirklich löschen? Benutzer behalten ihre sonstigen Rechte.")&&(await A.delete(`/permission-groups/${w}`),d())};return a.jsxs("div",{className:"grid gap-6 lg:grid-cols-3",children:[a.jsxs("div",{className:"lg:col-span-2",children:[a.jsx("h1",{className:"mb-1 text-xl font-bold text-neutral-900 dark:text-white",children:"Berechtigungsgruppen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:'Fasse mehrere Berechtigungen zu einer Gruppe zusammen (z. B. „Werkstatt"), die du dann bequem einem oder mehreren Benutzern zuweisen kannst.'}),a.jsx("div",{className:"overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-800",children:a.jsxs("table",{className:"w-full text-left text-sm",children:[a.jsx("thead",{className:"bg-neutral-50 text-neutral-500 dark:bg-neutral-900 dark:text-neutral-400",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-4 py-2",children:"Name"}),a.jsx("th",{className:"px-4 py-2",children:"Berechtigungen"}),a.jsx("th",{className:"px-4 py-2 text-right",children:"Aktionen"})]})}),a.jsxs("tbody",{className:"divide-y divide-neutral-100 dark:divide-neutral-800",children:[e.map(w=>a.jsxs("tr",{className:"bg-white dark:bg-neutral-950",children:[a.jsxs("td",{className:"px-4 py-2",children:[a.jsx("p",{className:"font-medium text-neutral-800 dark:text-neutral-100",children:w.name}),w.description&&a.jsx("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w.description})]}),a.jsxs("td",{className:"px-4 py-2 text-neutral-500 dark:text-neutral-400",children:[w.permissions.length," von ",n.length]}),a.jsxs("td",{className:"px-4 py-2 text-right",children:[a.jsx("button",{onClick:()=>h(w),className:"mr-3 text-brand-600 hover:underline",children:"Bearbeiten"}),a.jsx("button",{onClick:()=>y(w.id),className:"text-red-600 hover:underline",children:"Löschen"})]})]},w.id)),e.length===0&&a.jsx("tr",{children:a.jsx("td",{colSpan:3,className:"px-4 py-6 text-center text-neutral-400",children:"Noch keine Berechtigungsgruppen angelegt."})})]})]})})]}),a.jsxs("form",{onSubmit:b,className:"h-fit space-y-4 rounded-xl border border-neutral-200 bg-white p-5 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"font-bold text-neutral-900 dark:text-white",children:l?"Gruppe bearbeiten":"Neue Gruppe"}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Name *"}),a.jsx("input",{required:!0,value:s.name,onChange:w=>i({...s,name:w.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Beschreibung"}),a.jsx("textarea",{rows:2,value:s.description,onChange:w=>i({...s,description:w.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("p",{className:"mb-1 text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Berechtigungen"}),a.jsx("div",{className:"space-y-1.5 rounded-md border border-neutral-200 p-3 dark:border-neutral-700",children:n.map(w=>a.jsxs("label",{className:"flex items-center gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:s.permissions.includes(w.key),onChange:()=>f(w.key),className:"h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),w.label]},w.key))})]}),u&&a.jsx("p",{className:"text-sm text-red-600",children:u}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("button",{type:"submit",className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600",children:l?"Speichern":"Anlegen"}),l&&a.jsx("button",{type:"button",onClick:m,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm dark:border-neutral-700",children:"Abbrechen"})]})]})]})}const z4=[{to:"/admin/settings/website",label:"Website"},{to:"/admin/settings/email",label:"E-Mail"},{to:"/admin/settings/database",label:"Datenbank"},{to:"/admin/settings/export-import",label:"Export & Import"},{to:"/admin/settings/maintenance",label:"Wartungsmodus"},{to:"/admin/settings/reset",label:"Zurücksetzen"}];function R4(){const e=({isActive:t})=>`rounded-md px-4 py-2 text-sm font-medium transition ${t?"bg-brand-500 text-white":"text-neutral-600 hover:bg-neutral-100 dark:text-neutral-300 dark:hover:bg-neutral-800"}`;return a.jsxs("div",{children:[a.jsx("h1",{className:"mb-1 text-xl font-bold text-neutral-900 dark:text-white",children:"Einstellungen"}),a.jsx("p",{className:"mb-5 text-sm text-neutral-500 dark:text-neutral-400",children:"Werkzeuge rund um Datenbank, Server-Umzug und Zurücksetzen dieser Seite."}),a.jsx("nav",{className:"mb-6 flex flex-wrap gap-2",children:z4.map(t=>a.jsx(ug,{to:t.to,className:e,children:t.label},t.to))}),a.jsx(hl,{})]})}const I4={phone:"",whatsapp:"",contact_email:"",hero_image_path:"",ga_measurement_id:"",package_card_theme:"graphite",package_card_layout:"strip",package_wheel_hint_interval:8},F4=[{value:"graphite",label:"Graphite Green",description:"Graphit über Bronze/Silber/Gold/Platin bis zur Onyx-Krönung."},{value:"deep-blue",label:"Deep Blue Luxury",description:"Kühles Blau, das sich über Grün zu Gold erwärmt."},{value:"warm-bronze",label:"Warm Bronze",description:"Durchgehend warmes Kupfer/Bronze/Amber bis zum Gold."}],V4=[{value:"grid",label:"Raster",description:"Breite Kacheln, die responsiv in mehrere Zeilen umbrechen."},{value:"strip",label:"Scroll-Band",description:"Schmale, hochkant Kacheln in einer horizontal scrollbaren Reihe."},{value:"coverflow",label:"3D-Coverflow",description:"Kacheln drehen sich beim Wischen räumlich – die mittlere steht im Fokus."}];function O4(){const[e,t]=g.useState(I4),[n,r]=g.useState(!0),[s,i]=g.useState(!1),[l,o]=g.useState(!1),[u,c]=g.useState(""),[d,h]=g.useState(""),[m,f]=g.useState(""),[b,y]=g.useState(!1),[w,x]=g.useState(!1),[p,v]=g.useState(""),[k,j]=g.useState(!1),[C,S]=g.useState(""),[P,M]=g.useState(""),[E,N]=g.useState(!1),[L,U]=g.useState(null),[W,q]=g.useState(!1),[z,$]=g.useState(""),[_,B]=g.useState(!1),[F,O]=g.useState(!1);g.useEffect(()=>{A.get("/site-settings").then(R=>t({phone:R.phone||"",whatsapp:R.whatsapp||"",contact_email:R.contact_email||"",hero_image_path:R.hero_image_path||"",ga_measurement_id:R.ga_measurement_id||"",package_card_theme:R.package_card_theme||"graphite",package_card_layout:R.package_card_layout||"strip",package_wheel_hint_interval:R.package_wheel_hint_interval||8})).finally(()=>r(!1)),A.get("/settings/analytics").then(R=>{h(R.ga_property_id||""),y(R.has_credentials)}),X()},[]);const X=()=>{A.get("/settings/google-reviews").then(R=>{S(R.place_id||""),N(R.has_api_key),U(R)})},fe=async()=>{q(!0),$(""),B(!1);try{const R=await A.post("/settings/google-reviews",{place_id:C,api_key:P});N(R.has_api_key),U(R),M(""),B(!0)}catch(R){$(R.message)}finally{q(!1)}},Y=async()=>{O(!0),$("");try{const R=await A.post("/settings/google-reviews/refresh",{});U(R)}catch(R){$(R.message),X()}finally{O(!1)}},ne=async()=>{x(!0),v(""),j(!1);try{const R=await A.post("/settings/analytics",{ga_property_id:d,service_account_json:m});y(R.has_credentials),f(""),j(!0)}catch(R){v(R.message)}finally{x(!1)}},te=(R,Rt)=>{t($r=>({...$r,[R]:Rt})),o(!1)},qe=async R=>{R.preventDefault(),i(!0),c(""),o(!1);try{await A.post("/site-settings",e),o(!0)}catch(Rt){c(Rt.message)}finally{i(!1)}};return n?a.jsx("p",{className:"text-sm text-neutral-400",children:"Lädt…"}):a.jsxs("form",{onSubmit:qe,className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Startseiten-Bild"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Das große Hero-Bild ganz oben auf der Startseite. Ohne eigenes Bild wird das Standardbild verwendet."}),a.jsx(vl,{value:e.hero_image_path,onChange:R=>te("hero_image_path",R),label:"Bild"})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Kontaktdaten"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Wird im Header, Footer und auf der Kontaktseite angezeigt."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Telefon"}),a.jsx("input",{value:e.phone,onChange:R=>te("phone",R.target.value),placeholder:"09373 20 62 390",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"WhatsApp Business Nummer"}),a.jsx("input",{value:e.whatsapp,onChange:R=>te("whatsapp",R.target.value),placeholder:"z. B. 09373 20 62 390",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("p",{className:"mt-1 text-xs text-neutral-400",children:"Leer lassen, um den WhatsApp-Link im Header auszublenden."})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"E-Mail"}),a.jsx("input",{type:"email",value:e.contact_email,onChange:R=>te("contact_email",R.target.value),placeholder:"info@hifi-planet-amorbach.de",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Paket-Kachel-Design"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Bestimmt die Farbgebung der Paket-Stufen auf jeder Fahrzeug-Modell-Seite (von der günstigsten bis zur teuersten Option)."}),a.jsx("div",{className:"grid gap-3 sm:grid-cols-3",children:F4.map(R=>a.jsxs("label",{className:`cursor-pointer rounded-lg border p-3 text-sm transition ${e.package_card_theme===R.value?"border-brand-500 ring-2 ring-brand-500/40":"border-neutral-300 hover:border-neutral-400 dark:border-neutral-700 dark:hover:border-neutral-600"}`,children:[a.jsx("input",{type:"radio",name:"package_card_theme",value:R.value,checked:e.package_card_theme===R.value,onChange:Rt=>te("package_card_theme",Rt.target.value),className:"sr-only"}),a.jsx("p",{className:"font-semibold text-neutral-900 dark:text-white",children:R.label}),a.jsx("p",{className:"mt-1 text-xs text-neutral-500 dark:text-neutral-400",children:R.description})]},R.value))})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Kachel-Layout"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Bestimmt, wie die Paket-Stufen auf jeder Fahrzeug-Modell-Seite angeordnet werden."}),a.jsx("div",{className:"grid gap-3 sm:grid-cols-3",children:V4.map(R=>a.jsxs("label",{className:`cursor-pointer rounded-lg border p-3 text-sm transition ${e.package_card_layout===R.value?"border-brand-500 ring-2 ring-brand-500/40":"border-neutral-300 hover:border-neutral-400 dark:border-neutral-700 dark:hover:border-neutral-600"}`,children:[a.jsx("input",{type:"radio",name:"package_card_layout",value:R.value,checked:e.package_card_layout===R.value,onChange:Rt=>te("package_card_layout",Rt.target.value),className:"sr-only"}),a.jsx("p",{className:"font-semibold text-neutral-900 dark:text-white",children:R.label}),a.jsx("p",{className:"mt-1 text-xs text-neutral-500 dark:text-neutral-400",children:R.description})]},R.value))}),a.jsxs("div",{className:"mt-5 max-w-xs",children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Mausrad-Hinweis: Wiederholung (Sekunden)"}),a.jsx("input",{type:"number",min:"2",max:"120",value:e.package_wheel_hint_interval,onChange:R=>te("package_wheel_hint_interval",R.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("p",{className:"mt-1 text-xs text-neutral-400",children:'Nur bei Scroll-Band/3D-Coverflow: Solange ein Besucher noch auf der ersten Kachel steht, wird der "mit dem Mausrad blättern"-Hinweis in diesem Abstand wiederholt.'})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Google Analytics"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Wird erst geladen, nachdem ein Besucher der Statistik-Kategorie im Cookie-Banner zugestimmt hat. Leer lassen, um Google Analytics zu deaktivieren."}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Measurement-ID"}),a.jsx("input",{value:e.ga_measurement_id,onChange:R=>te("ga_measurement_id",R.target.value),placeholder:"G-XXXXXXXXXX",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{className:"mt-5 border-t border-neutral-200 pt-5 dark:border-neutral-800",children:[a.jsx("h3",{className:"mb-1 text-sm font-semibold text-neutral-900 dark:text-white",children:"Dashboard-Anbindung (optional)"}),a.jsx("p",{className:"mb-3 text-sm text-neutral-500 dark:text-neutral-400",children:"Zeigt Besucherzahlen direkt in deinem Admin-Dashboard an. Braucht ein Google-Cloud-Service-Account mit Lesezugriff auf diese GA4-Property."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Property-ID"}),a.jsx("input",{value:d,onChange:R=>{h(R.target.value),j(!1)},placeholder:"z. B. 123456789",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("p",{className:"mt-1 text-xs text-neutral-400",children:"Nicht die Measurement-ID (G-...) - zu finden unter GA4 → Verwaltung → Property-Details."})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Service-Account-JSON-Schlüssel ",b?"(leer lassen = unverändert)":""]}),a.jsx("textarea",{rows:4,value:m,onChange:R=>{f(R.target.value),j(!1)},placeholder:b?'{ "type": "service_account", ... } (bereits hinterlegt)':'{ "type": "service_account", ... }',className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 font-mono text-xs dark:border-neutral-700 dark:bg-neutral-900"})]})]}),p&&a.jsx("p",{className:"mt-2 text-sm text-red-600",children:p}),k&&a.jsx("p",{className:"mt-2 text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsx("button",{type:"button",onClick:ne,disabled:w,className:"mt-3 rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 disabled:opacity-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:w?"Speichere…":"Dashboard-Anbindung speichern"})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Google-Rezensionen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Zeigt die echte Google-Bewertung und die aktuellsten Rezensionen auf der Startseite an, statt der fest eingetragenen Beispiel-Texte. Wird einmal täglich automatisch aktualisiert (nie bei einem Seitenbesuch selbst) – die Seite zeigt also immer den letzten erfolgreich abgerufenen Stand."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Place-ID"}),a.jsx("input",{value:C,onChange:R=>{S(R.target.value),B(!1)},placeholder:"z. B. ChIJN1t_tDeuEmsRUsoyG83frY4",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsxs("p",{className:"mt-1 text-xs text-neutral-400",children:["Eindeutige Google-Kennung eures Eintrags – zu finden über den"," ",a.jsx("a",{href:"https://developers.google.com/maps/documentation/places/web-service/place-id#find-id",target:"_blank",rel:"noopener noreferrer",className:"underline hover:text-brand-600",children:"Google Place ID Finder"}),"."]})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Places-API-Key ",E?"(leer lassen = unverändert)":""]}),a.jsx("input",{value:P,onChange:R=>{M(R.target.value),B(!1)},placeholder:E?"••••••••••••••••••••• (bereits hinterlegt)":"AIzaSy…",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 font-mono text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("p",{className:"mt-1 text-xs text-neutral-400",children:"Aus der Google-Cloud-Console, mit aktivierter „Places API (New)“."})]})]}),z&&a.jsx("p",{className:"mt-3 text-sm text-red-600",children:z}),_&&a.jsx("p",{className:"mt-3 text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-3",children:[a.jsx("button",{type:"button",onClick:fe,disabled:W,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 disabled:opacity-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:W?"Speichere…":"Google-Rezensionen-Einstellungen speichern"}),a.jsx("button",{type:"button",onClick:Y,disabled:F||!C||!E,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:F?"Aktualisiere…":"Jetzt aktualisieren"})]}),L&&a.jsxs("div",{className:"mt-4 rounded-md bg-neutral-50 p-3 text-sm dark:bg-neutral-800/50",children:[L.rating!=null?a.jsxs("p",{className:"text-neutral-700 dark:text-neutral-300",children:["Aktuell hinterlegt: ",a.jsxs("strong",{children:[L.rating," ★"]})," (",L.rating_count," Bewertungen)",L.updated_at&&a.jsxs(a.Fragment,{children:[" – zuletzt aktualisiert am ",new Date(L.updated_at.replace(" ","T")).toLocaleString("de-DE")]})]}):a.jsx("p",{className:"text-neutral-500 dark:text-neutral-400",children:"Noch keine erfolgreiche Aktualisierung – die Startseite zeigt bis dahin weiter die Beispiel-Rezensionen."}),L.error&&a.jsxs("p",{className:"mt-1 text-red-600",children:["Letzter Fehler: ",L.error]})]})]}),u&&a.jsx("p",{className:"text-sm text-red-600",children:u}),l&&a.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsx("button",{type:"submit",disabled:s,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:s?"Speichere…":"Speichern"})]})}const U4={mail_host:"",mail_port:587,mail_username:"",mail_password:"",mail_encryption:"tls",mail_from_email:"",mail_from_name:"",mail_notify_email:"",mail_customer_subject:"",mail_customer_body:"",mail_owner_subject:"",mail_owner_body:""},W4=[["{{name}}","Name des Kunden"],["{{email}}","E-Mail des Kunden"],["{{phone}}","Telefonnummer"],["{{vin}}","Fahrgestellnummer (FIN)"],["{{message}}","Nachricht des Kunden"],["{{brand}}","Marke"],["{{model}}","Modell"],["{{package}}","Paket"],["{{product}}","Produkt"],["{{upgrades}}","Gewählte Upgrades"]];function qf(){return a.jsx("div",{className:"mt-3 flex flex-wrap gap-1.5",children:W4.map(([e,t])=>a.jsx("span",{title:t,className:"rounded-md bg-neutral-100 px-2 py-1 font-mono text-xs text-neutral-600 dark:bg-neutral-800 dark:text-neutral-300",children:e},e))})}function H4(){const[e,t]=g.useState(U4),[n,r]=g.useState(!1),[s,i]=g.useState(!0),[l,o]=g.useState(!1),[u,c]=g.useState(!1),[d,h]=g.useState(""),[m,f]=g.useState(!1),[b,y]=g.useState(!1),[w,x]=g.useState(""),[p,v]=g.useState(""),[k,j]=g.useState(""),[C,S]=g.useState(null);g.useEffect(()=>{A.get("/settings/mail").then(N=>{t({...N,mail_password:""}),r(N.has_password)}).finally(()=>i(!1))},[]);const P=(N,L)=>{t(U=>({...U,[N]:L})),f(!1)},M=async N=>{N.preventDefault(),c(!0),h(""),f(!1);try{const L=await A.post("/settings/mail",e);t({...L,mail_password:""}),r(L.has_password),f(!0)}catch(L){h(L.message)}finally{c(!1)}},E=async()=>{y(!0),x(""),v(""),j(""),S(null);try{const N=await A.post("/settings/mail/test",e);v(`Testmail gesendet an ${N.sent_to}. Der Server hat die Mail angenommen - prüfe auch den Spam-Ordner, das ist noch keine Garantie für die Zustellung.`),j(N.warning||""),S(N.smtp_log||null)}catch(N){x(N.message)}finally{y(!1)}};return s?a.jsx("p",{className:"text-sm text-neutral-400",children:"Lädt…"}):a.jsxs("form",{onSubmit:M,className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"SMTP-Server"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Zugangsdaten deines Mail-Postfachs oder Transactional-Mail-Anbieters. Solange kein Server eingetragen ist, werden keine E-Mails verschickt (Kontaktanfragen werden trotzdem in der Datenbank gespeichert)."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-[1fr_120px]",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Server (Host)"}),a.jsx("input",{value:e.mail_host,onChange:N=>P("mail_host",N.target.value),placeholder:"smtp.beispiel.de",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Port"}),a.jsx("input",{type:"number",value:e.mail_port,onChange:N=>P("mail_port",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Verschlüsselung"}),a.jsxs("select",{value:e.mail_encryption,onChange:N=>P("mail_encryption",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900",children:[a.jsx("option",{value:"tls",children:"STARTTLS"}),a.jsx("option",{value:"ssl",children:"SSL"}),a.jsx("option",{value:"none",children:"Keine"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Benutzername"}),a.jsx("input",{value:e.mail_username,onChange:N=>P("mail_username",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Passwort ",n?"(leer lassen = unverändert)":""]}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("input",{type:l?"text":"password",value:e.mail_password,onChange:N=>P("mail_password",N.target.value),placeholder:n?"••••••••":"",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("button",{type:"button",onClick:()=>o(N=>!N),className:"shrink-0 rounded-md border border-neutral-300 px-3 text-sm dark:border-neutral-700",children:l?"Verbergen":"Anzeigen"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Absender-E-Mail"}),a.jsx("input",{type:"email",value:e.mail_from_email,onChange:N=>P("mail_from_email",N.target.value),placeholder:"info@hifi-planet-amorbach.de",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Absender-Name"}),a.jsx("input",{value:e.mail_from_name,onChange:N=>P("mail_from_name",N.target.value),placeholder:"HifiPlanet",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]}),a.jsxs("div",{className:"mt-4 border-t border-neutral-200 pt-4 dark:border-neutral-800",children:[w&&a.jsx("p",{className:"mb-2 whitespace-pre-wrap text-sm text-red-600",children:w}),p&&a.jsx("p",{className:"mb-2 text-sm text-green-600 dark:text-green-400",children:p}),k&&a.jsx("p",{className:"mb-2 rounded-md bg-amber-50 p-2 text-sm text-amber-800 dark:bg-amber-900/20 dark:text-amber-300",children:k}),a.jsx("button",{type:"button",onClick:E,disabled:b,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 disabled:opacity-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:b?"Sende Testmail…":"Verbindung testen"}),C&&C.length>0&&a.jsxs("details",{className:"mt-3",children:[a.jsx("summary",{className:"cursor-pointer text-xs text-neutral-500 dark:text-neutral-400",children:"SMTP-Protokoll anzeigen"}),a.jsx("pre",{className:"mt-2 max-h-64 overflow-auto rounded-md bg-neutral-900 p-3 text-xs text-neutral-200",children:C.join(` +`)})]})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Empfänger"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"An diese Adresse geht die Benachrichtigung bei jeder neuen Kontaktanfrage."}),a.jsx("input",{type:"email",value:e.mail_notify_email,onChange:N=>P("mail_notify_email",N.target.value),placeholder:"info@hifi-planet-amorbach.de",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"E-Mail an den Kunden (Bestätigung)"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Geht automatisch an den Kunden, sobald er eine Kontaktanfrage abschickt."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Betreff"}),a.jsx("input",{value:e.mail_customer_subject,onChange:N=>P("mail_customer_subject",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Text"}),a.jsx("textarea",{rows:8,value:e.mail_customer_body,onChange:N=>P("mail_customer_body",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]}),a.jsx(qf,{})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"E-Mail an den Shop (Benachrichtigung)"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Geht an die oben eingestellte Empfänger-Adresse, sobald eine neue Kontaktanfrage eingeht."}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Betreff"}),a.jsx("input",{value:e.mail_owner_subject,onChange:N=>P("mail_owner_subject",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Text"}),a.jsx("textarea",{rows:8,value:e.mail_owner_body,onChange:N=>P("mail_owner_body",N.target.value),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]})]}),a.jsx(qf,{})]}),d&&a.jsx("p",{className:"text-sm text-red-600",children:d}),m&&a.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsx("button",{type:"submit",disabled:u,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:u?"Speichere…":"Speichern"})]})}function $4(){const[e,t]=g.useState({host:"",name:"",user:"",password:"",charset:"utf8mb4"}),[n,r]=g.useState(!1),[s,i]=g.useState(!0),[l,o]=g.useState(!1),[u,c]=g.useState(!1),[d,h]=g.useState(""),[m,f]=g.useState(!1),[b,y]=g.useState(null),[w,x]=g.useState(!0),[p,v]=g.useState(!1),[k,j]=g.useState(null),C=()=>{i(!0),A.get("/settings/database").then(E=>{t({...E.config,password:""}),r(E.has_password)}).finally(()=>i(!1))},S=()=>{x(!0),A.get("/settings/schema-check").then(y).catch(E=>y({ok:!1,error:E.message,tables:[]})).finally(()=>x(!1))};g.useEffect(()=>{C(),S()},[]);const P=async()=>{v(!0),j(null);try{const E=await A.post("/settings/schema-migrate",{});j(E.actions),y(E.report)}catch(E){j(["Fehler: "+E.message])}finally{v(!1)}},M=async E=>{E.preventDefault(),c(!0),h(""),f(!1);try{await A.post("/settings/database",e),f(!0),t(N=>({...N,password:""})),r(!0),S()}catch(N){h(N.message)}finally{c(!1)}};return a.jsxs("div",{className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Datenbank-Zugangsdaten"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Wichtig für einen Umzug auf einen anderen Server/Webspace: Trage hier die Zugangsdaten der dortigen Datenbank ein. Die Verbindung wird vor dem Speichern getestet, damit du dich nicht aussperrst."}),s?a.jsx("p",{className:"text-sm text-neutral-400",children:"Lädt…"}):a.jsxs("form",{onSubmit:M,className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Host *"}),a.jsx("input",{required:!0,value:e.host,onChange:E=>t({...e,host:E.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Datenbankname *"}),a.jsx("input",{required:!0,value:e.name,onChange:E=>t({...e,name:E.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Benutzer *"}),a.jsx("input",{required:!0,value:e.user,onChange:E=>t({...e,user:E.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:["Passwort ",n?"(leer lassen = unverändert)":""]}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("input",{type:l?"text":"password",value:e.password,onChange:E=>t({...e,password:E.target.value}),placeholder:n?"••••••••":"",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"}),a.jsx("button",{type:"button",onClick:()=>o(E=>!E),className:"shrink-0 rounded-md border border-neutral-300 px-3 text-sm dark:border-neutral-700",children:l?"Verbergen":"Anzeigen"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Zeichensatz"}),a.jsx("input",{value:e.charset,onChange:E=>t({...e,charset:E.target.value}),className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]}),d&&a.jsx("p",{className:"text-sm text-red-600",children:d}),m&&a.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:"Verbindung erfolgreich getestet und gespeichert."}),a.jsx("button",{type:"submit",disabled:u,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:u?"Teste & speichere…":"Verbindung testen & speichern"})]})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsxs("div",{className:"mb-1 flex items-center justify-between gap-3",children:[a.jsx("h2",{className:"font-semibold text-neutral-900 dark:text-white",children:"Datenbankstruktur"}),!w&&b&&a.jsx("span",{className:`rounded-full px-3 py-1 text-xs font-semibold ${b.ok?"bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-300":"bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300"}`,children:b.ok?"Datenbank OK":"Datenbank nicht OK"})]}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Prüft, ob diese Datenbank alle Tabellen und Spalten hat, die der aktuelle Code-Stand braucht – wichtig, wenn deine Live-Version auf einem anderen Server einen älteren Stand hat."}),w&&a.jsx("p",{className:"text-sm text-neutral-400",children:"Prüfe…"}),!w&&b&&!b.ok&&a.jsx("ul",{className:"mb-4 space-y-1 rounded-md bg-red-50 p-3 text-sm text-red-800 dark:bg-red-900/20 dark:text-red-300",children:b.tables.filter(E=>!E.ok).map(E=>a.jsx("li",{children:E.exists?a.jsxs(a.Fragment,{children:["Tabelle ",a.jsx("code",{className:"font-mono",children:E.table}),": Spalte(n) fehlen – ",E.missing_columns.join(", ")]}):a.jsxs(a.Fragment,{children:["Tabelle ",a.jsx("code",{className:"font-mono",children:E.table})," fehlt komplett"]})},E.table))}),a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx("button",{onClick:S,disabled:w,className:"rounded-md border border-neutral-300 px-4 py-2 text-sm font-medium hover:bg-neutral-50 disabled:opacity-50 dark:border-neutral-700 dark:hover:bg-neutral-800",children:"Erneut prüfen"}),b&&!b.ok&&a.jsx("button",{onClick:P,disabled:p,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:p?"Aktualisiere…":"Datenbankstruktur aktualisieren"})]}),k&&a.jsx("ul",{className:"mt-3 space-y-1 rounded-md bg-neutral-50 p-3 text-sm text-neutral-700 dark:bg-neutral-800 dark:text-neutral-300",children:k.map((E,N)=>a.jsx("li",{children:E},N))})]})]})}const Ua=[{key:"catalog",label:"Fahrzeug-Katalog",hint:"Marken, Modelle, Pakete, Produkte, Upgrades",tables:["brands","car_models","packages","package_products","package_upgrades"]},{key:"services",label:"Leistungen",hint:"Die Leistungen-Übersicht",tables:["services"]},{key:"faqs",label:"FAQs",hint:"Häufig gestellte Fragen",tables:["faqs"]},{key:"gallery",label:"Bildergalerie",hint:"Galerie-Marken, Projekte und Fotos (inkl. Bilder)",tables:["gallery_brands","gallery_projects","gallery_photos"]}],_b={brands:"Marken",car_models:"Modelle",packages:"Pakete",package_products:"Produkte",package_upgrades:"Upgrades",services:"Leistungen",faqs:"FAQs",gallery_brands:"Galerie-Marken",gallery_projects:"Galerie-Projekte",gallery_photos:"Galerie-Fotos"},G4=(e,t)=>{if(!e)return null;const n=t.map(r=>[r,Array.isArray(e[r])?e[r].length:0]).filter(([,r])=>r>0).map(([r,s])=>`${s} ${_b[r]||r}`);return n.length?n.join(", "):"leer in dieser Datei"};function K4(){const[e,t]=g.useState(null),[n,r]=g.useState(null),[s,i]=g.useState(""),[l,o]=g.useState(()=>new Set(Ua.map(k=>k.key))),[u,c]=g.useState(!1),[d,h]=g.useState(!1),[m,f]=g.useState(null),[b,y]=g.useState(""),w=async k=>{var C;const j=((C=k.target.files)==null?void 0:C[0])||null;if(t(j),f(null),y(""),r(null),i(""),o(new Set(Ua.map(S=>S.key))),!!j)try{const S=await j.text(),P=JSON.parse(S);if(!P||typeof P.data!="object")throw new Error("kein gültiges Export-Format");r(P.data)}catch{i("Datei konnte nicht gelesen werden – Vorschau der Inhalte nicht möglich. Import würde trotzdem versucht (alle Bereiche).")}},x=k=>{o(j=>{const C=new Set(j);return C.has(k)?C.delete(k):C.add(k),C})},p=async k=>{if(k.preventDefault(),!(!e||!u||l.size===0)){h(!0),y(""),f(null);try{const j=new FormData;j.append("file",e),j.append("sections",JSON.stringify([...l]));const C=await A.post("/settings/import",j);f(C),t(null),r(null),c(!1),k.target.reset()}catch(j){y(j.message)}finally{h(!1)}}},v=Ua.filter(k=>l.has(k.key)).map(k=>k.label);return a.jsxs("div",{className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Daten exportieren"}),a.jsxs("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:["Lädt eine Datei mit allen Marken, Modellen, Paketen, Produkten, Upgrades, Leistungen, FAQs und der kompletten Bildergalerie (inkl. Bilder) herunter. Benutzerkonten und Kontaktanfragen sind bewusst",a.jsx("strong",{children:" nicht"})," enthalten."]}),a.jsx("a",{href:`${cg}/settings/export`,className:"inline-block rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600",children:"Jetzt exportieren"})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Daten importieren"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Lädt eine zuvor exportierte Datei auf diesen Server. Ersetzt dabei die ausgewählten Bereiche komplett durch den Inhalt der Datei – das kann nicht rückgängig gemacht werden. Kontaktanfragen und Benutzerkonten bleiben immer unangetastet."}),a.jsxs("form",{onSubmit:p,className:"space-y-4",children:[a.jsx("input",{type:"file",accept:"application/json,.json",onChange:w,className:"text-sm"}),e&&a.jsxs("div",{className:"rounded-lg border border-neutral-200 dark:border-neutral-700",children:[a.jsx("div",{className:"border-b border-neutral-200 px-4 py-2 text-xs font-semibold uppercase tracking-wide text-neutral-500 dark:border-neutral-700 dark:text-neutral-400",children:"Was soll importiert werden?"}),s&&a.jsx("p",{className:"px-4 pt-3 text-sm text-amber-600 dark:text-amber-400",children:s}),a.jsx("div",{className:"divide-y divide-neutral-100 dark:divide-neutral-800",children:Ua.map(k=>a.jsxs("label",{className:"flex cursor-pointer items-start gap-3 px-4 py-3 hover:bg-neutral-50 dark:hover:bg-neutral-800/50",children:[a.jsx("input",{type:"checkbox",checked:l.has(k.key),onChange:()=>x(k.key),className:"mt-0.5 h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),a.jsxs("span",{className:"flex-1",children:[a.jsx("span",{className:"block text-sm font-medium text-neutral-800 dark:text-neutral-100",children:k.label}),a.jsx("span",{className:"block text-xs text-neutral-500 dark:text-neutral-400",children:n?G4(n,k.tables):k.hint})]})]},k.key))})]}),a.jsxs("label",{className:"flex items-start gap-2 text-sm text-neutral-700 dark:text-neutral-300",children:[a.jsx("input",{type:"checkbox",checked:u,onChange:k=>c(k.target.checked),className:"mt-0.5 h-4 w-4 rounded border-neutral-300 text-brand-600 focus:ring-brand-500"}),"Mir ist bewusst, dass dies"," ",v.length?a.jsx("strong",{children:v.join(", ")}):"die ausgewählten Bereiche"," auf diesem Server unwiderruflich ersetzt."]}),a.jsx("button",{type:"submit",disabled:!e||!u||d||l.size===0,className:"rounded-md bg-red-600 px-4 py-2 text-sm font-semibold text-white hover:bg-red-700 disabled:opacity-50",children:d?"Importiere…":"Importieren"})]}),b&&a.jsx("p",{className:"mt-3 text-sm text-red-600",children:b}),m&&a.jsxs("div",{className:"mt-3 rounded-md bg-green-50 p-3 text-sm text-green-800 dark:bg-green-900/20 dark:text-green-300",children:[a.jsx("p",{className:"mb-1 font-semibold",children:"Import erfolgreich:"}),a.jsxs("ul",{className:"list-disc pl-5",children:[Object.entries(m.counts).map(([k,j])=>a.jsxs("li",{children:[j," ",_b[k]||k]},k)),m.images_restored>0&&a.jsxs("li",{children:[m.images_restored," Bilder wiederhergestellt"]})]})]})]})]})}const q4={global:{enabled:!1,message:""},services:{enabled:!1,message:""},vehicles:{enabled:!1,message:""}};function Y4(){const[e,t]=g.useState(q4),[n,r]=g.useState(!0),[s,i]=g.useState(!1),[l,o]=g.useState(!1),[u,c]=g.useState("");g.useEffect(()=>{A.get("/maintenance").then(f=>{t({global:{enabled:f.global.enabled,message:f.global.message||""},services:{enabled:f.services.enabled,message:f.services.message||""},vehicles:{enabled:f.vehicles.enabled,message:f.vehicles.message||""}})}).finally(()=>r(!1))},[]);const d=(f,b,y)=>{t(w=>({...w,[f]:{...w[f],[b]:y}})),o(!1)},h=async f=>{f.preventDefault(),i(!0),c(""),o(!1);try{const b=await A.post("/maintenance",e);t({global:{enabled:b.global.enabled,message:b.global.message||""},services:{enabled:b.services.enabled,message:b.services.message||""},vehicles:{enabled:b.vehicles.enabled,message:b.vehicles.message||""}}),o(!0)}catch(b){c(b.message)}finally{i(!1)}},m=[{key:"global",title:"Gesamte Seite",hint:"Besucher sehen nur noch eine Wartungsmeldung – egal welche Seite sie aufrufen. Das Admin-Panel bleibt für dich erreichbar."},{key:"services",title:"Nur Leistungen",hint:"Nur die Leistungen-Seite zeigt eine Wartungsmeldung, der Rest der Website funktioniert normal."},{key:"vehicles",title:"Nur Fahrzeugkatalog",hint:"Nur die Fahrzeugauswahl (Marke → Modell → Pakete) zeigt eine Wartungsmeldung, der Rest der Website funktioniert normal."}];return n?a.jsx("p",{className:"text-sm text-neutral-400",children:"Lädt…"}):a.jsxs("form",{onSubmit:h,className:"max-w-2xl space-y-6",children:[a.jsx("p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:'Ist "Gesamte Seite" aktiv, gewinnt das immer – die beiden anderen Schalter spielen dann keine Rolle mehr.'}),m.map(f=>a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsxs("div",{className:"mb-1 flex items-center justify-between gap-3",children:[a.jsx("h2",{className:"font-semibold text-neutral-900 dark:text-white",children:f.title}),a.jsxs("label",{className:"relative inline-flex cursor-pointer items-center",children:[a.jsx("input",{type:"checkbox",checked:e[f.key].enabled,onChange:b=>d(f.key,"enabled",b.target.checked),className:"peer sr-only"}),a.jsx("div",{className:"h-6 w-11 rounded-full bg-neutral-200 transition peer-checked:bg-brand-500 dark:bg-neutral-700"}),a.jsx("div",{className:"absolute left-1 top-1 h-4 w-4 rounded-full bg-white transition peer-checked:translate-x-5"})]})]}),a.jsx("p",{className:"mb-3 text-sm text-neutral-500 dark:text-neutral-400",children:f.hint}),a.jsx("label",{className:"mb-1 block text-sm font-medium text-neutral-700 dark:text-neutral-300",children:"Eigene Nachricht (optional)"}),a.jsx("textarea",{rows:2,value:e[f.key].message,onChange:b=>d(f.key,"message",b.target.value),placeholder:"z. B. Wir aktualisieren gerade unser Angebot. Schau bald wieder vorbei!",className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm dark:border-neutral-700 dark:bg-neutral-900"})]},f.key)),u&&a.jsx("p",{className:"text-sm text-red-600",children:u}),l&&a.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:"Gespeichert."}),a.jsx("button",{type:"submit",disabled:s,className:"rounded-md bg-brand-500 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-600 disabled:opacity-50",children:s?"Speichere…":"Speichern"})]})}function X4(){const[e,t]=g.useState(!1),[n,r]=g.useState(""),[s,i]=g.useState(!1),[l,o]=g.useState(""),[u,c]=g.useState(!1),[d,h]=g.useState(""),[m,f]=g.useState(!1),[b,y]=g.useState(""),[w,x]=g.useState(!1),[p,v]=g.useState(""),k=async()=>{if(confirm("Alle aktuellen Leistungen werden gelöscht und durch die 8 Standard-Leistungen ersetzt. Fortfahren?")){t(!0),r("");try{const M=await A.post("/settings/reset-services",{});r(`${M.count} Standard-Leistungen wiederhergestellt.`)}catch(M){r("Fehler: "+M.message)}finally{t(!1)}}},j=async()=>{if(confirm("Alle aktuellen FAQ-Einträge werden gelöscht und durch die 6 Standard-Fragen ersetzt. Fortfahren?")){i(!0),o("");try{const M=await A.post("/settings/reset-faqs",{});o(`${M.count} Standard-Fragen wiederhergestellt.`)}catch(M){o("Fehler: "+M.message)}finally{i(!1)}}},C=async()=>{if(confirm("Die komplette Bildergalerie wird gelöscht und durch die 13 Marken/29 Projekte/207 Fotos der alten hifi-planet.de-Seite ersetzt. Fortfahren?")){c(!0),h("");try{const M=await A.post("/settings/reset-gallery",{});h(`${M.photos} Fotos wiederhergestellt.`)}catch(M){h("Fehler: "+M.message)}finally{c(!1)}}},S=async()=>{if(confirm("Alle Marken, Modelle, Pakete, Produkte und Upgrades werden unwiderruflich gelöscht. Leistungen und Kontaktanfragen bleiben erhalten. Fortfahren?")){f(!0),y("");try{const M=await A.post("/settings/reset-catalog",{});y(`Fahrzeugkatalog geleert (${M.brands_removed} Marken entfernt).`)}catch(M){y("Fehler: "+M.message)}finally{f(!1)}}},P=async()=>{if(confirm("WIRKLICH ALLES zurücksetzen? Marken, Modelle, Pakete, Produkte und Upgrades werden gelöscht, Leistungen, FAQs und die Bildergalerie auf Standard zurückgesetzt. Kontaktanfragen und Benutzerkonten bleiben erhalten. Das kann nicht rückgängig gemacht werden!")){x(!0),v("");try{const M=await A.post("/settings/reset-all",{});v(`Erledigt: ${M.brands_removed} Marken entfernt, ${M.services_reset} Standard-Leistungen, ${M.faqs_reset} Standard-Fragen und ${M.gallery_photos_reset} Galerie-Fotos wiederhergestellt.`)}catch(M){v("Fehler: "+M.message)}finally{x(!1)}}};return a.jsxs("div",{className:"max-w-2xl space-y-6",children:[a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Nur Leistungen zurücksetzen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Löscht alle aktuellen Leistungen-Karten und stellt die 8 mitgelieferten Standard-Leistungen wieder her. Marken, Modelle und Pakete bleiben unangetastet."}),a.jsx("button",{onClick:k,disabled:e,className:"rounded-md border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:hover:bg-red-900/20",children:e?"Setze zurück…":"Leistungen auf Standard zurücksetzen"}),n&&a.jsx("p",{className:"mt-3 text-sm text-neutral-600 dark:text-neutral-300",children:n})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Nur FAQs zurücksetzen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Löscht alle aktuellen Fragen und stellt die 6 mitgelieferten Standard-Fragen (Deutsch & Englisch) wieder her. Leistungen, Marken, Modelle und Pakete bleiben unangetastet."}),a.jsx("button",{onClick:j,disabled:s,className:"rounded-md border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:hover:bg-red-900/20",children:s?"Setze zurück…":"FAQs auf Standard zurücksetzen"}),l&&a.jsx("p",{className:"mt-3 text-sm text-neutral-600 dark:text-neutral-300",children:l})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Nur Bildergalerie zurücksetzen"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Löscht alle aktuellen Galerie-Marken, -Projekte und -Fotos und stellt die komplette Galerie der alten hifi-planet.de-Seite wieder her (13 Marken, 29 Projekte, 207 Fotos). Fahrzeugkatalog, Leistungen und FAQs bleiben unangetastet."}),a.jsx("button",{onClick:C,disabled:u,className:"rounded-md border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:hover:bg-red-900/20",children:u?"Setze zurück…":"Galerie auf Standard zurücksetzen"}),d&&a.jsx("p",{className:"mt-3 text-sm text-neutral-600 dark:text-neutral-300",children:d})]}),a.jsxs("section",{className:"rounded-xl border border-neutral-200 bg-white p-6 dark:border-neutral-800 dark:bg-neutral-900",children:[a.jsx("h2",{className:"mb-1 font-semibold text-neutral-900 dark:text-white",children:"Nur Fahrzeugkatalog leeren"}),a.jsx("p",{className:"mb-4 text-sm text-neutral-500 dark:text-neutral-400",children:"Löscht alle Marken, Modelle, Pakete, Produkte und Upgrades unwiderruflich. Leistungen, Kontaktanfragen und Benutzerkonten bleiben erhalten."}),a.jsx("button",{onClick:S,disabled:m,className:"rounded-md border border-red-300 px-4 py-2 text-sm font-semibold text-red-600 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:hover:bg-red-900/20",children:m?"Leere…":"Fahrzeugkatalog leeren"}),b&&a.jsx("p",{className:"mt-3 text-sm text-neutral-600 dark:text-neutral-300",children:b})]}),a.jsxs("section",{className:"rounded-xl border border-red-300 bg-red-50/40 p-6 dark:border-red-900 dark:bg-red-900/10",children:[a.jsx("h2",{className:"mb-1 font-semibold text-red-700 dark:text-red-300",children:"Alles zurücksetzen"}),a.jsxs("p",{className:"mb-4 text-sm text-neutral-600 dark:text-neutral-300",children:["Kombiniert alles: Fahrzeugkatalog wird komplett geleert ",a.jsx("strong",{children:"und"})," Leistungen, FAQs sowie die Bildergalerie werden auf Standard zurückgesetzt. Kontaktanfragen und Benutzerkonten bleiben erhalten. Nicht rückgängig zu machen."]}),a.jsx("button",{onClick:P,disabled:w,className:"rounded-md bg-red-600 px-4 py-2 text-sm font-semibold text-white hover:bg-red-700 disabled:opacity-50",children:w?"Setze zurück…":"Wirklich alles zurücksetzen"}),p&&a.jsx("p",{className:"mt-3 text-sm text-neutral-700 dark:text-neutral-300",children:p})]})]})}function Z4(){return a.jsxs(a.Fragment,{children:[a.jsx(cw,{}),a.jsx(mw,{}),a.jsx(fw,{children:a.jsxs(qk,{children:[a.jsx(K,{path:"/setup",element:a.jsx(mP,{})}),a.jsxs(K,{element:a.jsx(mC,{}),children:[a.jsx(K,{path:"/",element:a.jsx(DC,{})}),a.jsx(K,{path:"/fahrzeuge",element:a.jsx(BC,{})}),a.jsx(K,{path:"/fahrzeuge/:brandSlug",element:a.jsx(zC,{})}),a.jsx(K,{path:"/fahrzeuge/:brandSlug/:modelSlug",element:a.jsx(XC,{})}),a.jsx(K,{path:"/galerie",element:a.jsx(ZC,{})}),a.jsx(K,{path:"/galerie/:brandSlug",element:a.jsx(QC,{})}),a.jsx(K,{path:"/galerie/:brandSlug/:projectSlug",element:a.jsx(eP,{})}),a.jsx(K,{path:"/leistungen",element:a.jsx(tP,{})}),a.jsx(K,{path:"/kontakt",element:a.jsx(lP,{})}),a.jsx(K,{path:"/impressum",element:a.jsx(oP,{})}),a.jsx(K,{path:"/datenschutz",element:a.jsx(uP,{})}),a.jsx(K,{path:"/agb",element:a.jsx(cP,{})})]}),a.jsx(K,{path:"/admin/login",element:a.jsx(fP,{})}),a.jsx(K,{path:"/admin",element:a.jsx(xC,{}),children:a.jsxs(K,{element:a.jsx(gC,{}),children:[a.jsx(K,{index:!0,element:a.jsx(bP,{})}),a.jsx(K,{path:"account",element:a.jsx(_4,{})}),a.jsx(K,{path:"brands",element:a.jsx(Ve,{permission:"brands.manage",children:a.jsx(vP,{})})}),a.jsx(K,{path:"models",element:a.jsx(Ve,{permission:"models.manage",children:a.jsx(yP,{})})}),a.jsx(K,{path:"gallery-brands",element:a.jsx(Ve,{permission:"gallery.manage",children:a.jsx(kP,{})})}),a.jsx(K,{path:"gallery-projects",element:a.jsx(Ve,{permission:"gallery.manage",children:a.jsx(wP,{})})}),a.jsx(K,{path:"gallery-projects/:projectId/photos",element:a.jsx(Ve,{permission:"gallery.manage",children:a.jsx(jP,{})})}),a.jsx(K,{path:"packages",element:a.jsx(Ve,{permission:"packages.manage",children:a.jsx(TP,{})})}),a.jsx(K,{path:"packages/:packageId/products",element:a.jsx(Ve,{permission:"packages.manage",children:a.jsx(RP,{})})}),a.jsx(K,{path:"packages/:packageId/upgrades",element:a.jsx(Ve,{permission:"packages.manage",children:a.jsx(FP,{})})}),a.jsx(K,{path:"services",element:a.jsx(Ve,{permission:"services.manage",children:a.jsx(LP,{})})}),a.jsx(K,{path:"faqs",element:a.jsx(Ve,{permission:"content.manage",children:a.jsx(DP,{})})}),a.jsx(K,{path:"contact-requests",element:a.jsx(Ve,{permission:"contact.manage",children:a.jsx(HP,{})})}),a.jsx(K,{path:"users",element:a.jsx(Ve,{permission:"users.manage",children:a.jsx(D4,{})})}),a.jsx(K,{path:"permission-groups",element:a.jsx(Ve,{permission:"permission_groups.manage",children:a.jsx(B4,{})})}),a.jsxs(K,{path:"settings",element:a.jsx(Ve,{permission:"settings.manage",children:a.jsx(R4,{})}),children:[a.jsx(K,{index:!0,element:a.jsx(Gs,{to:"website",replace:!0})}),a.jsx(K,{path:"website",element:a.jsx(O4,{})}),a.jsx(K,{path:"email",element:a.jsx(H4,{})}),a.jsx(K,{path:"database",element:a.jsx($4,{})}),a.jsx(K,{path:"export-import",element:a.jsx(K4,{})}),a.jsx(K,{path:"maintenance",element:a.jsx(Y4,{})}),a.jsx(K,{path:"reset",element:a.jsx(X4,{})})]})]})})]})})]})}So.createRoot(document.getElementById("root")).render(a.jsx(Gb.StrictMode,{children:a.jsx(rw,{basename:"/".replace(/\/$/,"")||"/",children:a.jsx(gw,{children:a.jsx(kw,{children:a.jsx(Tw,{children:a.jsx(Z4,{})})})})})})); diff --git a/hifi/index.html b/hifi/index.html index b5bc698..60848ae 100644 --- a/hifi/index.html +++ b/hifi/index.html @@ -43,7 +43,7 @@ "sameAs": ["https://www.youtube.com/@hifiplanet2812"] } - +