diff --git a/resources/js/components/cards/payroll-card.tsx b/resources/js/components/cards/payroll-card.tsx new file mode 100644 index 0000000..6b39453 --- /dev/null +++ b/resources/js/components/cards/payroll-card.tsx @@ -0,0 +1,72 @@ +import { Badge } from '@/components/ui/badge'; +import { + Card, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from '@/components/ui/card'; +import { cn } from '@/lib/utils'; +import type { Payroll } from '@/types'; + +export interface PayrollCardProps { + payroll: Payroll; + onClick?: () => void; + className?: string; +} + +export function PayrollCard({ payroll, onClick, className }: PayrollCardProps) { + return ( + + +
+ + {payroll.user?.name} + + + {payroll.is_paid ? 'Lunas' : 'Pending'} + +
+ + + {payroll.total_salary_formatted} + +
+ + +
+
+ Gaji Pokok + {payroll.base_salary_formatted} +
+ {payroll.adjustments?.map((adj, idx) => ( +
+ {adj.description} + + {adj.type === 'bonus' ? '+' : '-'}{adj.amount_formatted} + +
+ ))} +
+
+ Periode + {payroll.period_month_formatted} +
+
+
+ ); +} diff --git a/resources/js/pages/admin/finance/payroll/hooks/use-payroll-index.ts b/resources/js/pages/admin/finance/payroll/hooks/use-payroll-index.ts index b64e3bb..24cbc58 100644 --- a/resources/js/pages/admin/finance/payroll/hooks/use-payroll-index.ts +++ b/resources/js/pages/admin/finance/payroll/hooks/use-payroll-index.ts @@ -1,8 +1,8 @@ +import payrollRoutes from '@/routes/payroll'; +import type { Payroll } from '@/types'; import { router } from '@inertiajs/react'; import { useState } from 'react'; import { toast } from 'sonner'; -import payrollRoutes from '@/routes/payroll'; -import type { Payroll } from '@/types'; export function usePayrollIndex() { const [isFormOpen, setIsFormOpen] = useState(false); @@ -70,6 +70,8 @@ export function usePayrollIndex() { const onTogglePaid = (id: number) => { router.patch(payrollRoutes.togglePaid(id).url, {}, { + preserveState: true, + preserveScroll: true, onSuccess: (response: any) => toast.success(response.props.flash.success), }); }; diff --git a/resources/js/pages/admin/finance/payroll/index.tsx b/resources/js/pages/admin/finance/payroll/index.tsx index a8add24..41ae740 100644 --- a/resources/js/pages/admin/finance/payroll/index.tsx +++ b/resources/js/pages/admin/finance/payroll/index.tsx @@ -1,25 +1,24 @@ -import { Head } from '@inertiajs/react'; -import { Trash2, Sparkles } from 'lucide-react'; import { DataTable } from '@/components/data-table'; - +import { Head } from '@inertiajs/react'; +import { Sparkles, Trash2 } from 'lucide-react'; import { DeleteConfirmation } from '@/components/modal/delete-confirmation'; -import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import type { Payroll } from '@/types'; +import { PayrollCard } from '@/components/cards/payroll-card'; +import { usePermission } from '@/hooks/use-permission'; import { usePayrollIndex } from './hooks/use-payroll-index'; import { getColumns } from './partials/columns'; import { PayrollFormModal } from './partials/payroll-form-modal'; -import { usePermission } from '@/hooks/use-permission'; export default function PayrollIndex({ payrolls, currentMonthPayrolls, }: { - payrolls: Payroll[], - currentMonthPayrolls: Payroll[], + payrolls: Payroll[]; + currentMonthPayrolls: Payroll[]; }) { const { hasPermission } = usePermission(); const { @@ -45,7 +44,10 @@ export default function PayrollIndex({ } = usePayrollIndex(); const columns = getColumns({ onEdit, onDelete, onTogglePaid }).filter( - (col) => col.id !== 'actions' || hasPermission('Edit:PayrollAdjustment') || hasPermission('Delete:Payroll') + (col) => + col.id !== 'actions' || + hasPermission('Edit:PayrollAdjustment') || + hasPermission('Delete:Payroll'), ); return ( @@ -54,11 +56,21 @@ export default function PayrollIndex({
-

Penggajian

+

+ Penggajian +

{hasPermission('Generate:Payroll') && ( - )} @@ -67,45 +79,15 @@ export default function PayrollIndex({
{currentMonthPayrolls.map((payroll) => ( - { if (hasPermission('Edit:PayrollAdjustment')) { onEdit(payroll); } }} - > - -
-
- {payroll.user?.name} - {payroll.period_month_formatted} -
- - {payroll.is_paid ? 'Lunas' : 'Pending'} - -
-
-
- Gaji Pokok - {payroll.base_salary_formatted} -
- {payroll.adjustments?.map((adj, idx) => ( -
- {adj.description} - - {adj.type === 'bonus' ? '+' : '-'}{adj.amount_formatted} - -
- ))} -
- Gaji Bersih - {payroll.total_salary_formatted} -
-
-
-
+ /> ))}
@@ -116,7 +98,7 @@ export default function PayrollIndex({ payroll={selectedPayroll} /> - + - Tindakan ini tidak dapat dibatalkan. Penggajian {payrollToDelete?.period_month_formatted} akan dihapus secara permanen dan stok akan dikembalikan. + Tindakan ini tidak dapat dibatalkan. Penggajian{' '} + + {payrollToDelete?.period_month_formatted} + {' '} + akan dihapus secara permanen dan stok akan dikembalikan. } onDelete={confirmDelete} @@ -173,7 +159,9 @@ export default function PayrollIndex({ title={`Hapus ${rowsToDelete.length} penggajian?`} description={ <> - Tindakan ini tidak dapat dibatalkan. {rowsToDelete.length} item yang terpilih akan dihapus secara permanen. + Tindakan ini tidak dapat dibatalkan.{' '} + {rowsToDelete.length} item yang + terpilih akan dihapus secara permanen. } onDelete={confirmBulkDelete}