@preamp/datepicker
Version:
VideoAmp's Component library
416 lines • 37.4 kB
JavaScript
import * as React from 'react';
import cx from 'classnames';
import { differenceInCalendarMonths, isAfter, startOfToday } from 'date-fns';
import { SLASH_DATE_FORMAT, VADateRangeClassNamesMap, VADateRangeInputClassNamesMap } from '../../../constants';
import { CustomDatePickerInput } from '../../../custom';
import { convertStringToNewDate, convertStringToNewDates, deprecationWarning, formatDate, maskInputString, outsideAvailableRange, parseDate } from '../../../utils';
import { DateRangePicker } from '../../datepickers/DateRangePicker';
import { DateRangeInputToolTip } from './subComponents/DateRangeInputToolTip';
const defaultDateRangeProps = {
showOutsideDays: false,
weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
classNames: VADateRangeClassNamesMap
};
const errorMessages = {
invalid: 'Date range is invalid',
disabled: 'Selection is outside of available dates'
};
export class DateRangeInput extends React.PureComponent {
constructor() {
super(...arguments);
this.initializeMonthState = () => {
const { dateRangePickerProps, initialMonth, selectedDates } = this.props;
let month;
if (dateRangePickerProps.initialMonth) {
month = dateRangePickerProps.initialMonth;
}
else if (initialMonth) {
month = initialMonth;
}
else if (selectedDates.from) {
const dateRangeHasBeenSet = !!selectedDates.from && !!selectedDates.to;
if (dateRangeHasBeenSet) {
const dateRangeIsMoreThanOneMonthApart = differenceInCalendarMonths(selectedDates.to, selectedDates.from) > 1;
month = dateRangeIsMoreThanOneMonthApart
? selectedDates.to
: selectedDates.from;
}
else {
month = selectedDates.from;
}
}
else {
month = startOfToday();
}
return month;
};
this.initializeselectedDates = () => {
const { selectedDates } = this.props;
let selectedDatesState;
if (selectedDates) {
selectedDatesState = selectedDates;
}
else {
selectedDatesState = {
from: null,
to: null
};
}
return selectedDatesState;
};
this.state = {
cachedDates: {
from: null,
to: null
},
endInput: '',
hasError: this.props.hasError || false,
errorMessage: this.props.errorMessage || null,
month: this.initializeMonthState(),
selectedDates: this.initializeselectedDates(),
showOverlay: this.props.inline,
startInput: ''
};
this.areSelectedDaysWithinDisabledRange = (disabledDays, fromDate, to) => {
const areThereDisabledDays = !!disabledDays;
const startOrEndDateSet = !!fromDate || !!to;
if (areThereDisabledDays && startOrEndDateSet) {
const isOutsideAvailableRange = outsideAvailableRange({ from: fromDate, to }, {
from: disabledDays.before,
to: disabledDays.after
});
if (isOutsideAvailableRange) {
return true;
}
}
return false;
};
this.handleDateRangeValues = (selectedDates) => {
const { disabledDays, hasError, errorMessage } = this.props;
const { from, to } = selectedDates;
// reset the error state
this.setState({
errorMessage: errorMessage || null,
hasError: hasError || false
});
if (!!from && !!to) {
if (isAfter(from, to)) {
this.setState({
endInput: formatDate(to, SLASH_DATE_FORMAT),
errorMessage: errorMessages.invalid,
hasError: true,
selectedDates: {
from: null,
to: null
},
startInput: formatDate(from, SLASH_DATE_FORMAT)
});
}
else {
this.setState({
cachedDates: selectedDates,
endInput: to ? formatDate(to, SLASH_DATE_FORMAT) : '',
selectedDates: selectedDates,
startInput: from ? formatDate(from, SLASH_DATE_FORMAT) : ''
});
}
}
else {
this.setState({
endInput: '',
selectedDates: {
from: null,
to: null
},
startInput: ''
});
}
if (this.areSelectedDaysWithinDisabledRange(disabledDays, from, to)) {
this.setState({
endInput: formatDate(to, SLASH_DATE_FORMAT),
errorMessage: errorMessages.disabled,
hasError: true,
selectedDates: {
from: null,
to: null
},
startInput: formatDate(from, SLASH_DATE_FORMAT)
});
}
};
this.calculateDateRange = (selectedDates, startInput, endInput) => {
const { from: prevFrom, to: prevTo } = selectedDates;
let calculatedStartDate = prevFrom;
let calculatedEndDate = prevTo;
if (!prevFrom) {
calculatedStartDate = startInput.length
? convertStringToNewDate(startInput)
: null;
}
if (!prevTo) {
calculatedEndDate = endInput.length
? convertStringToNewDate(endInput)
: null;
}
return {
from: calculatedStartDate,
to: calculatedEndDate
};
};
this.onHandleDayClick = (updatedSelectedDates, day, modifiers, event) => {
this.setState((prevState) => {
const { hasError, selectedDates } = prevState;
const eventType = event.type;
if (hasError) {
return {
endInput: '',
hasError: this.props.hasError || false,
selectedDates: updatedSelectedDates,
startInput: formatDate(day, SLASH_DATE_FORMAT)
};
}
if (eventType === 'keydown' &&
!!selectedDates.from &&
!!selectedDates.to) {
this.onConfirmDates(selectedDates);
}
const { from: updatedFrom, to: updatedTo } = updatedSelectedDates;
return {
selectedDates: updatedSelectedDates,
startInput: updatedSelectedDates
? formatDate(updatedFrom, SLASH_DATE_FORMAT)
: '',
endInput: updatedTo
? formatDate(updatedTo, SLASH_DATE_FORMAT)
: ''
};
}, () => {
const { onHandleDayClick } = this.props;
const { selectedDates } = this.state;
onHandleDayClick(selectedDates, day, modifiers, event);
});
};
this.onStartFocus = (event) => {
const { onStartFocus } = this.props;
const { selectedDates } = this.state;
event.target.select();
onStartFocus(selectedDates, event);
};
this.onStartChange = (event) => {
const text = maskInputString(event.target.value);
this.setState((prevState) => {
const { endInput, selectedDates, startInput } = prevState;
const calculatedDates = this.calculateDateRange(selectedDates, startInput, endInput);
const updatedDates = convertStringToNewDates(text, calculatedDates);
const { from, to } = updatedDates;
const isDateRangeInvalid = !!from && !!to ? isAfter(from, to) : false;
if (isDateRangeInvalid) {
return {
errorMessage: errorMessages.invalid,
hasError: true,
selectedDates: {
from: null,
to: null
},
startInput: text
};
}
const { disabledDays } = this.props;
if (this.areSelectedDaysWithinDisabledRange(disabledDays, from, to)) {
return {
errorMessage: errorMessages.disabled,
hasError: true,
selectedDates: {
from: null,
to: null
},
startInput: text
};
}
const updatedMonth = differenceInCalendarMonths(to, from) > 1 ? to : from;
return {
hasError: this.props.hasError || false,
month: !!from && !!to ? updatedMonth : from,
selectedDates: updatedDates,
startInput: text
};
}, () => {
const { onStartChange } = this.props;
const { selectedDates } = this.state;
onStartChange(selectedDates);
});
};
this.onEndChange = (event) => {
const text = maskInputString(event.target.value);
this.setState((prevState) => {
const { endInput, selectedDates, startInput } = prevState;
const calculatedDates = this.calculateDateRange(selectedDates, startInput, endInput);
const updatedDates = convertStringToNewDates(text, calculatedDates, false);
const { from, to } = updatedDates;
if (isAfter(from, to)) {
return {
hasError: true,
endInput: text,
errorMessage: errorMessages.invalid,
selectedDates: {
from: null,
to: null
}
};
}
const { disabledDays } = this.props;
if (this.areSelectedDaysWithinDisabledRange(disabledDays, from, to)) {
return {
endInput: text,
errorMessage: errorMessages.disabled,
hasError: true,
selectedDates: {
from: null,
to: null
}
};
}
const updatedMonth = differenceInCalendarMonths(to, from) > 1 ? to : from;
return {
hasError: this.props.hasError || false,
month: updatedMonth,
selectedDates: {
from: from,
to: to
},
endInput: text
};
}, () => {
const { onEndChange } = this.props;
const { selectedDates } = this.state;
onEndChange(selectedDates);
});
};
this.onEndFocus = (event) => {
const { onEndFocus } = this.props;
const { selectedDates } = this.state;
event.target.select();
onEndFocus(selectedDates, event);
};
this.onBlurOverlay = (event) => {
/*
* If the element that gained focus is not a child element of this component,
* hide the overlay and set the value of cachedDates as selectedDates
* */
if (!event.currentTarget.contains(event.relatedTarget)) {
this.setState((prevState) => ({
selectedDates: prevState.cachedDates,
showOverlay: false
}), () => {
const { onBlurOverlay } = this.props;
const { showOverlay, cachedDates } = this.state;
this.handleDateRangeValues(cachedDates);
onBlurOverlay(showOverlay, cachedDates);
});
}
};
this.onConfirmDates = (confirmedDates) => {
this.setState({
cachedDates: confirmedDates,
endInput: formatDate(confirmedDates.to, SLASH_DATE_FORMAT),
selectedDates: confirmedDates,
startInput: formatDate(confirmedDates.from, SLASH_DATE_FORMAT),
showOverlay: false
}, () => this.props.onConfirmDates(confirmedDates));
};
this.onClearSelectedDates = (clearedDates) => {
const { onClearSelectedDates } = this.props;
const { cachedDates } = this.state;
this.handleDateRangeValues(cachedDates);
this.setState({
selectedDates: cachedDates,
showOverlay: false
});
onClearSelectedDates(clearedDates);
};
this.showOverlay = () => {
const { inline } = this.props;
if (!inline) {
this.setState({
showOverlay: true
});
const { onOpenOverlay } = this.props;
onOpenOverlay(true);
}
};
}
componentDidMount() {
const { selectedDates, inputLabel } = this.props;
if (inputLabel) {
deprecationWarning('The inputLabel prop is deprecated. Please use label instead.');
}
this.handleDateRangeValues(selectedDates);
const deprecatedProps = [
{ key: 'classNames', value: this.props.classNames },
{ key: 'fromMonth', value: this.props.fromMonth },
{ key: 'initialMonth', value: this.props.initialMonth },
{ key: 'toMonth', value: this.props.toMonth }
];
deprecatedProps.map((prop) => {
if (prop.value) {
deprecationWarning(`${prop.key} is deprecated. Please read the interface documentation to find an appropriate replacement.`);
}
});
}
componentDidUpdate(prevProps) {
const { selectedDates, hasError } = this.props;
if (prevProps.selectedDates !== selectedDates) {
this.setState({ cachedDates: selectedDates });
this.handleDateRangeValues(selectedDates);
}
if (prevProps.hasError !== hasError) {
this.setState({ hasError });
}
}
render() {
const { endInput, errorMessage, hasError, month, selectedDates, showOverlay, startInput } = this.state;
const { className, dataUI, dateRangePickerProps, disabledDays, endInputId, focusOnMount, id, inline, inlineLabel, inputLabel, isFullWidth, isOptional, label, showActionsBar, startInputId, tooltipId } = this.props;
const updatedDateRangeProps = Object.assign(Object.assign({}, defaultDateRangeProps), dateRangePickerProps);
const startId = id && !startInputId ? `${id}-start` : startInputId;
const endId = id && !endInputId ? `${id}-end` : endInputId;
return (React.createElement("div", { className: cx(className, {
'va-daterange-input-inline': inline,
'va-daterange-input-inlineLabel': inlineLabel,
'va-daterange-input-error': hasError
}, VADateRangeInputClassNamesMap.inputWrapper), "data-ui": dataUI, id: id, onBlur: inline ? null : this.onBlurOverlay, tabIndex: 0 },
React.createElement(DateRangeInputToolTip, Object.assign({ className: className, dataUI: dataUI, disabledDays: disabledDays, endInput: endInput, endInputId: endId, errorMessage: errorMessage, focusOnMount: focusOnMount, hasError: hasError, isFullWidth: isFullWidth, isOptional: isOptional, label: label || inputLabel, onConfirmDates: this.onConfirmDates, onEndChange: this.onEndChange, onEndFocus: this.onEndFocus, onStartChange: this.onStartChange, onStartFocus: this.onStartFocus, selectedDates: selectedDates, showOverlay: this.showOverlay, startInput: startInput, startInputId: startId, tooltipId: tooltipId }, updatedDateRangeProps)),
(showOverlay || inline) && (React.createElement("div", { className: VADateRangeInputClassNamesMap.overlay, "data-ui": `${dataUI}_overlay`, tabIndex: -1 },
React.createElement(DateRangePicker, Object.assign({ dataUI: dataUI, disabledDays: disabledDays, handleDayClick: this.onHandleDayClick, month: month, onClearSelectedDates: this.onClearSelectedDates, onConfirmDates: this.onConfirmDates, selectedDates: selectedDates, showActionsBar: showActionsBar }, updatedDateRangeProps))))));
}
}
DateRangeInput.defaultProps = {
className: VADateRangeInputClassNamesMap.inputWrapper,
component: CustomDatePickerInput,
dataUI: 'date-range-input',
dateRangePickerProps: defaultDateRangeProps,
focusOnMount: false,
format: SLASH_DATE_FORMAT,
formatDate: formatDate,
isFullWidth: false,
inline: false,
inlineLabel: false,
parseDate,
placeholder: 'mm/dd/yyyy',
selectedDates: {
from: null,
to: null
},
showActionsBar: true,
tooltipId: `date-range-input_invalid-value`,
tooltipMessage: errorMessages.invalid,
onBlurOverlay: () => null,
onOpenOverlay: () => null,
onClearSelectedDates: () => null,
onConfirmDates: () => null,
onEndChange: () => null,
onEndFocus: () => null,
onHandleDayClick: () => null,
onStartChange: () => null,
onStartFocus: () => null
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0ZVJhbmdlSW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb21wb25lbnRzL2lucHV0cy9EYXRlUmFuZ2VJbnB1dC9EYXRlUmFuZ2VJbnB1dC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBZTdFLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLDZCQUE2QixFQUNoQyxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixTQUFTLEVBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFOUUsTUFBTSxxQkFBcUIsR0FBd0I7SUFDL0MsZUFBZSxFQUFFLEtBQUs7SUFDdEIsYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQ2hFLFVBQVUsRUFBRSx3QkFBd0I7Q0FDdkMsQ0FBQztBQThIRixNQUFNLGFBQWEsR0FBMEM7SUFDekQsT0FBTyxFQUFFLHVCQUF1QjtJQUNoQyxRQUFRLEVBQUUseUNBQXlDO0NBQ3RELENBQUM7QUFFRixNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUssQ0FBQyxhQUd6QztJQUhE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