"use client"; import { useState } from "react"; import { useSearchParams, useRouter } from "next/navigation"; import { Button, Dialog, DialogTitle, DialogContent, DialogActions, FormControl, Select, MenuItem, FormControlLabel, Checkbox, Stack, Paper, TextField, Box, IconButton, } from "@mui/material"; import FileUploadIcon from "@mui/icons-material/FileUpload"; import OpenInNewIcon from "@mui/icons-material/OpenInNew"; import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid"; import AdvancedSearch from "../AdvancedSearch/AdvancedSearch"; import SearchFilters from "@/app/components/searchFilter/SearchFilters"; import { exportData } from "@/app/utils/exportData"; import StatusChangeDialog from "./StatusChangeDialog"; import { IDataTable } from "./types"; interface IDataTableProps { data: IDataTable; } export type TWithId = { id: number }; const DataTable = ({ data, }: IDataTableProps) => { const { tableRows, tableColumns, tableSearchLabels, extraColumns } = data; const router = useRouter(); const searchParams = useSearchParams(); const [rows, setRows] = useState(tableRows); const [open, setOpen] = useState(false); const [fileType, setFileType] = useState<"csv" | "xls" | "xlsx">("csv"); const [onlyCurrentTable, setOnlyCurrentTable] = useState(false); const [modalOpen, setModalOpen] = useState(false); const [selectedRowId, setSelectedRowId] = useState(null); const [newStatus, setNewStatus] = useState(""); const [reason, setReason] = useState(""); const [showExtraColumns, setShowExtraColumns] = useState(false); const filters = Object.fromEntries(searchParams.entries()); const handleClickField = (field: string, value: string) => { const params = new URLSearchParams(searchParams.toString()); params.set(field, value); router.push(`?${params.toString()}`); router.refresh(); }; const handleStatusChange = (id: number, newStatus: string) => { setSelectedRowId(id); setNewStatus(newStatus); setModalOpen(true); }; const handleStatusSave = () => { console.log( `Status changed for row with ID ${selectedRowId}. New status: ${newStatus}. Reason: ${reason}` ); setRows( rows.map(row => row.id === selectedRowId ? { ...row, status: newStatus } : row ) ); setModalOpen(false); setReason(""); }; const getColumnsWithDropdown = (columns: TColumn[]): GridColDef[] => { return columns.map(col => { if (col.field === "status") { return { ...col, renderCell: (params: GridRenderCellParams) => { const value = params.value?.toLowerCase(); let bgColor = "#e0e0e0"; let textColor = "#000"; switch (value) { case "completed": bgColor = "#d0f0c0"; textColor = "#1b5e20"; break; case "pending": bgColor = "#fff4cc"; textColor = "#9e7700"; break; case "inprogress": bgColor = "#cce5ff"; textColor = "#004085"; break; case "error": bgColor = "#ffcdd2"; textColor = "#c62828"; break; } return ( {params.value} ); }, }; } if (col.field === "userId") { return { ...col, headerAlign: "center", align: "center", renderCell: (params: GridRenderCellParams) => ( e.stopPropagation()} // keep row click from firing when clicking inside > {params.value} e.stopPropagation()} > ), }; } if (col.field === "actions") { return { ...col, renderCell: (params: GridRenderCellParams) => { const row = tableRows.find(r => r.id === params.id) as { id: number; status?: string; options?: { value: string; label: string }[]; }; const options = row?.options; if (!options) return params.value; return ( ); }, }; } return col; }); }; let filteredColumns = tableColumns; if (extraColumns && extraColumns.length > 0) { filteredColumns = showExtraColumns ? tableColumns : tableColumns.filter(col => !extraColumns.includes(col.field)); } return ( console.log(`setSearchQuery(${e.target.value})`)} sx={{ width: 300 }} /> {extraColumns && extraColumns.length > 0 && ( )} { if (params.field !== "actions") { handleClickField(params.field, params.value as string); } }} /> setModalOpen(false)} handleSave={handleStatusSave} /> setOpen(false)}> Export Transactions setOnlyCurrentTable(e.target.checked)} /> } label="Only export current table" sx={{ mt: 2 }} /> ); }; export default DataTable;