Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f67eb25d7 | ||
|
|
3274d30665 | ||
|
|
aff2623496 | ||
|
|
4bdc3ab60c | ||
|
|
aba6280f21 |
@@ -158,3 +158,21 @@ Run focused checks with:
|
|||||||
/mnt/DATA/git/govoplan/.venv/bin/python -m unittest discover -s tests
|
/mnt/DATA/git/govoplan/.venv/bin/python -m unittest discover -s tests
|
||||||
cd webui && npm run test:ui-structure
|
cd webui && npm run test:ui-structure
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Git-source WebUI package
|
||||||
|
|
||||||
|
The repository root exposes `@govoplan/postbox-webui` for Git-tagged release
|
||||||
|
dependencies. It mirrors the owning `webui/package.json` version, public
|
||||||
|
TypeScript/CSS exports and peer requirements, with entry paths under
|
||||||
|
`webui/src`. Consumers provide the shared Core/React peers; the facade runs no
|
||||||
|
development or install scripts. The source archive contains `webui/src`, this
|
||||||
|
README and any repository license file. Run module development checks from `webui/`; Python
|
||||||
|
installation remains governed by `pyproject.toml`.
|
||||||
|
|
||||||
|
Das Repository stellt `@govoplan/postbox-webui` am Wurzelpfad für versionierte
|
||||||
|
Git-Abhängigkeiten bereit. Version, öffentliche TypeScript-/CSS-Exporte und
|
||||||
|
Peer-Anforderungen entsprechen `webui/package.json`; die Einstiegspfade liegen
|
||||||
|
unter `webui/src`. Gemeinsame Core-/React-Peers stellt die einbindende Anwendung
|
||||||
|
bereit. Die Fassade führt keine Entwicklungs- oder Installationsskripte aus.
|
||||||
|
Entwicklungsprüfungen bleiben in `webui/`, die Python-Installation weiterhin in
|
||||||
|
`pyproject.toml` definiert.
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "@govoplan/postbox-webui",
|
||||||
|
"version": "0.1.23",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"main": "webui/src/index.ts",
|
||||||
|
"module": "webui/src/index.ts",
|
||||||
|
"types": "webui/src/index.ts",
|
||||||
|
"exports": {
|
||||||
|
".": {
|
||||||
|
"types": "./webui/src/index.ts",
|
||||||
|
"import": "./webui/src/index.ts"
|
||||||
|
},
|
||||||
|
"./styles/postbox.css": "./webui/src/styles/postbox.css"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@govoplan/core-webui": "^0.1.18",
|
||||||
|
"lucide-react": "^1.23.0",
|
||||||
|
"react": ">=19.2.7 <20",
|
||||||
|
"react-dom": ">=19.2.7 <20",
|
||||||
|
"react-router": ">=8.3.0 <9"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@govoplan/core-webui": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"webui/src",
|
||||||
|
"README.md",
|
||||||
|
"LICENSE"
|
||||||
|
]
|
||||||
|
}
|
||||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "govoplan-postbox"
|
name = "govoplan-postbox"
|
||||||
version = "0.1.19"
|
version = "0.1.23"
|
||||||
description = "Function-bound institutional postboxes for GovOPlaN."
|
description = "Function-bound institutional postboxes for GovOPlaN."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.12"
|
requires-python = ">=3.12"
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
"""GovOPlaN Postbox module."""
|
"""GovOPlaN Postbox module."""
|
||||||
|
|
||||||
__version__ = "0.1.19"
|
__version__ = "0.1.23"
|
||||||
|
|||||||
@@ -0,0 +1,137 @@
|
|||||||
|
"""German translations for public structured documentation metadata."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
GERMAN_STRUCTURED_TRANSLATIONS: dict[str, dict[str, Any]] = {'postbox.content-protection-policy': {'privacy_notes': ['E2EE schützt Inhalte, nicht operative '
|
||||||
|
'Metadaten.',
|
||||||
|
'Verwaltete Umschläge sind von '
|
||||||
|
'autorisierten institutionellen '
|
||||||
|
'Schlüsselinhabern entschlüsselbar.',
|
||||||
|
'Profilübergänge bewahren '
|
||||||
|
'Autoritätsnachweise und inhaltliche '
|
||||||
|
'Kontinuität.']},
|
||||||
|
'postbox.function-bound-containers': {'privacy_notes': ['Der Verzeichniszugriff wird aus '
|
||||||
|
'aktuellen effektiven '
|
||||||
|
'Funktionszuweisungen abgeleitet.',
|
||||||
|
'Nicht verfügbare Nachrichtenzustände '
|
||||||
|
'zeigen nur gespeicherte Audit-Metadaten '
|
||||||
|
'an, die der aktuell handelnden Person '
|
||||||
|
'erlaubt sind.',
|
||||||
|
'Themen, Teilnehmer, Routing-Fakten und '
|
||||||
|
'Anhangreferenzen bleiben beobachtbare '
|
||||||
|
'Metadaten.']},
|
||||||
|
'postbox.lifecycle-notifications': {'privacy_notes': ['Lifecycle-Benachrichtigungen enthalten '
|
||||||
|
'niemals Nachrichten- oder Anhanginhalte.',
|
||||||
|
'Der aktuelle Zugriff wird erneut '
|
||||||
|
'überprüft, wenn ein Benachrichtigungslink '
|
||||||
|
'geöffnet wird.',
|
||||||
|
'Benachrichtigungen besitzen Präferenz und '
|
||||||
|
'Durchsetzung externer Kanäle.']},
|
||||||
|
'postbox.privacy.data-subject-requests': {'limitations': ['Verschlüsselte Inhalte werden vom '
|
||||||
|
'Schutzstaat gemeldet, aber nicht vom '
|
||||||
|
'Anbieter entschlüsselt oder '
|
||||||
|
'exportiert.',
|
||||||
|
'Attachment-Nutzlasten, '
|
||||||
|
'Produzentendatensätze, '
|
||||||
|
'Identitätsdatensätze und '
|
||||||
|
'Zuweisungsdatensätze verbleiben bei '
|
||||||
|
'ihren eigenen Modulen.'],
|
||||||
|
'steps': ['Führen Sie den Postbox-Anbieter aus und '
|
||||||
|
'überprüfen Sie Nachricht, Teilnehmer, '
|
||||||
|
'Empfang, Gruppierung, Zugriff und '
|
||||||
|
'Governance-Dispositionen.',
|
||||||
|
'Bewahren Sie die institutionelle Lieferung, '
|
||||||
|
'das Routing, die Bestätigung, den Zugang und '
|
||||||
|
'die Schutznachweise mit dem Grund auf.',
|
||||||
|
'Überprüfen Sie Klartextinhalte auf Daten von '
|
||||||
|
'Drittanbietern und entsprechende Datensätze '
|
||||||
|
'oder halten Sie Richtlinien vor einer '
|
||||||
|
'separaten Lifecycle-Aktion.',
|
||||||
|
'Führen Sie das Löschen von '
|
||||||
|
'Personengruppierungen nur aus einem neuen '
|
||||||
|
'Plan aus; überprüfen Sie, ob die '
|
||||||
|
'Quellpostfächer und Nachrichten unverändert '
|
||||||
|
'bleiben.']},
|
||||||
|
'postbox.reference.fields-and-consequences': {'consequence_classes': {'archive_postbox': 'Stoppt '
|
||||||
|
'neue '
|
||||||
|
'Lieferung, '
|
||||||
|
'während '
|
||||||
|
'Nachrichten, '
|
||||||
|
'Quittungen '
|
||||||
|
'und '
|
||||||
|
'Nachweise '
|
||||||
|
'beibehalten '
|
||||||
|
'werden.',
|
||||||
|
'delete_grouping': 'Löscht '
|
||||||
|
'nur die '
|
||||||
|
'persönliche '
|
||||||
|
'Projektion; '
|
||||||
|
'Quellpostfächer '
|
||||||
|
'und '
|
||||||
|
'Nachrichten '
|
||||||
|
'bleiben '
|
||||||
|
'unverändert.',
|
||||||
|
'preview_template': 'Lies '
|
||||||
|
'die '
|
||||||
|
'aktuelle '
|
||||||
|
'Organisation, '
|
||||||
|
'Hierarchie '
|
||||||
|
'und '
|
||||||
|
'den '
|
||||||
|
'Status '
|
||||||
|
'der '
|
||||||
|
'Amtsinhaber, '
|
||||||
|
'ohne '
|
||||||
|
'eine '
|
||||||
|
'Adresse '
|
||||||
|
'oder '
|
||||||
|
'Postbox '
|
||||||
|
'zu '
|
||||||
|
'materialisieren.',
|
||||||
|
'publish_template': 'Friert '
|
||||||
|
'eine '
|
||||||
|
'unveränderliche '
|
||||||
|
'Adress- '
|
||||||
|
'und '
|
||||||
|
'Routing-Revision '
|
||||||
|
'für '
|
||||||
|
'zukünftige '
|
||||||
|
'Materialisierung '
|
||||||
|
'ein.',
|
||||||
|
'retire_template': 'Stoppt '
|
||||||
|
'neue '
|
||||||
|
'Revisionen '
|
||||||
|
'und '
|
||||||
|
'Materialisierungen, '
|
||||||
|
'während '
|
||||||
|
'bestehende '
|
||||||
|
'Adressen '
|
||||||
|
'beibehalten '
|
||||||
|
'werden.',
|
||||||
|
'route_copy': 'Erstellt '
|
||||||
|
'einen '
|
||||||
|
'separat '
|
||||||
|
'aufbewahrten '
|
||||||
|
'Liefer- und '
|
||||||
|
'Beweisdatensatz '
|
||||||
|
'bei jedem '
|
||||||
|
'begrenzten '
|
||||||
|
'Ziel.',
|
||||||
|
'withdraw_or_expire': 'Blockiert '
|
||||||
|
'den '
|
||||||
|
'Zugriff '
|
||||||
|
'auf '
|
||||||
|
'zukünftige '
|
||||||
|
'Inhalte, '
|
||||||
|
'während '
|
||||||
|
'erlaubte '
|
||||||
|
'Audit-Metadaten '
|
||||||
|
'beibehalten '
|
||||||
|
'werden.'}},
|
||||||
|
'postbox.unified-inbox-policy': {'privacy_notes': ['Versteckte Gruppierungsquellen zeigen keine '
|
||||||
|
'Metadaten oder Zählungen.',
|
||||||
|
'Ein View wählt eine Projektion aus, gewährt '
|
||||||
|
'jedoch niemals Postbox-Zugriff.']}}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from govoplan_core.core.modules import with_documentation_structured_translations
|
||||||
|
from govoplan_postbox.backend.german_structured_documentation import GERMAN_STRUCTURED_TRANSLATIONS
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from govoplan_core.core.access import (
|
from govoplan_core.core.access import (
|
||||||
@@ -31,7 +34,9 @@ from govoplan_core.core.modules import (
|
|||||||
ModuleManifest,
|
ModuleManifest,
|
||||||
NavItem,
|
NavItem,
|
||||||
PermissionDefinition,
|
PermissionDefinition,
|
||||||
|
ProductAvailabilityExplanation,
|
||||||
ProductAreaContribution,
|
ProductAreaContribution,
|
||||||
|
ProductSurfaceContribution,
|
||||||
QuickAccessTool,
|
QuickAccessTool,
|
||||||
RoleTemplate,
|
RoleTemplate,
|
||||||
)
|
)
|
||||||
@@ -72,7 +77,7 @@ from govoplan_postbox.backend.permissions import (
|
|||||||
|
|
||||||
MODULE_ID = "postbox"
|
MODULE_ID = "postbox"
|
||||||
MODULE_NAME = "Postbox"
|
MODULE_NAME = "Postbox"
|
||||||
MODULE_VERSION = "0.1.19"
|
MODULE_VERSION = "0.1.23"
|
||||||
|
|
||||||
|
|
||||||
def _permission(scope: str, label: str, description: str) -> PermissionDefinition:
|
def _permission(scope: str, label: str, description: str) -> PermissionDefinition:
|
||||||
@@ -401,6 +406,40 @@ manifest = ModuleManifest(
|
|||||||
order=40,
|
order=40,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
product_surfaces=(
|
||||||
|
ProductSurfaceContribution(
|
||||||
|
id="communication.messages",
|
||||||
|
module_id=MODULE_ID,
|
||||||
|
label="i18n:govoplan-core.product_surface.messages",
|
||||||
|
description="i18n:govoplan-core.product_surface.messages_description",
|
||||||
|
icon="mail",
|
||||||
|
entry_path="/messages",
|
||||||
|
route_path="/postbox",
|
||||||
|
surface_ids=("postbox.nav.postbox", "postbox.route.postbox"),
|
||||||
|
presentations=("task", "reader"),
|
||||||
|
capability_ids=(CAPABILITY_POSTBOX_MESSAGES,),
|
||||||
|
search_source_ids=("postbox.messages",),
|
||||||
|
help_context_ids=("postbox.quick_access.messages",),
|
||||||
|
documentation_topic_ids=("postbox.quick-access-and-product-area",),
|
||||||
|
required_any=(READ_SCOPE,),
|
||||||
|
aliases=("/inbox",),
|
||||||
|
order=20,
|
||||||
|
unavailable=ProductAvailabilityExplanation(
|
||||||
|
reason="authorization",
|
||||||
|
title="i18n:govoplan-core.product_surface.messages_unavailable",
|
||||||
|
description="i18n:govoplan-core.product_surface.messages_unavailable_description",
|
||||||
|
resolution="i18n:govoplan-core.product_surface.messages_unavailable_resolution",
|
||||||
|
responsible_role="i18n:govoplan-core.access_administrator",
|
||||||
|
),
|
||||||
|
degraded=ProductAvailabilityExplanation(
|
||||||
|
reason="provider_degraded",
|
||||||
|
title="i18n:govoplan-core.product_surface.messages_degraded",
|
||||||
|
description="i18n:govoplan-core.product_surface.messages_degraded_description",
|
||||||
|
resolution="i18n:govoplan-core.product_surface.messages_degraded_resolution",
|
||||||
|
responsible_role="i18n:govoplan-core.integration_operator",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
quick_access_tools=(
|
quick_access_tools=(
|
||||||
QuickAccessTool(
|
QuickAccessTool(
|
||||||
id="postbox.messages",
|
id="postbox.messages",
|
||||||
@@ -620,7 +659,11 @@ manifest = ModuleManifest(
|
|||||||
summary="Use function-bound Postboxes in Communication and the shared Messages Quick Access drawer.",
|
summary="Use function-bound Postboxes in Communication and the shared Messages Quick Access drawer.",
|
||||||
body=(
|
body=(
|
||||||
"Postbox contributes its inbox to Communication. With Quick Access enabled, its owner-rendered surface lists at most "
|
"Postbox contributes its inbox to Communication. With Quick Access enabled, its owner-rendered surface lists at most "
|
||||||
"seven currently readable unread messages beside independent Mail and future chat providers. Selecting or opening a "
|
"seven currently readable unread messages beside independent Mail and future chat providers. "
|
||||||
|
"The stable `/messages` product entry and `/inbox` migration alias select Postbox only when its route is "
|
||||||
|
"currently authorized and visible in the effective View; otherwise another Messages owner is selected or the shell "
|
||||||
|
"explains how access can be restored. "
|
||||||
|
"Selecting or opening a "
|
||||||
"message returns a typed Postbox reference; accounts with message-write permission can launch the full owner-rendered "
|
"message returns a typed Postbox reference; accounts with message-write permission can launch the full owner-rendered "
|
||||||
"composer for a currently accessible function Postbox. Directory, message, and submission calls recheck the active "
|
"composer for a currently accessible function Postbox. Directory, message, and submission calls recheck the active "
|
||||||
"assignment or acting context. Function assignment, classification, read-receipt, retention, encryption, and evidence "
|
"assignment or acting context. Function assignment, classification, read-receipt, retention, encryption, and evidence "
|
||||||
@@ -637,6 +680,9 @@ manifest = ModuleManifest(
|
|||||||
"body": (
|
"body": (
|
||||||
"Postbox ordnet seinen Eingang Kommunikation zu. Ist der Schnellzugriff aktiviert, erscheint die vom Modul gerenderte "
|
"Postbox ordnet seinen Eingang Kommunikation zu. Ist der Schnellzugriff aktiviert, erscheint die vom Modul gerenderte "
|
||||||
"Oberfläche mit höchstens sieben aktuell lesbaren ungelesenen Nachrichten neben unabhängigen Beiträgen aus Mail. "
|
"Oberfläche mit höchstens sieben aktuell lesbaren ungelesenen Nachrichten neben unabhängigen Beiträgen aus Mail. "
|
||||||
|
"Der stabile Produkteinstieg `/messages` und der Migrationsalias `/inbox` wählen Postbox nur, wenn seine Route "
|
||||||
|
"aktuell berechtigt und in der wirksamen View sichtbar ist. Andernfalls wird ein anderer Nachrichten-Eigentümer "
|
||||||
|
"gewählt oder die Shell erklärt die Wiederherstellung des Zugriffs. "
|
||||||
"Auswahl oder Öffnen liefert eine typisierte Postbox-Referenz; mit Schreibberechtigung lässt sich der vollständige "
|
"Auswahl oder Öffnen liefert eine typisierte Postbox-Referenz; mit Schreibberechtigung lässt sich der vollständige "
|
||||||
"Editor für ein aktuell zugängliches Funktionspostfach öffnen. Verzeichnis, Nachricht und Versand prüfen die aktive "
|
"Editor für ein aktuell zugängliches Funktionspostfach öffnen. Verzeichnis, Nachricht und Versand prüfen die aktive "
|
||||||
"Zuweisung beziehungsweise den Handlungskontext erneut. Klassifikation, Lesestatus, Aufbewahrung, Verschlüsselung "
|
"Zuweisung beziehungsweise den Handlungskontext erneut. Klassifikation, Lesestatus, Aufbewahrung, Verschlüsselung "
|
||||||
@@ -852,6 +898,9 @@ manifest = ModuleManifest(
|
|||||||
"effective organization-function assignments."
|
"effective organization-function assignments."
|
||||||
),
|
),
|
||||||
body=(
|
body=(
|
||||||
|
"Documentation books sit immediately beside the visible heading or contextual label for "
|
||||||
|
"Postboxes and the relevant protection, hierarchy or inbox setting, not among operational "
|
||||||
|
"action buttons. Field help remains beside its label. "
|
||||||
"Postboxes belong to responsibilities, not individual accounts. "
|
"Postboxes belong to responsibilities, not individual accounts. "
|
||||||
"A stable postbox remains addressable during vacancy and "
|
"A stable postbox remains addressable during vacancy and "
|
||||||
"reassignment. Current access combines a generic Postbox "
|
"reassignment. Current access combines a generic Postbox "
|
||||||
@@ -894,6 +943,10 @@ manifest = ModuleManifest(
|
|||||||
"title": "Funktionsgebundene Postfächer",
|
"title": "Funktionsgebundene Postfächer",
|
||||||
"summary": "Dauerhafte institutionelle Nachrichtencontainer, deren Zugriff den wirksamen Zuweisungen zu Organisationsfunktionen folgt.",
|
"summary": "Dauerhafte institutionelle Nachrichtencontainer, deren Zugriff den wirksamen Zuweisungen zu Organisationsfunktionen folgt.",
|
||||||
"body": (
|
"body": (
|
||||||
|
"Dokumentationsbücher stehen unmittelbar neben der sichtbaren Überschrift oder "
|
||||||
|
"Kontextbezeichnung für Postfächer und die jeweilige Schutz-, Hierarchie- oder "
|
||||||
|
"Posteingangseinstellung, nicht zwischen ausführbaren Aktionsschaltflächen. Feldhilfe bleibt "
|
||||||
|
"neben der Feldbezeichnung. "
|
||||||
"Postfächer gehören zu Verantwortlichkeiten und nicht zu einzelnen Konten. Ein stabiles Postfach bleibt während "
|
"Postfächer gehören zu Verantwortlichkeiten und nicht zu einzelnen Konten. Ein stabiles Postfach bleibt während "
|
||||||
"einer Vakanz und Neubesetzung adressierbar. Der aktuelle Zugriff verbindet eine allgemeine Postfachberechtigung "
|
"einer Vakanz und Neubesetzung adressierbar. Der aktuelle Zugriff verbindet eine allgemeine Postfachberechtigung "
|
||||||
"mit dem wirksamen IDM-Zuweisungskontext. Vorlagen können einheitsspezifische Adressen bei Bedarf erzeugen; exakte "
|
"mit dem wirksamen IDM-Zuweisungskontext. Vorlagen können einheitsspezifische Adressen bei Bedarf erzeugen; exakte "
|
||||||
@@ -931,6 +984,9 @@ manifest = ModuleManifest(
|
|||||||
"classification, retention, and lifecycle fields."
|
"classification, retention, and lifecycle fields."
|
||||||
),
|
),
|
||||||
body=(
|
body=(
|
||||||
|
"Documentation books sit immediately beside the visible heading or contextual label for "
|
||||||
|
"Postboxes and the relevant protection, hierarchy or inbox setting, not among operational "
|
||||||
|
"action buttons. Field help remains beside its label. "
|
||||||
"A Postbox address is durable and bound to an organization function. "
|
"A Postbox address is durable and bound to an organization function. "
|
||||||
"Template revisions are immutable after publication; retiring a template "
|
"Template revisions are immutable after publication; retiring a template "
|
||||||
"does not remove materialized addresses. Archiving an address stops new "
|
"does not remove materialized addresses. Archiving an address stops new "
|
||||||
@@ -974,6 +1030,10 @@ manifest = ModuleManifest(
|
|||||||
"title": "Postfachfelder und ihre Auswirkungen",
|
"title": "Postfachfelder und ihre Auswirkungen",
|
||||||
"summary": "Referenz für Adresse, Vorlage, Routing, Nachricht, Gruppierung, Klassifikation, Aufbewahrung und Lebenszyklus.",
|
"summary": "Referenz für Adresse, Vorlage, Routing, Nachricht, Gruppierung, Klassifikation, Aufbewahrung und Lebenszyklus.",
|
||||||
"body": (
|
"body": (
|
||||||
|
"Dokumentationsbücher stehen unmittelbar neben der sichtbaren Überschrift oder "
|
||||||
|
"Kontextbezeichnung für Postfächer und die jeweilige Schutz-, Hierarchie- oder "
|
||||||
|
"Posteingangseinstellung, nicht zwischen ausführbaren Aktionsschaltflächen. Feldhilfe bleibt "
|
||||||
|
"neben der Feldbezeichnung. "
|
||||||
"Eine Postfachadresse ist dauerhaft und an eine Organisationsfunktion gebunden. Vorlagenrevisionen sind nach der "
|
"Eine Postfachadresse ist dauerhaft und an eine Organisationsfunktion gebunden. Vorlagenrevisionen sind nach der "
|
||||||
"Veröffentlichung unveränderlich; die Stilllegung einer Vorlage entfernt keine bereits erzeugten Adressen. Die "
|
"Veröffentlichung unveränderlich; die Stilllegung einer Vorlage entfernt keine bereits erzeugten Adressen. Die "
|
||||||
"Archivierung einer Adresse stoppt neue Zustellungen und bewahrt Nachrichten und Nachweise. Zusammengefasste "
|
"Archivierung einer Adresse stoppt neue Zustellungen und bewahrt Nachrichten und Nachweise. Zusammengefasste "
|
||||||
@@ -1048,5 +1108,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
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/postbox-webui",
|
"name": "@govoplan/postbox-webui",
|
||||||
"version": "0.1.19",
|
"version": "0.1.23",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import { FormGrid,
|
|||||||
ConfirmDialog,
|
ConfirmDialog,
|
||||||
Dialog,
|
Dialog,
|
||||||
DocumentationHelpLink,
|
DocumentationHelpLink,
|
||||||
|
TextWithHelp,
|
||||||
FormField,
|
FormField,
|
||||||
IconButton,
|
IconButton,
|
||||||
MetricCard,
|
MetricCard,
|
||||||
@@ -794,7 +795,7 @@ export default function PostboxAdminPanel({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<AdminPageLayout
|
<AdminPageLayout
|
||||||
title="Postboxes"
|
title="Postboxes" titleHelp={<DocumentationHelpLink reference={POSTBOX_ADMIN_DOCUMENTATION} />}
|
||||||
description="Manage durable organization-function addresses and reusable templates."
|
description="Manage durable organization-function addresses and reusable templates."
|
||||||
loading={loading}
|
loading={loading}
|
||||||
error={error}
|
error={error}
|
||||||
@@ -809,7 +810,7 @@ export default function PostboxAdminPanel({
|
|||||||
disabled={loading || busy}
|
disabled={loading || busy}
|
||||||
disabledReason={postboxBusyReason(loading, busy)}
|
disabledReason={postboxBusyReason(loading, busy)}
|
||||||
/>
|
/>
|
||||||
<DocumentationHelpLink reference={POSTBOX_ADMIN_DOCUMENTATION} />
|
|
||||||
{mode === "templates" && canManageTemplates ? (
|
{mode === "templates" && canManageTemplates ? (
|
||||||
<Button variant="primary" onClick={openNewTemplate} disabled={busy} disabledReason={postboxBusyReason(false, busy)}>
|
<Button variant="primary" onClick={openNewTemplate} disabled={busy} disabledReason={postboxBusyReason(false, busy)}>
|
||||||
<Plus size={16} /> New template
|
<Plus size={16} /> New template
|
||||||
@@ -1038,6 +1039,8 @@ function TemplateWorkspace({
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
onClick={onPublish}
|
onClick={onPublish}
|
||||||
|
helpContextId="postbox.admin.templates"
|
||||||
|
helpModuleId="postbox"
|
||||||
disabled={busy || selected.status === "retired" || Boolean(revision.published_at)}
|
disabled={busy || selected.status === "retired" || Boolean(revision.published_at)}
|
||||||
disabledReason={postboxBusyReason(false, busy) ?? (selected.status === "retired" ? POSTBOX_INTERFACE_I18N.retiredTemplate : revision.published_at ? POSTBOX_INTERFACE_I18N.publishedRevision : undefined)}
|
disabledReason={postboxBusyReason(false, busy) ?? (selected.status === "retired" ? POSTBOX_INTERFACE_I18N.retiredTemplate : revision.published_at ? POSTBOX_INTERFACE_I18N.publishedRevision : undefined)}
|
||||||
>
|
>
|
||||||
@@ -1523,9 +1526,10 @@ function TemplateDialog({
|
|||||||
<div className="postbox-routing-section">
|
<div className="postbox-routing-section">
|
||||||
<div className="postbox-routing-heading">
|
<div className="postbox-routing-heading">
|
||||||
<div>
|
<div>
|
||||||
|
<TextWithHelp as="div" help={<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />}>
|
||||||
<strong>Hierarchy linked copies</strong>
|
<strong>Hierarchy linked copies</strong>
|
||||||
|
</TextWithHelp>
|
||||||
<span>Copy to explicitly bounded function Postboxes in one selected structure.</span>
|
<span>Copy to explicitly bounded function Postboxes in one selected structure.</span>
|
||||||
<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />
|
|
||||||
</div>
|
</div>
|
||||||
<ToggleSwitch
|
<ToggleSwitch
|
||||||
label="Enable hierarchy linked copies"
|
label="Enable hierarchy linked copies"
|
||||||
@@ -1678,7 +1682,7 @@ function TemplateDialog({
|
|||||||
onChange={(require_expiry) => updateLinkedCopy({ require_expiry })}
|
onChange={(require_expiry) => updateLinkedCopy({ require_expiry })}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<FormField label="Maximum retention days" documentation={POSTBOX_FIELD_DOCUMENTATION}>
|
<FormField label="Maximum retention days" documentation={POSTBOX_FIELD_DOCUMENTATION} helpContextId="postbox.field.retention" helpModuleId="postbox">
|
||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
min={1}
|
min={1}
|
||||||
@@ -1946,11 +1950,12 @@ function ProtectionConfigurationFields({
|
|||||||
<div className="postbox-routing-section">
|
<div className="postbox-routing-section">
|
||||||
<div className="postbox-routing-heading">
|
<div className="postbox-routing-heading">
|
||||||
<div>
|
<div>
|
||||||
|
<TextWithHelp as="div" help={<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />}>
|
||||||
<strong>Content protection and hand-over policy</strong>
|
<strong>Content protection and hand-over policy</strong>
|
||||||
|
</TextWithHelp>
|
||||||
<span>
|
<span>
|
||||||
The institution chooses the protection boundary. Managed envelope encryption is the recommended standard.
|
The institution chooses the protection boundary. Managed envelope encryption is the recommended standard.
|
||||||
</span>
|
</span>
|
||||||
<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />
|
|
||||||
</div>
|
</div>
|
||||||
{selected?.standard ? <StatusBadge status="recommended" label="Standard" /> : null}
|
{selected?.standard ? <StatusBadge status="recommended" label="Standard" /> : null}
|
||||||
</div>
|
</div>
|
||||||
@@ -1970,7 +1975,7 @@ function ProtectionConfigurationFields({
|
|||||||
<small>{selected?.description}</small>
|
<small>{selected?.description}</small>
|
||||||
</FormField>
|
</FormField>
|
||||||
{profile === "server_envelope_v1" ? (
|
{profile === "server_envelope_v1" ? (
|
||||||
<FormField label="Encryption vault" documentation={POSTBOX_FIELD_DOCUMENTATION}>
|
<FormField label="Encryption vault" documentation={POSTBOX_FIELD_DOCUMENTATION} helpContextId="postbox.field.protection-profile" helpModuleId="postbox">
|
||||||
<input
|
<input
|
||||||
value={vaultId}
|
value={vaultId}
|
||||||
disabled={profileLocked}
|
disabled={profileLocked}
|
||||||
@@ -2154,9 +2159,10 @@ function GroupingPolicyFields({
|
|||||||
<div className="postbox-protection-section">
|
<div className="postbox-protection-section">
|
||||||
<div className="postbox-routing-heading">
|
<div className="postbox-routing-heading">
|
||||||
<div>
|
<div>
|
||||||
|
<TextWithHelp as="div" help={<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />}>
|
||||||
<strong>Unified-inbox separation</strong>
|
<strong>Unified-inbox separation</strong>
|
||||||
|
</TextWithHelp>
|
||||||
<span>Keep source containers and institutional responsibilities visibly separated where required.</span>
|
<span>Keep source containers and institutional responsibilities visibly separated where required.</span>
|
||||||
<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<FormGrid>
|
<FormGrid>
|
||||||
@@ -2410,7 +2416,7 @@ function ProtectionTransitionDialog({
|
|||||||
<small>{selected?.description}</small>
|
<small>{selected?.description}</small>
|
||||||
</FormField>
|
</FormField>
|
||||||
{draft.target_profile === "server_envelope_v1" ? (
|
{draft.target_profile === "server_envelope_v1" ? (
|
||||||
<FormField label="Target encryption vault" documentation={POSTBOX_FIELD_DOCUMENTATION}>
|
<FormField label="Target encryption vault" documentation={POSTBOX_FIELD_DOCUMENTATION} helpContextId="postbox.action.protection-transition" helpModuleId="postbox">
|
||||||
<input
|
<input
|
||||||
value={draft.target_vault_id}
|
value={draft.target_vault_id}
|
||||||
onChange={(event) => onChange({ ...draft, target_vault_id: event.target.value })}
|
onChange={(event) => onChange({ ...draft, target_vault_id: event.target.value })}
|
||||||
@@ -2482,6 +2488,8 @@ function ProtectionTransitionDialog({
|
|||||||
<div className="postbox-toggle-field">
|
<div className="postbox-toggle-field">
|
||||||
<ToggleSwitch
|
<ToggleSwitch
|
||||||
label="Acknowledge residual disclosure"
|
label="Acknowledge residual disclosure"
|
||||||
|
helpContextId="postbox.action.protection-transition"
|
||||||
|
helpModuleId="postbox"
|
||||||
help="Previously decrypted, copied, or exported content cannot be recalled by changing the storage profile."
|
help="Previously decrypted, copied, or exported content cannot be recalled by changing the storage profile."
|
||||||
checked={draft.acknowledge_irreversibility}
|
checked={draft.acknowledge_irreversibility}
|
||||||
onChange={(acknowledge_irreversibility) => onChange({
|
onChange={(acknowledge_irreversibility) => onChange({
|
||||||
|
|||||||
@@ -680,11 +680,11 @@ export default function PostboxPage({
|
|||||||
refreshable
|
refreshable
|
||||||
reloadAction={{ onReload: () => void loadDirectory(), loading: loadingDirectory || busy }}
|
reloadAction={{ onReload: () => void loadDirectory(), loading: loadingDirectory || busy }}
|
||||||
className="postbox-bar"
|
className="postbox-bar"
|
||||||
contextActions={<div className="postbox-bar-title">
|
title={<span className="postbox-bar-title">
|
||||||
<Inbox size={17} aria-hidden="true" />
|
<Inbox size={17} aria-hidden="true" />
|
||||||
<strong>Postbox</strong>
|
<strong>Postbox</strong>
|
||||||
</div>}
|
</span>}
|
||||||
helpAction={<DocumentationHelpLink reference={POSTBOX_DOCUMENTATION} />}
|
titleHelp={<DocumentationHelpLink reference={POSTBOX_DOCUMENTATION} />}
|
||||||
createAction={<IconButton
|
createAction={<IconButton
|
||||||
label="New unified view"
|
label="New unified view"
|
||||||
icon={<Plus size={16} />}
|
icon={<Plus size={16} />}
|
||||||
@@ -997,6 +997,8 @@ export default function PostboxPage({
|
|||||||
{groupingDraft.id ? (
|
{groupingDraft.id ? (
|
||||||
<Button
|
<Button
|
||||||
variant="danger"
|
variant="danger"
|
||||||
|
helpContextId="postbox.action.delete-grouping"
|
||||||
|
helpModuleId="postbox"
|
||||||
onClick={() => setDeleteGroupingTarget(groupingDraft)}
|
onClick={() => setDeleteGroupingTarget(groupingDraft)}
|
||||||
disabled={busy}
|
disabled={busy}
|
||||||
disabledReason={postboxBusyReason(false, busy)}
|
disabledReason={postboxBusyReason(false, busy)}
|
||||||
@@ -1104,6 +1106,8 @@ export default function PostboxPage({
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant="primary"
|
variant="primary"
|
||||||
|
helpContextId="postbox.inbox.messages"
|
||||||
|
helpModuleId="postbox"
|
||||||
onClick={() => void submitMessage()}
|
onClick={() => void submitMessage()}
|
||||||
disabled={
|
disabled={
|
||||||
busy ||
|
busy ||
|
||||||
|
|||||||
+3
-2
@@ -1,6 +1,7 @@
|
|||||||
import { createElement, lazy } from "react";
|
import { createElement, lazy } from "react";
|
||||||
import {
|
import {
|
||||||
hasScope,
|
hasScope,
|
||||||
|
messagesProductSurfaceTranslations,
|
||||||
type AdminSectionsUiCapability,
|
type AdminSectionsUiCapability,
|
||||||
type DashboardWidgetsUiCapability,
|
type DashboardWidgetsUiCapability,
|
||||||
type PlatformWebModule,
|
type PlatformWebModule,
|
||||||
@@ -18,8 +19,8 @@ const PostboxAdminPanel = lazy(
|
|||||||
);
|
);
|
||||||
|
|
||||||
const translations = {
|
const translations = {
|
||||||
en: generatedTranslations.en,
|
en: { ...generatedTranslations.en, ...messagesProductSurfaceTranslations.en },
|
||||||
de: generatedTranslations.de
|
de: { ...generatedTranslations.de, ...messagesProductSurfaceTranslations.de }
|
||||||
};
|
};
|
||||||
|
|
||||||
const readScope = ["postbox:postbox:read"];
|
const readScope = ["postbox:postbox:read"];
|
||||||
|
|||||||
Reference in New Issue
Block a user