@gitlab/ui 32.38.0 → 32.42.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 (154) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/components/base/carousel/carousel.documentation.js +1 -4
  3. package/dist/components/base/filtered_search/filtered_search.js +1 -1
  4. package/dist/components/base/filtered_search/filtered_search_token_segment.js +5 -2
  5. package/dist/components/base/form/form_input_group/form_input_group.js +6 -1
  6. package/dist/components/base/markdown/markdown.documentation.js +2 -6
  7. package/dist/components/base/search_box_by_click/search_box_by_click.js +2 -1
  8. package/dist/components/base/search_box_by_type/search_box_by_type.js +1 -1
  9. package/dist/components/base/token_selector/token_selector.documentation.js +2 -106
  10. package/dist/components/base/token_selector/token_selector.js +85 -1
  11. package/dist/components/base/tooltip/tooltip.documentation.js +2 -6
  12. package/dist/components/charts/area/area.js +1 -1
  13. package/dist/components/charts/bar/bar.js +1 -1
  14. package/dist/components/charts/column/column.js +1 -1
  15. package/dist/components/charts/discrete_scatter/discrete_scatter.js +1 -1
  16. package/dist/components/charts/line/line.js +1 -1
  17. package/dist/components/charts/sparkline/sparkline.js +1 -1
  18. package/dist/components/charts/stacked_column/stacked_column.js +1 -1
  19. package/dist/utility_classes.css +1 -1
  20. package/dist/utility_classes.css.map +1 -1
  21. package/documentation/documented_stories.js +4 -0
  22. package/package.json +13 -13
  23. package/src/components/base/accordion/accordion.spec.js +0 -4
  24. package/src/components/base/accordion/accordion_item.spec.js +0 -4
  25. package/src/components/base/alert/alert.spec.js +0 -4
  26. package/src/components/base/avatar_labeled/avatar_labeled.spec.js +0 -2
  27. package/src/components/base/avatars_inline/avatars_inline.spec.js +0 -2
  28. package/src/components/base/badge/badge.spec.js +0 -2
  29. package/src/components/base/broadcast_message/broadcast_message.spec.js +0 -4
  30. package/src/components/base/button/button.spec.js +0 -5
  31. package/src/components/base/card/card.spec.js +0 -5
  32. package/src/components/base/carousel/carousel.documentation.js +0 -2
  33. package/src/components/base/carousel/carousel.md +0 -2
  34. package/src/components/base/carousel/carousel.spec.js +0 -4
  35. package/src/components/base/carousel/carousel.stories.js +24 -11
  36. package/src/components/base/collapse/collapse.spec.js +0 -4
  37. package/src/components/base/datepicker/datepicker.spec.js +0 -4
  38. package/src/components/base/daterange_picker/daterange_picker.spec.js +0 -5
  39. package/src/components/base/drawer/drawer.spec.js +0 -4
  40. package/src/components/base/dropdown/dropdown.spec.js +0 -2
  41. package/src/components/base/dropdown/dropdown_item.spec.js +0 -2
  42. package/src/components/base/filtered_search/filtered_search.spec.js +0 -10
  43. package/src/components/base/filtered_search/filtered_search.vue +1 -0
  44. package/src/components/base/filtered_search/filtered_search_suggestion.spec.js +0 -5
  45. package/src/components/base/filtered_search/filtered_search_suggestion_list.spec.js +0 -5
  46. package/src/components/base/filtered_search/filtered_search_term.spec.js +0 -5
  47. package/src/components/base/filtered_search/filtered_search_token.spec.js +0 -5
  48. package/src/components/base/filtered_search/filtered_search_token_segment.vue +4 -1
  49. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.spec.js +0 -5
  50. package/src/components/base/form/form_combobox/form_combobox.spec.js +0 -4
  51. package/src/components/base/form/form_input/form_input.spec.js +0 -5
  52. package/src/components/base/form/form_input_group/form_input_group.spec.js +18 -5
  53. package/src/components/base/form/form_input_group/form_input_group.vue +6 -1
  54. package/src/components/base/form/form_radio/form_radio.spec.js +0 -4
  55. package/src/components/base/form/form_radio_group/form_radio_group.spec.js +0 -4
  56. package/src/components/base/form/form_select/form_select.spec.js +0 -5
  57. package/src/components/base/form/form_textarea/form_textarea.spec.js +0 -5
  58. package/src/components/base/icon/icon.spec.js +0 -2
  59. package/src/components/base/infinite_scroll/infinite_scroll.spec.js +0 -1
  60. package/src/components/base/keyset_pagination/keyset_pagination.spec.js +0 -5
  61. package/src/components/base/label/label.spec.js +0 -4
  62. package/src/components/base/link/link.spec.js +0 -5
  63. package/src/components/base/loading_icon/loading_icon.spec.js +0 -4
  64. package/src/components/base/markdown/markdown.documentation.js +0 -3
  65. package/src/components/base/markdown/markdown.md +0 -2
  66. package/src/components/base/markdown/markdown.stories.js +25 -24
  67. package/src/components/base/modal/modal.spec.js +0 -1
  68. package/src/components/base/nav/nav.spec.js +0 -4
  69. package/src/components/base/nav/nav_item.spec.js +0 -4
  70. package/src/components/base/nav/nav_item_dropdown.spec.js +0 -4
  71. package/src/components/base/paginated_list/paginated_list.spec.js +0 -6
  72. package/src/components/base/pagination/pagination.spec.js +0 -1
  73. package/src/components/base/path/path.spec.js +0 -5
  74. package/src/components/base/popover/popover.spec.js +0 -5
  75. package/src/components/base/search_box_by_click/search_box_by_click.spec.js +0 -4
  76. package/src/components/base/search_box_by_click/search_box_by_click.vue +2 -0
  77. package/src/components/base/search_box_by_type/search_box_by_type.spec.js +0 -5
  78. package/src/components/base/search_box_by_type/search_box_by_type.vue +1 -1
  79. package/src/components/base/segmented_control/segmented_control.spec.js +0 -4
  80. package/src/components/base/skeleton_loader/skeleton_loader.spec.js +0 -5
  81. package/src/components/base/sorting/sorting.spec.js +0 -4
  82. package/src/components/base/sorting/sorting_item.spec.js +0 -4
  83. package/src/components/base/tabs/tabs/scrollable_tabs.spec.js +0 -5
  84. package/src/components/base/toggle/toggle.spec.js +0 -4
  85. package/src/components/base/token/token.spec.js +0 -4
  86. package/src/components/base/token_selector/token_container.spec.js +0 -2
  87. package/src/components/base/token_selector/token_selector.documentation.js +0 -137
  88. package/src/components/base/token_selector/token_selector.md +0 -6
  89. package/src/components/base/token_selector/token_selector.spec.js +0 -5
  90. package/src/components/base/token_selector/token_selector.stories.js +96 -113
  91. package/src/components/base/token_selector/token_selector.vue +89 -1
  92. package/src/components/base/token_selector/token_selector_dropdown.spec.js +0 -5
  93. package/src/components/base/tooltip/tooltip.documentation.js +0 -3
  94. package/src/components/base/tooltip/tooltip.md +3 -5
  95. package/src/components/base/tooltip/tooltip.spec.js +0 -5
  96. package/src/components/base/tooltip/tooltip.stories.js +49 -25
  97. package/src/components/base/tooltip/tooltip.vue +1 -0
  98. package/src/components/charts/area/area.spec.js +8 -24
  99. package/src/components/charts/area/area.vue +9 -12
  100. package/src/components/charts/bar/bar.spec.js +4 -26
  101. package/src/components/charts/bar/bar.vue +3 -2
  102. package/src/components/charts/chart/chart.spec.js +0 -4
  103. package/src/components/charts/column/column.vue +3 -2
  104. package/src/components/charts/column/column_chart.spec.js +35 -19
  105. package/src/components/charts/discrete_scatter/discrete_scatter.stories.js +1 -0
  106. package/src/components/charts/discrete_scatter/discrete_scatter.vue +5 -8
  107. package/src/components/charts/gauge/gauge.spec.js +2 -24
  108. package/src/components/charts/heatmap/heatmap.spec.js +6 -23
  109. package/src/components/charts/legend/legend.spec.js +8 -14
  110. package/src/components/charts/line/line.spec.js +19 -30
  111. package/src/components/charts/line/line.vue +3 -2
  112. package/src/components/charts/single_stat/single_stat.spec.js +0 -4
  113. package/src/components/charts/sparkline/sparkline.spec.js +19 -31
  114. package/src/components/charts/sparkline/sparkline.vue +24 -12
  115. package/src/components/charts/stacked_column/stacked_column.spec.js +4 -22
  116. package/src/components/charts/stacked_column/stacked_column.vue +5 -8
  117. package/src/components/shared_components/clear_icon_button/clear_icon_button.spec.js +0 -4
  118. package/src/components/shared_components/close_button/close_button.spec.js +0 -4
  119. package/src/components/utilities/friendly_wrap/friendly_wrap.spec.js +0 -4
  120. package/src/components/utilities/intersection_observer/intersection_observer.spec.js +1 -1
  121. package/src/components/utilities/sprintf/sprintf.spec.js +0 -4
  122. package/src/components/utilities/truncate/truncate.spec.js +10 -15
  123. package/src/directives/hover_load/hover_load.spec.js +0 -1
  124. package/src/directives/outside/outside.spec.js +0 -4
  125. package/src/directives/resize_observer/resize_observer.spec.js +0 -4
  126. package/src/directives/safe_html/safe_html.spec.js +0 -4
  127. package/src/directives/safe_link/safe_link.spec.js +0 -5
  128. package/src/scss/utilities.scss +14 -0
  129. package/src/scss/utility-mixins/spacing.scss +4 -0
  130. package/src/scss/utility-mixins/z-index.scss +4 -0
  131. package/dist/components/base/carousel/examples/carousel.basic.example.js +0 -38
  132. package/dist/components/base/carousel/examples/index.js +0 -13
  133. package/dist/components/base/markdown/examples/index.js +0 -13
  134. package/dist/components/base/markdown/examples/markdown.basic.example.js +0 -38
  135. package/dist/components/base/token_selector/examples/index.js +0 -19
  136. package/dist/components/base/token_selector/examples/token_selector.user_defined_tokens.example.js +0 -48
  137. package/dist/components/base/token_selector/examples/token_selector.users.example.js +0 -202
  138. package/dist/components/base/tooltip/examples/index.js +0 -31
  139. package/dist/components/base/tooltip/examples/tooltip.directive_bottom.example.js +0 -38
  140. package/dist/components/base/tooltip/examples/tooltip.directive_default.example.js +0 -38
  141. package/dist/components/base/tooltip/examples/tooltip.directive_left.example.js +0 -38
  142. package/dist/components/base/tooltip/examples/tooltip.directive_right.example.js +0 -38
  143. package/src/components/base/carousel/examples/carousel.basic.example.vue +0 -26
  144. package/src/components/base/carousel/examples/index.js +0 -15
  145. package/src/components/base/markdown/examples/index.js +0 -15
  146. package/src/components/base/markdown/examples/markdown.basic.example.vue +0 -15
  147. package/src/components/base/token_selector/examples/index.js +0 -22
  148. package/src/components/base/token_selector/examples/token_selector.user_defined_tokens.example.vue +0 -17
  149. package/src/components/base/token_selector/examples/token_selector.users.example.vue +0 -212
  150. package/src/components/base/tooltip/examples/index.js +0 -36
  151. package/src/components/base/tooltip/examples/tooltip.directive_bottom.example.vue +0 -7
  152. package/src/components/base/tooltip/examples/tooltip.directive_default.example.vue +0 -5
  153. package/src/components/base/tooltip/examples/tooltip.directive_left.example.vue +0 -7
  154. package/src/components/base/tooltip/examples/tooltip.directive_right.example.vue +0 -7
