From e825651c57ca5480885bc89811c0f2fb7983b3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Thu, 20 Nov 2025 18:31:33 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20Ajouter=20des=20fonctionnalit=C3=A9s=20?= =?UTF-8?q?de=20tri=20et=20de=20filtrage=20des=20heures,=20incluant=20la?= =?UTF-8?q?=20s=C3=A9lection=20d'utilisateurs=20et=20l'ajout=20de=20timest?= =?UTF-8?q?amps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 2 +- app/admin/page.tsx | 124 ++++++++++-- app/api/hours/route.ts | 2 + components/ui/checkbox.tsx | 32 +++ components/ui/select.tsx | 187 ++++++++++++++++++ package.json | 5 +- pnpm-lock.yaml | 159 +++++++++++++++ .../migration.sql | 21 ++ prisma/schema.prisma | 2 + 9 files changed, 511 insertions(+), 23 deletions(-) create mode 100644 components/ui/checkbox.tsx create mode 100644 components/ui/select.tsx create mode 100644 prisma/migrations/20251120171812_add_timestamps_to_hour/migration.sql diff --git a/.dockerignore b/.dockerignore index f35cac3..a12fb98 100644 --- a/.dockerignore +++ b/.dockerignore @@ -41,4 +41,4 @@ prisma/dev.db INITIAL_SETUP.md API_DOCS.md INDICATIONS_POUR_LLMS.md - +scripts/seed-test.js diff --git a/app/admin/page.tsx b/app/admin/page.tsx index 0f6f873..19f2578 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -28,6 +28,14 @@ import { DialogHeader, DialogTitle, } from '../../components/ui/dialog'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '../../components/ui/select'; +import { Checkbox } from '../../components/ui/checkbox'; import { toast } from 'sonner'; import { DatePicker } from '../../components/ui/date-picker'; import { format } from 'date-fns'; @@ -40,6 +48,7 @@ interface Hour { reason: string; status: string; userId: string; + createdAt?: string; user: { email: string; firstName?: string; lastName?: string; role: string }; validatedBy?: { firstName?: string; lastName?: string; email: string }; } @@ -95,6 +104,9 @@ export default function AdminPage() { const [users, setUsers] = useState([]); const [confirmPasswordChange, setConfirmPasswordChange] = useState(false); const [selectedUserIds, setSelectedUserIds] = useState([]); + const [sortBy, setSortBy] = useState<'date' | 'createdAt'>('date'); + const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc'); + const [showPendingFirst, setShowPendingFirst] = useState(false); const { refetchSettings } = useSettings(); useEffect(() => { @@ -363,9 +375,27 @@ export default function AdminPage() { const isSuperAdmin = session?.user?.role === 'SUPER_ADMIN'; - const sortedHours = hours.sort( - (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(), - ); + const sortedHours = [...hours].sort((a, b) => { + if (showPendingFirst) { + if (a.status === 'PENDING' && b.status !== 'PENDING') return -1; + if (a.status !== 'PENDING' && b.status === 'PENDING') return 1; + } + + let dateA, dateB; + if (sortBy === 'createdAt') { + dateA = a.createdAt ? new Date(a.createdAt).getTime() : 0; + dateB = b.createdAt ? new Date(b.createdAt).getTime() : 0; + } else { + dateA = new Date(a.date).getTime(); + dateB = new Date(b.date).getTime(); + } + + if (sortOrder === 'asc') { + return dateA - dateB; + } else { + return dateB - dateA; + } + }); const displayedHours = showAll ? sortedHours : sortedHours.slice(0, 10); const formatHours = (minutes: number) => { @@ -395,12 +425,11 @@ export default function AdminPage() {
{users.map((user) => (
- { - if (e.target.checked) { + onCheckedChange={(checked) => { + if (checked) { setSelectedUserIds([...selectedUserIds, user.id]); } else { setSelectedUserIds( @@ -408,7 +437,6 @@ export default function AdminPage() { ); } }} - className="h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary" />