1- import { isCommandKeyPressed } from '@js/common/ core/events/utils/index' ;
2- import registerComponent from '@js/core/component_registrator ' ;
1+ import registerComponent from '@js/core/component_registrator' ; // couldn't change import due to inconsistent typings for registerComponent
2+ import type { dxElementWrapper } from '@js/core/renderer ' ;
33import $ from '@js/core/renderer' ;
4- import { Deferred } from '@js/core/utils/deferred' ;
5- import { extend } from '@js/core/utils/extend' ;
4+ import { Deferred , type DeferredObj } from '@js/core/utils/deferred' ;
5+ import type { DataSourceOptions } from '@js/data/data_source' ;
6+ import type { DxEvent , PointerInteractionEvent } from '@js/events/events.types' ;
67import type { Properties } from '@js/ui/autocomplete' ;
8+ import type { ItemClickEvent , PageLoadMode } from '@js/ui/list' ;
79import { isDefined } from '@ts/core/utils/m_type' ;
810import type { OptionChanged } from '@ts/core/widget/types' ;
11+ import { isCommandKeyPressed } from '@ts/events/utils/index' ;
12+ import type { ItemCache } from '@ts/ui/drop_down_editor/drop_down_list' ;
913import DropDownList from '@ts/ui/drop_down_editor/drop_down_list' ;
14+ import type { ValueChangedEvent } from '@ts/ui/editor/editor' ;
15+ import type { ListBaseProperties } from '@ts/ui/list/list.base' ;
1016
1117const AUTOCOMPLETE_CLASS = 'dx-autocomplete' ;
1218const AUTOCOMPLETE_POPUP_WRAPPER_CLASS = 'dx-autocomplete-popup-wrapper' ;
1319
14- export interface AutocompleteProperties extends Omit < Properties , 'onItemClick' | 'onSelectionChanged' > { }
20+ export interface AutocompleteProperties extends Omit <
21+ Properties , 'onItemClick' | 'onSelectionChanged'
22+ > {
23+
24+ }
1525
1626class Autocomplete extends DropDownList < AutocompleteProperties > {
1727 _supportedKeys ( ) : Record < string , ( e : KeyboardEvent ) => boolean > {
18- let item = this . _list ? this . _list . option ( 'focusedElement' ) : null ;
28+ let item : dxElementWrapper | null = null ;
29+ if ( this . _list ) {
30+ const { focusedElement } = this . _list . option ( ) ;
31+ item = focusedElement ? $ ( focusedElement ) : null ;
32+ }
1933 const parent = super . _supportedKeys ( ) ;
20- // @ts -expect-error ts-error
21- item = item && $ ( item ) ;
2234
2335 return {
2436 ...parent ,
2537 upArrow ( e ) : boolean {
26- // @ts -expect-error ts-error
27- if ( parent . upArrow . apply ( this , arguments ) && ! isCommandKeyPressed ( e ) ) {
38+ if ( parent . upArrow . call ( this , e ) && ! isCommandKeyPressed ( e ) ) {
2839 e . preventDefault ( ) ;
2940 e . stopPropagation ( ) ;
3041 if ( item && ! this . _calcNextItem ( - 1 ) ) {
@@ -35,8 +46,7 @@ class Autocomplete extends DropDownList<AutocompleteProperties> {
3546 return true ;
3647 } ,
3748 downArrow ( e ) : boolean {
38- // @ts -expect-error ts-error
39- if ( parent . downArrow . apply ( this , arguments ) && ! isCommandKeyPressed ( e ) ) {
49+ if ( parent . downArrow . call ( this , e ) && ! isCommandKeyPressed ( e ) ) {
4050 e . preventDefault ( ) ;
4151 e . stopPropagation ( ) ;
4252 if ( item && ! this . _calcNextItem ( 1 ) ) {
@@ -54,7 +64,7 @@ class Autocomplete extends DropDownList<AutocompleteProperties> {
5464 if ( opened ) {
5565 e . preventDefault ( ) ;
5666 }
57- return opened ;
67+ return Boolean ( opened ) ;
5868 } ,
5969 } ;
6070 }
@@ -78,17 +88,19 @@ class Autocomplete extends DropDownList<AutocompleteProperties> {
7888 _getAriaAutocomplete ( ) : string {
7989 const { disabled, readOnly } = this . option ( ) ;
8090
91+ // `||` is required here — `??` would ignore `disabled` when `readOnly` is `false`
8192 // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
8293 const isInputEditable = ! ( readOnly || disabled ) ;
8394
8495 return isInputEditable ? 'list' : 'none' ;
8596 }
8697
87- _displayGetterExpr ( ) {
88- return this . option ( 'valueExpr' ) ;
98+ _displayGetterExpr ( ) : undefined | string | ( ( item : unknown ) => string | number | boolean ) {
99+ const { valueExpr } = this . option ( ) ;
100+ return valueExpr ;
89101 }
90102
91- _closeOutsideDropDownHandler ( { target } ) : boolean {
103+ _closeOutsideDropDownHandler ( { target } : DxEvent < PointerInteractionEvent > ) : boolean {
92104 return ! $ ( target ) . closest ( this . $element ( ) ) . length ;
93105 }
94106
@@ -103,18 +115,19 @@ class Autocomplete extends DropDownList<AutocompleteProperties> {
103115 return `${ super . _popupWrapperClass ( ) } ${ AUTOCOMPLETE_POPUP_WRAPPER_CLASS } ` ;
104116 }
105117
106- _listConfig ( ) {
107- return extend ( super . _listConfig ( ) , {
108- pageLoadMode : 'none' ,
109- onSelectionChanged : ( e ) => {
118+ _listConfig ( ) : ListBaseProperties {
119+ return {
120+ ...super . _listConfig ( ) ,
121+ pageLoadMode : 'none' as PageLoadMode ,
122+ onSelectionChanged : ( e ) : void => {
110123 this . _setSelectedItem ( e . addedItems [ 0 ] ) ;
111124 } ,
112- } ) ;
125+ } ;
113126 }
114127
115- _listItemClickHandler ( e ) {
128+ _listItemClickHandler ( e : ItemClickEvent ) : void {
116129 this . _saveValueChangeEvent ( e . event ) ;
117- // @ts -expect-error ts-error
130+ // @ts -expect-error DataExpressionMixin must be typed
118131 const value = this . _displayGetter ( e . itemData ) ;
119132 this . option ( 'value' , value ) ;
120133 this . close ( ) ;
@@ -129,28 +142,33 @@ class Autocomplete extends DropDownList<AutocompleteProperties> {
129142 super . _setListDataSource ( ) ;
130143 }
131144
132- _refreshSelected ( ) : void { }
145+ _refreshSelected ( ) : void {
146+ // Autocomplete has no persistent selection state — suppress parent behavior
147+ // _refreshSelected is called in parent, so we need to override here
148+ // hence we don't need this functionality in Autocomplete
149+ }
133150
134151 _searchCanceled ( ) : void {
135152 super . _searchCanceled ( ) ;
136153 this . close ( ) ;
137154 }
138155
139- _loadItem ( value , cache ) {
156+ _loadItem ( value : unknown , cache ?: ItemCache ) : DeferredObj < unknown > {
140157 const selectedItem = this . _getItemFromPlain ( value , cache ) ;
141158
142- return Deferred ( ) . resolve ( selectedItem ) . promise ( ) ;
159+ // @ts -expect-error DefferedObj typings and refactor
160+ return Deferred ( ) . resolve ( selectedItem as unknown ) . promise ( ) ;
143161 }
144162
145- _dataSourceOptions ( ) {
163+ _dataSourceOptions ( ) : DataSourceOptions {
146164 const { maxItemCount } = this . option ( ) ;
147165 return {
148166 paginate : true ,
149167 pageSize : maxItemCount ,
150168 } ;
151169 }
152170
153- _searchDataSource ( searchValue ) : void {
171+ _searchDataSource ( searchValue : string ) : void {
154172 const { maxItemCount } = this . option ( ) ;
155173 if ( isDefined ( maxItemCount ) ) {
156174 this . _dataSource . pageSize ( maxItemCount ) ;
@@ -166,12 +184,11 @@ class Autocomplete extends DropDownList<AutocompleteProperties> {
166184 }
167185 }
168186
169- // eslint-disable-next-line class-methods-use-this
170187 _renderValueEventName ( ) : string {
171188 return 'input keyup' ;
172189 }
173190
174- _valueChangeEventHandler ( e ) : void {
191+ _valueChangeEventHandler ( e : ValueChangedEvent ) : void {
175192 const value = this . _input ( ) . val ( ) || null ;
176193 return super . _valueChangeEventHandler ( e , value ) ;
177194 }
@@ -184,11 +201,10 @@ class Autocomplete extends DropDownList<AutocompleteProperties> {
184201 this . _setDefaultAria ( ) ;
185202 break ;
186203 case 'maxItemCount' :
187- // @ts -expect-error ts-error
188- this . _searchDataSource ( ) ;
204+ this . _searchDataSource ( this . _searchValue ( ) ) ;
189205 break ;
190206 case 'valueExpr' :
191- // @ts -expect-error ts-error
207+ // @ts -expect-error DataExpressionMixin must be typed
192208 this . _compileDisplayGetter ( ) ;
193209 this . _setListOption ( 'displayExpr' , this . _displayGetterExpr ( ) ) ;
194210 super . _optionChanged ( args ) ;
0 commit comments