@gitlab/ui 38.8.2 → 38.10.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.
Files changed (64) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/components/base/filtered_search/filtered_search.js +0 -5
  3. package/dist/components/base/form/form_textarea/form_textarea.js +62 -2
  4. package/dist/components/base/popover/popover.js +7 -1
  5. package/dist/components/base/toast/toast.js +5 -2
  6. package/dist/index.css +2 -2
  7. package/dist/index.css.map +1 -1
  8. package/dist/utility_classes.css +1 -1
  9. package/dist/utility_classes.css.map +1 -1
  10. package/dist/utils/constants.js +7 -2
  11. package/package.json +1 -1
  12. package/src/components/base/accordion/accordion.stories.js +2 -4
  13. package/src/components/base/accordion/accordion_item.stories.js +2 -4
  14. package/src/components/base/alert/alert.stories.js +2 -4
  15. package/src/components/base/avatar/avatar.stories.js +3 -9
  16. package/src/components/base/avatar_labeled/avatar_labeled.stories.js +6 -12
  17. package/src/components/base/avatar_link/avatar_link.stories.js +2 -6
  18. package/src/components/base/avatars_inline/avatars_inline.stories.js +2 -4
  19. package/src/components/base/badge/badge.scss +10 -0
  20. package/src/components/base/badge/badge.stories.js +3 -9
  21. package/src/components/base/banner/banner.stories.js +1 -3
  22. package/src/components/base/broadcast_message/broadcast_message.stories.js +4 -8
  23. package/src/components/base/button/button.stories.js +8 -16
  24. package/src/components/base/datepicker/datepicker.stories.js +2 -2
  25. package/src/components/base/daterange_picker/daterange_picker.stories.js +2 -6
  26. package/src/components/base/dropdown/dropdown.stories.js +4 -12
  27. package/src/components/base/dropdown/dropdown_item.stories.js +2 -6
  28. package/src/components/base/filtered_search/filtered_search.vue +0 -5
  29. package/src/components/base/form/form_group/form_group.stories.js +1 -1
  30. package/src/components/base/form/form_input/form_input.stories.js +1 -3
  31. package/src/components/base/form/form_input_group/form_input_group.stories.js +4 -12
  32. package/src/components/base/form/form_radio/form_radio.stories.js +1 -3
  33. package/src/components/base/form/form_select/form_select.stories.js +4 -8
  34. package/src/components/base/form/form_textarea/form_textarea.spec.js +115 -8
  35. package/src/components/base/form/form_textarea/form_textarea.stories.js +21 -0
  36. package/src/components/base/form/form_textarea/form_textarea.vue +73 -8
  37. package/src/components/base/icon/icon.stories.js +4 -8
  38. package/src/components/base/infinite_scroll/infinite_scroll.stories.js +37 -13
  39. package/src/components/base/label/label.stories.js +2 -6
  40. package/src/components/base/link/link.stories.js +2 -4
  41. package/src/components/base/loading_icon/loading_icon.stories.js +4 -8
  42. package/src/components/base/modal/modal.stories.js +16 -32
  43. package/src/components/base/pagination/pagination.stories.js +65 -83
  44. package/src/components/base/path/path.stories.js +2 -6
  45. package/src/components/base/popover/popover.scss +3 -1
  46. package/src/components/base/popover/popover.spec.js +15 -1
  47. package/src/components/base/popover/popover.stories.js +3 -5
  48. package/src/components/base/popover/popover.vue +7 -0
  49. package/src/components/base/progress_bar/progress_bar.stories.js +2 -4
  50. package/src/components/base/search_box_by_click/search_box_by_click.stories.js +1 -3
  51. package/src/components/base/segmented_control/segmented_control.stories.js +1 -3
  52. package/src/components/base/skeleton_loading/skeleton_loading.stories.js +2 -4
  53. package/src/components/base/table/table.stories.js +2 -4
  54. package/src/components/base/toast/toast.js +5 -2
  55. package/src/components/base/toast/toast.spec.js +42 -0
  56. package/src/components/base/toggle/toggle.stories.js +4 -10
  57. package/src/components/base/token/token.stories.js +2 -4
  58. package/src/components/base/token_selector/token_selector.stories.js +2 -4
  59. package/src/components/charts/single_stat/single_stat.stories.js +1 -3
  60. package/src/directives/resize_observer/resize_observer.stories.js +1 -3
  61. package/src/scss/utilities.scss +32 -0
  62. package/src/scss/utility-mixins/color.scss +4 -0
  63. package/src/scss/utility-mixins/sizing.scss +12 -0
  64. package/src/utils/constants.js +6 -0
@@ -2,6 +2,7 @@
2
2
  import { BPopover } from 'bootstrap-vue';
3
3
  import tooltipMixin from '../../mixins/tooltip_mixin';
4
4
  import CloseButton from '../../shared_components/close_button/close_button.vue';
5
+ import { popoverPlacements } from '../../../utils/constants';
5
6
 
6
7
  const popoverRefName = 'bPopover';
7
8
 
