Seitenansicht mit PDF-Export, Verteiler-Infokarte und Logo-Upload #4

Closed
Grovy311 wants to merge 10 commits from Grovy311/leistungsbilanz-ts:feature/print-view into main
Collaborator

Worum geht es

Druckfähige Seitenansicht mit PDF-Export im kbp-Design, dazu eine Infokarte für Verteilungen, Deckblattangaben und Büroangaben mit Logo.

  • Seitenansicht /projects/:projectId/print, erreichbar über den neuen Button „Seitenansicht“ auf der Projektseite
    • Deckblatt (A4 hoch, tabellarisch): Projekt, Planverfasser, Dokument, Planstände aus benannten Sicherungspunkten, Inhalt
    • Verteilerübersicht: Versorgungsstruktur und Tabelle mit Pinst, PGeräte, Verteiler-GZF, Pgl, IB
    • Verteilerplan je Verteiler (A4/A3 quer) mit Titelleiste (Nummer, Bezeichnung, Örtlichkeit, Netzart, Einspeisung), die sich beim Drucken auf Folgeseiten wiederholt
    • PDF über den Druckdialog des Browsers; Seitenformate und „Seite x von y“ über benannte @page-Regeln
    • rein lesend, nutzt nur bestehende GET-Endpunkte
  • Verteiler-Infokarte im Bearbeiten-Dialog: boardNumber, location, fedFrom, remark
    • distribution-board.update additiv erweitert (weiter Schema-Version 1, alte gespeicherte Commands bleiben gültig)
    • Migration 0008, Snapshot-Schema 6 (ältere Versionen werden mit null hochgestuft)
    • gespeicherte Subtree-Commands ohne die Felder werden normalisiert; eine leere Verteilung mit Infowerten gilt beim History-Löschen als geändert
  • Deckblattangaben in den Projekteinstellungen: Anschrift Bauvorhaben, Leistungsphase, Projektleitung, Bearbeitung
    • project.update-settings Schema-Version 3 (v2 und v1 bleiben ausführbar und behalten die aktuellen Werte), Migration 0009, ebenfalls Teil von Snapshot-Schema 6
    • im PUT /projects/:projectId optional, fehlende Felder behalten ihren Wert
  • Büroangaben (Büroname, Anschrift; global): Tabelle document_branding_settings, PUT /api/document-branding/office, pflegbar in der Werkzeugleiste der Seitenansicht
  • Büro-Logo (global, nicht Teil von Projekten/Snapshots): Tabelle document_branding_assets, GET|PUT|DELETE /api/document-branding/logo, PNG/JPEG/SVG bis 2 MB mit Inhaltsprüfung, Auslieferung mit nosniff und restriktiver CSP

Bitte beachten

  • Enthält die Leitungsberechnung aus dem geschlossenen #1, hier sauber auf den aktuellen main gesetzt und ohne die zwei „Local-only“-Commits (cj-ki-Ports/allowedDevOrigins).
  • fedFrom ist bewusst Freitext. Struktur und „Σ inkl. unterlagert“ in der Übersicht sind vorläufig (Textabgleich, einfache Summe) – die fachliche Verknüpfung ist in #3 beschrieben.
  • Farben/Schrift folgen dem kbp-CD (--pd-* in print-document.css); leere Deckblattangaben erscheinen als „[ergänzen]“. Die Spalte „Bearbeitung“ der Planstände zeigt die aktuelle Bearbeitung des Projekts, weil Sicherungspunkte keinen Bearbeiter speichern.
  • Die Infofelder sollen später aus Revit-Parametern vorbelegt werden können, nur nach den Phase-14-Regeln (Vorschau, Bestätigung, kein stilles Überschreiben).

Doku: docs/print-view.md, AGENTS.md (Abschnitt „Print View“), API-/Architektur-Doku und bekannte Einschränkungen aktualisiert.

