@preamp/datepicker
Version:
VideoAmp's Component library
187 lines • 17.7 kB
JavaScript
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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