Kabelrechner-Auswahl nutzt jetzt Name|kg/m, da gleiche kg/m bei verschiedenen Typen vorkommen.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Der Popup-basierte Login/Logout und die stille Token-Erneuerung per
Hintergrund-iFrame sind in installierten PWAs auf iOS/Android unzuverlässig -
Popups werden blockiert oder verlieren die Verbindung zum öffnenden Fenster,
und iOS' ITP blockiert oft den iFrame-Speicherzugriff für die stille
Erneuerung. Das zwang Monteure am Handy/Tablet zu ständigen Neuanmeldungen,
während es am PC funktionierte. Login/Logout laufen jetzt über einen vollen
Redirect, scheiternde stille Token-Erneuerung fällt sauber auf einen Redirect
zurück statt mit einem Fehler abzubrechen, und storeAuthStateInCookie ist
aktiviert (Microsofts eigene Empfehlung für Safari/iOS).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Login-Logo war im hellen Modus weiß-auf-weiß unsichtbar (Karte wechselt mit
dem Theme, Logo war hart auf die dunkle Variante codiert) - zeigt jetzt je
nach Theme die passende Logo-Tinte, gleiches Problem beim "Willkommen"-Titel
behoben. PDF-Export verlor den schwarzen Banner beim Drucken, da Browser
Hintergrundfarben standardmäßig nicht drucken - jetzt über
print-color-adjust erzwungen.
Export ist jetzt eine echte .xlsm-Datei statt CSV, mit Spaltenlayout 1:1 aus
einem echten VenDoc-Aufmaßblatt-Export des Nutzers übernommen (Blatt
"Aufmaß", Position/Aufmaß/EH/Positionstext in den exakt gleichen Spalten).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Monteur ist jetzt ein Dropdown (Michael/Daniel/Dietmar/Fidelis) mit freiem
Textfeld für "Andere". CSV-Export nutzt jetzt VenDocs eigene Spaltennamen
(Position/EH/Positionstext/Aufmaß), ermittelt aus einem echten VenDoc-
Aufmaßblatt-Export des Nutzers; Art.-Nr. wird wie dort im Positionstext
eingebettet, da VenDoc keine eigene Artikelnummer-Spalte führt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Abgeschlossene Materialscheine können jetzt gelöscht werden (serverseitig
auf Status=Abgeschlossen beschränkt, mit Bestätigungsdialog). Neues Feld
Auftrags-Nr. am Projekt für die Zuordnung zum VenDoc-Auftrag. Neuer CSV-Export
(Semikolon, Komma-Dezimal, UTF-8 BOM) als Positionstabelle für den Import ins
ERP.
Echtes Firmenlogo (2 WhatsApp-Dateien vom Nutzer) per Farbschlüssel-
Freistellung (PowerShell/System.Drawing) in echte transparente PNGs
umgewandelt und zugeschnitten: bergvolt-logo-dark.png (weiß/cyan, für
dunklen Hintergrund) und bergvolt-logo-light.png (schwarz/cyan, für hellen
Hintergrund - aktuell noch ungenutzt, da Header/Login/Druckbanner bewusst
immer dunkel bleiben, aber für später mit im Repo).
Ersetzt die nachgebaute Text-Version in Header, Login-Screen und
Druck-Banner durch <img> mit dem echten Logo.
Temporärer test-build-only.yml Workflow zur Verifikation ohne Registry-Push.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
.proj-name, .detail-title und die mobile Karten-Bezeichnung (.td-bez) hatten
color:#fff fix codiert statt var(--text) - auf dunklem Grund unsichtbar
unproblematisch, im neuen Hell-Modus aber weiße Schrift auf weißer Karte.
Zusätzlich die native <select>-Options-Liste (label.field select option) auf
Hell umgestellt, war sonst dunkler Hintergrund mit jetzt ebenfalls dunklem
(unlesbarem) Text.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neues client/src/lib/theme.ts verwaltet die Wahl (system/light/dark) in
localStorage. Umschalter-Button im Header (zyklisch: System -> Hell -> Dunkel),
Icon zeigt den aktuellen Modus. CSS-Variablen (--bg/--card/--text/--muted/
--bor/--cyan) bekommen einen Hell-Override über [data-theme="light"] bzw.
@media(prefers-color-scheme:light) ohne explizites [data-theme="dark"] - so
gewinnt eine manuelle Wahl in beide Richtungen gegen die Systemeinstellung.
Header/Tabs/Login bleiben bewusst immer dunkel-navy (Markenidentität), nur
der Content-Bereich wechselt. Inline-Script in index.html verhindert ein
kurzes Aufblitzen des falschen Farbschemas vor dem ersten Paint.
Temporärer test-build-only.yml Workflow zur Verifikation ohne Registry-Push.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
sessionStorage wird geleert, sobald die (installierte) PWA am Handy
geschlossen wird - deshalb war nach jedem Neustart ein erneuter Login nötig.
Sowohl MSAL-Cache als auch das lokale Login-Token liegen jetzt in
localStorage, MSAL erneuert den Token beim Start still im Hintergrund
(acquireTokenSilent), das lokale Token ist 30 Tage gültig.
Temporärer test-build-only.yml Workflow zur Verifikation ohne Registry-Push.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Materialliste war auf schmalen Screens nur per Seitwärts-Scrollen lesbar.
Ab 680px Breite wird jede Zeile jetzt als Karte dargestellt (CSS Grid mit
benannten Areas, Bezeichnung prominent oben, Menge/Einheit/Art.-Nr./Notiz
darunter beschriftet, Position + Löschen-Button in der Kopfzeile der Karte).
Die Grid-Areas ordnen die Felder unabhängig von der DOM-Reihenfolge um, die
Desktop-Tabelle bleibt unverändert in der ursprünglichen Spaltenreihenfolge.
Temporärer test-build-only.yml Workflow zur Verifikation ohne Registry-Push.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neuer Druck-Header mit dem Firmenlogo und der cyanen Diagonalfläche wie auf
der Rechnung, Adress-/Infoblock im gleichen Tabellenstil, Materialtabelle mit
durchgezogenen Rahmenlinien statt Karten-Optik, Firmenfußzeile (Adresse,
Bank, Firmenbuch, Kontakt) am Ende. Die interaktiven Karten (Baustelle-Formular,
Kabelrechner, Manuell-Eintrag) bleiben beim Drucken ausgeblendet, nur die
neuen Print-only-Blöcke werden sichtbar.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Grund: $ in SEED_ADMIN_PASSWORD wird von Docker-Compose/Portainer als
Variablen-Referenz interpretiert und kann dadurch verstümmelt beim Container
ankommen. Seed synct das Passwort jetzt bei jedem Start neu, solange die
Variable gesetzt ist, statt nur einmalig anzulegen. README um Warnhinweis
ergänzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neues "users"-Table (bcrypt-Hash, nie Klartext), POST /api/auth/login gibt ein
selbst-signiertes JWT (HS256) aus. requireAuth unterscheidet MSAL- (RS256) und
lokale Tokens (HS256) anhand des alg-Headers. Server legt beim Start optional
ein erstes lokales Konto an, wenn SEED_ADMIN_USERNAME/SEED_ADMIN_PASSWORD als
Stack-Env gesetzt sind (idempotent, Klartext-Passwort landet nie im Repo).
Frontend: Login-Screen hat jetzt einen Alternativ-Link zu Benutzername/Passwort,
App.tsx kombiniert MSAL- und lokalen Auth-Status.
Temporärer test-build-only.yml Workflow zur Docker-Build-Verifikation ohne
Registry-Push (wird nach dem Test wieder entfernt).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Materialschein & Kabelrechner für BergVOLT Elektrotechnik, portiert von der
vorherigen Single-File-HTML-Version. Microsoft-Entra-ID-Login (MSAL), Projekt-
Dashboard statt einer Datei pro Kunde, Retour-Buchen-Zusammenführung, 111
Kabeltypen aus den offiziellen Meinhart-Datenblättern. gitops/ nach
PROX/deploy-standard: git-backed Portainer-Stack, versionierte Docker-Images,
CI-Commit-back auf gitops/stack.yml.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>