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>
node:20-alpine ships OpenSSL 3.x and has no libssl.so.1.1. Without the
openssl CLI, Prisma's version detection failed and fell back to the
openssl-1.1.x engine, which then failed to load its shared library and
emitted plain text instead of JSON ("Unexpected token 'E'..."), crashing
`prisma migrate deploy` at container startup.
- Install openssl in the build and runtime stages so detection succeeds
- Pin binaryTargets to linux-musl-openssl-3.0.x so the correct engine is bundled
Co-Authored-By: Claude Opus 4.8 <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>