Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b8c6c548e | ||
|
|
930302b535 | ||
|
|
ad8235028f | ||
|
|
62970d6374 |
@@ -70,3 +70,21 @@ Published or referenced state, immutable materializations, lifecycle evidence,
|
||||
governance evidence,
|
||||
holds, and operator attribution require data-steward review. Dataflow and
|
||||
Reporting derivatives must be refreshed after the source correction.
|
||||
|
||||
## Git-source WebUI package
|
||||
|
||||
The repository root exposes `@govoplan/datasources-webui` for Git-tagged release
|
||||
dependencies. It mirrors the owning `webui/package.json` version, public
|
||||
TypeScript/CSS exports and peer requirements, with entry paths under
|
||||
`webui/src`. Consumers provide the shared Core/React peers; the facade runs no
|
||||
development or install scripts. The source archive contains `webui/src`, this
|
||||
README and any repository license file. Run module development checks from `webui/`; Python
|
||||
installation remains governed by `pyproject.toml`.
|
||||
|
||||
Das Repository stellt `@govoplan/datasources-webui` am Wurzelpfad für versionierte
|
||||
Git-Abhängigkeiten bereit. Version, öffentliche TypeScript-/CSS-Exporte und
|
||||
Peer-Anforderungen entsprechen `webui/package.json`; die Einstiegspfade liegen
|
||||
unter `webui/src`. Gemeinsame Core-/React-Peers stellt die einbindende Anwendung
|
||||
bereit. Die Fassade führt keine Entwicklungs- oder Installationsskripte aus.
|
||||
Entwicklungsprüfungen bleiben in `webui/`, die Python-Installation weiterhin in
|
||||
`pyproject.toml` definiert.
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "@govoplan/datasources-webui",
|
||||
"version": "0.1.25",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"main": "webui/src/index.ts",
|
||||
"module": "webui/src/index.ts",
|
||||
"types": "webui/src/index.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./webui/src/index.ts",
|
||||
"import": "./webui/src/index.ts"
|
||||
},
|
||||
"./styles/datasources.css": "./webui/src/styles/datasources.css"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@govoplan/core-webui": "^0.1.45",
|
||||
"lucide-react": "^1.23.0",
|
||||
"react": ">=19.2.7 <20",
|
||||
"react-dom": ">=19.2.7 <20",
|
||||
"react-router": ">=8.3.0 <9",
|
||||
"typescript": "^5.7.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@govoplan/core-webui": {
|
||||
"optional": true
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
"webui/src",
|
||||
"README.md",
|
||||
"LICENSE"
|
||||
]
|
||||
}
|
||||
+2
-2
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "govoplan-datasources"
|
||||
version = "0.1.22"
|
||||
version = "0.1.25"
|
||||
description = "Governed datasource catalogue, staging, and materialization lifecycle for GovOPlaN."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
license = "AGPL-3.0-or-later"
|
||||
authors = [{ name = "GovOPlaN" }]
|
||||
dependencies = ["govoplan-core>=0.1.20"]
|
||||
dependencies = ["govoplan-core>=0.1.45"]
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
"""GovOPlaN Datasources module."""
|
||||
|
||||
__version__ = "0.1.22"
|
||||
__version__ = "0.1.25"
|
||||
|
||||
@@ -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.']}}
|
||||
@@ -1,5 +1,8 @@
|
||||
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 govoplan_core.core.access import (
|
||||
@@ -65,7 +68,7 @@ from govoplan_datasources.backend.payloads import ExternalArtifactPayloadBackend
|
||||
|
||||
MODULE_ID = "datasources"
|
||||
MODULE_NAME = "Datasources"
|
||||
MODULE_VERSION = "0.1.22"
|
||||
MODULE_VERSION = "0.1.25"
|
||||
DATASOURCE_INTERFACE_VERSION = "0.2.0"
|
||||
|
||||
ARCHITECTURE = ModuleArchitectureDeclaration(
|
||||
@@ -484,6 +487,21 @@ manifest = ModuleManifest(
|
||||
),
|
||||
architecture=ARCHITECTURE,
|
||||
documentation=(
|
||||
DocumentationTopic(
|
||||
id="datasources.workspace-layout",
|
||||
title="Datasources workspace actions",
|
||||
summary="Find collection-wide commands in their consistent workspace position.",
|
||||
body="Reload and Add datasource or stage use the persistent full-width workspace header at the upper right; Reload sits immediately before creation. Selecting a record, changing filters, or opening an editor does not move these collection-wide commands into the left pane. Catalogue, staging, and origin filters remain in the collection pane. Snapshot and freeze actions remain with their selected resource. Existing permissions, disabled-state rules, and unsaved-change guards still apply. Administrators configure authority through the existing permission system; no new permission or automatic operation is introduced.",
|
||||
layer="static",
|
||||
documentation_types=("user", "admin"),
|
||||
audience=("user", "module_admin", "operator"),
|
||||
order=5,
|
||||
translations={"de": {
|
||||
"title": "Datenquellen: Aktionen im Arbeitsbereich",
|
||||
"summary": "Sammlungsweite Aktionen an ihrer einheitlichen Position im Arbeitsbereich finden.",
|
||||
"body": "Neu laden und Datenquelle oder Staging hinzufügen stehen oben rechts in der dauerhaft sichtbaren, arbeitsbereichsweiten Leiste; Neu laden steht unmittelbar vor dem Anlegen. Auswahl, Filterwechsel und Bearbeitung verschieben diese sammlungsweiten Aktionen nicht in den linken Bereich. Katalog-, Staging- und Herkunftsfilter bleiben im Sammlungsbereich. Snapshot- und Einfrieraktionen bleiben bei der ausgewählten Ressource. Bestehende Berechtigungen, Deaktivierungsregeln und der Schutz ungespeicherter Änderungen gelten weiterhin. Administratoren konfigurieren Rechte im bestehenden Berechtigungssystem; es entstehen weder neue Rechte noch automatische Vorgänge.",
|
||||
}},
|
||||
),
|
||||
DocumentationTopic(
|
||||
id="datasources.data-subject-requests",
|
||||
title="Datasources data-subject requests",
|
||||
@@ -906,6 +924,11 @@ manifest = ModuleManifest(
|
||||
)
|
||||
|
||||
|
||||
manifest = with_documentation_structured_translations(
|
||||
manifest, locale="de", translations=GERMAN_STRUCTURED_TRANSLATIONS
|
||||
)
|
||||
|
||||
|
||||
def get_manifest() -> ModuleManifest:
|
||||
return manifest
|
||||
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@govoplan/datasources-webui",
|
||||
"version": "0.1.22",
|
||||
"version": "0.1.25",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"main": "src/index.ts",
|
||||
@@ -17,7 +17,7 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@govoplan/core-webui": "^0.1.18",
|
||||
"@govoplan/core-webui": "^0.1.45",
|
||||
"lucide-react": "^1.23.0",
|
||||
"react": ">=19.2.7 <20",
|
||||
"react-dom": ">=19.2.7 <20",
|
||||
|
||||
@@ -315,6 +315,21 @@ export default function DatasourcesPage({
|
||||
|
||||
return (
|
||||
<WorkspaceFrame as="main" height="viewport" surface="plain" className="datasources-page" label="Datasource workspace">
|
||||
<WorkspaceActionBar
|
||||
scope="workspace"
|
||||
variant="collection"
|
||||
refreshable
|
||||
reloadAction={{ onReload: () => void reload(selectedDatasourceRef), loading: loading || working }}
|
||||
contextActions={<strong>Data</strong>}
|
||||
createAction={<IconButton
|
||||
label="Add datasource or stage"
|
||||
icon={<Plus size={17} />}
|
||||
variant="primary"
|
||||
onClick={() => setAddOpen(true)}
|
||||
disabled={!canStage && !canManage}
|
||||
disabledReason={!canStage && !canManage ? DATASOURCES_I18N.manageReason : undefined}
|
||||
/>}
|
||||
/>
|
||||
<WorkspaceLayout
|
||||
variant="split"
|
||||
primarySize="compact"
|
||||
@@ -325,21 +340,6 @@ export default function DatasourcesPage({
|
||||
contentLabel="Datasource workspace"
|
||||
contentClassName="datasources-workspace"
|
||||
primary={<>
|
||||
<WorkspaceActionBar
|
||||
scope="collection-pane"
|
||||
variant="collection"
|
||||
refreshable
|
||||
reloadAction={{ onReload: () => void reload(selectedDatasourceRef), loading: loading || working }}
|
||||
contextActions={<strong>Data</strong>}
|
||||
createAction={<IconButton
|
||||
label="Add datasource or stage"
|
||||
icon={<Plus size={17} />}
|
||||
variant="primary"
|
||||
onClick={() => setAddOpen(true)}
|
||||
disabled={!canStage && !canManage}
|
||||
disabledReason={!canStage && !canManage ? DATASOURCES_I18N.manageReason : undefined}
|
||||
/>}
|
||||
/>
|
||||
<div className="datasources-view-switch">
|
||||
<SegmentedControl<CatalogueView>
|
||||
ariaLabel="Datasource view"
|
||||
@@ -448,7 +448,7 @@ export default function DatasourcesPage({
|
||||
</Button>
|
||||
) : null}
|
||||
{view === "catalogue" && canAdmin ? (
|
||||
<Button onClick={() => setRetentionOpen(true)} disabled={working}>
|
||||
<Button helpContextId="datasources.retention" helpModuleId="datasources" onClick={() => setRetentionOpen(true)} disabled={working}>
|
||||
<Archive size={16} /> Retention
|
||||
</Button>
|
||||
) : null}
|
||||
@@ -1337,7 +1337,7 @@ function GovernanceDialog({
|
||||
<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="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="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)} />
|
||||
@@ -1370,15 +1370,17 @@ function GovernanceDialog({
|
||||
|
||||
function GovernanceListField({
|
||||
label,
|
||||
helpContextId,
|
||||
values,
|
||||
onChange
|
||||
}: {
|
||||
label: string;
|
||||
helpContextId?: string;
|
||||
values: string[];
|
||||
onChange: (values: string[]) => void;
|
||||
}) {
|
||||
return (
|
||||
<FormField label={label}>
|
||||
<FormField label={label} helpContextId={helpContextId} helpModuleId="datasources">
|
||||
<textarea
|
||||
value={values.join("\n")}
|
||||
onChange={(event) => onChange(splitLines(event.target.value))}
|
||||
|
||||
Reference in New Issue
Block a user