@gitlab/ui 111.5.0 → 111.7.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 (45) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/components/base/accordion/accordion.js +4 -5
  3. package/dist/components/base/accordion/accordion_item.js +45 -17
  4. package/dist/components/base/accordion/constants.js +3 -0
  5. package/dist/components/base/datepicker/datepicker.js +2 -1
  6. package/dist/components/base/link/link.js +18 -9
  7. package/dist/components/charts/chart/chart.js +29 -23
  8. package/dist/config.js +10 -2
  9. package/dist/utils/charts/config.js +1 -4
  10. package/dist/vendor/bootstrap-vue/src/constants/components.js +1 -7
  11. package/package.json +3 -3
  12. package/src/components/base/accordion/accordion.vue +4 -6
  13. package/src/components/base/accordion/accordion_item.vue +57 -26
  14. package/src/components/base/accordion/constants.js +1 -0
  15. package/src/components/base/datepicker/datepicker.vue +2 -1
  16. package/src/components/base/link/link.vue +17 -5
  17. package/src/components/charts/chart/chart.vue +17 -20
  18. package/src/config.js +10 -1
  19. package/src/utils/charts/config.js +0 -3
  20. package/src/vendor/bootstrap-vue/src/constants/components.js +0 -6
  21. package/dist/vendor/bootstrap-vue/src/components/form-input/form-input.js +0 -157
  22. package/dist/vendor/bootstrap-vue/src/components/form-input/index.js +0 -1
  23. package/dist/vendor/bootstrap-vue/src/components/input-group/index.js +0 -5
  24. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group-addon.js +0 -44
  25. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group-append.js +0 -34
  26. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group-prepend.js +0 -34
  27. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group-text.js +0 -31
  28. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group.js +0 -75
  29. package/src/vendor/bootstrap-vue/src/components/form-input/README.md +0 -612
  30. package/src/vendor/bootstrap-vue/src/components/form-input/form-input.js +0 -168
  31. package/src/vendor/bootstrap-vue/src/components/form-input/form-input.spec.js +0 -989
  32. package/src/vendor/bootstrap-vue/src/components/form-input/index.js +0 -3
  33. package/src/vendor/bootstrap-vue/src/components/form-input/package.json +0 -135
  34. package/src/vendor/bootstrap-vue/src/components/input-group/README.md +0 -329
  35. package/src/vendor/bootstrap-vue/src/components/input-group/index.js +0 -7
  36. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-addon.js +0 -43
  37. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-append.js +0 -31
  38. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-append.spec.js +0 -84
  39. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-prepend.js +0 -31
  40. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-prepend.spec.js +0 -84
  41. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-text.js +0 -31
  42. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-text.spec.js +0 -45
  43. package/src/vendor/bootstrap-vue/src/components/input-group/input-group.js +0 -73
  44. package/src/vendor/bootstrap-vue/src/components/input-group/input-group.spec.js +0 -153
  45. package/src/vendor/bootstrap-vue/src/components/input-group/package.json +0 -109