Geprüft (Node 24, Dev-Image aus diesem Branch)

  • npm test: 445/445 (neu: Print-Modell, Infofelder inkl. Undo, Deckblattfelder inkl. Undo und v2-Commands, Büroangaben/Logo-Repository, Snapshot-Upgrade v5→v6, Legacy-Subtree-Commands)
  • tsc für API, Next und Scripts ohne Fehler
  • npm run build:web (Production) erfolgreich
  • manuell auf einer Testinstanz: Infokarte speichern + Undo, Logo-Upload, Deckblatt- und Büroangaben, Seitenansicht mit zwei Verteilern

🤖 Generated with Claude Code

## Worum geht es Druckfähige **Seitenansicht** mit PDF-Export im kbp-Design, dazu eine **Infokarte** für Verteilungen, **Deckblattangaben** und **Büroangaben mit Logo**. - **Seitenansicht** `/projects/:projectId/print`, erreichbar über den neuen Button „Seitenansicht“ auf der Projektseite - Deckblatt (A4 hoch, tabellarisch): Projekt, Planverfasser, Dokument, Planstände aus benannten Sicherungspunkten, Inhalt - Verteilerübersicht: Versorgungsstruktur und Tabelle mit P<sub>inst</sub>, P<sub>Geräte</sub>, Verteiler-GZF, P<sub>gl</sub>, I<sub>B</sub> - Verteilerplan je Verteiler (A4/A3 quer) mit Titelleiste (Nummer, Bezeichnung, Örtlichkeit, Netzart, Einspeisung), die sich beim Drucken auf Folgeseiten wiederholt - PDF über den Druckdialog des Browsers; Seitenformate und „Seite x von y“ über benannte `@page`-Regeln - rein lesend, nutzt nur bestehende GET-Endpunkte - **Verteiler-Infokarte** im Bearbeiten-Dialog: `boardNumber`, `location`, `fedFrom`, `remark` - `distribution-board.update` additiv erweitert (weiter Schema-Version 1, alte gespeicherte Commands bleiben gültig) - Migration `0008`, Snapshot-Schema **6** (ältere Versionen werden mit `null` hochgestuft) - gespeicherte Subtree-Commands ohne die Felder werden normalisiert; eine leere Verteilung mit Infowerten gilt beim History-Löschen als geändert - **Deckblattangaben** in den Projekteinstellungen: Anschrift Bauvorhaben, Leistungsphase, Projektleitung, Bearbeitung - `project.update-settings` Schema-Version **3** (v2 und v1 bleiben ausführbar und behalten die aktuellen Werte), Migration `0009`, ebenfalls Teil von Snapshot-Schema 6 - im `PUT /projects/:projectId` optional, fehlende Felder behalten ihren Wert - **Büroangaben** (Büroname, Anschrift; global): Tabelle `document_branding_settings`, `PUT /api/document-branding/office`, pflegbar in der Werkzeugleiste der Seitenansicht - **Büro-Logo** (global, nicht Teil von Projekten/Snapshots): Tabelle `document_branding_assets`, `GET|PUT|DELETE /api/document-branding/logo`, PNG/JPEG/SVG bis 2 MB mit Inhaltsprüfung, Auslieferung mit `nosniff` und restriktiver CSP ## Bitte beachten - Enthält die Leitungsberechnung aus dem geschlossenen #1, hier sauber auf den aktuellen `main` gesetzt und ohne die zwei „Local-only“-Commits (cj-ki-Ports/`allowedDevOrigins`). - `fedFrom` ist bewusst Freitext. Struktur und „Σ inkl. unterlagert“ in der Übersicht sind vorläufig (Textabgleich, einfache Summe) – die fachliche Verknüpfung ist in **#3** beschrieben. - Farben/Schrift folgen dem kbp-CD (`--pd-*` in `print-document.css`); leere Deckblattangaben erscheinen als „[ergänzen]“. Die Spalte „Bearbeitung“ der Planstände zeigt die aktuelle Bearbeitung des Projekts, weil Sicherungspunkte keinen Bearbeiter speichern. - Die Infofelder sollen später aus Revit-Parametern vorbelegt werden können, nur nach den Phase-14-Regeln (Vorschau, Bestätigung, kein stilles Überschreiben). Doku: `docs/print-view.md`, `AGENTS.md` (Abschnitt „Print View“), API-/Architektur-Doku und bekannte Einschränkungen aktualisiert. ## Geprüft (Node 24, Dev-Image aus diesem Branch) - `npm test`: 445/445 (neu: Print-Modell, Infofelder inkl. Undo, Deckblattfelder inkl. Undo und v2-Commands, Büroangaben/Logo-Repository, Snapshot-Upgrade v5→v6, Legacy-Subtree-Commands) - `tsc` für API, Next und Scripts ohne Fehler - `npm run build:web` (Production) erfolgreich - manuell auf einer Testinstanz: Infokarte speichern + Undo, Logo-Upload, Deckblatt- und Büroangaben, Seitenansicht mit zwei Verteilern 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Grovy311 added 9 commits 2026-09-25 19:43:06 +02:00
Isolated module (mirrors src/external-model/ dependency direction) that
adds an on-demand, DIN VDE 0298-4 referenced cable cross-section
calculator: a click-on-a-circuit input mask for laying method,
insulation, ambient temperature, grouping and voltage-drop limit that
suggests a cross-section for the circuit cableCrossSection/cableLength
fields. Applying a suggestion goes through the existing circuit.update
command (expectedRevision, undo/redo) unchanged - nothing here writes
to circuits directly or touches the revision/command system. See
docs/cable-sizing-module.md for the full rationale, API contract,
verification status and maintenance plan. Proposal, not yet reviewed
by the project owner - see the docs file.

