Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e5fc05ca3 | ||
|
|
3792e9ab8a | ||
|
|
ae0f3990f1 |
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/calendar-webui",
|
"name": "@govoplan/calendar-webui",
|
||||||
"version": "0.1.20",
|
"version": "0.1.23",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "webui/src/index.ts",
|
"main": "webui/src/index.ts",
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@govoplan/core-webui": "^0.1.18",
|
"@govoplan/core-webui": "^0.1.44",
|
||||||
"lucide-react": "^1.23.0",
|
"lucide-react": "^1.23.0",
|
||||||
"react": ">=19.2.7 <20",
|
"react": ">=19.2.7 <20",
|
||||||
"react-dom": ">=19.2.7 <20",
|
"react-dom": ">=19.2.7 <20",
|
||||||
|
|||||||
+2
-2
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "govoplan-calendar"
|
name = "govoplan-calendar"
|
||||||
version = "0.1.20"
|
version = "0.1.23"
|
||||||
description = "GovOPlaN calendar module with VEVENT storage and WebUI integration."
|
description = "GovOPlaN calendar module with VEVENT storage 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.18",
|
"govoplan-core>=0.1.44",
|
||||||
"govoplan-access>=0.1.18",
|
"govoplan-access>=0.1.18",
|
||||||
"defusedxml>=0.7,<1",
|
"defusedxml>=0.7,<1",
|
||||||
"icalendar>=7.2",
|
"icalendar>=7.2",
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
__all__ = ["__version__"]
|
__all__ = ["__version__"]
|
||||||
|
|
||||||
__version__ = "0.1.20"
|
__version__ = "0.1.23"
|
||||||
|
|||||||
@@ -0,0 +1,112 @@
|
|||||||
|
"""German translations for public structured documentation metadata."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
GERMAN_STRUCTURED_TRANSLATIONS: dict[str, dict[str, Any]] = {'calendar.external-sources-and-sync': {'consequence_classes': {'change_collection': 'Änderung der '
|
||||||
|
'Kalenderidentität, '
|
||||||
|
'Quellkonfiguration, '
|
||||||
|
'Anmeldeinformationen '
|
||||||
|
'und '
|
||||||
|
'Synchronisierungsrichtlinie',
|
||||||
|
'delete_or_remove_collection': 'Löschen '
|
||||||
|
'eines '
|
||||||
|
'lokalen '
|
||||||
|
'Kalenders '
|
||||||
|
'oder '
|
||||||
|
'Entfernen '
|
||||||
|
'einer '
|
||||||
|
'externen '
|
||||||
|
'Quelle '
|
||||||
|
'nach '
|
||||||
|
'expliziter '
|
||||||
|
'Ereignisbehandlung',
|
||||||
|
'execute_remote_move': 'Kopieren '
|
||||||
|
'aller '
|
||||||
|
'Zielressourcen '
|
||||||
|
'vor dem '
|
||||||
|
'bedingten '
|
||||||
|
'Löschen '
|
||||||
|
'von '
|
||||||
|
'Quellressourcen',
|
||||||
|
'force_full_sync': 'Lesen Sie die '
|
||||||
|
'vollständige '
|
||||||
|
'Remote-Quelle '
|
||||||
|
'erneut und '
|
||||||
|
'versöhnen Sie '
|
||||||
|
'sie mit dem '
|
||||||
|
'lokalen Staat',
|
||||||
|
'synchronize_source': 'Lesen und, '
|
||||||
|
'wo '
|
||||||
|
'konfiguriert, '
|
||||||
|
'Schreiben '
|
||||||
|
'des '
|
||||||
|
'Remote-Zustands '
|
||||||
|
'unter '
|
||||||
|
'Verwendung '
|
||||||
|
'von '
|
||||||
|
'Begrenzten '
|
||||||
|
'Synchronisationsnachweisen'}},
|
||||||
|
'calendar.manage-calendars-and-events': {'consequence_classes': {'delete_event': 'Löschen des '
|
||||||
|
'ausgewählten '
|
||||||
|
'Ereignisses '
|
||||||
|
'oder der '
|
||||||
|
'ausgewählten '
|
||||||
|
'Serie und '
|
||||||
|
'Synchronisieren '
|
||||||
|
'der '
|
||||||
|
'Warteschlange '
|
||||||
|
'bei Bedarf',
|
||||||
|
'save_event': 'Erstellen oder '
|
||||||
|
'Aktualisieren des '
|
||||||
|
'maßgeblichen '
|
||||||
|
'Ereignisses und '
|
||||||
|
'Synchronisieren '
|
||||||
|
'der Warteschlange '
|
||||||
|
'bei Bedarf'}},
|
||||||
|
'calendar.outbound-change-recovery': {'consequence_classes': {'reconcile_outbox': 'Vergleichen '
|
||||||
|
'Sie die '
|
||||||
|
'neueste '
|
||||||
|
'gewünschte '
|
||||||
|
'Generation mit '
|
||||||
|
'dem '
|
||||||
|
'Remote-Zustand, '
|
||||||
|
'bevor Sie '
|
||||||
|
'erneut '
|
||||||
|
'versuchen oder '
|
||||||
|
'verwerfen'}},
|
||||||
|
'calendar.privacy.data-subject-requests': {'limitations': ['Rohe ICS und Steckverbinder-Locatoren '
|
||||||
|
'sind nicht in den JSON-Export '
|
||||||
|
'eingebettet; autorisierte '
|
||||||
|
'Kalenderüberprüfung bleibt '
|
||||||
|
'verbindlich.',
|
||||||
|
'Event- und Teilnehmerlöschung ist '
|
||||||
|
'manuell, da sich Wiederholung, '
|
||||||
|
'gemeinsame Teilnahme, externe '
|
||||||
|
'Synchronisierung und institutionelle '
|
||||||
|
'Bindung überschneiden können.'],
|
||||||
|
'prerequisites': ['Die Datenschutzanfrage und die '
|
||||||
|
'Kalenderauswahl wurden unabhängig '
|
||||||
|
'autorisiert und bestätigt.',
|
||||||
|
'Der Rezensent versteht die '
|
||||||
|
'effektiven Kalenderspeicherungs- '
|
||||||
|
'und '
|
||||||
|
'Synchronisationsnachweispflichten.'],
|
||||||
|
'steps': ['Führen Sie die Kalenderanbietersuche aus '
|
||||||
|
'und überprüfen Sie die isolierten '
|
||||||
|
'Ereignis-, Teilnahme-, Präferenz-, '
|
||||||
|
'Synchronisierungs-, Outbox- und '
|
||||||
|
'Migrationsdatensätze.',
|
||||||
|
'Bewahren Sie alle Gründe für die '
|
||||||
|
'Aufbewahrung von Nachweisen mit der '
|
||||||
|
'Fallentscheidung auf und koordinieren Sie '
|
||||||
|
'jede Inhaltsänderung durch '
|
||||||
|
'Kalender-Lebenszykluskontrollen.',
|
||||||
|
'Führen Sie nur eine genehmigte Löschung der '
|
||||||
|
'persönlichen Ansichtspräferenz aus.',
|
||||||
|
'Überprüfen Sie die zugehörigen '
|
||||||
|
'Terminplanungs- oder E-Mail-Datensätze über '
|
||||||
|
'ihre eigenen DSAR-Anbieter, wenn diese '
|
||||||
|
'Module installiert sind.']}}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from govoplan_core.core.modules import with_documentation_structured_translations
|
||||||
|
from govoplan_calendar.backend.german_structured_documentation import GERMAN_STRUCTURED_TRANSLATIONS
|
||||||
|
|
||||||
from dataclasses import replace
|
from dataclasses import replace
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
@@ -36,7 +39,9 @@ from govoplan_core.core.modules import (
|
|||||||
ModuleManifest,
|
ModuleManifest,
|
||||||
NavItem,
|
NavItem,
|
||||||
PermissionDefinition,
|
PermissionDefinition,
|
||||||
|
ProductAvailabilityExplanation,
|
||||||
ProductAreaContribution,
|
ProductAreaContribution,
|
||||||
|
ProductSurfaceContribution,
|
||||||
QuickAccessTool,
|
QuickAccessTool,
|
||||||
RoleTemplate,
|
RoleTemplate,
|
||||||
)
|
)
|
||||||
@@ -615,7 +620,7 @@ def _open_xchange_provider_states(context):
|
|||||||
manifest = ModuleManifest(
|
manifest = ModuleManifest(
|
||||||
id="calendar",
|
id="calendar",
|
||||||
name="Calendar",
|
name="Calendar",
|
||||||
version="0.1.20",
|
version="0.1.23",
|
||||||
required_capabilities=(
|
required_capabilities=(
|
||||||
CAPABILITY_AUTH_PRINCIPAL_RESOLVER,
|
CAPABILITY_AUTH_PRINCIPAL_RESOLVER,
|
||||||
CAPABILITY_AUTH_PERMISSION_EVALUATOR,
|
CAPABILITY_AUTH_PERMISSION_EVALUATOR,
|
||||||
@@ -776,7 +781,8 @@ manifest = ModuleManifest(
|
|||||||
title="Calendar in product navigation and Quick Access",
|
title="Calendar in product navigation and Quick Access",
|
||||||
summary="Use Calendar in Meetings and decisions and keep an optional compact agenda beside current work.",
|
summary="Use Calendar in Meetings and decisions and keep an optional compact agenda beside current work.",
|
||||||
body=(
|
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 "
|
"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 "
|
"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 "
|
"permission can launch the full owner-rendered creation dialog at that date. Calendar rechecks tenant, scope, private "
|
||||||
@@ -792,7 +798,8 @@ manifest = ModuleManifest(
|
|||||||
"title": "Kalender in Produktnavigation und Schnellzugriff",
|
"title": "Kalender in Produktnavigation und Schnellzugriff",
|
||||||
"summary": "Den Kalender unter Termine und Entscheidungen sowie optional als kompakte Agenda neben der aktuellen Arbeit verwenden.",
|
"summary": "Den Kalender unter Termine und Entscheidungen sowie optional als kompakte Agenda neben der aktuellen Arbeit verwenden.",
|
||||||
"body": (
|
"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 "
|
"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 "
|
"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 "
|
"sich der vollständige Termineditor für dieses Datum öffnen. Calendar prüft Mandant, Berechtigung, private "
|
||||||
@@ -1166,6 +1173,31 @@ manifest = ModuleManifest(
|
|||||||
order=50,
|
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=(
|
quick_access_tools=(
|
||||||
QuickAccessTool(
|
QuickAccessTool(
|
||||||
id="calendar.agenda",
|
id="calendar.agenda",
|
||||||
@@ -1208,5 +1240,10 @@ manifest = ModuleManifest(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
manifest = with_documentation_structured_translations(
|
||||||
|
manifest, locale="de", translations=GERMAN_STRUCTURED_TRANSLATIONS
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_manifest() -> ModuleManifest:
|
def get_manifest() -> ModuleManifest:
|
||||||
return manifest
|
return manifest
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/calendar-webui",
|
"name": "@govoplan/calendar-webui",
|
||||||
"version": "0.1.20",
|
"version": "0.1.23",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"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"
|
"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": {
|
"peerDependencies": {
|
||||||
"@govoplan/core-webui": "^0.1.18",
|
"@govoplan/core-webui": "^0.1.44",
|
||||||
"lucide-react": "^1.23.0",
|
"lucide-react": "^1.23.0",
|
||||||
"react": ">=19.2.7 <20",
|
"react": ">=19.2.7 <20",
|
||||||
"react-dom": ">=19.2.7 <20",
|
"react-dom": ">=19.2.7 <20",
|
||||||
|
|||||||
@@ -703,6 +703,8 @@ export function CalendarCollectionDeleteDialog({
|
|||||||
<legend>{eventCount} event{eventCount === 1 ? "" : "s"}</legend>
|
<legend>{eventCount} event{eventCount === 1 ? "" : "s"}</legend>
|
||||||
<label>
|
<label>
|
||||||
<input
|
<input
|
||||||
|
data-help-context-id="calendar.collection-editor"
|
||||||
|
data-help-module-id="calendar"
|
||||||
type="radio"
|
type="radio"
|
||||||
name="calendar-delete-event-action"
|
name="calendar-delete-event-action"
|
||||||
value="delete"
|
value="delete"
|
||||||
@@ -713,6 +715,8 @@ export function CalendarCollectionDeleteDialog({
|
|||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<input
|
<input
|
||||||
|
data-help-context-id="calendar.collection-editor"
|
||||||
|
data-help-module-id="calendar"
|
||||||
type="radio"
|
type="radio"
|
||||||
name="calendar-delete-event-action"
|
name="calendar-delete-event-action"
|
||||||
value="move"
|
value="move"
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ export function CalendarEventDialog({
|
|||||||
<>
|
<>
|
||||||
<div>
|
<div>
|
||||||
{event && canDelete &&
|
{event && canDelete &&
|
||||||
<Button type="button" variant="danger" onClick={requestDelete} disabled={saving} disabledReason={saving ? CALENDAR_I18N.saving : undefined}>
|
<Button type="button" variant="danger" helpContextId="calendar.event-editor" helpModuleId="calendar" onClick={requestDelete} disabled={saving} disabledReason={saving ? CALENDAR_I18N.saving : undefined}>
|
||||||
<Trash2 size={16} /> i18n:govoplan-calendar.delete.f6fdbe48
|
<Trash2 size={16} /> i18n:govoplan-calendar.delete.f6fdbe48
|
||||||
</Button>
|
</Button>
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -6,6 +6,7 @@ import type {
|
|||||||
QuickAccessToolsUiCapability,
|
QuickAccessToolsUiCapability,
|
||||||
SettingsSectionsUiCapability
|
SettingsSectionsUiCapability
|
||||||
} from "@govoplan/core-webui";
|
} from "@govoplan/core-webui";
|
||||||
|
import { generatedTranslations as productSurfaceTranslations } from "@govoplan/core-webui/outcome-product-surface-translations";
|
||||||
import "./styles/calendar.css";
|
import "./styles/calendar.css";
|
||||||
import { generatedTranslations } from "./i18n/generatedTranslations";
|
import { generatedTranslations } from "./i18n/generatedTranslations";
|
||||||
import CalendarPicker from "./features/calendar/CalendarPicker";
|
import CalendarPicker from "./features/calendar/CalendarPicker";
|
||||||
@@ -19,8 +20,8 @@ const CalendarSettingsPanel = lazy(
|
|||||||
|
|
||||||
const eventRead = ["calendar:event:read"];
|
const eventRead = ["calendar:event:read"];
|
||||||
const translations = {
|
const translations = {
|
||||||
en: generatedTranslations.en,
|
en: { ...generatedTranslations.en, ...productSurfaceTranslations.en },
|
||||||
de: generatedTranslations.de
|
de: { ...generatedTranslations.de, ...productSurfaceTranslations.de }
|
||||||
};
|
};
|
||||||
|
|
||||||
const calendarPicker: CalendarPickerUiCapability = { CalendarPicker };
|
const calendarPicker: CalendarPickerUiCapability = { CalendarPicker };
|
||||||
|
|||||||
Reference in New Issue
Block a user