From 508c8201fa353155f68a385aac369983acd83e93 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Tue, 20 Jan 2026 08:30:40 +0100 Subject: [PATCH] Update photo task labels and filters --- .../js/admin/i18n/locales/de/management.json | 70 ++-- .../js/admin/i18n/locales/en/management.json | 70 ++-- resources/js/admin/mobile/EventTasksPage.tsx | 367 ++++++------------ .../mobile/__tests__/EventTasksPage.test.tsx | 8 +- 4 files changed, 195 insertions(+), 320 deletions(-) diff --git a/resources/js/admin/i18n/locales/de/management.json b/resources/js/admin/i18n/locales/de/management.json index 6174375..f90ae25 100644 --- a/resources/js/admin/i18n/locales/de/management.json +++ b/resources/js/admin/i18n/locales/de/management.json @@ -519,34 +519,34 @@ "manage": "Layouts & QR-Codes verwalten" }, "tasks": { - "badge": "Aufgaben", - "title": "Tasks & Checklisten", - "subtitle": "Motiviere Gäste mit klaren Aufgaben & Highlights.", + "badge": "Fotoaufgaben", + "title": "Fotoaufgaben & Checklisten", + "subtitle": "Motiviere Gäste mit klaren Fotoaufgaben & Highlights.", "summary": { "assigned": "Zugewiesen", "library": "Bibliothek", "collections": "Sammlungen", "emotions": "Emotionen" }, - "empty": "Noch keine Aufgaben zugewiesen.", - "manage": "Aufgabenbereich öffnen", + "empty": "Noch keine Fotoaufgaben zugewiesen.", + "manage": "Fotoaufgabenbereich öffnen", "status": { "completed": "Erledigt", "open": "Offen" }, - "disabledTitle": "Task-Modus ist für dieses Event aus", - "disabledBody": "Gäste sehen nur den Fotofeed. Aktiviere Tasks in den Event-Einstellungen, um sie wieder anzuzeigen.", + "disabledTitle": "Fotoaufgaben-Modus ist für dieses Event aus", + "disabledBody": "Gäste sehen nur den Fotofeed. Aktiviere Fotoaufgaben in den Event-Einstellungen, um sie wieder anzuzeigen.", "toggle": { - "title": "Aufgaben für dieses Event", - "description": "Gib Gästen optionale Foto-Ideen und kleine Challenges.", + "title": "Fotoaufgaben für dieses Event", + "description": "Gib Gästen optionale Fotoaufgaben und kleine Foto-Ideen.", "active": "AKTIV", "inactive": "INAKTIV", - "onLabel": "Gäste sehen Aufgaben-Prompts", + "onLabel": "Gäste sehen Fotoaufgaben", "offLabel": "Gäste sehen nur Fotos", - "switchLabel": "Aufgaben aktiv", - "enabled": "Aufgaben aktiviert", - "disabled": "Aufgaben deaktiviert", - "permissionHint": "Du hast keine Berechtigung, Aufgaben zu ändern." + "switchLabel": "Fotoaufgaben aktiv", + "enabled": "Fotoaufgaben aktiviert", + "disabled": "Fotoaufgaben deaktiviert", + "permissionHint": "Du hast keine Berechtigung, Fotoaufgaben zu ändern." }, "quickNav": "Schnellzugriff", "sections": { @@ -556,31 +556,31 @@ "emotions": "Emotionen" }, "actions": "Aktionen", - "assigned": "Task hinzugefügt", - "updateFailed": "Task konnte nicht gespeichert werden.", - "created": "Aufgabe gespeichert", - "removed": "Aufgabe entfernt", - "imported": "Aufgabenpaket importiert", - "saveTask": "Aufgabe speichern", + "assigned": "Fotoaufgabe hinzugefügt", + "updateFailed": "Fotoaufgabe konnte nicht gespeichert werden.", + "created": "Fotoaufgabe gespeichert", + "removed": "Fotoaufgabe entfernt", + "imported": "Fotoaufgabenpaket importiert", + "saveTask": "Fotoaufgabe speichern", "add": "Hinzufügen", - "emptyHint": "Lege jetzt Tasks an oder importiere ein Paket.", - "emptyTitle": "Noch keine Tasks", - "emptyBody": "Lege Tasks an oder importiere ein Paket für dein Event.", - "emptyActionTask": "Task hinzufügen", - "emptyActionPack": "Paket importieren", - "addTask": "Aufgabe hinzufügen", - "addTaskHint": "Erstelle eine neue Aufgabe für dieses Event.", - "import": "Aufgabenpaket importieren", + "emptyHint": "Lege jetzt Fotoaufgaben an oder importiere ein Paket.", + "emptyTitle": "Noch keine Fotoaufgaben", + "emptyBody": "Lege Fotoaufgaben an oder importiere ein Paket für dein Event.", + "emptyActionTask": "Fotoaufgabe hinzufügen", + "emptyActionPack": "Fotoaufgabenpaket importieren", + "addTask": "Fotoaufgabe hinzufügen", + "addTaskHint": "Erstelle eine neue Fotoaufgabe für dieses Event.", + "import": "Fotoaufgabenpaket importieren", "importHint": "Nutze vordefinierte Pakete für deinen Event-Typ.", - "search": "Tasks durchsuchen", + "search": "Fotoaufgaben durchsuchen", "emotionFilter": "Emotion filtern", "customEmotion": "Eigene Emotion", "allEmotions": "Alle", - "count": "{{count}} Tasks", - "library": "Weitere Aufgaben", + "count": "{{count}} Fotoaufgaben", + "library": "Weitere Fotoaufgaben", "hideLibrary": "Bibliothek ausblenden", "viewAllLibrary": "Alle anzeigen", - "libraryEmpty": "Keine weiteren Aufgaben verfügbar.", + "libraryEmpty": "Keine weiteren Fotoaufgaben verfügbar.", "hideCollections": "Pakete ausblenden", "showCollections": "Alle Pakete anzeigen", "collectionsEmpty": "Keine Pakete vorhanden.", @@ -589,8 +589,8 @@ "bulkRemove": "Auswahl löschen", "bulkCancel": "Auswahl beenden", "bulkRemoveTitle": "Auswahl löschen", - "bulkRemoveBody": "Dies entfernt die ausgewählten Aufgaben aus dem Event.", - "select": "Aufgabe auswählen", + "bulkRemoveBody": "Dies entfernt die ausgewählten Fotoaufgaben aus dem Event.", + "select": "Fotoaufgabe auswählen", "manageEmotions": "Emotionen verwalten", "manageEmotionsHint": "Filtere und halte deine Taxonomie gepflegt.", "saveEmotion": "Emotion speichern", @@ -605,7 +605,7 @@ "descriptionPlaceholder": "Optionale Hinweise", "titleLabel": "Titel", "titlePlaceholder": "z. B. Erstes Gruppenfoto", - "bulkHint": "Eine Aufgabe pro Zeile. Sie werden erstellt und dem Event hinzugefügt.", + "bulkHint": "Eine Fotoaufgabe pro Zeile. Sie werden erstellt und dem Event hinzugefügt.", "bulkPlaceholder": "z. B.\nBraut & Bräutigam Porträt\nGruppenfoto mit Hauptgästen" }, "recap": { diff --git a/resources/js/admin/i18n/locales/en/management.json b/resources/js/admin/i18n/locales/en/management.json index a417fc8..924aaee 100644 --- a/resources/js/admin/i18n/locales/en/management.json +++ b/resources/js/admin/i18n/locales/en/management.json @@ -515,34 +515,34 @@ "manage": "Manage layouts & invites" }, "tasks": { - "badge": "Tasks", - "title": "Tasks & checklists", - "subtitle": "Motivate guests with clear prompts & highlights.", + "badge": "Photo tasks", + "title": "Photo tasks & checklists", + "subtitle": "Motivate guests with clear photo tasks & highlights.", "summary": { "assigned": "Assigned", "library": "Library", "collections": "Collections", "emotions": "Emotions" }, - "empty": "No tasks assigned yet.", - "manage": "Open task workspace", + "empty": "No photo tasks assigned yet.", + "manage": "Open photo task workspace", "status": { "completed": "Done", "open": "Open" }, - "disabledTitle": "Task mode is off for this event", - "disabledBody": "Guests only see the photo feed. Enable tasks in the event settings to show them again.", + "disabledTitle": "Photo task mode is off for this event", + "disabledBody": "Guests only see the photo feed. Enable photo tasks in the event settings to show them again.", "toggle": { - "title": "Tasks for this event", - "description": "Give guests optional prompts and photo ideas.", + "title": "Photo tasks for this event", + "description": "Give guests optional photo tasks and prompts.", "active": "ACTIVE", "inactive": "INACTIVE", - "onLabel": "Guests see task prompts", + "onLabel": "Guests see photo tasks", "offLabel": "Guest app shows photos only", - "switchLabel": "Tasks enabled", - "enabled": "Tasks activated", - "disabled": "Tasks disabled", - "permissionHint": "You do not have permission to change tasks." + "switchLabel": "Photo tasks enabled", + "enabled": "Photo tasks activated", + "disabled": "Photo tasks disabled", + "permissionHint": "You do not have permission to change photo tasks." }, "quickNav": "Quick jump", "sections": { @@ -552,31 +552,31 @@ "emotions": "Emotions" }, "actions": "Actions", - "assigned": "Task added", - "updateFailed": "Task could not be saved.", - "created": "Task saved", - "removed": "Task removed", - "imported": "Task pack imported", - "saveTask": "Save task", + "assigned": "Photo task added", + "updateFailed": "Photo task could not be saved.", + "created": "Photo task saved", + "removed": "Photo task removed", + "imported": "Photo task pack imported", + "saveTask": "Save photo task", "add": "Add", - "emptyHint": "Add tasks or import a pack.", - "emptyTitle": "No tasks yet", - "emptyBody": "Create tasks or import a pack for your event.", - "emptyActionTask": "Add task", - "emptyActionPack": "Import pack", - "addTask": "Add task", - "addTaskHint": "Create a new task for this event.", - "import": "Import pack", + "emptyHint": "Add photo tasks or import a pack.", + "emptyTitle": "No photo tasks yet", + "emptyBody": "Create photo tasks or import a pack for your event.", + "emptyActionTask": "Add photo task", + "emptyActionPack": "Import photo task pack", + "addTask": "Add photo task", + "addTaskHint": "Create a new photo task for this event.", + "import": "Import photo task pack", "importHint": "Use predefined packs for your event type.", - "search": "Search tasks", + "search": "Search photo tasks", "emotionFilter": "Emotion filter", "customEmotion": "Custom emotion", "allEmotions": "All", - "count": "{{count}} tasks", - "library": "More tasks", + "count": "{{count}} photo tasks", + "library": "More photo tasks", "hideLibrary": "Hide library", "viewAllLibrary": "View all", - "libraryEmpty": "No more tasks available.", + "libraryEmpty": "No more photo tasks available.", "hideCollections": "Hide collections", "showCollections": "Show all", "collectionsEmpty": "No collections available.", @@ -585,8 +585,8 @@ "bulkRemove": "Delete selection", "bulkCancel": "End selection", "bulkRemoveTitle": "Delete selection", - "bulkRemoveBody": "This will remove the selected tasks from the event.", - "select": "Select task", + "bulkRemoveBody": "This will remove the selected photo tasks from the event.", + "select": "Select photo task", "manageEmotions": "Manage emotions", "manageEmotionsHint": "Filter and keep your taxonomy tidy.", "saveEmotion": "Save emotion", @@ -601,7 +601,7 @@ "descriptionPlaceholder": "Optional notes", "titleLabel": "Title", "titlePlaceholder": "e.g. First group photo", - "bulkHint": "One task per line. These will be created and added to the event.", + "bulkHint": "One photo task per line. These will be created and added to the event.", "bulkPlaceholder": "e.g.\nBride & groom portrait\nGroup photo main guests" }, "recap": { diff --git a/resources/js/admin/mobile/EventTasksPage.tsx b/resources/js/admin/mobile/EventTasksPage.tsx index dfe799c..9a5fafb 100644 --- a/resources/js/admin/mobile/EventTasksPage.tsx +++ b/resources/js/admin/mobile/EventTasksPage.tsx @@ -50,7 +50,7 @@ import { useBackNavigation } from './hooks/useBackNavigation'; import { buildTaskSummary } from './lib/taskSummary'; import { buildTaskSectionCounts, type TaskSectionKey } from './lib/taskSectionCounts'; import { withAlpha } from './components/colors'; -import { ADMIN_ACTION_COLORS, useAdminTheme } from './theme'; +import { useAdminTheme } from './theme'; import { resolveEngagementMode } from '../lib/events'; import { useAuth } from '../auth/context'; @@ -65,140 +65,6 @@ function allowPermission(permissions: string[], permission: string): boolean { return false; } -function TaskSummaryCard({ summary }: { summary: ReturnType }) { - const { t } = useTranslation('management'); - const { textStrong, muted, border, surface, surfaceMuted, shadow } = useAdminTheme(); - const total = summary.assigned + summary.library + summary.collections + summary.emotions; - const segments = [ - { - key: 'assigned', - label: t('events.tasks.summary.assigned', 'Assigned'), - value: summary.assigned, - color: ADMIN_ACTION_COLORS.tasks, - }, - { - key: 'library', - label: t('events.tasks.summary.library', 'Library'), - value: summary.library, - color: ADMIN_ACTION_COLORS.qr, - }, - { - key: 'collections', - label: t('events.tasks.summary.collections', 'Collections'), - value: summary.collections, - color: ADMIN_ACTION_COLORS.settings, - }, - { - key: 'emotions', - label: t('events.tasks.summary.emotions', 'Emotions'), - value: summary.emotions, - color: ADMIN_ACTION_COLORS.branding, - }, - ]; - - return ( - - - - - - {t('events.tasks.summary.title', 'Task overview')} - - - - - - - {total} - - - {t('events.tasks.summary.total', 'Tasks total')} - - - - - {total > 0 ? ( - segments.map((segment) => - segment.value > 0 ? ( - - ) : null, - ) - ) : ( - - )} - - - - {segments.map((segment) => ( - - ))} - - - - ); -} - -function SummaryLegendItem({ - label, - value, - color, -}: { - label: string; - value: number; - color: string; -}) { - const { textStrong } = useAdminTheme(); - return ( - - - - {label} - - - {value} - - - ); -} - function QuickNavChip({ value, label, @@ -398,7 +264,7 @@ export default function MobileEventTasksPage() { setSelectedTaskIds(new Set()); } catch (err) { if (!isAuthError(err)) { - const message = getApiErrorMessage(err, t('events.errors.loadFailed', 'Tasks konnten nicht geladen werden.')); + const message = getApiErrorMessage(err, t('events.errors.loadFailed', 'Fotoaufgaben konnten nicht geladen werden.')); setError(message); toast.error(message); // If the current slug is invalid, attempt to recover to a valid event to avoid empty lists. @@ -430,11 +296,11 @@ export default function MobileEventTasksPage() { const result = await getEventTasks(eventId, 1); setAssignedTasks(result.data); setLibrary((prev) => prev.filter((t) => t.id !== taskId)); - toast.success(t('events.tasks.assigned', 'Task hinzugefügt')); + toast.success(t('events.tasks.assigned', 'Fotoaufgabe hinzugefügt')); } catch (err) { if (!isAuthError(err)) { - setError(getApiErrorMessage(err, t('events.errors.saveFailed', 'Task konnte nicht zugewiesen werden.'))); - toast.error(t('events.tasks.updateFailed', 'Task konnte nicht zugewiesen werden.')); + setError(getApiErrorMessage(err, t('events.errors.saveFailed', 'Fotoaufgabe konnte nicht zugewiesen werden.'))); + toast.error(t('events.tasks.updateFailed', 'Fotoaufgabe konnte nicht zugewiesen werden.')); } } finally { setAssigningId(null); @@ -449,7 +315,7 @@ export default function MobileEventTasksPage() { const assignedIds = new Set(result.data.map((t) => t.id)); setAssignedTasks(result.data); setLibrary((prev) => prev.filter((t) => !assignedIds.has(t.id))); - toast.success(t('events.tasks.imported', 'Aufgabenpaket importiert')); + toast.success(t('events.tasks.imported', 'Fotoaufgabenpaket importiert')); } catch (err) { if (!isAuthError(err)) { setError(getApiErrorMessage(err, t('events.errors.saveFailed', 'Paket konnte nicht importiert werden.'))); @@ -463,7 +329,7 @@ export default function MobileEventTasksPage() { try { if (newTask.id) { if (!Number.isFinite(Number(newTask.id))) { - toast.error(t('events.tasks.updateFailed', 'Task konnte nicht gespeichert werden (ID fehlt).')); + toast.error(t('events.tasks.updateFailed', 'Fotoaufgabe konnte nicht gespeichert werden (ID fehlt).')); return; } @@ -501,11 +367,11 @@ export default function MobileEventTasksPage() { setLibrary((prev) => prev.filter((t) => !assignedIds.has(t.id))); setShowTaskSheet(false); setNewTask({ id: null, title: '', description: '', emotion_id: '', tenant_id: null }); - toast.success(t('events.tasks.created', 'Aufgabe gespeichert')); + toast.success(t('events.tasks.created', 'Fotoaufgabe gespeichert')); } catch (err) { if (!isAuthError(err)) { - setError(getApiErrorMessage(err, t('events.errors.saveFailed', 'Aufgabe konnte nicht erstellt werden.'))); - toast.error(t('events.errors.saveFailed', 'Aufgabe konnte nicht erstellt werden.')); + setError(getApiErrorMessage(err, t('events.errors.saveFailed', 'Fotoaufgabe konnte nicht erstellt werden.'))); + toast.error(t('events.errors.saveFailed', 'Fotoaufgabe konnte nicht erstellt werden.')); } } } @@ -525,11 +391,11 @@ export default function MobileEventTasksPage() { } return next; }); - toast.success(t('events.tasks.removed', 'Aufgabe entfernt')); + toast.success(t('events.tasks.removed', 'Fotoaufgabe entfernt')); } catch (err) { if (!isAuthError(err)) { - setError(getApiErrorMessage(err, t('events.errors.saveFailed', 'Aufgabe konnte nicht entfernt werden.'))); - toast.error(t('events.errors.saveFailed', 'Aufgabe konnte nicht entfernt werden.')); + setError(getApiErrorMessage(err, t('events.errors.saveFailed', 'Fotoaufgabe konnte nicht entfernt werden.'))); + toast.error(t('events.errors.saveFailed', 'Fotoaufgabe konnte nicht entfernt werden.')); } } finally { setBusyId(null); @@ -556,10 +422,10 @@ export default function MobileEventTasksPage() { setAssignedTasks((prev) => prev.filter((task) => !selectedTaskIds.has(task.id))); setSelectedTaskIds(new Set()); setSelectionMode(false); - toast.success(t('events.tasks.removed', 'Aufgabe entfernt')); + toast.success(t('events.tasks.removed', 'Fotoaufgabe entfernt')); } catch (err) { if (!isAuthError(err)) { - toast.error(t('events.errors.saveFailed', 'Aufgabe konnte nicht entfernt werden.')); + toast.error(t('events.errors.saveFailed', 'Fotoaufgabe konnte nicht entfernt werden.')); } } finally { setBulkDeleteBusy(false); @@ -664,10 +530,10 @@ export default function MobileEventTasksPage() { setAssignedTasks(result.data); setBulkLines(''); setShowBulkSheet(false); - toast.success(t('events.tasks.created', 'Aufgabe gespeichert')); + toast.success(t('events.tasks.created', 'Fotoaufgabe gespeichert')); } catch (err) { if (!isAuthError(err)) { - toast.error(t('events.errors.saveFailed', 'Aufgabe konnte nicht erstellt werden.')); + toast.error(t('events.errors.saveFailed', 'Fotoaufgabe konnte nicht erstellt werden.')); } } } @@ -720,8 +586,8 @@ export default function MobileEventTasksPage() { setEventRecord(updated); toast.success( nextEnabled - ? t('events.tasks.toggle.enabled', 'Tasks activated') - : t('events.tasks.toggle.disabled', 'Tasks disabled') + ? t('events.tasks.toggle.enabled', 'Photo tasks activated') + : t('events.tasks.toggle.disabled', 'Photo tasks disabled') ); } catch (err) { if (!isAuthError(err)) { @@ -735,7 +601,7 @@ export default function MobileEventTasksPage() { return ( @@ -763,12 +629,12 @@ export default function MobileEventTasksPage() { - {t('events.tasks.toggle.title', 'Tasks for this event')} + {t('events.tasks.toggle.title', 'Photo tasks for this event')} {t( 'events.tasks.toggle.description', - 'Give guests optional prompts and photo ideas.' + 'Give guests optional photo tasks and prompts.' )} @@ -780,19 +646,19 @@ export default function MobileEventTasksPage() { {tasksEnabled - ? t('events.tasks.toggle.onLabel', 'Guests see task prompts') + ? t('events.tasks.toggle.onLabel', 'Guests see photo tasks') : t('events.tasks.toggle.offLabel', 'Guest app shows photos only')} - {t('events.tasks.toggle.switchLabel', 'Tasks enabled')} + {t('events.tasks.toggle.switchLabel', 'Photo tasks enabled')} @@ -800,79 +666,87 @@ export default function MobileEventTasksPage() { {isMember && !canManageTasks ? ( - {t('events.tasks.toggle.permissionHint', 'You do not have permission to change tasks.')} + {t('events.tasks.toggle.permissionHint', 'You do not have permission to change photo tasks.')} ) : null} ) : null} {!loading ? ( - - ) : null} - - {!loading ? ( - - - - - - {t('events.tasks.quickNav', 'Quick jump')} - - - - - - { - const key = next as TaskSectionKey | ''; - if (!key) { - return; - } - setQuickNavSelection(key); - handleQuickNav(key); - }} - > - - {sectionCounts.map((section) => ( - { - setQuickNavSelection(section.key); - handleQuickNav(section.key); - }} - isActive={quickNavSelection === section.key} - /> - ))} + + + + + + + {t('events.tasks.quickNav', 'Quick jump')} + - - + + + { + const key = next as TaskSectionKey | ''; + if (!key) { + return; + } + setQuickNavSelection(key); + handleQuickNav(key); + }} + > + + {sectionCounts.map((section) => ( + { + setQuickNavSelection(section.key); + handleQuickNav(section.key); + }} + isActive={quickNavSelection === section.key} + /> + ))} + + + + + + + setSearchTerm(e.target.value)} - placeholder={t('events.tasks.search', 'Search tasks')} + placeholder={t('events.tasks.search', 'Search photo tasks')} compact /> @@ -899,8 +773,8 @@ export default function MobileEventTasksPage() { - - + + ) : null} {loading ? ( @@ -913,19 +787,19 @@ export default function MobileEventTasksPage() { - {t('events.tasks.emptyTitle', 'No tasks yet')} + {t('events.tasks.emptyTitle', 'No photo tasks yet')} - {t('events.tasks.emptyBody', 'Create tasks or import a pack for your event.')} + {t('events.tasks.emptyBody', 'Create photo tasks or import a pack for your event.')} setShowTaskSheet(true)} fullWidth={false} /> setShowCollectionSheet(true)} fullWidth={false} @@ -951,13 +825,13 @@ export default function MobileEventTasksPage() { - {t('events.tasks.addTask', 'Aufgabe hinzufügen')} + {t('events.tasks.addTask', 'Fotoaufgabe hinzufügen')} } subTitle={ - {t('events.tasks.addTaskHint', 'Erstelle eine neue Aufgabe für dieses Event.')} + {t('events.tasks.addTaskHint', 'Erstelle eine neue Fotoaufgabe für dieses Event.')} } paddingVertical="$2" @@ -983,7 +857,7 @@ export default function MobileEventTasksPage() { - {t('events.tasks.import', 'Aufgabenpaket importieren')} + {t('events.tasks.import', 'Fotoaufgabenpaket importieren')} } @@ -1003,7 +877,7 @@ export default function MobileEventTasksPage() { - {t('events.tasks.count', '{{count}} Tasks', { count: filteredTasks.length })} + {t('events.tasks.count', '{{count}} photo tasks', { count: filteredTasks.length })} {selectionMode ? ( @@ -1046,7 +920,7 @@ export default function MobileEventTasksPage() { checked={selectedTaskIds.has(task.id)} onCheckedChange={() => toggleSelectedTask(task.id)} onPress={(event: any) => event?.stopPropagation?.()} - aria-label={t('events.tasks.select', 'Select task')} + aria-label={t('events.tasks.select', 'Select photo task')} > @@ -1078,7 +952,7 @@ export default function MobileEventTasksPage() { borderWidth={1} borderColor={`${danger}33`} icon={} - aria-label={t('events.tasks.remove', 'Remove task')} + aria-label={t('events.tasks.remove', 'Remove photo task')} disabled={busyId === task.id} onPress={(event: any) => { event?.stopPropagation?.(); @@ -1098,11 +972,11 @@ export default function MobileEventTasksPage() { - {t('events.tasks.library', 'Weitere Aufgaben')} + {t('events.tasks.library', 'Weitere Fotoaufgaben')} setShowCollectionSheet(true)}> - {t('events.tasks.import', 'Import Pack')} + {t('events.tasks.import', 'Import photo task pack')} @@ -1113,7 +987,7 @@ export default function MobileEventTasksPage() { {library.length === 0 ? ( - {t('events.tasks.libraryEmpty', 'Keine weiteren Aufgaben verfügbar.')} + {t('events.tasks.libraryEmpty', 'Keine weiteren Fotoaufgaben verfügbar.')} ) : ( @@ -1137,9 +1011,12 @@ export default function MobileEventTasksPage() { iconAfter={ quickAssign(task.id)}> - - {assigningId === task.id ? t('common.processing', '...') : t('events.tasks.add', 'Add')} - + + + + {assigningId === task.id ? t('common.processing', '...') : t('events.tasks.add', 'Add')} + + @@ -1157,7 +1034,7 @@ export default function MobileEventTasksPage() { setShowCollectionSheet(false)} - title={t('events.tasks.import', 'Aufgabenpaket importieren')} + title={t('events.tasks.import', 'Fotoaufgabenpaket importieren')} footer={null} > @@ -1214,9 +1091,9 @@ export default function MobileEventTasksPage() { setShowTaskSheet(false)} - title={t('events.tasks.addTask', 'Aufgabe hinzufügen')} + title={t('events.tasks.addTask', 'Fotoaufgabe hinzufügen')} footer={ - createNewTask()} /> + createNewTask()} /> } > @@ -1257,11 +1134,11 @@ export default function MobileEventTasksPage() { open={showBulkSheet} onClose={() => setShowBulkSheet(false)} title={t('events.tasks.bulkAdd', 'Bulk add')} - footer={ handleBulkAdd()} />} + footer={ handleBulkAdd()} />} > - {t('events.tasks.bulkHint', 'One task per line. These will be created and added to the event.')} + {t('events.tasks.bulkHint', 'One photo task per line. These will be created and added to the event.')} - {t('events.tasks.removeTitle', 'Remove task?')} + {t('events.tasks.removeTitle', 'Remove photo task?')} {deleteCandidate ? t('events.tasks.removeBody', 'This will remove "{{title}}" from the event.', { title: deleteCandidate.title }) - : t('events.tasks.removeBodyFallback', 'This will remove the task from the event.')} + : t('events.tasks.removeBodyFallback', 'This will remove the photo task from the event.')} @@ -1460,7 +1337,7 @@ export default function MobileEventTasksPage() { - {t('events.tasks.bulkRemoveBody', 'This will remove the selected tasks from the event.')} + {t('events.tasks.bulkRemoveBody', 'This will remove the selected photo tasks from the event.')} @@ -1506,7 +1383,7 @@ export default function MobileEventTasksPage() { pressTheme title={ - {t('events.tasks.addTask', 'Aufgabe hinzufügen')} + {t('events.tasks.addTask', 'Fotoaufgabe hinzufügen')} } onPress={() => { diff --git a/resources/js/admin/mobile/__tests__/EventTasksPage.test.tsx b/resources/js/admin/mobile/__tests__/EventTasksPage.test.tsx index 1648227..70eabb5 100644 --- a/resources/js/admin/mobile/__tests__/EventTasksPage.test.tsx +++ b/resources/js/admin/mobile/__tests__/EventTasksPage.test.tsx @@ -264,14 +264,12 @@ vi.mock('../theme', () => ({ import MobileEventTasksPage from '../EventTasksPage'; describe('MobileEventTasksPage', () => { - it('renders the task overview summary and quick jump chips', async () => { + it('renders the quick jump chips and photo task header', async () => { render(); - expect(await screen.findByText('Tasks for this event')).toBeInTheDocument(); - expect(await screen.findByText('Task overview')).toBeInTheDocument(); - expect(screen.getByText('Tasks total')).toBeInTheDocument(); + expect(await screen.findByText('Photo tasks for this event')).toBeInTheDocument(); expect(screen.getByText('Quick jump')).toBeInTheDocument(); - expect(screen.getByText('Assigned')).toBeInTheDocument(); + expect(screen.getByText('assigned')).toBeInTheDocument(); expect(api.getTaskCollections).toHaveBeenCalledWith( expect.objectContaining({ event_type: 'wedding' }),