UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

193 lines (192 loc) 6.14 kB
/** * DevExtreme (esm/__internal/ui/m_autocomplete.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/ */ import _extends from "@babel/runtime/helpers/esm/extends"; import { isCommandKeyPressed } from "../../common/core/events/utils/index"; import registerComponent from "../../core/component_registrator"; import $ from "../../core/renderer"; import { Deferred } from "../../core/utils/deferred"; import { extend } from "../../core/utils/extend"; import DropDownList from "../ui/drop_down_editor/m_drop_down_list"; const AUTOCOMPLETE_CLASS = "dx-autocomplete"; const AUTOCOMPLETE_POPUP_WRAPPER_CLASS = "dx-autocomplete-popup-wrapper"; class Autocomplete extends DropDownList { _supportedKeys() { let item = this._list ? this._list.option("focusedElement") : null; const parent = super._supportedKeys(); item = item && $(item); return _extends({}, parent, { upArrow(e) { if (parent.upArrow.apply(this, arguments) && !isCommandKeyPressed(e)) { e.preventDefault(); e.stopPropagation(); if (item && !this._calcNextItem(-1)) { this._clearFocusedItem(); return false } } return true }, downArrow(e) { if (parent.downArrow.apply(this, arguments) && !isCommandKeyPressed(e)) { e.preventDefault(); e.stopPropagation(); if (item && !this._calcNextItem(1)) { this._clearFocusedItem(); return false } } return true }, enter(e) { if (!item) { this.close() } const { opened: opened } = this.option(); if (opened) { e.preventDefault() } return opened } }) } _getDefaultOptions() { return _extends({}, super._getDefaultOptions(), { minSearchLength: 1, maxItemCount: 10, noDataText: "", showDropDownButton: false, searchEnabled: true }) } _initMarkup() { super._initMarkup(); this.$element().addClass("dx-autocomplete") } _getAriaAutocomplete() { const { disabled: disabled, readOnly: readOnly } = this.option(); const isInputEditable = !(readOnly || disabled); return isInputEditable ? "list" : "none" } _displayGetterExpr() { return this.option("valueExpr") } _closeOutsideDropDownHandler(_ref) { let { target: target } = _ref; return !$(target).closest(this.$element()).length } _renderDimensions() { super._renderDimensions(); this._updatePopupWidth(); this._updateListDimensions() } _popupWrapperClass() { return `${super._popupWrapperClass()} dx-autocomplete-popup-wrapper` } _listConfig() { return extend(super._listConfig(), { pageLoadMode: "none", onSelectionChanged: e => { this._setSelectedItem(e.addedItems[0]) } }) } _listItemClickHandler(e) { this._saveValueChangeEvent(e.event); const value = this._displayGetter(e.itemData); this.option("value", value); this.close() } _setListDataSource() { if (!this._list) { return } this._list.option("selectedItems", []); super._setListDataSource() } _refreshSelected() {} _searchCanceled() { super._searchCanceled(); this.close() } _loadItem(value, cache) { const selectedItem = this._getItemFromPlain(value, cache); return Deferred().resolve(selectedItem).promise() } _dataSourceOptions() { return { paginate: true, pageSize: this.option("maxItemCount") } } _searchDataSource(searchValue) { this._dataSource.pageSize(this.option("maxItemCount")); super._searchDataSource(searchValue); this._clearFocusedItem() } _clearFocusedItem() { if (this._list) { this._list.option("focusedElement", null); this._list.option("selectedIndex", -1) } } _renderValueEventName() { return "input keyup" } _valueChangeEventHandler(e) { const value = this._input().val() || null; return super._valueChangeEventHandler(e, value) } _optionChanged(args) { switch (args.name) { case "readOnly": case "disabled": super._optionChanged(args); this._setDefaultAria(); break; case "maxItemCount": this._searchDataSource(); break; case "valueExpr": this._compileDisplayGetter(); this._setListOption("displayExpr", this._displayGetterExpr()); super._optionChanged(args); break; default: super._optionChanged(args) } } clear() { super.clear(); this.close() } reset() { let value = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : void 0; if (arguments.length) { super.reset(value) } else { super.reset() } this.close() } } registerComponent("dxAutocomplete", Autocomplete); export default Autocomplete;