Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 28 additions & 4 deletions src/components/loans/LoansTable.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use client";

import { useState, useTransition, useMemo } from "react";
import { useState, useTransition, useMemo, useEffect } from "react";
import { useSearchParams, useRouter } from "next/navigation";
import { format } from "date-fns";
import { Eye, CheckCircle, AlertCircle, Clock, XCircle, Search, Trash2, Package } from "lucide-react";
import { toast } from "sonner";
Expand Down Expand Up @@ -54,6 +55,8 @@ interface LoansTableProps {
}

export function LoansTable({ data, items }: LoansTableProps) {
const searchParams = useSearchParams();
const router = useRouter();
const [selectedLoan, setSelectedLoan] = useState<LoanWithDetails | null>(null);
const [isPending, startTransition] = useTransition();
const [search, setSearch] = useState("");
Expand All @@ -62,6 +65,19 @@ export function LoansTable({ data, items }: LoansTableProps) {
const [deletingRefNo, setDeletingRefNo] = useState<number | null>(null);
const [isDeleting, setIsDeleting] = useState(false);

// Auto-open dialog when id search parameter is present in the URL
useEffect(() => {
const idParam = searchParams.get("id");
if (idParam) {
const loan = data.find(l => l.refNo === Number(idParam));
if (loan) {
setSelectedLoan(loan)
} else {
router.replace("/loans", { scroll: false });
};
}
}, [searchParams, data, router]);

// Helper to check if a loan item has insufficient stock for approval
const getItemAvailability = (itemId: number, requestedQty: number) => {
const itemInfo = items.find(i => i.itemId === itemId);
Expand Down Expand Up @@ -243,7 +259,7 @@ export function LoansTable({ data, items }: LoansTableProps) {
</TableRow>
) : (
filteredData.map((loan) => (
<TableRow key={loan.refNo} className="cursor-pointer hover:bg-muted/50" onClick={() => setSelectedLoan(loan)}>
<TableRow key={loan.refNo} className="cursor-pointer hover:bg-muted/50" onClick={() => router.replace(`/loans?id=${loan.refNo}`, { scroll: false })}>
<TableCell className="font-medium">#{loan.refNo}</TableCell>
<TableCell>
<div className="flex flex-col">
Expand Down Expand Up @@ -284,7 +300,7 @@ export function LoansTable({ data, items }: LoansTableProps) {
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<Button size="icon" variant="ghost" onClick={(e) => { e.stopPropagation(); setSelectedLoan(loan); }}>
<Button size="icon" variant="ghost" onClick={(e) => { e.stopPropagation(); router.replace(`/loans?id=${loan.refNo}`, { scroll: false }); }}>
<Eye className="h-4 w-4" />
</Button>
</TooltipTrigger>
Expand Down Expand Up @@ -359,7 +375,15 @@ export function LoansTable({ data, items }: LoansTableProps) {
</div>

{/* Details Modal */}
<Dialog open={!!selectedLoan} onOpenChange={(open) => !open && setSelectedLoan(null)}>
<Dialog open={!!selectedLoan} onOpenChange={(open) => {
if (!open) {
setSelectedLoan(null);
// Remove id search parameter from URL when dialog is closed
if (searchParams.has("id")) {
router.replace("/loans", { scroll: false });
}
}
}}>
<DialogContent className="max-w-3xl">
<DialogHeader>
<div className="flex justify-between items-center pr-8">
Expand Down