// material-ui
import * as React from 'react';
import {
DataGrid,
GridActionsCellItem,
GridRowModes,
GridRowEditStopReasons,
} from "@mui/x-data-grid";
import EditIcon from '@mui/icons-material/Edit';
import DeleteIcon from '@mui/icons-material/Delete';
import SaveIcon from '@mui/icons-material/Save';
import CancelIcon from '@mui/icons-material/Cancel';
import {useContext, useEffect} from "react";
import {CustomNoRowsOverlay, dateComparator, getDateString} from "../../../utils/CommonFunction";
import AbilityContext from "../../../components/AbilityProvider";
import {LIONER_BUTTON_THEME} from "../../../themes/colorConst";
import {ThemeProvider} from "@emotion/react";
import axios from "axios"; // Add this
import {apiPath} from "../../../auth/utils"; // Add this (same as in index.js)
// ==============================|| Consultant TABLE ||============================== //
export default function ConsultantTable({recordList, applySearch}) {
const [rows, setRows] = React.useState([]);
const [rowModesModel, setRowModesModel] = React.useState({});
const ability = useContext(AbilityContext);
const [paginationModel, setPaginationModel] = React.useState({
page: 0,
pageSize: 10
});
useEffect(() => {
setPaginationModel({page: 0, pageSize: 10});
// Ensure each row has a unique 'id' field (required by DataGrid)
setRows(recordList.map(row => ({ ...row, id: row.id || row.someUniqueKey })));
}, [recordList]);
const handleRowEditStop = (params, event) => {
if (params.reason === GridRowEditStopReasons.rowFocusOut) {
event.defaultMuiPrevented = true;
}
};
const handleEditClick = (id) => () => {
setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.Edit } });
};
const handleSaveClick = (id) => () => {
setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.View } });
};
const handleCancelClick = (id) => () => {
setRowModesModel({
...rowModesModel,
[id]: { mode: GridRowModes.View, ignoreModifications: true },
});
};
const handleDeleteClick = (id) => async () => {
if (window.confirm("Are you sure you want to delete this consultant? This action cannot be undone.")) {
try {
const response = await axios.post(`${apiPath}/consultant/delete`, { id });
if (response.status === 200 || response.status === 204) {
applySearch(); // Refresh the table
}
} catch (err) {
console.error("Delete error:", err);
alert("Failed to delete consultant. Please try again.");
}
}
};
const processRowUpdate = async (newRow) => {
// Optimistically update UI
const updatedRow = { ...newRow };
try {
const response = await axios.post(`${apiPath}/consultant/save`, newRow);
if (response.status === 200) {
// If backend returns updated data, use it
return response.data || updatedRow;
}
} catch (err) {
console.error("Save error:", err);
alert("Failed to save changes. Please try again.");
// On failure, you could revert, but here we keep the edited value
}
return updatedRow;
};
const columns = [
{
field: 'actions',
type: 'actions',
headerName: 'Actions',
width: 150,
getActions: ({ id }) => {
const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit;
if (isInEditMode) {
return [