@@ -38,6 +39,11 @@ export default {
38
39
  required: false,
39
40
  default: false,
40
41
  },
42
+ placement: {
43
+ type: String,
44
+ required: false,
45
+ default: popoverPlacements.top,
46
+ },
41
47
  },
42
48
  computed: {
43
49
  customClass() {
@@ -66,6 +72,7 @@ export default {
66
72
  :custom-class="customClass"
67
73
  :triggers="triggers"
68
74
  :title="title"
75
+ :placement="placement"
69
76
  v-bind="$attrs"
70
77
  v-on="$listeners"
71
78
  >
@@ -28,10 +28,8 @@ export default {
28
28
  },
29
29
  argTypes: {
30
30
  variant: {
31
- control: {
32
- type: 'select',
33
- options: variantOptions,
34
- },
31
+ options: variantOptions,
32
+ control: 'select',
35
33
  },
36
34
  },
37
35
  };
@@ -92,9 +92,7 @@ export default {
92
92
  argTypes: {
93
93
  ...disableControls(['tooltipContainer']),
94
94
  historyItems: {
95
- control: {
96
- type: 'object',
97
- },
95
+ control: 'object',
98
96
  },
99
97
  },
100
98
  };
@@ -51,9 +51,7 @@ export default {
51
51
  options: Object.values(defaultOptions)
52
52
  .filter(({ disabled }) => !disabled)
53
53
  .map(({ value }) => value),
54
- control: {
55
- type: 'radio',
56
- },
54
+ control: 'radio',
57
55
  table: {
58
56
  disable: true,
59
57
  },
@@ -35,10 +35,8 @@ export default {
35
35
  },
36
36
  argTypes: {
37
37
  lines: {
38
- control: {
39
- type: 'select',
40
- options: [1, 2, 3],
41
- },
38
+ options: [1, 2, 3],
39
+ control: 'select',
42
40
  },
43
41
  },
44
42
  };
@@ -107,10 +107,8 @@ export default {
107
107
  },
108
108
  argTypes: {
109
109
  stacked: {
110
- control: {
111
- type: 'select',
112
- options: ['sm', 'md', 'lg', 'xl', true, false],
113
- },
110
+ options: ['sm', 'md', 'lg', 'xl', true, false],
111
+ control: 'select',
114
112
  },
115
113
  },
116
114
  };
@@ -50,11 +50,14 @@ function showToast(message, options = {}) {
50
50
  const toast = { id, hide };
51
51
 
52
52
  if (isFunction(options.onComplete)) {
53
- this.$root.$on('bv::toast:hidden', (e) => {
53
+ const toastHiddenCallback = (e) => {
54
54
  if (e.componentId === id) {
55
+ this.$root.$off('bv::toast:hidden', toastHiddenCallback);
55
56
  options.onComplete(e);
56
57
  }
57
- });
58
+ };
59
+
60
+ this.$root.$on('bv::toast:hidden', toastHiddenCallback);
58
61
  }
59
62
 
60
63
  this.$bvToast.toast(message, {
@@ -27,4 +27,46 @@ describe('GlToast', () => {
27
27
  hide: expect.any(Function),
28
28
  });
29
29
  });
30
+
31
+ describe('onComplete callback', () => {
32
+ let onCompleteSpy;
33
+ let toast;
34
+
35
+ beforeEach(() => {
36
+ onCompleteSpy = jest.fn();
37
+
38
+ toast = wrapper.vm.$toast.show('foo', {
39
+ onComplete: onCompleteSpy,
40
+ });
41
+ });
42
+
43
+ it('calls onComplete callback only when matching toast hides', () => {
44
+ expect(onCompleteSpy).not.toHaveBeenCalled();
45
+
46
+ // Pretend some other toast was hidden.
47
+ wrapper.vm.$root.$emit('bv::toast:hidden', { componentId: 'some other toast' });
48
+ expect(onCompleteSpy).not.toHaveBeenCalled();
49
+
50
+ // Pretend our toast was hidden.
51
+ wrapper.vm.$root.$emit('bv::toast:hidden', { componentId: toast.id });
52
+ expect(onCompleteSpy).toHaveBeenCalledTimes(1);
53
+ });
54
+
55
+ it('unregisters global listener when toast is hidden', () => {
56
+ expect(onCompleteSpy).not.toHaveBeenCalled();
57
+
58
+ // Pretend the toast was hidden. Can't seem to do this directly in jsdom,
59
+ // so fake it by emitting the event we listen for.
60
+ const event = { componentId: toast.id };
61
+ wrapper.vm.$root.$emit('bv::toast:hidden', event);
62
+ expect(onCompleteSpy).toHaveBeenCalledTimes(1);
63
+
64
+ // This event won't fire more than once in practice, as once the toast is
65
+ // hidden it'll be destroyed and won't show again. This is here to
66
+ // indirectly test that the listener was removed when the toast is
67
+ // hidden the first time.
68
+ wrapper.vm.$root.$emit('bv::toast:hidden', event);
69
+ expect(onCompleteSpy).toHaveBeenCalledTimes(1);
70
+ });
71
+ });
30
72
  });
