UNPKG

@preamp/datepicker

Version:

VideoAmp's Component library

187 lines 17.7 kB
var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import * as React from 'react'; import cx from 'classnames'; import { format, isBefore } from 'date-fns'; import DayPicker from 'react-day-picker'; import { Button, ButtonTheme } from '@preamp/core'; import { MONTH_YEAR_FORMAT, VADateRangeClassNamesMap } from '../../../constants'; import { CustomDayElement, CustomNavBar } from '../../../custom'; import { isDateFirstDayOfMonth, isDateLastDayOfMonth, isSelectingStartDay } from '../../../utils'; /** * A basic date range picker. */ export class DateRangePicker extends React.PureComponent { constructor() { super(...arguments); this.state = { from: null, to: null, enteredTo: null, resetDateRange: false }; this.returnDateRange = (day, prevFrom, prevTo) => { const isStartDateSet = !!prevFrom; const isNewDateEarlierThanStartDate = isBefore(day, prevFrom); const isDateRangeSet = !!prevFrom && !!prevTo; const dateRangeIsEmpty = !isStartDateSet && !prevTo; if (dateRangeIsEmpty || (isStartDateSet && isNewDateEarlierThanStartDate) || isDateRangeSet) { return { from: day, to: null }; } const isNewDateLaterThanStartDate = isStartDateSet && !isNewDateEarlierThanStartDate; if (isNewDateLaterThanStartDate) { return { from: prevFrom, to: day }; } return { from: prevFrom, to: prevTo }; }; // Events with callbacks this.onHandleDayClick = (day, modifiers, event) => { let dateRange = { from: null, to: null }; if (modifiers['va-datepicker-day--disabled']) { return; } this.setState((prevState) => { const { from: prevFrom, to: prevTo } = prevState; const shouldResetDateRange = isSelectingStartDay(prevFrom, prevTo, day); dateRange = this.returnDateRange(day, prevFrom, prevTo); return Object.assign(Object.assign({}, dateRange), { enteredTo: dateRange.to, resetDateRange: shouldResetDateRange }); }, () => this.props.handleDayClick(dateRange, day, modifiers, event)); }; this.onConfirmDates = () => { const { onConfirmDates } = this.props; const { from, to } = this.state; onConfirmDates({ from, to }); }; this.onClearSelectedDates = () => { this.setState({ from: null, to: null, enteredTo: null }, () => this.props.onClearSelectedDates({ from: null, to: null })); }; // Internal state events this.handleDayMouseEnter = (day) => { const { from, to } = this.state; if (!isSelectingStartDay(from, to, day)) { this.setState({ enteredTo: day }); } else if (!to && day <= from) { this.setState({ enteredTo: null }); } }; this.renderActionsWrapper = () => { const { dataUI } = this.props; const { from, to } = this.state; return (React.createElement(React.Fragment, null, this.props.showActionsBar && (React.createElement("div", { className: VADateRangeClassNamesMap.actionsWrapper }, React.createElement(Button, { dataUI: `${dataUI}_button-confirm`, disabled: !from || !to, onClick: this.onConfirmDates, // disable button if there are not both selected from and to dates theme: ButtonTheme.Primary }, "Confirm Dates"), React.createElement(Button, { dataUI: `${dataUI}_button-cancel`, onClick: this.onClearSelectedDates, theme: ButtonTheme.Secondary }, "Cancel"))))); }; this.returnCustomDay = CustomDayElement(this.props.dataUI); this.returnCustomNavBar = CustomNavBar(this.props.dataUI); } componentDidMount() { const { selectedDates } = this.props; if (selectedDates) { const { enteredTo } = this.state; this.setState({ from: selectedDates.from, to: selectedDates.to, enteredTo: selectedDates.to ? selectedDates.to : enteredTo }); } if (document.querySelectorAll('.va-daterange-month')) { const { dataUI } = this.props; document .querySelectorAll('.va-daterange-month') .forEach((month, index) => month.setAttribute('data-ui', `${dataUI}_month--${index}`)); } } componentDidUpdate(prevProps) { if (prevProps.selectedDates !== this.props.selectedDates) { const { selectedDates } = this.props; const { resetDateRange } = this.state; if (selectedDates) { const toDate = selectedDates.to; const enteredToDate = resetDateRange ? null : toDate; this.setState({ from: selectedDates.from, to: selectedDates.to, enteredTo: enteredToDate }); } this.setState({ resetDateRange: false }); } } render() { const { from, to, enteredTo } = this.state; const _a = this.props, { className, dataUI, id, label, isOptional, firstDayOfWeek, modifiers, style, initialMonth } = _a, rest = __rest(_a, ["className", "dataUI", "id", "label", "isOptional", "firstDayOfWeek", "modifiers", "style", "initialMonth"]); const dateRangeModifiers = Object.assign(Object.assign({}, modifiers), { start: from, end: enteredTo, startWeek: { daysOfWeek: [firstDayOfWeek] }, endWeek: { daysOfWeek: [firstDayOfWeek > 0 ? firstDayOfWeek - 1 : 6] }, firstOfMonth: isDateFirstDayOfMonth, lastOfMonth: isDateLastDayOfMonth }); const isSelectingRange = !!from && !to; const enterToIsLessThanStart = !!from && !enteredTo; return (React.createElement("div", { className: className }, (label || isOptional) && (React.createElement("label", { className: "va-form-label", htmlFor: id }, label, isOptional && (React.createElement("span", { className: "u-label--optional" }, "Optional")))), React.createElement("div", { className: cx({ isSelectingRange: isSelectingRange, enterToIsLessThanStart: enterToIsLessThanStart }, 'va-daterange-picker-container'), id: id, style: style }, React.createElement(DayPicker, Object.assign({ captionElement: ({ date }) => (React.createElement("div", { className: VADateRangeClassNamesMap.caption }, React.createElement("h4", null, format(date, MONTH_YEAR_FORMAT)))), containerProps: { /* eslint-disable @typescript-eslint/ban-ts-ignore */ // @ts-ignore 'data-ui': dataUI }, firstDayOfWeek: firstDayOfWeek, initialMonth: initialMonth, modifiers: dateRangeModifiers, navbarElement: this.returnCustomNavBar, numberOfMonths: 2, onDayClick: this.onHandleDayClick, onDayMouseEnter: this.handleDayMouseEnter, renderDay: this.returnCustomDay, selectedDays: [from, { from, to: enteredTo }] }, rest, { tabIndex: -1 })), this.renderActionsWrapper()))); } } DateRangePicker.defaultProps = { dataUI: 'date-range-picker', showOutsideDays: false, weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], classNames: VADateRangeClassNamesMap, className: VADateRangeClassNamesMap.daterangeWrapper, firstDayOfWeek: 0, selectedDates: { from: null, to: null }, showActionsBar: true, onConfirmDates: () => null, onClearSelectedDates: () => null, handleDayClick: () => null }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0ZVJhbmdlUGlja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9kYXRlcGlja2Vycy9EYXRlUmFuZ2VQaWNrZXIvRGF0ZVJhbmdlUGlja2VyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM1QyxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQWV6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVuRCxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLHdCQUF3QixFQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDSCxnQkFBZ0IsRUFFaEIsWUFBWSxFQUVmLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNILHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ3RCLE1BQU0sZ0JBQWdCLENBQUM7QUF5RHhCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsS0FBSyxDQUFDLGFBRzFDO0lBSEQ7O1FBcUJJLFVBQUssR0FBeUI7WUFDMUIsSUFBSSxFQUFFLElBQUk7WUFDVixFQUFFLEVBQUUsSUFBSTtZQUNSLFNBQVMsRUFBRSxJQUFJO1lBQ2YsY0FBYyxFQUFFLEtBQUs7U0FDeEIsQ0FBQztRQWdERixvQkFBZSxHQUFHLENBQUMsR0FBUyxFQUFFLFFBQWMsRUFBRSxNQUFZLEVBQWEsRUFBRTtZQUNyRSxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ2xDLE1BQU0sNkJBQTZCLEdBQVksUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxNQUFN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