// material-ui import * as React from 'react'; import { Button, } from '@mui/material'; import { DataGrid, GridActionsCellItem, GridRowEditStopReasons, GridRowModes, GridToolbarContainer } from "@mui/x-data-grid"; import EditIcon from '@mui/icons-material/Edit'; import DeleteIcon from '@mui/icons-material/DeleteOutlined'; import SaveIcon from '@mui/icons-material/Save'; import CancelIcon from '@mui/icons-material/Close'; import AddIcon from '@mui/icons-material/Add'; import {useContext, useEffect} from "react"; import axios from "axios"; import {apiPath} from "../../auth/utils"; import { CHECK_CATEGORY_DUPLICATE, GET_CATEGORY_LIST, UPDATE_CATEGORY_PATH, } from "../../utils/ApiPathConst"; import { CustomNoRowsOverlay, GeneralConfirmWindow, notifyDeleteError, notifyDeleteSuccess, notifySaveSuccess, removeObjectWithId } from "../../utils/CommonFunction"; import UploadContext from "../../components/UploadProvider"; import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; import {ThemeProvider} from "@emotion/react"; let customerCount = -1; function EditToolbar(props) { const {setRows, setRowModesModel} = props; const handleClick = (id) => { setRows((oldRows) => [ { id, isNew:true } ,...oldRows ]); setRowModesModel((oldModel) => ({ ...oldModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}, })); }; return ( ); } // ==============================|| CATEGORY TABLE ||============================== // export default function CategoryTable({recordList}) { const [rows, setRows] = React.useState([]); const [rowModesModel, setRowModesModel] = React.useState({}); const { setIsUploading } = useContext(UploadContext); // ==============================|| DELETE WINDOW RELATED ||============================== // const [isWindowOpen, setIsWindowOpen] = React.useState(false); const [selectedId, setSelectedId] = React.useState(null); const handleClose = () => { setIsWindowOpen(false); }; const [paginationModel, setPaginationModel] = React.useState({ page: 0, pageSize:10 }); useEffect(() => { setPaginationModel({page:0,pageSize:10}); setRows(recordList); }, [recordList]); const handleDeleteClick = (id) => () => { setIsWindowOpen(true); setSelectedId(id); }; function updateData(){ setIsUploading(true); axios.delete(`${apiPath}${GET_CATEGORY_LIST}/${selectedId}`, ) .then((response) => { if (response.status === 204) { notifyDeleteSuccess(); const newList =removeObjectWithId(rows,selectedId); setIsWindowOpen(false); setRows(newList); } setIsUploading(false); }) .catch(error => { console.log(error); setIsUploading(false); return false; }); } // ==============================|| DELETE WINDOW RELATED ||============================== // useEffect(()=>{ setRows(recordList); },[recordList]); const handleRowEditStop = (params, event) => { if (params.reason === GridRowEditStopReasons.rowFocusOut) { event.defaultMuiPrevented = true; } }; const handleEditClick = (id) => () => { setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}}); }; const handleSaveClick = (id) => () => { setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); }; const handleCancelClick = (id) => () => { setRowModesModel({ ...rowModesModel, [id]: {mode: GridRowModes.View, ignoreModifications: true}, }); const editedRow = rows.find((row) => row.id === id); if (editedRow.isNew) { setRows(rows.filter((row) => row.id !== id)); } }; function updateCategory(data) { if(data.name.trim().length === 0){ notifyDeleteError(`Name cannot be null`); handleEditClick(data.id); } else{ axios.get(`${apiPath}${CHECK_CATEGORY_DUPLICATE}`, { params: { "name": data.name.trim(), "categoryId": data.id }, }) .then((response) => { if (response.status === 200) { if(response.data.isTaken){ notifyDeleteError(`${data.name} already exists.`) handleEditClick(data.id); } else if(!response.data.isTaken){ processUpload(data); } } }) .catch(error => { console.log(error); return true; }); } } function processUpload(data){ setIsUploading(true); axios.post(`${apiPath}${UPDATE_CATEGORY_PATH}`, { "id": data.id, "name": data.name.trim(), "description": data.description, }, ) .then((response) => { if (response.status === 200) { const updatedRow = { ...data }; updatedRow.id = response.data.id; setIsUploading(false); if(data.id === -1){ setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); } else{ setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); } notifySaveSuccess(); } }) .catch(error => { console.log(error); setIsUploading(false); return false; }); } const processRowUpdate = (newRow) => { return new Promise((resolve, reject) => { const updatedRow = { ...newRow, isNew: false }; if (updatedRow.name.trim().length === 0) { const error = new Error('Name cannot be null'); reject(error); return; } setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); updateCategory(updatedRow); resolve(updatedRow); // Resolve the Promise with the updated row }); }; const handleRowModesModelChange = (newRowModesModel) => { setRowModesModel(newRowModesModel); }; const columns = [ { field: 'actions', type: 'actions', headerName: 'Actions', width: 100, cellClassName: 'actions', getActions: ({id}) => { const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; if (isInEditMode) { return [ } label="Cancel" className="textPrimary" onClick={handleCancelClick(id)} color="error" /> , } label="Save" // sx={{ // color: 'primary.main', // }} color="save" onClick={handleSaveClick(id)} /> , ]; } return [ } label="Delete" onClick={handleDeleteClick(id)} color="delete" /> , } label="Edit" className="textPrimary" onClick={handleEditClick(id)} color="edit" /> , ]; }, }, { id: 'categoryName', field: 'name', headerName: 'Category Name', flex: 1, editable: true, preProcessEditCellProps: (params) => { if(params.props.value !== undefined){ const hasError = params.props.value.length > 50; if (hasError) { notifyDeleteError("Input has reached the length limit (50)"); } return { ...params.props, error: hasError }; } }, }, { id: 'categoryDescription', field: 'description', headerName: 'Category Description', flex: 1, editable: true, preProcessEditCellProps: (params) => { if(params.props.value !== undefined){ const hasError = params.props.value.length > 255; if (hasError) { notifyDeleteError("Input has reached the length limit (255)"); } return { ...params.props, error: hasError }; } }, }, ]; return (
{ console.log(error); notifyDeleteError(`Name cannot be null`); }} getRowHeight={() => 'auto'} processRowUpdate={processRowUpdate} paginationModel={paginationModel} onPaginationModelChange={setPaginationModel} slots={{ toolbar: EditToolbar, noRowsOverlay: () => ( CustomNoRowsOverlay() ) }} pageSizeOptions={[15]} slotProps={{ toolbar: {setRows, setRowModesModel}, }} autoHeight />
); }