"use client" import { useState } from "react" import { ResourcePage } from "@/shared/data-view/resource-page" import { ColumnHeader } from "@/shared/data-view/table-view" import FormDialog from "@/shared/components/form-dialog" import { LeaveRequestForm } from "@/modules/leave-requests/leave-request-form" import { LEAVE_REQUEST_ROUTES } from "@garage/api" import type { LeaveRequestsClient } from "@garage/api" import { Badge } from "@/shared/components/ui/badge" import { Button } from "@/shared/components/ui/button" import { useAuthApi } from "@/shared/useApi" import { useQueryClient } from "@tanstack/react-query" import { toast } from "sonner" import { CheckIcon, XIcon } from "lucide-react" import { confirm } from "@/shared/components/confirm-dialog" import { formatEnum } from "@/shared/utils/formatters" import { usePermissions } from "@/shared/hooks/use-permissions" type LeaveRow = { id: number leave_type: string start_date?: string end_date?: string days?: number status: string reason?: string | null employee?: { id?: number; first_name?: string; last_name?: string; email?: string } } function formatDate(value: unknown) { if (!value || typeof value !== "string") return "—" const d = new Date(value) return Number.isNaN(d.getTime()) ? value : d.toLocaleDateString() } function statusVariant(status: string): "default" | "secondary" | "outline" | "destructive" { if (status === "approved") return "default" if (status === "rejected") return "destructive" if (status === "cancelled") return "outline" return "secondary" } export default function LeaveRequestsPage() { const api = useAuthApi() const queryClient = useQueryClient() const perms = usePermissions() async function handleDecision(id: number, action: "approve" | "reject") { const ok = await confirm({ title: action === "approve" ? "Approve request?" : "Reject request?", description: `This will mark the leave request as ${action}d.`, confirmLabel: action === "approve" ? "Approve" : "Reject", variant: action === "approve" ? "default" : "destructive", }) if (!ok) return const promise = action === "approve" ? api.leaveRequests.approve(String(id)) : api.leaveRequests.reject(String(id)) toast.promise(promise, { loading: action === "approve" ? "Approving..." : "Rejecting...", success: action === "approve" ? "Approved" : "Rejected", error: "Failed", }) await promise queryClient.invalidateQueries({ queryKey: [LEAVE_REQUEST_ROUTES.INDEX] }) } return ( pageTitle="Leave Requests" routeKey={LEAVE_REQUEST_ROUTES.INDEX} getClient={(api) => api.leaveRequests} statusFilter={{ statuses: ["pending", "approved", "rejected", "cancelled"], paramKey: "status", allLabel: "All", }} headerProps={({ selectedItem, invalidateQuery }) => ({ actions: perms.canCreate("leave_requests") ? ( {(resourceId) => ( )} ) : null, })} columns={({ actionsColumn }) => [ { accessorKey: "employee", header: ({ column }) => , cell: ({ row }) => { const e = (row.original as any).employee if (!e) return "—" return `${e.first_name ?? ""} ${e.last_name ?? ""}`.trim() || e.email || "—" }, }, { accessorKey: "leave_type", header: ({ column }) => , cell: ({ row }) => {formatEnum((row.original as any).leave_type)}, }, { accessorKey: "start_date", header: ({ column }) => , cell: ({ row }) => formatDate((row.original as any).start_date), }, { accessorKey: "end_date", header: ({ column }) => , cell: ({ row }) => formatDate((row.original as any).end_date), }, { accessorKey: "days", header: ({ column }) => , cell: ({ row }) => (row.original as any).days ?? "—", }, { accessorKey: "status", header: ({ column }) => , cell: ({ row }) => { const s = (row.original as any).status as string return {formatEnum(s)} }, }, { id: "decide", header: () => Decide, cell: ({ row }) => { const r = row.original as LeaveRow if (r.status !== "pending" || !perms.canUpdate("leave_requests")) return null return (
) }, }, actionsColumn(), ]} /> ) }