"use client"; import Grid from "@mui/material/Grid"; import Paper from "@mui/material/Paper"; import { useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; import PageTitle from "../PageTitle/PageTitle"; import { Suspense } from "react"; import Button from "@mui/material/Button"; import Stack from "@mui/material/Stack"; import Link from "next/link"; import { t } from "i18next"; import { Box, Container, Modal, Select, SelectChangeEvent, Typography, } from "@mui/material"; import { Close } from "@mui/icons-material"; import AddIcon from "@mui/icons-material/Add"; 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 ArrowForwardIcon from "@mui/icons-material/ArrowForward"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import Swal from "sweetalert2"; import { msg } from "../Swal/CustomAlerts"; import React from "react"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { GridRowsProp, GridRowModesModel, GridRowModes, DataGrid, GridColDef, GridToolbarContainer, GridFooterContainer, GridActionsCellItem, GridEventListener, GridRowId, GridRowModel, GridRowEditStopReasons, GridEditInputCell, GridValueSetterParams, } from "@mui/x-data-grid"; import { LocalizationProvider } from "@mui/x-date-pickers"; import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import dayjs from "dayjs"; import { Props } from "react-intl/src/components/relative"; const weekdays = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]; interface BottomBarProps { getHoursTotal: (column: string) => number; setLockConfirm: (newLock: (oldLock: boolean) => boolean) => void; setRows: (newRows: (oldRows: GridRowsProp) => GridRowsProp) => void; setRowModesModel: ( newModel: (oldModel: GridRowModesModel) => GridRowModesModel, ) => void; } interface EditToolbarProps { // setDay: (newDay : dayjs.Dayjs) => void; setDay: (newDay: (oldDay: dayjs.Dayjs) => dayjs.Dayjs) => void; setRows: (newRows: (oldRows: GridRowsProp) => GridRowsProp) => void; setRowModesModel: ( newModel: (oldModel: GridRowModesModel) => GridRowModesModel, ) => void; } interface EditFooterProps { setRows: (newRows: (oldRows: GridRowsProp) => GridRowsProp) => void; setRowModesModel: ( newModel: (oldModel: GridRowModesModel) => GridRowModesModel, ) => void; } const EditToolbar = (props: EditToolbarProps) => { const { setDay } = props; const [selectedDate, setSelectedDate] = useState(dayjs()); const handleClickLeft = () => { if (selectedDate) { const newDate = selectedDate.add(-7, "day"); setSelectedDate(newDate); } }; const handleClickRight = () => { if (selectedDate) { const newDate = selectedDate.add(7, "day") > dayjs() ? dayjs() : selectedDate.add(7, "day"); setSelectedDate(newDate); } }; const handleDateChange = (date: dayjs.Dayjs | Date | null) => { const newDate = dayjs(date); setSelectedDate(newDate); }; useEffect(() => { setDay((oldDay) => selectedDate); }, [selectedDate]); return (
Timesheet Input
); }; const BottomBar = (props: BottomBarProps) => { const { setRows, setRowModesModel, getHoursTotal, setLockConfirm } = props; // const getHoursTotal = props.getHoursTotal; const [newId, setNewId] = useState(-1); const [invalidDays, setInvalidDays] = useState(0); const handleAddClick = () => { const id = newId; setNewId(newId - 1); setRows((oldRows) => [ ...oldRows, { id, projectCode: "", task: "", isNew: true }, ]); setRowModesModel((oldModel) => ({ ...oldModel, [id]: { mode: GridRowModes.Edit, fieldToFocus: "projectCode" }, })); }; const totalColDef = { flex: 1, // style: {color:getHoursTotal('mon')>24?"red":"black"} }; const TotalCell = ({ value }: Props) => { const [invalid, setInvalid] = useState(false); useEffect(() => { const newInvalid = (value ?? 0) > 24; setInvalid(newInvalid); }, [value]); return ( {value} ); }; const checkUnlockConfirmBtn = () => { // setLockConfirm((oldLock)=> valid); setLockConfirm((oldLock) => weekdays.every((weekday) => { getHoursTotal(weekday) <= 24; }), ); }; return (
Total:
); }; const EditFooter = (props: EditFooterProps) => { return (
Total: ssss
); }; interface TimesheetInputGridProps { setLockConfirm: (newLock: (oldLock: boolean) => boolean) => void; onClose?: () => void; } const initialRows: GridRowsProp = [ { id: 1, projectCode: "M1001", task: "1.2", mon: 2.5, }, { id: 2, projectCode: "M1002", task: "1.3", mon: 3.25, }, ]; const options = ["M1001", "M1301", "M1354", "M1973"]; const options2 = [ "1.1 - Preparation of preliminary Cost Estimate / Cost Plan", "1.2 - Cash flow forecast", "1.3 - Cost studies fo alterative design solutions", "1.4 = Attend design co-ordination / project review meetings", "1.5 - Prepare / Review RIC", ]; const getDateForHeader = (date: dayjs.Dayjs, weekday: number) => { if (date.day() == 0) { return date.add(weekday - date.day() - 7, "day").format("DD MMM"); } else { return date.add(weekday - date.day(), "day").format("DD MMM"); } }; const TimesheetInputGrid: React.FC = ({ ...props }) => { const [rows, setRows] = useState(initialRows); const [day, setDay] = useState(dayjs()); const [rowModesModel, setRowModesModel] = React.useState( {}, ); const { setLockConfirm } = props; const handleRowEditStop: GridEventListener<"rowEditStop"> = ( params, event, ) => { if (params.reason === GridRowEditStopReasons.rowFocusOut) { event.defaultMuiPrevented = true; } }; const handleEditClick = (id: GridRowId) => () => { setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.Edit } }); }; const handleSaveClick = (id: GridRowId) => () => { setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.View } }); }; const handleDeleteClick = (id: GridRowId) => () => { setRows(rows.filter((row) => row.id !== id)); }; const handleCancelClick = (id: GridRowId) => () => { 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)); } }; const processRowUpdate = (newRow: GridRowModel) => { const updatedRow = { ...newRow, isNew: false }; setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); return updatedRow; }; const handleRowModesModelChange = (newRowModesModel: GridRowModesModel) => { setRowModesModel(newRowModesModel); }; const getHoursTotal = (column: any) => { let sum = 0; rows.forEach((row) => { sum += row[column] ?? 0; }); return sum; }; const weekdayColConfig: any = { type: "number", // sortable: false, //width: 100, flex: 1, align: "left", headerAlign: "left", editable: true, renderEditCell: (value: any) => ( ), }; const columns: GridColDef[] = [ { field: "actions", type: "actions", headerName: "Actions", width: 100, cellClassName: "actions", getActions: ({ id }) => { const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; if (isInEditMode) { return [ } title="Save" label="Save" sx={{ color: "primary.main", }} onClick={handleSaveClick(id)} />, } title="Cancel" label="Cancel" className="textPrimary" onClick={handleCancelClick(id)} color="inherit" />, ]; } return [ } title="Edit" label="Edit" className="textPrimary" onClick={handleEditClick(id)} color="inherit" />, } onClick={handleDeleteClick(id)} sx={{ color: "red" }} />, ]; }, }, { field: "projectCode", headerName: "Project Code", // width: 220, flex: 2, editable: true, type: "singleSelect", valueOptions: options, }, { field: "task", headerName: "Task", // width: 220, flex: 3, editable: true, type: "singleSelect", valueOptions: options2, }, { // Mon field: "mon", ...weekdayColConfig, renderHeader: () => { return
Mon - {getDateForHeader(day, 1)}
; }, }, { // Tue field: "tue", ...weekdayColConfig, renderHeader: () => { return
Tue - {getDateForHeader(day, 2)}
; }, }, { // Wed field: "wed", ...weekdayColConfig, renderHeader: () => { return
Wed - {getDateForHeader(day, 3)}
; }, }, { // Thu field: "thu", ...weekdayColConfig, renderHeader: () => { return
Thu - {getDateForHeader(day, 4)}
; }, }, { // Fri field: "fri", ...weekdayColConfig, renderHeader: () => { return
Fri - {getDateForHeader(day, 5)}
; }, }, { // Sat field: "sat", ...weekdayColConfig, renderHeader: () => { return
Sat - {getDateForHeader(day, 6)}
; }, }, { // Sun field: "sun", ...weekdayColConfig, renderHeader: () => { return (
Sun - {getDateForHeader(day, 7)}
); }, }, // { // field: 'joinDate', // headerName: 'Join date', // type: 'date', // width: 180, // editable: true, // }, ]; return ( ); }; export default TimesheetInputGrid;