423 existing + 11 new tests pass, build:api/build:web/typecheck:scripts
clean.
context.circuitId/projectId are caller-supplied audit-log metadata, not
used in the calculation itself. A stale or unknown id (e.g. a circuit
deleted between page load and this request) violated the foreign key
and fell through to the generic 500 handler; catch it and report it as
a normal validation error instead.
The trigger was wired to the cableCrossSection column, which is not in
the default visible column set - the actually visible "Kabel" column
is cableSummary (a computed cableType/cableCrossSection/cableLength
join). Editing cableSummary already maps to the remark field rather
than the underlying cable data (see buildCircuitEditPatch), so this
column was effectively a read-only display already; retargeting the
trigger there loses no existing manual-edit capability. Also adds
.cell-cable-sizing-trigger styling (mirrors .cell-protection-trigger)
so the trigger is visually discoverable, which the initial version was
missing entirely.
Trigger now matches cableSummary OR cableCrossSection so it still
shows up regardless of which cable-related column a user has visible
(column visibility is a per-browser preference in this app, not fixed
- see docs/cable-sizing-module.md coupling note). Icon changed to a
calculator glyph.
- calculateCableSizing now selects cross-section against
  designCurrentA = max(operatingCurrentA, existingProtectionRatedCurrentA)
  instead of the load current alone. A breaker only trips at its own rated
  current (In), so a cable sized for the actual load could overheat under
  sustained current below that threshold - the standard In <= Iz rule.
  Voltage-drop calculation still uses the real operating current, only the
  capacity check changed. Alerts and the ok-summary now name the breaker as
  the limiting factor when it is one.
- Added a manual cable type/cross-section entry in the modal itself:
  running a calculation pre-fills these fields as a suggestion, but they
  are the single field that actually gets applied, and stay editable -
  this restores the direct manual-entry capability the modal replaced when
  it took over the cableSummary/cableCrossSection cell click.
- Fixed calculator icon position from a trailing ::after (inconsistent
  position depending on cell text length, easy to miss on empty cells) to
  a fixed-position ::before, so it is always in the same place regardless
  of whether cable data is already filled in.
- No new display for the existing protection device - it already has its
  own Schutz column in this app.
