@gitlab/ui 52.10.0 → 52.12.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 (39) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +23 -5
  3. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +291 -0
  4. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.js +90 -0
  5. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.js +107 -0
  6. package/dist/components/base/new_dropdowns/disclosure/mock_data.js +128 -0
  7. package/dist/components/base/new_dropdowns/disclosure/utils.js +15 -0
  8. package/dist/components/base/new_dropdowns/listbox/listbox.js +4 -4
  9. package/dist/components/base/new_dropdowns/listbox/listbox_group.js +1 -1
  10. package/dist/components/base/new_dropdowns/listbox/listbox_item.js +1 -1
  11. package/dist/components/regions/empty_state/empty_state.js +12 -1
  12. package/dist/index.css +2 -2
  13. package/dist/index.css.map +1 -1
  14. package/dist/index.js +3 -0
  15. package/package.json +3 -3
  16. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.spec.js +3 -3
  17. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.vue +21 -3
  18. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.md +114 -0
  19. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.scss +7 -0
  20. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.spec.js +210 -0
  21. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.stories.js +306 -0
  22. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.vue +342 -0
  23. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.spec.js +82 -0
  24. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.vue +77 -0
  25. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.spec.js +94 -0
  26. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.vue +98 -0
  27. package/src/components/base/new_dropdowns/disclosure/mock_data.js +156 -0
  28. package/src/components/base/new_dropdowns/disclosure/utils.js +18 -0
  29. package/src/components/base/new_dropdowns/disclosure/utils.spec.js +73 -0
  30. package/src/components/base/new_dropdowns/dropdown.scss +6 -0
  31. package/src/components/base/new_dropdowns/listbox/listbox.scss +0 -6
  32. package/src/components/base/new_dropdowns/listbox/listbox.vue +4 -4
  33. package/src/components/base/new_dropdowns/listbox/listbox_group.vue +1 -1
  34. package/src/components/base/new_dropdowns/listbox/listbox_item.vue +1 -1
  35. package/src/components/regions/empty_state/empty_state.spec.js +35 -0
  36. package/src/components/regions/empty_state/empty_state.stories.js +5 -0
  37. package/src/components/regions/empty_state/empty_state.vue +15 -1
  38. package/src/index.js +3 -0
  39. package/src/scss/components.scss +2 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [52.12.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v52.11.0...v52.12.0) (2023-01-17)
