feat: promote files to a stable product destination
Module Package Release / publish-packages (push) Successful in 11s

This commit is contained in:
2026-08-24 17:58:33 +02:00
parent 6176e9f40e
commit 2baa8f2657
5 changed files with 41 additions and 11 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/files-webui", "name": "@govoplan/files-webui",
"version": "0.1.24", "version": "0.1.25",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "webui/src/index.ts", "main": "webui/src/index.ts",
@@ -26,7 +26,7 @@
"react-dom": ">=19.2.7 <20", "react-dom": ">=19.2.7 <20",
"react-router": ">=8.3.0 <9", "react-router": ">=8.3.0 <9",
"lucide-react": "^1.23.0", "lucide-react": "^1.23.0",
"@govoplan/core-webui": "^0.1.18" "@govoplan/core-webui": "^0.1.44"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@govoplan/core-webui": { "@govoplan/core-webui": {
+2 -2
View File
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "govoplan-files" name = "govoplan-files"
version = "0.1.24" version = "0.1.25"
description = "GovOPlaN files module with backend and WebUI integration." description = "GovOPlaN files module with backend and WebUI integration."
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
license = { file = "LICENSE" } license = { file = "LICENSE" }
authors = [{ name = "GovOPlaN" }] authors = [{ name = "GovOPlaN" }]
dependencies = [ dependencies = [
"govoplan-core>=0.1.42", "govoplan-core>=0.1.44",
"defusedxml>=0.7,<1", "defusedxml>=0.7,<1",
"pyzipper>=0.3.6,<1", "pyzipper>=0.3.6,<1",
"python-multipart>=0.0.31,<1", "python-multipart>=0.0.31,<1",
+32 -3
View File
@@ -37,7 +37,9 @@ from govoplan_core.core.modules import (
ModuleManifest, ModuleManifest,
NavItem, NavItem,
PermissionDefinition, PermissionDefinition,
ProductAvailabilityExplanation,
ProductAreaContribution, ProductAreaContribution,
ProductSurfaceContribution,
QuickAccessTool, QuickAccessTool,
RoleTemplate, RoleTemplate,
) )
@@ -459,7 +461,7 @@ def _dsar_provider(context: ModuleContext) -> object:
manifest = ModuleManifest( manifest = ModuleManifest(
id="files", id="files",
name="Files", name="Files",
version="0.1.24", version="0.1.25",
required_capabilities=( required_capabilities=(
CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PRINCIPAL_RESOLVER,
CAPABILITY_AUTH_PERMISSION_EVALUATOR, CAPABILITY_AUTH_PERMISSION_EVALUATOR,
@@ -606,6 +608,31 @@ manifest = ModuleManifest(
order=30, order=30,
), ),
), ),
product_surfaces=(
ProductSurfaceContribution(
id="records.files",
module_id="files",
label="i18n:govoplan-core.product_surface.files",
description="i18n:govoplan-core.product_surface.files_description",
icon="folder",
entry_path="/documents",
route_path="/files",
surface_ids=("files.nav.files", "files.route.files"),
presentations=("task", "reader"),
search_source_ids=("files.objects",),
help_context_ids=("files.list",),
documentation_topic_ids=("files.quick-access-and-product-area",),
required_any=("files:file:read",),
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=( quick_access_tools=(
QuickAccessTool( QuickAccessTool(
id="files.recent", id="files.recent",
@@ -771,7 +798,8 @@ manifest = ModuleManifest(
title="Files in Records and documents and Quick Access", title="Files in Records and documents and Quick Access",
summary="Use managed files in the Records and documents area and keep a compact file surface beside current work.", summary="Use managed files in the Records and documents area and keep a compact file surface beside current work.",
body=( body=(
"Files contributes its authorized workspace to Records and documents. When Quick Access is enabled, the owner-rendered " "Files contributes its authorized workspace to the stable Files destination at /documents in Records and documents. "
"The owner route /files remains available through All available tools and as a compatible deep link. When Quick Access is enabled, the owner-rendered "
"selector shows at most seven recently changed files and can return one exact file-version reference to the current task. " "selector shows at most seven recently changed files and can return one exact file-version reference to the current task. "
"Accounts with upload permission can launch the full Files upload dialog into a freshly reauthorized managed space. Opening " "Accounts with upload permission can launch the full Files upload dialog into a freshly reauthorized managed space. Opening "
"either path causes Files to re-run its own provider, space, folder, object, and scope checks; completion and cancellation are " "either path causes Files to re-run its own provider, space, folder, object, and scope checks; completion and cancellation are "
@@ -801,7 +829,8 @@ manifest = ModuleManifest(
"title": "Dateien in Akten und Dokumente sowie im Schnellzugriff", "title": "Dateien in Akten und Dokumente sowie im Schnellzugriff",
"summary": "Verwaltete Dateien im Produktbereich Akten und Dokumente und optional neben der aktuellen Arbeit verwenden.", "summary": "Verwaltete Dateien im Produktbereich Akten und Dokumente und optional neben der aktuellen Arbeit verwenden.",
"body": ( "body": (
"Files ordnet seinen berechtigten Arbeitsbereich Akten und Dokumente zu. Ist der Schnellzugriff aktiviert, erscheint " "Files ordnet seinen berechtigten Arbeitsbereich dem stabilen Produktziel Dateien unter /documents in Akten und Dokumente zu. "
"Der Eigentümerpfad /files bleibt unter Alle verfügbaren Werkzeuge und als kompatibler Direktlink erreichbar. Ist der Schnellzugriff aktiviert, erscheint "
"die vom Modul gerenderte Auswahl von höchstens sieben zuletzt geänderten berechtigten Dateien rechts neben der aktuellen " "die vom Modul gerenderte Auswahl von höchstens sieben zuletzt geänderten berechtigten Dateien rechts neben der aktuellen "
"Seite und kann einen exakten Dateiversionsverweis zurückgeben. Mit Upload-Berechtigung lässt sich der vollständige " "Seite und kann einen exakten Dateiversionsverweis zurückgeben. Mit Upload-Berechtigung lässt sich der vollständige "
"Upload-Dialog in einem erneut berechtigungsgeprüften verwalteten Bereich öffnen. Files prüft Anbieter, Bereich, Ordner, " "Upload-Dialog in einem erneut berechtigungsgeprüften verwalteten Bereich öffnen. Files prüft Anbieter, Bereich, Ordner, "
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/files-webui", "name": "@govoplan/files-webui",
"version": "0.1.24", "version": "0.1.25",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/index.ts", "main": "src/index.ts",
@@ -28,7 +28,7 @@
"react-dom": ">=19.2.7 <20", "react-dom": ">=19.2.7 <20",
"react-router": ">=8.3.0 <9", "react-router": ">=8.3.0 <9",
"lucide-react": "^1.23.0", "lucide-react": "^1.23.0",
"@govoplan/core-webui": "^0.1.18" "@govoplan/core-webui": "^0.1.44"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@govoplan/core-webui": { "@govoplan/core-webui": {
+3 -2
View File
@@ -8,6 +8,7 @@ import {
type PlatformWebModule, type PlatformWebModule,
type QuickAccessToolsUiCapability type QuickAccessToolsUiCapability
} from "@govoplan/core-webui"; } from "@govoplan/core-webui";
import { generatedTranslations as productSurfaceTranslations } from "@govoplan/core-webui/outcome-product-surface-translations";
import { FolderTree } from "./features/files/components/FileManagerComponents"; import { FolderTree } from "./features/files/components/FileManagerComponents";
import FileConnectorSettingsPanel from "./features/files/FileConnectorSettingsPanel"; import FileConnectorSettingsPanel from "./features/files/FileConnectorSettingsPanel";
import ManagedFileChooser from "./features/files/components/ManagedFileChooser"; import ManagedFileChooser from "./features/files/components/ManagedFileChooser";
@@ -22,8 +23,8 @@ const FileIntegrityPanel = lazy(() => import("./features/files/FileIntegrityPane
const fileRead = ["files:file:read"]; const fileRead = ["files:file:read"];
const translations = { const translations = {
en: generatedTranslations.en, en: { ...generatedTranslations.en, ...productSurfaceTranslations.en },
de: generatedTranslations.de de: { ...generatedTranslations.de, ...productSurfaceTranslations.de }
}; };
const fileDashboardWidgets: DashboardWidgetsUiCapability = { const fileDashboardWidgets: DashboardWidgetsUiCapability = {
widgets: [ widgets: [