From 5c186b565e497adfcc4780fec691a6c87347d3ab Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Mon, 24 Aug 2026 17:58:22 +0200 Subject: [PATCH] feat: promote work to a stable product destination --- package.json | 2 +- pyproject.toml | 4 +-- src/govoplan_tasks/__init__.py | 2 +- src/govoplan_tasks/backend/manifest.py | 34 +++++++++++++++++++++++--- webui/package.json | 4 +-- webui/src/module.ts | 9 +++++-- 6 files changed, 44 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 093f3c1..f1e6cbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/tasks", - "version": "0.1.21", + "version": "0.1.22", "private": true, "description": "Governed work items and unified work inbox for GovOPlaN.", "type": "module", diff --git a/pyproject.toml b/pyproject.toml index 644e7fa..a2f4f7b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-tasks" -version = "0.1.21" +version = "0.1.22" description = "Governed work items and unified work inbox for GovOPlaN." readme = "README.md" requires-python = ">=3.12" authors = [{ name = "GovOPlaN" }] dependencies = [ - "govoplan-core>=0.1.18", + "govoplan-core>=0.1.44", "govoplan-access>=0.1.18", ] diff --git a/src/govoplan_tasks/__init__.py b/src/govoplan_tasks/__init__.py index 25bcfa6..fdcae09 100644 --- a/src/govoplan_tasks/__init__.py +++ b/src/govoplan_tasks/__init__.py @@ -1,3 +1,3 @@ """GovOPlaN Tasks module.""" -__version__ = "0.1.21" +__version__ = "0.1.22" diff --git a/src/govoplan_tasks/backend/manifest.py b/src/govoplan_tasks/backend/manifest.py index 2a3d618..a091810 100644 --- a/src/govoplan_tasks/backend/manifest.py +++ b/src/govoplan_tasks/backend/manifest.py @@ -26,7 +26,9 @@ from govoplan_core.core.modules import ( ModuleManifest, NavItem, PermissionDefinition, + ProductAvailabilityExplanation, ProductAreaContribution, + ProductSurfaceContribution, QuickAccessTool, RoleTemplate, ) @@ -47,7 +49,7 @@ from govoplan_tasks.backend.service import SqlTaskService MODULE_ID = "tasks" MODULE_NAME = "Tasks" -MODULE_VERSION = "0.1.21" +MODULE_VERSION = "0.1.22" READ_SCOPE = "tasks:item:read" WRITE_SCOPE = "tasks:item:write" ADMIN_SCOPE = "tasks:item:admin" @@ -209,7 +211,8 @@ DOCUMENTATION = ( title="Work in product navigation and Quick Access", summary="Keep assigned work available in the Work area and the optional right-side Quick Access rail.", body=( - "Tasks contributes its authorized workspace to the Work product area. When Quick Access is enabled, " + "Tasks contributes its authorized workspace to the stable Work destination at /work. The owner route " + "/tasks remains available through All available tools and as a compatible deep link. When Quick Access is enabled, " "a bounded seven-item authorized inbox and detail can appear beside the current page. Explicit Tasks can be " "started or completed there; work from another provider exposes only that provider's launch path. Every load " "and command is rechecked by Tasks, and completion returns a typed work-item reference to the host. Views may " @@ -224,7 +227,8 @@ DOCUMENTATION = ( "title": "Arbeit in Produktnavigation und Schnellzugriff", "summary": "Zugewiesene Arbeit im Produktbereich Arbeit und optional in der rechten Schnellzugriffsleiste verwenden.", "body": ( - "Tasks ordnet den berechtigten Arbeitsbereich dem Produktbereich Arbeit zu. Ist der Schnellzugriff aktiviert, " + "Tasks ordnet den berechtigten Arbeitsbereich dem stabilen Produktziel Arbeit unter /work zu. Der Eigentümerpfad " + "/tasks bleibt unter Alle verfügbaren Werkzeuge und als kompatibler Direktlink erreichbar. Ist der Schnellzugriff aktiviert, " "kann ein begrenzter, berechtigungsgeprüfter Arbeitsvorrat mit sieben Einträgen und Details neben der " "aktuellen Seite erscheinen. Explizite Tasks lassen sich dort beginnen oder abschließen; fremde Quellen " "behalten ihre eigenen Befehle und Startpfade. Jeder Aufruf wird erneut durch Tasks geprüft. Ansichten " @@ -407,6 +411,30 @@ manifest = ModuleManifest( order=10, ), ), + product_surfaces=( + ProductSurfaceContribution( + id="work.items", + module_id=MODULE_ID, + label="i18n:govoplan-core.product_surface.work", + description="i18n:govoplan-core.product_surface.work_description", + icon="list-checks", + entry_path="/work", + route_path="/tasks", + surface_ids=("tasks.route.work",), + presentations=("task", "reader"), + help_context_ids=("tasks.route.work",), + documentation_topic_ids=("tasks.quick-access-and-product-area",), + required_any=(READ_SCOPE,), + order=10, + unavailable=ProductAvailabilityExplanation( + reason="authorization", + title="i18n:govoplan-core.product_surface.unavailable", + description="i18n:govoplan-core.product_surface.unavailable_description", + resolution="i18n:govoplan-core.product_surface.unavailable_resolution", + responsible_role="i18n:govoplan-core.access_administrator", + ), + ), + ), quick_access_tools=( QuickAccessTool( id="tasks.work", diff --git a/webui/package.json b/webui/package.json index 14b4d20..4cea522 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/tasks-webui", - "version": "0.1.21", + "version": "0.1.22", "private": true, "type": "module", "main": "src/index.ts", @@ -14,7 +14,7 @@ "./styles/tasks.css": "./src/styles/tasks.css" }, "peerDependencies": { - "@govoplan/core-webui": "^0.1.18", + "@govoplan/core-webui": "^0.1.44", "lucide-react": "^1.23.0", "react": ">=19.2.7 <20", "react-dom": ">=19.2.7 <20", diff --git a/webui/src/module.ts b/webui/src/module.ts index dac2bd1..02956bd 100644 --- a/webui/src/module.ts +++ b/webui/src/module.ts @@ -4,6 +4,7 @@ import type { PlatformWebModule, QuickAccessToolsUiCapability } from "@govoplan/core-webui"; +import { generatedTranslations as productSurfaceTranslations } from "@govoplan/core-webui/outcome-product-surface-translations"; import TasksSummaryWidget from "./features/tasks/TasksSummaryWidget"; import TasksQuickAccess from "./features/tasks/TasksQuickAccess"; import { generatedTranslations } from "./i18n/generatedTranslations"; @@ -11,6 +12,10 @@ import "./styles/tasks.css"; const TasksPage = lazy(() => import("./features/tasks/TasksPage")); const readScope = ["tasks:item:read"]; +const translations = { + en: { ...generatedTranslations.en, ...productSurfaceTranslations.en }, + de: { ...generatedTranslations.de, ...productSurfaceTranslations.de } +}; const dashboardWidgets: DashboardWidgetsUiCapability = { widgets: [ @@ -44,10 +49,10 @@ const quickAccessTools: QuickAccessToolsUiCapability = { export const tasksModule: PlatformWebModule = { id: "tasks", label: "i18n:govoplan-tasks.work", - version: "0.1.20", + version: "0.1.22", dependencies: ["access"], optionalDependencies: ["idm", "organizations", "workflow_engine", "workflow", "notifications", "postbox", "approvals", "views", "dashboard", "search"], - translations: generatedTranslations, + translations, navItems: [ { to: "/tasks",