| @@ -13,7 +13,7 @@ import { deleteInvoice, importIssuedInovice, importReceivedInovice, updateInvoic | |||||
| import { deleteDialog, errorDialogWithContent, successDialog } from "../Swal/CustomAlerts"; | import { deleteDialog, errorDialogWithContent, successDialog } from "../Swal/CustomAlerts"; | ||||
| import { invoiceList, issuedInvoiceList, issuedInvoiceSearchForm, receivedInvoiceList, receivedInvoiceSearchForm } from "@/app/api/invoices"; | import { invoiceList, issuedInvoiceList, issuedInvoiceSearchForm, receivedInvoiceList, receivedInvoiceSearchForm } from "@/app/api/invoices"; | ||||
| import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; | import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; | ||||
| import { GridCellParams, GridColDef, GridEventListener, GridRowId, GridRowModes, GridRowModesModel } from "@mui/x-data-grid"; | |||||
| import { GridCellParams, GridColDef, GridEventListener, GridRenderEditCellParams, GridRowId, GridRowModes, GridRowModesModel, GridValueFormatterParams } from "@mui/x-data-grid"; | |||||
| import { useGridApiRef } from "@mui/x-data-grid"; | import { useGridApiRef } from "@mui/x-data-grid"; | ||||
| import StyledDataGrid from "../StyledDataGrid"; | import StyledDataGrid from "../StyledDataGrid"; | ||||
| @@ -22,8 +22,11 @@ import CreateInvoiceModal from "./CreateInvoiceModal"; | |||||
| import { ProjectResult } from "@/app/api/projects"; | import { ProjectResult } from "@/app/api/projects"; | ||||
| import { IMPORT_INVOICE, IMPORT_RECEIPT } from "@/middleware"; | import { IMPORT_INVOICE, IMPORT_RECEIPT } from "@/middleware"; | ||||
| import InvoiceSearchLoading from "./InvoiceSearchLoading"; | import InvoiceSearchLoading from "./InvoiceSearchLoading"; | ||||
| import { NumberFormatValues, NumericFormat } from "react-number-format"; | |||||
| interface CustomMoneyComponentProps { | |||||
| params: GridRenderEditCellParams; | |||||
| } | |||||
| interface Props { | interface Props { | ||||
| invoices: invoiceList[]; | invoices: invoiceList[]; | ||||
| @@ -287,6 +290,48 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab | |||||
| // setSelectedRow([]); | // setSelectedRow([]); | ||||
| }; | }; | ||||
| // Money format : 000,000,000.00 | |||||
| const CustomMoneyFormat = useCallback((value: number) => { | |||||
| if (value) { | |||||
| return moneyFormatter.format(value); | |||||
| } else { | |||||
| return "" | |||||
| } | |||||
| }, []) | |||||
| const CustomMoneyComponent: React.FC<CustomMoneyComponentProps> = ({ params }) => { | |||||
| const { id, value, field } = params; | |||||
| const ref = React.useRef(); | |||||
| const handleValueChange = (newValue: NumberFormatValues) => { | |||||
| apiRef.current.setEditCellValue({ id, field, value: newValue.value }); | |||||
| }; | |||||
| return <NumericFormat | |||||
| fullWidth | |||||
| prefix="HK$" | |||||
| onValueChange={(values) => { | |||||
| console.log(values) | |||||
| handleValueChange(values) | |||||
| }} | |||||
| customInput={TextField} | |||||
| thousandSeparator | |||||
| valueIsNumericString | |||||
| decimalScale={2} | |||||
| fixedDecimalScale | |||||
| value={value} | |||||
| inputRef={ref} | |||||
| InputProps={{ | |||||
| sx: { | |||||
| '& .MuiInputBase-input': { | |||||
| textAlign: 'right', | |||||
| mb: 2 | |||||
| } | |||||
| } | |||||
| }} | |||||
| />; | |||||
| } | |||||
| const combinedColumns = useMemo<Column<invoiceList>[]>( | const combinedColumns = useMemo<Column<invoiceList>[]>( | ||||
| () => [ | () => [ | ||||
| { | { | ||||
| @@ -329,7 +374,13 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab | |||||
| headerName: t("Amount (HKD)"), | headerName: t("Amount (HKD)"), | ||||
| editable: true, | editable: true, | ||||
| flex: 0.5, | flex: 0.5, | ||||
| type: 'number' | |||||
| type: 'number', | |||||
| renderEditCell: (params: GridRenderEditCellParams) => { | |||||
| return <CustomMoneyComponent params={params} /> | |||||
| }, | |||||
| valueFormatter: (params: GridValueFormatterParams) => { | |||||
| return CustomMoneyFormat(params.value as number) | |||||
| } | |||||
| }, | }, | ||||
| { | { | ||||
| field: "receiptDate", | field: "receiptDate", | ||||
| @@ -351,7 +402,13 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab | |||||
| headerName: t("Actual Received Amount (HKD)"), | headerName: t("Actual Received Amount (HKD)"), | ||||
| editable: true, | editable: true, | ||||
| flex: 0.5, | flex: 0.5, | ||||
| type: 'number' | |||||
| type: 'number', | |||||
| renderEditCell: (params: GridRenderEditCellParams) => { | |||||
| return <CustomMoneyComponent params={params} /> | |||||
| }, | |||||
| valueFormatter: (params: GridValueFormatterParams) => { | |||||
| return CustomMoneyFormat(params.value as number) | |||||
| } | |||||
| }, | }, | ||||
| ], | ], | ||||
| [t] | [t] | ||||