UNPKG

devextreme

Version:

JavaScript/TypeScript Component Suite for Responsive Web Development

287 lines (285 loc) • 10.1 kB
/** * DevExtreme (cjs/__internal/ui/date_box/m_date_box.strategy.list.js) * Version: 26.1.3 * Build date: Wed Jun 10 2026 * * Copyright (c) 2012 - 2026 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; require("../../ui/list/modules/selection"); var _date = _interopRequireDefault(require("../../../common/core/localization/date")); var _common = require("../../../core/utils/common"); var _date_serialization = _interopRequireDefault(require("../../../core/utils/date_serialization")); var _size = require("../../../core/utils/size"); var _type = require("../../../core/utils/type"); var _window = require("../../../core/utils/window"); var _m_global_format_config = require("../../core/m_global_format_config"); var _utils = require("../../ui/drop_down_editor/utils"); var _listEdit = _interopRequireDefault(require("../../ui/list/list.edit.search")); var _date_utils = _interopRequireDefault(require("./date_utils")); var _m_date_box = _interopRequireDefault(require("./m_date_box.strategy")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e } } const window = (0, _window.getWindow)(); const DATE_FORMAT = "date"; const BOUNDARY_VALUES = { min: new Date(0, 0, 0, 0, 0), max: new Date(0, 0, 0, 23, 59) }; class ListStrategy extends _m_date_box.default { constructor(dateBox) { super(dateBox); this.NAME = "List" } getWidget() { return this._widget } supportedKeys() { return { space: _common.noop, home: _common.noop, end: _common.noop } } getDefaultOptions() { return Object.assign({}, super.getDefaultOptions(), { applyValueMode: "instantly" }) } getDisplayFormat(displayFormat) { const globalTimeFormat = (0, _m_global_format_config.getGlobalFormatByDataType)("time"); return displayFormat || globalTimeFormat || "shorttime" } popupConfig(popupConfig) { return popupConfig } getValue() { const { selectedIndex: selectedIndex = -1 } = this.getWidget().option(); if (-1 === selectedIndex) { const { value: value } = this.dateBox.option(); return value } const itemData = this._widgetItems[selectedIndex]; return this._getDateByItemData(itemData) } useCurrentDateByDefault() { return true } getDefaultDate() { return new Date(0) } popupShowingHandler() { this.dateBox._dimensionChanged() } _renderWidget() { super._renderWidget(); this._refreshItems() } _getWidgetName() { return _listEdit.default } _getWidgetOptions() { return { itemTemplate: this._timeListItemTemplate.bind(this), selectionMode: "single", tabIndex: -1, onItemClick: this._listItemClickHandler.bind(this), onFocusedItemChanged: e => this._refreshActiveDescendant(e) } } _refreshActiveDescendant(e) { this.dateBox.setAria("activedescendant", ""); this.dateBox.setAria("activedescendant", e.actionValue) } _refreshItems() { this._widgetItems = this._getTimeListItems(); this.getWidget().option("items", this._widgetItems) } renderOpenedState() { if (!this._widget) { return } this._widget.option("focusedElement", null); this._setSelectedItemsByValue(); const { templatesRenderAsynchronously: templatesRenderAsynchronously } = this.getWidget().option(); if (templatesRenderAsynchronously) { this._asyncScrollTimeout = setTimeout(this._scrollToSelectedItem.bind(this)) } else { this._scrollToSelectedItem() } } dispose() { super.dispose(); clearTimeout(this._asyncScrollTimeout) } renderValue() { this._updateValue() } _updateValue() { if (!this._widget) { return } this._refreshItems(); const { opened: opened } = this.dateBox.option(); if (opened) { this._setSelectedItemsByValue(); this._scrollToSelectedItem() } } _setSelectedItemsByValue() { const value = this.dateBoxValue(); const dateIndex = this._getDateIndex(value); const widget = this.getWidget(); if (-1 === dateIndex) { widget.option("selectedItems", []) } else { widget.option("selectedIndex", dateIndex) } } _scrollToSelectedItem() { this.getWidget().scrollToItem(this.getWidget().option("selectedIndex")) } _getDateIndex(date) { let result = -1; for (let i = 0, n = this._widgetItems.length; i < n; i += 1) { if (this._areDatesEqual(date, this._widgetItems[i])) { result = i; break } } return result } _areDatesEqual(first, second) { return (0, _type.isDate)(first) && (0, _type.isDate)(second) && first.getHours() === second.getHours() && first.getMinutes() === second.getMinutes() } _getTimeListItems() { let min = this.dateBox.getDateOption("min") ?? this._getBoundaryDate("min"); const max = this.dateBox.getDateOption("max") ?? this._getBoundaryDate("max"); const value = this.dateBox.getDateOption("value") ?? null; let delta = max - min; const { interval: interval = 30 } = this.dateBox.option(); const minutes = min.getMinutes() % interval; if (delta < 0) { return [] } if (delta > _date_utils.default.ONE_DAY) { delta = _date_utils.default.ONE_DAY } if (value - min < _date_utils.default.ONE_DAY) { return this._getRangeItems(min, new Date(min), delta) } min = this._getBoundaryDate("min"); min.setMinutes(minutes); if (value && Math.abs(value - max) < _date_utils.default.ONE_DAY) { delta = (60 * max.getHours() + Math.abs(max.getMinutes() - minutes)) * _date_utils.default.ONE_MINUTE } return this._getRangeItems(min, new Date(min), delta) } _getRangeItems(startValue, currentValue, rangeDuration) { const rangeItems = []; const { interval: interval = 30 } = this.dateBox.option(); while (currentValue - startValue <= rangeDuration) { rangeItems.push(new Date(currentValue)); currentValue.setMinutes(currentValue.getMinutes() + interval) } return rangeItems } _getBoundaryDate(boundary) { const boundaryValue = BOUNDARY_VALUES[boundary]; const dateBoxDate = this.dateBox.getDateOption("value"); const newDate = new Date(0); const definedValue = (0, _common.ensureDefined)(dateBoxDate, newDate); const currentValue = new Date(definedValue); return new Date(currentValue.getFullYear(), currentValue.getMonth(), currentValue.getDate(), boundaryValue.getHours(), boundaryValue.getMinutes()) } _timeListItemTemplate(itemData) { const { displayFormat: displayFormat } = this.dateBox.option(); return _date.default.format(itemData, this.getDisplayFormat(displayFormat)) } _listItemClickHandler(e) { const { applyValueMode: applyValueMode } = this.dateBox.option(); if ("useButtons" === applyValueMode) { return } const date = this._getDateByItemData(e.itemData); this.dateBox.option("opened", false); this.dateBoxValue(date, e.event) } _getDateByItemData(itemData) { let { value: date } = this.dateBox.option(); const hours = itemData.getHours(); const minutes = itemData.getMinutes(); const seconds = itemData.getSeconds(); const year = itemData.getFullYear(); const month = itemData.getMonth(); const day = itemData.getDate(); if (date) { const { dateSerializationFormat: dateSerializationFormat } = this.dateBox.option(); if (dateSerializationFormat) { date = _date_serialization.default.deserializeDate(date) } else { date = new Date(date) } date.setHours(hours); date.setMinutes(minutes); date.setSeconds(seconds); date.setFullYear(year); date.setMonth(month); date.setDate(day) } else { date = new Date(year, month, day, hours, minutes, 0, 0) } return date } getKeyboardListener() { return this.getWidget() } _updatePopupHeight() { const { dropDownOptions: dropDownOptions } = this.dateBox.option(); const dropDownOptionsHeight = (0, _utils.getSizeValue)(null === dropDownOptions || void 0 === dropDownOptions ? void 0 : dropDownOptions.height); if (void 0 === dropDownOptionsHeight || "auto" === dropDownOptionsHeight) { this.dateBox._setPopupOption("height", "auto"); const popupHeight = (0, _size.getOuterHeight)(this.getWidget().$element()); const maxHeight = .45 * (0, _size.getHeight)(window); this.dateBox._setPopupOption("height", Math.min(popupHeight, maxHeight)) } } getParsedText(text, format) { let value = super.getParsedText(text, format); if (value) { value = _date_utils.default.mergeDates(value, new Date(null), "date") } return value } } var _default = exports.default = ListStrategy;