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" />