"use client"; import React, {useEffect, useState} from "react"; import Paper from "@mui/material/Paper"; import Table from "@mui/material/Table"; import TableBody from "@mui/material/TableBody"; import TableCell from "@mui/material/TableCell"; import TableContainer from "@mui/material/TableContainer"; import TableHead from "@mui/material/TableHead"; import TablePagination from "@mui/material/TablePagination"; import TableRow from "@mui/material/TableRow"; import IconButton from "@mui/material/IconButton"; import EditIcon from "@mui/icons-material/Edit"; import SaveIcon from "@mui/icons-material/Save"; import CancelIcon from "@mui/icons-material/Close"; import DeleteIcon from "@mui/icons-material/Delete"; import TextField from "@mui/material/TextField"; import MultiSelect from "@/components/SearchBox/MultiSelect"; export interface ResultWithId { id: string | number; } interface BaseColumn { name: keyof T; label: string; type: string; options: T[]; renderCell? : (T) => void; } interface ColumnWithAction extends BaseColumn { onClick: (item: T) => void; buttonIcon: React.ReactNode; buttonColor?: "inherit" | "default" | "primary" | "secondary"; } export type Column = | BaseColumn | ColumnWithAction; interface Props { items: T[], columns: Column[], noWrapper?: boolean, setPagingController: (value: { pageNum: number; pageSize: number; totalCount: number }) => void, pagingController: { pageNum: number; pageSize: number; totalCount: number }, isAutoPaging: boolean } function EditableSearchResults({ items, columns, noWrapper, pagingController, setPagingController, isAutoPaging = true, }: Props) { const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(10); const [editingRowId, setEditingRowId] = useState(null); const [editedItems, setEditedItems] = useState(items); useEffect(()=>{ setEditedItems(items) },[items]) const handleChangePage = (_event: unknown, newPage: number) => { setPage(newPage); setPagingController({ ...pagingController, pageNum: newPage + 1 }); }; const handleChangeRowsPerPage = (event: React.ChangeEvent) => { setRowsPerPage(+event.target.value); setPage(0); setPagingController({ ...pagingController, pageSize: +event.target.value, pageNum: 1 }); }; const handleEditClick = (id: number) => { setEditingRowId(id); }; const handleSaveClick = (item: T) => { setEditingRowId(null); // Call API or any save logic here setEditedItems((prev) => prev.map((row) => (row.id === item.id ? { ...row } : row)) ); }; const handleInputChange = (id: number, field: keyof T, value: string | number[]) => { setEditedItems((prev) => prev.map((item) => item.id === id ? { ...item, [field]: value } : item ) ); }; const handleDeleteClick = (id: number) => { // Implement delete logic here setEditedItems((prev) => prev.filter(item => item.id !== id)); }; const table = ( <> Actions {/* Action Column Header */} {columns.map((column, idx) => ( {column.label} ))} {(isAutoPaging ? editedItems.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) : editedItems).map((item) => ( {editingRowId === item.id ? ( <> handleSaveClick(item)}> setEditingRowId(null)}> ) : ( <> handleEditClick(item.id as number)}> handleDeleteClick(item.id as number)}> )} {columns.map((column, idx) => { const columnName = column.name; return ( {editingRowId === item.id ? ( (() => { switch (column.type) { case 'input': return ( handleInputChange(item.id as number, columnName, e.target.value)} /> ); case 'multi-select': return ( handleInputChange(item.id as number, columnName, selectedValues)} /> ); default: return null; // Handle any default case if needed } })() ) : ( column.renderCell ? column.renderCell(item) : handleEditClick(item.id as number)}> {item[columnName] as string} )} ); })} ))}
); return noWrapper ? table : {table}; } export default EditableSearchResults;