2
+
3
+
4
+ ### Features
5
+
6
+ * **GlEmptyState:** Add content-class prop ([7f850d7](https://gitlab.com/gitlab-org/gitlab-ui/commit/7f850d7661ffcb6a2db1cccfaca87cd7d794e01b))
7
+
8
+ # [52.11.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v52.10.0...v52.11.0) (2023-01-16)
9
+
10
+
11
+ ### Features
12
+
13
+ * **GlDisclosureDropdown:** Add GlDisclosureDropdown component ([e9bca59](https://gitlab.com/gitlab-org/gitlab-ui/commit/e9bca595b591846e892991611ea92f51fd4db055))
14
+
1
15
  # [52.10.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v52.9.3...v52.10.0) (2023-01-10)
2
16
 
3
17
 
@@ -1,6 +1,7 @@
1
+ import _uniqueId from 'lodash/uniqueId';
1
2
  import { createPopper } from '@popperjs/core';
2
3
  import { buttonCategoryOptions, dropdownVariantOptions, buttonSizeOptions } from '../../../../utils/constants';
3
- import { POPPER_CONFIG, GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN } from '../constants';
4
+ import { POPPER_CONFIG, GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, ENTER, SPACE } from '../constants';
4
5
  import GlButton from '../../button/button';
5
6
  import GlIcon from '../../icon/icon';
6
7
  import { OutsideDirective } from '../../../../directives/outside/outside';
@@ -103,7 +104,8 @@ var script = {
103
104
  },
104
105
  data() {
105
106
  return {
106
- visible: false
107
+ visible: false,
108
+ baseDropdownId: _uniqueId('base-dropdown-')
107
109
  };
108
110
  },
109
111
  computed: {
@@ -140,13 +142,21 @@ var script = {
140
142
  size: this.size,
141
143
  disabled: this.disabled,
142
144
  loading: this.loading,
143
- class: this.toggleButtonClasses
145
+ class: this.toggleButtonClasses,
146
+ listeners: {
147
+ click: () => this.toggle()
148
+ }
144
149
  };
145
150
  }
146
151
  return {
147
152
  is: 'div',
153
+ role: 'button',
148
154
  class: 'gl-dropdown-custom-toggle gl-hover-cursor-pointer',
149
- tabindex: '0'
155
+ tabindex: '0',
156
+ listeners: {
157
+ keydown: event => this.onKeydown(event),
158
+ click: () => this.toggle()
159
+ }
150
160
  };
151
161
  },
152
162
  toggleElement() {
@@ -210,6 +220,14 @@ var script = {
210
220
  },
211
221
  focusToggle() {
212
222
  this.toggleElement.focus();
223
+ },
224
+ onKeydown(event) {
225
+ const {
226
+ code
227
+ } = event;
228
+ if (code === ENTER || code === SPACE) {
229
+ this.toggle();
230
+ }
213
231
  }
214
232
  }
215
233
  };
@@ -218,7 +236,7 @@ var script = {
218
236
  const __vue_script__ = script;
219
237
 
220
238
  /* template */
221
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:"outside",rawName:"v-outside",value:(_vm.close),expression:"close"}],staticClass:"gl-dropdown dropdown gl-display-inline-flex gl-vertical-align-middle"},[_c(_vm.toggleOptions.is,_vm._b({ref:"toggle",tag:"component",attrs:{"id":_vm.toggleId,"data-testid":"base-dropdown-toggle","aria-haspopup":_vm.ariaHaspopup,"aria-expanded":_vm.visible,"aria-labelledby":_vm.toggleLabelledBy},on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }return _vm.toggle.apply(null, arguments)},"click":_vm.toggle}},'component',_vm.toggleOptions,false),[_vm._t("toggle",function(){return [_c('span',{staticClass:"gl-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 dropdown-chevron",attrs:{"name":"chevron-down"}}):_vm._e()]})],2),_vm._v(" "),_c('div',{ref:"content",staticClass:"dropdown-menu",class:{ show: _vm.visible },attrs:{"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',{staticClass:"gl-dropdown-inner"},[_vm._t("default")],2)])],1)};
239
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:"outside",rawName:"v-outside",value:(_vm.close),expression:"close"}],staticClass:"gl-dropdown dropdown gl-display-inline-flex gl-vertical-align-middle"},[_c(_vm.toggleOptions.is,_vm._g(_vm._b({ref:"toggle",tag:"component",attrs:{"id":_vm.toggleId,"data-testid":"base-dropdown-toggle","aria-haspopup":_vm.ariaHaspopup,"aria-expanded":_vm.visible,"aria-labelledby":_vm.toggleLabelledBy,"aria-controls":_vm.baseDropdownId}},'component',_vm.toggleOptions,false),_vm.toggleOptions.listeners),[_vm._t("toggle",function(){return [_c('span',{staticClass:"gl-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 dropdown-chevron",attrs:{"name":"chevron-down"}}):_vm._e()]})],2),_vm._v(" "),_c('div',{ref:"content",staticClass:"dropdown-menu",class:{ show: _vm.visible },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',{staticClass:"gl-dropdown-inner"},[_vm._t("default")],2)])],1)};
222
240
  var __vue_staticRenderFns__ = [];
223
241
 
224
242
  /* style */
@@ -0,0 +1,291 @@
1
+ import _uniqueId from 'lodash/uniqueId';
2
+ import _clamp from 'lodash/clamp';
3
+ import { stopEvent } from '../../../../utils/utils';
4
+ import { GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, HOME, END, ARROW_UP, ARROW_DOWN } from '../constants';
5
+ import { buttonCategoryOptions, dropdownVariantOptions, buttonSizeOptions } from '../../../../utils/constants';
6
+ import GlBaseDropdown from '../base_dropdown/base_dropdown';
7
+ import GlDisclosureDropdownItem, { ITEM_CLASS } from './disclosure_dropdown_item';
8
+ import GlDisclosureDropdownGroup from './disclosure_dropdown_group';
9
+ import { itemsValidator, isAllItems, isAllGroups, isItem } from './utils';
10
+ import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
11
+
12
+ var script = {
13
+ events: {
14
+ GL_DROPDOWN_SHOWN,
15
+ GL_DROPDOWN_HIDDEN
16
+ },
17
+ components: {
18
+ GlBaseDropdown,
19
+ GlDisclosureDropdownItem,
20
+ GlDisclosureDropdownGroup
21
+ },
22
+ props: {
23
+ /**
24
+ * Items to display in the dropdown
25
+ */
26
+ items: {
27
+ type: Array,
28
+ required: false,
29
+ default: () => [],
30
+ validator: itemsValidator
31
+ },
32
+ /**
33
+ * Toggle button text
34
+ */
35
+ toggleText: {
36
+ type: String,
37
+ required: false,
38
+ default: ''
39
+ },
40
+ /**
41
+ * Toggle text to be read by screen readers only
42
+ */
43
+ textSrOnly: {
44
+ type: Boolean,
45
+ required: false,
46
+ default: false
47
+ },
48
+ /**
49
+ * Styling option - dropdown's toggle category
50
+ */
51
+ category: {
52
+ type: String,
53
+ required: false,
54
+ default: buttonCategoryOptions.primary,
55
+ validator: value => value in buttonCategoryOptions
56
+ },
57
+ /**
58
+ * Styling option - dropdown's toggle variant
59
+ */
60
+ variant: {
61
+ type: String,
62
+ required: false,
63
+ default: dropdownVariantOptions.default,
64
+ validator: value => value in dropdownVariantOptions
65
+ },
66
+ /**
67
+ * The size of the dropdown toggle
68
+ */
69
+ size: {
70
+ type: String,
71
+ required: false,
72
+ default: 'medium',
73
+ validator: value => value in buttonSizeOptions
74
+ },
75
+ /**
76
+ * Icon name that will be rendered in the toggle button
77
+ */
78
+ icon: {
79
+ type: String,
80
+ required: false,
81
+ default: ''
82
+ },
83
+ /**
84
+ * Set to "true" to disable the dropdown
85
+ */
86
+ disabled: {
87
+ type: Boolean,
88
+ required: false,
89
+ default: false
90
+ },
91
+ /**
92
+ * Set to "true" when dropdown content (items) is loading
93
+ * It will render a small loader in the dropdown toggle and make it disabled
94
+ */
95
+ loading: {
96
+ type: Boolean,
97
+ required: false,
98
+ default: false
99
+ },
100
+ /**
101
+ * Additional CSS classes to customize toggle appearance
102
+ */
103
+ toggleClass: {
104
+ type: [String, Array, Object],
105
+ required: false,
106
+ default: null
107
+ },
108
+ /**
109
+ * Set to "true" to hide the caret
110
+ */
111
+ noCaret: {
112
+ type: Boolean,
113
+ required: false,
114
+ default: false
115
+ },
116
+ /**
117
+ * Right align disclosure dropdown with respect to the toggle button
118
+ */
119
+ right: {
120
+ type: Boolean,
121
+ required: false,
122
+ default: false
123
+ },
124
+ /**
125
+ * The `aria-labelledby` attribute value for the toggle button
126
+ * Provide the string of ids seperated by space
127
+ */
128
+ toggleAriaLabelledBy: {
129
+ type: String,
130
+ required: false,
131
+ default: null
132
+ },
133
+ /**
134
+ * The `aria-labelledby` attribute value for the list of options
135
+ * Provide the string of ids seperated by space
136
+ */
137
+ listAriaLabelledBy: {
138
+ type: String,
139
+ required: false,
140
+ default: null
141
+ }
142
+ },
143
+ data() {
144
+ return {
145
+ toggleId: _uniqueId('dropdown-toggle-btn-'),
146
+ disclosureId: _uniqueId('disclosure-'),
147
+ nextFocusedItemIndex: null
148
+ };
149
+ },
150
+ computed: {
151
+ disclosureOptions() {
152
+ if (this.items) {
153
+ if (isAllItems(this.items)) {
154
+ return {
155
+ tag: 'ul'
156
+ };
157
+ }
158
+ if (isAllGroups(this.items)) return {
159
+ tag: 'div',
160
+ role: 'group'
161
+ };
162
+ }
163
+ return {
164
+ tag: 'div'
165
+ };
166
+ },
167
+ hasCustomToggle() {
168
+ return Boolean(this.$scopedSlots.toggle);
169
+ }
170
+ },
171
+ methods: {
172
+ open() {
173
+ this.$refs.baseDropdown.open();
174
+ },
175
+ close() {
176
+ this.$refs.baseDropdown.close();
177
+ },
178
+ onShow() {
179
+ const items = this.getFocusableListItemElements();
180
+ if (items.length) {
181
+ this.focusItem(0, items);
182
+ }
183
+
184
+ /**
185
+ * Emitted when dropdown is shown
186
+ *
187
+ * @event shown
188
+ */
189
+ this.$emit(GL_DROPDOWN_SHOWN);
190
+ },
191
+ onHide() {
192
+ /**
193
+ * Emitted when dropdown is hidden
194
+ *
195
+ * @event hidden
196
+ */
197
+ this.$emit(GL_DROPDOWN_HIDDEN);
198
+ this.nextFocusedItemIndex = null;
199
+ },
200
+ onKeydown(event) {
201
+ const {
202
+ code
203
+ } = event;
204
+ const elements = this.getFocusableListItemElements();
205
+ if (elements.length < 1) return;
206
+ let stop = true;
207
+ if (code === HOME) {
208
+ this.focusItem(0, elements);
209
+ } else if (code === END) {
210
+ this.focusItem(elements.length - 1, elements);
211
+ } else if (code === ARROW_UP) {
212
+ this.focusNextItem(event, elements, -1);
213
+ } else if (code === ARROW_DOWN) {
214
+ this.focusNextItem(event, elements, 1);
215
+ } else {
216
+ stop = false;
217
+ }
218
+ if (stop) {
219
+ stopEvent(event);
220
+ }
221
+ },
222
+ getFocusableListItemElements() {
223
+ var _this$$refs$content;
224
+ const items = (_this$$refs$content = this.$refs.content) === null || _this$$refs$content === void 0 ? void 0 : _this$$refs$content.querySelectorAll(`.${ITEM_CLASS}`);
225
+ return Array.from(items || []);
226
+ },
227
+ focusNextItem(event, elements, offset) {
228
+ const {
229
+ target
230
+ } = event;
231
+ const currentIndex = elements.indexOf(target);
232
+ const nextIndex = _clamp(currentIndex + offset, 0, elements.length - 1);
233
+ this.focusItem(nextIndex, elements);
234
+ },
235
+ focusItem(index, elements) {
236
+ var _elements$index;
237
+ this.nextFocusedItemIndex = index;
238
+ (_elements$index = elements[index]) === null || _elements$index === void 0 ? void 0 : _elements$index.focus();
239
+ },
240
+ closeAndFocus() {
241
+ this.$refs.baseDropdown.closeAndFocus();
242
+ },
243
+ handleAction(action) {
244
+ /**
245
+ * Emitted when one of disclosure dropdown items is clicked
246
+ *
247
+ * @event action
248
+ */
249
+ this.$emit('action', action);
250
+ },
251
+ isItem
252
+ }
253
+ };
254
+
255
+ /* script */
256
+ const __vue_script__ = script;
257
+
258
+ /* template */
259
+ 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,"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,"right":_vm.right},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],null,true)},[_vm._v(" "),_vm._t("header"),_vm._v(" "),_c(_vm.disclosureOptions.tag,{ref:"content",tag:"component",staticClass:"gl-dropdown-contents gl-list-style-none gl-pl-0 gl-mb-0",attrs:{"id":_vm.disclosureId,"role":_vm.disclosureOptions.role,"aria-labelledby":_vm.listAriaLabelledBy || _vm.toggleId,"data-testid":"disclosure-content","tabindex":"-1"},on:{"keydown":_vm.onKeydown}},[_vm._t("default",function(){return [_vm._l((_vm.items),function(item,index){return [(_vm.isItem(item))?[_c('gl-disclosure-dropdown-item',{key:item.text,attrs:{"item":item},on:{"action":_vm.handleAction}},[_vm._t("list-item",null,{"item":item})],2)]:[_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,{key:"list-item",fn:function(){return [_vm._t("list-item")]},proxy:true}],null,true)})]]})]})],2),_vm._v(" "),_vm._t("footer")],2)};
260
+ var __vue_staticRenderFns__ = [];
261
+
262
+ /* style */
263
+ const __vue_inject_styles__ = undefined;
264
+ /* scoped */
265
+ const __vue_scope_id__ = undefined;
266
+ /* module identifier */
267
+ const __vue_module_identifier__ = undefined;
268
+ /* functional template */
269
+ const __vue_is_functional_template__ = false;
270
+ /* style inject */
271
+
272
+ /* style inject SSR */
273
+
274
+ /* style inject shadow dom */
275
+
276
+
277
+
278
+ const __vue_component__ = __vue_normalize__(
279
+ { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
280
+ __vue_inject_styles__,
281
+ __vue_script__,
282
+ __vue_scope_id__,
283
+ __vue_is_functional_template__,
284
+ __vue_module_identifier__,
285
+ false,
286
+ undefined,
287
+ undefined,
288
+ undefined
289
+ );
290
+
291
+ export default __vue_component__;
@@ -0,0 +1,90 @@
1
+ import _uniqueId from 'lodash/uniqueId';
2
+ import GlDisclosureDropdownItem from './disclosure_dropdown_item';
3
+ import { isGroup } from './utils';
4
+ import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
5
+
6
+ const GROUP_TOP_BORDER_CLASSES = 'gl-border-t gl-pt-3 gl-mt-3';
7
+ var script = {
8
+ components: {
9
+ GlDisclosureDropdownItem
10
+ },
11
+ props: {
12
+ /**
13
+ * Group of items
14
+ */
15
+ group: {
16
+ type: Object,
17
+ required: false,
18
+ default: null,
19
+ validator: isGroup
20
+ },
21
+ /**
22
+ * If 'true', will set top border for the group
23
+ * to separate from other groups
24
+ */
25
+ bordered: {
26
+ type: Boolean,
27
+ required: false,
28
+ default: false
29
+ }
30
+ },
31
+ computed: {
32
+ borderClass() {
33
+ return this.bordered ? GROUP_TOP_BORDER_CLASSES : null;
34
+ },
35
+ showHeader() {
36
+ var _this$group;
37
+ return this.$scopedSlots['group-label'] || ((_this$group = this.group) === null || _this$group === void 0 ? void 0 : _this$group.name);
38
+ },
39
+ groupLabeledBy() {
40
+ return this.showHeader ? this.nameId : null;
41
+ }
42
+ },
43
+ created() {
44
+ this.nameId = _uniqueId('gl-disclosure-dropdown-group-');
45
+ },
46
+ methods: {
47
+ handleAction(action) {
48
+ this.$emit('action', action);
49
+ }
50
+ }
51
+ };
52
+
53
+ /* script */
54
+ const __vue_script__ = script;
55
+
56
+ /* template */
57
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:_vm.borderClass},[(_vm.showHeader)?_c('div',{staticClass:"gl-pl-5 gl-py-2 gl-font-sm gl-font-weight-bold",attrs:{"id":_vm.nameId,"aria-hidden":"true"}},[_vm._t("group-label",function(){return [_vm._v(_vm._s(_vm.group.name))]})],2):_vm._e(),_vm._v(" "),_c('ul',{staticClass:"gl-mb-0 gl-pl-0 gl-list-style-none",attrs:{"role":"group","aria-labelledby":_vm.groupLabeledBy}},[_vm._t("default",function(){return _vm._l((_vm.group.items),function(item){return _c('gl-disclosure-dropdown-item',{key:item.text,attrs:{"item":item},on:{"action":_vm.handleAction}},[_vm._t("list-item",null,{"item":item})],2)})})],2)])};
58
+ var __vue_staticRenderFns__ = [];
59
+
60
+ /* style */
61
+ const __vue_inject_styles__ = undefined;
62
+ /* scoped */
63
+ const __vue_scope_id__ = undefined;
64
+ /* module identifier */
65
+ const __vue_module_identifier__ = undefined;
66
+ /* functional template */
67
+ const __vue_is_functional_template__ = false;
68
+ /* style inject */
69
+
70
+ /* style inject SSR */
71
+
72
+ /* style inject shadow dom */
73
+
74
+
75
+
76
+ const __vue_component__ = __vue_normalize__(
77
+ { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
78
+ __vue_inject_styles__,
79
+ __vue_script__,
80
+ __vue_scope_id__,
81
+ __vue_is_functional_template__,
82
+ __vue_module_identifier__,
83
+ false,
84
+ undefined,
85
+ undefined,
86
+ undefined
87
+ );
88
+
89
+ export default __vue_component__;
90
+ export { GROUP_TOP_BORDER_CLASSES };
@@ -0,0 +1,107 @@
1
+ import { ENTER, SPACE } from '../constants';
2
+ import { stopEvent } from '../../../../utils/utils';
3
+ import { isItem } from './utils';
4
+ import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
5
+
6
+ const ITEM_CLASS = 'gl-dropdown-item';
7
+ var script = {
8
+ ITEM_CLASS,
9
+ props: {
10
+ item: {
11
+ type: Object,
12
+ required: false,
13
+ default: null,
14
+ validator: isItem
15
+ }
16
+ },
17
+ computed: {
18
+ isActionItem() {
19
+ var _this$item;
20
+ return (_this$item = this.item) === null || _this$item === void 0 ? void 0 : _this$item.action;
21
+ },
22
+ isCustomContent() {
23
+ return Boolean(this.$scopedSlots.default);
24
+ },
25
+ itemComponent() {
26
+ if (this.isActionItem) return {
27
+ is: 'button',
28
+ attrs: {
29
+ ...this.item.extraAttrs
30
+ },
31
+ listeners: {
32
+ click: () => this.item.action()
33
+ }
34
+ };
35
+ return {
36
+ is: 'a',
37
+ attrs: {
38
+ href: this.item.href,
39
+ ...this.item.extraAttrs
40
+ },
41
+ listeners: {}
42
+ };
43
+ }
44
+ },
45
+ methods: {
46
+ onKeydown(event) {
47
+ const {
48
+ code
49
+ } = event;
50
+ if (code === ENTER || code === SPACE) {
51
+ var _this$$refs$item;
52
+ stopEvent(event);
53
+ /** Instead of simply navigating or calling the action, we want
54
+ * the `a/button` to be the target of the event as it might have additional attributes.
55
+ * E.g. `a` might have `target` attribute.
56
+ * `bubbles` is set to `true` as the parent `li` item has this event listener and thus we'll get a loop.
57
+ */
58
+ (_this$$refs$item = this.$refs.item) === null || _this$$refs$item === void 0 ? void 0 : _this$$refs$item.dispatchEvent(new MouseEvent('click', {
59
+ bubbles: false
60
+ }));
61
+ this.action();
62
+ }
63
+ },
64
+ action() {
65
+ this.$emit('action', this.item);
66
+ }
67
+ }
68
+ };
69
+
70
+ /* script */
71
+ const __vue_script__ = script;
72
+
73
+ /* template */
74
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',{staticClass:"gl-dropdown-item gl-focusable-dropdown-item",class:_vm.$options.ITEM_CLASS,attrs:{"tabindex":"0","data-testid":"disclosure-dropdown-item"},on:{"click":_vm.action,"keydown":_vm.onKeydown}},[(_vm.isCustomContent)?_c('div',{staticClass:"dropdown-item"},[_c('div',{staticClass:"gl-dropdown-item-text-wrapper"},[_vm._t("default")],2)]):[_c(_vm.itemComponent.is,_vm._g(_vm._b({ref:"item",tag:"component",staticClass:"dropdown-item",attrs:{"tabindex":"-1"}},'component',_vm.itemComponent.attrs,false),_vm.itemComponent.listeners),[_c('span',{staticClass:"gl-dropdown-item-text-wrapper"},[_vm._v("\n "+_vm._s(_vm.item.text)+"\n ")])])]],2)};
75
+ var __vue_staticRenderFns__ = [];
76
+
77
+ /* style */
78
+ const __vue_inject_styles__ = undefined;
79
+ /* scoped */
80
+ const __vue_scope_id__ = undefined;
81
+ /* module identifier */
82
+ const __vue_module_identifier__ = undefined;
83
+ /* functional template */
84
+ const __vue_is_functional_template__ = false;
85
+ /* style inject */
86
+
87
+ /* style inject SSR */
88
+
89
+ /* style inject shadow dom */
90
+
91
+
92
+
93
+ const __vue_component__ = __vue_normalize__(
94
+ { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
95
+ __vue_inject_styles__,
96
+ __vue_script__,
97
+ __vue_scope_id__,
98
+ __vue_is_functional_template__,
99
+ __vue_module_identifier__,
100
+ false,
101
+ undefined,
102
+ undefined,
103
+ undefined
104
+ );
105
+
106
+ export default __vue_component__;
107
+ export { ITEM_CLASS };