diff --git a/package.json b/package.json index 01d2fa0..abce08a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/calendar-webui", - "version": "0.1.22", + "version": "0.1.23", "private": true, "type": "module", "main": "webui/src/index.ts", @@ -19,7 +19,7 @@ "LICENSE" ], "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/pyproject.toml b/pyproject.toml index 830857c..f1698eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-calendar" -version = "0.1.22" +version = "0.1.23" description = "GovOPlaN calendar module with VEVENT storage and WebUI integration." readme = "README.md" requires-python = ">=3.12" license = { file = "LICENSE" } authors = [{ name = "GovOPlaN" }] dependencies = [ - "govoplan-core>=0.1.18", + "govoplan-core>=0.1.44", "govoplan-access>=0.1.18", "defusedxml>=0.7,<1", "icalendar>=7.2", diff --git a/src/govoplan_calendar/__init__.py b/src/govoplan_calendar/__init__.py index 8abab43..ec15811 100644 --- a/src/govoplan_calendar/__init__.py +++ b/src/govoplan_calendar/__init__.py @@ -2,4 +2,4 @@ __all__ = ["__version__"] -__version__ = "0.1.22" +__version__ = "0.1.23" diff --git a/src/govoplan_calendar/backend/manifest.py b/src/govoplan_calendar/backend/manifest.py index 0abd79e..b039340 100644 --- a/src/govoplan_calendar/backend/manifest.py +++ b/src/govoplan_calendar/backend/manifest.py @@ -39,7 +39,9 @@ from govoplan_core.core.modules import ( ModuleManifest, NavItem, PermissionDefinition, + ProductAvailabilityExplanation, ProductAreaContribution, + ProductSurfaceContribution, QuickAccessTool, RoleTemplate, ) @@ -618,7 +620,7 @@ def _open_xchange_provider_states(context): manifest = ModuleManifest( id="calendar", name="Calendar", - version="0.1.22", + version="0.1.23", required_capabilities=( CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR, @@ -779,7 +781,8 @@ manifest = ModuleManifest( title="Calendar in product navigation and Quick Access", summary="Use Calendar in Meetings and decisions and keep an optional compact agenda beside current work.", body=( - "Calendar contributes its workspace to Meetings and decisions. When Quick Access is enabled, " + "Calendar contributes its workspace to the stable Calendar destination at /agenda in Meetings and decisions. " + "The owner route /calendar remains available through All available tools and as a compatible deep link. When Quick Access is enabled, " "the owner-rendered agenda shows at most seven authorized events across the current or explicitly selected temporal " "context and links to the full workspace. Event selection returns a typed Calendar reference; accounts with event-write " "permission can launch the full owner-rendered creation dialog at that date. Calendar rechecks tenant, scope, private " @@ -795,7 +798,8 @@ manifest = ModuleManifest( "title": "Kalender in Produktnavigation und Schnellzugriff", "summary": "Den Kalender unter Termine und Entscheidungen sowie optional als kompakte Agenda neben der aktuellen Arbeit verwenden.", "body": ( - "Calendar ordnet seinen Arbeitsbereich Termine und Entscheidungen zu. Ist der Schnellzugriff aktiviert, " + "Calendar ordnet seinen Arbeitsbereich dem stabilen Produktziel Kalender unter /agenda in Termine und Entscheidungen zu. " + "Der Eigentümerpfad /calendar bleibt unter Alle verfügbaren Werkzeuge und als kompatibler Direktlink erreichbar. Ist der Schnellzugriff aktiviert, " "zeigt die vom Kalender gerenderte Agenda höchstens sieben berechtigte Termine im aktuellen oder ausdrücklich " "gewählten Zeitkontext. Die Terminauswahl liefert eine typisierte Kalenderreferenz; mit Schreibberechtigung lässt " "sich der vollständige Termineditor für dieses Datum öffnen. Calendar prüft Mandant, Berechtigung, private " @@ -1169,6 +1173,31 @@ manifest = ModuleManifest( order=50, ), ), + product_surfaces=( + ProductSurfaceContribution( + id="meetings.calendar", + module_id="calendar", + label="i18n:govoplan-core.product_surface.calendar", + description="i18n:govoplan-core.product_surface.calendar_description", + icon="calendar", + entry_path="/agenda", + route_path="/calendar", + surface_ids=("calendar.nav.calendar", "calendar.route.calendar"), + presentations=("task", "reader"), + search_source_ids=("calendar.events",), + help_context_ids=("calendar.page",), + documentation_topic_ids=("calendar.quick-access-and-product-area",), + required_any=("calendar:event: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="calendar.agenda", diff --git a/webui/package.json b/webui/package.json index aa5dc69..3170a58 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/calendar-webui", - "version": "0.1.22", + "version": "0.1.23", "private": true, "type": "module", "main": "src/index.ts", @@ -18,7 +18,7 @@ "test:calendar-page": "tsc -p tsconfig.calendar-page-tests.json && node --experimental-strip-types tests/calendar-view-model.test.ts && node tests/calendar-page-structure.test.mjs" }, "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 6becb3e..ce80706 100644 --- a/webui/src/module.ts +++ b/webui/src/module.ts @@ -6,6 +6,7 @@ import type { QuickAccessToolsUiCapability, SettingsSectionsUiCapability } from "@govoplan/core-webui"; +import { generatedTranslations as productSurfaceTranslations } from "@govoplan/core-webui/outcome-product-surface-translations"; import "./styles/calendar.css"; import { generatedTranslations } from "./i18n/generatedTranslations"; import CalendarPicker from "./features/calendar/CalendarPicker"; @@ -19,8 +20,8 @@ const CalendarSettingsPanel = lazy( const eventRead = ["calendar:event:read"]; const translations = { - en: generatedTranslations.en, - de: generatedTranslations.de + en: { ...generatedTranslations.en, ...productSurfaceTranslations.en }, + de: { ...generatedTranslations.de, ...productSurfaceTranslations.de } }; const calendarPicker: CalendarPickerUiCapability = { CalendarPicker };