diff --git a/app/features/events/routes/programs/list.tsx b/app/features/events/routes/programs/list.tsx index 00d90c86..cd009ccd 100644 --- a/app/features/events/routes/programs/list.tsx +++ b/app/features/events/routes/programs/list.tsx @@ -169,50 +169,58 @@ function EventRow({ timezone, selected, onToggleSelection, + showCheckboxSlot, }: { event: Event timezone: string selected: boolean onToggleSelection: () => void + showCheckboxSlot: boolean }) { const weekday = formatEventDate(event.startDate, timezone, 'fr-FR', { weekday: 'long' }) const time = eventTimeOrEmpty(new Date(event.startDate), timezone) const isUpcoming = new Date(event.startDate) >= new Date() const showConflictBadge = isUpcoming && event.conflictCount > 0 - const cardStyle = event.kind?.color ? { borderLeftColor: event.kind.color, borderLeftWidth: '4px' } : {} + const cardStyle = { borderLeftColor: event.kind?.color ?? 'transparent', borderLeftWidth: '4px' } const kindLabel = event.kind ? ` · ${event.kind.name}` : '' const timeLabel = time ? ` · ${time}` : '' return ( -
- {event.canEdit && ( - e.stopPropagation()} - /> - )} - - - -
- {event.name} - - {weekday} - {timeLabel} - {kindLabel} - -
-
- {showConflictBadge && } - -
-
-
- -
+ + + {showCheckboxSlot && ( +
+ {event.canEdit && ( + + )} +
+ )} + +
+ {event.name} + + {weekday} + {timeLabel} + {kindLabel} + +
+
+ {showConflictBadge && } + +
+ +
+
) } @@ -220,10 +228,12 @@ function WeekCheckbox({ events, selectedIds, onToggleWeek, + ariaLabel, }: { events: Event[] selectedIds: Set onToggleWeek: (ids: number[], select: boolean) => void + ariaLabel: string }) { const ref = useRef(null) const allSelected = events.length > 0 && events.every(e => selectedIds.has(e.id)) @@ -246,6 +256,7 @@ function WeekCheckbox({ !allSelected, ) } + aria-label={ariaLabel} className="size-4 rounded border border-input accent-primary" /> ) @@ -355,11 +366,15 @@ export default function ProgramListPage({ loaderData }: Route.ComponentProps) { {upcomingEvents.length > 0 ? (
{hasEditableEvents && selectedIds.size > 0 && ( -
+
@@ -372,27 +387,31 @@ export default function ProgramListPage({ loaderData }: Route.ComponentProps) { {m.programs_bulk_delete()} -
+ )} {weekGroups.map(({ weekKey, weekMonday, events }) => { const editableWeekEvents = events.filter(e => e.canEdit) + const showCheckboxSlot = editableWeekEvents.length > 0 + const weekDate = formatEventDate(weekMonday, timezone, 'fr-FR', { + day: 'numeric', + month: 'long', + year: 'numeric', + }) return (
-
- {editableWeekEvents.length > 0 && ( - +
+ {showCheckboxSlot && ( + )}
- {m.programs_week_header_count({ - date: formatEventDate(weekMonday, timezone, 'fr-FR', { - day: 'numeric', - month: 'long', - year: 'numeric', - }), - count: events.length, - })} + {m.programs_week_header_count({ date: weekDate, count: events.length })}
@@ -405,6 +424,7 @@ export default function ProgramListPage({ loaderData }: Route.ComponentProps) { timezone={timezone} selected={selectedIds.has(event.id)} onToggleSelection={() => toggleSelection(event.id)} + showCheckboxSlot={showCheckboxSlot} /> ))}
diff --git a/app/i18n/messages/en.json b/app/i18n/messages/en.json index de4bd94b..17afb91f 100644 --- a/app/i18n/messages/en.json +++ b/app/i18n/messages/en.json @@ -1344,6 +1344,9 @@ "programs_bulk_delete_confirm_title": "Delete {count} event(s)?", "programs_bulk_delete_confirm_description": "All related assignments will be deleted. This action cannot be undone.", "programs_bulk_deselect": "Deselect all", + "programs_bulk_select_event": "Select event {name}", + "programs_week_select_all_aria": "Select all events for week of {date}", + "programs_bulk_actions_aria": "Bulk actions for selected events", "programs_export_pdf_button": "Export as PDF", "programs_days_off_button": "Absences", "programs_empty_title": "No upcoming events", diff --git a/app/i18n/messages/fr.json b/app/i18n/messages/fr.json index bcd77b18..072c2d27 100644 --- a/app/i18n/messages/fr.json +++ b/app/i18n/messages/fr.json @@ -1346,6 +1346,9 @@ "programs_bulk_delete_confirm_title": "Supprimer {count} évènement(s) ?", "programs_bulk_delete_confirm_description": "Toutes les attributions liées seront supprimées. Cette action est irréversible.", "programs_bulk_deselect": "Tout désélectionner", + "programs_bulk_select_event": "Sélectionner l'évènement {name}", + "programs_week_select_all_aria": "Sélectionner tous les évènements de la semaine du {date}", + "programs_bulk_actions_aria": "Actions groupées sur les évènements sélectionnés", "programs_export_pdf_button": "Exporter en PDF", "programs_days_off_button": "Absences", "programs_empty_title": "Aucun évènement à venir",