diff --git a/package.json b/package.json index 76e4a32..f9303e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/files-webui", - "version": "0.1.24", + "version": "0.1.25", "private": true, "type": "module", "main": "webui/src/index.ts", @@ -26,7 +26,7 @@ "react-dom": ">=19.2.7 <20", "react-router": ">=8.3.0 <9", "lucide-react": "^1.23.0", - "@govoplan/core-webui": "^0.1.18" + "@govoplan/core-webui": "^0.1.44" }, "peerDependenciesMeta": { "@govoplan/core-webui": { diff --git a/pyproject.toml b/pyproject.toml index d8ef77d..48c0759 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-files" -version = "0.1.24" +version = "0.1.25" description = "GovOPlaN files module with backend and WebUI integration." readme = "README.md" requires-python = ">=3.12" license = { file = "LICENSE" } authors = [{ name = "GovOPlaN" }] dependencies = [ - "govoplan-core>=0.1.42", + "govoplan-core>=0.1.44", "defusedxml>=0.7,<1", "pyzipper>=0.3.6,<1", "python-multipart>=0.0.31,<1", diff --git a/src/govoplan_files/backend/manifest.py b/src/govoplan_files/backend/manifest.py index e998988..4f79463 100644 --- a/src/govoplan_files/backend/manifest.py +++ b/src/govoplan_files/backend/manifest.py @@ -37,7 +37,9 @@ from govoplan_core.core.modules import ( ModuleManifest, NavItem, PermissionDefinition, + ProductAvailabilityExplanation, ProductAreaContribution, + ProductSurfaceContribution, QuickAccessTool, RoleTemplate, ) @@ -459,7 +461,7 @@ def _dsar_provider(context: ModuleContext) -> object: manifest = ModuleManifest( id="files", name="Files", - version="0.1.24", + version="0.1.25", required_capabilities=( CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR, @@ -606,6 +608,31 @@ manifest = ModuleManifest( 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=( QuickAccessTool( id="files.recent", @@ -771,7 +798,8 @@ manifest = ModuleManifest( 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.", 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. " "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 " @@ -801,7 +829,8 @@ manifest = ModuleManifest( "title": "Dateien in Akten und Dokumente sowie im Schnellzugriff", "summary": "Verwaltete Dateien im Produktbereich Akten und Dokumente und optional neben der aktuellen Arbeit verwenden.", "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 " "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, " diff --git a/webui/package.json b/webui/package.json index cafa306..4a09f70 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/files-webui", - "version": "0.1.24", + "version": "0.1.25", "private": true, "type": "module", "main": "src/index.ts", @@ -28,7 +28,7 @@ "react-dom": ">=19.2.7 <20", "react-router": ">=8.3.0 <9", "lucide-react": "^1.23.0", - "@govoplan/core-webui": "^0.1.18" + "@govoplan/core-webui": "^0.1.44" }, "peerDependenciesMeta": { "@govoplan/core-webui": { diff --git a/webui/src/module.ts b/webui/src/module.ts index da9f902..1a76b02 100644 --- a/webui/src/module.ts +++ b/webui/src/module.ts @@ -8,6 +8,7 @@ import { type PlatformWebModule, type QuickAccessToolsUiCapability } from "@govoplan/core-webui"; +import { generatedTranslations as productSurfaceTranslations } from "@govoplan/core-webui/outcome-product-surface-translations"; import { FolderTree } from "./features/files/components/FileManagerComponents"; import FileConnectorSettingsPanel from "./features/files/FileConnectorSettingsPanel"; import ManagedFileChooser from "./features/files/components/ManagedFileChooser"; @@ -22,8 +23,8 @@ const FileIntegrityPanel = lazy(() => import("./features/files/FileIntegrityPane const fileRead = ["files:file:read"]; const translations = { - en: generatedTranslations.en, - de: generatedTranslations.de + en: { ...generatedTranslations.en, ...productSurfaceTranslations.en }, + de: { ...generatedTranslations.de, ...productSurfaceTranslations.de } }; const fileDashboardWidgets: DashboardWidgetsUiCapability = { widgets: [