@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.
- package/CHANGELOG.md +14 -0
- package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +23 -5
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +291 -0
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.js +90 -0
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.js +107 -0
- package/dist/components/base/new_dropdowns/disclosure/mock_data.js +128 -0
- package/dist/components/base/new_dropdowns/disclosure/utils.js +15 -0
- package/dist/components/base/new_dropdowns/listbox/listbox.js +4 -4
- package/dist/components/base/new_dropdowns/listbox/listbox_group.js +1 -1
- package/dist/components/base/new_dropdowns/listbox/listbox_item.js +1 -1
- package/dist/components/regions/empty_state/empty_state.js +12 -1
- package/dist/index.css +2 -2
- package/dist/index.css.map +1 -1
- package/dist/index.js +3 -0
- package/package.json +3 -3
- package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.spec.js +3 -3
- package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.vue +21 -3
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.md +114 -0
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.scss +7 -0
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.spec.js +210 -0
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.stories.js +306 -0
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.vue +342 -0
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.spec.js +82 -0
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.vue +77 -0
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.spec.js +94 -0
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.vue +98 -0
- package/src/components/base/new_dropdowns/disclosure/mock_data.js +156 -0
- package/src/components/base/new_dropdowns/disclosure/utils.js +18 -0
- package/src/components/base/new_dropdowns/disclosure/utils.spec.js +73 -0
- package/src/components/base/new_dropdowns/dropdown.scss +6 -0
- package/src/components/base/new_dropdowns/listbox/listbox.scss +0 -6
- package/src/components/base/new_dropdowns/listbox/listbox.vue +4 -4
- package/src/components/base/new_dropdowns/listbox/listbox_group.vue +1 -1
- package/src/components/base/new_dropdowns/listbox/listbox_item.vue +1 -1
- package/src/components/regions/empty_state/empty_state.spec.js +35 -0
- package/src/components/regions/empty_state/empty_state.stories.js +5 -0
- package/src/components/regions/empty_state/empty_state.vue +15 -1
- package/src/index.js +3 -0
- 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
|
|
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 };
|