@@ -56,20 +56,14 @@ export default {
56
56
  argTypes: {
57
57
  ...disableControls(['name']),
58
58
  labelPosition: {
59
- control: {
60
- type: 'select',
61
- options: toggleLabelPosition,
62
- },
59
+ options: toggleLabelPosition,
60
+ control: 'select',
63
61
  },
64
62
  label: {
65
- control: {
66
- type: 'text',
67
- },
63
+ control: 'text',
68
64
  },
69
65
  help: {
70
- control: {
71
- type: 'text',
72
- },
66
+ control: 'text',
73
67
  },
74
68
  },
75
69
  };
@@ -50,10 +50,8 @@ export default {
50
50
  },
51
51
  argTypes: {
52
52
  variant: {
53
- control: {
54
- type: 'select',
55
- options: tokenVariants,
56
- },
53
+ options: tokenVariants,
54
+ control: 'select',
57
55
  },
58
56
  },
59
57
  };
@@ -104,10 +104,8 @@ export default {
104
104
  },
105
105
  argTypes: {
106
106
  state: {
107
- control: {
108
- type: 'radio',
109
- options: [true, false, null],
110
- },
107
+ options: [true, false, null],
108
+ control: 'radio',
111
109
  },
112
110
  },
113
111
  };
@@ -74,9 +74,7 @@ export default {
74
74
  argTypes: {
75
75
  variant: {
76
76
  options: Object.values(badgeVariantOptions),
77
- control: {
78
- type: 'select',
79
- },
77
+ control: 'select',
80
78
  },
81
79
  metaIcon: {
82
80
  options: iconSpriteInfo.icons,
@@ -55,9 +55,7 @@ Default.args = generateProps();
55
55
 
56
56
  const makeControl = () => ({
57
57
  options: ['100%', '75%', '50%'],
58
- control: {
59
- type: 'select',
60
- },
58
+ control: 'select',
61
59
  });
62
60
 
63
61
  export default {
@@ -2433,6 +2433,14 @@
2433
2433
  color: $purple-600 !important;
2434
2434
  }
2435
2435
 
2436
+ .gl-text-purple-700 {
2437
+ color: $purple-700;
2438
+ }
2439
+
2440
+ .gl-text-purple-700\! {
2441
+ color: $purple-700 !important;
2442
+ }
2443
+
2436
2444
  .gl-text-theme-indigo-200 {
2437
2445
  color: $theme-indigo-200;
2438
2446
  }
@@ -4495,6 +4503,30 @@
4495
4503
  }
4496
4504
  }
4497
4505
 
4506
+ .gl-md-w-half {
4507
+ @include gl-media-breakpoint-up(md) {
4508
+ width: 50%;
4509
+ }
4510
+ }
4511
+
4512
+ .gl-md-w-half\! {
4513
+ @include gl-media-breakpoint-up(md) {
4514
+ width: 50% !important;
4515
+ }
4516
+ }
4517
+
4518
+ .gl-lg-w-half {
4519
+ @include gl-media-breakpoint-up(lg) {
4520
+ width: 50%;
4521
+ }
4522
+ }
4523
+
4524
+ .gl-lg-w-half\! {
4525
+ @include gl-media-breakpoint-up(lg) {
4526
+ width: 50% !important;
4527
+ }
4528
+ }
4529
+
4498
4530
  .gl-md-w-auto {
4499
4531
  @include gl-media-breakpoint-up(md) {
4500
4532
  width: auto;
@@ -185,6 +185,10 @@
185
185
  color: $purple-600;
186
186
  }
187
187
 
188
+ @mixin gl-text-purple-700 {
189
+ color: $purple-700;
190
+ }
191
+
188
192
  @mixin gl-text-theme-indigo-200 {
189
193
  color: $theme-indigo-200;
190
194
  }
@@ -234,6 +234,18 @@
234
234
  }
235
235
  }
236
236
 
237
+ @mixin gl-md-w-half {
238
+ @include gl-media-breakpoint-up(md) {
239
+ width: 50%;
240
+ }
241
+ }
242
+
243
+ @mixin gl-lg-w-half {
244
+ @include gl-media-breakpoint-up(lg) {
245
+ width: 50%;
246
+ }
247
+ }
248
+
237
249
  @mixin gl-md-w-auto {
238
250
  @include gl-media-breakpoint-up(md) {
239
251
  width: auto;
@@ -37,6 +37,7 @@ export const badgeVariantOptions = {
37
37
  success: 'success',
38
38
  warning: 'warning',
39
39
  danger: 'danger',
40
+ tier: 'tier',
40
41
  };
41
42
 
42
43
  export const variantCssColorMap = {
@@ -297,3 +298,8 @@ export const loadingIconSizes = {
297
298
  'lg (32x32)': 'lg',
298
299
  'xl (64x64)': 'xl',
299
300
  };
301
+
302
+ export const textareaCountOptions = {
303
+ max: 'max',
304
+ recommended: 'recommended',
305
+ };