2 Commits
Author SHA1 Message Date
zemion ad8235028f fix(webui): bind retention controls to help
Module Package Release / publish-packages (push) Successful in 12s
2026-08-24 11:36:37 +02:00
zemion 62970d6374 docs: complete German structured documentation
Module Package Release / publish-packages (push) Successful in 11s
2026-08-24 01:15:33 +02:00
6 changed files with 92 additions and 7 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "govoplan-datasources" name = "govoplan-datasources"
version = "0.1.22" version = "0.1.24"
description = "Governed datasource catalogue, staging, and materialization lifecycle for GovOPlaN." description = "Governed datasource catalogue, staging, and materialization lifecycle for GovOPlaN."
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
+1 -1
View File
@@ -1,3 +1,3 @@
"""GovOPlaN Datasources module.""" """GovOPlaN Datasources module."""
__version__ = "0.1.22" __version__ = "0.1.24"
@@ -0,0 +1,75 @@
"""German translations for public structured documentation metadata."""
from __future__ import annotations
from typing import Any
GERMAN_STRUCTURED_TRANSLATIONS: dict[str, dict[str, Any]] = {'datasources.approval-and-retention': {'limitations': ['Die Ausführung der Retention ist explizit '
'und plangebunden; dieses Modul führt '
'keinen versteckten Löschplan aus.',
'Disponierte '
'Materialisierungsaufzeichnungen behalten '
'minimierte Schema- und Herkunftsmetadaten '
'bei, während ihre Nutzdatenzeilen '
'entfernt werden.']},
'datasources.quality-gates': {'limitations': ['Referenzregeln verwenden derzeit einen begrenzten '
'eingebetteten Wertsatz, anstatt eine andere '
'geschützte Datenquelle zu lesen.',
'Genehmigungen sind modullokale '
'Lebenszyklusnachweise; die Installation eines '
'separaten Genehmigungsmoduls ändert nicht '
'stillschweigend die konfigurierte '
'Datenquellenrichtlinie.',
'Die Aufbewahrung erfolgt nie automatisch: Ein '
'Administrator muss eine Vorschau eines aktuellen '
'Plans anzeigen und ausdrücklich berechtigte Ziele '
'anwenden.',
'Artefaktbytes bleiben im Besitz ihres '
'Payload-Backends; Datasources speichert einen '
'unveränderlichen Referenz- und '
'Integritätsnachweis.']},
'datasources.reference.fields-and-consequences': {'consequence_classes': {'freeze': 'Erstellt '
'einen '
'gekennzeichneten '
'unveränderlichen '
'Zustand für '
'reproduzierbare '
'Verbraucher '
'und '
'Nachweise.',
'promote': 'Erstellt '
'oder '
'aktualisiert '
'eine '
'geregelte '
'Datenquelle '
'und fügt '
'eine '
'unveränderliche '
'Materialisierungsrevision '
'hinzu.',
'refresh': 'Leset den '
'zwischengespeicherten '
'Ursprung '
'und fügt '
'eine neue '
'unveränderliche '
'Materialisierungsrevision '
'hinzu.',
'retire': 'Verhindert '
'eine neue '
'Auswahl, '
'während die '
'Referenzen '
'für die '
'Materialisierung '
'beibehalten '
'werden.'}},
'datasources.visibility': {'limitations': ['Zeilenfilter unterstützen deterministische Gleichheit '
'oder Mitgliedschaft gegen Hauptansprüche; '
'willkürliche Ausdrücke werden nicht ausgeführt.',
'Live-gefilterte Vorschauen scannen maximal 10.000 '
'Ursprungszeilen und legen eine strukturierte '
'Einschränkungsdiagnose offen, wenn der Ursprung '
'größer ist.']}}
+9 -1
View File
@@ -1,5 +1,8 @@
from __future__ import annotations from __future__ import annotations
from govoplan_core.core.modules import with_documentation_structured_translations
from govoplan_datasources.backend.german_structured_documentation import GERMAN_STRUCTURED_TRANSLATIONS
from pathlib import Path from pathlib import Path
from govoplan_core.core.access import ( from govoplan_core.core.access import (
@@ -65,7 +68,7 @@ from govoplan_datasources.backend.payloads import ExternalArtifactPayloadBackend
MODULE_ID = "datasources" MODULE_ID = "datasources"
MODULE_NAME = "Datasources" MODULE_NAME = "Datasources"
MODULE_VERSION = "0.1.22" MODULE_VERSION = "0.1.24"
DATASOURCE_INTERFACE_VERSION = "0.2.0" DATASOURCE_INTERFACE_VERSION = "0.2.0"
ARCHITECTURE = ModuleArchitectureDeclaration( ARCHITECTURE = ModuleArchitectureDeclaration(
@@ -906,6 +909,11 @@ manifest = ModuleManifest(
) )
manifest = with_documentation_structured_translations(
manifest, locale="de", translations=GERMAN_STRUCTURED_TRANSLATIONS
)
def get_manifest() -> ModuleManifest: def get_manifest() -> ModuleManifest:
return manifest return manifest
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/datasources-webui", "name": "@govoplan/datasources-webui",
"version": "0.1.22", "version": "0.1.24",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/index.ts", "main": "src/index.ts",
@@ -448,7 +448,7 @@ export default function DatasourcesPage({
</Button> </Button>
) : null} ) : null}
{view === "catalogue" && canAdmin ? ( {view === "catalogue" && canAdmin ? (
<Button onClick={() => setRetentionOpen(true)} disabled={working}> <Button helpContextId="datasources.retention" helpModuleId="datasources" onClick={() => setRetentionOpen(true)} disabled={working}>
<Archive size={16} /> Retention <Archive size={16} /> Retention
</Button> </Button>
) : null} ) : null}
@@ -1337,7 +1337,7 @@ function GovernanceDialog({
<GovernanceListField label="Purposes" values={draft.purposes} onChange={(values) => setValue("purposes", values)} /> <GovernanceListField label="Purposes" values={draft.purposes} onChange={(values) => setValue("purposes", values)} />
<GovernanceListField label="Legal basis references" values={draft.legal_basis_refs} onChange={(values) => setValue("legal_basis_refs", values)} /> <GovernanceListField label="Legal basis references" values={draft.legal_basis_refs} onChange={(values) => setValue("legal_basis_refs", values)} />
<GovernanceListField label="Official keys" values={draft.official_keys} onChange={(values) => setValue("official_keys", values)} /> <GovernanceListField label="Official keys" values={draft.official_keys} onChange={(values) => setValue("official_keys", values)} />
<GovernanceListField label="Legal hold references" values={draft.hold_refs} onChange={(values) => setValue("hold_refs", values)} /> <GovernanceListField label="Legal hold references" helpContextId="datasources.field.retention-policy-contract" values={draft.hold_refs} onChange={(values) => setValue("hold_refs", values)} />
<GovernanceListField label="Affected services and processes" values={draft.affected_refs} onChange={(values) => setValue("affected_refs", values)} /> <GovernanceListField label="Affected services and processes" values={draft.affected_refs} onChange={(values) => setValue("affected_refs", values)} />
<GovernanceListField label="Dependent flows, reports, controls and decisions" values={draft.dependency_refs} onChange={(values) => setValue("dependency_refs", values)} /> <GovernanceListField label="Dependent flows, reports, controls and decisions" values={draft.dependency_refs} onChange={(values) => setValue("dependency_refs", values)} />
<GovernanceListField label="Known limits" values={draft.known_limits} onChange={(values) => setValue("known_limits", values)} /> <GovernanceListField label="Known limits" values={draft.known_limits} onChange={(values) => setValue("known_limits", values)} />
@@ -1370,15 +1370,17 @@ function GovernanceDialog({
function GovernanceListField({ function GovernanceListField({
label, label,
helpContextId,
values, values,
onChange onChange
}: { }: {
label: string; label: string;
helpContextId?: string;
values: string[]; values: string[];
onChange: (values: string[]) => void; onChange: (values: string[]) => void;
}) { }) {
return ( return (
<FormField label={label}> <FormField label={label} helpContextId={helpContextId} helpModuleId="datasources">
<textarea <textarea
value={values.join("\n")} value={values.join("\n")}
onChange={(event) => onChange(splitLines(event.target.value))} onChange={(event) => onChange(splitLines(event.target.value))}