diff --git a/frontend/messages/de.json b/frontend/messages/de.json index 95bbbc3e..228b7815 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -233,5 +233,10 @@ "history_field_summary": "Zusammenfassung", "history_field_sender": "Absender", "history_field_receivers": "Empfänger", - "history_field_tags": "Schlagworte" + "history_field_tags": "Schlagworte", + "admin_tab_system": "System", + "admin_system_backfill_heading": "Verlaufsdaten auffüllen", + "admin_system_backfill_description": "Erstellt einen initialen Verlaufseintrag für alle Dokumente, die noch keinen Verlauf haben (z.B. importierte Dokumente). Dadurch werden beim nächsten Bearbeiten nur die tatsächlich geänderten Felder hervorgehoben.", + "admin_system_backfill_btn": "Jetzt auffüllen", + "admin_system_backfill_success": "{count} Dokumente wurden aufgefüllt." } diff --git a/frontend/messages/en.json b/frontend/messages/en.json index ce0441cb..cca54480 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -233,5 +233,10 @@ "history_field_summary": "Summary", "history_field_sender": "Sender", "history_field_receivers": "Receivers", - "history_field_tags": "Tags" + "history_field_tags": "Tags", + "admin_tab_system": "System", + "admin_system_backfill_heading": "Backfill history data", + "admin_system_backfill_description": "Creates an initial history entry for all documents that do not have one yet (e.g. imported documents). This ensures that future edits only highlight actually changed fields.", + "admin_system_backfill_btn": "Backfill now", + "admin_system_backfill_success": "{count} documents were backfilled." } diff --git a/frontend/messages/es.json b/frontend/messages/es.json index 29c1f750..e72775be 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -233,5 +233,10 @@ "history_field_summary": "Resumen", "history_field_sender": "Remitente", "history_field_receivers": "Destinatarios", - "history_field_tags": "Etiquetas" + "history_field_tags": "Etiquetas", + "admin_tab_system": "Sistema", + "admin_system_backfill_heading": "Completar datos de historial", + "admin_system_backfill_description": "Crea una entrada de historial inicial para todos los documentos que aún no tienen ninguna (p.ej. documentos importados). Así, en la próxima edición solo se resaltarán los campos realmente modificados.", + "admin_system_backfill_btn": "Completar ahora", + "admin_system_backfill_success": "{count} documentos fueron completados." } diff --git a/frontend/src/lib/generated/api.ts b/frontend/src/lib/generated/api.ts index f86f61dc..f756e81f 100644 --- a/frontend/src/lib/generated/api.ts +++ b/frontend/src/lib/generated/api.ts @@ -228,6 +228,22 @@ export interface paths { patch?: never; trace?: never; }; + "/api/admin/backfill-versions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["backfillVersions"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/groups/{id}": { parameters: { query?: never; @@ -548,6 +564,10 @@ export interface components { /** Format: date-time */ startedAt?: string; }; + BackfillResult: { + /** Format: int32 */ + count: number; + }; DocumentVersionSummary: { /** Format: uuid */ id: string; @@ -1106,6 +1126,26 @@ export interface operations { }; }; }; + backfillVersions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["BackfillResult"]; + }; + }; + }; + }; deleteGroup: { parameters: { query?: never; diff --git a/frontend/src/routes/admin/+page.svelte b/frontend/src/routes/admin/+page.svelte index 841476cc..fdfc50a3 100644 --- a/frontend/src/routes/admin/+page.svelte +++ b/frontend/src/routes/admin/+page.svelte @@ -9,6 +9,8 @@ let activeTab = $state('users'); let editingTagId: string | null = $state(null); let editingTagName = $state(''); let editingGroupId: string | null = $state(null); +let backfillResult: number | null = $state(null); +let backfillLoading = $state(false); const availablePermissions = ['WRITE_ALL', 'ADMIN', 'ADMIN_USER', 'ADMIN_TAG', 'ADMIN_PERMISSION']; @@ -29,6 +31,20 @@ function startEditGroup(id: string) { function cancelEditGroup() { editingGroupId = null; } + +async function backfillVersions() { + backfillLoading = true; + backfillResult = null; + try { + const res = await fetch('/api/admin/backfill-versions', { method: 'POST' }); + if (res.ok) { + const data = await res.json(); + backfillResult = data.count; + } + } finally { + backfillLoading = false; + } +}
@@ -58,6 +74,13 @@ function cancelEditGroup() { : 'text-gray-500 hover:text-brand-navy'}" onclick={() => (activeTab = 'tags')}>{m.admin_tab_tags()} +
@@ -495,5 +518,22 @@ function cancelEditGroup() { + {:else if activeTab === 'system'} +
+

{m.admin_system_backfill_heading()}

+

{m.admin_system_backfill_description()}

+ + {#if backfillResult !== null} +

+ {m.admin_system_backfill_success({ count: backfillResult })} +

+ {/if} +
{/if}