No description
  • HTML 70.5%
  • JavaScript 22.7%
  • CSS 6.6%
  • Shell 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Karsten Bonhuis a0bad225fb docs: README und PLAN auf v1.1 aktualisiert
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 23:29:58 +02:00
data data: Abschnittsnummern (section) zu allen Tabellen ergänzt 2026-06-11 22:19:26 +02:00
legacy initials commit 2026-06-11 19:45:17 +02:00
scripts chore: Release-Script (scripts/release.sh) 2026-06-11 21:58:45 +02:00
src Fix: Label-Position beim Hover korrekt – SVG-Translation von CSS-Scale trennen 2026-06-11 23:20:18 +02:00
.gitignore Setup: package.json, .gitignore, Verzeichnisstruktur 2026-06-11 19:49:22 +02:00
package-lock.json feat: PNG- und PDF-Exportfunktion 2026-06-11 20:56:59 +02:00
package.json feat: PNG- und PDF-Exportfunktion 2026-06-11 20:56:59 +02:00
PLAN.md docs: README und PLAN auf v1.1 aktualisiert 2026-06-11 23:29:58 +02:00
README.md docs: README und PLAN auf v1.1 aktualisiert 2026-06-11 23:29:58 +02:00

DSFinV-Standards – Visualisierung

Interaktive Datenstruktur-Diagramme für DSFinV-Standards (DSFinV-K, DSFinV-TW).
Gemeinsamer Renderer, ein Build pro Standard, statischer Output in dist/.

Schnellstart

npm install
npm run build             # erzeugt dist/
npm run dev               # Build + lokaler Server auf http://localhost:3000
npm run check             # nur Validierung der Datendateien (kein Build-Output)
bash scripts/release.sh   # dist/ bauen und als dsfinview-<tag>.zip packen

Bedienung des Viewers

Aktion Ergebnis
Klick auf (i) Detail-Panel öffnen · erneuter Klick schließt es
Klick auf (i) eines anderen Blocks Detail-Panel wechselt direkt
Klick auf leere Fläche Detail-Panel schließen
Hover über Tabellen-Kopf Tooltip mit Beschreibung, Datei, Abschnitt und Modul
Hover über Feld-Zeile Tooltip mit Feldbeschreibung und ggf. Hinweis
▾ alle N Felder Nicht-Schlüsselfelder ein-/ausklappen
Drag auf Tabellen-Kopf Node verschieben (Position wird gespeichert)
Scroll / Pinch Zoom
Drag auf leere Fläche Pan
Ansicht ▾ Dropdown: Layout wählen, alle Tabellen ein-/ausklappen
☀ / ☾ Dark/Light-Theme (folgt beim ersten Besuch der Systemeinstellung)
Suchfeld Tabellen und Felder filtern, Treffer hervorheben
ℹ (unten links) Legende ein-/ausblenden (Module, PK/FK, optional)
Exportieren ▾ Dropdown mit PNG- und PDF-Exportoptionen sowie Offline-Download
← Übersicht Zurück zur Startseite

Layout-Optionen (Ansicht ▾)

Option Beschreibung
Spalten-Layout Standard-Layout: Tabellen in bis zu 3 Spalten, Reihenfolge aus Datendatei
Kräfte-Layout Kräfte-Simulation (Abstoßung + Federkräfte); Kreisstart, überlappungsfrei
Hierarchie-Layout Topologische Schichten (Kahn-Algorithmus): FK-Quellen oben, abhängige Tabellen unten
Alle ausklappen Alle Nicht-Schlüsselfelder einblenden
Alle einklappen Alle Nicht-Schlüsselfelder ausblenden

Export-Optionen

Option Beschreibung
PNG – Ausschnitt Aktuell sichtbarer Bereich als PNG (doppelte Auflösung)
PNG – Vollständig Gesamtes Modell bei aktueller Zoomstufe als PNG
PDF drucken Diagramm auf A4 Querformat eingepasst, dann Druckdialog
Offline-Datei herunterladen Standalone-HTML (alles inline, kein Server nötig)

Neuen Standard hinzufügen (3 Schritte)

  1. Datendatei anlegen: data/<id>.html mit dsf-meta-Kopf und Tabellen/Kanten (Vorlage: bestehende Datei).
  2. dsf-meta ausfüllen: id, title, subtitle, version, storage-key (projektw. eindeutig), dsf-module-Einträge.
  3. npm run build – fertig. Keine Änderung an src/ nötig.

