import { Form, Head, router } from '@inertiajs/react'; import { Filter, Plus, X } from 'lucide-react'; import { useCallback, useEffect, useState } from 'react'; import { ConfirmDialog } from '@/components/confirm-dialog'; import { DataTable } from '@/components/data-table'; import type { PaginationState } from '@/components/data-table'; import { DatePicker } from '@/components/date-picker'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { approve, destroy, index as leaveRequestIndex, reject, store, update, } from '@/routes/admin/hr/leave-requests'; import type { LeaveRequest } from './columns'; import { createLeaveRequestColumns } from './columns'; type Props = { leaveRequests: { data: LeaveRequest[]; current_page: number; last_page: number; per_page: number; total: number; }; filters: { status?: string; }; }; export default function LeaveRequestIndex({ leaveRequests, filters }: Props) { const [createOpen, setCreateOpen] = useState(false); const [editing, setEditing] = useState(null); const [deleting, setDeleting] = useState(null); const [approving, setApproving] = useState(null); const [rejecting, setRejecting] = useState(null); const [startDate, setStartDate] = useState(undefined); const [endDate, setEndDate] = useState(undefined); const [editingStartDate, setEditingStartDate] = useState( undefined, ); const [editingEndDate, setEditingEndDate] = useState( undefined, ); const [filterOpen, setFilterOpen] = useState(false); const [search, setSearch] = useState(''); const pagination: PaginationState = { current_page: leaveRequests.current_page, last_page: leaveRequests.last_page, per_page: leaveRequests.per_page, total: leaveRequests.total, }; const hasActiveFilters = filters.status; useEffect(() => { if (editing) { setEditingStartDate(new Date(editing.start_date)); setEditingEndDate(new Date(editing.end_date)); } else { setEditingStartDate(undefined); setEditingEndDate(undefined); } }, [editing]); function applyFilter(key: string, value: string) { const newFilters = { ...filters }; if (value === '' || value === 'all') { delete newFilters[key as keyof typeof newFilters]; } else { newFilters[key as keyof typeof newFilters] = value; } router.get( leaveRequestIndex(), { ...newFilters, page: 1, per_page: pagination.per_page, search, }, { preserveState: true, replace: true }, ); } function clearFilters() { router.get( leaveRequestIndex(), { page: 1, per_page: pagination.per_page, search, }, { preserveState: true, replace: true }, ); setFilterOpen(false); } function handleDelete() { if (!deleting) { return; } router.delete(destroy(deleting.id), { onSuccess: () => setDeleting(null), }); } function handleApprove() { if (!approving) { return; } router.post( approve(approving.id), {}, { onSuccess: () => setApproving(null), }, ); } function handleReject() { if (!rejecting) { return; } router.post( reject(rejecting.id), {}, { onSuccess: () => setRejecting(null), }, ); } function handlePageChange(page: number) { router.get( leaveRequestIndex(), { ...filters, page, per_page: pagination.per_page, search, }, { preserveState: true, replace: true }, ); } function handlePerPageChange(perPage: number) { router.get( leaveRequestIndex(), { ...filters, page: 1, per_page: perPage, search, }, { preserveState: true, replace: true }, ); } const handleSearchChange = useCallback( (value: string) => { setSearch(value); router.get( leaveRequestIndex(), { ...filters, page: 1, per_page: pagination.per_page, search: value, }, { preserveState: true, replace: true }, ); }, [pagination.per_page, filters], ); const columns = createLeaveRequestColumns({ handleEdit: (leaveRequest) => setEditing(leaveRequest), handleDeleteClick: (leaveRequest) => setDeleting(leaveRequest), handleApprove: (leaveRequest) => setApproving(leaveRequest), handleReject: (leaveRequest) => setRejecting(leaveRequest), }); const filterToolbar = (
Filter {hasActiveFilters && ( )}
); return ( <>

Cuti

{ setCreateOpen(open); if (!open) { setStartDate(undefined); setEndDate(undefined); } }} >
setCreateOpen(false)} > {({ errors, processing }) => { return ( <> Tambah Permohonan Cuti
); }}
{ if (!open) { setEditing(null); setEditingStartDate(undefined); setEditingEndDate(undefined); } }} > {editing && (
{ setEditing(null); setEditingStartDate(undefined); setEditingEndDate(undefined); }} > {({ errors, processing }) => { return ( <> Edit Permohonan Cuti
); }}
)}
{ if (!open) { setDeleting(null); } }} title="Hapus Permohonan Cuti" description={`Apakah Anda yakin ingin menghapus permohonan cuti ini? Tindakan ini tidak dapat dibatalkan.`} confirmLabel="Hapus" onConfirm={handleDelete} /> { if (!open) { setApproving(null); } }} title="Setujui Permohonan Cuti" description={`Apakah Anda yakin ingin menyetujui permohonan cuti ini?`} confirmLabel="Setujui" onConfirm={handleApprove} /> { if (!open) { setRejecting(null); } }} title="Tolak Permohonan Cuti" description={`Apakah Anda yakin ingin menolak permohonan cuti ini?`} confirmLabel="Tolak" onConfirm={handleReject} />
); }