Skip to content

Commit

Permalink
Fix(input) Refactor date and time input handling
Browse files Browse the repository at this point in the history
  • Loading branch information
arimet committed Dec 22, 2023
1 parent e32f946 commit f6e2760
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 22 deletions.
37 changes: 25 additions & 12 deletions packages/ra-ui-materialui/src/input/DateInput.tsx
Expand Up @@ -35,7 +35,6 @@ export const DateInput = ({
defaultValue,
format = getStringFromDate,
label,
name,
source,
resource,
helperText,
Expand All @@ -56,7 +55,6 @@ export const DateInput = ({
isRequired,
} = useInput({
defaultValue,
name,
onBlur,
resource,
source,
Expand All @@ -65,17 +63,22 @@ export const DateInput = ({
});
const [renderCount, setRenderCount] = React.useState(1);

const initialDefaultValueRef = React.useRef(defaultValue);
const initialDefaultValueRef = React.useRef(field.value);

React.useEffect(() => {
if (initialDefaultValueRef.current !== defaultValue) {
const initialDateValue =
new Date(initialDefaultValueRef.current).getTime() || null;

const fieldDateValue = new Date(field.value).getTime() || null;

if (initialDateValue !== fieldDateValue) {
setRenderCount(r => r + 1);
parse
? field.onChange(parse(defaultValue))
: field.onChange(defaultValue);
initialDefaultValueRef.current = defaultValue;
? field.onChange(parse(field.value))
: field.onChange(field.value);
initialDefaultValueRef.current = field.value;
}
}, [defaultValue, setRenderCount, parse, field]);
}, [setRenderCount, parse, field]);

const { onBlur: onBlurFromField } = field;
const hasFocus = React.useRef(false);
Expand All @@ -99,11 +102,17 @@ export const DateInput = ({
!isNaN(new Date(target.valueAsDate).getTime())
? parse
? parse(target.valueAsDate)
: target.valueAsDate
: getStringFromDate(target.valueAsDate)
: parse
? parse(target.value)
: getStringFromDate(target.value);

// if value empty, set it to null
if (newValue === '') {
field.onChange(null);
return;
}

field.onChange(newValue);
};

Expand All @@ -124,13 +133,16 @@ export const DateInput = ({
const renderHelperText =
helperText !== false || ((isTouched || isSubmitted) && invalid);

const { ref } = field;
const { ref, name } = field;

console.log('field', field);

return (
<TextField
id={id}
name={name}
inputRef={ref}
defaultValue={format(defaultValue)}
defaultValue={format(initialDefaultValueRef.current)}
key={renderCount}
type="date"
onChange={handleChange}
Expand Down Expand Up @@ -199,7 +211,8 @@ const getStringFromDate = (value: string | Date) => {
// null, undefined and empty string values should not go through dateFormatter
// otherwise, it returns undefined and will make the input an uncontrolled one.
if (value == null || value === '') {
return '';
console.log('toto');
return null;
}

if (value instanceof Date) {
Expand Down
24 changes: 14 additions & 10 deletions packages/ra-ui-materialui/src/input/DateTimeInput.tsx
Expand Up @@ -26,7 +26,6 @@ export const DateTimeInput = ({
defaultValue,
format = formatDateTime,
label,
name,
helperText,
margin,
onBlur,
Expand All @@ -47,7 +46,6 @@ export const DateTimeInput = ({
isRequired,
} = useInput({
defaultValue,
name,
onBlur,
resource,
source,
Expand All @@ -56,17 +54,22 @@ export const DateTimeInput = ({
});
const [renderCount, setRenderCount] = React.useState(1);

const initialDefaultValueRef = React.useRef(defaultValue);
const initialDefaultValueRef = React.useRef(field.value);

React.useEffect(() => {
if (initialDefaultValueRef.current !== defaultValue) {
const initialDateValue =
new Date(initialDefaultValueRef.current).getTime() || null;

const fieldDateValue = new Date(field.value).getTime() || null;

if (initialDateValue !== fieldDateValue) {
setRenderCount(r => r + 1);
parse
? field.onChange(parse(defaultValue))
: field.onChange(defaultValue);
initialDefaultValueRef.current = defaultValue;
? field.onChange(parse(field.value))
: field.onChange(field.value);
initialDefaultValueRef.current = field.value;
}
}, [defaultValue, setRenderCount, parse, field]);
}, [setRenderCount, parse, field]);

const { onBlur: onBlurFromField } = field;
const hasFocus = React.useRef(false);
Expand Down Expand Up @@ -115,13 +118,14 @@ export const DateTimeInput = ({
const renderHelperText =
helperText !== false || ((isTouched || isSubmitted) && invalid);

const { ref } = field;
const { ref, name } = field;

return (
<TextField
id={id}
inputRef={ref}
defaultValue={format(defaultValue)}
name={name}
defaultValue={format(initialDefaultValueRef.current)}
key={renderCount}
type="datetime-local"
onChange={handleChange}
Expand Down

0 comments on commit f6e2760

Please sign in to comment.