Commit Graph
15 Commits
Author SHA1 Message Date
Fidelis HuberandClaude Sonnet 5 f8374c3324 Fix invisible text in light mode (hardcoded white on now-white backgrounds)
.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>
2026-08-22 17:38:36 +02:00
Fidelis HuberandClaude Sonnet 5 901e383899 Remove temporary test-build-only workflow (build verified successfully)
Build and Deploy / version (push) Successful in 2s
Build and Deploy / build (push) Successful in 3s
Build and Deploy / deploy (push) Successful in 1s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-22 17:33:49 +02:00
Fidelis HuberandClaude Sonnet 5 c1bb51b480 Add light/dark theme with system-preference detection
Build and Deploy / version (push) Successful in 2s
Build and Deploy / build (push) Successful in 8s
Build and Deploy / deploy (push) Successful in 1s
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>
2026-08-22 17:33:15 +02:00
Fidelis HuberandClaude Sonnet 5 ddfcbdfbc3 Remove temporary test-build-only workflow (build verified successfully)
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Successful in 3s
Build and Deploy / deploy (push) Successful in 1s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 19:43:40 +02:00
Fidelis HuberandClaude Sonnet 5 cda971be5d Persist login across app restarts (localStorage instead of sessionStorage)
Build and Deploy / version (push) Successful in 2s
Build and Deploy / build (push) Successful in 14s
Build and Deploy / deploy (push) Successful in 2s
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>
2026-08-21 19:42:55 +02:00
Fidelis HuberandClaude Sonnet 5 5f6095c9c9 Remove temporary test-build-only workflow (build verified successfully)
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Successful in 2s
Build and Deploy / deploy (push) Successful in 2s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 19:38:55 +02:00
Fidelis HuberandClaude Sonnet 5 a910d1e399 Replace horizontal-scroll table with a stacked card layout on mobile
Build and Deploy / version (push) Successful in 2s
Build and Deploy / build (push) Successful in 11s
Build and Deploy / deploy (push) Successful in 2s
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>
2026-08-21 19:38:07 +02:00
Fidelis HuberandClaude Sonnet 5 ed7b3d0ea4 Redesign print/PDF export to match official BergVOLT invoice branding
Build and Deploy / version (push) Successful in 2s
Build and Deploy / build (push) Successful in 7s
Build and Deploy / deploy (push) Successful in 1s
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>
2026-08-21 19:23:14 +02:00
Fidelis HuberandClaude Sonnet 5 ca5d240cf6 Make admin seed idempotent-upsert so a corrupted password can be fixed by restart
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Successful in 6s
Build and Deploy / deploy (push) Successful in 1s
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>
2026-08-21 18:33:36 +02:00
Fidelis HuberandClaude Sonnet 5 d8a8a94332 Remove temporary test-build-only workflow (real build verified successfully)
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Successful in 2s
Build and Deploy / deploy (push) Successful in 2s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 17:57:48 +02:00
Fidelis HuberandClaude Sonnet 5 97c4aa1c68 Add local username/password login as fallback when Microsoft login isn't available
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Successful in 21s
Build and Deploy / deploy (push) Successful in 1s
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>
2026-08-21 17:56:40 +02:00
Fidelis HuberandClaude Sonnet 5 b6e4c2041f Remove temporary test-build-only workflow (build verified successfully)
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Successful in 3s
Build and Deploy / deploy (push) Failing after 2s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 17:30:46 +02:00
Fidelis HuberandClaude Sonnet 5 7ce4d8b590 Fix Dockerfile: npm ci requires a lockfile we don't have yet, use npm install
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Failing after 2s
Build and Deploy / deploy (push) Skipped
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 17:27:47 +02:00
Fidelis HuberandClaude Sonnet 5 5f008bb373 Add temporary test-build-only workflow (no registry push) to verify Docker build
Build and Deploy / version (push) Successful in 2s
Build and Deploy / build (push) Failing after 1s
Build and Deploy / deploy (push) Skipped
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 17:25:56 +02:00
Fidelis HuberandClaude Sonnet 5 13cef3c96d Initial scaffold: React/Vite/TS PWA + Express/Prisma/Postgres backend
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Failing after 1s
Build and Deploy / deploy (push) Skipped
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>
2026-08-21 17:24:38 +02:00