diff --git a/src/components/RoughScheduleSetting/RoughScheduleSetting.tsx b/src/components/RoughScheduleSetting/RoughScheduleSetting.tsx index c42b687..bb26b76 100644 --- a/src/components/RoughScheduleSetting/RoughScheduleSetting.tsx +++ b/src/components/RoughScheduleSetting/RoughScheduleSetting.tsx @@ -12,7 +12,8 @@ import axios from "axios"; import {BASE_API_URL, NEXT_PUBLIC_API_URL} from "@/config/api"; import { useTranslation } from "react-i18next"; import axiosInstance from "@/app/(main)/axios/axiosInstance"; -import Qs from 'qs'; // Make sure to import Qs +import Qs from 'qs'; +import EditableSearchResults from "@/components/SearchResults/EditableSearchResults"; // Make sure to import Qs type Props = { items: ItemsResult[]; @@ -77,12 +78,12 @@ const RSSOverview: React.FC = ({ items }) => { [t, items] ); - const onDetailClick = useCallback( - (item: ItemsResult) => { - router.push(`/settings/items/edit?id=${item.id}`); - }, - [router] - ); + // const onDetailClick = useCallback( + // (item: ItemsResult) => { + // router.push(`/settings/items/edit?id=${item.id}`); + // }, + // [router] + // ); const onDeleteClick = useCallback( (item: ItemsResult) => {}, @@ -91,26 +92,29 @@ const RSSOverview: React.FC = ({ items }) => { const columns = useMemo[]>( () => [ - { - name: "id", - label: t("Details"), - onClick: onDetailClick, - buttonIcon: , - }, + // { + // name: "id", + // label: t("Details"), + // onClick: ()=>{}, + // buttonIcon: , + // }, { name: "fgName", label: "Finished Goods Name", + type: 'input', }, { name: "excludeDate", label: t("Exclude Date"), + type: 'multi-select', + options: dayOptions, }, - { - name: "action", - label: t(""), - buttonIcon: , - onClick: onDeleteClick, - }, + // { + // name: "action", + // label: t(""), + // buttonIcon: , + // onClick: onDeleteClick, + // }, ], [filteredItems] ); @@ -171,7 +175,7 @@ const RSSOverview: React.FC = ({ items }) => { }} onReset={onReset} /> - + items={filteredItems} columns={columns} setPagingController={setPagingController} diff --git a/src/components/SearchResults/EditableSearchResults.tsx b/src/components/SearchResults/EditableSearchResults.tsx new file mode 100644 index 0000000..f3a5e8a --- /dev/null +++ b/src/components/SearchResults/EditableSearchResults.tsx @@ -0,0 +1,197 @@ +"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[]; +} + +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 + } + })() + ) : ( + handleEditClick(item.id as number)}> + {item[columnName] as string} + + )} + + ); + })} + + ))} + +
+
+ + + ); + + return noWrapper ? table : {table}; +} + +export default EditableSearchResults; \ No newline at end of file