Dateiformat data/*.html

<dsf-meta
  id="meinstandard"
  title="Mein Standard 1.0"
  subtitle="Digitale Schnittstelle der Finanzverwaltung für …"
  version="1.0"
  storage-key="meinstandard_pos_v1"
  href="https://example.com/spezifikation">
  <dsf-module key="stamm"   label="Stammdatenmodul"   class="s"/>
  <dsf-module key="einzeln" label="Einzelaufzeichnung" class="e"/>
</dsf-meta>

<dsf-table id="Stamm_Foo" file="foo.csv" module="stamm" col="0" section="3.2.1">
  <dsf-desc>Beschreibung der Tabelle.</dsf-desc>
  <dsf-field name="FOO_ID" type="Zeichen" len="50" pk="1" desc="Primärschlüssel."/>
  <dsf-field name="BAR_ID" type="Zeichen" len="50" fk="1" desc="FK → Stamm_Bar"/>
  <dsf-field name="WERT"   type="Num"     len="2"          desc="Ein Betrag."/>
</dsf-table>

<dsf-edge from="Stamm_Foo" to="Stamm_Bar" type="solid" card-from="1" card-to="N"/>

Attribut-Referenz

<dsf-meta>

Attribut Pflicht Beschreibung
id ✓ Eindeutiger Bezeichner (URL-sicher, z.B. dsfinvk)
title ✓ Anzeigename (z.B. DSFinV-K 2.4)
subtitle Langform
version Versionsnummer
storage-key ✓ localStorage-Schlüssel für Node-Positionen (projektw. eindeutig!)
href URL zur offiziellen Spezifikation; wird als „Quelle ↗"-Link unten rechts im Viewer und auf der Übersichtsseite angezeigt

<dsf-module>

Attribut Beschreibung
key Interner Schlüssel (referenziert vom module-Attribut der Tabellen)
label Anzeigename in der Legende
class Farbklasse: s (Stamm/grün), e (Einzelaufzeichnung/blau), a (Abschluss/orange)

Aktuell stehen 3 Farbslots zur Verfügung. Für Standards mit mehr Modulen müssten weitere CSS-Variablen (--hdr-x, --ring-x, --txt-x) in graph.css ergänzt werden.

<dsf-table>

Attribut Pflicht Beschreibung
id ✓ Eindeutiger Tabellenname (gleichzeitig Anzeigename)
file CSV-Dateiname
module Schlüssel aus dsf-module
col Layout-Spalte: 0, 1 oder 2 (Standard: 0)
optional Tabelle ist optional
section Abschnittsnummer in der Spezifikation (z.B. 3.2.1); erscheint im Hover-Tooltip und Detail-Panel

<dsf-field>

Attribut Beschreibung
name Feldname (Pflicht)
type Datentyp (Zeichen, Num, …)
len Länge oder 0 bei Num ohne Längenvorgabe
pk Primärschlüssel
fk Fremdschlüssel
optional Feld ist optional
desc Kurzbeschreibung (im Tooltip und Detail-Panel)
note Ergänzender Hinweis (im Detail-Panel hervorgehoben)

<dsf-edge>

Attribut Beschreibung
from Quell-Tabellen-ID
to Ziel-Tabellen-ID
type solid (durchgezogen) oder ref (gestrichelt)
card-from Kardinalität an der Quelle (z.B. 1)
card-to Kardinalität am Ziel (z.B. N, 0..N)

Projektstruktur

/
├── data/
│   ├── dsfinvk.html          # Datendatei DSFinV-K 2.4
│   └── dsfinvtw.html         # Datendatei DSFinV-TW 1.1
├── src/
│   ├── renderer/
│   │   ├── graph.css         # Gemeinsames CSS (Dark/Light-Theme)
│   │   └── graph.js          # Gemeinsamer Renderer (Vanilla JS)
│   ├── templates/
│   │   ├── standard.html     # Seiten-Template pro Standard
│   │   ├── standalone.html   # Template für Offline-Einzeldatei
│   │   ├── index.html        # Template Übersichtsseite
│   │   └── site.css          # CSS nur für die Übersichtsseite
│   └── build/
│       ├── build.js          # Haupt-Build-Skript (npm run build)
│       ├── parse-data.js     # Parst data/*.html → Modell-Objekt
│       ├── validate.js       # Konsistenzprüfungen
│       ├── check.js          # npm run check (nur Validierung)
│       └── dev.js            # npm run dev (Watch + statischer Server)
├── scripts/
│   ├── release.sh            # dist/ bauen und als ZIP packen
│   └── migrate.js            # Einmalige Migration der Legacy-Dateien
├── legacy/                   # Original-Einzeldateien (Referenz)
└── dist/                     # Build-Output (gitignored)
    ├── index.html
    ├── assets/
    ├── dsfinvk/
    ├── dsfinvtw/
    └── downloads/

Build-Output (dist/)

dist/
├── index.html              # Übersicht aller Standards
├── assets/
│   ├── graph.css
│   ├── graph.js
│   ├── html2canvas.min.js  # PNG-Export-Bibliothek
│   └── site.css
├── dsfinvk/
│   └── index.html          # Standard-Seite DSFinV-K
├── dsfinvtw/
│   └── index.html          # Standard-Seite DSFinV-TW
└── downloads/
    ├── dsfinvk_graph.html  # Standalone-Datei (alles inline, offline-fähig)
    └── dsfinvtw_graph.html

dist/ kann mit jedem statischen Webserver ausgeliefert werden (keine absoluten Pfade, auch Unterverzeichnis-Deploy möglich).
Standalone-Dateien in downloads/ funktionieren per Doppelklick vom Dateisystem (file://, kein Server nötig).

Release erstellen

git tag -a v1.x -m "Version 1.x"
bash scripts/release.sh

Das Script baut dist/ und erzeugt dsfinview-<tag>.zip im Projektroot.
Die Zip-Datei kann als Asset in einem Gitea-Release hochgeladen werden.

Validierung (npm run check)

check.js prüft alle data/*.html ohne Build-Output:

  • Jede dsf-edge referenziert existierende Tabellen-IDs
  • Tabellen-IDs eindeutig pro Datei
  • module-Attribut jeder Tabelle in dsf-meta definiert
  • col ∈ {0, 1, 2}
  • Pflichtattribute vorhanden (dsf-meta id/title/storage-key, dsf-field name)
  • storage-key projektw. eindeutig (über alle Datendateien)

Fehler werden mit Dateiname und Element ausgegeben; Exit-Code 1 bricht auch npm run build ab.

Technische Hinweise

  • Node ≥ 20, ESM ("type": "module"), Build-Abhängigkeiten: cheerio; Client-Abhängigkeit: html2canvas (wird als Asset kopiert und in Standalone-Dateien inline eingebettet).
  • Renderer: Vanilla JS, keine Frameworks, keine Build-Tools clientseitig.
  • Theme: Beim ersten Besuch wird prefers-color-scheme ausgewertet; manuelle Wahl wird in localStorage (dsf_theme) gespeichert und hat Vorrang.
  • Node-Positionen: Pro Standard in localStorage unter dem jeweiligen storage-key gespeichert. Beim Upgrade von Legacy-Einzeldateien werden alte Keys einmalig migriert.
  • Kanten: Kubische Bézier-Kurven; zwischen Spalten horizontal geroutet, innerhalb einer Spalte nach rechts ausweichend. Beim Auf-/Zuklappen von Nodes werden Kanten für die Dauer der CSS-Transition (220 ms) auf jedem Frame neu gezeichnet. Hover hebt Pfad und Kardinalitäts-Labels hervor (zwei SVG-Schichten, JS-gesteuert).
  • Legende: Ausgelagert in ein ℹ-Overlay unten links; nicht Teil der Toolbar.
  • Layouts: Spalten-Layout (Standard), Kräfte-Layout (force-directed, Kreisstart), Hierarchie-Layout (Kahn-Algorithmus, topologische Schichten).
  • PNG-Export: html2canvas rendert #canvas mit Scale 2×. „Ausschnitt" erfasst das sichtbare Fenster; „Vollständig" berechnet die Bounding-Box aller Nodes, passt den Canvas temporär an und stellt danach den Ausgangszustand wieder her.
  • PDF-Export: Diagramm wird vor window.print() per Transform auf A4 Querformat (1122 × 794 px) eingepasst und danach wiederhergestellt.