ToolJet/frontend/src/Editor/Components/Datepicker.jsx
Kiran Ashok 772c3bd56a
Bugfix :: datepicker widget shows current date when default date is set as empty (#2875)
* fixing default date bug

* Set arbitrary default date for datepicker, and empty default exluded dates

* If set date is invalid, ensure exposed value is undefined on Datepicker

Co-authored-by: Sherfin Shamsudeen <sherfin94@gmail.com>
2022-04-21 14:18:51 +05:30

118 lines
3.4 KiB
JavaScript

import React, { useEffect, useState } from 'react';
import DatePickerComponent from 'react-datepicker';
import moment from 'moment';
import 'react-datepicker/dist/react-datepicker.css';
export const Datepicker = function Datepicker({
height,
properties,
styles,
exposedVariables,
setExposedVariable,
validate,
onComponentClick,
component,
id,
darkMode,
}) {
const { format, enableTime, enableDate, defaultValue, disabledDates } = properties;
const { visibility, disabledState, borderRadius } = styles;
const [date, setDate] = useState(null);
const [excludedDates, setExcludedDates] = useState([]);
const selectedDateFormat = enableTime ? `${format} LT` : format;
const computeDateString = (date) => {
if (enableDate) {
return moment(date).format(selectedDateFormat);
}
if (!enableDate && enableTime) {
return moment(date).format('LT');
}
};
const onDateChange = (date) => {
setDate(date);
const dateString = computeDateString(date);
setExposedVariable('value', dateString);
};
useEffect(() => {
const dateMomentInstance = defaultValue && moment(defaultValue, selectedDateFormat);
if (dateMomentInstance && dateMomentInstance.isValid()) {
setDate(dateMomentInstance.toDate());
setExposedVariable('value', defaultValue);
} else {
setDate(null);
setExposedVariable('value', undefined);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [defaultValue]);
useEffect(() => {
if (Array.isArray(disabledDates) && disabledDates.length > 0) {
const _exluded = [];
disabledDates?.map((item) => {
if (moment(item, format).isValid()) {
_exluded.push(moment(item, format).toDate());
}
});
setExcludedDates(_exluded);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [disabledDates, format]);
const validationData = validate(exposedVariables.value);
const { isValid, validationError } = validationData;
useEffect(() => {
setExposedVariable('isValid', isValid);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isValid]);
const CustomInputBox = React.forwardRef((props, ref) => {
return (
<input
readOnly
{...props}
value={date !== null ? computeDateString(date) : 'select date'}
className={`input-field form-control ${!isValid ? 'is-invalid' : ''} validation-without-icon px-2 ${
darkMode ? 'bg-dark color-white' : 'bg-light'
}`}
style={{ height, borderRadius: `${borderRadius}px` }}
ref={ref}
/>
);
});
return (
<div
data-disabled={disabledState}
className="datepicker-widget"
style={{
height,
display: visibility ? '' : 'none',
borderRadius: `${borderRadius}px`,
}}
>
<DatePickerComponent
selected={date}
onChange={(date) => onDateChange(date)}
showTimeInput={enableTime ? true : false}
showTimeSelectOnly={enableDate ? false : true}
onFocus={(event) => {
onComponentClick(id, component, event);
}}
showMonthDropdown
showYearDropdown
dropdownMode="select"
customInput={<CustomInputBox />}
excludeDates={excludedDates}
/>
<div className={`invalid-feedback ${isValid ? '' : 'd-flex'}`}>{validationError}</div>
</div>
);
};