Ermöglicht ein Live-Binding der Eingabewerte, damit Eingaben bei einem
Redraw (z.B. durch interaktive Elemente außerhalb des Inputs) nicht
verloren gehen.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Parent-Tags (is_parent=true) dienen als Gruppierungsknoten und können nicht
Gesprächsnotizen zugeordnet werden. Echte Tags (is_parent=false) sind
zuordenbar. Die Bearbeitungsmaske bietet eine Checkbox für das Flag, die
Eltern-Auswahl ist auf Parent-Tags beschränkt. Die Tag-Liste zeigt
Parent-Tags mit Folder-Icon, echte Tags mit Label-Icon. Die Suche filtert
den gesamten Teilbaum — nur Knoten mit Self-Match oder einem matchenden
Nachfahren werden angezeigt.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Der filter-Callback wird jetzt auch auf Kind-Knoten angewendet, nicht nur auf Top-Level-Nodes. Dadurch lässt sich bei hierarchischen Daten (z.B. Tag-Baum) die Suche auf den gesamten Teilbaum verfeinern — nur Knoten, die selbst matchen oder einen matchenden Nachfahren haben, werden gerendert.
Abwärtskompatibel: Aufrufer ohne filter-Attribut sind unaffected.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Dedizierte loggedout-Komponente für die Abmeldebestätigung und
Redirect um 1 Sekunde verzögert, damit die Meldung sichtbar bleibt.
Default-Route auf /kundenliste korrigiert.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Menü: Dropdown "Projekt-Berechtigungen" unter Optionen mit
Unterpunkten "Projekt-Zugriffe" und "Nutzer-Zugriffe" (nur SysAdmin/AppAdmin)
- AppAdmin-Erkennung: Server liefert isAppAdmin-Flag im Login- und
getusers-Response (applikationsspezifisch via has_permission)
- Login: CurrentUserIsAppAdmin in sessionStorage speichern/entfernen
- Projekt-Zugriffe: geschachtelter Treetable (Projekt → Nutzer) als
reine Anzeige, Detail-Sicht aus Projekt-Maske mit Bearbeitung
- Nutzer-Zugriffe: neue Komponente user_projektliste.ts, geschachtelter
Treetable (Nutzer → Projekte), reine Anzeige
- Server: neuer Endpunkt GET /xhr/projektuser/listall (nur AppAdmin/SysAdmin)
- Server: get_all_projekt_users() mit Batch-Query für Projekte und User
- Treetable-Widget: Platzhalter-Pfeil bei kinderlosen Nodes nur wenn
Geschwister mit Kindern existieren (hasSiblingsWithChildren)
- Datei projekt_user.ts umbenannt in projekt_userliste.ts (konsistent
mit user_projektliste.ts)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Modal von Einzelauswahl (Select) auf Mehrfachauswahl mit Checkboxen umgestellt
- Nutzerliste sortiert nach username, scrollbar (eine Zeile pro Nutzer)
- SysAdmin und AppAdmin aus der Auswahlliste ausgeblendet (immer Zugriff)
- Bereits zugeordnete Nutzer ausgeblendet
- Fehleranzeige bei fehlender Rolle: closeModal im catch entfernt,
sodass showServerError nicht sofort überschrieben wird
- AutorisationError: Meldung "Erforderliche Rollen" nur bei nicht-leerer
allowed_roles-Liste (entfällt bei @authorisation_required([]))
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Neues Modell ProjektUser (projekt_users) für projektbezogene Sichtbarkeit
- Migration V01_09 legt Tabelle an (keine Initial-Befüllung)
- CRUD-Logik für Projekt-User-Zuordnungen mit Cross-DB-User-Auflösung
- Serverseitige Sichtbarkeits-Filterung: Projekt-Liste/Get filtert nach
projekt_users-Zuordnung für Nicht-SysAdmin/Nicht-AppAdmin
- Auto-Assignment: Ersteller wird bei Projektanlage automatisch zugeordnet
- Sichtbarkeits-Filterung auf CallLog und Kontaktadresse erweitert
(Liste und Einzelabruf)
- Schreibschutz: Alle Schreib-Endpunkte (update/delete) für Projekt,
Kontaktadresse und CallLog prüfen Projekt-Zuordnung vor der Ausführung
- Hilfsfunktionen _get_visible_user_id() und _require_projekt_access()
zur Kapselung der wiederkehrenden Prüfungen
- REST-Endpunkte /xhr/projektuser/{list,add,remove};
Schreib-Endpunkte mit @authorisation_required([]) als Erweiterungspunkt
- Client: Neues Modell projekt_user.ts, Listen-Komponente mit Modal
(Select-Widget), Button in Projekt-Maske, Route registriert
- Build aktualisiert (tsc + rollup)
- AGENTS.md: Vorgaben für projektbezogene Sichtbarkeit dokumentiert
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Alle m.request-Aufrufe in den CRM-Komponenten (kunde, kontakt, projekt,
kontaktadresse, call_log) erhalten .catch(showServerError), sodass
Serverfehler wie 401 (fehlende Autorisierung) dem Nutzer als Modal
angezeigt werden. Die Navigation bleibt im .then-Zweig, damit sie bei
Fehler nicht ausgeführt wird. AGENTS.md erhält die entsprechende
Konvention für zukünftige REST-Aufrufe.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Modelle: startdatum (Projekt), datum und wiedervorlage_datum (CallLog)
von String(20) auf Date umgestellt. columns2dict serialisiert diese nun
über isoformat() als yyyy-MM-dd. Die String-Normalisierung in
columns2dict wurde entfernt, da sie nicht mehr benötigt wird.
Migration V01.08: Normalisiert bestehende String-Datumswerte (z.B.
'2026-08-3') auf ISO-Format yyyy-MM-dd mittels printf/substr, da
SQLite's date() einstellige Komponenten nicht erkennt. Leere Strings
werden zu NULL. V01.07 ist Platzhalter für die fehlgeschlagene V01.06.
Client: toDateInputValue normalisiert ebenfalls String-Datumswerte
als Fallback für Route-Params (Neuanlage).
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Server: Die list-Endpunkte für Kontakt, Projekt, Kontaktadresse und CallLog
akzeptieren nun einen optionalen Query-Parameter (kunden_id bzw. projekt_id)
und filtern im ORM-Query. Neue Migration V01.05 legt Indizes auf den
FK-Spalten an.
Client: Die fetch-Funktionen erhalten einen optionalen Parent-ID-Parameter.
Die Listen-Komponenten übergeben die Parent-ID aus den Route-Params an den
Server und laden nur noch benötigte Daten. Statt kompletter Eltern-Listen
wird per fetchXxxById ein einzelner Datensatz für die Namensauflösung geladen.
Die CallLog-Bearbeitungsmaske behält ihre ungesfilterten Dropdown-Abrufe.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Server: Neue Spalte position in Kontaktadresse-Modell (String(200), nullable)
- Server: Migration V01_04 (ALTER TABLE kontaktadressen ADD COLUMN position)
- Server: position in Geschäftslogik create/update aufgenommen
- Server: CLI-Musterdaten um Position ergänzt (Geschäftsführer, IT-Leiter etc.)
- Client: position in iKontaktadresse-Interface, View nach Firma, Columnmapper, Filter
- Client: Projektnamen-Spalte aus Kontaktadressenliste entfernt (steht in Überschrift)
- Client: Filter-Funktionen in allen Listen null-sicher (kunde, kontakt, projekt, kontaktadresse, call_log)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
In-Memory-Datenhaltung (kundenDaten, getNewKundeId, addKunde, updateKunde,
getKunden) aus kunde.ts entfernt. Die Kundenliste und das Formular nutzen
jetzt fetchKunden/createKundeREST/updateKundeREST asynchron vom Server.
projekt.ts, kontakt.ts, call_log.ts: getKunden() durch asynchrones
fetchKunden() im oninit ersetzt, Kundenliste im Closure-State gehalten.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
In kundenliste, projektliste und Gesprächsnotizenliste haben die edit-Buttons
bzw. die Projekte-Anzeigen-Buttons bisher keinen Tooltip gehabt. Jetzt sind
alle Aktions-Buttons einheitlich mit title-Attribut versehen.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Im Call-Log-Formular wird "Name Ansprechpartner" durch ein Select ersetzt,
das die Kontaktadressen des gewählten Projekts anbietet, sofern der Name nicht
bereits voreingestellt ist (z. B. aus der Kontaktadressenliste). Bei Auswahl
einer Kontaktadresse werden Name und Telefon automatisch übernommen. Bei
Projektwechsel werden Ansprechpartner und Telefon zurückgesetzt.
Kontaktadressenliste: add_call-Button pro Zeile, der eine Gesprächsnotiz mit
den ForeignKeys aus der Kontaktadresse (projektId, kundenName, name, telefon)
anlegt.
AGENTS.md: Vorgabe ergänzt — Farben priorisiert aus app-theme.css.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Alle App-Listen (kundenliste, call_log_liste, kontaktliste, kontaktadresseliste,
TagList) auf das isSelected-Callback der Treetable umgestellt — die Markierung
erfolgt jetzt auf der gesamten <tr>-Zeile via w3-theme-l4 statt per-Zell-Inline-Style.
In der kundenliste sind die 3 Aktions-Buttons (edit, Projekte, Kontakte) kompakt
in einer Zelle zusammengefasst, analog zur projektliste. Auth-Listen unberührt.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Neue Entität "Kontaktadresse" (Akquise-Ziel, FK projektId) analog zu Kontakten:
- Client/models/kontaktadresse.ts: Interface, In-Memory-Mock, CRUD- und REST-Stubs
- Client/Components/kontaktadresse.ts: Kontaktadressenliste (Treetable, projektgefiltert) und Stammblatt-Formular
- index.ts: Routen /kontaktadresseliste und /kontaktadresse (kein Hauptmenü-Eintrag)
- projekt.ts: Kontaktadressen-Button in Projektliste (kompakt in einer Zelle) und im Projekt-Formular (nur bei bestehendem Projekt)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Die Treetable unterstützt nun ein optionales isSelected-Callback (iTreetable.isSelected),
mit dem die Hintergrund-Einfärbung der gesamten <tr>-Zeile gesteuert werden kann. Bisher
musste jede Zelle einzeln über den columnmapper gestylt werden. Die Markierung verwendet
die w3-theme-l4-Klasse statt einer festen Farbe.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Neue Entität "Kontakt" (Ansprechpartner, FK kundenId) analog zu Projekte:
- Client/models/kontakt.ts: Interface, In-Memory-Mock, CRUD- und REST-Stubs
- Client/Components/kontakt.ts: Kontaktliste (Treetable, kundengefiltert) und Stammblatt-Formular
- index.ts: Routen /kontaktliste und /kontakt (kein Hauptmenü-Eintrag)
- kunde.ts: Kontakte-Button in Kundenliste und im Kunden-Formular (nur bei bestehendem Kunden)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Datum, Uhrzeit Beginn und Dauer nebeneinander in einem flex-Container;
Name Ansprechpartner und Telefon ebenfalls in einer Zeile. Macht das
Formular kompakter und übersichtlicher.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Form-Widget um stickyButtons-Attribut erweitert (default true): nur der
Formularinhalt scrollt, die Buttons bleiben fixiert am unteren Rand. Neue
CSS-Klasse .form-view-container (flex-Column, volle Höhe) für die
umschließenden View-Container. Form-Views (kunde, projekt, call_log, tags)
auf w3-auto.form-view-container umgestellt; Tag-Form von w3-twothird auf
w3-auto korrigiert.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Notiz-Feld auf Textarea-Widget umgestellt (mehrzeilige Eingabe). Dauer-Feld
bei Neuanlage mit Timer automatisch aktualisiert: verstrichene Sekunden als
mm:ss formatiert, direkt im DOM gesetzt (ohne redraw, damit andere Felder
nicht überschrieben werden). Timer in onremove gestoppt. Konstante
DAUER_UPDATE_INTERVALL steuert die Update-Frequenz (Sekunde/Minute).
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Datenmodell und In-Memory-Funktionen für Gesprächsnotizen in
Client/models/call_log.ts ausgelagert (inkl. REST-API-Gerüst). call_log.ts
nutzt das Modell; Container auf w3-container.w3-auto umgestellt.
Call_Log-Formular mit Select-Widgets für Kunde und Projekt (Projekt-Optionen
abhängig vom gewählten Kunden, Voreinstellung readonly bei projektfiltrierter
Liste). call_log_liste: TopbarButton zur Neuanlage, Vorbelegung bei
projektgefilterter Liste. projekt-Modell um Hilfsfunktion getProjektById ergänzt.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Select auf sauberes ClosureComponent-Muster umgestellt (Closure-Parameter
weggelassen, attrs nur über Hook-vnode gelesen). Auswahl per Maus über
mousedown umgestellt, damit das Dropdown zuverlässig geschlossen wird.
Zusätzlich Clear-Button (Material-Icon "clear") im Eingabefeld, absolut
positioniert und vertikal zentriert, leert das Suchfeld. readonly-Modus
unterstützt.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Kunden- und Projekt-Datenmodelle inkl. In-Memory-Funktionen und REST-API-Gerüst
in Client/models/{kunde,projekt}.ts ausgelagert. Views (kunde.ts, projekt.ts) nutzen
diese Modelle; Container auf w3-container.w3-auto (responsive) umgestellt.
Projektliste: TopbarButton zur Neuanlage; Projektformular mit Select-Widget zur
Kundenwahl (voreingestellt bei kundengefilterter Liste), submit/cancel aktiviert.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Erzeugt ein Combobox-Widget (widgets/select.ts) mit Suchfeld, gefilterter
Optionliste, Maus-Auswahl und Tastaturbedienung (Pfeil-auf/ab, Enter,
Escape). Verstecktes Feld für die FormData-Übergabe, readonly-Modus für
voreingestellte Werte.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- call_log.ts: Komponente zur Verwaltung von Gesprächsnotizen mit Liste und Einzelansicht
- tags.ts: Komponente zur hierarchischen Tag-Verwaltung mit Baumstruktur