From 3c75a7e82e787aceb97103cee8dd769b8a39910e Mon Sep 17 00:00:00 2001 From: lenhanphung Date: Mon, 27 Oct 2025 16:33:47 +0700 Subject: [PATCH] feat: replace TextField with MUI DatePicker and TimePicker in DateTimeFields - Replace native HTML date/time inputs with MUI X Date Pickers components - Add DatePicker for start/end dates - Add TimePicker for start/end times --- .../Event/components/DateTimeFields.tsx | 221 ++++++++++-------- 1 file changed, 126 insertions(+), 95 deletions(-) diff --git a/src/components/Event/components/DateTimeFields.tsx b/src/components/Event/components/DateTimeFields.tsx index 818b0a8..955e8a0 100644 --- a/src/components/Event/components/DateTimeFields.tsx +++ b/src/components/Event/components/DateTimeFields.tsx @@ -1,5 +1,10 @@ import React from "react"; -import { Box, TextField, Typography } from "@mui/material"; +import { Box, Typography } from "@mui/material"; +import { DatePicker } from "@mui/x-date-pickers/DatePicker"; +import { TimePicker } from "@mui/x-date-pickers/TimePicker"; +import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; +import { AdapterMoment } from "@mui/x-date-pickers/AdapterMoment"; +import moment, { Moment } from "moment"; /** * Props for DateTimeFields component @@ -40,104 +45,130 @@ export const DateTimeFields: React.FC = ({ onEndTimeChange, }) => { return ( - - {/* First row: 4 fields */} - - {/* Start Date - 30% */} - - {showMore && ( - - Start Date - - )} - onStartDateChange(e.target.value)} - size="small" - margin="dense" - InputLabelProps={{ shrink: true }} - /> - + + + {/* First row: 4 fields */} + + {/* Start Date - 30% */} + + {showMore && ( + + Start Date + + )} + { + onStartDateChange(newValue?.format("YYYY-MM-DD") || ""); + }} + slotProps={{ + textField: { + size: "small", + margin: "dense" as const, + fullWidth: true, + InputLabelProps: { shrink: true }, + sx: { width: "100%" }, + }, + }} + /> + - {/* Start Time - 20% */} - - {showMore && ( - - Start Time - - )} - onStartTimeChange(e.target.value)} - disabled={allday} - size="small" - margin="dense" - InputLabelProps={{ shrink: true }} - /> - + {/* Start Time - 20% */} + + {showMore && ( + + Start Time + + )} + { + onStartTimeChange(newValue?.format("HH:mm") || ""); + }} + disabled={allday} + slotProps={{ + textField: { + size: "small", + margin: "dense" as const, + fullWidth: true, + InputLabelProps: { shrink: true }, + sx: { width: "100%" }, + }, + }} + /> + - {/* End Time - 20% */} - - {showMore && ( - - End Time - - )} - onEndTimeChange(e.target.value)} - disabled={allday} - error={!!validation.errors.dateTime} - size="small" - margin="dense" - InputLabelProps={{ shrink: true }} - /> - + {/* End Time - 20% */} + + {showMore && ( + + End Time + + )} + { + onEndTimeChange(newValue?.format("HH:mm") || ""); + }} + disabled={allday} + slotProps={{ + textField: { + size: "small", + margin: "dense" as const, + fullWidth: true, + InputLabelProps: { shrink: true }, + error: !!validation.errors.dateTime, + sx: { width: "100%" }, + }, + }} + /> + - {/* End Date - 30% */} - - {showMore && ( - - End Date - - )} - onEndDateChange(e.target.value)} - error={!!validation.errors.dateTime} - size="small" - margin="dense" - InputLabelProps={{ shrink: true }} - /> - - - - {/* Second row: Error message - 2 columns 50% each */} - {validation.errors.dateTime && ( - - {/* Empty left column - 50% */} - - - {/* Error message right column - 50% */} - - - {validation.errors.dateTime} - + {/* End Date - 30% */} + + {showMore && ( + + End Date + + )} + { + onEndDateChange(newValue?.format("YYYY-MM-DD") || ""); + }} + slotProps={{ + textField: { + size: "small", + margin: "dense" as const, + fullWidth: true, + InputLabelProps: { shrink: true }, + error: !!validation.errors.dateTime, + sx: { width: "100%" }, + }, + }} + /> - )} - + + {/* Second row: Error message - 2 columns 50% each */} + {validation.errors.dateTime && ( + + {/* Empty left column - 50% */} + + + {/* Error message right column - 50% */} + + + {validation.errors.dateTime} + + + + )} + + ); };