- Cross-section rows now include maxLengthForVoltageDropM, the inverse of
  the voltage-drop formula: the longest single run that stays within the
  requested max voltage drop at the given load/cosPhi/phase. Shown as a KPI
  and in the ok-summary alert.
- Added PRACTICAL_MINIMUM_CROSS_SECTION_MM2 (2.5 mm² for single_phase
  circuits) - a planning convention already named in this projects own
  docs/spec/06-future-sizing-and-calculations.md, not a thermal/
  voltage-drop requirement. Only ever raises a calculated recommendation,
  never lowers one that already needs more. circuitCategory is looked up
  from the circuits section and passed through from the editor.
- The manual cross-section field now warns (not blocks - manual override
  must stay possible per the same spec doc) when the typed value is not a
  standard cross-section, is smaller than the last calculation, or is
  below the practical minimum for single_phase circuits.
- Modal title now includes the circuit displayName next to the equipment
  identifier.
- Replaced the calculator emoji trigger icon with an inline SVG - the emoji
  did not render in at least one tested environment (missing font glyph),
  SVG has no such dependency.
- Seitenansicht (/projects/:projectId/print): tabular cover page, board
  overview with supply structure and power sums, one plan per board with a
  repeating title block; PDF via the browser print dialog with named @page
  rules (A4 portrait cover, A4/A3 landscape plans, page x of y).
- Distribution-board info card (board number, location, fed-from, remark)
  in the board edit dialog, persisted through the additively extended
  distribution-board.update command (migration 0008, snapshot schema 6,
  legacy subtree commands normalized).
- Global document logo upload (PNG/JPEG/SVG, max 2 MB) outside project
  revisions and snapshots.
- fed-from stays free text; the overview hierarchy and cumulated sums are
  preliminary until the feed link is modeled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Grovy311 added 1 commit 2026-09-25 20:44:43 +02:00
- Project settings gain siteAddress, workStage, projectLead and
  projectEditor (project.update-settings schema version 3, migration 0009);
  versions 2 and 1 stay executable and keep the current cover values.
  Snapshot schema 6 carries the fields; older versions upgrade with null.
- Global office profile (office name/address) next to the document logo:
  table document_branding_settings, PUT /api/document-branding/office,
  editable from the print view toolbar.
- Cover page reads all fields; empty values show the "[ergänzen]" marker.
  The Planstände editor column shows the project editor.
- Shared logo constants moved to a dependency-free module so the Next.js
  bundler can import them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Collaborator

Geschlossen – ersetzt durch drei Branches direkt in diesem Repository, jeweils auf dem aktuellen main (2e3e85a) und einzeln geprüft (Node 24: npm test, alle drei tsc-Konfigurationen, Produktions-Build, Prod-Image mit Migration auf leerer und bestehender DB):

Branch Inhalt Basis
feature/editor-ui Icon-Buttons in der Stromkreisliste, kompakte Spaltenköpfe mit Filter-Icon main
feature/print-view Seitenansicht/PDF, Verteiler-Infokarte, Deckblattfelder, Büroangaben und Logo; Migrationen 0007/0008, Snapshot-Schema 6 main
feature/cable-sizing optionales Leitungsberechnungs-Modul, ein Commit feature/editor-ui

Die Branches lassen sich in beliebiger Reihenfolge ohne Konflikte mergen (feature/cable-sizing enthält feature/editor-ui).

