From f401b134e36a0b5dcf6df53303aa743dbcfa9689 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Tue, 8 Sep 2026 01:32:23 +0200 Subject: [PATCH] Release govoplan-admin v0.1.23: unify interface contracts and documentation --- package.json | 4 ++-- pyproject.toml | 4 ++-- src/govoplan_admin/backend/api/v1/routes.py | 7 +------ src/govoplan_admin/backend/manifest.py | 7 +++++-- webui/package.json | 4 ++-- webui/src/features/admin/DataSubjectRequestsPanel.tsx | 4 ++-- webui/src/features/admin/GovernanceTemplatesPanel.tsx | 4 ++-- webui/src/features/admin/ModuleManagementPanel.tsx | 4 ++-- webui/src/features/admin/SystemSettingsPanel.tsx | 1 + 9 files changed, 19 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index ac97bd6..f4313ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/admin-webui", - "version": "0.1.22", + "version": "0.1.23", "private": true, "type": "module", "main": "webui/src/index.ts", @@ -18,7 +18,7 @@ "LICENSE" ], "peerDependencies": { - "@govoplan/core-webui": "^0.1.35", + "@govoplan/core-webui": "^0.1.45", "lucide-react": "^1.23.0", "react": ">=19.2.7 <20", "react-dom": ">=19.2.7 <20", diff --git a/pyproject.toml b/pyproject.toml index 90eac51..5a54084 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-admin" -version = "0.1.22" +version = "0.1.23" description = "GovOPlaN generic administration module." readme = "README.md" requires-python = ">=3.12" authors = [{ name = "GovOPlaN" }] dependencies = [ - "govoplan-core>=0.1.35", + "govoplan-core>=0.1.45", "govoplan-access>=0.1.20", ] diff --git a/src/govoplan_admin/backend/api/v1/routes.py b/src/govoplan_admin/backend/api/v1/routes.py index 3380dbb..8ddd391 100644 --- a/src/govoplan_admin/backend/api/v1/routes.py +++ b/src/govoplan_admin/backend/api/v1/routes.py @@ -88,7 +88,6 @@ from govoplan_core.core.module_installer_notifications import ( ) from govoplan_core.core.module_license import module_license_decision, module_license_diagnostics from govoplan_core.core.navigation import ( - NavigationPreferences, navigation_preferences_from_settings, update_navigation_preferences, ) @@ -1885,11 +1884,7 @@ def write_system_settings( if "navigation" in payload.model_fields_set: item.settings = update_navigation_preferences( item.settings, - NavigationPreferences( - order=tuple(payload.navigation.order), - hidden=tuple(payload.navigation.hidden), - locked=tuple(payload.navigation.locked), - ) if payload.navigation is not None else None, + payload.navigation.model_dump(mode="json") if payload.navigation is not None else None, ) if payload.privacy_retention_policy is not None: set_privacy_policy(item, payload.privacy_retention_policy.model_dump(mode="json")) diff --git a/src/govoplan_admin/backend/manifest.py b/src/govoplan_admin/backend/manifest.py index 150cb8c..d19bd39 100644 --- a/src/govoplan_admin/backend/manifest.py +++ b/src/govoplan_admin/backend/manifest.py @@ -81,7 +81,7 @@ ADMIN_ROLE_TEMPLATES = ( manifest = ModuleManifest( id="admin", name="Admin", - version="0.1.22", + version="0.1.23", permissions=ADMIN_PERMISSIONS, role_templates=ADMIN_ROLE_TEMPLATES, required_capabilities=( @@ -153,7 +153,7 @@ manifest = ModuleManifest( id="admin.workspace", title="Use the administration workspace", summary="The administration workspace shows only the sections supplied by enabled modules and allowed by the current account's permissions.", - body="System and tenant administration share one workspace. Available sections can include settings, configuration changes and packages, governance templates, groups, and module lifecycle controls. A missing section normally means that its owning module is disabled or the current account lacks the required authority. System appearance settings select a validated palette default. Changing the separate palette lock additionally requires policy-write authority; a system lock suppresses tenant and personal palette choices, while an unlocked default remains inheritable and overridable. The separate advanced-override policy is disabled by default and also requires policy-write authority. Enabling it permits tenants to inherit or narrow access to Core's versioned, accessibility-validated personal accent, surface, and status editor; palette locks continue to win.", + body="System and tenant administration share one workspace. Available sections can include settings, configuration changes and packages, governance templates, groups, and module lifecycle controls. A missing section normally means that its owning module is disabled or the current account lacks the required authority. System appearance settings select a validated palette default. Changing the separate palette lock additionally requires policy-write authority; a system lock suppresses tenant and personal palette choices, while an unlocked default remains inheritable and overridable. The separate advanced-override policy is disabled by default and also requires policy-write authority. Enabling it permits tenants to inherit or narrow access to Core's versioned, accessibility-validated personal accent, surface, and status editor; palette locks continue to win. Opening lists and creation or edit dialogs does not save changes. If an authorized section reports a load failure, reload after deployment and report the frontend diagnostic; do not broaden permissions or recreate records to work around a render failure.", documentation_types=("admin", "user"), audience=("tenant_admin", "system_admin", "operator"), translations={ @@ -164,6 +164,7 @@ manifest = ModuleManifest( "Konto berechtigt ist." ), "body": ( + "Das Öffnen von Listen sowie Anlage- oder Bearbeitungsdialogen speichert keine Änderungen. Meldet ein berechtigter Bereich einen Ladefehler, laden Sie nach der Bereitstellung neu und melden Sie die Oberflächendiagnose; erweitern Sie keine Berechtigungen und legen Sie keine Datensätze erneut an, um einen Darstellungsfehler zu umgehen. " "System- und Mandantenadministration teilen sich einen Arbeitsbereich. Verfügbare Bereiche können Einstellungen, " "Konfigurationsänderungen und -pakete, Governance-Vorlagen, Gruppen und die Steuerung des Modul-Lebenszyklus umfassen. " "Fehlt ein Bereich, ist normalerweise sein zuständiges Modul deaktiviert oder das aktuelle Konto besitzt nicht die " @@ -328,6 +329,7 @@ manifest = ModuleManifest( summary="System administrators define the instance-wide side-rail order, visibility baseline, and entries that lower scopes must keep visible.", body=( "The system navigation setting starts from module-declared defaults. Tenant settings take precedence over the system order and visibility, and personal settings take precedence over both. A system lock prevents tenant and user preferences from hiding an entry but does not prevent them from moving it. Removing the system preference restores module defaults. Navigation policy changes presentation only: module entitlement, View policy, and permissions still decide whether a surface is accessible." + " Use the shared layout editor to drag modules and separators, add or restore available modules, remove entries from the rail, and label groups. Keyboard handles support Space, arrows, Enter, and Escape; arrow buttons also move individual entries. Collapsed rails retain group dividers. Changes stay in the page draft until Save, and Use inherited layout restores live module defaults rather than copying them. Removing a navigation entry never uninstalls a module or deletes its records." ), documentation_types=("admin",), audience=("system_admin",), @@ -346,6 +348,7 @@ manifest = ModuleManifest( "Verschiebung. Das Entfernen der Systempräferenz stellt die Modulstandardwerte wieder her. Navigationsrichtlinien ändern " "nur die Darstellung; Modulberechtigung, View-Richtlinie und Zugriffsrechte bestimmen weiterhin, ob eine Oberfläche " "erreichbar ist." + " Im gemeinsamen Anordnungseditor ziehen Sie Module und Trennlinien, ergänzen verfügbare Module, entfernen Einträge aus der Leiste und benennen Gruppen. Tastaturgriffe unterstützen Leertaste, Pfeile, Eingabe und Escape; Pfeilschaltflächen verschieben einzelne Einträge ebenfalls. Eingeklappte Leisten behalten Gruppentrenner. Änderungen bleiben bis zum Speichern im Seitenentwurf. Geerbte Anordnung verwenden stellt die aktuellen Modulstandardwerte wieder her, statt sie zu kopieren. Das Entfernen eines Navigationseintrags deinstalliert kein Modul und löscht keine Datensätze." ), } }, diff --git a/webui/package.json b/webui/package.json index 3e4abd5..898fbb6 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/admin-webui", - "version": "0.1.22", + "version": "0.1.23", "private": true, "type": "module", "main": "src/index.ts", @@ -17,7 +17,7 @@ "test:interface-patterns": "node scripts/test-interface-pattern-language.mjs" }, "peerDependencies": { - "@govoplan/core-webui": "^0.1.35", + "@govoplan/core-webui": "^0.1.45", "lucide-react": "^1.23.0", "react": ">=19.2.7 <20", "react-dom": ">=19.2.7 <20", diff --git a/webui/src/features/admin/DataSubjectRequestsPanel.tsx b/webui/src/features/admin/DataSubjectRequestsPanel.tsx index e945d14..95b8b0f 100644 --- a/webui/src/features/admin/DataSubjectRequestsPanel.tsx +++ b/webui/src/features/admin/DataSubjectRequestsPanel.tsx @@ -1,8 +1,8 @@ -import { DescriptionItem, DescriptionList } from "@govoplan/core-webui"; +import { DescriptionItem, DescriptionList, FormGrid } from "@govoplan/core-webui"; import { MetricGrid } from "@govoplan/core-webui"; import { useEffect, useMemo, useState } from "react"; import { Download, Eye, Play, Plus, RefreshCw, Search, ShieldCheck } from "lucide-react"; -import type { FormGrid, ApiSettings, DataGridColumn } from "@govoplan/core-webui"; +import type { ApiSettings, DataGridColumn } from "@govoplan/core-webui"; import { AdminIconButton, AdminPageLayout, diff --git a/webui/src/features/admin/GovernanceTemplatesPanel.tsx b/webui/src/features/admin/GovernanceTemplatesPanel.tsx index 0445b1b..eb7bc44 100644 --- a/webui/src/features/admin/GovernanceTemplatesPanel.tsx +++ b/webui/src/features/admin/GovernanceTemplatesPanel.tsx @@ -1,7 +1,7 @@ -import { DescriptionItem, DescriptionList } from "@govoplan/core-webui"; +import { DescriptionItem, DescriptionList, FormGrid } from "@govoplan/core-webui"; import { useEffect, useMemo, useState } from "react"; import { Search, Pencil, Plus, RefreshCw, Trash2 } from "lucide-react"; -import type { FormGrid, ApiSettings } from "@govoplan/core-webui"; +import type { ApiSettings } from "@govoplan/core-webui"; import { Button } from "@govoplan/core-webui"; import { ConfirmDialog } from "@govoplan/core-webui"; import { DataGrid, type DataGridColumn } from "@govoplan/core-webui"; diff --git a/webui/src/features/admin/ModuleManagementPanel.tsx b/webui/src/features/admin/ModuleManagementPanel.tsx index a31d845..3960a74 100644 --- a/webui/src/features/admin/ModuleManagementPanel.tsx +++ b/webui/src/features/admin/ModuleManagementPanel.tsx @@ -1,6 +1,6 @@ -import { MetricGrid } from "@govoplan/core-webui"; +import { ActionToolbar, MetricGrid } from "@govoplan/core-webui"; import { useEffect, useMemo, useState } from "react"; -import type { ActionToolbar, ApiSettings } from "@govoplan/core-webui"; +import type { ApiSettings } from "@govoplan/core-webui"; import { ActionBlockerHint, AdminPageLayout, adminErrorMessage, Button, ConfirmDialog, dispatchPlatformModulesChanged, DocumentationHelpLink, formatDateTime, MetricCard, SegmentedControl, StageRail, StatusBadge, ToggleSwitch, i18nMessage, useUnsavedDraftGuard, type FormatDateTimeOptions } from "@govoplan/core-webui"; import { Check, Clock, FileText, Pencil, Send } from "lucide-react"; import { diff --git a/webui/src/features/admin/SystemSettingsPanel.tsx b/webui/src/features/admin/SystemSettingsPanel.tsx index 0e51c0c..836d6d8 100644 --- a/webui/src/features/admin/SystemSettingsPanel.tsx +++ b/webui/src/features/admin/SystemSettingsPanel.tsx @@ -100,6 +100,7 @@ export default function SystemSettingsPanel({ settings, canWrite, canAccessMaint module.productAreas ?? [])} value={draft.navigation} onChange={(navigation) => setDraft({ ...draft, navigation })} scope="system"