Richtlinien: Lesemodus als eigene Seite + Bearbeitungsmodus (§8)

Auf Wunsch: Dokumente öffnen nicht mehr als Popup, sondern als eigene Seite
mit Zurück-Navigation.

- Neue Routen /policies/[code] (Lesen) und /policies/[code]/edit (Bearbeiten);
  Popup-Modals durch PolicyReadView/PolicyRegisterView ersetzt. Alle Deeplinks
  ({{LINK}}, Coverage, Bibliothek, Register-Callouts) zeigen auf /policies/CODE.
- Detailseite: „← Zurück zur Bibliothek", Titel/Status/Version, Control-Chips,
  „Bearbeiten"-Button (nur Vorlagen-Dokumente, policy:write).
- Bearbeitungsmodus für Leitlinie/Richtlinien/Verfahren:
  * Vorlagen-Markdown-Editor (Textarea) mit Live-Vorschau (Lesemodus),
    Speichern via updatePolicyTemplate.
  * Dokument-bezogene Variablen (§8 Variablen-Scoping): nur die im Dokument
    vorkommenden Variablen — inkl. über BL-Referenzen gebundene — einzeln
    editierbar; Änderung propagiert zentral in alle Dokumente (eine Pflegestelle).
- Register-Actions revalidieren jetzt /policies per layout (Detailseiten aktuell).

Verifiziert: R08 als Seite (kein Modal), Editor mit 23 dokument-bezogenen
Variablen; PW_MIN_LENGTH 12→14 propagiert in R08 und Handbuch; Template-Speichern
mit Redirect zur Ansicht; zurückgesetzt.

Hinweis: Der Vier-Augen-Freigabe-Workflow mit Versionierung/Diff (§8) folgt als
nächster Schritt — aktuell speichert der Editor direkt (mit Audit-Log).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 16:29:18 +02:00
co-authored by Claude Opus 4.8
parent e2b6dee788
commit 094229011d
9 changed files with 365 additions and 163 deletions
+3 -3
View File
@@ -33,14 +33,14 @@ const SUPPRESS_SECTIONS = [
/** {{LINK:ZIEL}} → interner Deep-Link nach /policies. */
export function resolveLink(target: string): { href: string; label: string } {
const [code, anchor] = target.split("#");
const q = (c: string) => `/policies?doc=${encodeURIComponent(c)}${anchor ? `#${anchor}` : ""}`;
const q = (c: string) => `/policies/${encodeURIComponent(c)}${anchor ? `#${anchor}` : ""}`;
switch (code) {
case "NACHWEISREGISTER":
return { href: "/policies?doc=NACHWEIS", label: "Nachweisregister" };
return { href: "/policies/NACHWEIS", label: "Nachweisregister" };
case "ISA_MAPPING":
return { href: "/policies?view=coverage", label: "ISA-Mapping-Matrix" };
case "BASELINE":
return { href: "/policies?doc=BASELINE", label: "Technische Sicherheits-Baseline" };
return { href: "/policies/BASELINE", label: "Technische Sicherheits-Baseline" };
default:
return { href: q(code), label: anchor ? `${code} §${anchor}` : code };
}