import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { Modal, Box, Typography, Button, TextField, FormControl, InputLabel, Select, MenuItem, Paper, SxProps } from '@mui/material'; import { useForm, Controller, useFormContext } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { INPUT_DATE_FORMAT, OUTPUT_DATE_FORMAT } from '@/app/utils/formatUtil'; import dayjs from 'dayjs'; import { DatePicker } from '@mui/x-date-pickers'; import { DataGrid, GridEventListener, GridRowEditStopParams, GridRowEditStopReasons, GridRowModel, GridRowModes, GridRowModesModel, GridToolbarContainer } from '@mui/x-data-grid'; import StyledDataGrid from '../StyledDataGrid'; import AddIcon from '@mui/icons-material/Add'; import SaveIcon from '@mui/icons-material/Save'; import DeleteIcon from '@mui/icons-material/Delete'; import CancelIcon from '@mui/icons-material/Cancel'; import EditIcon from '@mui/icons-material/Edit'; import { GridActionsCellItem } from '@mui/x-data-grid'; interface SalaryEffectiveModelProps { open: boolean; onClose: () => void; modalSx?: SxProps; columns: any[] } const modalSx: SxProps = { position: "absolute", top: "50%", left: "50%", transform: "translate(-50%, -50%)", width: "90%", maxWidth: "auto", maxHeight: "auto", padding: 3, display: "flex", flexDirection: "column", gap: 2, }; function EditToolbar(props: React.JSXElementConstructor | null | undefined | any) { // const intl = useIntl(); // const addRecordBtn = intl.formatMessage({ id: 'add' }); const { count, setCount, setRows, setRowModesModel, _columns } = props; let obj: { [key: string]: string } = {}; for (let i = 0; i < _columns.length - 1; i++) { obj[_columns[i].field as string] = ''; } const handleClick = React.useCallback(() => { const id = Math.random(); setRows((oldRows: any) => [...oldRows, { id, ...obj, isNew: true }]); setRowModesModel((oldModel: any) => ({ ...oldModel, [id]: { mode: GridRowModes.Edit, // fieldToFocus: 'material' } })); setCount((prev: number) => prev+1) }, [count, setCount, setRowModesModel, setRows]) return ( {/* */} ); } const SalaryEffectiveModel: React.FC = ({ open, onClose, modalSx: mSx, columns }) => { const { t } = useTranslation(); const { control, register, formState, trigger, watch, setValue, getValues } = useFormContext(); const [rowModesModel, setRowModesModel] = useState({}); const [count, setCount] = useState(0); const [_rows, setRows] = useState(() => { const list = getValues('salaryEffectiveInfo') console.log(list) return list && list.length > 0 ? list : [] }); const formValues = watch(); // This line of code is using the watch function from react-hook-form to get the current values of the form fields. const handleClose = () => { onClose(); }; // const handleSave = async () => { // const isValid = await trigger(); // // if (isValid) { // // onSave(); // // onClose(); // // } // }; const handleRowEditStop: GridEventListener<"rowEditStop"> = ( params, event, ) => { if (params.reason === GridRowEditStopReasons.rowFocusOut) { event.defaultMuiPrevented = true; } }; const processRowUpdate = // useCallback( (newRow: GridRowModel) => { console.log(newRow) const updatedRow = { ...newRow, updated: true }; console.log(_rows) if (_rows.length != 0) { setRows((prev: any[]) => prev?.map((row: any) => (row.id === newRow.id ? updatedRow : row))); } return updatedRow; } // , [_rows, setValue, setRows]) useEffect(()=> { console.log(_rows) setValue('salaryEffectiveInfo', _rows) }, [_rows]) const handleSaveClick = useCallback( (id: any) => () => { setRowModesModel((prevRowModesModel) => ({ ...prevRowModesModel, [id]: { mode: GridRowModes.View } })); }, [setRowModesModel] ); const handleCancelClick = useCallback( (id: any) => () => { setRowModesModel((prevRowModesModel) => ({ ...prevRowModesModel, [id]: { mode: GridRowModes.View, ignoreModifications: true } })); }, [setRowModesModel] ); const handleEditClick = useCallback( (id: any) => () => { setRowModesModel((prevRowModesModel) => ({ ...prevRowModesModel, [id]: { mode: GridRowModes.Edit } })); }, [setRowModesModel] ); const handleDeleteClick = useCallback( (id: any) => () => { setRows((prevRows: any) => prevRows.filter((row: any) => row.id !== id)); setCount((prev: number) => prev - 1) }, [setRows, setCount] ); const defaultCol = useMemo( () => ( { field: 'actions', type: 'actions', headerName: 'edit', width: 100, cellClassName: 'actions', getActions: ({ id }: { id: number }) => { const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; if (isInEditMode) { return [ } label="Save" key="edit" sx={{ color: 'primary.main' }} onClick={handleSaveClick(id)} />, } label="Cancel" key="edit" onClick={handleCancelClick(id)} /> ]; } return [ } label="Edit" className="textPrimary" onClick={handleEditClick(id)} color="inherit" key="edit" />, } label="Delete" sx={{ color: 'error.main' }} onClick={handleDeleteClick(id)} color="inherit" key="edit" /> ]; } } ), [rowModesModel, handleSaveClick, handleCancelClick, handleEditClick, handleDeleteClick] ) let _columns: any[] = [] if (columns) { _columns = [...columns, defaultCol] } useEffect(() => { console.log(formValues) }, [open]) return ( {t('Salary Effective Date Change')} {/* */} ); }; export default SalaryEffectiveModel;