@gitlab/ui 127.1.0 → 128.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/components/base/filtered_search/filtered_search.js +9 -7
  2. package/dist/components/base/filtered_search/filtered_search_suggestion_list.js +2 -2
  3. package/dist/components/base/filtered_search/filtered_search_token_segment.js +10 -2
  4. package/dist/components/base/filtered_search/filtered_search_utils.js +2 -1
  5. package/dist/components/base/form/form_group/form_group.js +3 -0
  6. package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +95 -20
  7. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +1 -1
  8. package/dist/components/base/new_dropdowns/listbox/listbox.js +47 -10
  9. package/dist/components/base/toast/toast.js +2 -1
  10. package/dist/index.css +1 -1
  11. package/dist/index.css.map +1 -1
  12. package/package.json +1 -1
  13. package/src/components/base/filtered_search/filtered_search.vue +8 -7
  14. package/src/components/base/filtered_search/filtered_search_suggestion_list.vue +2 -2
  15. package/src/components/base/filtered_search/filtered_search_token_segment.vue +15 -2
  16. package/src/components/base/filtered_search/filtered_search_utils.js +2 -0
  17. package/src/components/base/form/form_checkbox/form_checkbox.vue +0 -3
  18. package/src/components/base/form/form_checkbox/form_checkbox_group.vue +148 -21
  19. package/src/components/base/form/form_group/form_group.vue +3 -0
  20. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.vue +101 -22
  21. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.vue +3 -2
  22. package/src/components/base/new_dropdowns/listbox/listbox.vue +52 -9
  23. package/src/components/base/toast/toast.js +1 -0
  24. package/src/components/base/toast/toast.scss +18 -2
  25. package/src/scss/bootstrap_vue.scss +0 -1
  26. package/src/vendor/bootstrap-vue/src/constants/components.js +0 -2
  27. package/src/vendor/bootstrap-vue/src/mixins/form-radio-check-group.js +1 -2
  28. package/src/vendor/bootstrap-vue/src/components/form-checkbox/_form-checkbox-group.scss +0 -1
  29. package/src/vendor/bootstrap-vue/src/components/form-checkbox/_form-checkbox.scss +0 -125
  30. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group.js +0 -42
  31. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox.js +0 -132
  32. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.js +0 -4
  33. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.scss +0 -2
@@ -6,13 +6,17 @@ import { logWarning } from '../../../utils/utils';
6
6
  import GlIcon from '../icon/icon';
7
7
  import GlSearchBoxByClick from '../search_box_by_click/search_box_by_click';
8
8
  import GlFilteredSearchTerm from './filtered_search_term';
9
- import { termTokenDefinition, isEmptyTerm, createTerm, needDenormalization, denormalizeTokens, INTENT_ACTIVATE_PREVIOUS, ensureTokenId, normalizeTokens } from './filtered_search_utils';
9
+ import { termTokenDefinition, isEmptyTerm, createTerm, INTENT_ACTIVATE_PREVIOUS, ensureTokenId, normalizeTokens, needDenormalization, denormalizeTokens } from './filtered_search_utils';
10
10
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
11
11
 
12
12
  let portalUuid = 0;
13
13
  function initialState() {
14
14
  return [createTerm()];
15
15
  }
