devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
155 lines (154 loc) • 6.94 kB
JavaScript
/**
* DevExtreme (esm/ui/calendar/ui.calendar.range.selection.strategy.js)
* Version: 23.2.6
* Build date: Wed May 01 2024
*
* Copyright (c) 2012 - 2024 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import dateUtils from "../../core/utils/date";
import CalendarSelectionStrategy from "./ui.calendar.selection.strategy";
var DAY_INTERVAL = 864e5;
class CalendarRangeSelectionStrategy extends CalendarSelectionStrategy {
constructor(component) {
super(component);
this.NAME = "RangeSelection"
}
getViewOptions() {
var value = this._getValue();
var 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) {
var [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) {
var _value, _previousValue;
null !== (_value = value) && void 0 !== _value ? _value : value = this._getValue();
null !== (_previousValue = previousValue) && void 0 !== _previousValue ? _previousValue : previousValue = [];
super.updateAriaSelected(value, previousValue)
}
processValueChanged(value, previousValue) {
super.processValueChanged(value, previousValue);
var range = this._getRange();
this._updateViewsOption("range", range)
}
getDefaultCurrentDate() {
var {
_allowChangeSelectionOrder: _allowChangeSelectionOrder,
_currentSelection: _currentSelection
} = this.calendar.option();
var value = this.dateOption("value");
if (_allowChangeSelectionOrder) {
if ("startDate" === _currentSelection && value[0]) {
return value[0]
}
if ("endDate" === _currentSelection && value[1]) {
return value[1]
}
}
var dates = value.filter(value => value);
return this._getLowestDateInArray(dates)
}
restoreValue() {
this.calendar.option("value", [null, null])
}
_getValue() {
var value = this.dateOption("value");
if (!value.length) {
return value
}
var [startDate, endDate] = value;
if (startDate && endDate && startDate > endDate) {
[startDate, endDate] = [endDate, startDate]
}
return [startDate, endDate]
}
_getRange() {
var [startDate, endDate] = this._getValue();
return this._getDaysInRange(startDate, endDate)
}
_getDaysInRange(startDate, endDate) {
if (!startDate || !endDate) {
return []
}
var {
currentDate: currentDate,
viewsCount: viewsCount
} = this.calendar.option();
var isAdditionalViewDate = this.calendar._isAdditionalViewDate(currentDate);
var firstDateInViews = dateUtils.getFirstMonthDate(dateUtils.addDateInterval(currentDate, "month", isAdditionalViewDate ? -2 : -1));
var lastDateInViews = dateUtils.getLastMonthDate(dateUtils.addDateInterval(currentDate, "month", isAdditionalViewDate ? 1 : viewsCount));
var rangeStartDate = new Date(Math.max(firstDateInViews, startDate));
var rangeEndDate = new Date(Math.min(lastDateInViews, endDate));
return [...dateUtils.getDatesOfInterval(rangeStartDate, rangeEndDate, DAY_INTERVAL), rangeEndDate]
}
_cellHoverHandler(e) {
var isMaxZoomLevel = this._isMaxZoomLevel();
var [startDate, endDate] = this._getValue();
var {
_allowChangeSelectionOrder: _allowChangeSelectionOrder,
_currentSelection: _currentSelection
} = this.calendar.option();
if (isMaxZoomLevel) {
var 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
} else if ("endDate" === _currentSelection && e.value > endDate) {
this._updateViewsOption("hoveredRange", this._getDaysInRange(endDate, e.value));
return
}
}
this._updateViewsOption("hoveredRange", [])
}
}
_weekNumberClickHandler(_ref) {
var {
rowDates: rowDates,
event: event
} = _ref;
var selectedDates = rowDates.filter(date => !this._isDateDisabled(date));
var value = selectedDates.length ? [selectedDates[0], selectedDates[selectedDates.length - 1]] : [null, null];
this.dateValue(value, event)
}
}
export default CalendarRangeSelectionStrategy;