devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
193 lines (192 loc) • 6.14 kB
JavaScript
/**
* 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;