Phase 1 complete - API + Frontend deployed, DB migrated
This commit is contained in:
1
www/fahrschuldesk.de/dist/assets/AuditLogs-rWevo39c.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/AuditLogs-rWevo39c.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as o}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as s,b as t,j as a}from"./index-CeMVzSB6.js";const r={};function d(l,e){return a(),s("div",null,[...e[0]||(e[0]=[t("h1",{class:"text-2xl font-bold mb-6"},"Audit-Log",-1),t("div",{class:"bg-white rounded-xl shadow-sm p-6"},[t("p",{class:"text-slate-500"},"Audit-Log kommt bald...")],-1)])])}const i=o(r,[["render",d]]);export{i as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Branches-s_BK2cgz.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Branches-s_BK2cgz.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as a,b as e,j as l}from"./index-CeMVzSB6.js";const o={};function n(r,t){return l(),a("div",null,[...t[0]||(t[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Filialen",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"Filialen-Verwaltung kommt bald...")],-1)])])}const i=s(o,[["render",n]]);export{i as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Branding-D61QMGtV.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Branding-D61QMGtV.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as t}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as s,b as e,j as a}from"./index-CeMVzSB6.js";const n={};function r(d,o){return a(),s("div",null,[...o[0]||(o[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Branding",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"Branding / Logo-Upload kommt bald...")],-1)])])}const i=t(n,[["render",r]]);export{i as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Calendar-B7rUkOeg.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Calendar-B7rUkOeg.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as a}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as r,b as e,j as s}from"./index-CeMVzSB6.js";const n={};function o(l,t){return s(),r("div",null,[...t[0]||(t[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Kalender",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"Kalender (Integration fahrschultermin.de) kommt bald...")],-1)])])}const m=a(n,[["render",o]]);export{m as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Dashboard-DUl1_Jl9.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Dashboard-DUl1_Jl9.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{p as V,f as x,b as e,g as A,i as d,z as a,h as n,n as m,u as c,F as f,d as u,e as p,t as v,m as b,c as B,s as C,j as l}from"./index-CeMVzSB6.js";const j={class:"min-h-screen bg-slate-100"},M={class:"bg-white border-b border-slate-200 sticky top-0 z-50"},N={class:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"},z={class:"flex items-center justify-between h-16"},L={class:"hidden md:flex items-center gap-1"},P={class:"flex items-center gap-3"},$={class:"text-right hidden sm:block"},D={class:"text-sm font-medium text-slate-800"},F={class:"text-xs text-slate-500"},H={class:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"},K={__name:"Dashboard",setup(S){const y=C(),r=V(),k=B(()=>{var s;return r.isPlatformAdmin?"Plattform-Admin":((s=r.tenant)==null?void 0:s.name)||""});function i(s){return r.isPlatformAdmin,!0}async function w(){r.logout(),y.push("/login")}return(s,t)=>{var g,h;const o=b("router-link"),_=b("router-view");return l(),x("div",j,[e("header",M,[e("div",N,[e("div",z,[t[9]||(t[9]=A('<div class="flex items-center gap-3"><div class="w-9 h-9 rounded-lg bg-primary flex items-center justify-center"><svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7"></path></svg></div><span class="text-lg font-bold text-slate-800">fahrschuldesk</span></div>',1)),e("nav",L,[d(o,{to:"/dashboard",class:m(["px-3 py-2 rounded-lg text-sm font-medium transition-colors",s.$route.path==="/dashboard"?"bg-primary text-white":"text-slate-600 hover:bg-slate-100"])},{default:a(()=>[...t[0]||(t[0]=[n(" Dashboard ",-1)])]),_:1},8,["class"]),c(r).isPlatformAdmin?(l(),x(f,{key:0},[d(o,{to:"/admin/tenants",class:m(["px-3 py-2 rounded-lg text-sm font-medium transition-colors",s.$route.path.startsWith("/admin/tenants")?"bg-primary text-white":"text-slate-600 hover:bg-slate-100"])},{default:a(()=>[...t[1]||(t[1]=[n(" Fahrschulen ",-1)])]),_:1},8,["class"]),d(o,{to:"/admin/invoices",class:m(["px-3 py-2 rounded-lg text-sm font-medium transition-colors",s.$route.path.startsWith("/admin/invoices")?"bg-primary text-white":"text-slate-600 hover:bg-slate-100"])},{default:a(()=>[...t[2]||(t[2]=[n(" Rechnungen ",-1)])]),_:1},8,["class"]),d(o,{to:"/admin/audit-logs",class:m(["px-3 py-2 rounded-lg text-sm font-medium transition-colors",s.$route.path.startsWith("/admin/audit")?"bg-primary text-white":"text-slate-600 hover:bg-slate-100"])},{default:a(()=>[...t[3]||(t[3]=[n(" Audit-Log ",-1)])]),_:1},8,["class"])],64)):(l(),x(f,{key:1},[i()?(l(),u(o,{key:0,to:"/users",class:"px-3 py-2 rounded-lg text-sm font-medium text-slate-600 hover:bg-slate-100 transition-colors"},{default:a(()=>[...t[4]||(t[4]=[n(" Benutzer ",-1)])]),_:1})):p("",!0),i()?(l(),u(o,{key:1,to:"/calendar",class:"px-3 py-2 rounded-lg text-sm font-medium text-slate-600 hover:bg-slate-100 transition-colors"},{default:a(()=>[...t[5]||(t[5]=[n(" Kalender ",-1)])]),_:1})):p("",!0),i()?(l(),u(o,{key:2,to:"/messenger",class:"px-3 py-2 rounded-lg text-sm font-medium text-slate-600 hover:bg-slate-100 transition-colors"},{default:a(()=>[...t[6]||(t[6]=[n(" Messenger ",-1)])]),_:1})):p("",!0),i()||i()?(l(),u(o,{key:3,to:"/learning",class:"px-3 py-2 rounded-lg text-sm font-medium text-slate-600 hover:bg-slate-100 transition-colors"},{default:a(()=>[...t[7]||(t[7]=[n(" Lernsoftware ",-1)])]),_:1})):p("",!0)],64))]),e("div",P,[e("div",$,[e("p",D,v(((g=c(r).user)==null?void 0:g.name)||((h=c(r).user)==null?void 0:h.first_name)),1),e("p",F,v(k.value),1)]),e("button",{onClick:w,class:"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors",title:"Abmelden"},[...t[8]||(t[8]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"})],-1)])])])])])]),e("main",H,[d(_)])])}}};export{K as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Files-BvF-O0NH.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Files-BvF-O0NH.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as o,b as e,j as a}from"./index-CeMVzSB6.js";const l={};function r(n,t){return a(),o("div",null,[...t[0]||(t[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Dateien (DKS)",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"DKS / Datei-Upload kommt bald...")],-1)])])}const i=s(l,[["render",r]]);export{i as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/ForgotPassword-BnefAgO5.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/ForgotPassword-BnefAgO5.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{f as i,b as t,g as v,B as x,A as f,y as b,n as g,t as o,e as h,h as d,i as y,z as w,k as l,m as k,j as u,a as _}from"./index-CeMVzSB6.js";const z={class:"min-h-screen flex items-center justify-center bg-gradient-to-br from-slate-100 to-slate-200 px-4"},S={class:"w-full max-w-md"},M={class:"bg-white rounded-2xl shadow-xl p-8"},V=["disabled"],B={class:"text-center text-sm text-slate-500 mt-6"},N={__name:"ForgotPassword",setup(C){const n=l(""),a=l(!1),s=l(""),r=l(!1);async function m(){a.value=!0,s.value="";try{await _.post("/auth/forgot-password",{email:n.value}),r.value=!0,s.value="Wenn die E-Mail existiert, erhalten Sie einen Link zum Zurücksetzen."}catch{r.value=!0,s.value="Wenn die E-Mail existiert, erhalten Sie einen Link zum Zurücksetzen."}finally{a.value=!1}}return(E,e)=>{const c=k("router-link");return u(),i("div",z,[t("div",S,[t("div",M,[e[4]||(e[4]=v('<div class="text-center mb-6"><div class="inline-flex items-center justify-center w-14 h-14 rounded-xl bg-primary mb-4"><svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"></path></svg></div><h2 class="text-xl font-bold text-slate-800">Passwort vergessen?</h2><p class="text-slate-500 text-sm mt-1">Kein Problem. Geben Sie Ihre E-Mail ein.</p></div>',1)),t("form",{onSubmit:x(m,["prevent"]),class:"space-y-4"},[t("div",null,[e[1]||(e[1]=t("label",{class:"block text-sm font-medium text-slate-700 mb-1"},"E-Mail",-1)),f(t("input",{"onUpdate:modelValue":e[0]||(e[0]=p=>n.value=p),type:"email",required:"",placeholder:"ihre@email.de",class:"w-full px-4 py-2.5 rounded-lg border border-slate-300 focus:ring-2 focus:ring-primary focus:border-primary outline-none"},null,512),[[b,n.value]])]),s.value?(u(),i("div",{key:0,class:g(["p-3 rounded-lg text-sm",r.value?"bg-green-50 text-green-600":"bg-red-50 text-red-600"])},o(s.value),3)):h("",!0),t("button",{type:"submit",disabled:a.value,class:"w-full py-3 px-4 bg-primary text-white font-medium rounded-lg hover:bg-primary-600 disabled:opacity-50"},o(a.value?"Senden...":"Link senden"),9,V)],32),t("p",B,[e[3]||(e[3]=d(" Zurück zum ",-1)),y(c,{to:"/login",class:"text-primary hover:underline"},{default:w(()=>[...e[2]||(e[2]=[d("Login",-1)])]),_:1})])])])])}}};export{N as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Invoices-DPbiN6Xy.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Invoices-DPbiN6Xy.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as t,b as e,j as o}from"./index-CeMVzSB6.js";const a={};function c(r,n){return o(),t("div",null,[...n[0]||(n[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Rechnungen",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"Rechnungen kommen bald...")],-1)])])}const m=s(a,[["render",c]]);export{m as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Learning-C1i3Orm8.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Learning-C1i3Orm8.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as o,b as e,j as r}from"./index-CeMVzSB6.js";const a={};function n(l,t){return r(),o("div",null,[...t[0]||(t[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Lernsoftware",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"Lernsoftware kommt bald...")],-1)])])}const f=s(a,[["render",n]]);export{f as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Login-fU5wXJUp.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Login-fU5wXJUp.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
www/fahrschuldesk.de/dist/assets/Messenger-DL4jJcTI.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Messenger-DL4jJcTI.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as t}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as o,b as e,j as r}from"./index-CeMVzSB6.js";const n={};function a(l,s){return r(),o("div",null,[...s[0]||(s[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Messenger",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"Messenger kommt bald...")],-1)])])}const m=t(n,[["render",a]]);export{m as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Modules-XFzn2DhG.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Modules-XFzn2DhG.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as o}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as s,b as e,j as l}from"./index-CeMVzSB6.js";const a={};function r(d,t){return l(),s("div",null,[...t[0]||(t[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Module",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"Module-Verwaltung kommt bald...")],-1)])])}const m=o(a,[["render",r]]);export{m as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/NotFound-CXY4AhOb.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/NotFound-CXY4AhOb.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as o}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as n,b as t,i as r,z as i,h as l,m as a,j as d}from"./index-CeMVzSB6.js";const m={},c={class:"min-h-screen flex items-center justify-center px-4"},x={class:"text-center"};function f(p,e){const s=a("router-link");return d(),n("div",c,[t("div",x,[e[1]||(e[1]=t("div",{class:"text-8xl font-bold text-slate-200 mb-4"},"404",-1)),e[2]||(e[2]=t("h1",{class:"text-2xl font-bold text-slate-800 mb-2"},"Seite nicht gefunden",-1)),e[3]||(e[3]=t("p",{class:"text-slate-500 mb-8"},"Die Seite, die du suchst, existiert nicht.",-1)),r(s,{to:"/",class:"inline-flex items-center gap-2 px-6 py-3 bg-primary text-white rounded-lg hover:bg-primary-600 transition-colors"},{default:i(()=>[...e[0]||(e[0]=[t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"})],-1),l(" Zum Dashboard ",-1)])]),_:1})])])}const v=o(m,[["render",f]]);export{v as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/PlatformAdmins-BsfJuUAN.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/PlatformAdmins-BsfJuUAN.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as o,b as t,j as a}from"./index-CeMVzSB6.js";const r={};function l(n,e){return a(),o("div",null,[...e[0]||(e[0]=[t("h1",{class:"text-2xl font-bold mb-6"},"Plattform-Admins",-1),t("div",{class:"bg-white rounded-xl shadow-sm p-6"},[t("p",{class:"text-slate-500"},"Admin-Verwaltung kommt bald...")],-1)])])}const c=s(r,[["render",l]]);export{c as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Register-Dtyvn1Yy.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Register-Dtyvn1Yy.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
www/fahrschuldesk.de/dist/assets/TenantEdit-TJEJ_0TK.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/TenantEdit-TJEJ_0TK.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{o as k,f as o,b as t,t as u,A as r,y as v,x as w,F as h,l as M,e as $,a as d,k as b,q as C,j as i,n as S}from"./index-CeMVzSB6.js";const V={class:"flex items-center gap-4 mb-6"},A={class:"text-2xl font-bold text-slate-800"},B={key:0,class:"text-center py-12 text-slate-500"},E={key:1,class:"grid gap-6"},F={class:"bg-white rounded-xl shadow-sm p-6"},T={class:"grid grid-cols-2 gap-4"},U={class:"bg-white rounded-xl shadow-sm p-6"},j={class:"space-y-2"},L={class:"font-medium"},N={class:"text-sm text-slate-500"},R=["onClick"],z={__name:"TenantEdit",setup(_){const g=C(),l=b(null),c=b([]),m=b(!0);async function x(){m.value=!0;try{const[a,e]=await Promise.all([d.get(`/admin/tenants/${g.params.id}`),d.get("/admin/platform-modules")]);l.value=a.data.data,c.value=e.data.data}catch(a){console.error(a)}finally{m.value=!1}}function p(a){var e,n;return(n=(e=l.value)==null?void 0:e.modules)==null?void 0:n.some(s=>s.id===a&&s.status==="enabled")}async function f(a){const e=p(a.id);try{e?await d.delete(`/admin/tenants/${l.value.id}/modules/${a.id}`):await d.post(`/admin/tenants/${l.value.id}/modules`,{module_id:a.id}),await x()}catch(n){console.error(n)}}async function y(){try{await d.put(`/admin/tenants/${l.value.id}`,{name:l.value.name,email:l.value.email,phone:l.value.phone,status:l.value.status}),alert("Gespeichert!")}catch(a){console.error(a),alert("Fehler beim Speichern")}}return k(x),(a,e)=>{var n;return i(),o("div",null,[t("div",V,[t("button",{onClick:e[0]||(e[0]=s=>a.$router.back()),class:"p-2 rounded-lg hover:bg-slate-100"},[...e[5]||(e[5]=[t("svg",{class:"w-5 h-5 text-slate-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)])]),t("div",null,[t("h1",A,u(((n=l.value)==null?void 0:n.name)||"Laden..."),1),e[6]||(e[6]=t("p",{class:"text-slate-500 text-sm"},"Fahrschule bearbeiten",-1))])]),m.value?(i(),o("div",B,"Laden...")):l.value?(i(),o("div",E,[t("div",F,[e[12]||(e[12]=t("h2",{class:"text-lg font-semibold mb-4"},"Stammdaten",-1)),t("div",T,[t("div",null,[e[7]||(e[7]=t("label",{class:"block text-sm font-medium text-slate-700 mb-1"},"Name",-1)),r(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>l.value.name=s),class:"w-full px-4 py-2 rounded-lg border border-slate-300"},null,512),[[v,l.value.name]])]),t("div",null,[e[8]||(e[8]=t("label",{class:"block text-sm font-medium text-slate-700 mb-1"},"E-Mail",-1)),r(t("input",{"onUpdate:modelValue":e[2]||(e[2]=s=>l.value.email=s),class:"w-full px-4 py-2 rounded-lg border border-slate-300"},null,512),[[v,l.value.email]])]),t("div",null,[e[9]||(e[9]=t("label",{class:"block text-sm font-medium text-slate-700 mb-1"},"Telefon",-1)),r(t("input",{"onUpdate:modelValue":e[3]||(e[3]=s=>l.value.phone=s),class:"w-full px-4 py-2 rounded-lg border border-slate-300"},null,512),[[v,l.value.phone]])]),t("div",null,[e[11]||(e[11]=t("label",{class:"block text-sm font-medium text-slate-700 mb-1"},"Status",-1)),r(t("select",{"onUpdate:modelValue":e[4]||(e[4]=s=>l.value.status=s),class:"w-full px-4 py-2 rounded-lg border border-slate-300"},[...e[10]||(e[10]=[t("option",{value:"pending_approval"},"Ausstehend",-1),t("option",{value:"active"},"Aktiv",-1),t("option",{value:"trial"},"Testphase",-1),t("option",{value:"suspended"},"Suspendiert",-1)])],512),[[w,l.value.status]])])]),t("button",{onClick:y,class:"mt-4 px-4 py-2 bg-primary text-white rounded-lg hover:bg-primary-600"}," Speichern ")]),t("div",U,[e[13]||(e[13]=t("h2",{class:"text-lg font-semibold mb-4"},"Module",-1)),t("div",j,[(i(!0),o(h,null,M(c.value,s=>(i(),o("div",{key:s.id,class:"flex items-center justify-between p-3 bg-slate-50 rounded-lg"},[t("div",null,[t("p",L,u(s.name),1),t("p",N,u(s.description),1)]),t("button",{onClick:D=>f(s),class:S(["px-3 py-1 rounded text-sm",p(s.id)?"bg-green-100 text-green-700":"bg-slate-200 text-slate-600"])},u(p(s.id)?"Aktiv":"Inaktiv"),11,R)]))),128))])])])):$("",!0)])}}};export{z as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/Tenants-oNbkI0ZB.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Tenants-oNbkI0ZB.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
www/fahrschuldesk.de/dist/assets/Users-UfUrkk1j.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/Users-UfUrkk1j.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{f as r,b as e,j as o}from"./index-CeMVzSB6.js";const a={};function n(l,t){return o(),r("div",null,[...t[0]||(t[0]=[e("h1",{class:"text-2xl font-bold mb-6"},"Benutzer",-1),e("div",{class:"bg-white rounded-xl shadow-sm p-6"},[e("p",{class:"text-slate-500"},"Benutzer-Verwaltung kommt bald...")],-1)])])}const m=s(a,[["render",n]]);export{m as default};
|
||||
1
www/fahrschuldesk.de/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};
|
||||
38
www/fahrschuldesk.de/dist/assets/index-CeMVzSB6.js
vendored
Normal file
38
www/fahrschuldesk.de/dist/assets/index-CeMVzSB6.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
www/fahrschuldesk.de/dist/assets/index-DnvNyrEP.css
vendored
Normal file
1
www/fahrschuldesk.de/dist/assets/index-DnvNyrEP.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
#app{min-height:100vh;background-color:#f8fafc}@tailwind base;@tailwind components;@tailwind utilities;:root{--color-primary: #2563eb;--color-primary-50: #eff6ff;--color-primary-100: #dbeafe;--color-primary-500: #3b82f6;--color-primary-600: #2563eb;--color-primary-700: #1d4ed8;--color-secondary: #64748b;--color-secondary-500: #64748b}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,system-ui,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:#f1f5f9}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}.fade-enter-active,.fade-leave-active{transition:opacity .2s ease}.fade-enter-from,.fade-leave-to{opacity:0}.slide-enter-active,.slide-leave-active{transition:transform .3s ease,opacity .3s ease}.slide-enter-from{transform:translate(-20px);opacity:0}.slide-leave-to{transform:translate(20px);opacity:0}
|
||||
18
www/fahrschuldesk.de/dist/index.html
vendored
Normal file
18
www/fahrschuldesk.de/dist/index.html
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="fahrschuldesk - Verwaltungssoftware für Fahrschulen" />
|
||||
<title>fahrschuldesk</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
<script type="module" crossorigin src="/assets/index-CeMVzSB6.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-DnvNyrEP.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
||||
2498
www/fahrschuldesk.de/package-lock.json
generated
Normal file
2498
www/fahrschuldesk.de/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
8
www/fahrschuldesk.de/src/views/admin/AuditLogs.vue
Normal file
8
www/fahrschuldesk.de/src/views/admin/AuditLogs.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Audit-Log</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Audit-Log kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/admin/Invoices.vue
Normal file
8
www/fahrschuldesk.de/src/views/admin/Invoices.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Rechnungen</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Rechnungen kommen bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/admin/Modules.vue
Normal file
8
www/fahrschuldesk.de/src/views/admin/Modules.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Module</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Module-Verwaltung kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/admin/PlatformAdmins.vue
Normal file
8
www/fahrschuldesk.de/src/views/admin/PlatformAdmins.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Plattform-Admins</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Admin-Verwaltung kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
132
www/fahrschuldesk.de/src/views/admin/TenantEdit.vue
Normal file
132
www/fahrschuldesk.de/src/views/admin/TenantEdit.vue
Normal file
@@ -0,0 +1,132 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="flex items-center gap-4 mb-6">
|
||||
<button @click="$router.back()" class="p-2 rounded-lg hover:bg-slate-100">
|
||||
<svg class="w-5 h-5 text-slate-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
|
||||
</svg>
|
||||
</button>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold text-slate-800">{{ tenant?.name || 'Laden...' }}</h1>
|
||||
<p class="text-slate-500 text-sm">Fahrschule bearbeiten</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="loading" class="text-center py-12 text-slate-500">Laden...</div>
|
||||
|
||||
<div v-else-if="tenant" class="grid gap-6">
|
||||
<!-- Info Card -->
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<h2 class="text-lg font-semibold mb-4">Stammdaten</h2>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-slate-700 mb-1">Name</label>
|
||||
<input v-model="tenant.name" class="w-full px-4 py-2 rounded-lg border border-slate-300" />
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-slate-700 mb-1">E-Mail</label>
|
||||
<input v-model="tenant.email" class="w-full px-4 py-2 rounded-lg border border-slate-300" />
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-slate-700 mb-1">Telefon</label>
|
||||
<input v-model="tenant.phone" class="w-full px-4 py-2 rounded-lg border border-slate-300" />
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-slate-700 mb-1">Status</label>
|
||||
<select v-model="tenant.status" class="w-full px-4 py-2 rounded-lg border border-slate-300">
|
||||
<option value="pending_approval">Ausstehend</option>
|
||||
<option value="active">Aktiv</option>
|
||||
<option value="trial">Testphase</option>
|
||||
<option value="suspended">Suspendiert</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<button @click="save" class="mt-4 px-4 py-2 bg-primary text-white rounded-lg hover:bg-primary-600">
|
||||
Speichern
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Modules Card -->
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<h2 class="text-lg font-semibold mb-4">Module</h2>
|
||||
<div class="space-y-2">
|
||||
<div v-for="mod in allModules" :key="mod.id" class="flex items-center justify-between p-3 bg-slate-50 rounded-lg">
|
||||
<div>
|
||||
<p class="font-medium">{{ mod.name }}</p>
|
||||
<p class="text-sm text-slate-500">{{ mod.description }}</p>
|
||||
</div>
|
||||
<button
|
||||
@click="toggleModule(mod)"
|
||||
class="px-3 py-1 rounded text-sm"
|
||||
:class="isModuleEnabled(mod.id) ? 'bg-green-100 text-green-700' : 'bg-slate-200 text-slate-600'"
|
||||
>
|
||||
{{ isModuleEnabled(mod.id) ? 'Aktiv' : 'Inaktiv' }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import api from '@/api/client'
|
||||
|
||||
const route = useRoute()
|
||||
const tenant = ref(null)
|
||||
const allModules = ref([])
|
||||
const loading = ref(true)
|
||||
|
||||
async function fetch() {
|
||||
loading.value = true
|
||||
try {
|
||||
const [tenantRes, modulesRes] = await Promise.all([
|
||||
api.get(`/admin/tenants/${route.params.id}`),
|
||||
api.get('/admin/platform-modules')
|
||||
])
|
||||
tenant.value = tenantRes.data.data
|
||||
allModules.value = modulesRes.data.data
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
function isModuleEnabled(moduleId) {
|
||||
return tenant.value?.modules?.some(m => m.id === moduleId && m.status === 'enabled')
|
||||
}
|
||||
|
||||
async function toggleModule(mod) {
|
||||
const current = isModuleEnabled(mod.id)
|
||||
try {
|
||||
if (current) {
|
||||
await api.delete(`/admin/tenants/${tenant.value.id}/modules/${mod.id}`)
|
||||
} else {
|
||||
await api.post(`/admin/tenants/${tenant.value.id}/modules`, { module_id: mod.id })
|
||||
}
|
||||
await fetch()
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
}
|
||||
}
|
||||
|
||||
async function save() {
|
||||
try {
|
||||
await api.put(`/admin/tenants/${tenant.value.id}`, {
|
||||
name: tenant.value.name,
|
||||
email: tenant.value.email,
|
||||
phone: tenant.value.phone,
|
||||
status: tenant.value.status
|
||||
})
|
||||
alert('Gespeichert!')
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
alert('Fehler beim Speichern')
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(fetch)
|
||||
</script>
|
||||
8
www/fahrschuldesk.de/src/views/student/Dashboard.vue
Normal file
8
www/fahrschuldesk.de/src/views/student/Dashboard.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Dashboard</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Schüler-Dashboard kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/student/Learning.vue
Normal file
8
www/fahrschuldesk.de/src/views/student/Learning.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Lernsoftware</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Schüler-Lernsoftware kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/tenant/Branches.vue
Normal file
8
www/fahrschuldesk.de/src/views/tenant/Branches.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Filialen</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Filialen-Verwaltung kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/tenant/Branding.vue
Normal file
8
www/fahrschuldesk.de/src/views/tenant/Branding.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Branding</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Branding / Logo-Upload kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/tenant/Calendar.vue
Normal file
8
www/fahrschuldesk.de/src/views/tenant/Calendar.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Kalender</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Kalender (Integration fahrschultermin.de) kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/tenant/Files.vue
Normal file
8
www/fahrschuldesk.de/src/views/tenant/Files.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Dateien (DKS)</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">DKS / Datei-Upload kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/tenant/Learning.vue
Normal file
8
www/fahrschuldesk.de/src/views/tenant/Learning.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Lernsoftware</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Lernsoftware kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/tenant/Messenger.vue
Normal file
8
www/fahrschuldesk.de/src/views/tenant/Messenger.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Messenger</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Messenger kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
8
www/fahrschuldesk.de/src/views/tenant/Users.vue
Normal file
8
www/fahrschuldesk.de/src/views/tenant/Users.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold mb-6">Benutzer</h1>
|
||||
<div class="bg-white rounded-xl shadow-sm p-6">
|
||||
<p class="text-slate-500">Benutzer-Verwaltung kommt bald...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
Reference in New Issue
Block a user