From 7df00859c63796802a6b1fe5b7c841bd76e3fcca Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 25 Apr 2026 16:46:58 +0200 Subject: [PATCH] fix(bulk-edit): pluralization, edit-mode CTA, error UI, real loading state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Elicit C1+C3 — bulk-selection count uses ICU-style plural keys (bulk_edit_n_selected_one / _other) so n=1 reads as "1 Dokument" instead of "1 Dokumente". Save CTA in edit mode reads "Anwenden" via the existing bulk_edit_save_button key; UploadSaveBar grew an editMode prop. Multi- chunk progress text is now visible (not aria-only). Felix C2 — bulk-edit page wires the backend error code through parseBackendError + getErrorMessage instead of falling back to a generic internal_error. Felix C5 — editAllMatching no longer swallows fetch failures: the button shows an inline error with the backend-mapped message (e.g. when the filter cap is exceeded). Leonie C8 — replace the literal "…" loading glyph on /documents/bulk-edit with a spinner + role=status + aria-live=polite + visible "Loading documents…" text. Leonie C9 — partial-failure card and bulk-edit page error card now use the design-system `text-danger` / `bg-danger/10` / `border-danger/40` tokens (dark-mode safe) instead of raw red palette values. Leonie C10 + C13 — German plural fixed; EN badges retensed ("+ added" → "+ will be added", "replaced" → "will replace") to match the future-tense intent of DE/ES. Refs #225, PR #331 Co-Authored-By: Claude Sonnet 4.6 --- frontend/messages/de.json | 7 +++- frontend/messages/en.json | 11 ++++-- frontend/messages/es.json | 7 +++- .../document/BulkDocumentEditLayout.svelte | 3 +- .../document/BulkSelectionBar.svelte | 2 +- .../components/document/UploadSaveBar.svelte | 28 +++++++++++-- frontend/src/routes/documents/+page.svelte | 19 +++++++-- .../routes/documents/bulk-edit/+page.svelte | 39 +++++++++++++++++-- 8 files changed, 94 insertions(+), 22 deletions(-) diff --git a/frontend/messages/de.json b/frontend/messages/de.json index 8088ef6b..cd9e60d8 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -875,7 +875,8 @@ "bulk_title_single": "Neues Dokument", "bulk_title_multi": "Neue Dokumente", "bulk_edit_button": "Massenbearbeitung", - "bulk_edit_n_selected": "{count} Dokumente ausgewählt", + "bulk_edit_n_selected_one": "1 Dokument ausgewählt", + "bulk_edit_n_selected_other": "{count} Dokumente ausgewählt", "bulk_edit_clear_all": "Alles aufheben", "bulk_edit_all_x": "Alle {count} editieren", "bulk_edit_select_document": "Dokument {title} auswählen", @@ -893,5 +894,7 @@ "form_label_archive_folder": "Mappe", "form_helper_archive_folder": "Welche Mappe innerhalb des Kartons?", "bulk_edit_clear_selection": "Auswahl aufheben", - "bulk_edit_clear_hint_keyboard": "Esc: Auswahl aufheben" + "bulk_edit_clear_hint_keyboard": "Esc: Auswahl aufheben", + "bulk_edit_loading": "Dokumente werden geladen…", + "bulk_edit_all_x_failed": "Filter konnte nicht abgerufen werden — bitte erneut versuchen." } diff --git a/frontend/messages/en.json b/frontend/messages/en.json index d5796dbf..9c505a67 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -875,13 +875,14 @@ "bulk_title_single": "New Document", "bulk_title_multi": "New Documents", "bulk_edit_button": "Bulk edit", - "bulk_edit_n_selected": "{count} documents selected", + "bulk_edit_n_selected_one": "1 document selected", + "bulk_edit_n_selected_other": "{count} documents selected", "bulk_edit_clear_all": "Clear all", "bulk_edit_all_x": "Edit all {count}", "bulk_edit_select_document": "Select document {title}", "bulk_edit_hint": "Only filled fields are applied. Tags and receivers are added, not replaced.", - "bulk_edit_badge_additive": "+ added", - "bulk_edit_badge_replace": "replaced", + "bulk_edit_badge_additive": "+ will be added", + "bulk_edit_badge_replace": "will replace", "bulk_edit_save_progress": "Batch {done} of {total} processed", "bulk_edit_save_partial": "{done} of {total} saved", "bulk_edit_retry": "Retry", @@ -893,5 +894,7 @@ "form_label_archive_folder": "Folder", "form_helper_archive_folder": "Which folder inside the box?", "bulk_edit_clear_selection": "Clear selection", - "bulk_edit_clear_hint_keyboard": "Esc: clear selection" + "bulk_edit_clear_hint_keyboard": "Esc: clear selection", + "bulk_edit_loading": "Loading documents…", + "bulk_edit_all_x_failed": "Could not load filter results — please retry." } diff --git a/frontend/messages/es.json b/frontend/messages/es.json index 2678eee0..fdd5dd22 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -875,7 +875,8 @@ "bulk_title_single": "Nuevo Documento", "bulk_title_multi": "Nuevos Documentos", "bulk_edit_button": "Edición masiva", - "bulk_edit_n_selected": "{count} documentos seleccionados", + "bulk_edit_n_selected_one": "1 documento seleccionado", + "bulk_edit_n_selected_other": "{count} documentos seleccionados", "bulk_edit_clear_all": "Limpiar todo", "bulk_edit_all_x": "Editar los {count}", "bulk_edit_select_document": "Seleccionar documento {title}", @@ -893,5 +894,7 @@ "form_label_archive_folder": "Carpeta", "form_helper_archive_folder": "¿Qué carpeta dentro de la caja?", "bulk_edit_clear_selection": "Limpiar selección", - "bulk_edit_clear_hint_keyboard": "Esc: limpiar selección" + "bulk_edit_clear_hint_keyboard": "Esc: limpiar selección", + "bulk_edit_loading": "Cargando documentos…", + "bulk_edit_all_x_failed": "No se pudieron cargar los resultados del filtro; vuelve a intentarlo." } diff --git a/frontend/src/lib/components/document/BulkDocumentEditLayout.svelte b/frontend/src/lib/components/document/BulkDocumentEditLayout.svelte index 57d21dd9..6dd18490 100644 --- a/frontend/src/lib/components/document/BulkDocumentEditLayout.svelte +++ b/frontend/src/lib/components/document/BulkDocumentEditLayout.svelte @@ -495,7 +495,7 @@ async function retrySave() { diff --git a/frontend/src/lib/components/document/BulkSelectionBar.svelte b/frontend/src/lib/components/document/BulkSelectionBar.svelte index 14e02c45..5cd06cc8 100644 --- a/frontend/src/lib/components/document/BulkSelectionBar.svelte +++ b/frontend/src/lib/components/document/BulkSelectionBar.svelte @@ -40,7 +40,7 @@ function onEscape(e: KeyboardEvent) { aria-live="polite" aria-atomic="true" > - {m.bulk_edit_n_selected({ count })} + {count === 1 ? m.bulk_edit_n_selected_one() : m.bulk_edit_n_selected_other({ count })}