diff --git a/dist/assets/AdminDashboardView-JnGO4r61.js b/dist/assets/AdminDashboardView-DT-HY3B4.js similarity index 98% rename from dist/assets/AdminDashboardView-JnGO4r61.js rename to dist/assets/AdminDashboardView-DT-HY3B4.js index 193efed..434956f 100644 --- a/dist/assets/AdminDashboardView-JnGO4r61.js +++ b/dist/assets/AdminDashboardView-DT-HY3B4.js @@ -1 +1 @@ -import{d as $,q as F,m as g,c as o,a as t,i as I,j as P,t as a,b as C,s as T,v as R,F as S,x as B,e as D,f as q,r,l as K,o as l,p as A,n as W}from"./index-CWxNv9Fc.js";const Z={class:"min-h-screen bg-gray-100 dark:bg-gray-900"},G={class:"bg-white dark:bg-gray-800 shadow"},H={class:"max-w-7xl mx-auto px-4 py-4 flex items-center justify-between"},J={class:"max-w-7xl mx-auto px-4 py-8"},Q={key:0,class:"text-center py-12"},X={key:1,class:"card bg-red-50 text-red-700 text-center"},Y={key:2,class:"space-y-6"},tt={class:"grid grid-cols-1 md:grid-cols-4 gap-4"},et={class:"card"},st={class:"text-3xl font-bold text-primary-600"},at={class:"card"},nt={class:"text-3xl font-bold text-green-600"},ot={class:"card"},lt={class:"text-3xl font-bold text-blue-600"},rt={class:"card"},it={class:"text-3xl font-bold text-purple-600"},dt={class:"card"},ct={class:"flex gap-4"},ut=["disabled"],gt={class:"card"},xt={class:"overflow-x-auto"},vt={class:"w-full"},mt={class:"divide-y dark:divide-gray-700"},yt={class:"py-3 font-medium text-gray-900 dark:text-white"},_t={class:"py-3 text-gray-500"},pt={class:"py-3"},ft={class:"py-3 text-gray-500"},bt={class:"py-3 text-gray-500"},ht={class:"py-3 text-gray-500"},kt={class:"py-3"},wt=["onClick"],zt={key:0,class:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"},Ct={class:"bg-white dark:bg-gray-800 rounded-xl shadow-xl max-w-2xl w-full max-h-[80vh] overflow-y-auto"},St={class:"p-6"},Bt={class:"flex items-center justify-between mb-6"},Dt={class:"text-xl font-bold text-gray-900 dark:text-white"},At={key:0,class:"space-y-6"},Et={class:"grid grid-cols-3 gap-4"},Ot={class:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 text-center"},Ut={class:"text-2xl font-bold"},Vt={class:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 text-center"},Lt={class:"text-2xl font-bold"},Nt={class:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 text-center"},jt={class:"text-2xl font-bold"},Mt={class:"space-y-2"},$t={class:"font-medium text-gray-900 dark:text-white"},Ft={key:0,class:"text-red-500 text-sm"},It={class:"text-sm text-gray-500"},Pt=["onClick"],Tt={key:1,class:"text-center py-8 text-gray-500"},Wt=$({__name:"AdminDashboardView",setup(Rt){const E=q(),v=r(!0),c=r(""),u=r({org_count:0,user_count:0,order_count:0,timesheet_count:0}),p=r([]),f=r(null),i=r(null),m=r(!1),d=r(""),y=r("info"),x=r(!1);F(async()=>{await O()});async function O(){v.value=!0,c.value="";try{const[n,e]=await Promise.all([g.get("/admin/dashboard"),g.get("/admin/organizations")]);u.value=n.data.stats,p.value=e.data.organizations}catch(n){c.value=n instanceof Error?n.message:"Laden fehlgeschlagen",c.value.includes("Super-Admin")&&E.push("/")}finally{v.value=!1}}async function U(n){f.value=n,m.value=!0;try{const e=await g.get(`/admin/organizations/${n.id}`);i.value=e.data}catch(e){console.error("Load org details failed:",e)}}async function V(n){if(confirm("Als dieser User einloggen?"))try{const e=await g.post(`/admin/impersonate/${n}`);localStorage.setItem("accessToken",e.data.token),localStorage.setItem("impersonating","true"),window.location.href="/"}catch(e){alert("Impersonation fehlgeschlagen: "+(e instanceof Error?e.message:"Unbekannter Fehler"))}}async function L(){if(d.value.trim()&&confirm("Nachricht an alle Organisationen senden?")){x.value=!0;try{await g.post("/admin/broadcast",{message:d.value,type:y.value}),alert("Broadcast gesendet!"),d.value=""}catch(n){alert("Fehler: "+(n instanceof Error?n.message:"Unbekannt"))}finally{x.value=!1}}}function N(n){return new Date(n).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})}function j(n){const e={free:"badge bg-gray-100 text-gray-800",starter:"badge bg-blue-100 text-blue-800",business:"badge bg-purple-100 text-purple-800",enterprise:"badge bg-yellow-100 text-yellow-800"};return e[n]||e.free}return(n,e)=>{var b,h,k,w;const M=K("router-link");return l(),o("div",Z,[t("header",G,[t("div",H,[e[4]||(e[4]=t("div",{class:"flex items-center gap-3"},[t("span",{class:"text-2xl"},"🛡️"),t("h1",{class:"text-xl font-bold text-gray-900 dark:text-white"}," SeCu Admin Panel ")],-1)),I(M,{to:"/",class:"btn btn-secondary text-sm"},{default:P(()=>[...e[3]||(e[3]=[A(" ← Zurück zur App ",-1)])]),_:1})])]),t("main",J,[v.value?(l(),o("div",Q,[...e[5]||(e[5]=[t("p",{class:"text-gray-500"},"Lädt...",-1)])])):c.value?(l(),o("div",X,a(c.value),1)):(l(),o("div",Y,[t("div",tt,[t("div",et,[t("div",st,a(u.value.org_count),1),e[6]||(e[6]=t("div",{class:"text-sm text-gray-500"},"Organisationen",-1))]),t("div",at,[t("div",nt,a(u.value.user_count),1),e[7]||(e[7]=t("div",{class:"text-sm text-gray-500"},"Benutzer",-1))]),t("div",ot,[t("div",lt,a(u.value.order_count),1),e[8]||(e[8]=t("div",{class:"text-sm text-gray-500"},"Aufträge",-1))]),t("div",rt,[t("div",it,a(u.value.timesheet_count),1),e[9]||(e[9]=t("div",{class:"text-sm text-gray-500"},"Stundenzettel",-1))])]),t("div",dt,[e[11]||(e[11]=t("h2",{class:"text-lg font-semibold text-gray-900 dark:text-white mb-4"}," 📢 Broadcast an alle Kunden ",-1)),t("div",ct,[C(t("select",{"onUpdate:modelValue":e[0]||(e[0]=s=>y.value=s),class:"input w-32"},[...e[10]||(e[10]=[t("option",{value:"info"},"Info",-1),t("option",{value:"warning"},"Warnung",-1),t("option",{value:"success"},"Erfolg",-1)])],512),[[T,y.value]]),C(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>d.value=s),type:"text",class:"input flex-1",placeholder:"Nachricht eingeben..."},null,512),[[R,d.value]]),t("button",{onClick:L,disabled:x.value||!d.value.trim(),class:"btn btn-primary"},a(x.value?"Sendet...":"Senden"),9,ut)])]),t("div",gt,[e[13]||(e[13]=t("h2",{class:"text-lg font-semibold text-gray-900 dark:text-white mb-4"}," 🏢 Organisationen ",-1)),t("div",xt,[t("table",vt,[e[12]||(e[12]=t("thead",{class:"text-left text-sm text-gray-500 border-b dark:border-gray-700"},[t("tr",null,[t("th",{class:"pb-3 font-medium"},"Organisation"),t("th",{class:"pb-3 font-medium"},"Slug"),t("th",{class:"pb-3 font-medium"},"Plan"),t("th",{class:"pb-3 font-medium"},"Users"),t("th",{class:"pb-3 font-medium"},"Aufträge"),t("th",{class:"pb-3 font-medium"},"Erstellt"),t("th",{class:"pb-3 font-medium"})])],-1)),t("tbody",mt,[(l(!0),o(S,null,B(p.value,s=>{var _,z;return l(),o("tr",{key:s.id,class:"hover:bg-gray-50 dark:hover:bg-gray-800"},[t("td",yt,a(s.name),1),t("td",_t,a(s.slug),1),t("td",pt,[t("span",{class:W(j(((_=s.settings)==null?void 0:_.plan)||"free"))},a(((z=s.settings)==null?void 0:z.plan)||"free"),3)]),t("td",ft,a(s.user_count),1),t("td",bt,a(s.order_count),1),t("td",ht,a(N(s.created_at)),1),t("td",kt,[t("button",{onClick:qt=>U(s),class:"text-primary-600 hover:text-primary-800 text-sm"}," Details → ",8,wt)])])}),128))])])])])]))]),m.value?(l(),o("div",zt,[t("div",Ct,[t("div",St,[t("div",Bt,[t("h2",Dt,a((b=f.value)==null?void 0:b.name),1),t("button",{onClick:e[2]||(e[2]=s=>m.value=!1),class:"text-gray-400 hover:text-gray-600"}," ✕ ")]),i.value?(l(),o("div",At,[t("div",Et,[t("div",Ot,[t("div",Ut,a(((h=i.value.users)==null?void 0:h.length)||0),1),e[14]||(e[14]=t("div",{class:"text-sm text-gray-500"},"Benutzer",-1))]),t("div",Vt,[t("div",Lt,a(((k=i.value.stats)==null?void 0:k.order_count)||0),1),e[15]||(e[15]=t("div",{class:"text-sm text-gray-500"},"Aufträge",-1))]),t("div",Nt,[t("div",jt,a(((w=i.value.stats)==null?void 0:w.timesheet_count)||0),1),e[16]||(e[16]=t("div",{class:"text-sm text-gray-500"},"Stundenzettel",-1))])]),t("div",null,[e[17]||(e[17]=t("h3",{class:"font-semibold text-gray-900 dark:text-white mb-3"},"Benutzer",-1)),t("div",Mt,[(l(!0),o(S,null,B(i.value.users,s=>(l(),o("div",{key:s.id,class:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-700 rounded-lg"},[t("div",null,[t("div",$t,[A(a(s.first_name)+" "+a(s.last_name)+" ",1),s.active?D("",!0):(l(),o("span",Ft,"(inaktiv)"))]),t("div",It,a(s.email)+" • "+a(s.role),1)]),t("button",{onClick:_=>V(s.id),class:"text-sm text-primary-600 hover:text-primary-800"}," Als User einloggen ",8,Pt)]))),128))])])])):(l(),o("div",Tt," Lädt... "))])])])):D("",!0)])}}});export{Wt as default}; +import{d as $,q as F,m as g,c as o,a as t,i as I,j as P,t as a,b as C,s as T,v as R,F as S,x as B,e as D,f as q,r,l as K,p as A,o as l,n as W}from"./index-CgM2qJ96.js";const Z={class:"min-h-screen bg-gray-100 dark:bg-gray-900"},G={class:"bg-white dark:bg-gray-800 shadow"},H={class:"max-w-7xl mx-auto px-4 py-4 flex items-center justify-between"},J={class:"max-w-7xl mx-auto px-4 py-8"},Q={key:0,class:"text-center py-12"},X={key:1,class:"card bg-red-50 text-red-700 text-center"},Y={key:2,class:"space-y-6"},tt={class:"grid grid-cols-1 md:grid-cols-4 gap-4"},et={class:"card"},st={class:"text-3xl font-bold text-primary-600"},at={class:"card"},nt={class:"text-3xl font-bold text-green-600"},ot={class:"card"},lt={class:"text-3xl font-bold text-blue-600"},rt={class:"card"},it={class:"text-3xl font-bold text-purple-600"},dt={class:"card"},ct={class:"flex gap-4"},ut=["disabled"],gt={class:"card"},xt={class:"overflow-x-auto"},vt={class:"w-full"},mt={class:"divide-y dark:divide-gray-700"},yt={class:"py-3 font-medium text-gray-900 dark:text-white"},_t={class:"py-3 text-gray-500"},pt={class:"py-3"},ft={class:"py-3 text-gray-500"},bt={class:"py-3 text-gray-500"},ht={class:"py-3 text-gray-500"},kt={class:"py-3"},wt=["onClick"],zt={key:0,class:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"},Ct={class:"bg-white dark:bg-gray-800 rounded-xl shadow-xl max-w-2xl w-full max-h-[80vh] overflow-y-auto"},St={class:"p-6"},Bt={class:"flex items-center justify-between mb-6"},Dt={class:"text-xl font-bold text-gray-900 dark:text-white"},At={key:0,class:"space-y-6"},Et={class:"grid grid-cols-3 gap-4"},Ot={class:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 text-center"},Ut={class:"text-2xl font-bold"},Vt={class:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 text-center"},Lt={class:"text-2xl font-bold"},Nt={class:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 text-center"},jt={class:"text-2xl font-bold"},Mt={class:"space-y-2"},$t={class:"font-medium text-gray-900 dark:text-white"},Ft={key:0,class:"text-red-500 text-sm"},It={class:"text-sm text-gray-500"},Pt=["onClick"],Tt={key:1,class:"text-center py-8 text-gray-500"},Wt=$({__name:"AdminDashboardView",setup(Rt){const E=q(),v=r(!0),c=r(""),u=r({org_count:0,user_count:0,order_count:0,timesheet_count:0}),p=r([]),f=r(null),i=r(null),m=r(!1),d=r(""),y=r("info"),x=r(!1);F(async()=>{await O()});async function O(){v.value=!0,c.value="";try{const[n,e]=await Promise.all([g.get("/admin/dashboard"),g.get("/admin/organizations")]);u.value=n.data.stats,p.value=e.data.organizations}catch(n){c.value=n instanceof Error?n.message:"Laden fehlgeschlagen",c.value.includes("Super-Admin")&&E.push("/")}finally{v.value=!1}}async function U(n){f.value=n,m.value=!0;try{const e=await g.get(`/admin/organizations/${n.id}`);i.value=e.data}catch(e){console.error("Load org details failed:",e)}}async function V(n){if(confirm("Als dieser User einloggen?"))try{const e=await g.post(`/admin/impersonate/${n}`);localStorage.setItem("accessToken",e.data.token),localStorage.setItem("impersonating","true"),window.location.href="/"}catch(e){alert("Impersonation fehlgeschlagen: "+(e instanceof Error?e.message:"Unbekannter Fehler"))}}async function L(){if(d.value.trim()&&confirm("Nachricht an alle Organisationen senden?")){x.value=!0;try{await g.post("/admin/broadcast",{message:d.value,type:y.value}),alert("Broadcast gesendet!"),d.value=""}catch(n){alert("Fehler: "+(n instanceof Error?n.message:"Unbekannt"))}finally{x.value=!1}}}function N(n){return new Date(n).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})}function j(n){const e={free:"badge bg-gray-100 text-gray-800",starter:"badge bg-blue-100 text-blue-800",business:"badge bg-purple-100 text-purple-800",enterprise:"badge bg-yellow-100 text-yellow-800"};return e[n]||e.free}return(n,e)=>{var b,h,k,w;const M=K("router-link");return l(),o("div",Z,[t("header",G,[t("div",H,[e[4]||(e[4]=t("div",{class:"flex items-center gap-3"},[t("span",{class:"text-2xl"},"🛡️"),t("h1",{class:"text-xl font-bold text-gray-900 dark:text-white"}," SeCu Admin Panel ")],-1)),I(M,{to:"/",class:"btn btn-secondary text-sm"},{default:P(()=>[...e[3]||(e[3]=[A(" ← Zurück zur App ",-1)])]),_:1})])]),t("main",J,[v.value?(l(),o("div",Q,[...e[5]||(e[5]=[t("p",{class:"text-gray-500"},"Lädt...",-1)])])):c.value?(l(),o("div",X,a(c.value),1)):(l(),o("div",Y,[t("div",tt,[t("div",et,[t("div",st,a(u.value.org_count),1),e[6]||(e[6]=t("div",{class:"text-sm text-gray-500"},"Organisationen",-1))]),t("div",at,[t("div",nt,a(u.value.user_count),1),e[7]||(e[7]=t("div",{class:"text-sm text-gray-500"},"Benutzer",-1))]),t("div",ot,[t("div",lt,a(u.value.order_count),1),e[8]||(e[8]=t("div",{class:"text-sm text-gray-500"},"Aufträge",-1))]),t("div",rt,[t("div",it,a(u.value.timesheet_count),1),e[9]||(e[9]=t("div",{class:"text-sm text-gray-500"},"Stundenzettel",-1))])]),t("div",dt,[e[11]||(e[11]=t("h2",{class:"text-lg font-semibold text-gray-900 dark:text-white mb-4"}," 📢 Broadcast an alle Kunden ",-1)),t("div",ct,[C(t("select",{"onUpdate:modelValue":e[0]||(e[0]=s=>y.value=s),class:"input w-32"},[...e[10]||(e[10]=[t("option",{value:"info"},"Info",-1),t("option",{value:"warning"},"Warnung",-1),t("option",{value:"success"},"Erfolg",-1)])],512),[[T,y.value]]),C(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>d.value=s),type:"text",class:"input flex-1",placeholder:"Nachricht eingeben..."},null,512),[[R,d.value]]),t("button",{onClick:L,disabled:x.value||!d.value.trim(),class:"btn btn-primary"},a(x.value?"Sendet...":"Senden"),9,ut)])]),t("div",gt,[e[13]||(e[13]=t("h2",{class:"text-lg font-semibold text-gray-900 dark:text-white mb-4"}," 🏢 Organisationen ",-1)),t("div",xt,[t("table",vt,[e[12]||(e[12]=t("thead",{class:"text-left text-sm text-gray-500 border-b dark:border-gray-700"},[t("tr",null,[t("th",{class:"pb-3 font-medium"},"Organisation"),t("th",{class:"pb-3 font-medium"},"Slug"),t("th",{class:"pb-3 font-medium"},"Plan"),t("th",{class:"pb-3 font-medium"},"Users"),t("th",{class:"pb-3 font-medium"},"Aufträge"),t("th",{class:"pb-3 font-medium"},"Erstellt"),t("th",{class:"pb-3 font-medium"})])],-1)),t("tbody",mt,[(l(!0),o(S,null,B(p.value,s=>{var _,z;return l(),o("tr",{key:s.id,class:"hover:bg-gray-50 dark:hover:bg-gray-800"},[t("td",yt,a(s.name),1),t("td",_t,a(s.slug),1),t("td",pt,[t("span",{class:W(j(((_=s.settings)==null?void 0:_.plan)||"free"))},a(((z=s.settings)==null?void 0:z.plan)||"free"),3)]),t("td",ft,a(s.user_count),1),t("td",bt,a(s.order_count),1),t("td",ht,a(N(s.created_at)),1),t("td",kt,[t("button",{onClick:qt=>U(s),class:"text-primary-600 hover:text-primary-800 text-sm"}," Details → ",8,wt)])])}),128))])])])])]))]),m.value?(l(),o("div",zt,[t("div",Ct,[t("div",St,[t("div",Bt,[t("h2",Dt,a((b=f.value)==null?void 0:b.name),1),t("button",{onClick:e[2]||(e[2]=s=>m.value=!1),class:"text-gray-400 hover:text-gray-600"}," ✕ ")]),i.value?(l(),o("div",At,[t("div",Et,[t("div",Ot,[t("div",Ut,a(((h=i.value.users)==null?void 0:h.length)||0),1),e[14]||(e[14]=t("div",{class:"text-sm text-gray-500"},"Benutzer",-1))]),t("div",Vt,[t("div",Lt,a(((k=i.value.stats)==null?void 0:k.order_count)||0),1),e[15]||(e[15]=t("div",{class:"text-sm text-gray-500"},"Aufträge",-1))]),t("div",Nt,[t("div",jt,a(((w=i.value.stats)==null?void 0:w.timesheet_count)||0),1),e[16]||(e[16]=t("div",{class:"text-sm text-gray-500"},"Stundenzettel",-1))])]),t("div",null,[e[17]||(e[17]=t("h3",{class:"font-semibold text-gray-900 dark:text-white mb-3"},"Benutzer",-1)),t("div",Mt,[(l(!0),o(S,null,B(i.value.users,s=>(l(),o("div",{key:s.id,class:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-700 rounded-lg"},[t("div",null,[t("div",$t,[A(a(s.first_name)+" "+a(s.last_name)+" ",1),s.active?D("",!0):(l(),o("span",Ft,"(inaktiv)"))]),t("div",It,a(s.email)+" • "+a(s.role),1)]),t("button",{onClick:_=>V(s.id),class:"text-sm text-primary-600 hover:text-primary-800"}," Als User einloggen ",8,Pt)]))),128))])])])):(l(),o("div",Tt," Lädt... "))])])])):D("",!0)])}}});export{Wt as default}; diff --git a/dist/assets/AppLayout-AMYs4jcG.js b/dist/assets/AppLayout-AMYs4jcG.js deleted file mode 100644 index 4e68d30..0000000 --- a/dist/assets/AppLayout-AMYs4jcG.js +++ /dev/null @@ -1 +0,0 @@ -import{d as v,u as _,c as g,n as w,a as t,F as M,x as z,t as n,y as i,k as A,o as d,z as j,j as C,l as $,g as L,r as k,i as y,e as S,p as N,f as V}from"./index-CWxNv9Fc.js";const B={class:"mt-6 px-3"},E={class:"text-xl"},D={class:"font-medium"},F={class:"absolute bottom-0 left-0 right-0 p-4 border-t border-gray-200 dark:border-gray-700"},O={class:"flex items-center gap-3"},R={class:"w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-900 flex items-center justify-center"},H={class:"text-primary-600 dark:text-primary-300 font-medium"},I={class:"flex-1 min-w-0"},T={class:"text-sm font-medium text-gray-900 dark:text-white truncate"},U={class:"text-xs text-gray-500 dark:text-gray-400 capitalize"},q=v({__name:"AppSidebar",props:{open:{type:Boolean}},emits:["close"],setup(x){const o=L(),r=_(),a=A(()=>{const s=[{name:"Dashboard",href:"/",icon:"📊"},{name:"Aufträge",href:"/orders",icon:"📋"}];return r.canManageUsers&&s.push({name:"Mitarbeiter",href:"/users",icon:"👥"},{name:"Schichtplanung",href:"/shifts",icon:"📅"}),s.push({name:"Verfügbarkeit",href:"/availability",icon:"🗓️"},{name:"Stundenzettel",href:"/timesheets",icon:"⏱️"},{name:"Qualifikationen",href:"/qualifications",icon:"🎓"},{name:"Objekte",href:"/objects",icon:"🏢"},{name:"Rundgänge",href:"/patrols",icon:"📍"},{name:"Vorfälle",href:"/incidents",icon:"🚨"},{name:"Dokumente",href:"/documents",icon:"📁"}),r.canManageUsers&&s.push({name:"Fahrzeuge",href:"/vehicles",icon:"🚗"},{name:"Kunden",href:"/customers",icon:"🤝"}),r.isChef&&s.push({name:"Abrechnung",href:"/billing",icon:"💰"},{name:"Module",href:"/modules",icon:"⚙️"}),s.push({name:"Einstellungen",href:"/settings",icon:"🔧"},{name:"Hilfe",href:"/help",icon:"📚"}),s});function c(s){return s==="/"?o.path==="/":o.path.startsWith(s)}return(s,e)=>{var l,p,f,b,u;const m=$("router-link");return d(),g("aside",{class:w(["fixed inset-y-0 left-0 z-50 w-64 bg-white dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700 transform transition-transform lg:translate-x-0",x.open?"translate-x-0":"-translate-x-full"])},[e[1]||(e[1]=t("div",{class:"h-16 flex items-center px-6 border-b border-gray-200 dark:border-gray-700"},[t("span",{class:"text-2xl font-bold text-primary-600"},"🔐 SeCu")],-1)),t("nav",B,[(d(!0),g(M,null,z(a.value,h=>(d(),j(m,{key:h.href,to:h.href,class:w(["flex items-center gap-3 px-3 py-2 rounded-lg mb-1 transition-colors",c(h.href)?"bg-primary-100 text-primary-700 dark:bg-primary-900 dark:text-primary-200":"text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"]),onClick:e[0]||(e[0]=re=>s.$emit("close"))},{default:C(()=>[t("span",E,n(h.icon),1),t("span",D,n(h.name),1)]),_:2},1032,["to","class"]))),128))]),t("div",F,[t("div",O,[t("div",R,[t("span",H,n((p=(l=i(r).user)==null?void 0:l.first_name)==null?void 0:p[0])+n((b=(f=i(r).user)==null?void 0:f.last_name)==null?void 0:b[0]),1)]),t("div",I,[t("p",T,n(i(r).fullName),1),t("p",U,n((u=i(r).user)==null?void 0:u.role),1)])])])],2)}}}),K={class:"h-16 bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between px-4 lg:px-6"},Q={class:"flex items-center gap-2"},W={class:"text-xl"},G={class:"relative"},J={class:"w-8 h-8 rounded-full bg-primary-100 dark:bg-primary-900 flex items-center justify-center"},P={class:"text-primary-600 dark:text-primary-300 text-sm font-medium"},X={class:"hidden sm:block text-sm font-medium text-gray-700 dark:text-gray-200"},Y=v({__name:"AppHeader",emits:["toggle-sidebar","logout"],setup(x){const o=_(),r=k(localStorage.getItem("darkMode")==="true"),a=k(!1);function c(){r.value=!r.value,localStorage.setItem("darkMode",String(r.value)),document.documentElement.classList.toggle("dark",r.value)}return r.value&&document.documentElement.classList.add("dark"),(s,e)=>{var l,p,f,b;const m=$("router-link");return d(),g("header",K,[t("button",{class:"lg:hidden p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700",onClick:e[0]||(e[0]=u=>s.$emit("toggle-sidebar"))},[...e[4]||(e[4]=[t("span",{class:"text-2xl"},"☰",-1)])]),e[7]||(e[7]=t("div",{class:"flex-1 lg:ml-0"},[t("h1",{class:"text-lg font-semibold text-gray-900 dark:text-white hidden lg:block"}," Mitarbeiterverwaltung ")],-1)),t("div",Q,[t("button",{class:"p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700",onClick:c},[t("span",W,n(r.value?"☀️":"🌙"),1)]),t("div",G,[t("button",{class:"flex items-center gap-2 p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700",onClick:e[1]||(e[1]=u=>a.value=!a.value)},[t("div",J,[t("span",P,n((p=(l=i(o).user)==null?void 0:l.first_name)==null?void 0:p[0])+n((b=(f=i(o).user)==null?void 0:f.last_name)==null?void 0:b[0]),1)]),t("span",X,n(i(o).fullName),1)]),a.value?(d(),g("div",{key:0,class:"absolute right-0 mt-2 w-48 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-1 z-50",onClick:e[3]||(e[3]=u=>a.value=!1)},[y(m,{to:"/settings",class:"block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700"},{default:C(()=>[...e[5]||(e[5]=[N(" ⚙️ Einstellungen ",-1)])]),_:1}),e[6]||(e[6]=t("hr",{class:"my-1 border-gray-200 dark:border-gray-700"},null,-1)),t("button",{class:"w-full text-left px-4 py-2 text-sm text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20",onClick:e[2]||(e[2]=u=>s.$emit("logout"))}," 🚪 Abmelden ")])):S("",!0)])])])}}}),Z={class:"min-h-screen bg-gray-50 dark:bg-gray-900"},ee={class:"lg:pl-64"},te={class:"p-6"},ae=v({__name:"AppLayout",setup(x){const o=_(),r=V(),a=k(!1);async function c(){await o.logout(),r.push("/login")}return(s,e)=>{const m=$("router-view");return d(),g("div",Z,[a.value?(d(),g("div",{key:0,class:"fixed inset-0 z-40 bg-black/50 lg:hidden",onClick:e[0]||(e[0]=l=>a.value=!1)})):S("",!0),y(q,{open:a.value,onClose:e[1]||(e[1]=l=>a.value=!1)},null,8,["open"]),t("div",ee,[y(Y,{onToggleSidebar:e[2]||(e[2]=l=>a.value=!a.value),onLogout:c}),t("main",te,[y(m)])])])}}});export{ae as default}; diff --git a/dist/assets/AppLayout-M3P9X3hb.js b/dist/assets/AppLayout-M3P9X3hb.js new file mode 100644 index 0000000..1d72f29 --- /dev/null +++ b/dist/assets/AppLayout-M3P9X3hb.js @@ -0,0 +1 @@ +import{d as w,y as S,u as L,c,n as _,a as e,F as B,x as j,t as o,z as n,k as A,A as E,j as M,l as z,g as N,o as d,w as O,i as f,T,r as k,e as $,S as C,B as V,p as D,f as I}from"./index-CgM2qJ96.js";const R={class:"mt-6 px-3"},U={class:"text-xl"},q={class:"font-medium"},F={class:"absolute bottom-0 left-0 right-0 p-4 border-t border-gray-200 dark:border-gray-700"},P={class:"flex items-center gap-3"},H={class:"w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-900 flex items-center justify-center"},W={class:"text-primary-600 dark:text-primary-300 font-medium"},G={class:"flex-1 min-w-0"},J={class:"text-sm font-medium text-gray-900 dark:text-white truncate"},K={class:"text-xs text-gray-500 dark:text-gray-400 capitalize"},Q=w({__name:"AppSidebar",props:{open:{type:Boolean}},emits:["close"],setup(x){const l=N(),{t}=S(),r=L(),u=A(()=>{const s=[{name:t("nav.dashboard"),href:"/",icon:"📊"},{name:t("nav.orders"),href:"/orders",icon:"📋"}];return r.canManageUsers&&s.push({name:t("nav.users"),href:"/users",icon:"👥"},{name:t("nav.shifts"),href:"/shifts",icon:"📅"}),s.push({name:t("nav.availability"),href:"/availability",icon:"🗓️"},{name:t("nav.timesheets"),href:"/timesheets",icon:"⏱️"},{name:t("nav.qualifications"),href:"/qualifications",icon:"🎓"},{name:t("nav.objects"),href:"/objects",icon:"🏢"},{name:t("nav.patrols"),href:"/patrols",icon:"📍"},{name:t("nav.incidents"),href:"/incidents",icon:"🚨"},{name:t("nav.documents"),href:"/documents",icon:"📁"}),r.canManageUsers&&s.push({name:t("nav.vehicles"),href:"/vehicles",icon:"🚗"},{name:t("nav.customers"),href:"/customers",icon:"🤝"}),r.isChef&&s.push({name:t("nav.billing"),href:"/billing",icon:"💰"},{name:t("nav.modules"),href:"/modules",icon:"⚙️"}),s.push({name:t("nav.settings"),href:"/settings",icon:"🔧"},{name:t("nav.help"),href:"/help",icon:"📚"}),s});function g(s){return s==="/"?l.path==="/":l.path.startsWith(s)}return(s,a)=>{var m,v,h,y,p;const i=z("router-link");return d(),c("aside",{class:_(["fixed inset-y-0 left-0 z-50 w-64 bg-white dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700 transform transition-transform lg:translate-x-0",x.open?"translate-x-0":"-translate-x-full"])},[a[1]||(a[1]=e("div",{class:"h-16 flex items-center px-6 border-b border-gray-200 dark:border-gray-700"},[e("span",{class:"text-2xl font-bold text-primary-600"},"🔐 SeCu")],-1)),e("nav",R,[(d(!0),c(B,null,j(u.value,b=>(d(),E(i,{key:b.href,to:b.href,class:_(["flex items-center gap-3 px-3 py-2 rounded-lg mb-1 transition-colors",g(b.href)?"bg-primary-100 text-primary-700 dark:bg-primary-900 dark:text-primary-200":"text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"]),onClick:a[0]||(a[0]=_e=>s.$emit("close"))},{default:M(()=>[e("span",U,o(b.icon),1),e("span",q,o(b.name),1)]),_:2},1032,["to","class"]))),128))]),e("div",F,[e("div",P,[e("div",H,[e("span",W,o((v=(m=n(r).user)==null?void 0:m.first_name)==null?void 0:v[0])+o((y=(h=n(r).user)==null?void 0:h.last_name)==null?void 0:y[0]),1)]),e("div",G,[e("p",J,o(n(r).fullName),1),e("p",K,o((p=n(r).user)==null?void 0:p.role),1)])])])],2)}}}),X={class:"language-switcher relative"},Y=["title"],Z={class:"text-lg"},ee={class:"text-xs font-medium text-gray-600 dark:text-gray-300 uppercase"},te={key:0,class:"absolute right-0 mt-2 w-44 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-1 z-50"},se=["onClick"],ae={class:"text-lg"},re={class:"flex-1 text-left"},oe={key:0,class:"w-4 h-4 text-primary-600 dark:text-primary-400",fill:"currentColor",viewBox:"0 0 20 20"},ne=w({__name:"LanguageSwitcher",setup(x){const{locale:l}=S(),t=k(!1),r=A(()=>C.find(s=>s.code===l.value)||C[0]);function u(s){V(s),t.value=!1}function g(s){s.target.closest(".language-switcher")||(t.value=!1)}return typeof window<"u"&&document.addEventListener("click",g),(s,a)=>(d(),c("div",X,[e("button",{class:"flex items-center gap-1.5 px-2 py-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors",onClick:a[0]||(a[0]=O(i=>t.value=!t.value,["stop"])),title:s.$t("settings.language")},[e("span",Z,o(r.value.flag),1),e("span",ee,o(r.value.code),1),(d(),c("svg",{class:_(["w-3 h-3 text-gray-500 transition-transform",{"rotate-180":t.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...a[1]||(a[1]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,Y),f(T,{"enter-active-class":"transition ease-out duration-100","enter-from-class":"transform opacity-0 scale-95","enter-to-class":"transform opacity-100 scale-100","leave-active-class":"transition ease-in duration-75","leave-from-class":"transform opacity-100 scale-100","leave-to-class":"transform opacity-0 scale-95"},{default:M(()=>[t.value?(d(),c("div",te,[(d(!0),c(B,null,j(n(C),i=>(d(),c("button",{key:i.code,class:_(["w-full flex items-center gap-3 px-3 py-2 text-sm hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors",{"bg-primary-50 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400":i.code===n(l),"text-gray-700 dark:text-gray-200":i.code!==n(l)}]),onClick:m=>u(i.code)},[e("span",ae,o(i.flag),1),e("span",re,o(i.name),1),i.code===n(l)?(d(),c("svg",oe,[...a[2]||(a[2]=[e("path",{"fill-rule":"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z","clip-rule":"evenodd"},null,-1)])])):$("",!0)],10,se))),128))])):$("",!0)]),_:1})]))}}),le={class:"h-16 bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between px-4 lg:px-6"},ie={class:"flex-1 lg:ml-0"},de={class:"text-lg font-semibold text-gray-900 dark:text-white hidden lg:block"},ce={class:"flex items-center gap-2"},ue=["title"],ge={class:"text-xl"},me={class:"relative"},pe={class:"w-8 h-8 rounded-full bg-primary-100 dark:bg-primary-900 flex items-center justify-center"},fe={class:"text-primary-600 dark:text-primary-300 text-sm font-medium"},ve={class:"hidden sm:block text-sm font-medium text-gray-700 dark:text-gray-200"},he=w({__name:"AppHeader",emits:["toggle-sidebar","logout"],setup(x){const{t:l}=S(),t=L(),r=k(localStorage.getItem("darkMode")==="true"),u=k(!1);function g(){r.value=!r.value,localStorage.setItem("darkMode",String(r.value)),document.documentElement.classList.toggle("dark",r.value)}return r.value&&document.documentElement.classList.add("dark"),(s,a)=>{var m,v,h,y;const i=z("router-link");return d(),c("header",le,[e("button",{class:"lg:hidden p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700",onClick:a[0]||(a[0]=p=>s.$emit("toggle-sidebar"))},[...a[4]||(a[4]=[e("span",{class:"text-2xl"},"☰",-1)])]),e("div",ie,[e("h1",de,o(n(l)("app.title")),1)]),e("div",ce,[f(ne),e("button",{class:"p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700",onClick:g,title:r.value?n(l)("settings.lightMode"):n(l)("settings.darkMode")},[e("span",ge,o(r.value?"☀️":"🌙"),1)],8,ue),e("div",me,[e("button",{class:"flex items-center gap-2 p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700",onClick:a[1]||(a[1]=p=>u.value=!u.value)},[e("div",pe,[e("span",fe,o((v=(m=n(t).user)==null?void 0:m.first_name)==null?void 0:v[0])+o((y=(h=n(t).user)==null?void 0:h.last_name)==null?void 0:y[0]),1)]),e("span",ve,o(n(t).fullName),1)]),u.value?(d(),c("div",{key:0,class:"absolute right-0 mt-2 w-48 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-1 z-50",onClick:a[3]||(a[3]=p=>u.value=!1)},[f(i,{to:"/settings",class:"block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700"},{default:M(()=>[D(" ⚙️ "+o(n(l)("nav.settings")),1)]),_:1}),a[5]||(a[5]=e("hr",{class:"my-1 border-gray-200 dark:border-gray-700"},null,-1)),e("button",{class:"w-full text-left px-4 py-2 text-sm text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20",onClick:a[2]||(a[2]=p=>s.$emit("logout"))}," 🚪 "+o(n(l)("auth.logout")),1)])):$("",!0)])])])}}}),ye={class:"min-h-screen bg-gray-50 dark:bg-gray-900"},be={class:"lg:pl-64"},xe={class:"p-6"},$e=w({__name:"AppLayout",setup(x){const l=L(),t=I(),r=k(!1);async function u(){await l.logout(),t.push("/login")}return(g,s)=>{const a=z("router-view");return d(),c("div",ye,[r.value?(d(),c("div",{key:0,class:"fixed inset-0 z-40 bg-black/50 lg:hidden",onClick:s[0]||(s[0]=i=>r.value=!1)})):$("",!0),f(Q,{open:r.value,onClose:s[1]||(s[1]=i=>r.value=!1)},null,8,["open"]),e("div",be,[f(he,{onToggleSidebar:s[2]||(s[2]=i=>r.value=!r.value),onLogout:u}),e("main",xe,[f(a)])])])}}});export{$e as default}; diff --git a/dist/assets/AvailabilityView-3FfkRQ5Z.js b/dist/assets/AvailabilityView-3FfkRQ5Z.js new file mode 100644 index 0000000..ae0eee1 --- /dev/null +++ b/dist/assets/AvailabilityView-3FfkRQ5Z.js @@ -0,0 +1 @@ +import{d as D,u as S,q as M,m as h,c as l,a as o,t as u,F as C,x as F,C as A,r as v,k as m,n as L,o as i}from"./index-CgM2qJ96.js";const O={class:"space-y-6"},V={class:"card"},E={class:"flex items-center justify-between mb-6"},I={class:"text-lg font-semibold"},W={key:0,class:"text-center py-8 text-gray-500"},Y={key:1,class:"grid grid-cols-7 gap-2"},B={class:"text-xs text-gray-500 mb-1"},N=["onClick"],j=D({__name:"AvailabilityView",setup(T){const f=S(),a=v(new Date),y=v([]),g=v(!0),p=m(()=>{const n=a.value.getFullYear(),e=a.value.getMonth(),t=new Date(n,e+1,0).getDate();return Array.from({length:t},(s,r)=>{const d=new Date(n,e,r+1);return{date:d.toISOString().split("T")[0],dayOfWeek:d.toLocaleDateString("de-DE",{weekday:"short"}),day:r+1,isWeekend:d.getDay()===0||d.getDay()===6}})}),_=m(()=>a.value.toLocaleDateString("de-DE",{month:"long",year:"numeric"}));M(c);async function c(){g.value=!0;const n=a.value.getFullYear(),e=a.value.getMonth(),t=new Date(n,e,1).toISOString().split("T")[0],s=new Date(n,e+1,0).toISOString().split("T")[0];try{const r=await h.get(`/availability?from=${t}&to=${s}`);y.value=r.data.availability}catch(r){console.error(r)}finally{g.value=!1}}function b(n){return y.value.find(e=>{var t;return e.date===n&&e.user_id===((t=f.user)==null?void 0:t.id)})}async function k(n){const e=b(n),t=!(e!=null&&e.available);try{await h.post("/availability",{date:n,available:t}),await c()}catch(s){alert(s instanceof Error?s.message:"Fehler")}}function x(){a.value=new Date(a.value.getFullYear(),a.value.getMonth()-1),c()}function w(){a.value=new Date(a.value.getFullYear(),a.value.getMonth()+1),c()}return(n,e)=>(i(),l("div",O,[e[1]||(e[1]=o("h1",{class:"text-2xl font-bold text-gray-900 dark:text-white"},"📅 Verfügbarkeit",-1)),o("div",V,[o("div",E,[o("button",{class:"btn btn-secondary",onClick:x},"←"),o("h2",I,u(_.value),1),o("button",{class:"btn btn-secondary",onClick:w},"→")]),g.value?(i(),l("div",W,"Lädt...")):(i(),l("div",Y,[(i(!0),l(C,null,F(p.value,t=>{var s;return i(),l("div",{key:t.date,class:"text-center"},[o("div",B,u(t.dayOfWeek),1),o("button",{class:L(["w-10 h-10 rounded-lg font-medium transition-colors",t.isWeekend?"bg-gray-100 dark:bg-gray-700":"",(s=b(t.date))!=null&&s.available?"bg-green-500 text-white hover:bg-green-600":"bg-gray-200 dark:bg-gray-600 hover:bg-gray-300 dark:hover:bg-gray-500"]),onClick:r=>k(t.date)},u(t.day),11,N)])}),128))])),e[0]||(e[0]=A('
F?Le(a,b,v,!0,!1,P):K(h,p,_,b,v,C,R,x,P)},pt=(a,h,p,_,b,v,C,R,x)=>{let E=0;const F=h.length;let P=a.length-1,k=F-1;for(;E<=P&&E<=k;){const j=a[E],$=h[E]=x?rt(h[E]):Je(h[E]);if(Jt(j,$))S(j,$,p,null,b,v,C,R,x);else break;E++}for(;E<=P&&E<=k;){const j=a[P],$=h[k]=x?rt(h[k]):Je(h[k]);if(Jt(j,$))S(j,$,p,null,b,v,C,R,x);else break;P--,k--}if(E>P){if(E<=k){const j=k+1,$=j : T extends (...args: infer Arguments) => any ? (...args: Arguments) => ReturnType1){e.push(`${n("plural")}([`),e.indent(r());const s=t.cases.length;for(let i=0;i{const n=ea(t.mode)?t.mode:"normal",r=ea(t.filename)?t.filename:"message.intl";t.sourceMap;const s=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":`
+`,i=t.needIndent?t.needIndent:n!=="arrow",o=e.helpers||[],a=Vh(e,{filename:r,breakLineCode:s,needIndent:i});a.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),a.indent(i),o.length>0&&(a.push(`const { ${gc(o.map(u=>`${u}: _${u}`),", ")} } = ctx`),a.newline()),a.push("return "),Mn(a,e),a.deindent(i),a.push("}"),delete e.helpers;const{code:l,map:c}=a.context();return{ast:e,code:l,map:c?c.toJSON():void 0}};function Kh(e,t={}){const n=pc({},t),r=!!n.jit,s=!!n.minify,i=n.optimize==null?!0:n.optimize,a=Dh(n).parse(e);return r?(i&&Fh(a),s&&Sn(a),{ast:a,code:""}):(xh(a,n),zh(a,n))}/*!
+ * core-base v9.14.5
+ * (c) 2025 kazuya kawaguchi
+ * Released under the MIT License.
+ */function Gh(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(jt().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_JIT_COMPILATION__!="boolean"&&(jt().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(jt().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}function kt(e){return ce(e)&&Ri(e)===0&&(mt(e,"b")||mt(e,"body"))}const _c=["b","body"];function qh(e){return sn(e,_c)}const vc=["c","cases"];function Yh(e){return sn(e,vc,[])}const bc=["s","static"];function Xh(e){return sn(e,bc)}const yc=["i","items"];function Jh(e){return sn(e,yc,[])}const Ec=["t","type"];function Ri(e){return sn(e,Ec)}const Tc=["v","value"];function Sr(e,t){const n=sn(e,Tc);if(n!=null)return n;throw dr(t)}const wc=["m","modifier"];function Qh(e){return sn(e,wc)}const Ac=["k","key"];function Zh(e){const t=sn(e,Ac);if(t)return t;throw dr(6)}function sn(e,t,n){for(let r=0;r