@@ -1,130 +1,113 @@
1
- import { withKnobs, object, boolean, radios } from '@storybook/addon-knobs';
2
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
3
1
  import readme from './token_selector.md';
4
2
  import GlTokenSelector from './token_selector.vue';
5
3
 
6
- const components = {
7
- GlTokenSelector,
8
- };
9
-
10
- const generateProps = () => {
11
- const stateRadiosBoolean = (value) => {
12
- switch (value) {
13
- case 'null':
14
- return null;
15
- case 'true':
16
- return true;
17
- case 'false':
18
- return false;
19
- default:
20
- return null;
21
- }
22
- };
4
+ const template = `
5
+ <div>
6
+ <gl-token-selector
7
+ v-model="selectedTokens"
8
+ v-bind="$props"
9
+ @text-input="handleTextInput"
10
+ @focus="handleFocus" />
11
+ {{ selectedTokens }}
12
+ </div>
13
+ `;
23
14
 
24
- return {
25
- dropdownItems: {
26
- default: object('Dropdown items', [
27
- {
28
- id: 1,
29
- name: 'Vue.js',
30
- },
31
- {
32
- id: 2,
33
- name: 'Ruby On Rails',
34
- class: 'gl-text-white! gl-bg-data-viz-magenta-950!',
35
- },
36
- {
37
- id: 3,
38
- name: 'GraphQL',
39
- },
40
- {
41
- id: 4,
42
- name: 'Redis',
43
- class: 'gl-text-white! gl-bg-data-viz-green-700!',
44
- },
45
- {
46
- id: 5,
47
- name: 'CSS',
48
- class: 'gl-text-red-500!',
49
- style: { backgroundColor: '#97acff' },
50
- },
51
- ]),
15
+ const generateProps = () => ({
16
+ dropdownItems: [
17
+ {
18
+ id: 1,
19
+ name: 'Vue.js',
52
20
  },
53
- allowUserDefinedTokens: {
54
- default: boolean('Allow user defined tokens', false),
21
+ {
22
+ id: 2,
23
+ name: 'Ruby On Rails',
24
+ class: 'gl-text-white! gl-bg-data-viz-magenta-950!',
55
25
  },
56
- loading: {
57
- default: boolean('Loading', false),
26
+ {
27
+ id: 3,
28
+ name: 'GraphQL',
58
29
  },
59
- hideDropdownWithNoItems: {
60
- default: boolean('Hide dropdown with no items', false),
30
+ {
31
+ id: 4,
32
+ name: 'Redis',
33
+ class: 'gl-text-white! gl-bg-data-viz-green-700!',
61
34
  },
62
- state: {
63
- default: stateRadiosBoolean(
64
- radios('Validation state', { true: 'true', false: 'false', null: 'null' }, 'null')
65
- ),
35
+ {
36
+ id: 5,
37
+ name: 'CSS',
38
+ class: 'gl-text-red-500!',
39
+ style: { backgroundColor: '#97acff' },
66
40
  },
67
- };
68
- };
41
+ ],
42
+ });
69
43
 
70
- documentedStoriesOf('base/token_selector', readme)
71
- .addDecorator(withKnobs)
72
- .addParameters({ storyshots: false })
73
- .add('default', () => ({
74
- props: generateProps(),
75
- data() {
76
- return {
77
- filteredDropdownItems: [],
78
- inputText: '',
79
- selectedTokens: [
80
- {
81
- id: 1,
82
- name: 'Vue.js',
83
- },
84
- ],
85
- };
86
- },
87
- components,
88
- mounted() {
89
- document.querySelector('.gl-token-selector input[type="text"]').focus();
90
- },
91
- methods: {
92
- handleTextInput(value) {
93
- this.inputText = value;
44
+ const Template = (args, { argTypes }) => ({
45
+ components: { GlTokenSelector },
46
+ props: Object.keys(argTypes),
47
+ template,
48
+ mounted() {
49
+ document.querySelector('.gl-token-selector input[type="text"]').focus();
50
+ },
51
+ data() {
52
+ return {
53
+ filteredDropdownItems: [],
54
+ inputText: '',
55
+ selectedTokens: [
56
+ {
57
+ id: 1,
58
+ name: 'Vue.js',
59
+ },
60
+ ],
61
+ };
62
+ },
63
+ methods: {
64
+ handleTextInput(value) {
65
+ this.inputText = value;
94
66
 
95
- if (this.inputText === '') {
96
- this.filteredDropdownItems = this.dropdownItems;
67
+ if (this.inputText === '') {
68
+ this.filteredDropdownItems = this.dropdownItems;
97
69
 
98
- return;
99
- }
70
+ return;
71
+ }
100
72
 
73
+ this.filterDropdownItems();
74
+ },
75
+ handleFocus() {
76
+ if (this.inputText !== '') {
101
77
  this.filterDropdownItems();
78
+ } else {
79
+ this.filteredDropdownItems = this.dropdownItems;
80
+ }
81
+ },
82
+ filterDropdownItems() {
83
+ this.filteredDropdownItems = this.dropdownItems.filter((dropdownItem) => {
84
+ return dropdownItem.name.toLowerCase().includes(this.inputText.toLowerCase());
85
+ });
86
+ },
87
+ },
88
+ });
89
+
90
+ export const Default = Template.bind({});
91
+ Default.parameters = { storyshots: { disable: true } };
92
+ Default.args = generateProps();
93
+
94
+ export default {
95
+ title: 'base/token_selector',
96
+ component: GlTokenSelector,
97
+ parameters: {
98
+ knobs: { disable: true },
99
+ docs: {
100
+ description: {
101
+ component: readme,
102
102
  },
103
- handleFocus() {
104
- if (this.inputText !== '') {
105
- this.filterDropdownItems();
106
- } else {
107
- this.filteredDropdownItems = this.dropdownItems;
108
- }
109
- },
110
- filterDropdownItems() {
111
- this.filteredDropdownItems = this.dropdownItems.filter((dropdownItem) => {
112
- return dropdownItem.name.toLowerCase().includes(this.inputText.toLowerCase());
113
- });
103
+ },
104
+ },
105
+ argTypes: {
106
+ state: {
107
+ control: {
108
+ type: 'radio',
109
+ options: [true, false, null],
114
110
  },
115
111
  },
116
- template: `
117
- <div>
118
- <gl-token-selector
119
- v-model="selectedTokens"
120
- :dropdown-items="filteredDropdownItems"
121
- :allow-user-defined-tokens="allowUserDefinedTokens"
122
- :loading="loading"
123
- :hide-dropdown-with-no-items="hideDropdownWithNoItems"
124
- :state="state"
125
- @text-input="handleTextInput"
126
- @focus="handleFocus" />
127
- {{ selectedTokens }}
128
- </div>
129
- `,
130
- }));
112
+ },
113
+ };
@@ -14,6 +14,9 @@ export default {
14
14
  event: 'input',
15
15
  },
16
16
  props: {
17
+ /**
18
+ * Items to display in dropdown
19
+ */
17
20
  dropdownItems: {
18
21
  type: Array,
19
22
  // All items need to have an `id` key
@@ -21,57 +24,89 @@ export default {
21
24
  required: false,
22
25
  default: () => [],
23
26
  },
27
+ /**
28
+ * Should users be allowed to add tokens that are not in `dropdown-items`
29
+ */
24
30
  allowUserDefinedTokens: {
25
31
  type: Boolean,
26
32
  required: false,
27
33
  default: false,
28
34
  },
35
+ /**
36
+ * Dropdown items are loading, can be used when requesting new dropdown items
37
+ */
29
38
  loading: {
30
39
  type: Boolean,
31
40
  required: false,
32
41
  default: false,
33
42
  },
43
+ /**
44
+ * Hide the dropdown if `dropdown-items` is empty. Will show `no-results-content` slot if this is `false`
45
+ */
34
46
  hideDropdownWithNoItems: {
35
47
  type: Boolean,
36
48
  required: false,
37
49
  default: false,
38
50
  },
51
+ /**
52
+ * CSS classes to add to the main token selector container (`.gl-token-selector`)
53
+ */
39
54
  containerClass: {
40
55
  type: String,
41
56
  required: false,
42
57
  default: '',
43
58
  },
59
+ /**
60
+ * CSS classes to add to dropdown menu `ul` element
61
+ */
44
62
  menuClass: {
45
63
  type: [String, Array, Object],
46
64
  required: false,
47
65
  default: '',
48
66
  },
67
+ /**
68
+ * The autocomplete attribute value for the underlying `input` element
69
+ */
49
70
  autocomplete: {
50
71
  type: String,
51
72
  required: false,
52
73
  default: 'off',
53
74
  },
75
+ /**
76
+ * The `aria-labelledby` attribute value for the underlying `input` element
77
+ */
54
78
  ariaLabelledby: {
55
79
  type: String,
56
80
  required: false,
57
81
  default: null,
58
82
  },
83
+ /**
84
+ * The `placeholder` attribute value for the underlying `input` element
85
+ */
59
86
  placeholder: {
60
87
  type: String,
61
88
  required: false,
62
89
  default: null,
63
90
  },
91
+ /**
92
+ * HTML attributes to add to the text input. Helpful for adding `data-testid` and `data-qa-selector` attributes
93
+ */
64
94
  textInputAttrs: {
65
95
  type: Object,
66
96
  required: false,
67
97
  default: null,
68
98
  },
99
+ /**
100
+ * Controls the validation state appearance of the component. `true` for valid, `false` for invalid, or `null` for no validation state
101
+ */
69
102
  state: {
70
103
  type: Boolean,
71
104
  required: false,
72
105
  default: null,
73
106
  },
74
- // Used for custom `v-model`
107
+ /**
108
+ * Tokens that are selected. This prop will automatically be added when using `v-model`
109
+ */
75
110
  selectedTokens: {
76
111
  type: Array,
77
112
  // All tokens need to have an `id` key
@@ -134,6 +169,11 @@ export default {
134
169
  watch: {
135
170
  inputText(newValue, oldValue) {
136
171
  if (newValue !== oldValue) {
172
+ /**
173
+ * Fired when user types in the token selector
174
+ *
175
+ * @property {string} inputText
176
+ */
137
177
  this.$emit('text-input', newValue);
138
178
 
139
179
  this.resetFocusedDropdownItem();
@@ -159,6 +199,11 @@ export default {
159
199
  },
160
200
  methods: {
161
201
  handleFocus(event) {
202
+ /**
203
+ * Fired when the token selector is focused
204
+ *
205
+ * @property {FocusEvent} event
206
+ */
162
207
  this.$emit('focus', event);
163
208
 
164
209
  this.openDropdown();
@@ -170,6 +215,11 @@ export default {
170
215
  }
171
216
  },
172
217
  handleBlur(event) {
218
+ /**
219
+ * Fired when the token selector is blurred
220
+ *
221
+ * @property {FocusEvent} event
222
+ */
173
223
  this.$emit('blur', event);
174
224
 
175
225
  this.inputFocused = false;
@@ -234,18 +284,38 @@ export default {
234
284
  name: this.inputText,
235
285
  };
236
286
 
287
+ /**
288
+ * Fired when a token is added or removed
289
+ *
290
+ * @property {array} selectedTokens
291
+ */
237
292
  this.$emit('input', [...this.selectedTokens, token]);
238
293
 
239
294
  this.inputText = '';
240
295
  this.closeDropdown();
241
296
 
297
+ /**
298
+ * Fired when a token is added
299
+ *
300
+ * @property {object} token
301
+ */
242
302
  this.$emit('token-add', token);
243
303
  },
244
304
  removeToken(token) {
305
+ /**
306
+ * Fired when user types in the token selector
307
+ *
308
+ * @property {string} inputText
309
+ */
245
310
  this.$emit(
246
311
  'input',
247
312
  this.selectedTokens.filter((selectedToken) => selectedToken.id !== token.id)
248
313
  );
314
+ /**
315
+ * Fired when a token is removed
316
+ *
317
+ * @property {object} token
318
+ */
249
319
  this.$emit('token-remove', token);
250
320
  },
251
321
  cancelTokenFocus() {
@@ -296,6 +366,10 @@ export default {
296
366
  @cancel-focus="cancelTokenFocus"
297
367
  >
298
368
  <template #token-content="{ token }">
369
+ <!-- @slot Content to pass to the token component slot. Can be used
370
+ to add an avatar to the token. Default content is "{{ token.name }}".
371
+ @binding {object} token
372
+ -->
299
373
  <slot name="token-content" :token="token"></slot>
300
374
  </template>
301
375
  <template #text-input>
@@ -342,18 +416,32 @@ export default {
342
416
  @show="openDropdown"
343
417
  >
344
418
  <template #loading-content>
419
+ <!-- @slot Content to display when `loading` prop is `true`. Default
420
+ content is "Searching..." -->
345
421
  <slot name="loading-content"></slot>
346
422
  </template>
347
423
  <template #user-defined-token-content>
424
+ <!-- @slot Content to display when adding a user defined token. Default content is 'Add "{{ inputText }}"'.
425
+ @binding {string} inputText
426
+ -->
348
427
  <slot name="user-defined-token-content" :input-text="inputText"></slot>
349
428
  </template>
350
429
  <template #no-results-content>
430
+ <!-- @slot Content to display when `dropdown-items` is empty and
431
+ `allow-user-defined-tokens` is `false`. Default content is "No matches found". -->
351
432
  <slot name="no-results-content"></slot>
352
433
  </template>
353
434
  <template #dropdown-item-content="{ dropdownItem }">
435
+ <!-- @slot Dropdown item content. Default content is "{{ dropdownItem.name }}".
436
+ @binding {object} dropdownItem
437
+ -->
354
438
  <slot name="dropdown-item-content" :dropdown-item="dropdownItem"></slot>
355
439
  </template>
356
440
  <template #dropdown-footer>
441
+ <!-- @slot Content to add to the bottom of the dropdown.
442
+ Can be used in conjunction with `gl-intersection-observer` to load
443
+ more items as the user scrolls.
444
+ -->
357
445
  <slot name="dropdown-footer"></slot>
358
446
  </template>
359
447
  </gl-token-selector-dropdown>
@@ -75,11 +75,6 @@ describe('GlTokenSelectorDropdown', () => {
75
75
  }
76
76
  });
77
77
 
78
- afterEach(() => {
79
- wrapper.destroy();
80
- wrapper = null;
81
- });
82
-
83
78
  describe('props', () => {
84
79
  describe('show', () => {
85
80
  it('displays dropdown when `true`', () => {
@@ -1,9 +1,6 @@
1
- import examples from './examples';
2
1
  import description from './tooltip.md';
3
2
 
4
3
  export default {
5
4
  followsDesignSystem: true,
6
5
  description,
7
- examples,
8
- bootstrapComponent: 'b-tooltip',
9
6
  };
@@ -1,8 +1,6 @@
1
- ## Usage
2
-
3
1
  Using the tooltip component is recommended if you have HTML content.
4
2
  It is also currently required if the tooltip content needs to change while it's visible
5
- (see [this upstream issue]). In all other cases, please use the directive.
3
+ (see [this upstream issue][this upstream issue]). In all other cases, please use the directive.
6
4
 
7
5
  [this upstream issue]: https://github.com/bootstrap-vue/bootstrap-vue/issues/2142
8
6
 
@@ -43,11 +41,11 @@ export default {
43
41
 
44
42
  ## Directive attributes
45
43
 
46
- `v-gl-tooltip` directive uses the same attributes as [`v-b-tooltip`].
44
+ `v-gl-tooltip` directive uses the same attributes as [`v-b-tooltip`][`v-b-tooltip`].
47
45
 
48
46
  ## Under the hood
49
47
 
50
- Tooltip uses [`<b-tooltip>`] and [`v-b-tooltip`] internally.
48
+ Tooltip uses [`<b-tooltip>`][`<b-tooltip>`] and [`v-b-tooltip`][`v-b-tooltip`] internally.
51
49
 
52
50
  [`<b-tooltip>`]: https://bootstrap-vue.org/docs/components/tooltip
53
51
 
@@ -19,11 +19,6 @@ describe('GlTooltip', () => {
19
19
  createWrapper();
20
20
  });
21
21
 
22
- afterEach(() => {
23
- wrapper.destroy();
24
- wrapper = null;
25
- });
26
-
27
22
  it.each(tooltipActionEvents)('passes through the %s event to the bvTooltip instance', (event) => {
28
23
  wrapper.vm.$emit(event);
29
24
 
@@ -1,34 +1,58 @@
1
- import { withKnobs } from '@storybook/addon-knobs';
2
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
3
- import { GlTooltipDirective } from '../../../../index';
1
+ import { GlTooltip, GlTooltipDirective } from '../../../../index';
4
2
  import readme from './tooltip.md';
5
3
 
6
- const directives = {
7
- GlTooltip: GlTooltipDirective,
8
- };
9
-
10
4
  function makeTooltip(modifier = '') {
11
- return () => ({
12
- directives,
5
+ return {
6
+ directives: {
7
+ GlTooltip: GlTooltipDirective,
8
+ },
13
9
  template: `
14
- <div class="d-flex align-items-center justify-content-center p-5 m-5">
15
- <gl-button
16
- v-gl-tooltip${modifier}
17
- title="some tooltip text"
18
- >
19
- Tooltip
20
- </gl-button>
21
- </div>
22
- `,
10
+ <div class="gl-display-flex gl-align-items-center gl-justify-content-center gl-p-7 gl-m-7">
11
+ <gl-button
12
+ v-gl-tooltip${modifier}
13
+ title="some tooltip text"
14
+ >
15
+ Tooltip
16
+ </gl-button>
17
+ </div>
18
+ `,
23
19
  mounted() {
24
20
  this.$nextTick(() => this.$el.querySelector('button').focus());
25
21
  },
26
- });
22
+ };
27
23
  }
28
24
 
29
- documentedStoriesOf('base/tooltip', readme)
30
- .addDecorator(withKnobs)
31
- .add('top (default)', makeTooltip())
32
- .add('right', makeTooltip('.right'))
33
- .add('bottom', makeTooltip('.bottom'))
34
- .add('left', makeTooltip('.left'));
25
+ export const TopDefault = (args, argTypes) => ({
26
+ ...makeTooltip(),
27
+ props: Object.keys(argTypes),
28
+ });
29
+
30
+ export const Right = (args, argTypes) => ({
31
+ ...makeTooltip('.right'),
32
+ props: Object.keys(argTypes),
33
+ });
34
+
35
+ export const Bottom = (args, argTypes) => ({
36
+ ...makeTooltip('.bottom'),
37
+ props: Object.keys(argTypes),
38
+ });
39
+
40
+ export const Left = (args, argTypes) => ({
41
+ ...makeTooltip('.left'),
42
+ props: Object.keys(argTypes),
43
+ });
44
+
45
+ // A default export contains higher-level info about the component and the stories' settings.
46
+ export default {
47
+ title: 'base/tooltip',
48
+ component: GlTooltip,
49
+ parameters: {
50
+ bootstrapComponent: 'b-tooltip',
51
+ knobs: { disable: true },
52
+ docs: {
53
+ description: {
54
+ component: readme,
55
+ },
56
+ },
57
+ },
58
+ };
@@ -23,6 +23,7 @@ export default {
23
23
  :delay="$options.tooltipDelay"
24
24
  v-on="$listeners"
25
25
  >
26
+ <!-- @slot Tooltip content -->
26
27
  <slot></slot>
27
28
  </b-tooltip>
28
29
  </template>
@@ -5,6 +5,7 @@ import ChartLegend from '../legend/legend.vue';
5
5
  import AreaChart from './area.vue';
6
6
 
7
7
  import { LEGEND_LAYOUT_INLINE, LEGEND_LAYOUT_TABLE } from '~/utils/charts/constants';
8
+ import { createMockChartInstance, ChartTooltipStub } from '~helpers/chart_stubs';
8
9
 
9
10
  let mockChartInstance;
10
11
 
@@ -14,7 +15,6 @@ jest.mock('echarts', () => ({
14
15
 
15
16
  describe('area component', () => {
16
17
  let wrapper;
17
- let option;
18
18
 
19
19
  const findChart = () => wrapper.findComponent(Chart);
20
20
  const findLegend = () => wrapper.findComponent(ChartLegend);
@@ -24,33 +24,17 @@ describe('area component', () => {
24
24
  const emitChartCreated = () => findChart().vm.$emit('created', mockChartInstance);
25
25
 
26
26
  const createShallowWrapper = (props = {}) => {
27
- wrapper = shallowMount(AreaChart, { propsData: { option, data: [], ...props } });
27
+ wrapper = shallowMount(AreaChart, {
28
+ propsData: { option: { series: [] }, data: [], ...props },
29
+ stubs: {
30
+ 'chart-tooltip': ChartTooltipStub,
31
+ },
32
+ });
28
33
  emitChartCreated();
29
34
  };
30
35
 
31
36
  beforeEach(() => {
32
- option = {
33
- series: [],
34
- };
35
-
36
- mockChartInstance = {
37
- getDom: () => {
38
- return {
39
- addEventListener: jest.fn(),
40
- removeEventListener: jest.fn(),
41
- };
42
- },
43
- on: jest.fn(),
44
- off: jest.fn(),
45
- convertToPixel: jest.fn(),
46
- getOption: () => {
47
- return option;
48
- },
49
- };
50
- });
51
-
52
- afterEach(() => {
53
- wrapper.destroy();
37
+ mockChartInstance = createMockChartInstance();
54
38
  });
55
39
 
56
40
  it('emits `created`, with the chart instance', async () => {