UNPKG

@preamp/datepicker

Version:

VideoAmp's Component library

416 lines 37.4 kB
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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