import { LeaveType } from "@/app/api/timesheets"; import { LeaveEntry } from "@/app/api/timesheets/actions"; import { DAILY_NORMAL_MAX_HOURS, TIMESHEET_DAILY_MAX_HOURS, } from "@/app/api/timesheets/utils"; import { shortDateFormatter } from "@/app/utils/formatUtil"; import { roundToNearestQuarter } from "@/app/utils/manhourUtils"; import { Check, Delete, Close } from "@mui/icons-material"; import { Box, Button, FormControl, InputLabel, MenuItem, Modal, ModalProps, Paper, Select, SxProps, TextField, Typography, } from "@mui/material"; import React, { useCallback, useEffect } from "react"; import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; export interface Props extends Omit { onSave: (leaveEntry: LeaveEntry, recordDate?: string) => Promise; onDelete?: () => Promise; leaveTypes: LeaveType[]; defaultValues?: Partial; modalSx?: SxProps; recordDate?: string; isHoliday?: boolean; } const modalSx: SxProps = { position: "absolute", top: "50%", left: "50%", transform: "translate(-50%, -50%)", width: "90%", maxHeight: "90%", padding: 3, display: "flex", flexDirection: "column", gap: 2, }; const LeaveEditModal: React.FC = ({ onSave, onDelete, open, onClose, leaveTypes, defaultValues, recordDate, modalSx: mSx, isHoliday, }) => { const { t, i18n: { language }, } = useTranslation("home"); const { register, control, reset, getValues, trigger, formState, setError } = useForm({ defaultValues: { leaveTypeId: leaveTypes[0].id, }, }); useEffect(() => { reset(defaultValues ?? { leaveTypeId: leaveTypes[0].id, id: Date.now() }); }, [defaultValues, leaveTypes, reset]); const saveHandler = useCallback(async () => { const valid = await trigger(); if (valid) { try { await onSave(getValues(), recordDate); reset({ id: Date.now() }); } catch (e) { setError("root", { message: e instanceof Error ? e.message : "Unknown error", }); } } }, [getValues, onSave, recordDate, reset, setError, trigger]); const closeHandler = useCallback>( (...args) => { onClose?.(...args); reset({ id: Date.now() }); }, [onClose, reset], ); return ( {recordDate && ( {shortDateFormatter(language).format(new Date(recordDate))} )} {t("Leave Types")} ( )} /> roundToNearestQuarter(parseFloat(value)), validate: (value) => { if (isHoliday) { return t("Cannot input normal hours on holidays"); } return ( (0 < value && value <= DAILY_NORMAL_MAX_HOURS) || t( "Input hours should be between 0 and {{DAILY_NORMAL_MAX_HOURS}}", { DAILY_NORMAL_MAX_HOURS }, ) ); }, })} error={Boolean(formState.errors.inputHours)} helperText={formState.errors.inputHours?.message} /> {formState.errors.root?.message && ( {t(formState.errors.root.message, { DAILY_NORMAL_MAX_HOURS, TIMESHEET_DAILY_MAX_HOURS, })} )} {onDelete && ( )} ); }; export default LeaveEditModal;