Add Help & Documentation system under Settings
This commit is contained in:
1
dist/assets/AdminDashboardView-B-imbJi1.js
vendored
Normal file
1
dist/assets/AdminDashboardView-B-imbJi1.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/AppLayout-BRNeJZ9j.js
vendored
Normal file
1
dist/assets/AppLayout-BRNeJZ9j.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/AvailabilityView-DWb2J76b.js
vendored
Normal file
1
dist/assets/AvailabilityView-DWb2J76b.js
vendored
Normal file
@@ -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,x as A,A as C,r as v,k as m,o as i,n as L}from"./index-Dox4jtA_.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(F,null,A(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]=C('<div class="mt-6 flex items-center gap-4 text-sm"><div class="flex items-center gap-2"><span class="w-4 h-4 bg-green-500 rounded"></span><span>Verfügbar</span></div><div class="flex items-center gap-2"><span class="w-4 h-4 bg-gray-200 dark:bg-gray-600 rounded"></span><span>Nicht gemeldet</span></div></div>',1))])]))}});export{j as default};
|
||||
1
dist/assets/DashboardView-BW8VodPh.js
vendored
Normal file
1
dist/assets/DashboardView-BW8VodPh.js
vendored
Normal file
File diff suppressed because one or more lines are too long
365
dist/assets/HelpView-BR-Y2gYt.js
vendored
Normal file
365
dist/assets/HelpView-BR-Y2gYt.js
vendored
Normal file
@@ -0,0 +1,365 @@
|
||||
import{d as K,c as a,a as n,e as w,b as C,v as F,F as A,x,t as r,r as f,k as m,o as s}from"./index-Dox4jtA_.js";const G={class:"space-y-6"},E={class:"flex items-center justify-between"},V={class:"flex items-center gap-3"},W={class:"relative"},N={key:0,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},$=["onClick"],Z={class:"text-3xl mb-3"},I={class:"text-lg font-semibold mb-1 text-gray-900 dark:text-white"},L={class:"text-sm text-gray-500 dark:text-gray-400"},T={class:"text-xs text-gray-400 mt-2"},H={key:1,class:"space-y-4"},O={class:"card bg-gray-50 dark:bg-gray-800"},R={class:"flex items-center gap-3"},q={class:"text-3xl"},j={class:"text-xl font-semibold text-gray-900 dark:text-white"},U={class:"text-sm text-gray-500 dark:text-gray-400"},J={class:"grid gap-3"},Q=["onClick"],X={class:"text-2xl"},Y={class:"font-medium text-gray-900 dark:text-white"},ee={key:2,class:"card"},ne={class:"flex items-center gap-3 mb-6 pb-4 border-b dark:border-gray-700"},te={class:"text-3xl"},ie={class:"text-xl font-semibold text-gray-900 dark:text-white"},re=["innerHTML"],le=K({__name:"HelpView",setup(ae){const l=f(""),u=f(null),o=f(null),g=[{id:"getting-started",name:"Erste Schritte",icon:"🚀",description:"Grundlagen und Einrichtung",articles:[{id:"overview",title:"Übersicht",icon:"📋",content:`
|
||||
## Was ist SeCu?
|
||||
|
||||
SeCu ist eine modulare Mitarbeiterverwaltung speziell für Sicherheitsunternehmen. Die Software hilft Ihnen bei:
|
||||
|
||||
- **Mitarbeiterverwaltung** – Alle Mitarbeiter zentral verwalten
|
||||
- **Auftragsverwaltung** – Aufträge erstellen und zuweisen
|
||||
- **Stundenzettel** – Arbeitszeiten erfassen und genehmigen
|
||||
- **Verfügbarkeiten** – Wer ist wann einsetzbar?
|
||||
- **Partnerschaften** – Zusammenarbeit mit Subunternehmern
|
||||
|
||||
### Rollen im System
|
||||
|
||||
**Chef** – Vollzugriff auf alle Funktionen, kann Disponenten und Mitarbeiter anlegen
|
||||
|
||||
**Disponent** – Kann Mitarbeiter anlegen, Aufträge erstellen, Stundenzettel einsehen
|
||||
|
||||
**Mitarbeiter** – Kann eigene Aufträge sehen, Verfügbarkeit melden, Stundenzettel hochladen
|
||||
`},{id:"first-login",title:"Erster Login",icon:"🔐",content:`
|
||||
## Erster Login
|
||||
|
||||
Nach der Registrierung Ihrer Organisation erhalten Sie Zugangsdaten per E-Mail.
|
||||
|
||||
### Anmeldung
|
||||
|
||||
1. Öffnen Sie die SeCu-Webseite
|
||||
2. Geben Sie Ihre E-Mail-Adresse ein
|
||||
3. Geben Sie Ihr Passwort ein
|
||||
4. Klicken Sie auf "Anmelden"
|
||||
|
||||
### Passwort ändern
|
||||
|
||||
Wir empfehlen, Ihr Passwort nach dem ersten Login zu ändern:
|
||||
|
||||
1. Gehen Sie zu **Einstellungen**
|
||||
2. Scrollen Sie zu "Passwort ändern"
|
||||
3. Geben Sie Ihr aktuelles Passwort ein
|
||||
4. Geben Sie ein neues Passwort ein (mind. 8 Zeichen)
|
||||
5. Bestätigen Sie das neue Passwort
|
||||
6. Klicken Sie auf "Passwort ändern"
|
||||
`}]},{id:"users",name:"Benutzerverwaltung",icon:"👥",description:"Mitarbeiter und Disponenten verwalten",articles:[{id:"create-user",title:"Benutzer anlegen",icon:"➕",content:`
|
||||
## Neuen Benutzer anlegen
|
||||
|
||||
**Berechtigung:** Chef oder Disponent
|
||||
|
||||
### Schritt für Schritt
|
||||
|
||||
1. Navigieren Sie zu **Benutzer** im Menü
|
||||
2. Klicken Sie auf **"+ Neuer Benutzer"**
|
||||
3. Füllen Sie das Formular aus:
|
||||
- **Vorname** und **Nachname**
|
||||
- **E-Mail-Adresse** (wird für Login verwendet)
|
||||
- **Passwort** (mind. 8 Zeichen)
|
||||
- **Rolle** auswählen (Disponent oder Mitarbeiter)
|
||||
4. Klicken Sie auf **"Erstellen"**
|
||||
|
||||
### Rollen-Unterschiede
|
||||
|
||||
- **Disponent**: Kann selbst Mitarbeiter anlegen und Aufträge verwalten
|
||||
- **Mitarbeiter**: Kann nur eigene Daten sehen und bearbeiten
|
||||
|
||||
> **Hinweis:** Als Disponent können Sie nur Mitarbeiter anlegen, keine weiteren Disponenten.
|
||||
`},{id:"edit-user",title:"Benutzer bearbeiten",icon:"✏️",content:`
|
||||
## Benutzer bearbeiten
|
||||
|
||||
### Benutzerdaten ändern
|
||||
|
||||
1. Gehen Sie zu **Benutzer**
|
||||
2. Klicken Sie auf den Namen des Benutzers
|
||||
3. Ändern Sie die gewünschten Felder
|
||||
4. Klicken Sie auf **"Speichern"**
|
||||
|
||||
### Benutzer deaktivieren
|
||||
|
||||
Statt einen Benutzer zu löschen, können Sie ihn deaktivieren:
|
||||
|
||||
1. Öffnen Sie das Benutzerprofil
|
||||
2. Setzen Sie den Status auf **"Inaktiv"**
|
||||
3. Der Benutzer kann sich nicht mehr anmelden
|
||||
|
||||
> **Tipp:** Deaktivierte Benutzer bleiben in der Historie erhalten.
|
||||
`}]},{id:"orders",name:"Auftragsverwaltung",icon:"📋",description:"Aufträge erstellen und verwalten",articles:[{id:"create-order",title:"Auftrag erstellen",icon:"➕",content:`
|
||||
## Neuen Auftrag erstellen
|
||||
|
||||
**Berechtigung:** Chef oder Disponent
|
||||
|
||||
### Auftrag anlegen
|
||||
|
||||
1. Navigieren Sie zu **Aufträge**
|
||||
2. Klicken Sie auf **"+ Neuer Auftrag"**
|
||||
3. Füllen Sie die Pflichtfelder aus:
|
||||
- **Titel** – Kurze Beschreibung des Auftrags
|
||||
- **Kunde** – Name des Auftraggebers
|
||||
- **Standort** – Einsatzort
|
||||
- **Datum/Zeit** – Wann findet der Einsatz statt?
|
||||
4. Optional: Beschreibung hinzufügen
|
||||
5. Klicken Sie auf **"Erstellen"**
|
||||
|
||||
### Mitarbeiter zuweisen
|
||||
|
||||
Nach dem Erstellen können Sie Mitarbeiter zuweisen:
|
||||
|
||||
1. Öffnen Sie den Auftrag
|
||||
2. Klicken Sie auf **"Mitarbeiter zuweisen"**
|
||||
3. Wählen Sie verfügbare Mitarbeiter aus
|
||||
4. Bestätigen Sie die Zuweisung
|
||||
`},{id:"order-status",title:"Auftragsstatus",icon:"🔄",content:`
|
||||
## Auftragsstatus verstehen
|
||||
|
||||
Jeder Auftrag durchläuft verschiedene Status:
|
||||
|
||||
🟡 **Offen** – Auftrag erstellt, noch nicht begonnen
|
||||
|
||||
🔵 **In Bearbeitung** – Auftrag läuft aktuell
|
||||
|
||||
🟢 **Abgeschlossen** – Auftrag erfolgreich beendet
|
||||
|
||||
🔴 **Storniert** – Auftrag wurde abgebrochen
|
||||
|
||||
### Status ändern
|
||||
|
||||
1. Öffnen Sie den Auftrag
|
||||
2. Klicken Sie auf den aktuellen Status
|
||||
3. Wählen Sie den neuen Status
|
||||
4. Optional: Kommentar hinzufügen
|
||||
`}]},{id:"timesheets",name:"Stundenzettel",icon:"⏱️",description:"Arbeitszeiten erfassen und verwalten",articles:[{id:"submit-timesheet",title:"Stundenzettel einreichen",icon:"📤",content:`
|
||||
## Stundenzettel einreichen
|
||||
|
||||
**Für Mitarbeiter**
|
||||
|
||||
### Arbeitszeit erfassen
|
||||
|
||||
1. Gehen Sie zu **Stundenzettel**
|
||||
2. Klicken Sie auf **"+ Neue Erfassung"**
|
||||
3. Wählen Sie den **Auftrag** aus
|
||||
4. Geben Sie ein:
|
||||
- **Startzeit** und **Endzeit**
|
||||
- **Pausenzeit** (falls vorhanden)
|
||||
5. Optional: Foto des Stundenzettels hochladen
|
||||
6. Klicken Sie auf **"Einreichen"**
|
||||
|
||||
### Foto hochladen
|
||||
|
||||
Sie können ein Foto Ihres handschriftlichen Stundenzettels anhängen:
|
||||
|
||||
1. Klicken Sie auf **"Foto hinzufügen"**
|
||||
2. Wählen Sie das Foto aus oder machen Sie ein neues
|
||||
3. Das Foto wird automatisch hochgeladen
|
||||
|
||||
> **Tipp:** Stellen Sie sicher, dass das Foto gut lesbar ist.
|
||||
`},{id:"approve-timesheet",title:"Stundenzettel genehmigen",icon:"✅",content:`
|
||||
## Stundenzettel genehmigen
|
||||
|
||||
**Für Disponenten und Chefs**
|
||||
|
||||
### Übersicht
|
||||
|
||||
Offene Stundenzettel werden im Dashboard angezeigt. Sie können diese genehmigen oder ablehnen.
|
||||
|
||||
### Genehmigungsprozess
|
||||
|
||||
1. Gehen Sie zu **Stundenzettel**
|
||||
2. Filtern Sie nach **"Ausstehend"**
|
||||
3. Prüfen Sie die Einträge:
|
||||
- Stimmen die Zeiten mit dem Auftrag überein?
|
||||
- Ist das hochgeladene Foto lesbar?
|
||||
4. Klicken Sie auf **✓ Genehmigen** oder **✗ Ablehnen**
|
||||
5. Bei Ablehnung: Grund angeben
|
||||
|
||||
### Massenbearbeitung
|
||||
|
||||
Sie können mehrere Stundenzettel gleichzeitig bearbeiten:
|
||||
|
||||
1. Aktivieren Sie die Checkboxen
|
||||
2. Klicken Sie auf **"Ausgewählte genehmigen"**
|
||||
`}]},{id:"availability",name:"Verfügbarkeiten",icon:"📅",description:"Einsatzbereitschaft verwalten",articles:[{id:"set-availability",title:"Verfügbarkeit melden",icon:"🗓️",content:`
|
||||
## Verfügbarkeit melden
|
||||
|
||||
**Für Mitarbeiter**
|
||||
|
||||
### Warum Verfügbarkeit melden?
|
||||
|
||||
Damit Disponenten wissen, wann Sie einsetzbar sind, sollten Sie Ihre Verfügbarkeit regelmäßig aktualisieren.
|
||||
|
||||
### Verfügbarkeit eintragen
|
||||
|
||||
1. Gehen Sie zu **Verfügbarkeit**
|
||||
2. Klicken Sie auf einen Tag im Kalender
|
||||
3. Wählen Sie:
|
||||
- ✅ **Verfügbar** – Sie können eingesetzt werden
|
||||
- ❌ **Nicht verfügbar** – Sie sind verhindert
|
||||
- 🕐 **Teilweise** – Nur zu bestimmten Zeiten
|
||||
4. Bei "Teilweise": Zeitfenster angeben
|
||||
5. Speichern Sie die Eingabe
|
||||
|
||||
### Regelmäßige Muster
|
||||
|
||||
Sie können wiederkehrende Verfügbarkeiten einrichten:
|
||||
|
||||
1. Klicken Sie auf **"Muster erstellen"**
|
||||
2. Wählen Sie die Wochentage
|
||||
3. Geben Sie die Zeiten ein
|
||||
4. Das Muster wird automatisch angewendet
|
||||
`},{id:"view-availability",title:"Verfügbarkeiten einsehen",icon:"👁️",content:`
|
||||
## Verfügbarkeiten einsehen
|
||||
|
||||
**Für Disponenten und Chefs**
|
||||
|
||||
### Team-Übersicht
|
||||
|
||||
1. Gehen Sie zu **Verfügbarkeit**
|
||||
2. Wählen Sie **"Team-Ansicht"**
|
||||
3. Sie sehen alle Mitarbeiter im Kalender
|
||||
|
||||
### Nach Datum filtern
|
||||
|
||||
- Klicken Sie auf ein Datum, um zu sehen, wer verfügbar ist
|
||||
- Grün = verfügbar, Rot = nicht verfügbar, Gelb = teilweise
|
||||
|
||||
### Für Auftrag nutzen
|
||||
|
||||
Beim Erstellen eines Auftrags werden automatisch nur verfügbare Mitarbeiter vorgeschlagen.
|
||||
`}]},{id:"partnerships",name:"Partnerschaften",icon:"🤝",description:"Zusammenarbeit mit Subunternehmern",articles:[{id:"partnership-overview",title:"Übersicht",icon:"📋",content:`
|
||||
## Partnerschaften in SeCu
|
||||
|
||||
Das Partnerschaftsmodul ermöglicht die Zusammenarbeit mit anderen Sicherheitsunternehmen.
|
||||
|
||||
### Anwendungsfälle
|
||||
|
||||
- **Subunternehmer einsetzen** – Personal bei Partnerfirmen anfordern
|
||||
- **Personal verleihen** – Eigene Mitarbeiter an Partner ausleihen
|
||||
- **Abrechnung** – Stundenzettel und Rechnungen austauschen
|
||||
|
||||
### Beziehungsarten
|
||||
|
||||
**Auftraggeber** – Sie beauftragen den Partner (Subunternehmer)
|
||||
|
||||
**Subunternehmer** – Sie werden vom Partner beauftragt
|
||||
|
||||
**Bilateral** – Beide Seiten können Aufträge teilen
|
||||
|
||||
### Voraussetzungen
|
||||
|
||||
- Beide Unternehmen müssen in SeCu registriert sein
|
||||
- Partnerschaftsmodul muss aktiviert sein
|
||||
`},{id:"create-partnership",title:"Partnerschaft anfragen",icon:"➕",content:`
|
||||
## Partnerschaft anfragen
|
||||
|
||||
**Berechtigung:** Chef
|
||||
|
||||
### Neue Partnerschaft
|
||||
|
||||
1. Gehen Sie zu **Partnerschaften**
|
||||
2. Klicken Sie auf **"+ Neue Partnerschaft"**
|
||||
3. Suchen Sie das Partnerunternehmen
|
||||
4. Wählen Sie die **Beziehungsart**:
|
||||
- Auftraggeber (Sie beauftragen)
|
||||
- Subunternehmer (Sie werden beauftragt)
|
||||
- Bilateral (beidseitig)
|
||||
5. Klicken Sie auf **"Anfrage senden"**
|
||||
|
||||
### Anfrage annehmen
|
||||
|
||||
Wenn Sie eine Anfrage erhalten:
|
||||
|
||||
1. Sie sehen eine Benachrichtigung
|
||||
2. Prüfen Sie die Details
|
||||
3. Klicken Sie auf **"Annehmen"** oder **"Ablehnen"**
|
||||
|
||||
> **Hinweis:** Nach Annahme können beide Seiten Aufträge teilen.
|
||||
`},{id:"share-orders",title:"Aufträge teilen",icon:"📤",content:`
|
||||
## Aufträge mit Partnern teilen
|
||||
|
||||
### Auftrag an Subunternehmer
|
||||
|
||||
1. Erstellen oder öffnen Sie einen Auftrag
|
||||
2. Klicken Sie auf **"Mit Partner teilen"**
|
||||
3. Wählen Sie den **Partner** aus
|
||||
4. Geben Sie Details an:
|
||||
- Benötigte Mitarbeiteranzahl
|
||||
- Stundensatz (falls vereinbart)
|
||||
5. Partner erhält Benachrichtigung
|
||||
|
||||
### Geteilte Aufträge verwalten
|
||||
|
||||
Geteilte Aufträge werden mit einem 🤝 Symbol markiert.
|
||||
|
||||
- **Blau**: Von Ihnen geteilt
|
||||
- **Orange**: An Sie geteilt
|
||||
|
||||
### Stundenzettel vom Partner
|
||||
|
||||
Wenn der Partner Stundenzettel einreicht:
|
||||
|
||||
1. Sie erhalten eine Benachrichtigung
|
||||
2. Prüfen Sie die Zeiten
|
||||
3. Genehmigen oder lehnen Sie ab
|
||||
4. Genehmigte Zeiten fließen in die Abrechnung
|
||||
`}]},{id:"modules",name:"Module",icon:"🧩",description:"Funktionen aktivieren/deaktivieren",articles:[{id:"module-overview",title:"Module verwalten",icon:"⚙️",content:`
|
||||
## Module in SeCu
|
||||
|
||||
SeCu ist modular aufgebaut. Sie können Funktionen nach Bedarf aktivieren oder deaktivieren.
|
||||
|
||||
### Verfügbare Module
|
||||
|
||||
**Stundenzettel** – Arbeitszeiterfassung
|
||||
|
||||
**Verfügbarkeit** – Einsatzplanung
|
||||
|
||||
**Dokumente** – Dateiverwaltung
|
||||
|
||||
**Partnerschaften** – Subunternehmer-Management
|
||||
|
||||
**Abrechnung** – Rechnungserstellung
|
||||
|
||||
### Modul aktivieren
|
||||
|
||||
1. Gehen Sie zu **Module** (nur für Chefs)
|
||||
2. Finden Sie das gewünschte Modul
|
||||
3. Klicken Sie auf den Schalter
|
||||
4. Das Modul ist sofort verfügbar
|
||||
|
||||
### Modul deaktivieren
|
||||
|
||||
> **Achtung:** Beim Deaktivieren werden keine Daten gelöscht, aber die Funktionen sind nicht mehr zugänglich.
|
||||
|
||||
1. Klicken Sie auf den Schalter des aktiven Moduls
|
||||
2. Bestätigen Sie die Deaktivierung
|
||||
`}]},{id:"faq",name:"Häufige Fragen",icon:"❓",description:"Antworten auf häufige Fragen",articles:[{id:"faq-general",title:"Allgemeine Fragen",icon:"💬",content:`
|
||||
## Häufige Fragen
|
||||
|
||||
### Ich habe mein Passwort vergessen
|
||||
|
||||
1. Klicken Sie auf der Login-Seite auf **"Passwort vergessen"**
|
||||
2. Geben Sie Ihre E-Mail-Adresse ein
|
||||
3. Sie erhalten einen Link zum Zurücksetzen
|
||||
|
||||
---
|
||||
|
||||
### Kann ich mehrere Organisationen haben?
|
||||
|
||||
Nein, jeder Benutzer gehört zu genau einer Organisation. Für die Zusammenarbeit nutzen Sie das Partnerschaftsmodul.
|
||||
|
||||
---
|
||||
|
||||
### Werden meine Daten gesichert?
|
||||
|
||||
Ja, es werden regelmäßig automatische Backups erstellt. Bei Datenverlust kontaktieren Sie den Support.
|
||||
|
||||
---
|
||||
|
||||
### Wie kann ich Support kontaktieren?
|
||||
|
||||
- **E-Mail:** support@kronos-soulution.de
|
||||
- **Telefon:** Siehe Ihre Vertragsdaten
|
||||
|
||||
---
|
||||
|
||||
### Gibt es eine Mobile App?
|
||||
|
||||
SeCu ist als Web-App optimiert und funktioniert auf allen Geräten. Eine native App ist in Planung.
|
||||
`}]}];function y(t){return t.replace(/^### (.+)$/gm,'<h3 class="text-lg font-semibold mt-6 mb-2 text-gray-900 dark:text-white">$1</h3>').replace(/^## (.+)$/gm,'<h2 class="text-xl font-bold mt-8 mb-4 text-gray-900 dark:text-white">$1</h2>').replace(/\*\*(.+?)\*\*/g,'<strong class="font-semibold">$1</strong>').replace(/\*(.+?)\*/g,"<em>$1</em>").replace(/`(.+?)`/g,'<code class="bg-gray-100 dark:bg-gray-700 px-1.5 py-0.5 rounded text-sm">$1</code>').replace(/^> (.+)$/gm,'<blockquote class="border-l-4 border-blue-500 pl-4 italic text-gray-600 dark:text-gray-400 my-4 bg-blue-50 dark:bg-blue-900/20 py-2 pr-4 rounded-r">$1</blockquote>').replace(/^---$/gm,'<hr class="my-6 border-gray-200 dark:border-gray-700">').replace(/^(\d+)\. (.+)$/gm,'<li class="ml-6 list-decimal my-1 text-gray-700 dark:text-gray-300">$2</li>').replace(/^- (.+)$/gm,'<li class="ml-6 list-disc my-1 text-gray-700 dark:text-gray-300">$1</li>').replace(/(<li class="ml-6 list-decimal[^>]*>.*<\/li>\n?)+/g,e=>`<ol class="my-4">${e}</ol>`).replace(/(<li class="ml-6 list-disc[^>]*>.*<\/li>\n?)+/g,e=>`<ul class="my-4">${e}</ul>`).split(`
|
||||
|
||||
`).map(e=>(e=e.trim(),e?e.startsWith("<")?e:`<p class="my-3 text-gray-700 dark:text-gray-300">${e}</p>`:"")).join(`
|
||||
`)}const _=m(()=>{if(!l.value)return g;const t=l.value.toLowerCase();return g.map(e=>({...e,articles:e.articles.filter(c=>c.title.toLowerCase().includes(t)||c.content.toLowerCase().includes(t))})).filter(e=>e.articles.length>0)});function M(t){u.value=t,o.value=null}function B(t,e){u.value=t,o.value=e}function P(){o.value?o.value=null:u.value=null}const d=m(()=>g.find(t=>t.id===u.value)),h=m(()=>{var t;return(t=d.value)==null?void 0:t.articles.find(e=>e.id===o.value)});return(t,e)=>{var c,b,S,k,v,p,z;return s(),a("div",G,[n("div",E,[n("div",V,[u.value?(s(),a("button",{key:0,onClick:P,class:"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors text-xl"}," ← ")):w("",!0),e[2]||(e[2]=n("h1",{class:"text-2xl font-bold text-gray-900 dark:text-white"}," 📚 Hilfe & Dokumentation ",-1))])]),n("div",W,[C(n("input",{"onUpdate:modelValue":e[0]||(e[0]=i=>l.value=i),type:"text",placeholder:"🔍 Suche in der Dokumentation...",class:"input pl-4 pr-10 w-full"},null,512),[[F,l.value]]),l.value?(s(),a("span",{key:0,onClick:e[1]||(e[1]=i=>l.value=""),class:"absolute right-3 top-1/2 -translate-y-1/2 cursor-pointer text-gray-400 hover:text-gray-600 text-lg"}," ✕ ")):w("",!0)]),u.value?o.value?(s(),a("div",ee,[n("div",ne,[n("span",te,r((v=h.value)==null?void 0:v.icon),1),n("h2",ie,r((p=h.value)==null?void 0:p.title),1)]),n("div",{class:"prose dark:prose-invert max-w-none",innerHTML:y(((z=h.value)==null?void 0:z.content)||"")},null,8,re)])):(s(),a("div",H,[n("div",O,[n("div",R,[n("span",q,r((c=d.value)==null?void 0:c.icon),1),n("div",null,[n("h2",j,r((b=d.value)==null?void 0:b.name),1),n("p",U,r((S=d.value)==null?void 0:S.description),1)])])]),n("div",J,[(s(!0),a(A,null,x((k=d.value)==null?void 0:k.articles,i=>(s(),a("div",{key:i.id,onClick:D=>B(d.value.id,i.id),class:"card cursor-pointer hover:shadow-md transition-all flex items-center gap-3 hover:bg-gray-50 dark:hover:bg-gray-700"},[n("span",X,r(i.icon),1),n("span",Y,r(i.title),1),e[3]||(e[3]=n("span",{class:"ml-auto text-gray-400"},"→",-1))],8,Q))),128))])])):(s(),a("div",N,[(s(!0),a(A,null,x(_.value,i=>(s(),a("div",{key:i.id,onClick:D=>M(i.id),class:"card cursor-pointer hover:shadow-lg transition-all hover:scale-[1.02] border-2 border-transparent hover:border-blue-500"},[n("div",Z,r(i.icon),1),n("h3",I,r(i.name),1),n("p",L,r(i.description),1),n("p",T,r(i.articles.length)+" Artikel",1)],8,$))),128))]))])}}});export{le as default};
|
||||
1
dist/assets/LoginView-CeGTfWRI.js
vendored
Normal file
1
dist/assets/LoginView-CeGTfWRI.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{d as h,u as q,r as a,c,a as e,t as g,w as B,b as r,v as n,F as N,e as k,f as R,g as U,o as f}from"./index-Dox4jtA_.js";const A={class:"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 py-12 px-4 sm:px-6 lg:px-8"},M={class:"max-w-md w-full space-y-8"},C={class:"card"},E={class:"text-xl font-semibold text-gray-900 dark:text-white mb-6"},D={class:"grid grid-cols-2 gap-4"},F=["placeholder"],O={key:1,class:"p-3 bg-red-50 dark:bg-red-900/20 text-red-600 dark:text-red-400 rounded-lg text-sm"},T=["disabled"],j={class:"mt-4 text-center"},L=h({__name:"LoginView",setup(z){const w=R(),V=U(),m=q(),o=a(""),u=a(""),i=a(m.orgSlug||""),p=a(""),v=a(!1),s=a(!1),x=a(""),y=a(""),b=a("");async function S(){p.value="",v.value=!0;try{s.value?(await m.register({email:o.value,password:u.value,first_name:x.value,last_name:y.value,phone:b.value,org_slug:i.value}),await m.login(o.value,u.value,i.value)):await m.login(o.value,u.value,i.value);const d=V.query.redirect||"/";w.push(d)}catch(d){p.value=d instanceof Error?d.message:"Anmeldung fehlgeschlagen"}finally{v.value=!1}}return(d,t)=>(f(),c("div",A,[e("div",M,[t[13]||(t[13]=e("div",{class:"text-center"},[e("h1",{class:"text-4xl font-bold text-primary-600"},"🔐 SeCu"),e("p",{class:"mt-2 text-gray-600 dark:text-gray-400"},"Mitarbeiterverwaltung")],-1)),e("div",C,[e("h2",E,g(s.value?"Registrieren":"Anmelden"),1),e("form",{onSubmit:B(S,["prevent"]),class:"space-y-4"},[e("div",null,[t[7]||(t[7]=e("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"}," Organisation ",-1)),r(e("input",{"onUpdate:modelValue":t[0]||(t[0]=l=>i.value=l),type:"text",required:"",class:"input",placeholder:"z.B. demo"},null,512),[[n,i.value]])]),e("div",null,[t[8]||(t[8]=e("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"}," E-Mail ",-1)),r(e("input",{"onUpdate:modelValue":t[1]||(t[1]=l=>o.value=l),type:"email",required:"",class:"input",placeholder:"name@firma.de"},null,512),[[n,o.value]])]),s.value?(f(),c(N,{key:0},[e("div",D,[e("div",null,[t[9]||(t[9]=e("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"}," Vorname ",-1)),r(e("input",{"onUpdate:modelValue":t[2]||(t[2]=l=>x.value=l),type:"text",required:"",class:"input"},null,512),[[n,x.value]])]),e("div",null,[t[10]||(t[10]=e("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"}," Nachname ",-1)),r(e("input",{"onUpdate:modelValue":t[3]||(t[3]=l=>y.value=l),type:"text",required:"",class:"input"},null,512),[[n,y.value]])])]),e("div",null,[t[11]||(t[11]=e("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"}," Telefon ",-1)),r(e("input",{"onUpdate:modelValue":t[4]||(t[4]=l=>b.value=l),type:"tel",class:"input",placeholder:"Optional"},null,512),[[n,b.value]])])],64)):k("",!0),e("div",null,[t[12]||(t[12]=e("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"}," Passwort ",-1)),r(e("input",{"onUpdate:modelValue":t[5]||(t[5]=l=>u.value=l),type:"password",required:"",class:"input",placeholder:s.value?"Mindestens 8 Zeichen":""},null,8,F),[[n,u.value]])]),p.value?(f(),c("div",O,g(p.value),1)):k("",!0),e("button",{type:"submit",disabled:v.value,class:"btn btn-primary w-full"},g(v.value?"Bitte warten...":s.value?"Registrieren":"Anmelden"),9,T)],32),e("div",j,[e("button",{type:"button",class:"text-sm text-primary-600 hover:text-primary-700",onClick:t[6]||(t[6]=l=>s.value=!s.value)},g(s.value?"Bereits registriert? Anmelden":"Noch kein Konto? Registrieren"),1)])])])]))}});export{L as default};
|
||||
1
dist/assets/ModulesView-BttIuruo.js
vendored
Normal file
1
dist/assets/ModulesView-BttIuruo.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{d as k,q as h,m as d,c as l,a as t,t as r,e as u,F as w,x as M,r as c,o as n,n as f}from"./index-Dox4jtA_.js";const S={class:"space-y-6"},C={key:0,class:"card bg-gradient-to-r from-primary-500 to-primary-700 text-white"},B={class:"grid grid-cols-2 md:grid-cols-4 gap-4"},V={class:"text-2xl font-bold"},z={class:"text-2xl font-bold"},A={class:"text-2xl font-bold"},F={class:"text-2xl font-bold"},D={class:"card"},E={key:0,class:"text-center py-8 text-gray-500"},L={key:1,class:"space-y-4"},N={class:"flex-1"},$={class:"flex items-center gap-2"},j={class:"font-medium text-gray-900 dark:text-white"},q={key:0,class:"badge badge-primary"},H={key:0,class:"text-sm text-gray-500 mt-1"},P=["disabled","onClick"],K=k({__name:"ModulesView",setup(G){const g=c([]),i=c(!0),o=c(null);h(async()=>{await Promise.all([b(),v()])});async function b(){i.value=!0;try{const s=await d.get("/modules/org");g.value=s.data.modules}catch(s){console.error(s)}finally{i.value=!1}}async function v(){try{const s=await d.get("/modules/developer/status");o.value=s.data}catch{console.log("Dev status not available")}}async function _(s){if(!s.is_core)try{await d.post(`/modules/${s.id}/toggle`,{enabled:!s.enabled}),s.enabled=!s.enabled}catch(e){alert(e instanceof Error?e.message:"Fehler")}}return(s,e)=>{var m,p,y,x;return n(),l("div",S,[e[6]||(e[6]=t("h1",{class:"text-2xl font-bold text-gray-900 dark:text-white"},"⚙️ Module",-1)),o.value?(n(),l("div",C,[e[4]||(e[4]=t("h2",{class:"text-lg font-semibold mb-4"},"System Status",-1)),t("div",B,[t("div",null,[e[0]||(e[0]=t("p",{class:"text-primary-100 text-sm"},"Benutzer",-1)),t("p",V,r(((m=o.value.stats)==null?void 0:m.user_count)||0),1)]),t("div",null,[e[1]||(e[1]=t("p",{class:"text-primary-100 text-sm"},"Aufträge",-1)),t("p",z,r(((p=o.value.stats)==null?void 0:p.order_count)||0),1)]),t("div",null,[e[2]||(e[2]=t("p",{class:"text-primary-100 text-sm"},"Stundenzettel",-1)),t("p",A,r(((y=o.value.stats)==null?void 0:y.timesheet_count)||0),1)]),t("div",null,[e[3]||(e[3]=t("p",{class:"text-primary-100 text-sm"},"Aktive Module",-1)),t("p",F,r(((x=o.value.stats)==null?void 0:x.enabled_modules)||0),1)])])])):u("",!0),t("div",D,[e[5]||(e[5]=t("h2",{class:"text-lg font-semibold mb-4"},"Verfügbare Module",-1)),i.value?(n(),l("div",E,"Lädt...")):(n(),l("div",L,[(n(!0),l(w,null,M(g.value,a=>(n(),l("div",{key:a.id,class:"flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg"},[t("div",N,[t("div",$,[t("h3",j,r(a.display_name),1),a.is_core?(n(),l("span",q,"Core")):u("",!0)]),a.description?(n(),l("p",H,r(a.description),1)):u("",!0)]),t("button",{disabled:a.is_core,class:f(["relative inline-flex h-6 w-11 items-center rounded-full transition-colors",a.enabled?"bg-primary-600":"bg-gray-200 dark:bg-gray-600",a.is_core?"opacity-50 cursor-not-allowed":"cursor-pointer"]),onClick:I=>_(a)},[t("span",{class:f(["inline-block h-4 w-4 transform rounded-full bg-white transition-transform",a.enabled?"translate-x-6":"translate-x-1"])},null,2)],10,P)]))),128))]))]),e[7]||(e[7]=t("div",{class:"card"},[t("h2",{class:"text-lg font-semibold mb-2"},"Hinweis"),t("p",{class:"text-gray-500 text-sm"}," Core-Module (Basis-System, Auftragsverwaltung) können nicht deaktiviert werden. Änderungen an Modulen werden sofort wirksam. ")],-1))])}}});export{K as default};
|
||||
1
dist/assets/OrderDetailView-B2j_NZNO.js
vendored
Normal file
1
dist/assets/OrderDetailView-B2j_NZNO.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{d as A,u as $,q as B,m as p,c as r,i as S,j as V,a as e,t as o,e as l,n as _,y as k,F as h,x as E,g as M,f as N,r as y,l as D,o as i,p as F}from"./index-Dox4jtA_.js";const L={key:0,class:"text-center py-12 text-gray-500"},j={key:1,class:"space-y-6"},z={class:"card"},O={class:"flex items-start justify-between"},q={class:"flex items-center gap-3"},I={class:"text-gray-500"},R={class:"text-2xl font-bold text-gray-900 dark:text-white"},Z={key:0,class:"mt-2 text-gray-600 dark:text-gray-400"},H={class:"grid grid-cols-2 md:grid-cols-4 gap-4 mt-6"},K={key:0},T={class:"font-medium"},G={key:1},J={class:"font-medium"},P={key:2},Q={class:"font-medium"},U={class:"font-medium"},W={key:0,class:"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700"},X={class:"flex flex-wrap gap-2"},Y={class:"card"},tt={key:0,class:"text-center py-4 text-gray-500"},et={key:1,class:"space-y-3"},st={class:"font-medium text-gray-900 dark:text-white"},at={class:"text-sm text-gray-500"},nt={class:"flex items-center gap-2"},rt={key:0,class:"card"},ot={class:"text-gray-600 dark:text-gray-400 whitespace-pre-wrap"},dt=A({__name:"OrderDetailView",setup(it){const c=M(),w=N(),m=$(),s=y(null),d=y([]),v=y(!0);B(async()=>{try{const n=await p.get(`/orders/${c.params.id}`);s.value=n.data.order,d.value=n.data.assignments}catch(n){console.error(n),w.push("/orders")}finally{v.value=!1}});async function u(n){try{await p.put(`/orders/${c.params.id}`,{status:n}),s.value.status=n}catch(t){alert(t instanceof Error?t.message:"Fehler")}}async function x(n){try{await p.put(`/orders/${c.params.id}/assignment`,{status:n?"confirmed":"declined"});const t=d.value.find(g=>{var a;return g.user_id===((a=m.user)==null?void 0:a.id)});t&&(t.status=n?"confirmed":"declined")}catch(t){alert(t instanceof Error?t.message:"Fehler")}}function b(n){return{draft:"Entwurf",published:"Veröffentlicht",in_progress:"In Bearbeitung",completed:"Abgeschlossen",cancelled:"Abgesagt",pending:"Ausstehend",confirmed:"Bestätigt",declined:"Abgelehnt"}[n]||n}return(n,t)=>{const g=D("router-link");return v.value?(i(),r("div",L,"Lädt...")):s.value?(i(),r("div",j,[S(g,{to:"/orders",class:"text-primary-600 hover:text-primary-700 text-sm"},{default:V(()=>[...t[6]||(t[6]=[F(" ← Zurück zu Aufträge ",-1)])]),_:1}),e("div",z,[e("div",O,[e("div",null,[e("div",q,[e("span",I,"#"+o(s.value.number),1),e("h1",R,o(s.value.title),1)]),s.value.description?(i(),r("p",Z,o(s.value.description),1)):l("",!0)]),e("span",{class:_(["badge",s.value.status==="completed"?"badge-success":"badge-primary"])},o(b(s.value.status)),3)]),e("div",H,[s.value.location?(i(),r("div",K,[t[7]||(t[7]=e("p",{class:"text-sm text-gray-500"},"Ort",-1)),e("p",T,"📍 "+o(s.value.location),1)])):l("",!0),s.value.start_time?(i(),r("div",G,[t[8]||(t[8]=e("p",{class:"text-sm text-gray-500"},"Start",-1)),e("p",J,o(new Date(s.value.start_time).toLocaleString("de-DE")),1)])):l("",!0),s.value.client_name?(i(),r("div",P,[t[9]||(t[9]=e("p",{class:"text-sm text-gray-500"},"Kunde",-1)),e("p",Q,o(s.value.client_name),1)])):l("",!0),e("div",null,[t[10]||(t[10]=e("p",{class:"text-sm text-gray-500"},"Benötigte MA",-1)),e("p",U,o(d.value.length)+"/"+o(s.value.required_staff),1)])]),k(m).canManageOrders?(i(),r("div",W,[t[11]||(t[11]=e("p",{class:"text-sm text-gray-500 mb-2"},"Status ändern:",-1)),e("div",X,[e("button",{class:"btn btn-secondary text-sm",onClick:t[0]||(t[0]=a=>u("draft"))},"Entwurf"),e("button",{class:"btn btn-primary text-sm",onClick:t[1]||(t[1]=a=>u("published"))},"Veröffentlichen"),e("button",{class:"btn btn-warning text-sm",onClick:t[2]||(t[2]=a=>u("in_progress"))},"In Bearbeitung"),e("button",{class:"btn btn-success text-sm",onClick:t[3]||(t[3]=a=>u("completed"))},"Abschließen")])])):l("",!0)]),e("div",Y,[t[12]||(t[12]=e("h2",{class:"text-lg font-semibold text-gray-900 dark:text-white mb-4"}," 👥 Zugewiesene Mitarbeiter ",-1)),d.value.length===0?(i(),r("div",tt," Noch keine Mitarbeiter zugewiesen ")):(i(),r("div",et,[(i(!0),r(h,null,E(d.value,a=>{var f;return i(),r("div",{key:a.id,class:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-700/50 rounded-lg"},[e("div",null,[e("p",st,o(a.user_name),1),e("p",at,o(a.user_phone),1)]),e("div",nt,[e("span",{class:_(["badge",a.status==="confirmed"?"badge-success":a.status==="declined"?"badge-danger":"badge-warning"])},o(b(a.status)),3),a.user_id===((f=k(m).user)==null?void 0:f.id)&&a.status==="pending"?(i(),r(h,{key:0},[e("button",{class:"btn btn-success text-sm",onClick:t[4]||(t[4]=C=>x(!0))},"✓"),e("button",{class:"btn btn-danger text-sm",onClick:t[5]||(t[5]=C=>x(!1))},"✗")],64)):l("",!0)])])}),128))]))]),s.value.special_instructions?(i(),r("div",rt,[t[13]||(t[13]=e("h2",{class:"text-lg font-semibold text-gray-900 dark:text-white mb-2"}," 📝 Besondere Hinweise ",-1)),e("p",ot,o(s.value.special_instructions),1)])):l("",!0)])):l("",!0)}}});export{dt as default};
|
||||
1
dist/assets/OrdersView-BVBJaCj6.js
vendored
Normal file
1
dist/assets/OrdersView-BVBJaCj6.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/PartnershipsView-VpZWV3sV.js
vendored
Normal file
1
dist/assets/PartnershipsView-VpZWV3sV.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/RegisterOrgView-Cm_uvfRR.js
vendored
Normal file
1
dist/assets/RegisterOrgView-Cm_uvfRR.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/SettingsView-CiueANf-.js
vendored
Normal file
1
dist/assets/SettingsView-CiueANf-.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{d as k,u as h,c as p,a as e,t as a,y as b,w as S,b as c,v as f,e as y,r as o,o as w,m as V}from"./index-Dox4jtA_.js";const N={class:"space-y-6"},E={class:"card"},_={class:"grid grid-cols-2 gap-4"},q={class:"font-medium"},B={class:"font-medium"},M={class:"font-medium capitalize"},U={class:"card"},A={key:0,class:"text-red-600 text-sm"},C={key:1,class:"text-green-600 text-sm"},D=["disabled"],R=k({__name:"SettingsView",setup(z){const m=h(),r=o(""),t=o(""),i=o(""),u=o(!1),d=o(""),l=o("");async function P(){if(t.value!==i.value){l.value="Passwörter stimmen nicht überein";return}if(t.value.length<8){l.value="Passwort muss mindestens 8 Zeichen haben";return}u.value=!0,l.value="",d.value="";try{await V.post("/auth/change-password",{currentPassword:r.value,newPassword:t.value}),d.value="Passwort erfolgreich geändert",r.value="",t.value="",i.value=""}catch(v){l.value=v instanceof Error?v.message:"Fehler beim Ändern"}finally{u.value=!1}}return(v,s)=>{var x,g;return w(),p("div",N,[s[11]||(s[11]=e("h1",{class:"text-2xl font-bold text-gray-900 dark:text-white"},"🔧 Einstellungen",-1)),e("div",E,[s[6]||(s[6]=e("h2",{class:"text-lg font-semibold mb-4"},"Profil",-1)),e("div",_,[e("div",null,[s[3]||(s[3]=e("label",{class:"block text-sm text-gray-500"},"Name",-1)),e("p",q,a(b(m).fullName),1)]),e("div",null,[s[4]||(s[4]=e("label",{class:"block text-sm text-gray-500"},"E-Mail",-1)),e("p",B,a((x=b(m).user)==null?void 0:x.email),1)]),e("div",null,[s[5]||(s[5]=e("label",{class:"block text-sm text-gray-500"},"Rolle",-1)),e("p",M,a((g=b(m).user)==null?void 0:g.role),1)])])]),e("div",U,[s[10]||(s[10]=e("h2",{class:"text-lg font-semibold mb-4"},"Passwort ändern",-1)),e("form",{onSubmit:S(P,["prevent"]),class:"space-y-4 max-w-md"},[e("div",null,[s[7]||(s[7]=e("label",{class:"block text-sm font-medium mb-1"},"Aktuelles Passwort",-1)),c(e("input",{"onUpdate:modelValue":s[0]||(s[0]=n=>r.value=n),type:"password",required:"",class:"input"},null,512),[[f,r.value]])]),e("div",null,[s[8]||(s[8]=e("label",{class:"block text-sm font-medium mb-1"},"Neues Passwort",-1)),c(e("input",{"onUpdate:modelValue":s[1]||(s[1]=n=>t.value=n),type:"password",required:"",class:"input"},null,512),[[f,t.value]])]),e("div",null,[s[9]||(s[9]=e("label",{class:"block text-sm font-medium mb-1"},"Passwort bestätigen",-1)),c(e("input",{"onUpdate:modelValue":s[2]||(s[2]=n=>i.value=n),type:"password",required:"",class:"input"},null,512),[[f,i.value]])]),l.value?(w(),p("div",A,a(l.value),1)):y("",!0),d.value?(w(),p("div",C,a(d.value),1)):y("",!0),e("button",{type:"submit",disabled:u.value,class:"btn btn-primary"},a(u.value?"Speichern...":"Passwort ändern"),9,D)],32)])])}}});export{R as default};
|
||||
1
dist/assets/TimesheetsView-DD5Ozo6b.js
vendored
Normal file
1
dist/assets/TimesheetsView-DD5Ozo6b.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{d as A,u as M,q as T,m,c as a,a as s,F as y,x as w,w as D,b as p,v as _,s as E,e as i,r as d,o as r,t as l,p as U,y as h,n as z}from"./index-Dox4jtA_.js";const N={class:"space-y-6"},$={class:"flex items-center justify-between"},B={class:"card"},F={key:0,class:"text-center py-8 text-gray-500"},L={key:1,class:"text-center py-8 text-gray-500"},q={key:2,class:"space-y-3"},K={class:"font-medium"},G={class:"text-sm text-gray-500"},O={key:0},P={key:0,class:"text-sm text-gray-500"},H={key:1,class:"text-sm text-gray-500"},I={class:"flex items-center gap-2"},J=["onClick"],Q=["onClick"],R={key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/50"},W={class:"card w-full max-w-md m-4"},X={class:"grid grid-cols-2 gap-4"},Y=["value"],Z={class:"flex justify-end gap-3 pt-4"},se=A({__name:"TimesheetsView",setup(ee){const f=M(),v=d([]),b=d(!0),u=d(!1),o=d({work_date:"",start_time:"",end_time:"",order_id:""}),x=d([]);T(async()=>{await Promise.all([g(),S()])});async function g(){b.value=!0;try{const n=await m.get("/timesheets");v.value=n.data.timesheets}catch(n){console.error(n)}finally{b.value=!1}}async function S(){try{const n=await m.get("/orders");x.value=n.data.orders}catch(n){console.error(n)}}async function j(){try{await m.post("/timesheets",o.value),u.value=!1,o.value={work_date:"",start_time:"",end_time:"",order_id:""},await g()}catch(n){alert(n instanceof Error?n.message:"Fehler")}}async function k(n,e){const t=e==="rejected"?prompt("Ablehnungsgrund:"):null;if(!(e==="rejected"&&!t))try{await m.post(`/timesheets/${n}/review`,{status:e,rejection_reason:t}),await g()}catch(c){alert(c instanceof Error?c.message:"Fehler")}}function C(n){return{pending:"badge-warning",approved:"badge-success",rejected:"badge-danger"}[n]||""}function V(n){return{pending:"Ausstehend",approved:"Genehmigt",rejected:"Abgelehnt"}[n]||n}return(n,e)=>(r(),a("div",N,[s("div",$,[e[6]||(e[6]=s("h1",{class:"text-2xl font-bold text-gray-900 dark:text-white"},"⏱️ Stundenzettel",-1)),s("button",{class:"btn btn-primary",onClick:e[0]||(e[0]=t=>u.value=!0)},"+ Neu")]),s("div",B,[b.value?(r(),a("div",F,"Lädt...")):v.value.length===0?(r(),a("div",L,"Keine Stundenzettel")):(r(),a("div",q,[(r(!0),a(y,null,w(v.value,t=>(r(),a("div",{key:t.id,class:"flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg"},[s("div",null,[s("p",K,l(new Date(t.work_date).toLocaleDateString("de-DE")),1),s("p",G,[U(l(t.start_time)+" - "+l(t.end_time)+" ",1),t.hours_worked?(r(),a("span",O,"("+l(t.hours_worked)+"h)",1)):i("",!0)]),t.order_title?(r(),a("p",P,"📋 "+l(t.order_title),1)):i("",!0),h(f).canManageUsers?(r(),a("p",H,"👤 "+l(t.user_name),1)):i("",!0)]),s("div",I,[s("span",{class:z(["badge",C(t.status)])},l(V(t.status)),3),h(f).canManageUsers&&t.status==="pending"?(r(),a(y,{key:0},[s("button",{class:"btn btn-success text-sm",onClick:c=>k(t.id,"approved")},"✓",8,J),s("button",{class:"btn btn-danger text-sm",onClick:c=>k(t.id,"rejected")},"✗",8,Q)],64)):i("",!0)])]))),128))]))]),u.value?(r(),a("div",R,[s("div",W,[e[13]||(e[13]=s("h2",{class:"text-xl font-semibold mb-6"},"Neuer Stundenzettel",-1)),s("form",{onSubmit:D(j,["prevent"]),class:"space-y-4"},[s("div",null,[e[7]||(e[7]=s("label",{class:"block text-sm font-medium mb-1"},"Datum *",-1)),p(s("input",{"onUpdate:modelValue":e[1]||(e[1]=t=>o.value.work_date=t),type:"date",required:"",class:"input"},null,512),[[_,o.value.work_date]])]),s("div",X,[s("div",null,[e[8]||(e[8]=s("label",{class:"block text-sm font-medium mb-1"},"Start",-1)),p(s("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.value.start_time=t),type:"time",class:"input"},null,512),[[_,o.value.start_time]])]),s("div",null,[e[9]||(e[9]=s("label",{class:"block text-sm font-medium mb-1"},"Ende",-1)),p(s("input",{"onUpdate:modelValue":e[3]||(e[3]=t=>o.value.end_time=t),type:"time",class:"input"},null,512),[[_,o.value.end_time]])])]),s("div",null,[e[11]||(e[11]=s("label",{class:"block text-sm font-medium mb-1"},"Auftrag",-1)),p(s("select",{"onUpdate:modelValue":e[4]||(e[4]=t=>o.value.order_id=t),class:"input"},[e[10]||(e[10]=s("option",{value:""},"-- Kein Auftrag --",-1)),(r(!0),a(y,null,w(x.value,t=>(r(),a("option",{key:t.id,value:t.id},"#"+l(t.number)+" - "+l(t.title),9,Y))),128))],512),[[E,o.value.order_id]])]),s("div",Z,[s("button",{type:"button",class:"btn btn-secondary",onClick:e[5]||(e[5]=t=>u.value=!1)},"Abbrechen"),e[12]||(e[12]=s("button",{type:"submit",class:"btn btn-primary"},"Einreichen",-1))])],32)])])):i("",!0)]))}});export{se as default};
|
||||
1
dist/assets/UsersView-BzAufK3M.js
vendored
Normal file
1
dist/assets/UsersView-BzAufK3M.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{d as C,u as U,q as V,m,c as n,a as e,F as E,x as N,w as S,b as o,v as d,y as x,s as q,e as y,r as b,o as i,t as r,n as k}from"./index-Dox4jtA_.js";const A={class:"space-y-6"},D={class:"flex items-center justify-between"},$={class:"card"},B={key:0,class:"text-center py-8 text-gray-500"},F={key:1,class:"text-center py-8 text-gray-500"},R={key:2,class:"w-full"},j={class:"py-3 font-medium"},L={class:"py-3 text-gray-500"},z={class:"py-3"},T={class:"py-3"},I={class:"py-3 text-right"},K=["onClick"],P={key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/50"},G={class:"card w-full max-w-md m-4"},H={class:"grid grid-cols-2 gap-4"},J={key:0},O={class:"flex justify-end gap-3 pt-4"},Y=C({__name:"UsersView",setup(Q){const f=U(),p=b([]),c=b(!0),u=b(!1),l=b({email:"",password:"",first_name:"",last_name:"",phone:"",role:"mitarbeiter"});V(async()=>{await v()});async function v(){c.value=!0;try{const a=await m.get("/users");p.value=a.data.users}catch(a){console.error(a)}finally{c.value=!1}}async function w(){try{await m.post("/users",l.value),u.value=!1,l.value={email:"",password:"",first_name:"",last_name:"",phone:"",role:"mitarbeiter"},await v()}catch(a){alert(a instanceof Error?a.message:"Fehler beim Erstellen")}}async function _(a){try{a.active?await m.delete(`/users/${a.id}`):await m.put(`/users/${a.id}`,{active:!0}),await v()}catch(t){alert(t instanceof Error?t.message:"Fehler")}}function h(a){return{chef:"badge-danger",disponent:"badge-primary",mitarbeiter:"badge-success"}[a]||"badge-secondary"}function M(a){return{chef:"Chef",disponent:"Disponent",mitarbeiter:"Mitarbeiter"}[a]||a}return(a,t)=>(i(),n("div",A,[e("div",D,[t[8]||(t[8]=e("h1",{class:"text-2xl font-bold text-gray-900 dark:text-white"},"👥 Mitarbeiter",-1)),e("button",{class:"btn btn-primary",onClick:t[0]||(t[0]=s=>u.value=!0)},"+ Neu")]),e("div",$,[c.value?(i(),n("div",B,"Lädt...")):p.value.length===0?(i(),n("div",F,"Keine Mitarbeiter")):(i(),n("table",R,[t[9]||(t[9]=e("thead",null,[e("tr",{class:"text-left text-sm text-gray-500 border-b border-gray-200 dark:border-gray-700"},[e("th",{class:"pb-3"},"Name"),e("th",{class:"pb-3"},"E-Mail"),e("th",{class:"pb-3"},"Rolle"),e("th",{class:"pb-3"},"Status"),e("th",{class:"pb-3"})])],-1)),e("tbody",null,[(i(!0),n(E,null,N(p.value,s=>{var g;return i(),n("tr",{key:s.id,class:"border-b border-gray-100 dark:border-gray-800"},[e("td",j,r(s.first_name)+" "+r(s.last_name),1),e("td",L,r(s.email),1),e("td",z,[e("span",{class:k(["badge",h(s.role)])},r(M(s.role)),3)]),e("td",T,[e("span",{class:k(s.active?"text-green-600":"text-red-600")},r(s.active?"Aktiv":"Inaktiv"),3)]),e("td",I,[s.id!==((g=x(f).user)==null?void 0:g.id)&&s.role!=="chef"?(i(),n("button",{key:0,class:"text-sm text-gray-500 hover:text-red-600",onClick:W=>_(s)},r(s.active?"Deaktivieren":"Aktivieren"),9,K)):y("",!0)])])}),128))])]))]),u.value?(i(),n("div",P,[e("div",G,[t[18]||(t[18]=e("h2",{class:"text-xl font-semibold mb-6"},"Neuer Mitarbeiter",-1)),e("form",{onSubmit:S(w,["prevent"]),class:"space-y-4"},[e("div",H,[e("div",null,[t[10]||(t[10]=e("label",{class:"block text-sm font-medium mb-1"},"Vorname *",-1)),o(e("input",{"onUpdate:modelValue":t[1]||(t[1]=s=>l.value.first_name=s),type:"text",required:"",class:"input"},null,512),[[d,l.value.first_name]])]),e("div",null,[t[11]||(t[11]=e("label",{class:"block text-sm font-medium mb-1"},"Nachname *",-1)),o(e("input",{"onUpdate:modelValue":t[2]||(t[2]=s=>l.value.last_name=s),type:"text",required:"",class:"input"},null,512),[[d,l.value.last_name]])])]),e("div",null,[t[12]||(t[12]=e("label",{class:"block text-sm font-medium mb-1"},"E-Mail *",-1)),o(e("input",{"onUpdate:modelValue":t[3]||(t[3]=s=>l.value.email=s),type:"email",required:"",class:"input"},null,512),[[d,l.value.email]])]),e("div",null,[t[13]||(t[13]=e("label",{class:"block text-sm font-medium mb-1"},"Passwort *",-1)),o(e("input",{"onUpdate:modelValue":t[4]||(t[4]=s=>l.value.password=s),type:"password",required:"",class:"input"},null,512),[[d,l.value.password]])]),e("div",null,[t[14]||(t[14]=e("label",{class:"block text-sm font-medium mb-1"},"Telefon",-1)),o(e("input",{"onUpdate:modelValue":t[5]||(t[5]=s=>l.value.phone=s),type:"tel",class:"input"},null,512),[[d,l.value.phone]])]),x(f).isChef?(i(),n("div",J,[t[16]||(t[16]=e("label",{class:"block text-sm font-medium mb-1"},"Rolle",-1)),o(e("select",{"onUpdate:modelValue":t[6]||(t[6]=s=>l.value.role=s),class:"input"},[...t[15]||(t[15]=[e("option",{value:"mitarbeiter"},"Mitarbeiter",-1),e("option",{value:"disponent"},"Disponent",-1)])],512),[[q,l.value.role]])])):y("",!0),e("div",O,[e("button",{type:"button",class:"btn btn-secondary",onClick:t[7]||(t[7]=s=>u.value=!1)},"Abbrechen"),t[17]||(t[17]=e("button",{type:"submit",class:"btn btn-primary"},"Erstellen",-1))])],32)])])):y("",!0)]))}});export{Y as default};
|
||||
1
dist/assets/index-DjccJ3o_.css
vendored
Normal file
1
dist/assets/index-DjccJ3o_.css
vendored
Normal file
File diff suppressed because one or more lines are too long
29
dist/assets/index-Dox4jtA_.js
vendored
Normal file
29
dist/assets/index-Dox4jtA_.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user