Zur Leitungsberechnung gegenüber #1/#4 überarbeitet:

  • Tabellen neu nach IEC 60364-5-52:2009 Anhang B (PVC/VPE, Cu/Al, A1, A2, B1, B2, C, D1, D2, E), zeilenweise mit öffentlichen Wiedergaben abgeglichen, bei Abweichungen der kleinere Wert; A1/B2-Kopierfehler, 60-°C-Temperaturspalte, Häufung, D1/D2-Werte und -Beschriftung korrigiert. Prüfnachweis in docs/cable-sizing-module.md; Abgleich mit DIN VDE 0298-4 durch den Planer steht aus.
  • Zwischenwerte für Temperatur/Häufung auf der sicheren Seite, außerhalb der Tabellen kein Ergebnis statt Faktor 1.
  • Schutzorgan: LS In ≤ Iz, Sicherung gG zusätzlich I₂ ≤ 1,45·Iz.
  • Aufruf über einen Button in der Aktionsspalte statt Zellenklick (Spreadsheet-Regel).
  • Keine Audit-Tabelle, keine Migration, zustandslose API.
  • cos φ, Phasenzahl und Spannung aus dem Stromkreis bzw. den Projekteinstellungen.
  • Doku: AGENTS.md, Architektur, API, bekannte Einschränkungen, README, Backlog.

Außerdem gefunden und behoben: Nach dem Sprung auf Snapshot-Schema 6 waren gespeicherte Sicherungspunkte älterer Versionen nicht mehr wiederherstellbar (strikter Versionsvergleich in prepareRestore) – jetzt werden alle unterstützten Versionen 1–6 wiederhergestellt, mit Test.

Geschlossen – ersetzt durch drei Branches direkt in diesem Repository, jeweils auf dem aktuellen `main` (2e3e85a) und einzeln geprüft (Node 24: `npm test`, alle drei `tsc`-Konfigurationen, Produktions-Build, Prod-Image mit Migration auf leerer und bestehender DB): | Branch | Inhalt | Basis | |---|---|---| | `feature/editor-ui` | Icon-Buttons in der Stromkreisliste, kompakte Spaltenköpfe mit Filter-Icon | `main` | | `feature/print-view` | Seitenansicht/PDF, Verteiler-Infokarte, Deckblattfelder, Büroangaben und Logo; Migrationen `0007`/`0008`, Snapshot-Schema 6 | `main` | | `feature/cable-sizing` | optionales Leitungsberechnungs-Modul, ein Commit | `feature/editor-ui` | Die Branches lassen sich in beliebiger Reihenfolge ohne Konflikte mergen (`feature/cable-sizing` enthält `feature/editor-ui`). Zur Leitungsberechnung gegenüber #1/#4 überarbeitet: - Tabellen neu nach IEC 60364-5-52:2009 Anhang B (PVC/VPE, Cu/Al, A1, A2, B1, B2, C, D1, D2, E), zeilenweise mit öffentlichen Wiedergaben abgeglichen, bei Abweichungen der kleinere Wert; A1/B2-Kopierfehler, 60-°C-Temperaturspalte, Häufung, D1/D2-Werte und -Beschriftung korrigiert. Prüfnachweis in `docs/cable-sizing-module.md`; Abgleich mit DIN VDE 0298-4 durch den Planer steht aus. - Zwischenwerte für Temperatur/Häufung auf der sicheren Seite, außerhalb der Tabellen kein Ergebnis statt Faktor 1. - Schutzorgan: LS In ≤ Iz, Sicherung gG zusätzlich I₂ ≤ 1,45·Iz. - Aufruf über einen Button in der Aktionsspalte statt Zellenklick (Spreadsheet-Regel). - Keine Audit-Tabelle, keine Migration, zustandslose API. - cos φ, Phasenzahl und Spannung aus dem Stromkreis bzw. den Projekteinstellungen. - Doku: AGENTS.md, Architektur, API, bekannte Einschränkungen, README, Backlog. Außerdem gefunden und behoben: Nach dem Sprung auf Snapshot-Schema 6 waren gespeicherte Sicherungspunkte älterer Versionen nicht mehr wiederherstellbar (strikter Versionsvergleich in `prepareRestore`) – jetzt werden alle unterstützten Versionen 1–6 wiederhergestellt, mit Test.
Grovy311 closed this pull request 2026-09-26 11:20:48 +02:00

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: jappel/leistungsbilanz-ts#4
No description provided.