import { Head, router } from '@inertiajs/react'; import { useCallback, useState } from 'react'; import { ConfirmDialog } from '@/components/confirm-dialog'; import type { PaginationState, SortState } from '@/components/data-table'; import { DataTable } from '@/components/data-table'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { index as payrollPeriodsIndex } from '@/routes/admin/finance/payroll-periods'; import { show as payrollPeriodShow } from '@/routes/admin/finance/payroll-periods'; import { close, reopen } from '@/routes/admin/finance/payroll-periods'; import { createPayrollPeriodColumns } from './columns'; import type { PayrollPeriod } from './columns'; type Props = { payrollPeriods: { data: PayrollPeriod[]; current_page: number; last_page: number; per_page: number; total: number; }; }; const MONTH_NAMES = [ '', 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember', ]; export default function PayrollPeriodIndex({ payrollPeriods }: Props) { const [closing, setClosing] = useState(null); const [reopening, setReopening] = useState(null); const [search, setSearch] = useState(''); const [sort, setSort] = useState({ column: 'created_at', direction: 'desc', }); const pagination: PaginationState = { current_page: payrollPeriods.current_page, last_page: payrollPeriods.last_page, per_page: payrollPeriods.per_page, total: payrollPeriods.total, }; function handleClose() { if (!closing) { return; } router.post( close(closing.id), {}, { onSuccess: () => setClosing(null), }, ); } function handleReopen() { if (!reopening) { return; } router.post( reopen(reopening.id), {}, { onSuccess: () => setReopening(null), }, ); } function handlePageChange(page: number) { router.get( payrollPeriodsIndex(), { page, per_page: pagination.per_page, search, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true }, ); } function handlePerPageChange(perPage: number) { router.get( payrollPeriodsIndex(), { 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( payrollPeriodsIndex(), { page: 1, per_page: pagination.per_page, search: value, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true }, ); }, [pagination.per_page, sort], ); function handleSortChange(column: string, direction: 'asc' | 'desc') { setSort({ column, direction }); router.get( payrollPeriodsIndex(), { page: 1, per_page: pagination.per_page, search, sort: column, direction, }, { preserveState: true, replace: true }, ); } const columns = createPayrollPeriodColumns({ showUrl: (id) => payrollPeriodShow(id).url, handleClose: (period) => setClosing(period), handleReopen: (period) => setReopening(period), }); return ( <>

Gaji

{ if (!open) { setClosing(null); } }} title="Tutup Periode Gaji" description={`Apakah Anda yakin ingin menutup periode gaji ${closing ? `${MONTH_NAMES[closing.month]} ${closing.year}` : ''}? Semua gaji harus sudah dibayar sebelum periode ditutup.`} confirmLabel="Tutup" onConfirm={handleClose} /> { if (!open) { setReopening(null); } }} title="Buka Periode Gaji" description={`Apakah Anda yakin ingin membuka kembali periode gaji ${reopening ? `${MONTH_NAMES[reopening.month]} ${reopening.year}` : ''}?`} confirmLabel="Buka" onConfirm={handleReopen} />
); } PayrollPeriodIndex.layout = { breadcrumbs: [ { title: 'Keuangan', href: payrollPeriodsIndex(), }, { title: 'Gaji', href: payrollPeriodsIndex(), }, ], };