3 Commits
Author SHA1 Message Date
zemion 8b8c6c548e fix(packaging): expose immutable WebUI Git package for v0.1.25
Module Package Release / publish-packages (push) Successful in 11s
2026-09-08 02:06:09 +02:00
zemion 930302b535 Release govoplan-datasources v0.1.25: unify interface contracts and documentation 2026-09-08 01:32:31 +02:00
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
7 changed files with 93 additions and 24 deletions
+18
View File
@@ -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.
+34
View File
@@ -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
View File
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
[project]
name = "govoplan-datasources"
version = "0.1.23"
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 -1
View File
@@ -1,3 +1,3 @@
"""GovOPlaN Datasources module."""
__version__ = "0.1.23"
__version__ = "0.1.25"
+16 -1
View File
@@ -68,7 +68,7 @@ from govoplan_datasources.backend.payloads import ExternalArtifactPayloadBackend
MODULE_ID = "datasources"
MODULE_NAME = "Datasources"
MODULE_VERSION = "0.1.23"
MODULE_VERSION = "0.1.25"
DATASOURCE_INTERFACE_VERSION = "0.2.0"
ARCHITECTURE = ModuleArchitectureDeclaration(
@@ -487,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",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@govoplan/datasources-webui",
"version": "0.1.23",
"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))}