import { Head, router } from '@inertiajs/react'; import { Filter, Plus, X } from 'lucide-react'; import { useCallback, useState } from 'react'; import { ConfirmDialog } from '@/components/confirm-dialog'; import { DataTable } from '@/components/data-table'; import type { PaginationState, SortState } from '@/components/data-table'; import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { destroy, create as employeeCreate, edit as employeeEdit, index as employeeIndex, toggleActive, resetPassword as resetPasswordRoute, } from '@/routes/admin/hr/employees'; import type { Employee } from './columns'; import { createEmployeeColumns } from './columns'; type Props = { employees: { data: Employee[]; current_page: number; last_page: number; per_page: number; total: number; }; filters: { employment_status?: string; is_active?: string; gender?: string; }; }; export default function EmployeeIndex({ employees, filters }: Props) { const [deleting, setDeleting] = useState(null); const [resetPasswordTarget, setResetPasswordTarget] = useState(null); const [filterOpen, setFilterOpen] = useState(false); const [search, setSearch] = useState(''); const [sort, setSort] = useState({ column: 'created_at', direction: 'desc', }); const pagination: PaginationState = { current_page: employees.current_page, last_page: employees.last_page, per_page: employees.per_page, total: employees.total, }; const hasActiveFilters = filters.employment_status || filters.is_active; 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( employeeIndex.url(), { ...newFilters, page: 1, per_page: pagination.per_page, search, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true }, ); } function clearFilters() { router.get( employeeIndex.url(), { page: 1, per_page: pagination.per_page, search, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true }, ); setFilterOpen(false); } function handlePageChange(page: number) { router.get( employeeIndex.url(), { ...filters, page, per_page: pagination.per_page, search, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true }, ); } function handlePerPageChange(perPage: number) { router.get( employeeIndex.url(), { ...filters, page: 1, per_page: perPage, search, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true }, ); } const handleSearchChange = useCallback( (value: string) => { setSearch(value); router.get( employeeIndex.url(), { ...filters, page: 1, per_page: pagination.per_page, search: value, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true }, ); }, [pagination.per_page, sort, filters], ); function handleSortChange(column: string, direction: 'asc' | 'desc') { setSort({ column, direction }); router.get( employeeIndex.url(), { ...filters, page: 1, per_page: pagination.per_page, search, sort: column, direction, }, { preserveState: true, replace: true }, ); } function handleDelete() { if (!deleting) { return; } router.delete(destroy.url(deleting.id), { onSuccess: () => setDeleting(null), }); } function handleResetPassword() { if (!resetPasswordTarget) { return; } router.post( resetPasswordRoute.url(resetPasswordTarget.id), {}, { onSuccess: () => setResetPasswordTarget(null), }, ); } const columns = createEmployeeColumns({ handleEdit: (employee) => { window.location.href = employeeEdit.url(employee.id); }, handleDeleteClick: (employee) => setDeleting(employee), handleResetPassword: (employee) => setResetPasswordTarget(employee), toggleActiveUrl: (id) => toggleActive.url(id), }); const filterToolbar = (
Filter {hasActiveFilters && ( )}
); return ( <>

Pegawai

{ if (!open) { setDeleting(null); } }} title="Hapus Pegawai" description={`Apakah Anda yakin ingin menghapus pegawai "${deleting?.user_profile?.full_name}"? Tindakan ini tidak dapat dibatalkan.`} confirmLabel="Hapus" onConfirm={handleDelete} /> { if (!open) { setResetPasswordTarget(null); } }} title="Reset Kata Sandi" description={`Apakah Anda yakin ingin mereset kata sandi pegawai "${resetPasswordTarget?.user_profile?.full_name}" ke kata sandi default?`} confirmLabel="Reset" variant="default" onConfirm={handleResetPassword} />
); } EmployeeIndex.layout = { breadcrumbs: [ { title: 'HR', href: employeeIndex.url(), }, { title: 'Pegawai', href: employeeIndex.url(), }, ], };