16
+ function computeTokens(value, termsAsTokens) {
17
+ const resolved = value !== null && value !== void 0 && value.length ? cloneDeep(value) : initialState();
18
+ return needDenormalization(resolved) ? denormalizeTokens(resolved, termsAsTokens) : resolved;
19
+ }
16
20
  var script = {
17
21
  name: 'GlFilteredSearch',
18
22
  components: {
@@ -167,7 +171,7 @@ var script = {
167
171
  },
168
172
  data() {
169
173
  return {
170
- tokens: initialState(),
174
+ tokens: computeTokens(this.value, this.termsAsTokens),
171
175
  activeTokenIdx: null,
172
176
  suggestionsStyle: {},
173
177
  intendedCursorPosition: 'end'
@@ -229,17 +233,15 @@ var script = {
229
233
  value: {
230
234
  handler(newValue, oldValue) {
231
235
  if (!isEqual(newValue, oldValue)) {
232
- const value = newValue.length ? newValue : initialState();
233
- this.applyNewValue(cloneDeep(value));
236
+ this.applyNewValue(newValue);
234
237
  }
235
238
  },
236
- deep: true,
237
- immediate: true
239
+ deep: true
238
240
  }
239
241
  },
240
242
  methods: {
241
243
  applyNewValue(newValue) {
242
- this.tokens = needDenormalization(newValue) ? denormalizeTokens(newValue, this.termsAsTokens) : newValue;
244
+ this.tokens = computeTokens(newValue, this.termsAsTokens);
243
245
  },
244
246
  isActiveToken(idx) {
245
247
  return this.activeTokenIdx === idx;
@@ -1,4 +1,4 @@
1
- import { stepIndexAndWrap } from './filtered_search_utils';
1
+ import { FILTERED_SEARCH_SUGGESTIONS_CLASS, stepIndexAndWrap } from './filtered_search_utils';
2
2
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
3
3
 
4
4
  const DEFER_TO_INITIAL_VALUE = -1;
@@ -40,7 +40,7 @@ var script = {
40
40
  return this.registeredItems[this.activeIdx];
41
41
  },
42
42
  listClasses() {
43
- return [this.suggestionsListClass(), 'dropdown-menu gl-filtered-search-suggestion-list'];
43
+ return [this.suggestionsListClass(), `dropdown-menu ${FILTERED_SEARCH_SUGGESTIONS_CLASS}`];
44
44
  }
45
45
  },
46
46
  watch: {
@@ -3,7 +3,7 @@ import { Portal } from 'portal-vue';
3
3
  import { LEFT_MOUSE_BUTTON } from '../../../utils/constants';
4
4
  import GlFilteredSearchSuggestion from './filtered_search_suggestion';
5
5
  import GlFilteredSearchSuggestionList from './filtered_search_suggestion_list';
6
- import { TERM_TOKEN_TYPE, splitOnQuotes, match, wrapTokenInQuotes } from './filtered_search_utils';
6
+ import { TERM_TOKEN_TYPE, splitOnQuotes, match, wrapTokenInQuotes, FILTERED_SEARCH_SUGGESTIONS_CLASS } from './filtered_search_utils';
7
7
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
8
8
 
9
9
  // We need some helpers to ensure @vue/compat compatibility
@@ -381,7 +381,15 @@ var script = {
381
381
  applySuggestion: v => this.applySuggestion(v)
382
382
  });
383
383
  },
384
- handleBlur() {
384
+ handleBlur(e) {
385
+ var _e$relatedTarget;
386
+ // Keep focus on input when blur event is on same element
387
+ // (e.g. scrollbar in filtered search suggestions list)
388
+ if ((_e$relatedTarget = e.relatedTarget) !== null && _e$relatedTarget !== void 0 && _e$relatedTarget.classList.contains(FILTERED_SEARCH_SUGGESTIONS_CLASS)) {
389
+ var _this$$refs$input;
390
+ (_this$$refs$input = this.$refs.input) === null || _this$$refs$input === void 0 ? void 0 : _this$$refs$input.focus();
391
+ return;
392
+ }
385
393
  if (this.multiSelect) {
386
394
  this.$emit('complete');
387
395
  } else if (this.active) {
@@ -6,6 +6,7 @@ import { modulo } from '../../../utils/number_utils';
6
6
  const TERM_TOKEN_TYPE = 'filtered-search-term';
7
7
  const INTENT_ACTIVATE_PREVIOUS = 'intent-activate-previous';
8
8
  const TOKEN_CLOSE_SELECTOR = '.gl-token-close';
9
+ const FILTERED_SEARCH_SUGGESTIONS_CLASS = 'gl-filtered-search-suggestion-list';
9
10
  function isEmptyTerm(token) {
10
11
  return token.type === TERM_TOKEN_TYPE && token.value.data.trim() === '';
11
12
  }
@@ -239,4 +240,4 @@ function wrapTokenInQuotes(token) {
239
240
  return `"${token}"`;
240
241
  }
241
242
 
242
- export { INTENT_ACTIVATE_PREVIOUS, TERM_TOKEN_TYPE, TOKEN_CLOSE_SELECTOR, createTerm, denormalizeTokens, ensureTokenId, isEmptyTerm, match, needDenormalization, normalizeTokens, splitOnQuotes, stepIndexAndWrap, termTokenDefinition, tokenToOption, wrapTokenInQuotes };
243
+ export { FILTERED_SEARCH_SUGGESTIONS_CLASS, INTENT_ACTIVATE_PREVIOUS, TERM_TOKEN_TYPE, TOKEN_CLOSE_SELECTOR, createTerm, denormalizeTokens, ensureTokenId, isEmptyTerm, match, needDenormalization, normalizeTokens, splitOnQuotes, stepIndexAndWrap, termTokenDefinition, tokenToOption, wrapTokenInQuotes };
@@ -8,6 +8,9 @@ var script = {
8
8
  components: {
9
9
  BFormGroup
10
10
  },
11
+ provide: {
12
+ isInFormGroup: true
13
+ },
11
14
  inheritAttrs: false,
12
15
  props: {
13
16
  /**
@@ -106,6 +106,26 @@ var script = {
106
106
  return ['menu', 'listbox', 'tree', 'grid', 'dialog', true, false].includes(value);
107
107
  }
108
108
  },
109
+ activeItemId: {
110
+ type: String,
111
+ required: false,
112
+ default: undefined
113
+ },
114
+ hasExternalLabel: {
115
+ type: Boolean,
116
+ required: false,
117
+ default: false
118
+ },
119
+ hasSearchableListbox: {
120
+ type: Boolean,
121
+ required: false,
122
+ default: false
123
+ },
124
+ isDisclosure: {
125
+ type: Boolean,
126
+ required: false,
127
+ default: false
128
+ },
109
129
  /**
110
130
  * Id that will be referenced by `aria-labelledby` attribute of the dropdown content`
111
131
  */
@@ -113,6 +133,15 @@ var script = {
113
133
  type: String,
114
134
  required: true
115
135
  },
136
+ /**
137
+ * Span Id that will be referenced by listbox `aria-labelledby` if there's an external label.
138
+ * This prop will only be defined by `GlCollapsibleListbox` when `isInFormGroup` injected is true.
139
+ */
140
+ listboxId: {
141
+ type: String,
142
+ required: false,
143
+ default: undefined
144
+ },
116
145
  /**
117
146
  * The `aria-labelledby` attribute value for the toggle `button`
118
147
  */
@@ -157,6 +186,10 @@ var script = {
157
186
  };
158
187
  },
159
188
  computed: {
189
+ ariaActiveDescendant() {
190
+ if (!this.isDisclosure && this.visible) return this.activeItemId;
191
+ return undefined;
192
+ },
160
193
  hasNoVisibleToggleText() {
161
194
  var _this$toggleText;
162
195
  return !((_this$toggleText = this.toggleText) !== null && _this$toggleText !== void 0 && _this$toggleText.length) || this.textSrOnly;
@@ -170,12 +203,47 @@ var script = {
170
203
  isCaretOnly() {
171
204
  return !this.noCaret && !this.icon && this.hasNoVisibleToggleText;
172
205
  },
173
- ariaAttributes() {
206
+ isDefaultToggle() {
207
+ return !this.$scopedSlots.toggle;
208
+ },
209
+ isToggleCombobox() {
210
+ if (this.hasSearchableListbox || this.isDisclosure) {
211
+ return false;
212
+ }
213
+ return true;
214
+ },
215
+ isToggleLabelledExternally() {
216
+ if (this.hasExternalLabel && this.toggleId) return true;
217
+ return false;
218
+ },
219
+ computedToggleId() {
220
+ if (this.isDisclosure) {
221
+ return this.isDefaultToggle ? this.toggleId : undefined;
222
+ }
223
+ if (this.isToggleLabelledExternally) {
224
+ return this.isDefaultToggle ? this.toggleId : undefined;
225
+ }
226
+ if (this.hasSearchableListbox) {
227
+ return this.toggleId;
228
+ }
229
+ return undefined;
230
+ },
231
+ computedToggleInnerId() {
232
+ if (this.isToggleCombobox && !this.isToggleLabelledExternally) {
233
+ return this.toggleId;
234
+ }
235
+ if (this.isToggleCombobox && this.isToggleLabelledExternally) {
236
+ return this.listboxId;
237
+ }
238
+ return undefined;
239
+ },
240
+ toggleAriaAttributes() {
174
241
  return {
175
- 'aria-haspopup': this.ariaHaspopup,
176
- 'aria-expanded': String(this.visible),
177
242
  'aria-controls': this.baseDropdownId,
178
- 'aria-labelledby': this.toggleLabelledBy
243
+ 'aria-expanded': String(this.visible),
244
+ 'aria-haspopup': this.ariaHaspopup,
245
+ 'aria-labelledby': this.toggleLabelledBy,
246
+ 'aria-activedescendant': this.ariaActiveDescendant
179
247
  };
180
248
  },
181
249
  toggleButtonClasses() {
@@ -191,10 +259,28 @@ var script = {
191
259
  return this.block ? 'gl-w-full' : '';
192
260
  },
193
261
  toggleLabelledBy() {
262
+ if (this.isToggleCombobox) {
263
+ if (this.ariaLabelledby) {
264
+ return `${this.ariaLabelledby} ${this.toggleId}`;
265
+ }
266
+ return this.toggleId;
267
+ }
268
+
269
+ // For non-combobox toggles, combine IDs or use the button's own text
194
270
  return this.ariaLabelledby ? `${this.ariaLabelledby} ${this.toggleId}` : undefined;
195
271
  },
196
- isDefaultToggle() {
197
- return !this.$scopedSlots.toggle;
272
+ toggleRole() {
273
+ if (this.isToggleCombobox) {
274
+ return 'combobox';
275
+ }
276
+ return undefined;
277
+ },
278
+ toggleAccessibilityAttributes() {
279
+ return {
280
+ ...this.toggleAriaAttributes,
281
+ id: this.toggleId,
282
+ role: this.toggleRole
283
+ };
198
284
  },
199
285
  toggleOptions() {
200
286
  if (this.isDefaultToggle) {
@@ -209,7 +295,8 @@ var script = {
209
295
  disabled: this.disabled,
210
296
  loading: this.loading,
211
297
  class: this.toggleButtonClasses,
212
- ...this.ariaAttributes,
298
+ role: this.toggleRole,
299
+ ...this.toggleAriaAttributes,
213
300
  listeners: {
214
301
  keydown: event => this.onKeydown(event),
215
302
  click: event => this.toggle(event)
@@ -287,18 +374,6 @@ var script = {
287
374
  };
288
375
  }
289
376
  },
290
- watch: {
291
- ariaAttributes: {
292
- deep: true,
293
- handler(ariaAttributes) {
294
- if (this.$scopedSlots.toggle) {
295
- Object.keys(ariaAttributes).forEach(key => {
296
- this.toggleElement.setAttribute(key, ariaAttributes[key]);
297
- });
298
- }
299
- }
300
- }
301
- },
302
377
  mounted() {
303
378
  this.checkToggleFocusable();
304
379
  },
@@ -538,7 +613,7 @@ var script = {
538
613
  const __vue_script__ = script;
539
614
 
540
615
  /* template */
541
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:[_vm.$options.BASE_DROPDOWN_CLASS, { '!gl-block': _vm.block }]},[_c(_vm.toggleComponent,_vm._g(_vm._b({ref:"toggle",tag:"component",attrs:{"id":_vm.toggleId,"data-testid":"base-dropdown-toggle"}},'component',_vm.toggleAttributes,false),_vm.toggleListeners),[_vm._t("toggle",function(){return [_c('span',{staticClass:"gl-new-dropdown-button-text",class:{ 'gl-sr-only': _vm.textSrOnly }},[_vm._v("\n "+_vm._s(_vm.toggleText)+"\n ")]),_vm._v(" "),(!_vm.noCaret)?_c('gl-icon',{staticClass:"gl-button-icon gl-new-dropdown-chevron",attrs:{"name":"chevron-down"}}):_vm._e()]})],2),_vm._v(" "),_c('dropdown-container',{attrs:{"positioning-strategy":_vm.positioningStrategy}},[_c('div',{directives:[{name:"outside",rawName:"v-outside.click.focusin",value:(_vm.handleClickOutside),expression:"handleClickOutside",modifiers:{"click":true,"focusin":true}}],ref:"dropdownContainer",class:_vm.$options.DROPDOWN_CONTAINER_CLASS},[_c('div',{ref:"content",staticClass:"gl-new-dropdown-panel",class:_vm.panelClasses,attrs:{"id":_vm.baseDropdownId,"data-testid":"base-dropdown-menu"},on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"esc",27,$event.key,["Esc","Escape"])){ return null; }$event.stopPropagation();$event.preventDefault();return _vm.closeAndFocus.apply(null, arguments)}}},[_c('div',{ref:"dropdownArrow",staticClass:"gl-new-dropdown-arrow"}),_vm._v(" "),_c('div',{staticClass:"gl-new-dropdown-inner"},[_vm._t("default",null,{"visible":_vm.visible})],2)])])])],1)};
616
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:[_vm.$options.BASE_DROPDOWN_CLASS, { '!gl-block': _vm.block }]},[_c(_vm.toggleComponent,_vm._g(_vm._b({ref:"toggle",tag:"component",attrs:{"id":_vm.computedToggleId,"data-testid":"base-dropdown-toggle"}},'component',_vm.toggleAttributes,false),_vm.toggleListeners),[_vm._t("toggle",function(){return [_c('span',{staticClass:"gl-new-dropdown-button-text",class:{ 'gl-sr-only': _vm.textSrOnly },attrs:{"id":_vm.computedToggleInnerId,"data-testid":"base-dropdown-span"}},[_vm._v("\n "+_vm._s(_vm.toggleText)+"\n ")]),_vm._v(" "),(!_vm.noCaret)?_c('gl-icon',{staticClass:"gl-button-icon gl-new-dropdown-chevron",attrs:{"name":"chevron-down"}}):_vm._e()]},{"accessibilityAttributes":_vm.toggleAccessibilityAttributes})],2),_vm._v(" "),_c('dropdown-container',{attrs:{"positioning-strategy":_vm.positioningStrategy}},[_c('div',{directives:[{name:"outside",rawName:"v-outside.click.focusin",value:(_vm.handleClickOutside),expression:"handleClickOutside",modifiers:{"click":true,"focusin":true}}],ref:"dropdownContainer",class:_vm.$options.DROPDOWN_CONTAINER_CLASS},[_c('div',{ref:"content",staticClass:"gl-new-dropdown-panel",class:_vm.panelClasses,attrs:{"id":_vm.baseDropdownId,"data-testid":"base-dropdown-menu"},on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"esc",27,$event.key,["Esc","Escape"])){ return null; }$event.stopPropagation();$event.preventDefault();return _vm.closeAndFocus.apply(null, arguments)}}},[_c('div',{ref:"dropdownArrow",staticClass:"gl-new-dropdown-arrow"}),_vm._v(" "),_c('div',{staticClass:"gl-new-dropdown-inner"},[_vm._t("default",null,{"visible":_vm.visible})],2)])])])],1)};
542
617
  var __vue_staticRenderFns__ = [];
543
618
 
544
619
  /* style */
@@ -346,7 +346,7 @@ var script = {
346
346
  const __vue_script__ = script;
347
347
 
348
348
  /* template */
349
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-base-dropdown',{ref:"baseDropdown",staticClass:"gl-disclosure-dropdown",attrs:{"aria-labelledby":_vm.toggleAriaLabelledBy,"arrow-element":_vm.$refs.disclosureArrow,"toggle-id":_vm.toggleId,"toggle-text":_vm.toggleText,"toggle-class":_vm.toggleClass,"text-sr-only":_vm.textSrOnly,"category":_vm.category,"variant":_vm.variant,"size":_vm.size,"icon":_vm.icon,"disabled":_vm.disabled,"loading":_vm.loading,"no-caret":_vm.noCaret,"placement":_vm.placement,"block":_vm.block,"offset":_vm.dropdownOffset,"fluid-width":_vm.fluidWidth,"positioning-strategy":_vm.positioningStrategy},on:_vm._d({},[_vm.$options.events.GL_DROPDOWN_SHOWN,_vm.onShow,_vm.$options.events.GL_DROPDOWN_HIDDEN,_vm.onHide,_vm.$options.events.GL_DROPDOWN_BEFORE_CLOSE,_vm.onBeforeClose,_vm.$options.events.GL_DROPDOWN_FOCUS_CONTENT,_vm.onKeydown]),scopedSlots:_vm._u([(_vm.hasCustomToggle)?{key:"toggle",fn:function(){return [_vm._t("toggle")]},proxy:true}:null],null,true)},[_vm._v(" "),_vm._t("header"),_vm._v(" "),_c(_vm.disclosureTag,{ref:"content",tag:"component",class:_vm.$options.GL_DROPDOWN_CONTENTS_CLASS,attrs:{"id":_vm.disclosureId,"aria-labelledby":_vm.listAriaLabelledBy || _vm.toggleId,"data-testid":"disclosure-content","tabindex":"-1"},on:{"keydown":_vm.onKeydown,"click":_vm.handleAutoClose}},[_vm._t("default",function(){return [_vm._l((_vm.items),function(item,index){return [(_vm.isItem(item))?[_c('gl-disclosure-dropdown-item',{key:_vm.uniqueItemId(),attrs:{"item":item},on:{"action":_vm.handleAction},scopedSlots:_vm._u([('list-item' in _vm.$scopedSlots)?{key:"list-item",fn:function(){return [_vm._t("list-item",null,{"item":item})]},proxy:true}:null],null,true)})]:[_c('gl-disclosure-dropdown-group',{key:item.name,attrs:{"bordered":index !== 0,"group":item},on:{"action":_vm.handleAction},scopedSlots:_vm._u([(_vm.$scopedSlots['group-label'])?{key:"group-label",fn:function(){return [_vm._t("group-label",null,{"group":item})]},proxy:true}:null,(_vm.$scopedSlots['list-item'])?{key:"default",fn:function(){return _vm._l((item.items),function(groupItem){return _c('gl-disclosure-dropdown-item',{key:_vm.uniqueItemId(),attrs:{"item":groupItem},on:{"action":_vm.handleAction},scopedSlots:_vm._u([{key:"list-item",fn:function(){return [_vm._t("list-item",null,{"item":groupItem})]},proxy:true}],null,true)})})},proxy:true}:null],null,true)})]]})]})],2),_vm._v(" "),_vm._t("footer")],2)};
349
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-base-dropdown',{ref:"baseDropdown",staticClass:"gl-disclosure-dropdown",attrs:{"aria-labelledby":_vm.toggleAriaLabelledBy,"arrow-element":_vm.$refs.disclosureArrow,"toggle-id":_vm.toggleId,"toggle-text":_vm.toggleText,"toggle-class":_vm.toggleClass,"text-sr-only":_vm.textSrOnly,"category":_vm.category,"variant":_vm.variant,"size":_vm.size,"icon":_vm.icon,"disabled":_vm.disabled,"loading":_vm.loading,"no-caret":_vm.noCaret,"placement":_vm.placement,"block":_vm.block,"offset":_vm.dropdownOffset,"fluid-width":_vm.fluidWidth,"positioning-strategy":_vm.positioningStrategy,"is-disclosure":""},on:_vm._d({},[_vm.$options.events.GL_DROPDOWN_SHOWN,_vm.onShow,_vm.$options.events.GL_DROPDOWN_HIDDEN,_vm.onHide,_vm.$options.events.GL_DROPDOWN_BEFORE_CLOSE,_vm.onBeforeClose,_vm.$options.events.GL_DROPDOWN_FOCUS_CONTENT,_vm.onKeydown]),scopedSlots:_vm._u([(_vm.hasCustomToggle)?{key:"toggle",fn:function(slotProps){return [_vm._t("toggle",null,null,slotProps)]}}:null],null,true)},[_vm._v(" "),_vm._t("header"),_vm._v(" "),_c(_vm.disclosureTag,{ref:"content",tag:"component",class:_vm.$options.GL_DROPDOWN_CONTENTS_CLASS,attrs:{"id":_vm.disclosureId,"aria-labelledby":_vm.listAriaLabelledBy || _vm.toggleId,"data-testid":"disclosure-content","tabindex":"-1"},on:{"keydown":_vm.onKeydown,"click":_vm.handleAutoClose}},[_vm._t("default",function(){return [_vm._l((_vm.items),function(item,index){return [(_vm.isItem(item))?[_c('gl-disclosure-dropdown-item',{key:_vm.uniqueItemId(),attrs:{"item":item},on:{"action":_vm.handleAction},scopedSlots:_vm._u([('list-item' in _vm.$scopedSlots)?{key:"list-item",fn:function(){return [_vm._t("list-item",null,{"item":item})]},proxy:true}:null],null,true)})]:[_c('gl-disclosure-dropdown-group',{key:item.name,attrs:{"bordered":index !== 0,"group":item},on:{"action":_vm.handleAction},scopedSlots:_vm._u([(_vm.$scopedSlots['group-label'])?{key:"group-label",fn:function(){return [_vm._t("group-label",null,{"group":item})]},proxy:true}:null,(_vm.$scopedSlots['list-item'])?{key:"default",fn:function(){return _vm._l((item.items),function(groupItem){return _c('gl-disclosure-dropdown-item',{key:_vm.uniqueItemId(),attrs:{"item":groupItem},on:{"action":_vm.handleAction},scopedSlots:_vm._u([{key:"list-item",fn:function(){return [_vm._t("list-item",null,{"item":groupItem})]},proxy:true}],null,true)})})},proxy:true}:null],null,true)})]]})]})],2),_vm._v(" "),_vm._t("footer")],2)};
350
350
  var __vue_staticRenderFns__ = [];
351
351
 
352
352
  /* style */
@@ -1,7 +1,7 @@
1
1
  import clamp from 'lodash/clamp';
2
2
  import uniqueId from 'lodash/uniqueId';
3
3
  import { logWarning, stopEvent } from '../../../../utils/utils';
4
- import { GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, POSITION_ABSOLUTE, POSITION_FIXED, GL_DROPDOWN_CONTENTS_CLASS, ARROW_UP, ENTER, ARROW_DOWN, END, HOME } from '../constants';
4
+ import { GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, GL_DROPDOWN_FOCUS_CONTENT, POSITION_ABSOLUTE, POSITION_FIXED, GL_DROPDOWN_CONTENTS_CLASS, ARROW_UP, ENTER, ARROW_DOWN, END, HOME } from '../constants';
5
5
  import { buttonCategoryOptions, dropdownVariantOptions, buttonSizeOptions, dropdownPlacements } from '../../../../utils/constants';
6
6
  import GlButton from '../../button/button';
7
7
  import GlLoadingIcon from '../../loading_icon/loading_icon';
@@ -25,7 +25,8 @@ var script = {
25
25
  HEADER_ITEMS_BORDER_CLASSES,
26
26
  events: {
27
27
  GL_DROPDOWN_SHOWN,
28
- GL_DROPDOWN_HIDDEN
28
+ GL_DROPDOWN_HIDDEN,
29
+ GL_DROPDOWN_FOCUS_CONTENT
29
30
  },
30
31
  components: {
31
32
  GlBaseDropdown,
@@ -37,6 +38,11 @@ var script = {
37
38
  GlLoadingIcon,
38
39
  GlIntersectionObserver
39
40
  },
41
+ inject: {
42
+ isInFormGroup: {
43
+ default: false
44
+ }
45
+ },
40
46
  model: {
41
47
  prop: 'selected',
42
48
  event: 'select'
@@ -184,7 +190,7 @@ var script = {
184
190
  },
185
191
  /**
186
192
  * The `aria-labelledby` attribute value for the toggle button
187
- * Provide the string of ids seperated by space
193
+ * Provide the string of IDs seperated by space
188
194
  */
189
195
  toggleAriaLabelledBy: {
190
196
  type: String,
@@ -193,7 +199,7 @@ var script = {
193
199
  },
194
200
  /**
195
201
  * The `aria-labelledby` attribute value for the list of options
196
- * Provide the string of ids seperated by space
202
+ * Provide the string of IDs seperated by space
197
203
  */
198
204
  listAriaLabelledBy: {
199
205
  type: String,
@@ -351,15 +357,42 @@ var script = {
351
357
  };
352
358
  },
353
359
  computed: {
354
- ariaLabelledByID() {
355
- if (this.searchable) {
356
- return this.searchInputId;
357
- }
360
+ /**
361
+ * Determines the `aria-labelledby` attribute value for the listbox by
362
+ * evaluating a series of conditions in priority order. The returned ID
363
+ * references the element that best describes the listbox content, with
364
+ * preference given to headers in searchable lists, followed by search
365
+ * input, form labels, and finally fallback options.
366
+ */
367
+ listboxAriaLabelledByID() {
368
+ // Listbox is labelled by closest heading, creating a meaningful relationship
369
+ if (this.headerId && this.searchable) return `${this.headerId}`;
370
+
371
+ // Listbox is labelled by the search input with role="combobox"
372
+ if (this.searchable) return this.searchInputId;
373
+
374
+ // Listbox is labelledy by the text inside an externally labelled button
375
+ if (this.isInFormGroup) return this.listboxIdComputed;
376
+
377
+ // Fallback. Return a header ID or the toggle button ID.
358
378
  return this.listAriaLabelledBy || this.headerId || this.toggleIdComputed;
359
379
  },
360
380
  toggleIdComputed() {
361
381
  return this.toggleId || uniqueId('dropdown-toggle-btn-');
362
382
  },
383
+ // Generate a custom listbox ID when inside GlFormGroup
384
+ listboxIdComputed() {
385
+ if (this.isInFormGroup) {
386
+ if (this.listAriaLabelledBy) {
387
+ return this.listAriaLabelledBy;
388
+ }
389
+ if (this.toggleId) {
390
+ return `${this.toggleId}-span`;
391
+ }
392
+ return uniqueId('dropdown-toggle-span-');
393
+ }
394
+ return undefined;
395
+ },
363
396
  listboxTag() {
364
397
  if (!this.hasItems || isOption(this.items[0])) return 'ul';
365
398
  return 'div';
@@ -567,6 +600,10 @@ var script = {
567
600
  (_this$scrollObserver = this.scrollObserver) === null || _this$scrollObserver === void 0 ? void 0 : _this$scrollObserver.disconnect();
568
601
  },
569
602
  methods: {
603
+ onFocusContent(event) {
604
+ event.preventDefault();
605
+ this.open();
606
+ },
570
607
  open() {
571
608
  this.$refs.baseDropdown.open();
572
609
  },
@@ -874,9 +911,9 @@ var script = {
874
911
  const __vue_script__ = script;
875
912
 
876
913
  /* template */
877
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-base-dropdown',{ref:"baseDropdown",attrs:{"aria-haspopup":"listbox","aria-labelledby":_vm.toggleAriaLabelledBy,"block":_vm.block,"toggle-id":_vm.toggleIdComputed,"toggle-text":_vm.listboxToggleText,"toggle-class":_vm.toggleButtonClasses,"text-sr-only":_vm.textSrOnly,"category":_vm.category,"variant":_vm.variant,"size":_vm.size,"icon":_vm.icon,"disabled":_vm.disabled,"loading":_vm.loading,"no-caret":_vm.noCaret,"placement":_vm.placement,"offset":_vm.dropdownOffset,"fluid-width":_vm.fluidWidth,"positioning-strategy":_vm.positioningStrategy},on:_vm._d({},[_vm.$options.events.GL_DROPDOWN_SHOWN,_vm.onShow,_vm.$options.events.GL_DROPDOWN_HIDDEN,_vm.onHide]),scopedSlots:_vm._u([(_vm.hasCustomToggle)?{key:"toggle",fn:function(){return [_vm._t("toggle")]},proxy:true}:null,{key:"default",fn:function(ref){
914
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-base-dropdown',{ref:"baseDropdown",attrs:{"aria-haspopup":"listbox","active-item-id":_vm.activeItemId,"aria-labelledby":_vm.toggleAriaLabelledBy,"block":_vm.block,"has-searchable-listbox":_vm.searchable,"has-external-label":_vm.isInFormGroup,"listbox-id":_vm.listboxIdComputed,"toggle-id":_vm.toggleIdComputed,"toggle-text":_vm.listboxToggleText,"toggle-class":_vm.toggleButtonClasses,"text-sr-only":_vm.textSrOnly,"category":_vm.category,"variant":_vm.variant,"size":_vm.size,"icon":_vm.icon,"disabled":_vm.disabled,"loading":_vm.loading,"no-caret":_vm.noCaret,"placement":_vm.placement,"offset":_vm.dropdownOffset,"fluid-width":_vm.fluidWidth,"positioning-strategy":_vm.positioningStrategy},on:_vm._d({},[_vm.$options.events.GL_DROPDOWN_FOCUS_CONTENT,_vm.onFocusContent,_vm.$options.events.GL_DROPDOWN_SHOWN,_vm.onShow,_vm.$options.events.GL_DROPDOWN_HIDDEN,_vm.onHide]),scopedSlots:_vm._u([(_vm.hasCustomToggle)?{key:"toggle",fn:function(slotProps){return [_vm._t("toggle",null,null,slotProps)]}}:null,{key:"default",fn:function(ref){
878
915
  var visible = ref.visible;
879
- return [(_vm.headerText)?_c('div',{staticClass:"gl-flex gl-min-h-8 gl-items-center !gl-p-4",class:_vm.$options.HEADER_ITEMS_BORDER_CLASSES},[_c('div',{staticClass:"gl-grow gl-pr-2 gl-text-sm gl-font-bold gl-text-strong",attrs:{"id":_vm.headerId,"data-testid":"listbox-header-text"}},[_vm._v("\n "+_vm._s(_vm.headerText)+"\n ")]),_vm._v(" "),(_vm.showResetButton)?_c('gl-button',{staticClass:"!gl-m-0 !gl-w-auto gl-max-w-1/2 gl-flex-shrink-0 gl-text-ellipsis !gl-px-2 !gl-text-sm focus:!gl-focus-inset",attrs:{"category":"tertiary","size":"small","data-testid":"listbox-reset-button"},on:{"click":_vm.onResetButtonClicked}},[_vm._v("\n "+_vm._s(_vm.resetButtonLabel)+"\n ")]):_vm._e(),_vm._v(" "),(_vm.showSelectAllButton)?_c('gl-button',{staticClass:"!gl-m-0 !gl-w-auto gl-max-w-1/2 gl-flex-shrink-0 gl-text-ellipsis !gl-px-2 !gl-text-sm focus:!gl-focus-inset",attrs:{"category":"tertiary","size":"small","data-testid":"listbox-select-all-button"},on:{"click":_vm.onSelectAllButtonClicked}},[_vm._v("\n "+_vm._s(_vm.showSelectAllButtonLabel)+"\n ")]):_vm._e()],1):_vm._e(),_vm._v(" "),(_vm.searchable)?_c('div',{class:_vm.$options.HEADER_ITEMS_BORDER_CLASSES},[_c('gl-listbox-search-input',{ref:"searchBox",class:{ 'gl-listbox-topmost': !_vm.headerText },attrs:{"id":_vm.searchInputId,"data-testid":"listbox-search-input","role":"combobox","aria-expanded":String(visible),"aria-controls":_vm.listboxId,"aria-activedescendant":_vm.activeItemId,"aria-haspopup":"listbox","placeholder":_vm.searchPlaceholder},on:{"input":_vm.search,"keydown":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }$event.preventDefault();},_vm.onKeydown]},model:{value:(_vm.searchStr),callback:function ($$v) {_vm.searchStr=$$v;},expression:"searchStr"}}),_vm._v(" "),(_vm.searching)?_c('gl-loading-icon',{staticClass:"gl-my-3",attrs:{"data-testid":"listbox-search-loader","size":"md"}}):_vm._e()],1):_vm._e(),_vm._v(" "),(_vm.showList)?_c(_vm.listboxTag,{ref:"list",tag:"component",staticClass:"gl-new-dropdown-contents gl-new-dropdown-contents-with-scrim-overlay",class:_vm.listboxClasses,attrs:{"id":_vm.listboxId,"aria-busy":_vm.isBusy,"aria-labelledby":_vm.ariaLabelledByID,"aria-multiselectable":_vm.multiple ? 'true' : undefined,"role":"listbox","tabindex":"0"},on:{"keydown":_vm.onKeydown}},[_c(_vm.itemTag,{tag:"component",staticClass:"top-scrim-wrapper",attrs:{"aria-hidden":"true","data-testid":"top-scrim"}},[_c('div',{staticClass:"top-scrim",class:{ 'top-scrim-light': !_vm.hasHeader, 'top-scrim-dark': _vm.hasHeader }})]),_vm._v(" "),_c(_vm.itemTag,{ref:"top-boundary",tag:"component",attrs:{"aria-hidden":"true"}}),_vm._v(" "),_vm._l((_vm.items),function(item,index){return [(_vm.isOption(item))?[_c('gl-listbox-item',_vm._b({key:_vm.listboxItemKey(item),attrs:{"id":_vm.generateItemId(item),"data-testid":("listbox-item-" + (item.value)),"is-highlighted":_vm.isHighlighted(item),"is-selected":_vm.isSelected(item),"is-focused":_vm.isFocused(item),"is-check-centered":_vm.isCheckCentered},on:{"select":function($event){return _vm.onSelect(item, $event)}}},'gl-listbox-item',_vm.listboxItemMoreItemsAriaAttributes(index),false),[_vm._t("list-item",function(){return [_vm._v("\n "+_vm._s(item.text)+"\n ")]},{"item":item})],2)]:[_c('gl-listbox-group',{key:item.text,class:_vm.groupClasses(index),attrs:{"name":item.text,"text-sr-only":item.textSrOnly},scopedSlots:_vm._u([(_vm.$scopedSlots['group-label'])?{key:"group-label",fn:function(){return [_vm._t("group-label",null,{"group":item})]},proxy:true}:null],null,true)},[_vm._v(" "),_vm._l((item.options),function(option){return _c('gl-listbox-item',{key:_vm.listboxItemKey(option),attrs:{"id":_vm.generateItemId(option),"data-testid":("listbox-item-" + (option.value)),"is-highlighted":_vm.isHighlighted(option),"is-selected":_vm.isSelected(option),"is-focused":_vm.isFocused(option),"is-check-centered":_vm.isCheckCentered},on:{"select":function($event){return _vm.onSelect(option, $event)}}},[_vm._t("list-item",function(){return [_vm._v("\n "+_vm._s(option.text)+"\n ")]},{"item":option})],2)})],2)]]}),_vm._v(" "),(_vm.infiniteScrollLoading)?_c(_vm.itemTag,{tag:"component"},[_c('gl-loading-icon',{staticClass:"gl-my-3",attrs:{"data-testid":"listbox-infinite-scroll-loader","size":"md"}})],1):_vm._e(),_vm._v(" "),(_vm.showIntersectionObserver)?_c('gl-intersection-observer',{on:{"appear":_vm.onIntersectionObserverAppear}}):_vm._e(),_vm._v(" "),_c(_vm.itemTag,{ref:"bottom-boundary",tag:"component",attrs:{"aria-hidden":"true"}}),_vm._v(" "),_c(_vm.itemTag,{tag:"component",staticClass:"bottom-scrim-wrapper",attrs:{"aria-hidden":"true","data-testid":"bottom-scrim"}},[_c('div',{staticClass:"bottom-scrim",class:{ '!gl-rounded-none': _vm.hasFooter }})])],2):_vm._e(),_vm._v(" "),(_vm.announceSRSearchResults)?_c('span',{staticClass:"gl-sr-only",attrs:{"data-testid":"listbox-number-of-results","aria-live":"assertive"}},[_vm._t("search-summary-sr-only",function(){return [_vm._v("\n "+_vm._s(_vm.srOnlyResultsLabel(_vm.flattenedOptions.length))+"\n ")]})],2):_vm._e(),_vm._v(" "),(_vm.isBusy)?_c('span',{staticClass:"gl-sr-only",attrs:{"aria-live":"polite","data-testid":"listbox-loading-announcement"}},[_vm._v("\n "+_vm._s(_vm.loadingAnnouncementText)+"\n ")]):(_vm.showNoResultsText)?_c('div',{staticClass:"gl-py-3 gl-pl-7 gl-pr-5 gl-text-base gl-text-subtle",attrs:{"aria-live":"assertive","data-testid":"listbox-no-results-text"}},[_vm._v("\n "+_vm._s(_vm.noResultsText)+"\n ")]):_vm._e(),_vm._v(" "),_vm._t("footer")]}}],null,true)})};
916
+ return [(_vm.headerText)?_c('div',{staticClass:"gl-flex gl-min-h-8 gl-items-center !gl-p-4",class:_vm.$options.HEADER_ITEMS_BORDER_CLASSES},[_c('div',{staticClass:"gl-grow gl-pr-2 gl-text-sm gl-font-bold gl-text-strong",attrs:{"id":_vm.headerId,"data-testid":"listbox-header-text"}},[_vm._v("\n "+_vm._s(_vm.headerText)+"\n ")]),_vm._v(" "),(_vm.showResetButton)?_c('gl-button',{staticClass:"!gl-m-0 !gl-w-auto gl-max-w-1/2 gl-flex-shrink-0 gl-text-ellipsis !gl-px-2 !gl-text-sm focus:!gl-focus-inset",attrs:{"category":"tertiary","size":"small","data-testid":"listbox-reset-button"},on:{"click":_vm.onResetButtonClicked}},[_vm._v("\n "+_vm._s(_vm.resetButtonLabel)+"\n ")]):_vm._e(),_vm._v(" "),(_vm.showSelectAllButton)?_c('gl-button',{staticClass:"!gl-m-0 !gl-w-auto gl-max-w-1/2 gl-flex-shrink-0 gl-text-ellipsis !gl-px-2 !gl-text-sm focus:!gl-focus-inset",attrs:{"category":"tertiary","size":"small","data-testid":"listbox-select-all-button"},on:{"click":_vm.onSelectAllButtonClicked}},[_vm._v("\n "+_vm._s(_vm.showSelectAllButtonLabel)+"\n ")]):_vm._e()],1):_vm._e(),_vm._v(" "),(_vm.searchable)?_c('div',{class:_vm.$options.HEADER_ITEMS_BORDER_CLASSES},[_c('gl-listbox-search-input',{ref:"searchBox",class:{ 'gl-listbox-topmost': !_vm.headerText },attrs:{"id":_vm.searchInputId,"data-testid":"listbox-search-input","role":"combobox","aria-expanded":String(visible),"aria-controls":_vm.listboxId,"aria-activedescendant":_vm.activeItemId,"aria-haspopup":"listbox","placeholder":_vm.searchPlaceholder},on:{"input":_vm.search,"keydown":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }$event.preventDefault();},_vm.onKeydown]},model:{value:(_vm.searchStr),callback:function ($$v) {_vm.searchStr=$$v;},expression:"searchStr"}}),_vm._v(" "),(_vm.searching)?_c('gl-loading-icon',{staticClass:"gl-my-3",attrs:{"data-testid":"listbox-search-loader","size":"md"}}):_vm._e()],1):_vm._e(),_vm._v(" "),(_vm.showList)?_c(_vm.listboxTag,{ref:"list",tag:"component",staticClass:"gl-new-dropdown-contents gl-new-dropdown-contents-with-scrim-overlay",class:_vm.listboxClasses,attrs:{"id":_vm.listboxId,"aria-busy":_vm.isBusy,"aria-labelledby":_vm.listboxAriaLabelledByID,"aria-multiselectable":_vm.multiple ? 'true' : undefined,"role":"listbox","tabindex":"0"},on:{"keydown":_vm.onKeydown}},[_c(_vm.itemTag,{tag:"component",staticClass:"top-scrim-wrapper",attrs:{"aria-hidden":"true","data-testid":"top-scrim"}},[_c('div',{staticClass:"top-scrim",class:{ 'top-scrim-light': !_vm.hasHeader, 'top-scrim-dark': _vm.hasHeader }})]),_vm._v(" "),_c(_vm.itemTag,{ref:"top-boundary",tag:"component",attrs:{"aria-hidden":"true"}}),_vm._v(" "),_vm._l((_vm.items),function(item,index){return [(_vm.isOption(item))?[_c('gl-listbox-item',_vm._b({key:_vm.listboxItemKey(item),attrs:{"id":_vm.generateItemId(item),"data-testid":("listbox-item-" + (item.value)),"is-highlighted":_vm.isHighlighted(item),"is-selected":_vm.isSelected(item),"is-focused":_vm.isFocused(item),"is-check-centered":_vm.isCheckCentered},on:{"select":function($event){return _vm.onSelect(item, $event)}}},'gl-listbox-item',_vm.listboxItemMoreItemsAriaAttributes(index),false),[_vm._t("list-item",function(){return [_vm._v("\n "+_vm._s(item.text)+"\n ")]},{"item":item})],2)]:[_c('gl-listbox-group',{key:item.text,class:_vm.groupClasses(index),attrs:{"name":item.text,"text-sr-only":item.textSrOnly},scopedSlots:_vm._u([(_vm.$scopedSlots['group-label'])?{key:"group-label",fn:function(){return [_vm._t("group-label",null,{"group":item})]},proxy:true}:null],null,true)},[_vm._v(" "),_vm._l((item.options),function(option){return _c('gl-listbox-item',{key:_vm.listboxItemKey(option),attrs:{"id":_vm.generateItemId(option),"data-testid":("listbox-item-" + (option.value)),"is-highlighted":_vm.isHighlighted(option),"is-selected":_vm.isSelected(option),"is-focused":_vm.isFocused(option),"is-check-centered":_vm.isCheckCentered},on:{"select":function($event){return _vm.onSelect(option, $event)}}},[_vm._t("list-item",function(){return [_vm._v("\n "+_vm._s(option.text)+"\n ")]},{"item":option})],2)})],2)]]}),_vm._v(" "),(_vm.infiniteScrollLoading)?_c(_vm.itemTag,{tag:"component"},[_c('gl-loading-icon',{staticClass:"gl-my-3",attrs:{"data-testid":"listbox-infinite-scroll-loader","size":"md"}})],1):_vm._e(),_vm._v(" "),(_vm.showIntersectionObserver)?_c('gl-intersection-observer',{on:{"appear":_vm.onIntersectionObserverAppear}}):_vm._e(),_vm._v(" "),_c(_vm.itemTag,{ref:"bottom-boundary",tag:"component",attrs:{"aria-hidden":"true"}}),_vm._v(" "),_c(_vm.itemTag,{tag:"component",staticClass:"bottom-scrim-wrapper",attrs:{"aria-hidden":"true","data-testid":"bottom-scrim"}},[_c('div',{staticClass:"bottom-scrim",class:{ '!gl-rounded-none': _vm.hasFooter }})])],2):_vm._e(),_vm._v(" "),(_vm.announceSRSearchResults)?_c('span',{staticClass:"gl-sr-only",attrs:{"data-testid":"listbox-number-of-results","aria-live":"assertive"}},[_vm._t("search-summary-sr-only",function(){return [_vm._v("\n "+_vm._s(_vm.srOnlyResultsLabel(_vm.flattenedOptions.length))+"\n ")]})],2):_vm._e(),_vm._v(" "),(_vm.isBusy)?_c('span',{staticClass:"gl-sr-only",attrs:{"aria-live":"polite","data-testid":"listbox-loading-announcement"}},[_vm._v("\n "+_vm._s(_vm.loadingAnnouncementText)+"\n ")]):(_vm.showNoResultsText)?_c('div',{staticClass:"gl-py-3 gl-pl-7 gl-pr-5 gl-text-base gl-text-subtle",attrs:{"aria-live":"assertive","data-testid":"listbox-no-results-text"}},[_vm._v("\n "+_vm._s(_vm.noResultsText)+"\n ")]):_vm._e(),_vm._v(" "),_vm._t("footer")]}}],null,true)})};
880
917
  var __vue_staticRenderFns__ = [];
881
918
 
882
919
  /* style */
@@ -7,7 +7,8 @@ const DEFAULT_OPTIONS = {
7
7
  autoHideDelay: 5000,
8
8
  toastClass: 'gl-toast',
9
9
  isStatus: true,
10
- toaster: 'b-toaster-bottom-left'
10
+ toaster: 'b-toaster-bottom-left',
11
+ appendToast: true
11
12
  };
12
13
  let toastsCount = 0;
13
14
  function renderTitle(h, toast, options) {