package/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # [111.7.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v111.6.0...v111.7.0) (2025-03-25)
2
+
3
+
4
+ ### Features
5
+
6
+ * **GlChart:** Allow charts to opt-out of aria ([14c0bfc](https://gitlab.com/gitlab-org/gitlab-ui/commit/14c0bfc4d8cf1eb57b865856e6ecf0a7461d0be4))
7
+
8
+ # [111.6.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v111.5.0...v111.6.0) (2025-03-25)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **GlLink:** fix passing of attributes to Vue 3 RouterLink ([0e2632d](https://gitlab.com/gitlab-org/gitlab-ui/commit/0e2632d609985500713c1c10dbe48548eb1f4317))
14
+
15
+
16
+ ### Features
17
+
18
+ * **GlDatepicker:** Add global firstDay config ([4b3c9a8](https://gitlab.com/gitlab-org/gitlab-ui/commit/4b3c9a8fc21b534245274d30dee86562d48250bb))
19
+
1
20
  # [111.5.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v111.4.0...v111.5.0) (2025-03-20)
2
21
 
3
22
 
@@ -1,15 +1,14 @@
1
- import uniqueId from 'lodash/uniqueId';
2
1
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
3
2
 
4
3
  var script = {
5
4
  name: 'GlAccordion',
6
5
  provide() {
7
- const accordionId = uniqueId('accordion-set-');
8
- // temporary fix for this issue: https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/2019#note_514671251
9
- // MR for the upstream pending: https://github.com/vuejs/apollo/pull/1153
10
6
  return {
7
+ // temporary fix for this issue: https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/2019#note_514671251
8
+ // MR for the upstream pending: https://github.com/vuejs/apollo/pull/1153
9
+ // Track removing this workaround in https://gitlab.com/gitlab-org/gitlab-ui/-/issues/3152
11
10
  defaultHeaderLevel: () => this.headerLevel,
12
- accordionSetId: () => this.autoCollapse && accordionId
11
+ autoCollapse: () => this.autoCollapse
13
12
  };
14
13
  },
15
14
  props: {
@@ -1,21 +1,18 @@
1
1
  import uniqueId from 'lodash/uniqueId';
2
- import { BCollapse } from '../../../vendor/bootstrap-vue/src/components/collapse/collapse';
2
+ import GlCollapse from '../collapse/collapse';
3
3
  import GlAnimatedChevronRightDownIcon from '../animated_icon/animated_chevron_right_down_icon';
4
- import { GlCollapseToggleDirective } from '../../../directives/collapse_toggle';
5
4
  import GlButton from '../button/button';
5
+ import { COLLAPSE_EVENT } from './constants';
6
6
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
7
7
 
8
8
  var script = {
9
9
  name: 'GlAccordionItem',
10
10
  components: {
11
- BCollapse,
11
+ GlCollapse,
12
12
  GlButton,
13
13
  GlAnimatedChevronRightDownIcon
14
14
  },
15
- directives: {
16
- GlCollapseToggle: GlCollapseToggleDirective
17
- },
18
- inject: ['accordionSetId', 'defaultHeaderLevel'],
15
+ inject: ['defaultHeaderLevel', 'autoCollapse'],
19
16
  inheritAttrs: false,
20
17
  model: {
21
18
  prop: 'visible',
@@ -68,7 +65,7 @@ var script = {
68
65
  data() {
69
66
  return {
70
67
  accordionItemId: uniqueId('accordion-item-'),
71
- isVisible: this.visible
68
+ localVisible: this.visible
72
69
  };
73
70
  },
74
71
  computed: {
@@ -76,18 +73,49 @@ var script = {
76
73
  const level = this.headerLevel || this.defaultHeaderLevel();
77
74
  return `h${level}`;
78
75
  },
79
- accordion() {
80
- return this.accordionSetId() || undefined;
81
- },
82
76
  buttonTitle() {
83
- return this.isVisible && this.titleVisible ? this.titleVisible : this.title;
77
+ return this.localVisible && this.titleVisible ? this.titleVisible : this.title;
84
78
  }
85
79
  },
86
80
  watch: {
87
- isVisible: {
88
- immediate: true,
89
- handler(isVisible) {
90
- this.$emit('input', isVisible);
81
+ visible: {
82
+ handler(newVisible) {
83
+ this.localVisible = newVisible;
84
+ this.checkAndCollapseSiblingAccordionItems(newVisible);
85
+ }
86
+ }
87
+ },
88
+ created() {
89
+ this.$emit('input', this.localVisible);
90
+ },
91
+ mounted() {
92
+ this.$parent.$el.addEventListener(COLLAPSE_EVENT, this.onParentCollapse);
93
+ },
94
+ beforeDestroy() {
95
+ this.$parent.$el.removeEventListener(COLLAPSE_EVENT, this.onParentCollapse);
96
+ },
97
+ methods: {
98
+ onParentCollapse(_ref) {
99
+ let {
100
+ detail: accordionItemId
101
+ } = _ref;
102
+ if (accordionItemId === this.accordionItemId) {
103
+ return;
104
+ }
105
+ this.$emit('input', false);
106
+ this.localVisible = false;
107
+ },
108
+ onButtonClick() {
109
+ const newLocalVisible = !this.localVisible;
110
+ this.$emit('input', newLocalVisible);
111
+ this.localVisible = newLocalVisible;
112
+ this.checkAndCollapseSiblingAccordionItems(newLocalVisible);
113
+ },
114
+ checkAndCollapseSiblingAccordionItems(newVisible) {
115
+ if (this.autoCollapse() && newVisible) {
116
+ this.$parent.$el.dispatchEvent(new CustomEvent(COLLAPSE_EVENT, {
117
+ detail: this.accordionItemId
118
+ }));
91
119
  }
92
120
  }
93
121
  }
@@ -97,7 +125,7 @@ var script = {
97
125
  const __vue_script__ = script;
98
126
 
99
127
  /* template */
100
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"gl-accordion-item"},[_c(_vm.headerComponent,{tag:"component",staticClass:"gl-accordion-item-header",class:_vm.headerClass},[_c('gl-button',{directives:[{name:"gl-collapse-toggle",rawName:"v-gl-collapse-toggle",value:(_vm.accordionItemId),expression:"accordionItemId"}],attrs:{"variant":"link","button-text-classes":"gl-flex"}},[_c('gl-animated-chevron-right-down-icon',{attrs:{"is-on":_vm.isVisible}}),_vm._v("\n "+_vm._s(_vm.buttonTitle)+"\n ")],1)],1),_vm._v(" "),_c('b-collapse',{staticClass:"gl-mt-3 gl-text-base",attrs:{"id":_vm.accordionItemId,"visible":_vm.isVisible,"accordion":_vm.accordion,"data-testid":("accordion-item-collapse-" + _vm.accordionItemId)},model:{value:(_vm.isVisible),callback:function ($$v) {_vm.isVisible=$$v;},expression:"isVisible"}},[_vm._t("default")],2)],1)};
128
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"gl-accordion-item"},[_c(_vm.headerComponent,{tag:"component",staticClass:"gl-accordion-item-header",class:_vm.headerClass},[_c('gl-button',{attrs:{"variant":"link","button-text-classes":"gl-flex","aria-expanded":_vm.localVisible ? 'true' : 'false',"aria-controls":_vm.accordionItemId},on:{"click":_vm.onButtonClick}},[_c('gl-animated-chevron-right-down-icon',{attrs:{"is-on":_vm.localVisible}}),_vm._v("\n "+_vm._s(_vm.buttonTitle)+"\n ")],1)],1),_vm._v(" "),_c('gl-collapse',{attrs:{"id":_vm.accordionItemId,"data-testid":("accordion-item-collapse-" + _vm.accordionItemId)},model:{value:(_vm.localVisible),callback:function ($$v) {_vm.localVisible=$$v;},expression:"localVisible"}},[_c('div',{staticClass:"gl-mt-3 gl-text-base"},[_vm._t("default")],2)])],1)};
101
129
  var __vue_staticRenderFns__ = [];
102
130
 
103
131
  /* style */
@@ -0,0 +1,3 @@
1
+ const COLLAPSE_EVENT = 'collapse';
2
+
3
+ export { COLLAPSE_EVENT };
@@ -1,5 +1,6 @@
1
1
  import isString from 'lodash/isString';
2
2
  import Pikaday from 'pikaday';
3
+ import { defaultConfig } from '../../../config';
3
4
  import { defaultDateFormat, datepickerWidthOptionsMap } from '../../../utils/constants';
4
5
  import { areDatesEqual } from '../../../utils/datetime_utility';
5
6
  import GlButton from '../button/button';
@@ -119,7 +120,7 @@ var script = {
119
120
  firstDay: {
120
121
  type: Number,
121
122
  required: false,
122
- default: 0
123
+ default: () => defaultConfig.firstDayOfWeek || 0 // Defaults to 0 (Sunday)
123
124
  },
124
125
  ariaLabel: {
125
126
  type: String,
@@ -22,6 +22,7 @@ var script = {
22
22
  directives: {
23
23
  SafeLink: SafeLinkDirective
24
24
  },
25
+ inheritAttrs: false,
25
26
  props: {
26
27
  /**
27
28
  * Denotes the target URL of the link for standard links.
@@ -189,15 +190,22 @@ var script = {
189
190
  return fallback;
190
191
  },
191
192
  computedProps() {
193
+ const baseRouterLinkProps = {
194
+ to: this.to,
195
+ activeClass: this.activeClass,
196
+ exactActiveClass: this.exactActiveClass,
197
+ replace: this.replace,
198
+ ...(isBoolean(this.prefetch) ? {
199
+ prefetch: this.prefetch
200
+ } : {})
201
+ };
192
202
  if (this.isRouterLink) {
203
+ if (this.isVue3RouterLink) {
204
+ return baseRouterLinkProps;
205
+ }
193
206
  return {
194
- to: this.to,
195
- activeClass: this.activeClass,
196
- exactActiveClass: this.exactActiveClass,
197
- replace: this.replace,
198
- ...(isBoolean(this.prefetch) ? {
199
- prefetch: this.prefetch
200
- } : {})
207
+ ...baseRouterLinkProps,
208
+ ...this.$attrs
201
209
  };
202
210
  }
203
211
  return {
@@ -208,7 +216,8 @@ var script = {
208
216
  } : {}),
209
217
  rel: this.rel,
210
218
  target: this.target,
211
- href: this.computedHref
219
+ href: this.computedHref,
220
+ ...this.$attrs
212
221
  };
213
222
  },
214
223
  computedListeners() {
@@ -293,7 +302,7 @@ var _obj;
293
302
  var routerLinkHref = ref.href;
294
303
  var isActive = ref.isActive;
295
304
  var isExactActive = ref.isExactActive;
296
- var navigate = ref.navigate;return [_c('a',_vm._g({directives:[{name:"safe-link",rawName:"v-safe-link:[safeLinkConfig]",arg:_vm.safeLinkConfig}],class:[_vm.computedClass, ( _obj = {}, _obj[_vm.activeClass] = isActive, _obj[_vm.exactActiveClass] = isExactActive, _obj )],attrs:{"href":routerLinkHref},on:{"click":function($event){return _vm.onClick($event, navigate)}}},_vm.computedListeners),[_vm._t("default")],2)]}}],null,true)},'component',_vm.computedProps,false)):(_vm.isRouterLink)?_c(_vm.tag,_vm._g(_vm._b({directives:[{name:"safe-link",rawName:"v-safe-link:[safeLinkConfig]",arg:_vm.safeLinkConfig}],tag:"component",class:_vm.computedClass,nativeOn:{"click":function($event){return _vm.onClick.apply(null, arguments)}}},'component',_vm.computedProps,false),_vm.computedListeners),[_vm._t("default")],2):_c(_vm.tag,_vm._g(_vm._b({directives:[{name:"safe-link",rawName:"v-safe-link:[safeLinkConfig]",arg:_vm.safeLinkConfig}],tag:"component",class:_vm.computedClass,on:{"click":_vm.onClick}},'component',_vm.computedProps,false),_vm.computedListeners),[_vm._t("default")],2)};
305
+ var navigate = ref.navigate;return [_c('a',_vm._g(_vm._b({directives:[{name:"safe-link",rawName:"v-safe-link:[safeLinkConfig]",arg:_vm.safeLinkConfig}],class:[_vm.computedClass, ( _obj = {}, _obj[_vm.activeClass] = isActive, _obj[_vm.exactActiveClass] = isExactActive, _obj )],attrs:{"href":routerLinkHref},on:{"click":function($event){return _vm.onClick($event, navigate)}}},'a',_vm.$attrs,false),_vm.computedListeners),[_vm._t("default")],2)]}}],null,true)},'component',_vm.computedProps,false)):(_vm.isRouterLink)?_c(_vm.tag,_vm._g(_vm._b({directives:[{name:"safe-link",rawName:"v-safe-link:[safeLinkConfig]",arg:_vm.safeLinkConfig}],tag:"component",class:_vm.computedClass,nativeOn:{"click":function($event){return _vm.onClick.apply(null, arguments)}}},'component',_vm.computedProps,false),_vm.computedListeners),[_vm._t("default")],2):_c(_vm.tag,_vm._g(_vm._b({directives:[{name:"safe-link",rawName:"v-safe-link:[safeLinkConfig]",arg:_vm.safeLinkConfig}],tag:"component",class:_vm.computedClass,on:{"click":_vm.onClick}},'component',_vm.computedProps,false),_vm.computedListeners),[_vm._t("default")],2)};
297
306
  var __vue_staticRenderFns__ = [];
298
307
 
299
308
  /* style */
@@ -1,5 +1,6 @@
1
1
  import * as echarts from 'echarts';
2
- import { validRenderers, defaultWidth, defaultHeight, toolboxHeight } from '../../../utils/charts/config';
2
+ import merge from 'lodash/merge';
3
+ import { validRenderers, toolboxHeight, defaultWidth, defaultHeight } from '../../../utils/charts/config';
3
4
  import { themeName, createTheme } from '../../../utils/charts/theme';
4
5
  import { GlResizeObserverDirective } from '../../../directives/resize_observer/resize_observer';
5
6
  import { debounceByAnimationFrame } from '../../../utils/utils';
@@ -12,20 +13,6 @@ import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
12
13
  * https://echarts.apache.org/en/api.html#echartsInstance.resize
13
14
  */
14
15
  const sizeValidator = size => Number.isFinite(size) || size === 'auto' || size == null;
15
- const isChartWithToolbox = options => {
16
- var _options$toolbox;
17
- return Boolean(options === null || options === void 0 ? void 0 : (_options$toolbox = options.toolbox) === null || _options$toolbox === void 0 ? void 0 : _options$toolbox.show);
18
- };
19
- const increaseChartGridTop = (options, increaseBy) => {
20
- var _options$grid;
21
- return {
22
- ...options,
23
- grid: {
24
- ...options.grid,
25
- top: ((options === null || options === void 0 ? void 0 : (_options$grid = options.grid) === null || _options$grid === void 0 ? void 0 : _options$grid.top) || 0) + increaseBy
26
- }
27
- };
28
- };
29
16
  var script = {
30
17
  name: 'GlChart',
31
18
  directives: {
@@ -89,8 +76,32 @@ var script = {
89
76
  };
90
77
  },
91
78
  computed: {
92
- normalizedOptions() {
93
- return isChartWithToolbox(this.options) ? increaseChartGridTop(this.options, toolboxHeight) : this.options;
79
+ modifiedOptions() {
80
+ var _options$aria, _options$toolbox;
81
+ let options = {
82
+ ...this.options
83
+ };
84
+
85
+ // Enable aria by default
86
+ if (((_options$aria = options.aria) === null || _options$aria === void 0 ? void 0 : _options$aria.enabled) === undefined) {
87
+ options = merge({}, options, {
88
+ aria: {
89
+ enabled: true
90
+ }
91
+ });
92
+ }
93
+
94
+ // Add space at the top to fit the toolbox
95
+ if (((_options$toolbox = options.toolbox) === null || _options$toolbox === void 0 ? void 0 : _options$toolbox.show) === true) {
96
+ var _options$grid;
97
+ const top = (((_options$grid = options.grid) === null || _options$grid === void 0 ? void 0 : _options$grid.top) || 0) + toolboxHeight;
98
+ options = merge({}, options, {
99
+ grid: {
100
+ top
101
+ }
102
+ });
103
+ }
104
+ return options;
94
105
  }
95
106
  },
96
107
  watch: {
@@ -137,12 +148,7 @@ var script = {
137
148
  },
138
149
  methods: {
139
150
  draw() {
140
- this.chart.setOption({
141
- ...this.normalizedOptions,
142
- aria: {
143
- enabled: true
144
- }
145
- });
151
+ this.chart.setOption(this.modifiedOptions);
146
152
  /**
147
153
  * Emitted after calling `echarts.setOption`
148
154
  */
package/dist/config.js CHANGED
@@ -32,6 +32,9 @@ try {
32
32
  // localStorage doesn't exist (or the value is not properly formatted)
33
33
  }
34
34
  const i18n = translationKeys;
35
+ const defaultConfig = {
36
+ firstDayOfWeek: 0 // Defaults to 0 (Sunday)
37
+ };
35
38
  let configured = false;
36
39
 
37
40
  /**
@@ -40,10 +43,12 @@ let configured = false;
40
43
  * @typedef {object} GitLabUIConfiguration
41
44
  * @template TValue=string
42
45
  * @property {undefined | Object} translations Generic translations for component labels to fall back to.
46
+ * @property {undefined | Number} firstDayOfWeek Configured first day of the week, from 0 (Sunday) to 6 (Saturday).
43
47
  */
44
48
  const setConfigs = function () {
45
49
  let {
46
- translations
50
+ translations,
51
+ firstDayOfWeek
47
52
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
48
53
  if (configured) {
49
54
  if (process.env.NODE_ENV === 'development') {
@@ -58,6 +63,9 @@ const setConfigs = function () {
58
63
  delay: popoverDelayConfig
59
64
  }
60
65
  });
66
+ if (typeof firstDayOfWeek === 'number' && firstDayOfWeek >= 0 && firstDayOfWeek <= 6) {
67
+ defaultConfig.firstDayOfWeek = firstDayOfWeek;
68
+ }
61
69
  if (typeof translations === 'object') {
62
70
  if (process.env.NODE_ENV === 'development') {
63
71
  const undefinedTranslationKeys = Object.keys(i18n).reduce((acc, current) => {
@@ -78,4 +86,4 @@ const setConfigs = function () {
78
86
  };
79
87
 
80
88
  export default setConfigs;
81
- export { i18n };
89
+ export { defaultConfig, i18n };
@@ -40,10 +40,7 @@ const grid = {
40
40
  const defaultChartOptions = {
41
41
  grid,
42
42
  xAxis,
43
- yAxis,
44
- aria: {
45
- enabled: true
46
- }
43
+ yAxis
47
44
  };
48
45
  const gridWithSecondaryYAxis = {
49
46
  ...grid,
@@ -15,7 +15,6 @@ const NAME_FORM = 'BForm';
15
15
  const NAME_FORM_CHECKBOX = 'BFormCheckbox';
16
16
  const NAME_FORM_CHECKBOX_GROUP = 'BFormCheckboxGroup';
17
17
  const NAME_FORM_GROUP = 'BFormGroup';
18
- const NAME_FORM_INPUT = 'BFormInput';
19
18
  const NAME_FORM_INVALID_FEEDBACK = 'BFormInvalidFeedback';
20
19
  const NAME_FORM_RADIO = 'BFormRadio';
21
20
  const NAME_FORM_RADIO_GROUP = 'BFormRadioGroup';
@@ -26,11 +25,6 @@ const NAME_FORM_SELECT_OPTION_GROUP = 'BFormSelectOptionGroup';
26
25
  const NAME_FORM_TEXT = 'BFormText';
27
26
  const NAME_FORM_TEXTAREA = 'BFormTextarea';
28
27
  const NAME_FORM_VALID_FEEDBACK = 'BFormValidFeedback';
29
- const NAME_INPUT_GROUP = 'BInputGroup';
30
- const NAME_INPUT_GROUP_ADDON = 'BInputGroupAddon';
31
- const NAME_INPUT_GROUP_APPEND = 'BInputGroupAppend';
32
- const NAME_INPUT_GROUP_PREPEND = 'BInputGroupPrepend';
33
- const NAME_INPUT_GROUP_TEXT = 'BInputGroupText';
34
28
  const NAME_LINK = 'BLink';
35
29
  const NAME_MODAL = 'BModal';
36
30
  const NAME_NAV = 'BNav';
@@ -67,4 +61,4 @@ const NAME_TRANSITION = 'BVTransition';
67
61
  const NAME_TRANSPORTER = 'BVTransporter';
68
62
  const NAME_TRANSPORTER_TARGET = 'BVTransporterTarget';
69
63
 
70
- export { NAME_BUTTON, NAME_BUTTON_CLOSE, NAME_COL, NAME_COLLAPSE, NAME_COLLAPSE_HELPER, NAME_DROPDOWN, NAME_DROPDOWN_DIVIDER, NAME_DROPDOWN_FORM, NAME_DROPDOWN_GROUP, NAME_DROPDOWN_HEADER, NAME_DROPDOWN_ITEM, NAME_DROPDOWN_ITEM_BUTTON, NAME_DROPDOWN_TEXT, NAME_FORM, NAME_FORM_BUTTON_LABEL_CONTROL, NAME_FORM_CHECKBOX, NAME_FORM_CHECKBOX_GROUP, NAME_FORM_GROUP, NAME_FORM_INPUT, NAME_FORM_INVALID_FEEDBACK, NAME_FORM_RADIO, NAME_FORM_RADIO_GROUP, NAME_FORM_RATING_STAR, NAME_FORM_ROW, NAME_FORM_SELECT, NAME_FORM_SELECT_OPTION, NAME_FORM_SELECT_OPTION_GROUP, NAME_FORM_TEXT, NAME_FORM_TEXTAREA, NAME_FORM_VALID_FEEDBACK, NAME_INPUT_GROUP, NAME_INPUT_GROUP_ADDON, NAME_INPUT_GROUP_APPEND, NAME_INPUT_GROUP_PREPEND, NAME_INPUT_GROUP_TEXT, NAME_LINK, NAME_MODAL, NAME_NAV, NAME_NAV_ITEM, NAME_NAV_ITEM_DROPDOWN, NAME_POPOVER, NAME_POPOVER_HELPER, NAME_POPOVER_TEMPLATE, NAME_POPPER, NAME_TAB, NAME_TABLE, NAME_TABLE_CELL, NAME_TABLE_LITE, NAME_TABLE_SIMPLE, NAME_TABS, NAME_TAB_BUTTON_HELPER, NAME_TBODY, NAME_TFOOT, NAME_TH, NAME_THEAD, NAME_TOAST, NAME_TOASTER, NAME_TOAST_POP, NAME_TOOLTIP, NAME_TOOLTIP_HELPER, NAME_TOOLTIP_TEMPLATE, NAME_TR, NAME_TRANSITION, NAME_TRANSPORTER, NAME_TRANSPORTER_TARGET };
64
+ export { NAME_BUTTON, NAME_BUTTON_CLOSE, NAME_COL, NAME_COLLAPSE, NAME_COLLAPSE_HELPER, NAME_DROPDOWN, NAME_DROPDOWN_DIVIDER, NAME_DROPDOWN_FORM, NAME_DROPDOWN_GROUP, NAME_DROPDOWN_HEADER, NAME_DROPDOWN_ITEM, NAME_DROPDOWN_ITEM_BUTTON, NAME_DROPDOWN_TEXT, NAME_FORM, NAME_FORM_BUTTON_LABEL_CONTROL, NAME_FORM_CHECKBOX, NAME_FORM_CHECKBOX_GROUP, NAME_FORM_GROUP, NAME_FORM_INVALID_FEEDBACK, NAME_FORM_RADIO, NAME_FORM_RADIO_GROUP, NAME_FORM_RATING_STAR, NAME_FORM_ROW, NAME_FORM_SELECT, NAME_FORM_SELECT_OPTION, NAME_FORM_SELECT_OPTION_GROUP, NAME_FORM_TEXT, NAME_FORM_TEXTAREA, NAME_FORM_VALID_FEEDBACK, NAME_LINK, NAME_MODAL, NAME_NAV, NAME_NAV_ITEM, NAME_NAV_ITEM_DROPDOWN, NAME_POPOVER, NAME_POPOVER_HELPER, NAME_POPOVER_TEMPLATE, NAME_POPPER, NAME_TAB, NAME_TABLE, NAME_TABLE_CELL, NAME_TABLE_LITE, NAME_TABLE_SIMPLE, NAME_TABS, NAME_TAB_BUTTON_HELPER, NAME_TBODY, NAME_TFOOT, NAME_TH, NAME_THEAD, NAME_TOAST, NAME_TOASTER, NAME_TOAST_POP, NAME_TOOLTIP, NAME_TOOLTIP_HELPER, NAME_TOOLTIP_TEMPLATE, NAME_TR, NAME_TRANSITION, NAME_TRANSPORTER, NAME_TRANSPORTER_TARGET };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "111.5.0",
3
+ "version": "111.7.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -170,8 +170,8 @@
170
170
  "npm-run-all": "^4.1.5",
171
171
  "patch-package": "^8.0.0",
172
172
  "pikaday": "^1.8.0",
173
- "playwright": "^1.51.0",
174
- "playwright-core": "^1.51.0",
173
+ "playwright": "^1.51.1",
174
+ "playwright-core": "^1.51.1",
175
175
  "postcss": "8.4.28",
176
176
  "postcss-loader": "^7.0.2",
177
177
  "postcss-scss": "4.0.4",
@@ -1,15 +1,13 @@
1
1
  <script>
2
- import uniqueId from 'lodash/uniqueId';
3
-
4
2
  export default {
5
3
  name: 'GlAccordion',
6
4
  provide() {
7
- const accordionId = uniqueId('accordion-set-');
8
- // temporary fix for this issue: https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/2019#note_514671251
9
- // MR for the upstream pending: https://github.com/vuejs/apollo/pull/1153
10
5
  return {
6
+ // temporary fix for this issue: https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/2019#note_514671251
7
+ // MR for the upstream pending: https://github.com/vuejs/apollo/pull/1153
8
+ // Track removing this workaround in https://gitlab.com/gitlab-org/gitlab-ui/-/issues/3152
11
9
  defaultHeaderLevel: () => this.headerLevel,
12
- accordionSetId: () => this.autoCollapse && accordionId,
10
+ autoCollapse: () => this.autoCollapse,
13
11
  };
14
12
  },
15
13
  props: {
@@ -1,21 +1,18 @@
1
1
  <script>
2
2
  import uniqueId from 'lodash/uniqueId';
3
- import { BCollapse } from '../../../vendor/bootstrap-vue/src/components/collapse/collapse';
3
+ import GlCollapse from '../collapse/collapse.vue';
4
4
  import GlAnimatedChevronRightDownIcon from '../animated_icon/animated_chevron_right_down_icon.vue';
5
- import { GlCollapseToggleDirective } from '../../../directives/collapse_toggle';
6
5
  import GlButton from '../button/button.vue';
6
+ import { COLLAPSE_EVENT } from './constants';
7
7
 
8
8
  export default {
9
9
  name: 'GlAccordionItem',
10
10
  components: {
11
- BCollapse,
11
+ GlCollapse,
12
12
  GlButton,
13
13
  GlAnimatedChevronRightDownIcon,
14
14
  },
15
- directives: {
16
- GlCollapseToggle: GlCollapseToggleDirective,
17
- },
18
- inject: ['accordionSetId', 'defaultHeaderLevel'],
15
+ inject: ['defaultHeaderLevel', 'autoCollapse'],
19
16
  inheritAttrs: false,
20
17
  model: {
21
18
  prop: 'visible',
@@ -68,7 +65,7 @@ export default {
68
65
  data() {
69
66
  return {
70
67
  accordionItemId: uniqueId('accordion-item-'),
71
- isVisible: this.visible,
68
+ localVisible: this.visible,
72
69
  };
73
70
  },
74
71
  computed: {
@@ -76,21 +73,54 @@ export default {
76
73
  const level = this.headerLevel || this.defaultHeaderLevel();
77
74
  return `h${level}`;
78
75
  },
79
- accordion() {
80
- return this.accordionSetId() || undefined;
81
- },
82
76
  buttonTitle() {
83
- return this.isVisible && this.titleVisible ? this.titleVisible : this.title;
77
+ return this.localVisible && this.titleVisible ? this.titleVisible : this.title;
84
78
  },
85
79
  },
80
+
86
81
  watch: {
87
- isVisible: {
88
- immediate: true,
89
- handler(isVisible) {
90
- this.$emit('input', isVisible);
82
+ visible: {
83
+ handler(newVisible) {
84
+ this.localVisible = newVisible;
85
+
86
+ this.checkAndCollapseSiblingAccordionItems(newVisible);
91
87
  },
92
88
  },
93
89
  },
90
+ created() {
91
+ this.$emit('input', this.localVisible);
92
+ },
93
+ mounted() {
94
+ this.$parent.$el.addEventListener(COLLAPSE_EVENT, this.onParentCollapse);
95
+ },
96
+ beforeDestroy() {
97
+ this.$parent.$el.removeEventListener(COLLAPSE_EVENT, this.onParentCollapse);
98
+ },
99
+ methods: {
100
+ onParentCollapse({ detail: accordionItemId }) {
101
+ if (accordionItemId === this.accordionItemId) {
102
+ return;
103
+ }
104
+
105
+ this.$emit('input', false);
106
+ this.localVisible = false;
107
+ },
108
+ onButtonClick() {
109
+ const newLocalVisible = !this.localVisible;
110
+
111
+ this.$emit('input', newLocalVisible);
112
+ this.localVisible = newLocalVisible;
113
+
114
+ this.checkAndCollapseSiblingAccordionItems(newLocalVisible);
115
+ },
116
+ checkAndCollapseSiblingAccordionItems(newVisible) {
117
+ if (this.autoCollapse() && newVisible) {
118
+ this.$parent.$el.dispatchEvent(
119
+ new CustomEvent(COLLAPSE_EVENT, { detail: this.accordionItemId })
120
+ );
121
+ }
122
+ },
123
+ },
94
124
  };
95
125
  </script>
96
126
 
@@ -98,24 +128,25 @@ export default {
98
128
  <div class="gl-accordion-item">
99
129
  <component :is="headerComponent" class="gl-accordion-item-header" :class="headerClass">
100
130
  <gl-button
101
- v-gl-collapse-toggle="accordionItemId"
102
131
  variant="link"
103
132
  button-text-classes="gl-flex"
133
+ :aria-expanded="localVisible ? 'true' : 'false'"
134
+ :aria-controls="accordionItemId"
135
+ @click="onButtonClick"
104
136
  >
105
- <gl-animated-chevron-right-down-icon :is-on="isVisible" />
137
+ <gl-animated-chevron-right-down-icon :is-on="localVisible" />
106
138
  {{ buttonTitle }}
107
139
  </gl-button>
108
140
  </component>
109
- <b-collapse
141
+ <gl-collapse
110
142
  :id="accordionItemId"
111
- v-model="isVisible"
112
- :visible="isVisible"
113
- :accordion="accordion"
114
- class="gl-mt-3 gl-text-base"
143
+ v-model="localVisible"
115
144
  :data-testid="`accordion-item-collapse-${accordionItemId}`"
116
145
  >
117
- <!-- @slot Item content -->
118
- <slot></slot>
119
- </b-collapse>
146
+ <div class="gl-mt-3 gl-text-base">
147
+ <!-- @slot Item content -->
148
+ <slot></slot>
149
+ </div>
150
+ </gl-collapse>
120
151
  </div>
121
152
  </template>
@@ -0,0 +1 @@
1
+ export const COLLAPSE_EVENT = 'collapse';
@@ -2,6 +2,7 @@
2
2
  <script>
3
3
  import isString from 'lodash/isString';
4
4
  import Pikaday from 'pikaday';
5
+ import { defaultConfig } from '../../../config';
5
6
  import { defaultDateFormat, datepickerWidthOptionsMap } from '../../../utils/constants';
6
7
  import { areDatesEqual } from '../../../utils/datetime_utility';
7
8
  import GlButton from '../button/button.vue';
@@ -120,7 +121,7 @@ export default {
120
121
  firstDay: {
121
122
  type: Number,
122
123
  required: false,
123
- default: 0,
124
+ default: () => defaultConfig.firstDayOfWeek || 0, // Defaults to 0 (Sunday)
124
125
  },
125
126
  ariaLabel: {
126
127
  type: String,
@@ -28,6 +28,7 @@ export default {
28
28
  directives: {
29
29
  SafeLink: SafeLinkDirective,
30
30
  },
31
+ inheritAttrs: false,
31
32
  props: {
32
33
  /**
33
34
  * Denotes the target URL of the link for standard links.
@@ -202,13 +203,22 @@ export default {
202
203
  return fallback;
203
204
  },
204
205
  computedProps() {
206
+ const baseRouterLinkProps = {
207
+ to: this.to,
208
+ activeClass: this.activeClass,
209
+ exactActiveClass: this.exactActiveClass,
210
+ replace: this.replace,
211
+ ...(isBoolean(this.prefetch) ? { prefetch: this.prefetch } : {}),
212
+ };
213
+
205
214
  if (this.isRouterLink) {
215
+ if (this.isVue3RouterLink) {
216
+ return baseRouterLinkProps;
217
+ }
218
+
206
219
  return {
207
- to: this.to,
208
- activeClass: this.activeClass,
209
- exactActiveClass: this.exactActiveClass,
210
- replace: this.replace,
211
- ...(isBoolean(this.prefetch) ? { prefetch: this.prefetch } : {}),
220
+ ...baseRouterLinkProps,
221
+ ...this.$attrs,
212
222
  };
213
223
  }
214
224
 
@@ -218,6 +228,7 @@ export default {
218
228
  rel: this.rel,
219
229
  target: this.target,
220
230
  href: this.computedHref,
231
+ ...this.$attrs,
221
232
  };
222
233
  },
223
234
  computedListeners() {
@@ -306,6 +317,7 @@ export default {
306
317
  v-safe-link:[safeLinkConfig]
307
318
  :class="[computedClass, { [activeClass]: isActive, [exactActiveClass]: isExactActive }]"
308
319
  :href="routerLinkHref"
320
+ v-bind="$attrs"
309
321
  v-on="computedListeners"
310
322
  @click="onClick($event, navigate)"
311
323
  >