"use client"; import React, { CSSProperties, DetailedHTMLProps, HTMLAttributes, 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"; import { Collapse, Typography } from "@mui/material"; import BomMaterialTable from "./BomMaterialTable"; import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; import { decimalFormatter, integerFormatter } from "@/app/utils/formatUtil"; import PlayCircleOutlineIcon from "@mui/icons-material/PlayCircleOutline"; import { useTranslation } from "react-i18next"; import { DetailedProdScheduleLineResult, RoughProdScheduleLineBomMaterialResult, RoughProdScheduleLineResultByFg, RoughProdScheduleResult, ScheduleType, } from "@/app/api/scheduling"; import { defaultPagingController } from "../SearchResults/SearchResults"; export interface ResultWithId { id: string | number; // id: number; } interface BaseColumn { field: keyof T; label: string; type: string; options?: T[]; renderCell?: (params: T) => React.ReactNode; style?: Partial & { [propName: string]: string; } & CSSProperties; } interface ColumnWithAction extends BaseColumn { onClick: (item: T) => void; buttonIcon: React.ReactNode; buttonColor?: "inherit" | "default" | "primary" | "secondary"; } export type Column = | BaseColumn | ColumnWithAction; interface Props { index?: number; items: T[]; columns: Column[]; noWrapper?: boolean; setPagingController?: (value: { pageNum: number; pageSize: number; totalCount: number; index?: number; }) => void; pagingController?: { pageNum: number; pageSize: number; totalCount: number }; isAutoPaging: boolean; isEdit: boolean; isEditable: boolean; hasCollapse: boolean; type: ScheduleType; } function ScheduleTable({ type, index = 7, items, columns, noWrapper, pagingController = undefined, setPagingController = undefined, isAutoPaging = true, isEdit = false, isEditable = true, hasCollapse = false, }: Props) { const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(10); const [editingRowId, setEditingRowId] = useState(null); const [editedItems, setEditedItems] = useState(items); const { t } = useTranslation("schedule"); useEffect(() => { setEditedItems(items); }, [items]); const handleChangePage = (_event: unknown, newPage: number) => { setPage(newPage); if (setPagingController && pagingController) { setPagingController({ ...pagingController, pageNum: newPage + 1, index: index ?? -1, }); } }; const handleChangeRowsPerPage = ( event: React.ChangeEvent, ) => { setRowsPerPage(+event.target.value); setPage(0); if (setPagingController && pagingController) { setPagingController({ ...pagingController, pageSize: +event.target.value, pageNum: 1, index: index, }); } }; 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)); }; useEffect(() => { console.log("[debug] isEdit in table", isEdit); //TODO: switch all record to not in edit mode and save the changes if (!isEdit) { editedItems?.forEach((item) => { // Call save logic here // console.log("Saving item:", item); // Reset editing state if needed }); setEditingRowId(null); } }, [isEdit]); function isRoughType(type: ScheduleType): type is "rough" { return type === "rough"; } function isDetailedType(type: ScheduleType): type is "detailed" { return type === "detailed"; } function Row(props: { row: T }) { const { row } = props; const [open, setOpen] = useState(false); // console.log(row) return ( <> {isDetailedType(type) && ( )} {(isEditable || hasCollapse) && ( {editingRowId === row.id ? ( <> {isDetailedType(type) && isEditable && ( handleSaveClick(row)} > )} {isDetailedType(type) && isEditable && ( setEditingRowId(null)} > )} {hasCollapse && ( setOpen(!open)} > {open ? ( ) : ( )} {t("View BoM")} )} ) : ( <> {isDetailedType(type) && isEditable && ( handleEditClick(row.id as number)} > )} {isDetailedType(type) && isEditable && ( handleDeleteClick(row.id as number)} > )} {hasCollapse && ( setOpen(!open)} > {open ? ( ) : ( )} {t("View BoM")} )} )} )} {columns.map((column, idx) => { const columnName = column.field; return ( {editingRowId === row.id ? ( (() => { switch (column.type) { case "input": return ( handleInputChange( row.id as number, columnName, e.target.value, ) } /> ); // case 'multi-select': // //TODO: May need update if use // return ( // handleInputChange(row.id as number, columnName, selectedValues)} // /> // ); case "read-only": return {row[columnName] as string}; default: return null; // Handle any default case if needed } })() ) : column.renderCell ? (
{column.renderCell(row)}
) : (
isEdit && handleEditClick(row.id as number) } > {row[columnName] as string}
)}
); })}
{hasCollapse && (
)}
); } const table = ( <> {isDetailedType(type) && {t("Release")}} {(isEditable || hasCollapse) && ( {t("Actions")} )}{" "} {/* Action Column Header */} {columns.map((column, idx) => ( {column.label} ))} {/* {(isAutoPaging ? editedItems.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) : editedItems).map((item) => ( */} {editedItems ?.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) ?.map((item) => )}
); return noWrapper ? table : {table}; } export default ScheduleTable;