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
|
||||
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]
|
||||
name = "govoplan-postbox"
|
||||
version = "0.1.19"
|
||||
version = "0.1.23"
|
||||
description = "Function-bound institutional postboxes for GovOPlaN."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
"""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 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 govoplan_core.core.access import (
|
||||
@@ -31,7 +34,9 @@ from govoplan_core.core.modules import (
|
||||
ModuleManifest,
|
||||
NavItem,
|
||||
PermissionDefinition,
|
||||
ProductAvailabilityExplanation,
|
||||
ProductAreaContribution,
|
||||
ProductSurfaceContribution,
|
||||
QuickAccessTool,
|
||||
RoleTemplate,
|
||||
)
|
||||
@@ -72,7 +77,7 @@ from govoplan_postbox.backend.permissions import (
|
||||
|
||||
MODULE_ID = "postbox"
|
||||
MODULE_NAME = "Postbox"
|
||||
MODULE_VERSION = "0.1.19"
|
||||
MODULE_VERSION = "0.1.23"
|
||||
|
||||
|
||||
def _permission(scope: str, label: str, description: str) -> PermissionDefinition:
|
||||
@@ -401,6 +406,40 @@ manifest = ModuleManifest(
|
||||
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=(
|
||||
QuickAccessTool(
|
||||
id="postbox.messages",
|
||||
@@ -620,7 +659,11 @@ manifest = ModuleManifest(
|
||||
summary="Use function-bound Postboxes in Communication and the shared Messages Quick Access drawer.",
|
||||
body=(
|
||||
"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 "
|
||||
"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 "
|
||||
@@ -637,6 +680,9 @@ manifest = ModuleManifest(
|
||||
"body": (
|
||||
"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. "
|
||||
"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 "
|
||||
"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 "
|
||||
@@ -852,6 +898,9 @@ manifest = ModuleManifest(
|
||||
"effective organization-function assignments."
|
||||
),
|
||||
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. "
|
||||
"A stable postbox remains addressable during vacancy and "
|
||||
"reassignment. Current access combines a generic Postbox "
|
||||
@@ -894,6 +943,10 @@ manifest = ModuleManifest(
|
||||
"title": "Funktionsgebundene Postfächer",
|
||||
"summary": "Dauerhafte institutionelle Nachrichtencontainer, deren Zugriff den wirksamen Zuweisungen zu Organisationsfunktionen folgt.",
|
||||
"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 "
|
||||
"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 "
|
||||
@@ -931,6 +984,9 @@ manifest = ModuleManifest(
|
||||
"classification, retention, and lifecycle fields."
|
||||
),
|
||||
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. "
|
||||
"Template revisions are immutable after publication; retiring a template "
|
||||
"does not remove materialized addresses. Archiving an address stops new "
|
||||
@@ -974,6 +1030,10 @@ manifest = ModuleManifest(
|
||||
"title": "Postfachfelder und ihre Auswirkungen",
|
||||
"summary": "Referenz für Adresse, Vorlage, Routing, Nachricht, Gruppierung, Klassifikation, Aufbewahrung und Lebenszyklus.",
|
||||
"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 "
|
||||
"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 "
|
||||
@@ -1048,5 +1108,10 @@ manifest = ModuleManifest(
|
||||
)
|
||||
|
||||
|
||||
manifest = with_documentation_structured_translations(
|
||||
manifest, locale="de", translations=GERMAN_STRUCTURED_TRANSLATIONS
|
||||
)
|
||||
|
||||
|
||||
def get_manifest() -> ModuleManifest:
|
||||
return manifest
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@govoplan/postbox-webui",
|
||||
"version": "0.1.19",
|
||||
"version": "0.1.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"main": "src/index.ts",
|
||||
|
||||
@@ -21,6 +21,7 @@ import { FormGrid,
|
||||
ConfirmDialog,
|
||||
Dialog,
|
||||
DocumentationHelpLink,
|
||||
TextWithHelp,
|
||||
FormField,
|
||||
IconButton,
|
||||
MetricCard,
|
||||
@@ -794,7 +795,7 @@ export default function PostboxAdminPanel({
|
||||
|
||||
return (
|
||||
<AdminPageLayout
|
||||
title="Postboxes"
|
||||
title="Postboxes" titleHelp={<DocumentationHelpLink reference={POSTBOX_ADMIN_DOCUMENTATION} />}
|
||||
description="Manage durable organization-function addresses and reusable templates."
|
||||
loading={loading}
|
||||
error={error}
|
||||
@@ -809,7 +810,7 @@ export default function PostboxAdminPanel({
|
||||
disabled={loading || busy}
|
||||
disabledReason={postboxBusyReason(loading, busy)}
|
||||
/>
|
||||
<DocumentationHelpLink reference={POSTBOX_ADMIN_DOCUMENTATION} />
|
||||
|
||||
{mode === "templates" && canManageTemplates ? (
|
||||
<Button variant="primary" onClick={openNewTemplate} disabled={busy} disabledReason={postboxBusyReason(false, busy)}>
|
||||
<Plus size={16} /> New template
|
||||
@@ -1038,6 +1039,8 @@ function TemplateWorkspace({
|
||||
</Button>
|
||||
<Button
|
||||
onClick={onPublish}
|
||||
helpContextId="postbox.admin.templates"
|
||||
helpModuleId="postbox"
|
||||
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)}
|
||||
>
|
||||
@@ -1523,9 +1526,10 @@ function TemplateDialog({
|
||||
<div className="postbox-routing-section">
|
||||
<div className="postbox-routing-heading">
|
||||
<div>
|
||||
<TextWithHelp as="div" help={<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />}>
|
||||
<strong>Hierarchy linked copies</strong>
|
||||
</TextWithHelp>
|
||||
<span>Copy to explicitly bounded function Postboxes in one selected structure.</span>
|
||||
<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />
|
||||
</div>
|
||||
<ToggleSwitch
|
||||
label="Enable hierarchy linked copies"
|
||||
@@ -1678,7 +1682,7 @@ function TemplateDialog({
|
||||
onChange={(require_expiry) => updateLinkedCopy({ require_expiry })}
|
||||
/>
|
||||
</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
|
||||
type="number"
|
||||
min={1}
|
||||
@@ -1946,11 +1950,12 @@ function ProtectionConfigurationFields({
|
||||
<div className="postbox-routing-section">
|
||||
<div className="postbox-routing-heading">
|
||||
<div>
|
||||
<TextWithHelp as="div" help={<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />}>
|
||||
<strong>Content protection and hand-over policy</strong>
|
||||
</TextWithHelp>
|
||||
<span>
|
||||
The institution chooses the protection boundary. Managed envelope encryption is the recommended standard.
|
||||
</span>
|
||||
<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />
|
||||
</div>
|
||||
{selected?.standard ? <StatusBadge status="recommended" label="Standard" /> : null}
|
||||
</div>
|
||||
@@ -1970,7 +1975,7 @@ function ProtectionConfigurationFields({
|
||||
<small>{selected?.description}</small>
|
||||
</FormField>
|
||||
{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
|
||||
value={vaultId}
|
||||
disabled={profileLocked}
|
||||
@@ -2154,9 +2159,10 @@ function GroupingPolicyFields({
|
||||
<div className="postbox-protection-section">
|
||||
<div className="postbox-routing-heading">
|
||||
<div>
|
||||
<TextWithHelp as="div" help={<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />}>
|
||||
<strong>Unified-inbox separation</strong>
|
||||
</TextWithHelp>
|
||||
<span>Keep source containers and institutional responsibilities visibly separated where required.</span>
|
||||
<DocumentationHelpLink reference={POSTBOX_FIELD_DOCUMENTATION} />
|
||||
</div>
|
||||
</div>
|
||||
<FormGrid>
|
||||
@@ -2410,7 +2416,7 @@ function ProtectionTransitionDialog({
|
||||
<small>{selected?.description}</small>
|
||||
</FormField>
|
||||
{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
|
||||
value={draft.target_vault_id}
|
||||
onChange={(event) => onChange({ ...draft, target_vault_id: event.target.value })}
|
||||
@@ -2482,6 +2488,8 @@ function ProtectionTransitionDialog({
|
||||
<div className="postbox-toggle-field">
|
||||
<ToggleSwitch
|
||||
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."
|
||||
checked={draft.acknowledge_irreversibility}
|
||||
onChange={(acknowledge_irreversibility) => onChange({
|
||||
|
||||
@@ -680,11 +680,11 @@ export default function PostboxPage({
|
||||
refreshable
|
||||
reloadAction={{ onReload: () => void loadDirectory(), loading: loadingDirectory || busy }}
|
||||
className="postbox-bar"
|
||||
contextActions={<div className="postbox-bar-title">
|
||||
title={<span className="postbox-bar-title">
|
||||
<Inbox size={17} aria-hidden="true" />
|
||||
<strong>Postbox</strong>
|
||||
</div>}
|
||||
helpAction={<DocumentationHelpLink reference={POSTBOX_DOCUMENTATION} />}
|
||||
</span>}
|
||||
titleHelp={<DocumentationHelpLink reference={POSTBOX_DOCUMENTATION} />}
|
||||
createAction={<IconButton
|
||||
label="New unified view"
|
||||
icon={<Plus size={16} />}
|
||||
@@ -997,6 +997,8 @@ export default function PostboxPage({
|
||||
{groupingDraft.id ? (
|
||||
<Button
|
||||
variant="danger"
|
||||
helpContextId="postbox.action.delete-grouping"
|
||||
helpModuleId="postbox"
|
||||
onClick={() => setDeleteGroupingTarget(groupingDraft)}
|
||||
disabled={busy}
|
||||
disabledReason={postboxBusyReason(false, busy)}
|
||||
@@ -1104,6 +1106,8 @@ export default function PostboxPage({
|
||||
</Button>
|
||||
<Button
|
||||
variant="primary"
|
||||
helpContextId="postbox.inbox.messages"
|
||||
helpModuleId="postbox"
|
||||
onClick={() => void submitMessage()}
|
||||
disabled={
|
||||
busy ||
|
||||
|
||||
+3
-2
@@ -1,6 +1,7 @@
|
||||
import { createElement, lazy } from "react";
|
||||
import {
|
||||
hasScope,
|
||||
messagesProductSurfaceTranslations,
|
||||
type AdminSectionsUiCapability,
|
||||
type DashboardWidgetsUiCapability,
|
||||
type PlatformWebModule,
|
||||
@@ -18,8 +19,8 @@ const PostboxAdminPanel = lazy(
|
||||
);
|
||||
|
||||
const translations = {
|
||||
en: generatedTranslations.en,
|
||||
de: generatedTranslations.de
|
||||
en: { ...generatedTranslations.en, ...messagesProductSurfaceTranslations.en },
|
||||
de: { ...generatedTranslations.de, ...messagesProductSurfaceTranslations.de }
|
||||
};
|
||||
|
||||
const readScope = ["postbox:postbox:read"];
|
||||
|
||||
Reference in New Issue
Block a user