diff --git a/src/govoplan_files/backend/german_documentation.py b/src/govoplan_files/backend/german_documentation.py index ee4812b..aaedf93 100644 --- a/src/govoplan_files/backend/german_documentation.py +++ b/src/govoplan_files/backend/german_documentation.py @@ -56,6 +56,9 @@ _TRANSLATIONS = { "title": "Verwaltete Dateien und Ordner organisieren", "summary": "Ordner anlegen und zugängliche Inhalte mit ausdrücklicher Konfliktbehandlung umbenennen, verschieben oder kopieren.", "body": ( + "Dokumentationsbücher stehen neben den Überschriften für Dateien, Verbindungen, Richtlinien " + "oder Integrität und neben dem Titel des Dialogs zum Entpacken verwalteter Archive. " + "Feldhilfe bleibt bei der Feldbezeichnung. " "Die Organisation bleibt in gesteuerten persönlichen oder Gruppenbereichen. Verschieben erhält die Asset-Identität; Kopieren erzeugt neue Assets und Versionen, die unveränderliche Blob-Bytes wiederverwenden. Jeder Zielkonflikt muss ausdrücklich abgelehnt, durch Umbenennen gelöst, überschrieben oder übersprungen werden. " "Ordner erstellen und Hochladen bleiben neben Neu laden im Kopf des Arbeitsbereichs. Nach der Auswahl von Dateien oder Ordnern öffnet Auswahl verwalten die Aktionen Verschieben, Kopieren, Umbenennen, Freigaben und Zugriffserklärungen. " "Löschen ist von der Organisation getrennt und benötigt weiterhin die vorhandene Bestätigung. Herunterladen und Archiv entpacken bleiben für passende Auswahlen direkt erreichbar. " diff --git a/src/govoplan_files/backend/manifest.py b/src/govoplan_files/backend/manifest.py index d6718d9..3bdbae2 100644 --- a/src/govoplan_files/backend/manifest.py +++ b/src/govoplan_files/backend/manifest.py @@ -1058,6 +1058,8 @@ manifest = ModuleManifest( title="Organize managed files and folders", summary="Create folders and rename, move, or copy accessible managed content with explicit conflict handling.", body=( + "Documentation books sit beside the Files, connection, policy, or integrity heading and " + "beside the managed-archive unpack dialog title. Field help stays with its label. " "Organization stays inside governed personal or group spaces. Moves preserve the asset identity, while copies create new assets and versions that reuse immutable blob bytes. " "Every target conflict must be rejected, renamed, overwritten, or skipped explicitly. " "Create folder and Upload remain beside Reload in the workspace header. Select files or folders and open Manage selection for Move, Copy, Rename, sharing, or access explanations. " @@ -1458,6 +1460,8 @@ manifest = ModuleManifest( title="Govern file connections, folder sync, and credential deletion", summary="Keep endpoints, credentials, inherited policy, and bounded manual synchronization separate, with reviewable outcomes and provenance.", body=( + "Documentation books sit beside the Files, connection, policy, or integrity heading and " + "beside the managed-archive unpack dialog title. Field help stays with its label. " "System, tenant, and one user/group/campaign leaf form the effective policy chain: deny rules win and every configured allow rule must match. " "Responses redact secret values and deployment references. Deleting a database-managed credential or profile immediately scrubs Files-owned encrypted material and private metadata in the same transaction as a non-secret audit event; dependent profiles are disabled, while legacy non-owned references are only detached and audited. " "Removing a connector space is a separate owner-authorized operation: it retires only the local virtual-space link and leaves provider content, imported managed files and shares, profiles, credentials, and remote references untouched. Intrinsic user and group managed spaces cannot be removed. " @@ -1517,6 +1521,9 @@ manifest = ModuleManifest( "title": "Dateiverbindungen, Ordnersynchronisierung und das Löschen von Zugangsdaten steuern", "summary": "Endpunkte, Zugangsdaten, vererbte Richtlinien und begrenzte manuelle Synchronisierung getrennt und mit prüfbaren Ergebnissen sowie Herkunftsnachweisen verwalten.", "body": ( + "Dokumentationsbücher stehen neben den Überschriften für Dateien, Verbindungen, Richtlinien " + "oder Integrität und neben dem Titel des Dialogs zum Entpacken verwalteter Archive. Feldhilfe " + "bleibt bei der Feldbezeichnung. " "System, Mandant und genau eine Benutzer-, Gruppen- oder Kampagnenebene bilden die wirksame Richtlinienkette: Ablehnungsregeln haben Vorrang und jede konfigurierte Erlaubnisregel muss zutreffen. " "Antworten blenden Geheimwerte und Bereitstellungsverweise aus. Beim Löschen datenbankverwalteter Zugangsdaten oder Profile entfernt Files eigenes verschlüsseltes Material und private Metadaten in derselben Transaktion wie das nicht geheime Audit-Ereignis. Abhängige Profile werden deaktiviert; ältere, nicht Files gehörende Verweise werden nur getrennt und auditiert. " "Das Entfernen eines Connector-Bereichs ist ein eigener, eigentümerberechtigter Vorgang: Nur die lokale Verknüpfung des virtuellen Bereichs wird außer Kraft gesetzt. Inhalte beim Anbieter, importierte verwaltete Dateien und Freigaben, Profile, Zugangsdaten und Remote-Verweise bleiben erhalten. Intrinsische Benutzer- und Gruppenbereiche können nicht entfernt werden. " diff --git a/webui/scripts/test-interface-pattern-language.mjs b/webui/scripts/test-interface-pattern-language.mjs index 999ff61..3ca720d 100644 --- a/webui/scripts/test-interface-pattern-language.mjs +++ b/webui/scripts/test-interface-pattern-language.mjs @@ -39,7 +39,7 @@ assert.match(filesPage, /disabledReason=\{uploadBlocker\}/); assert.match(filesPage, /disabledReason=\{deleteBlocker\}/); assert.match(filesPage, /\}\s+scope="workspace"\s+variant="collection"\s+refreshable/); assert.match(filesPage, /\{toolbar\}[\s\S]*className=\{`file-manager-shell/); assert.match(filesPage, /const selectionToolbar = } actions={ canWrite ?
-
: - + undefined }> @@ -954,14 +954,14 @@ export default function FileConnectorSettingsPanel({ } actions={canWrite ?
-
: - }> + undefined}> <> diff --git a/webui/src/features/files/FileIntegrityPanel.tsx b/webui/src/features/files/FileIntegrityPanel.tsx index a5b1f8a..ee7da82 100644 --- a/webui/src/features/files/FileIntegrityPanel.tsx +++ b/webui/src/features/files/FileIntegrityPanel.tsx @@ -384,6 +384,7 @@ export default function FileIntegrityPanel({ settings, canWrite }: Props) { <> } description="Run bounded storage reconciliation and resolve quarantined or unreferenced objects without acting on stale operator state." loading={loading} error={error} @@ -401,7 +402,6 @@ export default function FileIntegrityPanel({ settings, canWrite }: Props) { - )} > diff --git a/webui/src/features/files/FilesPage.tsx b/webui/src/features/files/FilesPage.tsx index 4acacb5..309862e 100644 --- a/webui/src/features/files/FilesPage.tsx +++ b/webui/src/features/files/FilesPage.tsx @@ -2421,6 +2421,8 @@ export default function FilesPage({ settings, auth }: {settings: ApiSettings;aut } const toolbar = } scope="workspace" variant="collection" refreshable @@ -2430,7 +2432,6 @@ export default function FilesPage({ settings, auth }: {settings: ApiSettings;aut helpModuleId="files" reloadAction={{ onReload: () => void reloadCurrentView(), loading: reloadingView, state: viewReloadFailed ? "reload-failed" : "current", disabled: busy || connectorSpaceLoading, disabledReason: workingBlocker || (connectorSpaceLoading ? "This connector space is already refreshing." : undefined) }} contextActions={} - helpAction={} createAction={<> @@ -2928,12 +2929,11 @@ export default function FilesPage({ settings, auth }: {settings: ApiSettings;aut } {dialog === "upload" && - { if (!busy) closeDialog(); }}> + : undefined} busy={busy || uploadActive} onClose={() => { if (!busy) closeDialog(); }}>
{managedArchiveFile &&

{i18nMessage("i18n:govoplan-files.managed_archive.source", { value0: managedArchiveFile.filename })}

} {managedArchiveFile &&

i18n:govoplan-files.managed_archive.protection

} - {managedArchiveFile && } {error && {error}} {!archivePreview && <> diff --git a/webui/src/features/files/components/FileManagerComponents.tsx b/webui/src/features/files/components/FileManagerComponents.tsx index 9ab47f9..62715bc 100644 --- a/webui/src/features/files/components/FileManagerComponents.tsx +++ b/webui/src/features/files/components/FileManagerComponents.tsx @@ -195,11 +195,12 @@ export function RenamePreviewList({ } -export function FileDialog({ title, onClose, children, busy = false }: {title: string;onClose: () => void;children: ReactNode;busy?: boolean;}) { +export function FileDialog({ title, titleHelp, onClose, children, busy = false }: {title: string;titleHelp?: ReactNode;onClose: () => void;children: ReactNode;busy?: boolean;}) { return (