UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

166 lines (164 loc) 7.07 kB
/** * DevExtreme (cjs/__internal/ui/calendar/m_calendar.range.selection.strategy.js) * Version: 24.2.6 * Build date: Mon Mar 17 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _date = _interopRequireDefault(require("../../../core/utils/date")); var _m_calendarSelection = _interopRequireDefault(require("./m_calendar.selection.strategy")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e } } const DAY_INTERVAL = 864e5; class CalendarRangeSelectionStrategy extends _m_calendarSelection.default { constructor(component) { super(component); this.NAME = "RangeSelection" } getViewOptions() { const value = this._getValue(); const range = this._getDaysInRange(value[0], value[1]); return { value: value, range: range, selectionMode: "range", onCellHover: this._cellHoverHandler.bind(this), onWeekNumberClick: this._shouldHandleWeekNumberClick() ? this._weekNumberClickHandler.bind(this) : null } } selectValue(selectedValue, e) { const [startDate, endDate] = this._getValue(); this.skipNavigate(); this._updateCurrentDate(selectedValue); this._currentDateChanged = true; if (true === this.calendar.option("_allowChangeSelectionOrder")) { this.calendar._valueSelected = true; if ("startDate" === this.calendar.option("_currentSelection")) { if (this.calendar._convertToDate(selectedValue) > this.calendar._convertToDate(endDate)) { this.dateValue([selectedValue, null], e) } else { this.dateValue([selectedValue, endDate], e) } } else if (this.calendar._convertToDate(selectedValue) >= this.calendar._convertToDate(startDate)) { this.dateValue([startDate, selectedValue], e) } else { this.dateValue([selectedValue, null], e) } } else if (!startDate || endDate) { this.dateValue([selectedValue, null], e) } else { this.dateValue(startDate < selectedValue ? [startDate, selectedValue] : [selectedValue, startDate], e) } } updateAriaSelected(value, previousValue) { value ?? (value = this._getValue()); previousValue ?? (previousValue = []); super.updateAriaSelected(value, previousValue) } processValueChanged(value, previousValue) { super.processValueChanged(value, previousValue); const range = this._getRange(); this._updateViewsOption("range", range) } getDefaultCurrentDate() { const { _allowChangeSelectionOrder: _allowChangeSelectionOrder, _currentSelection: _currentSelection } = this.calendar.option(); const value = this.dateOption("value"); if (_allowChangeSelectionOrder) { if ("startDate" === _currentSelection && value[0]) { return value[0] } if ("endDate" === _currentSelection && value[1]) { return value[1] } } const dates = value.filter((value => value)); return this._getLowestDateInArray(dates) } restoreValue() { this.calendar.option("value", [null, null]) } _getValue() { const value = this.dateOption("value"); if (!value.length) { return value } let [startDate, endDate] = value; if (startDate && endDate && startDate > endDate) { [startDate, endDate] = [endDate, startDate] } return [startDate, endDate] } _getRange() { const [startDate, endDate] = this._getValue(); return this._getDaysInRange(startDate, endDate) } _getDaysInRange(startDate, endDate) { if (!startDate || !endDate) { return [] } const { currentDate: currentDate, viewsCount: viewsCount } = this.calendar.option(); const isAdditionalViewDate = this.calendar._isAdditionalViewDate(currentDate); const firstDateInViews = _date.default.getFirstMonthDate(currentDate, isAdditionalViewDate ? -2 : -1); const lastDateInViews = _date.default.getLastMonthDate(currentDate, isAdditionalViewDate ? 1 : viewsCount); const rangeStartDate = new Date(Math.max(firstDateInViews, startDate)); const rangeEndDate = new Date(Math.min(lastDateInViews, endDate)); return [..._date.default.getDatesOfInterval(rangeStartDate, rangeEndDate, 864e5), rangeEndDate] } _cellHoverHandler(e) { const isMaxZoomLevel = this._isMaxZoomLevel(); const [startDate, endDate] = this._getValue(); const { _allowChangeSelectionOrder: _allowChangeSelectionOrder, _currentSelection: _currentSelection } = this.calendar.option(); if (isMaxZoomLevel) { const skipHoveredRange = _allowChangeSelectionOrder && "startDate" === _currentSelection; if (startDate && !endDate && !skipHoveredRange) { if (e.value > startDate) { this._updateViewsOption("hoveredRange", this._getDaysInRange(startDate, e.value)); return } } else if (!startDate && endDate && !(_allowChangeSelectionOrder && "endDate" === _currentSelection)) { if (e.value < endDate) { this._updateViewsOption("hoveredRange", this._getDaysInRange(e.value, endDate)); return } } else if (startDate && endDate) { if ("startDate" === _currentSelection && e.value < startDate) { this._updateViewsOption("hoveredRange", this._getDaysInRange(e.value, startDate)); return } if ("endDate" === _currentSelection && e.value > endDate) { this._updateViewsOption("hoveredRange", this._getDaysInRange(endDate, e.value)); return } } this._updateViewsOption("hoveredRange", []) } } _weekNumberClickHandler(_ref) { let { rowDates: rowDates, event: event } = _ref; const selectedDates = rowDates.filter((date => !this._isDateDisabled(date))); const value = selectedDates.length ? [selectedDates[0], selectedDates[selectedDates.length - 1]] : [null, null]; this.dateValue(value, event) } } var _default = exports.default = CalendarRangeSelectionStrategy;