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') && (
-