@gitlab/ui 126.2.0 → 126.3.1
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/dist/components/base/avatars_inline/avatars_inline.js +21 -0
- package/dist/components/base/badge/badge.js +7 -7
- package/dist/components/base/drawer/drawer.js +19 -0
- package/dist/components/base/dropdown/dropdown_item.js +34 -0
- package/dist/components/base/form/form_input_group/form_input_group.js +6 -0
- package/dist/components/base/keyset_pagination/keyset_pagination.js +1 -1
- package/dist/components/base/label/label.js +26 -6
- package/dist/components/base/pagination/pagination.js +2 -18
- package/dist/components/base/popover/popover.js +15 -0
- package/dist/components/base/progress_bar/progress_bar.js +15 -0
- package/dist/components/base/search_box_by_type/search_box_by_type.js +20 -0
- package/dist/components/base/tabs/tab/tab.js +31 -2
- package/dist/components/base/token/token.js +3 -0
- package/dist/components/dashboards/dashboard_layout/dashboard_layout.js +27 -1
- package/dist/components/dashboards/dashboard_layout/grid_layout/grid_layout.js +28 -6
- package/package.json +2 -2
- package/src/components/base/avatars_inline/avatars_inline.vue +22 -0
- package/src/components/base/badge/badge.vue +9 -8
- package/src/components/base/drawer/drawer.vue +23 -0
- package/src/components/base/dropdown/dropdown_item.vue +35 -0
- package/src/components/base/form/form_input_group/form_input_group.vue +6 -0
- package/src/components/base/keyset_pagination/keyset_pagination.vue +2 -2
- package/src/components/base/label/label.vue +26 -6
- package/src/components/base/pagination/pagination.vue +4 -22
- package/src/components/base/popover/popover.vue +20 -1
- package/src/components/base/progress_bar/progress_bar.vue +15 -0
- package/src/components/base/search_box_by_type/search_box_by_type.vue +18 -0
- package/src/components/base/tabs/tab/tab.vue +46 -2
- package/src/components/base/token/token.vue +4 -0
- package/src/components/dashboards/dashboard_layout/dashboard_layout.vue +29 -0
- package/src/components/dashboards/dashboard_layout/grid_layout/grid_layout.vue +29 -6
- package/translations.js +0 -2
|
@@ -12,33 +12,54 @@ var script = {
|
|
|
12
12
|
GlTooltip
|
|
13
13
|
},
|
|
14
14
|
props: {
|
|
15
|
+
/**
|
|
16
|
+
* Array of avatar objects to display
|
|
17
|
+
*/
|
|
15
18
|
avatars: {
|
|
16
19
|
type: Array,
|
|
17
20
|
required: true
|
|
18
21
|
},
|
|
22
|
+
/**
|
|
23
|
+
* Maximum number of avatars to display before collapsing
|
|
24
|
+
*/
|
|
19
25
|
maxVisible: {
|
|
20
26
|
type: Number,
|
|
21
27
|
required: true
|
|
22
28
|
},
|
|
29
|
+
/**
|
|
30
|
+
* Size of each avatar in pixels
|
|
31
|
+
*/
|
|
23
32
|
avatarSize: {
|
|
24
33
|
type: Number,
|
|
25
34
|
required: true,
|
|
26
35
|
validator: value => avatarsInlineSizeOptions.includes(value)
|
|
27
36
|
},
|
|
37
|
+
/**
|
|
38
|
+
* Whether to show the avatars in collapsed state
|
|
39
|
+
*/
|
|
28
40
|
collapsed: {
|
|
29
41
|
type: Boolean,
|
|
30
42
|
required: false,
|
|
31
43
|
default: false
|
|
32
44
|
},
|
|
45
|
+
/**
|
|
46
|
+
* Screen reader text for the collapsed avatars badge
|
|
47
|
+
*/
|
|
33
48
|
badgeSrOnlyText: {
|
|
34
49
|
type: String,
|
|
35
50
|
required: true
|
|
36
51
|
},
|
|
52
|
+
/**
|
|
53
|
+
* Property name to extract tooltip text from each hidden avatar object
|
|
54
|
+
*/
|
|
37
55
|
badgeTooltipProp: {
|
|
38
56
|
type: String,
|
|
39
57
|
required: false,
|
|
40
58
|
default: ''
|
|
41
59
|
},
|
|
60
|
+
/**
|
|
61
|
+
* Maximum number of characters to display in the badge tooltip
|
|
62
|
+
*/
|
|
42
63
|
badgeTooltipMaxChars: {
|
|
43
64
|
type: Number,
|
|
44
65
|
required: false,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import GlLink from '../link/link';
|
|
2
2
|
import { badgeVariantOptions, badgeIconSizeOptions, linkVariantUnstyled } from '../../../utils/constants';
|
|
3
3
|
import GlIcon from '../icon/icon';
|
|
4
|
+
import { logWarning } from '../../../utils/utils';
|
|
4
5
|
import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
|
|
5
6
|
|
|
6
7
|
//
|
|
@@ -116,12 +117,6 @@ var script = {
|
|
|
116
117
|
role() {
|
|
117
118
|
return this.hasIconOnly ? 'img' : undefined;
|
|
118
119
|
},
|
|
119
|
-
ariaLabel() {
|
|
120
|
-
if (this.$attrs['aria-label']) {
|
|
121
|
-
return this.$attrs['aria-label'];
|
|
122
|
-
}
|
|
123
|
-
return this.role === 'img' ? this.icon : undefined;
|
|
124
|
-
},
|
|
125
120
|
iconSizeComputed() {
|
|
126
121
|
return badgeIconSizeOptions[this.iconSize];
|
|
127
122
|
},
|
|
@@ -154,6 +149,11 @@ var script = {
|
|
|
154
149
|
'!gl-px-2': !this.$scopedSlots.default
|
|
155
150
|
}];
|
|
156
151
|
}
|
|
152
|
+
},
|
|
153
|
+
mounted() {
|
|
154
|
+
if (this.hasIconOnly && !this.$attrs['aria-label']) {
|
|
155
|
+
logWarning('[GlBadge] Icon-only badges require an aria-label for accessibility. The label should describe the metadata (e.g., "Due date", "Open issue"), not the icon name. See https://design.gitlab.com/components/badge#using-icon-only-badges', this.$el);
|
|
156
|
+
}
|
|
157
157
|
}
|
|
158
158
|
};
|
|
159
159
|
|
|
@@ -161,7 +161,7 @@ var script = {
|
|
|
161
161
|
const __vue_script__ = script;
|
|
162
162
|
|
|
163
163
|
/* template */
|
|
164
|
-
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c(_vm.computedTag,_vm._g(_vm._b({tag:"component",class:_vm.classes,attrs:{"role":_vm.role
|
|
164
|
+
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c(_vm.computedTag,_vm._g(_vm._b({tag:"component",class:_vm.classes,attrs:{"role":_vm.role}},'component',_vm.computedProps,false),_vm.$listeners),[(_vm.icon)?_c('gl-icon',{staticClass:"gl-badge-icon",class:{ '-gl-ml-2': _vm.isCircularIcon },attrs:{"size":_vm.iconSizeComputed,"name":_vm.icon}}):_vm._e(),_vm._v(" "),(_vm.$slots.default)?_c('span',{staticClass:"gl-badge-content"},[_vm._t("default")],2):_vm._e()],1)};
|
|
165
165
|
var __vue_staticRenderFns__ = [];
|
|
166
166
|
|
|
167
167
|
/* style */
|
|
@@ -11,25 +11,40 @@ var script = {
|
|
|
11
11
|
GlButton
|
|
12
12
|
},
|
|
13
13
|
props: {
|
|
14
|
+
/**
|
|
15
|
+
* Controls the visibility state of the drawer.
|
|
16
|
+
*/
|
|
14
17
|
open: {
|
|
15
18
|
type: Boolean,
|
|
16
19
|
required: true
|
|
17
20
|
},
|
|
21
|
+
/**
|
|
22
|
+
* Height of the header element (e.g., '64px'). Used to position the drawer below a fixed header.
|
|
23
|
+
*/
|
|
18
24
|
headerHeight: {
|
|
19
25
|
type: String,
|
|
20
26
|
required: false,
|
|
21
27
|
default: ''
|
|
22
28
|
},
|
|
29
|
+
/**
|
|
30
|
+
* When true, makes the drawer header sticky so it remains visible when scrolling the drawer content.
|
|
31
|
+
*/
|
|
23
32
|
headerSticky: {
|
|
24
33
|
type: Boolean,
|
|
25
34
|
required: false,
|
|
26
35
|
default: false
|
|
27
36
|
},
|
|
37
|
+
/**
|
|
38
|
+
* Z-index value for the drawer. Useful for controlling stacking order with other elements.
|
|
39
|
+
*/
|
|
28
40
|
zIndex: {
|
|
29
41
|
type: Number,
|
|
30
42
|
required: false,
|
|
31
43
|
default: maxZIndex
|
|
32
44
|
},
|
|
45
|
+
/**
|
|
46
|
+
* Visual variant of the drawer.
|
|
47
|
+
*/
|
|
33
48
|
variant: {
|
|
34
49
|
type: String,
|
|
35
50
|
required: false,
|
|
@@ -91,6 +106,10 @@ var script = {
|
|
|
91
106
|
handleEscape(e) {
|
|
92
107
|
const ESC = 27;
|
|
93
108
|
if (this.open && e.keyCode === ESC) {
|
|
109
|
+
/**
|
|
110
|
+
* Emits when drawer gets closed (by pressing ESC or clicking the close button).
|
|
111
|
+
* @event close
|
|
112
|
+
*/
|
|
94
113
|
this.$emit('close');
|
|
95
114
|
}
|
|
96
115
|
}
|
|
@@ -15,51 +15,81 @@ var script = {
|
|
|
15
15
|
},
|
|
16
16
|
inheritAttrs: false,
|
|
17
17
|
props: {
|
|
18
|
+
/**
|
|
19
|
+
* URL for the avatar image to display
|
|
20
|
+
*/
|
|
18
21
|
avatarUrl: {
|
|
19
22
|
type: String,
|
|
20
23
|
required: false,
|
|
21
24
|
default: ''
|
|
22
25
|
},
|
|
26
|
+
/**
|
|
27
|
+
* Color variant for the icon on the left side
|
|
28
|
+
*/
|
|
23
29
|
iconColor: {
|
|
24
30
|
type: String,
|
|
25
31
|
required: false,
|
|
26
32
|
default: ''
|
|
27
33
|
},
|
|
34
|
+
/**
|
|
35
|
+
* Name of the icon to display on the left side
|
|
36
|
+
*/
|
|
28
37
|
iconName: {
|
|
29
38
|
type: String,
|
|
30
39
|
required: false,
|
|
31
40
|
default: ''
|
|
32
41
|
},
|
|
42
|
+
/**
|
|
43
|
+
* Aria label for the right icon button
|
|
44
|
+
*/
|
|
33
45
|
iconRightAriaLabel: {
|
|
34
46
|
type: String,
|
|
35
47
|
required: false,
|
|
36
48
|
default: ''
|
|
37
49
|
},
|
|
50
|
+
/**
|
|
51
|
+
* Name of the icon to display on the right side
|
|
52
|
+
*/
|
|
38
53
|
iconRightName: {
|
|
39
54
|
type: String,
|
|
40
55
|
required: false,
|
|
41
56
|
default: ''
|
|
42
57
|
},
|
|
58
|
+
/**
|
|
59
|
+
* Whether the dropdown item is checked
|
|
60
|
+
*/
|
|
43
61
|
isChecked: {
|
|
44
62
|
type: Boolean,
|
|
45
63
|
required: false,
|
|
46
64
|
default: false
|
|
47
65
|
},
|
|
66
|
+
/**
|
|
67
|
+
* Whether to show a check icon for this item
|
|
68
|
+
*/
|
|
48
69
|
isCheckItem: {
|
|
49
70
|
type: Boolean,
|
|
50
71
|
required: false,
|
|
51
72
|
default: false
|
|
52
73
|
},
|
|
74
|
+
/**
|
|
75
|
+
* Whether to center the check icon vertically
|
|
76
|
+
*/
|
|
53
77
|
isCheckCentered: {
|
|
54
78
|
type: Boolean,
|
|
55
79
|
required: false,
|
|
56
80
|
default: false
|
|
57
81
|
},
|
|
82
|
+
/**
|
|
83
|
+
* Secondary text to display below the main content
|
|
84
|
+
*/
|
|
58
85
|
secondaryText: {
|
|
59
86
|
type: String,
|
|
60
87
|
required: false,
|
|
61
88
|
default: ''
|
|
62
89
|
},
|
|
90
|
+
/**
|
|
91
|
+
* ARIA role for the dropdown item
|
|
92
|
+
*/
|
|
63
93
|
role: {
|
|
64
94
|
type: String,
|
|
65
95
|
required: false,
|
|
@@ -97,6 +127,10 @@ var script = {
|
|
|
97
127
|
},
|
|
98
128
|
methods: {
|
|
99
129
|
handleClickIconRight() {
|
|
130
|
+
/**
|
|
131
|
+
* Emitted when right icon is clicked.
|
|
132
|
+
* @event handleClickIconRight
|
|
133
|
+
*/
|
|
100
134
|
this.$emit('click-icon-right');
|
|
101
135
|
}
|
|
102
136
|
}
|
|
@@ -34,11 +34,17 @@ var script = {
|
|
|
34
34
|
}],
|
|
35
35
|
validator: options => options.every(opt => Object.keys(opt).includes('name', 'value'))
|
|
36
36
|
},
|
|
37
|
+
/**
|
|
38
|
+
* Accessible label for the input field. Used for the aria-label attribute.
|
|
39
|
+
*/
|
|
37
40
|
label: {
|
|
38
41
|
type: String,
|
|
39
42
|
required: false,
|
|
40
43
|
default: undefined
|
|
41
44
|
},
|
|
45
|
+
/**
|
|
46
|
+
* Additional CSS class(es) to apply to the input element.
|
|
47
|
+
*/
|
|
42
48
|
inputClass: {
|
|
43
49
|
type: [String, Array, Object],
|
|
44
50
|
required: false,
|
|
@@ -117,7 +117,7 @@ var script = {
|
|
|
117
117
|
const __vue_script__ = script;
|
|
118
118
|
|
|
119
119
|
/* template */
|
|
120
|
-
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isVisible)?_c('nav',{staticClass:"gl-pagination",attrs:{"aria-label":_vm.navigationLabel}},[_c('gl-button-group',_vm._g(_vm._b({staticClass:"gl-keyset-pagination gl-gap-3"},'gl-button-group',_vm.$attrs,false),_vm.$listeners),[_c('gl-button',{attrs:{"href":_vm.prevButtonLink,"disabled":_vm.disabled || !_vm.hasPreviousPage,"data-testid":"prevButton","category":"tertiary"},on:{"click":function($event){return _vm.$emit('prev', _vm.startCursor)}}},[_vm._t("previous-button-content",function(){return [_c('div',{staticClass:"gl-align-center gl-flex"},[_c('gl-icon',{attrs:{"name":"chevron-left"}}),_vm._v("\n "+_vm._s(_vm.prevText)+"\n ")],1)]})],2),_vm._v(" "),_c('gl-button',{attrs:{"href":_vm.nextButtonLink,"disabled":_vm.disabled || !_vm.hasNextPage,"data-testid":"nextButton","category":"tertiary"},on:{"click":function($event){return _vm.$emit('next', _vm.endCursor)}}},[_vm._t("next-button-content",function(){return [_c('div',{staticClass:"gl-align-center gl-flex"},[_vm._v("\n "+_vm._s(_vm.nextText)+"\n "),_c('gl-icon',{attrs:{"name":"chevron-right"}})],1)]})],2)],1)],1):_vm._e()};
|
|
120
|
+
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isVisible)?_c('nav',{staticClass:"gl-pagination",attrs:{"aria-label":_vm.navigationLabel}},[_c('gl-button-group',_vm._g(_vm._b({staticClass:"gl-keyset-pagination gl-gap-3"},'gl-button-group',_vm.$attrs,false),_vm.$listeners),[_c('gl-button',{attrs:{"href":_vm.prevButtonLink,"disabled":_vm.disabled || !_vm.hasPreviousPage,"data-testid":"prevButton","category":"tertiary"},on:{"click":function($event){return _vm.$emit('prev', _vm.startCursor)}}},[_vm._t("previous-button-content",function(){return [_c('div',{staticClass:"gl-align-center gl-flex"},[_c('gl-icon',{staticClass:"gl-mr-2",attrs:{"name":"chevron-lg-left"}}),_vm._v("\n "+_vm._s(_vm.prevText)+"\n ")],1)]})],2),_vm._v(" "),_c('gl-button',{attrs:{"href":_vm.nextButtonLink,"disabled":_vm.disabled || !_vm.hasNextPage,"data-testid":"nextButton","category":"tertiary"},on:{"click":function($event){return _vm.$emit('next', _vm.endCursor)}}},[_vm._t("next-button-content",function(){return [_c('div',{staticClass:"gl-align-center gl-flex"},[_vm._v("\n "+_vm._s(_vm.nextText)+"\n "),_c('gl-icon',{staticClass:"gl-ml-2",attrs:{"name":"chevron-lg-right"}})],1)]})],2)],1)],1):_vm._e()};
|
|
121
121
|
var __vue_staticRenderFns__ = [];
|
|
122
122
|
|
|
123
123
|
/* style */
|
|
@@ -17,41 +17,65 @@ var script = {
|
|
|
17
17
|
GlTooltip
|
|
18
18
|
},
|
|
19
19
|
props: {
|
|
20
|
+
/**
|
|
21
|
+
* Background color of the label in hex, rgb, or rgba format
|
|
22
|
+
*/
|
|
20
23
|
backgroundColor: {
|
|
21
24
|
type: String,
|
|
22
25
|
required: true,
|
|
23
26
|
validator: value => /^(#|rgb|rgba)/.test(value)
|
|
24
27
|
},
|
|
28
|
+
/**
|
|
29
|
+
* Title text of the label
|
|
30
|
+
*/
|
|
25
31
|
title: {
|
|
26
32
|
type: String,
|
|
27
33
|
required: true,
|
|
28
34
|
default: ''
|
|
29
35
|
},
|
|
36
|
+
/**
|
|
37
|
+
* Description text shown in tooltip
|
|
38
|
+
*/
|
|
30
39
|
description: {
|
|
31
40
|
type: String,
|
|
32
41
|
required: false,
|
|
33
42
|
default: ''
|
|
34
43
|
},
|
|
44
|
+
/**
|
|
45
|
+
* Placement of the tooltip
|
|
46
|
+
*/
|
|
35
47
|
tooltipPlacement: {
|
|
36
48
|
type: String,
|
|
37
49
|
required: false,
|
|
38
50
|
default: 'top'
|
|
39
51
|
},
|
|
52
|
+
/**
|
|
53
|
+
* Target URL for the label link
|
|
54
|
+
*/
|
|
40
55
|
target: {
|
|
41
56
|
type: String,
|
|
42
57
|
required: false,
|
|
43
58
|
default: ''
|
|
44
59
|
},
|
|
60
|
+
/**
|
|
61
|
+
* Whether the label is scoped (uses :: separator)
|
|
62
|
+
*/
|
|
45
63
|
scoped: {
|
|
46
64
|
type: Boolean,
|
|
47
65
|
required: false,
|
|
48
66
|
default: false
|
|
49
67
|
},
|
|
68
|
+
/**
|
|
69
|
+
* Whether to show the close button
|
|
70
|
+
*/
|
|
50
71
|
showCloseButton: {
|
|
51
72
|
type: Boolean,
|
|
52
73
|
required: false,
|
|
53
74
|
default: false
|
|
54
75
|
},
|
|
76
|
+
/**
|
|
77
|
+
* Whether the label is disabled
|
|
78
|
+
*/
|
|
55
79
|
disabled: {
|
|
56
80
|
type: Boolean,
|
|
57
81
|
required: false,
|
|
@@ -99,19 +123,15 @@ var script = {
|
|
|
99
123
|
methods: {
|
|
100
124
|
onClick(e) {
|
|
101
125
|
/**
|
|
102
|
-
* Emitted when label is clicked
|
|
103
|
-
*
|
|
126
|
+
* Emitted when the label is clicked.
|
|
104
127
|
* @event click
|
|
105
|
-
* @type {object}
|
|
106
128
|
*/
|
|
107
129
|
this.$emit('click', e);
|
|
108
130
|
},
|
|
109
131
|
onClose(e) {
|
|
110
132
|
/**
|
|
111
|
-
* Emitted when
|
|
112
|
-
*
|
|
133
|
+
* Emitted when the close button is clicked.
|
|
113
134
|
* @event close
|
|
114
|
-
* @type {object}
|
|
115
135
|
*/
|
|
116
136
|
this.$emit('close', e);
|
|
117
137
|
}
|
|
@@ -81,14 +81,6 @@ var script = {
|
|
|
81
81
|
required: false,
|
|
82
82
|
default: null
|
|
83
83
|
},
|
|
84
|
-
/**
|
|
85
|
-
* Text for the previous button (overridden by "previous" slot)
|
|
86
|
-
*/
|
|
87
|
-
prevText: {
|
|
88
|
-
type: String,
|
|
89
|
-
required: false,
|
|
90
|
-
default: translate('GlPagination.prevText', 'Previous')
|
|
91
|
-
},
|
|
92
84
|
/**
|
|
93
85
|
* When using the compact pagination, use this prop to pass the next page number
|
|
94
86
|
*/
|
|
@@ -97,14 +89,6 @@ var script = {
|
|
|
97
89
|
required: false,
|
|
98
90
|
default: null
|
|
99
91
|
},
|
|
100
|
-
/**
|
|
101
|
-
* Text for the next button (overridden by "next" slot)
|
|
102
|
-
*/
|
|
103
|
-
nextText: {
|
|
104
|
-
type: String,
|
|
105
|
-
required: false,
|
|
106
|
-
default: translate('GlPagination.nextText', 'Next')
|
|
107
|
-
},
|
|
108
92
|
/**
|
|
109
93
|
* Text for the ellipsis (overridden by "ellipsis-left" and "ellipsis-right" slots)
|
|
110
94
|
*/
|
|
@@ -375,13 +359,13 @@ const __vue_script__ = script;
|
|
|
375
359
|
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isVisible)?_c('nav',{staticClass:"gl-pagination",attrs:{"aria-label":_vm.labelNav}},[_c('ul',{class:_vm.wrapperClasses},[_c('li',{class:{
|
|
376
360
|
disabled: _vm.prevPageIsDisabled,
|
|
377
361
|
'gl-flex-auto': _vm.isFillAlign,
|
|
378
|
-
},attrs:{"aria-hidden":_vm.prevPageIsDisabled,"data-testid":"gl-pagination-li"}},[_c(_vm.prevPageIsDisabled ? 'span' : 'a',{tag:"component",staticClass:"gl-pagination-item",attrs:{"data-testid":"gl-pagination-prev","aria-label":_vm.prevPageAriaLabel,"href":_vm.prevPageHref},on:{"click":function($event){!_vm.prevPageIsDisabled ? _vm.handlePrevious($event, _vm.value - 1) : null;}}},[_vm._t("previous",function(){return [_c('gl-icon',{attrs:{"name":"chevron-left"}})
|
|
362
|
+
},attrs:{"aria-hidden":_vm.prevPageIsDisabled,"data-testid":"gl-pagination-li"}},[_c(_vm.prevPageIsDisabled ? 'span' : 'a',{tag:"component",staticClass:"gl-pagination-item",attrs:{"data-testid":"gl-pagination-prev","aria-label":_vm.prevPageAriaLabel,"href":_vm.prevPageHref},on:{"click":function($event){!_vm.prevPageIsDisabled ? _vm.handlePrevious($event, _vm.value - 1) : null;}}},[_vm._t("previous",function(){return [_c('gl-icon',{attrs:{"name":"chevron-lg-left"}})]},null,{ page: _vm.value - 1, disabled: _vm.prevPageIsDisabled })],2)],1),_vm._v(" "),_vm._l((_vm.visibleItems),function(item){return _c('li',{key:item.key,class:{
|
|
379
363
|
disabled: item.disabled,
|
|
380
364
|
'gl-flex-auto': _vm.isFillAlign,
|
|
381
365
|
},attrs:{"data-testid":"gl-pagination-li"}},[_c(item.component,_vm._g(_vm._b({tag:"component",staticClass:"gl-pagination-item",attrs:{"data-testid":"gl-pagination-item","size":"md","aria-disabled":item.disabled}},'component',item.attrs,false),item.listeners),[_vm._t(item.slot,function(){return [_vm._v(_vm._s(item.content))]},null,item.slotData)],2)],1)}),_vm._v(" "),_c('li',{class:{
|
|
382
366
|
disabled: _vm.nextPageIsDisabled,
|
|
383
367
|
'gl-flex-auto': _vm.isFillAlign,
|
|
384
|
-
},attrs:{"aria-hidden":_vm.nextPageIsDisabled,"data-testid":"gl-pagination-li"}},[_c(_vm.nextPageIsDisabled ? 'span' : 'a',{tag:"component",staticClass:"gl-pagination-item",attrs:{"data-testid":"gl-pagination-next","aria-label":_vm.nextPageAriaLabel,"href":_vm.nextPageHref},on:{"click":function($event){!_vm.nextPageIsDisabled ? _vm.handleNext($event, _vm.value + 1) : null;}}},[_vm._t("next",function(){return [_c('
|
|
368
|
+
},attrs:{"aria-hidden":_vm.nextPageIsDisabled,"data-testid":"gl-pagination-li"}},[_c(_vm.nextPageIsDisabled ? 'span' : 'a',{tag:"component",staticClass:"gl-pagination-item",attrs:{"data-testid":"gl-pagination-next","aria-label":_vm.nextPageAriaLabel,"href":_vm.nextPageHref},on:{"click":function($event){!_vm.nextPageIsDisabled ? _vm.handleNext($event, _vm.value + 1) : null;}}},[_vm._t("next",function(){return [_c('gl-icon',{attrs:{"name":"chevron-lg-right"}})]},null,{ page: _vm.value + 1, disabled: _vm.nextPageIsDisabled })],2)],1)],2)]):_vm._e()};
|
|
385
369
|
var __vue_staticRenderFns__ = [];
|
|
386
370
|
|
|
387
371
|
/* style */
|
|
@@ -16,6 +16,9 @@ var script = {
|
|
|
16
16
|
mixins: [tooltipMixin(popoverRefName)],
|
|
17
17
|
inheritAttrs: false,
|
|
18
18
|
props: {
|
|
19
|
+
/**
|
|
20
|
+
* Additional CSS class(es) to apply to the popover.
|
|
21
|
+
*/
|
|
19
22
|
cssClasses: {
|
|
20
23
|
type: [Array, String, Object],
|
|
21
24
|
required: false,
|
|
@@ -31,21 +34,33 @@ var script = {
|
|
|
31
34
|
required: false,
|
|
32
35
|
default: 'hover focus'
|
|
33
36
|
},
|
|
37
|
+
/**
|
|
38
|
+
* Title text to display in the popover header.
|
|
39
|
+
*/
|
|
34
40
|
title: {
|
|
35
41
|
type: String,
|
|
36
42
|
required: false,
|
|
37
43
|
default: ''
|
|
38
44
|
},
|
|
45
|
+
/**
|
|
46
|
+
* When true, displays a close button in the popover header.
|
|
47
|
+
*/
|
|
39
48
|
showCloseButton: {
|
|
40
49
|
type: Boolean,
|
|
41
50
|
required: false,
|
|
42
51
|
default: false
|
|
43
52
|
},
|
|
53
|
+
/**
|
|
54
|
+
* Placement of the popover relative to the target element.
|
|
55
|
+
*/
|
|
44
56
|
placement: {
|
|
45
57
|
type: String,
|
|
46
58
|
required: false,
|
|
47
59
|
default: popoverPlacements.top
|
|
48
60
|
},
|
|
61
|
+
/**
|
|
62
|
+
* Padding (in pixels) between the popover and the viewport boundary.
|
|
63
|
+
*/
|
|
49
64
|
boundaryPadding: {
|
|
50
65
|
type: [Number, String],
|
|
51
66
|
required: false,
|
|
@@ -12,27 +12,42 @@ const backgroundClasses = {
|
|
|
12
12
|
var script = {
|
|
13
13
|
name: 'GlProgressBar',
|
|
14
14
|
props: {
|
|
15
|
+
/**
|
|
16
|
+
* Accessible label for the progress bar. Used for the aria-label attribute.
|
|
17
|
+
*/
|
|
15
18
|
ariaLabel: {
|
|
16
19
|
type: String,
|
|
17
20
|
required: false,
|
|
18
21
|
default: translate('GlProgressBar.ariaLabel', 'Progress bar')
|
|
19
22
|
},
|
|
23
|
+
/**
|
|
24
|
+
* Current progress value. Should be between 0 and the max value.
|
|
25
|
+
*/
|
|
20
26
|
value: {
|
|
21
27
|
type: [Number, String],
|
|
22
28
|
required: false,
|
|
23
29
|
default: 0
|
|
24
30
|
},
|
|
31
|
+
/**
|
|
32
|
+
* Visual variant of the progress bar.
|
|
33
|
+
*/
|
|
25
34
|
variant: {
|
|
26
35
|
type: String,
|
|
27
36
|
required: false,
|
|
28
37
|
default: 'primary',
|
|
29
38
|
validator: value => Object.keys(progressBarVariantOptions).includes(value)
|
|
30
39
|
},
|
|
40
|
+
/**
|
|
41
|
+
* Maximum value for the progress bar. The value prop is calculated as a percentage of this.
|
|
42
|
+
*/
|
|
31
43
|
max: {
|
|
32
44
|
type: [Number, String],
|
|
33
45
|
required: false,
|
|
34
46
|
default: 100
|
|
35
47
|
},
|
|
48
|
+
/**
|
|
49
|
+
* Custom height for the progress bar (e.g., '8px', '1rem').
|
|
50
|
+
*/
|
|
36
51
|
height: {
|
|
37
52
|
type: String,
|
|
38
53
|
required: false,
|
|
@@ -27,11 +27,17 @@ var script = {
|
|
|
27
27
|
required: false,
|
|
28
28
|
default: ''
|
|
29
29
|
},
|
|
30
|
+
/**
|
|
31
|
+
* Whether to render the search box without borders
|
|
32
|
+
*/
|
|
30
33
|
borderless: {
|
|
31
34
|
type: Boolean,
|
|
32
35
|
required: false,
|
|
33
36
|
default: false
|
|
34
37
|
},
|
|
38
|
+
/**
|
|
39
|
+
* Title text for the clear button
|
|
40
|
+
*/
|
|
35
41
|
clearButtonTitle: {
|
|
36
42
|
type: String,
|
|
37
43
|
required: false,
|
|
@@ -102,6 +108,10 @@ var script = {
|
|
|
102
108
|
this.$refs.input.$el.focus();
|
|
103
109
|
},
|
|
104
110
|
onInput(value) {
|
|
111
|
+
/**
|
|
112
|
+
* Emitted when the input value changes or gets cleared.
|
|
113
|
+
* @event input
|
|
114
|
+
*/
|
|
105
115
|
this.$emit('input', value);
|
|
106
116
|
},
|
|
107
117
|
onFocusout(event) {
|
|
@@ -111,6 +121,11 @@ var script = {
|
|
|
111
121
|
if (this.isInputOrClearButton(relatedTarget)) {
|
|
112
122
|
return;
|
|
113
123
|
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Emitted when focus leaves the search box (input and clear button).
|
|
127
|
+
* @event focusout
|
|
128
|
+
*/
|
|
114
129
|
this.$emit('focusout', event);
|
|
115
130
|
},
|
|
116
131
|
onFocusin(event) {
|
|
@@ -120,6 +135,11 @@ var script = {
|
|
|
120
135
|
if (this.isInputOrClearButton(relatedTarget)) {
|
|
121
136
|
return;
|
|
122
137
|
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Emitted when focus enters the search box (input or clear button).
|
|
141
|
+
* @event focusin
|
|
142
|
+
*/
|
|
123
143
|
this.$emit('focusin', event);
|
|
124
144
|
}
|
|
125
145
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import isPlainObject from 'lodash/isPlainObject';
|
|
2
2
|
import { BTab } from '../../../../vendor/bootstrap-vue/src/components/tabs/tab';
|
|
3
|
+
import GlBadge from '../../badge/badge';
|
|
3
4
|
import { DEFAULT_TAB_TITLE_LINK_CLASS } from '../constants';
|
|
4
5
|
import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
|
|
5
6
|
|
|
@@ -8,7 +9,8 @@ import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
|
|
|
8
9
|
var script = {
|
|
9
10
|
name: 'GlTab',
|
|
10
11
|
components: {
|
|
11
|
-
BTab
|
|
12
|
+
BTab,
|
|
13
|
+
GlBadge
|
|
12
14
|
},
|
|
13
15
|
inheritAttrs: false,
|
|
14
16
|
props: {
|
|
@@ -24,6 +26,24 @@ var script = {
|
|
|
24
26
|
type: String,
|
|
25
27
|
required: false,
|
|
26
28
|
default: null
|
|
29
|
+
},
|
|
30
|
+
/**
|
|
31
|
+
* Display a count badge next to the tab title.
|
|
32
|
+
*/
|
|
33
|
+
tabCount: {
|
|
34
|
+
type: Number,
|
|
35
|
+
required: false,
|
|
36
|
+
default: null
|
|
37
|
+
},
|
|
38
|
+
/**
|
|
39
|
+
* Screen reader text to provide context for the tab count value.
|
|
40
|
+
* Should be the result of calling n__() with the count.
|
|
41
|
+
* Example: :tab-count-sr-text="n__('%d changed file', '%d changed files', count)"
|
|
42
|
+
*/
|
|
43
|
+
tabCountSrText: {
|
|
44
|
+
type: String,
|
|
45
|
+
required: false,
|
|
46
|
+
default: null
|
|
27
47
|
}
|
|
28
48
|
},
|
|
29
49
|
computed: {
|
|
@@ -41,6 +61,15 @@ var script = {
|
|
|
41
61
|
};
|
|
42
62
|
}
|
|
43
63
|
return `${titleLinkClass} ${DEFAULT_TAB_TITLE_LINK_CLASS}`.trim();
|
|
64
|
+
},
|
|
65
|
+
hasTabCount() {
|
|
66
|
+
return this.tabCount != null && this.tabCount >= 0;
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
created() {
|
|
70
|
+
if (process.env.NODE_ENV !== 'production' && this.hasTabCount && !this.tabCountSrText) {
|
|
71
|
+
// eslint-disable-next-line no-console
|
|
72
|
+
console.warn('[GlTab] When using "tab-count", you should also provide "tab-count-sr-text" for screen reader accessibility. Example: :tab-count-sr-text="n__(\'%d item\', \'%d items\', count)"');
|
|
44
73
|
}
|
|
45
74
|
}
|
|
46
75
|
};
|
|
@@ -49,7 +78,7 @@ var script = {
|
|
|
49
78
|
const __vue_script__ = script;
|
|
50
79
|
|
|
51
80
|
/* template */
|
|
52
|
-
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('b-tab',_vm._g(_vm._b({attrs:{"title-link-class":_vm.linkClass,"query-param-value":_vm.queryParamValue},scopedSlots:_vm._u([_vm._l((Object.keys(_vm.$
|
|
81
|
+
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('b-tab',_vm._g(_vm._b({attrs:{"title":_vm.hasTabCount ? null : _vm.$attrs.title,"title-link-class":_vm.linkClass,"query-param-value":_vm.queryParamValue},scopedSlots:_vm._u([(_vm.hasTabCount)?{key:"title",fn:function(){return [_vm._t("title",function(){return [_vm._v(_vm._s(_vm.$attrs.title))]}),_vm._v(" "),_c('gl-badge',{staticClass:"gl-ml-2",attrs:{"variant":"neutral","aria-hidden":"true","data-testid":"tab-counter-badge"}},[_vm._v("\n "+_vm._s(_vm.tabCount)+"\n ")]),_vm._v(" "),(_vm.tabCountSrText)?_c('span',{staticClass:"gl-sr-only"},[_vm._v(_vm._s(_vm.tabCountSrText))]):_vm._e()]},proxy:true}:null,_vm._l((Object.keys(_vm.$scopedSlots)),function(slot){return {key:slot,fn:function(){return [_vm._t(slot)]},proxy:true}})],null,true)},'b-tab',_vm.$attrs,false),_vm.$listeners))};
|
|
53
82
|
var __vue_staticRenderFns__ = [];
|
|
54
83
|
|
|
55
84
|
/* style */
|
|
@@ -34,6 +34,32 @@ var script = {
|
|
|
34
34
|
type: Boolean,
|
|
35
35
|
required: false,
|
|
36
36
|
default: true
|
|
37
|
+
},
|
|
38
|
+
/**
|
|
39
|
+
* Adjusts the cell height of the grid. Setting this too high can leave unwanted whitespace
|
|
40
|
+
* between grid panels. Reduce the number to allow for a more compact grid.
|
|
41
|
+
* For more information, see:
|
|
42
|
+
* https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com/-/issues/3051
|
|
43
|
+
*/
|
|
44
|
+
cellHeight: {
|
|
45
|
+
type: Number,
|
|
46
|
+
required: false,
|
|
47
|
+
/* Magic number:
|
|
48
|
+
* After allowing for padding, and the panel title row, this leaves us with minimum 48px height for the cell content.
|
|
49
|
+
* This means text/content with our spacing scale can fit up to 49px without scrolling.
|
|
50
|
+
*/
|
|
51
|
+
default: 137,
|
|
52
|
+
validator: value => value > 0
|
|
53
|
+
},
|
|
54
|
+
/**
|
|
55
|
+
* Sets a default minimum height for grid panels. This can still be overriden on a per-panel
|
|
56
|
+
* basis by setting `value.panels[].gridAttributes.minHeight`
|
|
57
|
+
*/
|
|
58
|
+
minCellHeight: {
|
|
59
|
+
type: Number,
|
|
60
|
+
required: false,
|
|
61
|
+
default: 1,
|
|
62
|
+
validator: value => value > 0
|
|
37
63
|
}
|
|
38
64
|
},
|
|
39
65
|
computed: {
|
|
@@ -56,7 +82,7 @@ var script = {
|
|
|
56
82
|
const __vue_script__ = script;
|
|
57
83
|
|
|
58
84
|
/* template */
|
|
59
|
-
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('section',{staticClass:"gl-my-4 gl-flex gl-items-center"},[_vm._t("header",function(){return [_c('div',{staticClass:"gl-flex gl-w-full gl-flex-col"},[_c('div',{staticClass:"gl-flex gl-items-center"},[_vm._t("title",function(){return [_c('h2',{staticClass:"gl-my-0",attrs:{"data-testid":"title"}},[_vm._v(_vm._s(_vm.config.title))])]})],2),_vm._v(" "),(_vm.dashboardHasDescription)?_c('div',{staticClass:"gl-mt-3 gl-flex"},[_vm._t("description",function(){return [_c('p',{staticClass:"gl-mb-0",attrs:{"data-testid":"description"}},[_vm._v("\n "+_vm._s(_vm.config.description)+"\n ")])]})],2):_vm._e()])]}),_vm._v(" "),(_vm.$scopedSlots.actions)?_c('div',{attrs:{"data-testid":"actions-container"}},[_vm._t("actions")],2):_vm._e()],2),_vm._v(" "),_c('div',{staticClass:"gl-flex"},[_c('div',{staticClass:"gl-flex gl-grow gl-flex-col"},[_vm._t("alert"),_vm._v(" "),(_vm.$scopedSlots.filters)?_c('section',{staticClass:"gl-flex gl-flex-row gl-flex-wrap gl-gap-5 gl-pb-3 gl-pt-4",attrs:{"data-testid":"filters-container"}},[_vm._t("filters")],2):_vm._e(),_vm._v(" "),(_vm.dashboardHasPanels)?_c('grid-layout',{staticClass:"-gl-mx-3",attrs:{"value":_vm.config,"is-static-grid":_vm.isStaticGrid},on:{"input":_vm.emitChanges},scopedSlots:_vm._u([{key:"panel",fn:function(ref){
|
|
85
|
+
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('section',{staticClass:"gl-my-4 gl-flex gl-items-center"},[_vm._t("header",function(){return [_c('div',{staticClass:"gl-flex gl-w-full gl-flex-col"},[_c('div',{staticClass:"gl-flex gl-items-center"},[_vm._t("title",function(){return [_c('h2',{staticClass:"gl-my-0",attrs:{"data-testid":"title"}},[_vm._v(_vm._s(_vm.config.title))])]})],2),_vm._v(" "),(_vm.dashboardHasDescription)?_c('div',{staticClass:"gl-mt-3 gl-flex"},[_vm._t("description",function(){return [_c('p',{staticClass:"gl-mb-0",attrs:{"data-testid":"description"}},[_vm._v("\n "+_vm._s(_vm.config.description)+"\n ")])]})],2):_vm._e()])]}),_vm._v(" "),(_vm.$scopedSlots.actions)?_c('div',{attrs:{"data-testid":"actions-container"}},[_vm._t("actions")],2):_vm._e()],2),_vm._v(" "),_c('div',{staticClass:"gl-flex"},[_c('div',{staticClass:"gl-flex gl-grow gl-flex-col"},[_vm._t("alert"),_vm._v(" "),(_vm.$scopedSlots.filters)?_c('section',{staticClass:"gl-flex gl-flex-row gl-flex-wrap gl-gap-5 gl-pb-3 gl-pt-4",attrs:{"data-testid":"filters-container"}},[_vm._t("filters")],2):_vm._e(),_vm._v(" "),(_vm.dashboardHasPanels)?_c('grid-layout',{staticClass:"-gl-mx-3",attrs:{"value":_vm.config,"is-static-grid":_vm.isStaticGrid,"cell-height":_vm.cellHeight,"min-cell-height":_vm.minCellHeight},on:{"input":_vm.emitChanges},scopedSlots:_vm._u([{key:"panel",fn:function(ref){
|
|
60
86
|
var panel = ref.panel;
|
|
61
87
|
return [_vm._t("panel",null,null,{ panel: panel })]}}],null,true)}):_vm._t("empty-state")],2)]),_vm._v(" "),_vm._t("footer")],2)};
|
|
62
88
|
var __vue_staticRenderFns__ = [];
|