feat(persons): clean filterable paginated directory with crash fix

Rewrite /persons: server-side filter chips (type, family-only, has-documents)
that AND within the clean reader default (familyMember OR documentCount > 0),
a writer-only show-all/Zu-prüfen toggle, and reused Pagination. Extract
PersonCard (fixes the null-lastName render crash and never shows a "?" initial —
provisional/UNKNOWN/"?" entries get a neutral placeholder avatar + a text+icon
"unbestätigt" badge, WCAG 1.4.1) and PersonFilterBar (44px aria-pressed chips,
role=switch toggle with the count in its accessible name). The loader applies
the reader restriction unless review=1 and surfaces a cheap needsReviewCount.
i18n keys added for de/en/es.

Refs #667

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-05-27 13:55:18 +02:00
parent 67272178a9
commit 888adcb185
12 changed files with 802 additions and 87 deletions

View File

@@ -130,6 +130,29 @@
"persons_search_placeholder": "Namen suchen...",
"persons_empty_heading": "Keine Personen gefunden.",
"persons_empty_text": "Versuchen Sie einen anderen Suchbegriff.",
"persons_empty_filtered": "Keine Personen für diese Filter.",
"persons_filter_group_label": "Filter",
"persons_filter_type_person": "Person",
"persons_filter_type_group": "Gruppe",
"persons_filter_type_institution": "Institution",
"persons_filter_family_only": "Nur Familie",
"persons_filter_has_documents": "Mit Dokumenten",
"persons_toggle_show_all": "Alle anzeigen",
"persons_toggle_needs_review": "Zu prüfen ({count})",
"person_badge_unconfirmed": "unbestätigt",
"persons_review_heading": "Personen prüfen",
"persons_review_intro": "Vom Import erzeugte, noch nicht bestätigte Personen. Zusammenführen, umbenennen, bestätigen oder löschen.",
"persons_review_action_merge": "Zusammenführen",
"persons_review_action_rename": "Umbenennen",
"persons_review_action_confirm": "Bestätigen",
"persons_review_action_delete": "Löschen",
"persons_review_action_cancel": "Abbrechen",
"persons_review_action_save": "Speichern",
"persons_review_empty": "Keine Personen zu prüfen.",
"persons_review_delete_confirm_title": "Person löschen",
"persons_review_delete_confirm_text": "Diese Person wird endgültig gelöscht. Dokumentverweise bleiben erhalten, verlieren aber diese Person.",
"persons_review_delete_confirm_button": "Person löschen",
"persons_review_merge_label": "Mit welcher Person zusammenführen?",
"persons_new_heading": "Neue Person",
"persons_section_details": "Angaben zur Person",
"person_edit_heading": "Person bearbeiten",