"use client"; import { useState, useEffect, useMemo } from "react"; import { Box, TextField, IconButton, InputAdornment, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Checkbox, Paper, MenuItem, InputLabel, Select, FormControl, SelectChangeEvent, } from "@mui/material"; import { debounce } from "@mui/material/utils"; import SearchIcon from "@mui/icons-material/Search"; import OpenInNewIcon from "@mui/icons-material/OpenInNew"; import AddIcon from "@mui/icons-material/Add"; import { useRouter, useSearchParams } from "next/navigation"; import StatusChangeDialog from "../../DataTable/StatusChangeDialog"; import { HistoryModal } from "@/app/components/HistoryModal/HistoryModal"; import { getTransactionsHistory } from "@/app/services/transactionsHistory"; export interface TableColumn { field: keyof T | string; headerName: string; render?: (value: unknown, row: T) => React.ReactNode; } interface MenuItemOption { value: string; label?: string; } interface DynamicTableProps { data: { rows: T[]; columns: TableColumn[]; actions: MenuItemOption[]; }; searchParamKey?: string; } interface Transaction { date: string; method: string; amount: number | string; status: string; } export function ApproveTable({ data, searchParamKey = "merchantId", }: DynamicTableProps) { const { rows, columns, actions } = data; const router = useRouter(); const searchParams = useSearchParams(); const [selected, setSelected] = useState<(string | number)[]>([]); const [search, setSearch] = useState(""); const [modalOpen, setModalOpen] = useState(false); const [historyModal, setHistoryModal] = useState(false); const [reason, setReason] = useState(""); const [action, setAction] = useState(""); const [transactionsHistoryResponse, setTransactionsHistoryResponse] = useState<{ deposits: Transaction[]; withdrawals: Transaction[]; }>({ deposits: [], withdrawals: [], }); useEffect(() => { const urlValue = searchParams.get(searchParamKey) ?? ""; setSearch(urlValue); }, [searchParams, searchParamKey]); const updateURL = useMemo( () => debounce((value: string) => { const params = new URLSearchParams(searchParams.toString()); if (value) params.set(searchParamKey, value); else params.delete(searchParamKey); router.replace(`?${params.toString()}`, { scroll: false }); }, 400), [router, searchParams, searchParamKey], ); const handleSearchChange = (e: React.ChangeEvent) => { const value = e.target.value; setSearch(value); updateURL(value); }; const handleCheckboxChange = (id: string | number, checked: boolean) => { setSelected((prev) => checked ? [...prev, id] : prev.filter((x) => x !== id), ); }; const handleToggleAll = (checked: boolean) => { setSelected(checked ? rows.map((r) => r.id) : []); }; const handleActionChange = (e: SelectChangeEvent) => { const selectedAction = e.target.value; setAction(selectedAction); if (selected.length > 0) { setModalOpen(true); console.log("Selected Ids", selected); console.log("Selected Action:", selectedAction); } else { alert("No rows selected for this action!"); } }; const handleStatusSave = () => { console.log( `Status changed for row with ID ${selected}. New status: ${action}. Reason: ${reason}`, ); setModalOpen(false); setReason(""); }; // NEW: plus button handler const handlePlusClick = async (row: T) => { console.log("Plus clicked for", row); const params = `userId=${row.id}`; const response = await getTransactionsHistory({ query: params }); setTransactionsHistoryResponse(response); setHistoryModal(true); }; const stickySecondColLeft = 48; return ( <> ), }} /> Action {/* sticky select-all checkbox */} 0} indeterminate={ selected.length > 0 && selected.length < rows.length } onChange={(e) => handleToggleAll(e.target.checked)} /> {/* NEW: sticky plus column header (empty) */} {columns.map((col, i) => ( {col.headerName} ))} {rows.map((row, idx) => ( {/* sticky checkbox per-row */} handleCheckboxChange(row.id, e.target.checked) } /> {/* NEW: sticky plus button cell */} handlePlusClick(row)} sx={{ p: 0.5 }} aria-label="expand" > {columns.map((col, colIdx) => { const value = row[col.field as keyof T]; if (col.field === "id") { return ( {value as React.ReactNode} ); } return ( {value as React.ReactNode} ); })} ))}
setModalOpen(false)} handleSave={handleStatusSave} /> { setTransactionsHistoryResponse({ deposits: [], withdrawals: [] }); setHistoryModal(false); }} deposits={transactionsHistoryResponse.deposits} withdrawals={transactionsHistoryResponse.withdrawals} /> ); }