Skip to content

Commit b63014e

Browse files
authored
advanced filter: fix date input (#2763)
1 parent 4351919 commit b63014e

File tree

1 file changed

+37
-18
lines changed

1 file changed

+37
-18
lines changed

ui/advancedFilter/filters/AgeFilter.tsx

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,40 @@ type Props = {
2929
onClose?: () => void;
3030
};
3131

32+
const DateInput = ({ value, onChange, placeholder, max }: { value: string; onChange: (value: string) => void; placeholder: string; max: string }) => {
33+
const [ tempValue, setTempValue ] = React.useState(value ? dayjs(value).format('YYYY-MM-DD') : '');
34+
35+
const handleChange = React.useCallback((event: ChangeEvent<HTMLInputElement>) => {
36+
setTempValue(event.target.value);
37+
onChange(event.target.value);
38+
}, [ onChange ]);
39+
40+
return (
41+
<Input
42+
value={ tempValue }
43+
onChange={ handleChange }
44+
placeholder={ placeholder }
45+
type="date"
46+
max={ max }
47+
autoComplete="off"
48+
size="sm"
49+
/>
50+
);
51+
};
52+
3253
const AgeFilter = ({ value = defaultValue, handleFilterChange, onClose }: Props) => {
3354
const [ currentValue, setCurrentValue ] = React.useState<AgeFromToValue>({
34-
age: value.age,
35-
from: value.age ? '' : value.from,
36-
to: value.age ? '' : value.to,
55+
age: value.age || '',
56+
from: value.age ? '' : (value.from || ''),
57+
to: value.age ? '' : (value.to || ''),
3758
});
3859

39-
const handleFromChange = React.useCallback((event: ChangeEvent<HTMLInputElement>) => {
40-
setCurrentValue(prev => ({ age: '', to: prev.to, from: event.target.value }));
60+
const handleFromChange = React.useCallback((newValue: string) => {
61+
setCurrentValue(prev => ({ age: '', to: prev.to, from: newValue }));
4162
}, []);
4263

43-
const handleToChange = React.useCallback((event: ChangeEvent<HTMLInputElement>) => {
44-
setCurrentValue(prev => ({ age: '', from: prev.from, to: event.target.value }));
64+
const handleToChange = React.useCallback((newValue: string) => {
65+
setCurrentValue(prev => ({ age: '', from: prev.from, to: newValue }));
4566
}, []);
4667

4768
const onPresetChange = React.useCallback((age: AdvancedFilterAge) => {
@@ -64,9 +85,9 @@ const AgeFilter = ({ value = defaultValue, handleFilterChange, onClose }: Props)
6485
}
6586
const from = currentValue.age ?
6687
dayjs((dayjs().valueOf() - getDurationFromAge(currentValue.age))).toISOString() :
67-
dayjs(currentValue.from).startOf('day').toISOString();
88+
dayjs(currentValue.from || undefined).startOf('day').toISOString();
6889
handleFilterChange(FILTER_PARAM_FROM, from);
69-
const to = currentValue.age ? dayjs().toISOString() : dayjs(currentValue.to).endOf('day').toISOString();
90+
const to = currentValue.age ? dayjs().toISOString() : dayjs(currentValue.to || undefined).endOf('day').toISOString();
7091
handleFilterChange(FILTER_PARAM_TO, to);
7192
handleFilterChange(FILTER_PARAM_AGE, currentValue.age);
7293
}, [ handleFilterChange, currentValue ]);
@@ -75,7 +96,7 @@ const AgeFilter = ({ value = defaultValue, handleFilterChange, onClose }: Props)
7596
<TableColumnFilter
7697
title="Set last duration"
7798
isFilled={ Boolean(currentValue.from || currentValue.to || currentValue.age) }
78-
isTouched={ value.age ? value.age !== currentValue.age : !isEqual(currentValue, value) }
99+
isTouched={ currentValue.age ? value.age !== currentValue.age : Boolean(currentValue.from && currentValue.to && !isEqual(currentValue, value)) }
79100
onFilter={ onFilter }
80101
onReset={ onReset }
81102
hasReset
@@ -90,20 +111,18 @@ const AgeFilter = ({ value = defaultValue, handleFilterChange, onClose }: Props)
90111
</PopoverCloseTriggerWrapper>
91112
</Flex>
92113
<Flex mt={ 3 }>
93-
<Input
94-
value={ currentValue.age ? '' : dayjs(currentValue.from).format('YYYY-MM-DD') }
114+
<DateInput
115+
value={ currentValue.age ? '' : currentValue.from }
95116
onChange={ handleFromChange }
96117
placeholder="From"
97-
type="date"
98-
size="sm"
118+
max={ dayjs().format('YYYY-MM-DD') }
99119
/>
100120
<Text mx={ 3 }>{ ndash }</Text>
101-
<Input
102-
value={ currentValue.age ? '' : dayjs(currentValue.to).format('YYYY-MM-DD') }
121+
<DateInput
122+
value={ currentValue.age ? '' : currentValue.to }
103123
onChange={ handleToChange }
104124
placeholder="To"
105-
type="date"
106-
size="sm"
125+
max={ dayjs().format('YYYY-MM-DD') }
107126
/>
108127
</Flex>
109128
</TableColumnFilter>

0 commit comments

Comments
 (0)