feat(ui): update TimePicker behavior to hide icon and open on text click
This commit is contained in:
committed by
Benoit TELLIER
parent
3025672b49
commit
c885d18fb5
@@ -267,6 +267,20 @@ export const DateTimeFields: React.FC<DateTimeFieldsProps> = ({
|
|||||||
inputProps: { "data-testid": testId },
|
inputProps: { "data-testid": testId },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const [isStartTimeOpen, setIsStartTimeOpen] = React.useState(false);
|
||||||
|
const [isEndTimeOpen, setIsEndTimeOpen] = React.useState(false);
|
||||||
|
|
||||||
|
const handleTimeInputClick = (
|
||||||
|
event: React.MouseEvent,
|
||||||
|
setOpen: (open: boolean) => void
|
||||||
|
) => {
|
||||||
|
// Only open if clicking on the text (span)
|
||||||
|
// In MUI X v6+, the sections are rendered as spans
|
||||||
|
if ((event.target as HTMLElement).tagName === "SPAN") {
|
||||||
|
setOpen(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<LocalizationProvider
|
<LocalizationProvider
|
||||||
dateAdapter={AdapterDayjs}
|
dateAdapter={AdapterDayjs}
|
||||||
@@ -305,7 +319,22 @@ export const DateTimeFields: React.FC<DateTimeFieldsProps> = ({
|
|||||||
ampm={false}
|
ampm={false}
|
||||||
value={startTimeValue}
|
value={startTimeValue}
|
||||||
onChange={handleStartTimeChange}
|
onChange={handleStartTimeChange}
|
||||||
slotProps={getSlotProps("start-time-input")}
|
open={isStartTimeOpen}
|
||||||
|
onClose={() => setIsStartTimeOpen(false)}
|
||||||
|
slotProps={{
|
||||||
|
...getSlotProps("start-time-input"),
|
||||||
|
openPickerButton: { sx: { display: "none" } },
|
||||||
|
textField: {
|
||||||
|
...getSlotProps("start-time-input").textField,
|
||||||
|
onClick: (e) =>
|
||||||
|
handleTimeInputClick(e, setIsStartTimeOpen),
|
||||||
|
sx: {
|
||||||
|
"& .MuiPickersSectionList-section": {
|
||||||
|
cursor: "pointer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
)}
|
)}
|
||||||
@@ -319,7 +348,10 @@ export const DateTimeFields: React.FC<DateTimeFieldsProps> = ({
|
|||||||
onChange={handleEndDateChange}
|
onChange={handleEndDateChange}
|
||||||
slots={{ field: ReadOnlyDateField }}
|
slots={{ field: ReadOnlyDateField }}
|
||||||
slotProps={{
|
slotProps={{
|
||||||
...getSlotProps("end-date-input", !!validation.errors.dateTime),
|
...getSlotProps(
|
||||||
|
"end-date-input",
|
||||||
|
!!validation.errors.dateTime
|
||||||
|
),
|
||||||
field: getFieldSlotProps(
|
field: getFieldSlotProps(
|
||||||
"end-date-input",
|
"end-date-input",
|
||||||
!!validation.errors.dateTime
|
!!validation.errors.dateTime
|
||||||
@@ -334,10 +366,28 @@ export const DateTimeFields: React.FC<DateTimeFieldsProps> = ({
|
|||||||
ampm={false}
|
ampm={false}
|
||||||
value={endTimeValue}
|
value={endTimeValue}
|
||||||
onChange={handleEndTimeChange}
|
onChange={handleEndTimeChange}
|
||||||
slotProps={getSlotProps(
|
open={isEndTimeOpen}
|
||||||
"end-time-input",
|
onClose={() => setIsEndTimeOpen(false)}
|
||||||
!!validation.errors.dateTime
|
slotProps={{
|
||||||
)}
|
...getSlotProps(
|
||||||
|
"end-time-input",
|
||||||
|
!!validation.errors.dateTime
|
||||||
|
),
|
||||||
|
openPickerButton: { sx: { display: "none" } },
|
||||||
|
textField: {
|
||||||
|
...getSlotProps(
|
||||||
|
"end-time-input",
|
||||||
|
!!validation.errors.dateTime
|
||||||
|
).textField,
|
||||||
|
onClick: (e) =>
|
||||||
|
handleTimeInputClick(e, setIsEndTimeOpen),
|
||||||
|
sx: {
|
||||||
|
"& .MuiPickersSectionList-section": {
|
||||||
|
cursor: "pointer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
)}
|
)}
|
||||||
@@ -366,7 +416,10 @@ export const DateTimeFields: React.FC<DateTimeFieldsProps> = ({
|
|||||||
onChange={handleEndDateChange}
|
onChange={handleEndDateChange}
|
||||||
slots={{ field: ReadOnlyDateField }}
|
slots={{ field: ReadOnlyDateField }}
|
||||||
slotProps={{
|
slotProps={{
|
||||||
...getSlotProps("end-date-input", !!validation.errors.dateTime),
|
...getSlotProps(
|
||||||
|
"end-date-input",
|
||||||
|
!!validation.errors.dateTime
|
||||||
|
),
|
||||||
field: getFieldSlotProps(
|
field: getFieldSlotProps(
|
||||||
"end-date-input",
|
"end-date-input",
|
||||||
!!validation.errors.dateTime
|
!!validation.errors.dateTime
|
||||||
@@ -397,7 +450,21 @@ export const DateTimeFields: React.FC<DateTimeFieldsProps> = ({
|
|||||||
value={startTimeValue}
|
value={startTimeValue}
|
||||||
onChange={handleStartTimeChange}
|
onChange={handleStartTimeChange}
|
||||||
disabled={allday}
|
disabled={allday}
|
||||||
slotProps={getSlotProps("start-time-input")}
|
open={isStartTimeOpen}
|
||||||
|
onClose={() => setIsStartTimeOpen(false)}
|
||||||
|
slotProps={{
|
||||||
|
...getSlotProps("start-time-input"),
|
||||||
|
openPickerButton: { sx: { display: "none" } },
|
||||||
|
textField: {
|
||||||
|
...getSlotProps("start-time-input").textField,
|
||||||
|
onClick: (e) => handleTimeInputClick(e, setIsStartTimeOpen),
|
||||||
|
sx: {
|
||||||
|
"& .MuiPickersSectionList-section": {
|
||||||
|
cursor: "pointer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
<Box sx={{ maxWidth: "110px" }}>
|
<Box sx={{ maxWidth: "110px" }}>
|
||||||
@@ -407,6 +474,8 @@ export const DateTimeFields: React.FC<DateTimeFieldsProps> = ({
|
|||||||
value={endTimeValue}
|
value={endTimeValue}
|
||||||
onChange={handleEndTimeChange}
|
onChange={handleEndTimeChange}
|
||||||
disabled={allday}
|
disabled={allday}
|
||||||
|
open={isEndTimeOpen}
|
||||||
|
onClose={() => setIsEndTimeOpen(false)}
|
||||||
slotProps={{
|
slotProps={{
|
||||||
textField: {
|
textField: {
|
||||||
size: "small",
|
size: "small",
|
||||||
@@ -414,9 +483,16 @@ export const DateTimeFields: React.FC<DateTimeFieldsProps> = ({
|
|||||||
fullWidth: true,
|
fullWidth: true,
|
||||||
InputLabelProps: { shrink: true },
|
InputLabelProps: { shrink: true },
|
||||||
error: !!validation.errors.dateTime,
|
error: !!validation.errors.dateTime,
|
||||||
sx: { width: "100%" },
|
|
||||||
inputProps: { "data-testid": "end-time-input" },
|
inputProps: { "data-testid": "end-time-input" },
|
||||||
|
onClick: (e) => handleTimeInputClick(e, setIsEndTimeOpen),
|
||||||
|
sx: {
|
||||||
|
width: "100%",
|
||||||
|
"& .MuiPickersSectionList-section": {
|
||||||
|
cursor: "pointer",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
openPickerButton: { sx: { display: "none" } },
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
@@ -50,8 +50,8 @@ function ReadOnlyPickerField(props: GenericPickerFieldProps) {
|
|||||||
pickerContext.value == null
|
pickerContext.value == null
|
||||||
? ""
|
? ""
|
||||||
: pickerContext.value.isValid()
|
: pickerContext.value.isValid()
|
||||||
? pickerContext.value.format(pickerContext.fieldFormat)
|
? pickerContext.value.format(pickerContext.fieldFormat)
|
||||||
: "";
|
: "";
|
||||||
|
|
||||||
const mergedInputProps = {
|
const mergedInputProps = {
|
||||||
...forwardedProps.InputProps,
|
...forwardedProps.InputProps,
|
||||||
@@ -84,12 +84,6 @@ function ReadOnlyPickerField(props: GenericPickerFieldProps) {
|
|||||||
|
|
||||||
export function ReadOnlyDateField(props: DatePickerFieldProps) {
|
export function ReadOnlyDateField(props: DatePickerFieldProps) {
|
||||||
return (
|
return (
|
||||||
<ReadOnlyPickerField
|
<ReadOnlyPickerField {...props} fieldType="date" validator={validateDate} />
|
||||||
{...props}
|
|
||||||
fieldType="date"
|
|
||||||
validator={validateDate}
|
|
||||||
/>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user