@@ -55,9 +55,13 @@ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
55
55
const EVENT_LOAD_DATA_API = `load${ EVENT_KEY } ${ DATA_API_KEY } `
56
56
57
57
const CLASS_NAME_AUTOCOMPLETE = 'autocomplete'
58
- const CLASS_NAME_AUTOCOMPLETE_DROPDOWN = 'autocomplete-dropdown '
58
+ const CLASS_NAME_BUTTONS = 'autocomplete-buttons '
59
59
const CLASS_NAME_CLEANER = 'autocomplete-cleaner'
60
60
const CLASS_NAME_DISABLED = 'disabled'
61
+ const CLASS_NAME_DROPDOWN = 'autocomplete-dropdown'
62
+ const CLASS_NAME_INDICATOR = 'autocomplete-indicator'
63
+ const CLASS_NAME_INPUT = 'autocomplete-input'
64
+ const CLASS_NAME_INPUT_HINT = 'autocomplete-input-hint'
61
65
const CLASS_NAME_INPUT_GROUP = 'autocomplete-input-group'
62
66
const CLASS_NAME_LABEL = 'label'
63
67
const CLASS_NAME_OPTGROUP = 'autocomplete-optgroup'
@@ -69,7 +73,8 @@ const CLASS_NAME_SELECTED = 'selected'
69
73
const CLASS_NAME_SHOW = 'show'
70
74
71
75
const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="autocomplete"]:not(.disabled)'
72
- const SELECTOR_DATA_TOGGLE_SHOWN = `${ SELECTOR_DATA_TOGGLE } .${ CLASS_NAME_SHOW } `
76
+ const SELECTOR_DATA_TOGGLE_SHOWN = `.autocomplete:not(.disabled).${ CLASS_NAME_SHOW } `
77
+ const SELECTOR_INDICATOR = '.autocomplete-indicator'
73
78
const SELECTOR_OPTGROUP = '.autocomplete-optgroup'
74
79
const SELECTOR_OPTION = '.autocomplete-option'
75
80
const SELECTOR_OPTIONS = '.autocomplete-options'
@@ -196,7 +201,7 @@ class Autocomplete extends BaseComponent {
196
201
197
202
EventHandler . trigger ( this . _element , EVENT_SHOW )
198
203
this . _element . classList . add ( CLASS_NAME_SHOW )
199
- this . _element . setAttribute ( 'aria-expanded' , true )
204
+ this . _inputElement . setAttribute ( 'aria-expanded' , true )
200
205
201
206
if ( this . _config . container ) {
202
207
this . _menu . style . minWidth = `${ this . _element . offsetWidth } px`
@@ -216,7 +221,7 @@ class Autocomplete extends BaseComponent {
216
221
}
217
222
218
223
this . _element . classList . remove ( CLASS_NAME_SHOW )
219
- this . _element . setAttribute ( 'aria-expanded' , 'false' )
224
+ this . _inputElement . setAttribute ( 'aria-expanded' , 'false' )
220
225
221
226
if ( this . _config . container ) {
222
227
this . _menu . classList . remove ( CLASS_NAME_SHOW )
@@ -278,7 +283,7 @@ class Autocomplete extends BaseComponent {
278
283
}
279
284
280
285
this . _deselectOption ( option . value )
281
- this . _updateSelectionCleaner ( )
286
+ this . _updateCleaner ( )
282
287
}
283
288
}
284
289
@@ -326,8 +331,8 @@ class Autocomplete extends BaseComponent {
326
331
// Private
327
332
328
333
_addEventListeners ( ) {
329
- EventHandler . on ( this . _element , EVENT_CLICK , ( ) => {
330
- if ( ! this . _config . disabled ) {
334
+ EventHandler . on ( this . _element , EVENT_CLICK , event => {
335
+ if ( ! this . _config . disabled && ! event . target . closest ( SELECTOR_INDICATOR ) ) {
331
336
this . show ( )
332
337
}
333
338
} )
@@ -369,7 +374,7 @@ class Autocomplete extends BaseComponent {
369
374
370
375
EventHandler . on ( this . _indicatorElement , EVENT_CLICK , event => {
371
376
event . preventDefault ( )
372
- event . stopPropagation ( )
377
+ // event.stopPropagation()
373
378
this . toggle ( )
374
379
} )
375
380
@@ -451,7 +456,7 @@ class Autocomplete extends BaseComponent {
451
456
this . _onOptionsClick ( event . target )
452
457
} )
453
458
454
- EventHandler . on ( this . _selectionCleanerElement , EVENT_CLICK , event => {
459
+ EventHandler . on ( this . _cleanerElement , EVENT_CLICK , event => {
455
460
if ( ! this . _config . disabled ) {
456
461
event . preventDefault ( )
457
462
event . stopPropagation ( )
@@ -536,13 +541,13 @@ class Autocomplete extends BaseComponent {
536
541
this . _element . classList . add ( className )
537
542
}
538
543
539
- this . _createSelection ( )
544
+ this . _createInputGroup ( )
540
545
this . _createButtons ( )
541
546
this . _createOptionsContainer ( )
542
547
this . _updateOptionsList ( )
543
548
}
544
549
545
- _createSelection ( ) {
550
+ _createInputGroup ( ) {
546
551
const togglerEl = document . createElement ( 'div' )
547
552
togglerEl . classList . add ( CLASS_NAME_INPUT_GROUP )
548
553
this . _togglerElement = togglerEl
@@ -553,7 +558,7 @@ class Autocomplete extends BaseComponent {
553
558
554
559
if ( ! this . _config . disabled && this . _config . showHints ) {
555
560
const inputHintEl = document . createElement ( 'input' )
556
- inputHintEl . classList . add ( 'form-control' , 'autocomplete-selection' , 'autocomplete-selection-hint' )
561
+ inputHintEl . classList . add ( CLASS_NAME_INPUT , CLASS_NAME_INPUT_HINT )
557
562
inputHintEl . setAttribute ( 'name' , ( this . _config . name || `${ this . _uniqueId } -hint` ) . toString ( ) )
558
563
inputHintEl . autocomplete = 'off'
559
564
inputHintEl . readOnly = true
@@ -565,7 +570,7 @@ class Autocomplete extends BaseComponent {
565
570
}
566
571
567
572
const inputEl = document . createElement ( 'input' )
568
- inputEl . classList . add ( 'form-control' , 'autocomplete-selection' )
573
+ inputEl . classList . add ( CLASS_NAME_INPUT )
569
574
inputEl . id = this . _uniqueId
570
575
inputEl . setAttribute ( 'name' , ( this . _config . name || this . _uniqueId ) . toString ( ) )
571
576
inputEl . autocomplete = 'off'
@@ -596,7 +601,7 @@ class Autocomplete extends BaseComponent {
596
601
}
597
602
598
603
const buttons = document . createElement ( 'div' )
599
- buttons . classList . add ( 'autocomplete-buttons' )
604
+ buttons . classList . add ( CLASS_NAME_BUTTONS )
600
605
601
606
if ( ! this . _config . disabled && this . _config . cleaner ) {
602
607
const cleaner = document . createElement ( 'button' )
@@ -606,13 +611,13 @@ class Autocomplete extends BaseComponent {
606
611
cleaner . setAttribute ( 'aria-label' , this . _config . ariaCleanerLabel )
607
612
608
613
buttons . append ( cleaner )
609
- this . _selectionCleanerElement = cleaner
614
+ this . _cleanerElement = cleaner
610
615
}
611
616
612
617
if ( this . _config . indicator ) {
613
618
const indicator = document . createElement ( 'button' )
614
619
indicator . type = 'button'
615
- indicator . classList . add ( 'autocomplete-indicator' )
620
+ indicator . classList . add ( CLASS_NAME_INDICATOR )
616
621
indicator . setAttribute ( 'aria-label' , this . _config . ariaIndicatorLabel )
617
622
618
623
if ( this . _config . disabled ) {
@@ -625,7 +630,7 @@ class Autocomplete extends BaseComponent {
625
630
}
626
631
627
632
this . _togglerElement . append ( buttons )
628
- this . _updateSelectionCleaner ( )
633
+ this . _updateCleaner ( )
629
634
}
630
635
631
636
_createPopper ( ) {
@@ -654,7 +659,7 @@ class Autocomplete extends BaseComponent {
654
659
655
660
_createOptionsContainer ( ) {
656
661
const dropdownDiv = document . createElement ( 'div' )
657
- dropdownDiv . classList . add ( CLASS_NAME_AUTOCOMPLETE_DROPDOWN )
662
+ dropdownDiv . classList . add ( CLASS_NAME_DROPDOWN )
658
663
dropdownDiv . role = 'listbox'
659
664
dropdownDiv . setAttribute ( 'aria-labelledby' , this . _uniqueId )
660
665
@@ -797,7 +802,7 @@ class Autocomplete extends BaseComponent {
797
802
}
798
803
799
804
this . _inputElement . focus ( )
800
- this . _updateSelectionCleaner ( )
805
+ this . _updateCleaner ( )
801
806
}
802
807
803
808
_deselectOption ( value ) {
@@ -814,17 +819,17 @@ class Autocomplete extends BaseComponent {
814
819
} )
815
820
}
816
821
817
- _updateSelectionCleaner ( ) {
818
- if ( ! this . _config . cleaner || this . _selectionCleanerElement === null ) {
822
+ _updateCleaner ( ) {
823
+ if ( ! this . _config . cleaner || this . _cleanerElement === null ) {
819
824
return
820
825
}
821
826
822
827
if ( this . _selected . length > 0 ) {
823
- this . _selectionCleanerElement . style . removeProperty ( 'display' )
828
+ this . _cleanerElement . style . removeProperty ( 'display' )
824
829
return
825
830
}
826
831
827
- this . _selectionCleanerElement . style . display = 'none'
832
+ this . _cleanerElement . style . display = 'none'
828
833
}
829
834
830
835
_updateOptionsList ( options = this . _options ) {
@@ -946,42 +951,38 @@ class Autocomplete extends BaseComponent {
946
951
}
947
952
948
953
static clearMenus ( event ) {
949
- if ( event && ( event . button === RIGHT_MOUSE_BUTTON ||
950
- ( event . type === 'keyup' && event . key !== TAB_KEY ) ) ) {
954
+ if ( event . button === RIGHT_MOUSE_BUTTON || ( event . type === 'keyup' && event . key !== TAB_KEY ) ) {
951
955
return
952
956
}
953
957
954
- const autocompletes = SelectorEngine . find ( SELECTOR_DATA_TOGGLE_SHOWN )
955
-
956
- for ( let i = 0 , len = autocompletes . length ; i < len ; i ++ ) {
957
- const context = Data . get ( autocompletes [ i ] , DATA_KEY )
958
- const relatedTarget = {
959
- relatedTarget : autocompletes [ i ]
960
- }
958
+ const openToggles = SelectorEngine . find ( SELECTOR_DATA_TOGGLE_SHOWN )
961
959
962
- if ( event && event . type === 'click' ) {
963
- relatedTarget . clickEvent = event
964
- }
960
+ for ( const toggle of openToggles ) {
961
+ const context = Autocomplete . getInstance ( toggle )
965
962
966
963
if ( ! context ) {
967
964
continue
968
965
}
969
966
970
- if ( ! context . _element . classList . contains ( CLASS_NAME_SHOW ) ) {
967
+ const composedPath = event . composedPath ( )
968
+
969
+ if (
970
+ composedPath . includes ( context . _element )
971
+ ) {
971
972
continue
972
973
}
973
974
974
- if ( context . _element . contains ( event . target ) ) {
975
- continue
975
+ const relatedTarget = { relatedTarget : context . _element }
976
+
977
+ if ( event . type === 'click' ) {
978
+ relatedTarget . clickEvent = event
976
979
}
977
980
978
981
context . hide ( )
979
982
context . search ( '' )
980
983
if ( context . _config . allowOnlyDefinedOptions && context . _selected . length === 0 ) {
981
984
context . _inputElement . value = ''
982
985
}
983
-
984
- EventHandler . trigger ( context . _element , EVENT_HIDDEN )
985
986
}
986
987
}
987
988
}
0 commit comments