Grille & vue bénévole : message quand il n'y a pas de données

- components/state : composant EmptyNote (encadré pointillés).
- GrillePage : si aucun créneau, message au lieu de la grille vide.
- VolunteerViewPage : si aucun bénévole, message ; si un filtre ne
  renvoie rien, message à la place du tableau (avant, l'en-tête collant
  restait affiché).

typecheck + lint + build + smoke OK.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
AdamThomas
2026-09-10 21:22:10 +02:00
co-authored by Claude Sonnet 5
parent 385c46c241
commit 06f8736c33
4 changed files with 47 additions and 13 deletions
+10 -1
View File
@@ -3,7 +3,7 @@ import { useMemo, useState } from 'react';
import { useMatrix } from '@/api/hooks';
import type { MatrixPosition, MatrixShift, PositionCategory } from '@/api/schema';
import { Chip } from '@/components/ui';
import { ErrorNote, Loading } from '@/components/state';
import { EmptyNote, ErrorNote, Loading } from '@/components/state';
import { AssignmentPanel } from '@/pages/grille/AssignmentPanel';
import { categoryLabel, latticeFromMatrix, type LatticeColumn } from '@/lib/planning';
import { datePart, shortDayLabel, timePart } from '@/lib/time';
@@ -25,6 +25,15 @@ export function GrillePage() {
if (matrix.error) return <ErrorNote error={matrix.error} />;
if (!matrix.data) return null;
const hasShifts = matrix.data.positions.some((p) => p.shifts.length > 0);
if (!hasShifts) {
return (
<div className="flex min-h-0 flex-1 flex-col">
<EmptyNote>{t('grille.empty')}</EmptyNote>
</div>
);
}
const categories = [...new Set(matrix.data.positions.map((p) => p.category))].sort();
const shownDays = dayFilter === 'all' ? lattice.days : lattice.days.filter((d) => d.date === dayFilter);
const shownColumns = shownDays.flatMap((d) => d.columns);