@gitlab/ui 32.43.2 → 32.45.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 (161) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +6 -1
  3. package/config.js +15 -3
  4. package/dist/components/base/avatar/avatar.documentation.js +2 -5
  5. package/dist/components/base/avatar_link/avatar_link.documentation.js +2 -5
  6. package/dist/components/base/form/form_input/form_input.documentation.js +2 -27
  7. package/dist/components/base/form/form_input/form_input.js +23 -6
  8. package/dist/components/base/form/form_text/form_text.documentation.js +1 -4
  9. package/dist/components/base/form/form_textarea/form_textarea.documentation.js +1 -20
  10. package/dist/components/base/form/form_textarea/form_textarea.js +8 -0
  11. package/dist/components/base/label/label.documentation.js +2 -9
  12. package/dist/components/base/label/label.js +23 -1
  13. package/dist/components/base/pagination/pagination.documentation.js +2 -85
  14. package/dist/components/base/pagination/pagination.js +76 -0
  15. package/dist/components/base/segmented_control/segmented_control.documentation.js +2 -14
  16. package/dist/components/base/segmented_control/segmented_control.js +6 -0
  17. package/dist/components/base/skeleton_loader/skeleton_loader.documentation.js +2 -28
  18. package/dist/components/base/skeleton_loader/skeleton_loader.js +30 -0
  19. package/dist/components/charts/chart/chart.js +17 -4
  20. package/dist/components/charts/heatmap/heatmap.js +1 -9
  21. package/dist/components/charts/sparkline/sparkline.js +1 -1
  22. package/dist/config.js +15 -3
  23. package/dist/utility_classes.css +1 -1
  24. package/dist/utility_classes.css.map +1 -1
  25. package/documentation/documented_stories.js +8 -0
  26. package/package.json +13 -12
  27. package/src/components/base/alert/alert.spec.js +2 -2
  28. package/src/components/base/avatar/avatar.documentation.js +0 -2
  29. package/src/components/base/avatar/avatar.md +0 -2
  30. package/src/components/base/avatar/avatar.spec.js +1 -2
  31. package/src/components/base/avatar/avatar.stories.js +88 -101
  32. package/src/components/base/avatar_link/avatar_link.documentation.js +0 -2
  33. package/src/components/base/avatar_link/avatar_link.md +4 -7
  34. package/src/components/base/avatar_link/avatar_link.stories.js +66 -54
  35. package/src/components/base/filtered_search/filtered_search.spec.js +35 -35
  36. package/src/components/base/filtered_search/filtered_search_term.spec.js +1 -1
  37. package/src/components/base/form/form_input/form_input.documentation.js +0 -31
  38. package/src/components/base/form/form_input/form_input.md +0 -2
  39. package/src/components/base/form/form_input/form_input.stories.js +50 -42
  40. package/src/components/base/form/form_input/form_input.vue +23 -6
  41. package/src/components/base/form/form_input_group/form_input_group.spec.js +1 -3
  42. package/src/components/base/form/form_text/form_text.documentation.js +0 -2
  43. package/src/components/base/form/form_text/form_text.md +1 -3
  44. package/src/components/base/form/form_text/form_text.stories.js +20 -8
  45. package/src/components/base/form/form_textarea/form_textarea.documentation.js +0 -25
  46. package/src/components/base/form/form_textarea/form_textarea.stories.js +31 -30
  47. package/src/components/base/form/form_textarea/form_textarea.vue +8 -0
  48. package/src/components/base/icon/icon.spec.js +1 -4
  49. package/src/components/base/infinite_scroll/infinite_scroll.spec.js +1 -4
  50. package/src/components/base/label/label.documentation.js +2 -12
  51. package/src/components/base/label/label.md +2 -7
  52. package/src/components/base/label/label.stories.js +66 -92
  53. package/src/components/base/label/label.vue +22 -2
  54. package/src/components/base/modal/modal.spec.js +19 -23
  55. package/src/components/base/paginated_list/__snapshots__/paginated_list.spec.js.snap +10 -10
  56. package/src/components/base/pagination/pagination.documentation.js +0 -100
  57. package/src/components/base/pagination/pagination.md +5 -9
  58. package/src/components/base/pagination/pagination.spec.js +1 -4
  59. package/src/components/base/pagination/pagination.stories.js +109 -117
  60. package/src/components/base/pagination/pagination.vue +85 -0
  61. package/src/components/base/search_box_by_click/search_box_by_click.spec.js +1 -5
  62. package/src/components/base/segmented_control/segmented_control.documentation.js +0 -15
  63. package/src/components/base/segmented_control/segmented_control.md +0 -2
  64. package/src/components/base/segmented_control/segmented_control.stories.js +46 -36
  65. package/src/components/base/segmented_control/segmented_control.vue +5 -0
  66. package/src/components/base/skeleton_loader/skeleton_loader.documentation.js +0 -27
  67. package/src/components/base/skeleton_loader/skeleton_loader.md +0 -2
  68. package/src/components/base/skeleton_loader/skeleton_loader.stories.js +23 -9
  69. package/src/components/base/skeleton_loader/skeleton_loader.vue +24 -0
  70. package/src/components/base/sorting/sorting.spec.js +1 -4
  71. package/src/components/base/toast/toast.spec.js +4 -6
  72. package/src/components/base/token/token.spec.js +1 -4
  73. package/src/components/base/token_selector/token_container.spec.js +2 -3
  74. package/src/components/charts/chart/chart.spec.js +33 -4
  75. package/src/components/charts/chart/chart.vue +16 -4
  76. package/src/components/charts/gauge/gauge.spec.js +7 -7
  77. package/src/components/charts/heatmap/heatmap.vue +2 -9
  78. package/src/components/charts/sparkline/sparkline.spec.js +1 -4
  79. package/src/components/charts/sparkline/sparkline.vue +7 -1
  80. package/src/components/utilities/friendly_wrap/friendly_wrap.spec.js +1 -4
  81. package/src/components/utilities/intersperse/intersperse.spec.js +1 -4
  82. package/src/directives/hover_load/hover_load.spec.js +2 -13
  83. package/src/directives/outside/outside.spec.js +1 -6
  84. package/src/directives/resize_observer/resize_observer.spec.js +4 -10
  85. package/src/scss/storybook.scss +8 -0
  86. package/src/scss/utilities.scss +8 -0
  87. package/src/scss/utility-mixins/transform.scss +4 -0
  88. package/dist/components/base/avatar/examples/avatar.fallback.example.js +0 -38
  89. package/dist/components/base/avatar/examples/avatar.image.example.js +0 -38
  90. package/dist/components/base/avatar/examples/avatar.rect.example.js +0 -38
  91. package/dist/components/base/avatar/examples/avatar.tooltip.example.js +0 -38
  92. package/dist/components/base/avatar/examples/index.js +0 -31
  93. package/dist/components/base/avatar_link/examples/avatar.link.example.js +0 -38
  94. package/dist/components/base/avatar_link/examples/index.js +0 -13
  95. package/dist/components/base/form/form_input/examples/form_input/form_input.text.example.js +0 -38
  96. package/dist/components/base/form/form_input/examples/form_input/form_input.text_disabled.example.js +0 -38
  97. package/dist/components/base/form/form_input/examples/form_input/form_input.text_reactive.example.js +0 -57
  98. package/dist/components/base/form/form_input/examples/form_input/index.js +0 -22
  99. package/dist/components/base/form/form_text/examples/form_text.basic.example.js +0 -38
  100. package/dist/components/base/form/form_text/examples/index.js +0 -13
  101. package/dist/components/base/form/form_textarea/examples/form_textarea.basic.example.js +0 -47
  102. package/dist/components/base/form/form_textarea/examples/form_textarea.invalid.example.js +0 -47
  103. package/dist/components/base/form/form_textarea/examples/form_textarea.plaintext.example.js +0 -47
  104. package/dist/components/base/form/form_textarea/examples/form_textarea.readonly.example.js +0 -45
  105. package/dist/components/base/form/form_textarea/examples/form_textarea.submit.example.js +0 -47
  106. package/dist/components/base/form/form_textarea/examples/index.js +0 -37
  107. package/dist/components/base/label/examples/index.js +0 -19
  108. package/dist/components/base/label/examples/label.basic.example.js +0 -38
  109. package/dist/components/base/label/examples/label.scoped.example.js +0 -38
  110. package/dist/components/base/pagination/examples/index.js +0 -37
  111. package/dist/components/base/pagination/examples/pagination.basic.example.js +0 -45
  112. package/dist/components/base/pagination/examples/pagination.compact.example.js +0 -58
  113. package/dist/components/base/pagination/examples/pagination.double_truncation.example.js +0 -45
  114. package/dist/components/base/pagination/examples/pagination.event.example.js +0 -51
  115. package/dist/components/base/pagination/examples/pagination.links.example.js +0 -45
  116. package/dist/components/base/segmented_control/examples/index.js +0 -19
  117. package/dist/components/base/segmented_control/examples/segmented_control.basic.example.js +0 -65
  118. package/dist/components/base/segmented_control/examples/segmented_control.whitespace.example.js +0 -55
  119. package/dist/components/base/skeleton_loader/examples/ci_header_skeleton.basic.example.js +0 -38
  120. package/dist/components/base/skeleton_loader/examples/default_skeleton.basic.example.js +0 -38
  121. package/dist/components/base/skeleton_loader/examples/default_skeleton_custom_props.basic.example.js +0 -38
  122. package/dist/components/base/skeleton_loader/examples/index.js +0 -37
  123. package/dist/components/base/skeleton_loader/examples/issue_card_skeleton.basic.example.js +0 -38
  124. package/dist/components/base/skeleton_loader/examples/job_log_skeleton.basic.example.js +0 -38
  125. package/src/components/base/avatar/examples/avatar.fallback.example.vue +0 -3
  126. package/src/components/base/avatar/examples/avatar.image.example.vue +0 -3
  127. package/src/components/base/avatar/examples/avatar.rect.example.vue +0 -6
  128. package/src/components/base/avatar/examples/avatar.tooltip.example.vue +0 -3
  129. package/src/components/base/avatar/examples/index.js +0 -36
  130. package/src/components/base/avatar_link/examples/avatar.link.example.vue +0 -5
  131. package/src/components/base/avatar_link/examples/index.js +0 -15
  132. package/src/components/base/form/form_input/examples/form_input/form_input.text.example.vue +0 -3
  133. package/src/components/base/form/form_input/examples/form_input/form_input.text_disabled.example.vue +0 -3
  134. package/src/components/base/form/form_input/examples/form_input/form_input.text_reactive.example.vue +0 -24
  135. package/src/components/base/form/form_input/examples/form_input/index.js +0 -26
  136. package/src/components/base/form/form_text/examples/form_text.basic.example.vue +0 -5
  137. package/src/components/base/form/form_text/examples/index.js +0 -15
  138. package/src/components/base/form/form_textarea/examples/form_textarea.basic.example.vue +0 -11
  139. package/src/components/base/form/form_textarea/examples/form_textarea.invalid.example.vue +0 -11
  140. package/src/components/base/form/form_textarea/examples/form_textarea.plaintext.example.vue +0 -13
  141. package/src/components/base/form/form_textarea/examples/form_textarea.readonly.example.vue +0 -9
  142. package/src/components/base/form/form_textarea/examples/form_textarea.submit.example.vue +0 -11
  143. package/src/components/base/form/form_textarea/examples/index.js +0 -43
  144. package/src/components/base/label/examples/index.js +0 -22
  145. package/src/components/base/label/examples/label.basic.example.vue +0 -3
  146. package/src/components/base/label/examples/label.scoped.example.vue +0 -3
  147. package/src/components/base/pagination/examples/index.js +0 -43
  148. package/src/components/base/pagination/examples/pagination.basic.example.vue +0 -17
  149. package/src/components/base/pagination/examples/pagination.compact.example.vue +0 -33
  150. package/src/components/base/pagination/examples/pagination.double_truncation.example.vue +0 -11
  151. package/src/components/base/pagination/examples/pagination.event.example.vue +0 -26
  152. package/src/components/base/pagination/examples/pagination.links.example.vue +0 -18
  153. package/src/components/base/segmented_control/examples/index.js +0 -22
  154. package/src/components/base/segmented_control/examples/segmented_control.basic.example.vue +0 -19
  155. package/src/components/base/segmented_control/examples/segmented_control.whitespace.example.vue +0 -18
  156. package/src/components/base/skeleton_loader/examples/ci_header_skeleton.basic.example.vue +0 -10
  157. package/src/components/base/skeleton_loader/examples/default_skeleton.basic.example.vue +0 -3
  158. package/src/components/base/skeleton_loader/examples/default_skeleton_custom_props.basic.example.vue +0 -9
  159. package/src/components/base/skeleton_loader/examples/index.js +0 -44
  160. package/src/components/base/skeleton_loader/examples/issue_card_skeleton.basic.example.vue +0 -26
  161. package/src/components/base/skeleton_loader/examples/job_log_skeleton.basic.example.vue +0 -13
@@ -1,4 +1,5 @@
1
- import { shallowMount, mount, createLocalVue } from '@vue/test-utils';
1
+ import Vue from 'vue';
2
+ import { shallowMount, mount } from '@vue/test-utils';
2
3
  import GlFilteredSearch from './filtered_search.vue';
3
4
  import GlFilteredSearchSuggestion from './filtered_search_suggestion.vue';
4
5
  import GlFilteredSearchSuggestionList from './filtered_search_suggestion_list.vue';
@@ -14,8 +15,7 @@ const FakeToken = {
14
15
  render: (h) => h('div'),
15
16
  };
16
17
 
17
- const localVue = createLocalVue();
18
- localVue.directive('GlTooltip', () => {});
18
+ Vue.directive('GlTooltip', () => {});
19
19
 
20
20
  let wrapper;
21
21
  describe('Filtered search', () => {
@@ -23,12 +23,11 @@ describe('Filtered search', () => {
23
23
  availableTokens: [{ type: 'faketoken', token: FakeToken }],
24
24
  };
25
25
 
26
- const findSearchBox = () => wrapper.find({ name: 'GlSearchBoxByClickStub' });
26
+ const findSearchBox = () => wrapper.findComponent({ name: 'GlSearchBoxByClickStub' });
27
27
 
28
28
  const createComponent = (props) => {
29
29
  wrapper = shallowMount(GlFilteredSearch, {
30
30
  propsData: { ...defaultProps, ...props },
31
- localVue,
32
31
  stubs: {
33
32
  GlSearchBoxByClick: {
34
33
  name: 'GlSearchBoxByClickStub',
@@ -116,11 +115,11 @@ describe('Filtered search', () => {
116
115
  });
117
116
  await wrapper.vm.$nextTick();
118
117
 
119
- wrapper.find(FakeToken).vm.$emit('activate');
118
+ wrapper.findComponent(FakeToken).vm.$emit('activate');
120
119
 
121
120
  await wrapper.vm.$nextTick();
122
121
 
123
- expect(wrapper.find(FakeToken).props('active')).toBe(true);
122
+ expect(wrapper.findComponent(FakeToken).props('active')).toBe(true);
124
123
  });
125
124
 
126
125
  it('deactivates token when requested', async () => {
@@ -129,8 +128,8 @@ describe('Filtered search', () => {
129
128
  });
130
129
  await wrapper.vm.$nextTick();
131
130
 
132
- wrapper.find(FakeToken).vm.$emit('activate');
133
- wrapper.find(FakeToken).vm.$emit('deactivate');
131
+ wrapper.findComponent(FakeToken).vm.$emit('activate');
132
+ wrapper.findComponent(FakeToken).vm.$emit('deactivate');
134
133
 
135
134
  await wrapper.vm.$nextTick();
136
135
 
@@ -148,12 +147,12 @@ describe('Filtered search', () => {
148
147
  });
149
148
  await wrapper.vm.$nextTick();
150
149
 
151
- wrapper.find(FakeToken).vm.$emit('activate');
150
+ wrapper.findComponent(FakeToken).vm.$emit('activate');
152
151
  wrapper.findAllComponents(FakeToken).at(1).vm.$emit('deactivate');
153
152
 
154
153
  await wrapper.vm.$nextTick();
155
154
 
156
- expect(wrapper.find(FakeToken).props('active')).toBe(true);
155
+ expect(wrapper.findComponent(FakeToken).props('active')).toBe(true);
157
156
  });
158
157
 
159
158
  it('removes empty term tokens on deactivate', async () => {
@@ -187,7 +186,7 @@ describe('Filtered search', () => {
187
186
  });
188
187
  await wrapper.vm.$nextTick();
189
188
 
190
- wrapper.find(FakeToken).vm.$emit('destroy');
189
+ wrapper.findComponent(FakeToken).vm.$emit('destroy');
191
190
 
192
191
  await wrapper.vm.$nextTick();
193
192
 
@@ -203,16 +202,16 @@ describe('Filtered search', () => {
203
202
  });
204
203
  await wrapper.vm.$nextTick();
205
204
 
206
- wrapper.find(FakeToken).vm.$emit('destroy');
205
+ wrapper.findComponent(FakeToken).vm.$emit('destroy');
207
206
 
208
207
  await wrapper.vm.$nextTick();
209
208
 
210
- expect(wrapper.find(GlFilteredSearchTerm).props('active')).toBe(true);
209
+ expect(wrapper.findComponent(GlFilteredSearchTerm).props('active')).toBe(true);
211
210
  });
212
211
 
213
212
  it('does not destroy last token', async () => {
214
213
  createComponent();
215
- wrapper.find(GlFilteredSearchTerm).vm.$emit('destroy');
214
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('destroy');
216
215
 
217
216
  await wrapper.vm.$nextTick();
218
217
 
@@ -224,7 +223,7 @@ describe('Filtered search', () => {
224
223
  it('replaces token when requested', async () => {
225
224
  createComponent();
226
225
  wrapper
227
- .find(GlFilteredSearchTerm)
226
+ .findComponent(GlFilteredSearchTerm)
228
227
  .vm.$emit('replace', { type: 'faketoken', value: { data: 'test' } });
229
228
 
230
229
  await wrapper.vm.$nextTick();
@@ -245,7 +244,7 @@ describe('Filtered search', () => {
245
244
  await wrapper.vm.$nextTick();
246
245
 
247
246
  wrapper
248
- .find(GlFilteredSearchTerm)
247
+ .findComponent(GlFilteredSearchTerm)
249
248
  .vm.$emit('replace', { type: 'faketoken', value: { data: 'test' } });
250
249
 
251
250
  await wrapper.vm.$nextTick();
@@ -258,8 +257,8 @@ describe('Filtered search', () => {
258
257
 
259
258
  it('inserts single token when requested', async () => {
260
259
  createComponent({ value: ['one'] });
261
- wrapper.find(GlFilteredSearchTerm).vm.$emit('activate');
262
- wrapper.find(GlFilteredSearchTerm).vm.$emit('split');
260
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('activate');
261
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('split');
263
262
 
264
263
  await wrapper.vm.$nextTick();
265
264
 
@@ -273,8 +272,8 @@ describe('Filtered search', () => {
273
272
  createComponent({ value: ['one', 'two'] });
274
273
  await wrapper.vm.$nextTick();
275
274
 
276
- wrapper.find(GlFilteredSearchTerm).vm.$emit('activate');
277
- wrapper.find(GlFilteredSearchTerm).vm.$emit('split');
275
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('activate');
276
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('split');
278
277
 
279
278
  await wrapper.vm.$nextTick();
280
279
 
@@ -288,11 +287,11 @@ describe('Filtered search', () => {
288
287
 
289
288
  it('inserts multiple tokens when requested', async () => {
290
289
  createComponent({ value: ['one'] });
291
- wrapper.find(GlFilteredSearchTerm).vm.$emit('activate');
290
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('activate');
292
291
 
293
292
  await wrapper.vm.$nextTick();
294
293
 
295
- wrapper.find(GlFilteredSearchTerm).vm.$emit('split', ['foo', 'bar']);
294
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('split', ['foo', 'bar']);
296
295
 
297
296
  await wrapper.vm.$nextTick();
298
297
 
@@ -306,7 +305,7 @@ describe('Filtered search', () => {
306
305
 
307
306
  it('submits entire search when submit is requested', () => {
308
307
  createComponent();
309
- wrapper.find(GlFilteredSearchTerm).vm.$emit('submit');
308
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
310
309
  expect(wrapper.emitted().submit).toBeDefined();
311
310
  });
312
311
  });
@@ -315,7 +314,7 @@ describe('Filtered search', () => {
315
314
  createComponent({
316
315
  value: ['one'],
317
316
  });
318
- wrapper.find(GlFilteredSearchTerm).vm.$emit('submit');
317
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
319
318
  expect(wrapper.emitted().submit).toBeDefined();
320
319
  expect(wrapper.emitted().submit[0][0]).toStrictEqual(['one']);
321
320
  });
@@ -324,7 +323,7 @@ describe('Filtered search', () => {
324
323
  createComponent({
325
324
  value: ['one', 'two', { type: 'faketoken', value: { data: 'smth' } }, 'four', 'five'],
326
325
  });
327
- wrapper.find(GlFilteredSearchTerm).vm.$emit('submit');
326
+ wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
328
327
  expect(wrapper.emitted().submit).toBeDefined();
329
328
  expect(wrapper.emitted().submit[0][0]).toStrictEqual([
330
329
  'one two',
@@ -339,7 +338,7 @@ describe('Filtered search', () => {
339
338
  });
340
339
  await wrapper.vm.$nextTick();
341
340
 
342
- const fakeTokenInstance = wrapper.find(FakeToken);
341
+ const fakeTokenInstance = wrapper.findComponent(FakeToken);
343
342
  expect(fakeTokenInstance.exists()).toBe(true);
344
343
  expect(Object.keys(fakeTokenInstance.attributes())).toEqual(
345
344
  expect.arrayContaining(['current-value', 'index', 'config', 'value'])
@@ -383,7 +382,6 @@ describe('Filtered search integration tests', () => {
383
382
 
384
383
  const mountComponent = (props) => {
385
384
  wrapper = mount(GlFilteredSearch, {
386
- localVue,
387
385
  propsData: {
388
386
  availableTokens: testTokens,
389
387
  ...props,
@@ -432,7 +430,7 @@ describe('Filtered search integration tests', () => {
432
430
  });
433
431
 
434
432
  it('displays suggestions list', () => {
435
- const suggestions = wrapper.find(GlFilteredSearchSuggestionList);
433
+ const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
436
434
  expect(suggestions.exists()).toBe(true);
437
435
  expect(suggestions.findAllComponents(GlFilteredSearchSuggestion)).toHaveLength(
438
436
  testTokens.filter((t) => !t.disabled).length
@@ -445,7 +443,7 @@ describe('Filtered search integration tests', () => {
445
443
 
446
444
  await wrapper.vm.$nextTick();
447
445
 
448
- const suggestions = wrapper.find(GlFilteredSearchSuggestionList);
446
+ const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
449
447
  expect(suggestions.exists()).toBe(true);
450
448
  expect(suggestions.findAllComponents(GlFilteredSearchSuggestion)).toHaveLength(1);
451
449
  });
@@ -456,7 +454,7 @@ describe('Filtered search integration tests', () => {
456
454
 
457
455
  await wrapper.vm.$nextTick();
458
456
 
459
- const suggestions = wrapper.find(GlFilteredSearchSuggestionList);
457
+ const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
460
458
  expect(suggestions.exists()).toBe(true);
461
459
  expect(suggestions.findAllComponents(GlFilteredSearchSuggestion)).toHaveLength(3);
462
460
  });
@@ -467,7 +465,7 @@ describe('Filtered search integration tests', () => {
467
465
 
468
466
  await wrapper.vm.$nextTick();
469
467
 
470
- const suggestions = wrapper.find(GlFilteredSearchSuggestionList);
468
+ const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
471
469
  expect(suggestions.exists()).toBe(false);
472
470
  });
473
471
 
@@ -481,7 +479,7 @@ describe('Filtered search integration tests', () => {
481
479
 
482
480
  await wrapper.vm.$nextTick();
483
481
 
484
- const token = wrapper.find(GlFilteredSearchToken);
482
+ const token = wrapper.findComponent(GlFilteredSearchToken);
485
483
  expect(token.exists()).toBe(true);
486
484
  });
487
485
 
@@ -518,7 +516,7 @@ describe('Filtered search integration tests', () => {
518
516
 
519
517
  await wrapper.vm.$nextTick();
520
518
 
521
- const suggestions = wrapper.find(GlFilteredSearchSuggestionList);
519
+ const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
522
520
  expect(suggestions.exists()).toBe(true);
523
521
  expect(suggestions.findAllComponents(GlFilteredSearchSuggestion)).toHaveLength(2);
524
522
  });
@@ -549,7 +547,9 @@ describe('Filtered search integration tests', () => {
549
547
 
550
548
  await wrapper.vm.$nextTick();
551
549
 
552
- expect(document.activeElement).toBe(wrapper.find(GlFilteredSearchTerm).find('input').element);
550
+ expect(document.activeElement).toBe(
551
+ wrapper.findComponent(GlFilteredSearchTerm).find('input').element
552
+ );
553
553
  });
554
554
 
555
555
  it('clicking clear button clears component input', async () => {
@@ -64,7 +64,7 @@ describe('Filtered search term', () => {
64
64
  ({ originalEvent, emittedEvent }) => {
65
65
  createComponent({ active: true, value: { data: 'something' } });
66
66
 
67
- wrapper.find(segmentStub).vm.$emit(originalEvent);
67
+ wrapper.findComponent(segmentStub).vm.$emit(originalEvent);
68
68
 
69
69
  return wrapper.vm.$nextTick().then(() => {
70
70
  expect(wrapper.emitted()[emittedEvent]).toHaveLength(1);
@@ -1,37 +1,6 @@
1
- import examples from './examples/form_input';
2
1
  import description from './form_input.md';
3
2
 
4
3
  export default {
5
4
  description,
6
- examples,
7
- bootstrapComponent: 'b-form-input',
8
5
  followsDesignSystem: true,
9
- propsInfo: {
10
- size: {
11
- additionalInfo: 'Maximum width of the input',
12
- enum: 'formInputSizes',
13
- },
14
- },
15
- events: [
16
- {
17
- event: 'input',
18
- args: [
19
- {
20
- arg: 'value',
21
- description: '(String)',
22
- },
23
- ],
24
- description: 'Emitted to update the v-model',
25
- },
26
- {
27
- event: 'update',
28
- args: [
29
- {
30
- arg: 'value',
31
- description: '(String)',
32
- },
33
- ],
34
- description: `Triggered by user interaction. Emitted after any formatting (not including 'trim' or 'number' props). Useful for getting the currently entered value when the 'debounce' or 'lazy' props are set.`,
35
- },
36
- ],
37
6
  };
@@ -1,3 +1 @@
1
- # Form Input
2
-
3
1
  General user input to be used in forms.
@@ -1,13 +1,7 @@
1
- import { withKnobs, boolean, select, text } from '@storybook/addon-knobs';
2
- import { documentedStoriesOf } from '../../../../../documentation/documented_stories';
3
1
  import { GlFormInput } from '../../../../../index';
4
2
  import { formInputSizes } from '../../../../utils/constants';
5
3
  import readme from './form_input.md';
6
4
 
7
- const components = {
8
- GlFormInput,
9
- };
10
-
11
5
  const template = `
12
6
  <gl-form-input
13
7
  type="text"
@@ -16,51 +10,65 @@ const template = `
16
10
  :size="size"
17
11
  />`;
18
12
 
19
- function generateProps({
13
+ const generateProps = ({
20
14
  size = GlFormInput.props.size.default,
21
15
  value = '',
22
16
  disabled = false,
23
- } = {}) {
24
- return {
25
- size: {
26
- type: String,
27
- default: select('size', formInputSizes, size),
28
- },
29
- value: {
30
- type: String,
31
- default: text('value', value),
32
- },
33
- disabled: {
34
- type: Boolean,
35
- default: boolean('disabled', disabled),
36
- },
37
- };
38
- }
17
+ } = {}) => ({
18
+ size,
19
+ value,
20
+ disabled,
21
+ });
22
+
23
+ const Template = (args) => ({
24
+ components: { GlFormInput },
25
+ props: Object.keys(args),
26
+ template,
27
+ });
39
28
 
40
- documentedStoriesOf('base/form/form-input', readme)
41
- .addDecorator(withKnobs)
42
- .add('default', () => ({
43
- components,
44
- props: generateProps(),
45
- template,
46
- }))
47
- .add('disabled', () => ({
48
- components,
49
- props: generateProps({ value: 'some text', disabled: true }),
50
- template,
51
- }))
52
- .add('sizes', () => ({
53
- components,
54
- data: () => ({
55
- formInputSizes,
56
- }),
57
- template: `
29
+ export const Default = Template.bind({});
30
+ Default.args = generateProps();
31
+
32
+ export const Disabled = Template.bind({});
33
+ Disabled.args = generateProps({ value: 'some text', disabled: true });
34
+
35
+ export const Sizes = (args, { argTypes }) => ({
36
+ components: { GlFormInput },
37
+ props: Object.keys(argTypes),
38
+ data: () => ({
39
+ formInputSizes,
40
+ }),
41
+ template: `
58
42
  <div>
59
43
  <gl-form-input
60
44
  v-for="(size, name) in formInputSizes"
45
+ :key="size"
61
46
  :size="size"
62
47
  :value="name"
63
48
  />
64
49
  </div>
65
50
  `,
66
- }));
51
+ });
52
+ Sizes.args = {};
53
+
54
+ export default {
55
+ title: 'base/form/form-input',
56
+ component: GlFormInput,
57
+ parameters: {
58
+ bootstrapComponent: 'b-form-input',
59
+ knobs: { disable: true },
60
+ docs: {
61
+ description: {
62
+ component: readme,
63
+ },
64
+ },
65
+ },
66
+ argTypes: {
67
+ size: {
68
+ options: formInputSizes,
69
+ control: {
70
+ type: 'select',
71
+ },
72
+ },
73
+ },
74
+ };
@@ -2,18 +2,22 @@
2
2
  import { BFormInput } from 'bootstrap-vue';
3
3
  import { formInputSizes } from '../../../../utils/constants';
4
4
 
5
- const model = {
6
- prop: 'value',
7
- event: 'input',
8
- };
5
+ const MODEL_PROP = 'value';
6
+ const MODEL_EVENT = 'input';
9
7
 
10
8
  export default {
11
9
  components: {
12
10
  BFormInput,
13
11
  },
14
12
  inheritAttrs: false,
15
- model,
13
+ model: {
14
+ prop: MODEL_PROP,
15
+ event: MODEL_EVENT,
16
+ },
16
17
  props: {
18
+ /**
19
+ * Maximum width of the input
20
+ */
17
21
  size: {
18
22
  type: String,
19
23
  required: false,
@@ -33,10 +37,23 @@ export default {
33
37
  // Swap purpose of input and update events from underlying BFormInput.
34
38
  // See https://gitlab.com/gitlab-org/gitlab-ui/-/issues/631.
35
39
  input: (...args) => {
40
+ /**
41
+ * Emitted to update the v-model
42
+ *
43
+ * @event update
44
+ * @property {string} value new value
45
+ */
36
46
  this.$emit('update', ...args);
37
47
  },
38
48
  update: (...args) => {
39
- this.$emit(model.event, ...args);
49
+ /**
50
+ * Triggered by user interaction. Emitted after any formatting (not including 'trim' or 'number' props).
51
+ * Useful for getting the currently entered value when the 'debounce' or 'lazy' props are set.
52
+ *
53
+ * @event input
54
+ * @property {string} value new value
55
+ */
56
+ this.$emit(MODEL_EVENT, ...args);
40
57
  },
41
58
  };
42
59
  },
@@ -15,7 +15,7 @@ describe('Input Group', () => {
15
15
  it('renders without errors', () => {
16
16
  createWrapper();
17
17
  expect(wrapper.findComponent(BInputGroup).exists()).toBe(true);
18
- expect(global.console.error).not.toHaveBeenCalled();
18
+ expect(wrapper).not.toHaveLoggedVueErrors();
19
19
  });
20
20
 
21
21
  it('renders prepend and append texts properly in the slots', () => {
@@ -87,8 +87,6 @@ describe('Input Group', () => {
87
87
  });
88
88
 
89
89
  expect(global.console).toHaveLoggedVueErrors();
90
-
91
- global.console.error.mockReset();
92
90
  });
93
91
 
94
92
  it('are rendered when supplied', () => {
@@ -1,9 +1,7 @@
1
- import examples from './examples';
2
1
  import * as description from './form_text.md';
3
2
 
4
3
  export default {
5
4
  description,
6
- examples,
7
5
  bootstrapComponent: 'b-form-text',
8
6
  propsInfo: {},
9
7
  };
@@ -1,6 +1,4 @@
1
- # FormText
2
-
3
- <!-- STORY -->
1
+ # Usage
4
2
 
5
3
  The component used to render form group descriptions. Useful for when you need
6
4
  to add additional form text elements to a form group.
@@ -1,16 +1,28 @@
1
- import { documentedStoriesOf } from '../../../../../documentation/documented_stories';
2
1
  import readme from './form_text.md';
3
2
  import GlFormText from './form_text.vue';
4
3
 
5
- const components = {
6
- GlFormText,
7
- };
8
-
9
- documentedStoriesOf('base/form/form-text', readme).add('default', () => ({
10
- components,
4
+ const Template = (args) => ({
5
+ components: { GlFormText },
6
+ props: Object.keys(args),
11
7
  template: `
12
8
  <div class="gl-form-group">
13
9
  <gl-form-text>Some form text</gl-form-text>
14
10
  </div>
15
11
  `,
16
- }));
12
+ });
13
+
14
+ export const Default = Template.bind({});
15
+ Default.args = {};
16
+
17
+ export default {
18
+ title: 'base/form/form-text',
19
+ component: GlFormText,
20
+ parameters: {
21
+ knobs: { disable: true },
22
+ docs: {
23
+ description: {
24
+ component: readme,
25
+ },
26
+ },
27
+ },
28
+ };
@@ -1,30 +1,5 @@
1
- import examples from './examples';
2
1
  import description from './form_textarea.md';
3
2
 
4
3
  export default {
5
4
  description,
6
- examples,
7
- bootstrapComponent: 'b-form-textarea',
8
- events: [
9
- {
10
- event: 'input',
11
- args: [
12
- {
13
- arg: 'value',
14
- description: '(String)',
15
- },
16
- ],
17
- description: 'Emitted to update the v-model',
18
- },
19
- {
20
- event: 'update',
21
- args: [
22
- {
23
- arg: 'value',
24
- description: '(String)',
25
- },
26
- ],
27
- description: `Triggered by user interaction. Emitted after any formatting (not including 'trim' or 'number' props). Useful for getting the currently entered value when the 'debounce' or 'lazy' props are set.`,
28
- },
29
- ],
30
5
  };
@@ -1,12 +1,6 @@
1
- import { withKnobs, boolean } from '@storybook/addon-knobs';
2
- import { documentedStoriesOf } from '../../../../../documentation/documented_stories';
3
1
  import { GlFormTextarea } from '../../../../../index';
4
2
  import readme from './form_textarea.md';
5
3
 
6
- const components = {
7
- GlFormTextarea,
8
- };
9
-
10
4
  const template = `
11
5
  <gl-form-textarea
12
6
  v-model="model"
@@ -16,28 +10,35 @@ const template = `
16
10
  />
17
11
  `;
18
12
 
19
- function generateProps({ noResize = GlFormTextarea.props.noResize.default } = {}) {
20
- return {
21
- model: {
22
- type: String,
23
- default:
24
- 'We take inspiration from other companies, and we always go for the boring solutions. Just like the rest of our work, we continually adjust our values and strive always to make them better. We used to have more values, but it was difficult to remember them all, so we condensed them and gave sub-values and created an acronym. Everyone is welcome to suggest improvements.',
25
- },
26
- placeholder: {
27
- type: String,
28
- default: 'hello',
29
- },
30
- noResize: {
31
- type: Boolean,
32
- default: boolean('no-resize', noResize),
33
- },
34
- };
35
- }
13
+ const generateProps = ({
14
+ model = 'We take inspiration from other companies, and we always go for the boring solutions. Just like the rest of our work, we continually adjust our values and strive always to make them better. We used to have more values, but it was difficult to remember them all, so we condensed them and gave sub-values and created an acronym. Everyone is welcome to suggest improvements.',
15
+ placeholder = 'hello',
16
+ noResize = GlFormTextarea.props.noResize.default,
17
+ } = {}) => ({
18
+ model,
19
+ placeholder,
20
+ noResize,
21
+ });
36
22
 
37
- documentedStoriesOf('base/form/form-textarea', readme)
38
- .addDecorator(withKnobs)
39
- .add('default', () => ({
40
- components,
41
- props: generateProps(),
42
- template,
43
- }));
23
+ const Template = (args) => ({
24
+ components: { GlFormTextarea },
25
+ props: Object.keys(args),
26
+ template,
27
+ });
28
+
29
+ export const Default = Template.bind({});
30
+ Default.args = generateProps();
31
+
32
+ export default {
33
+ title: 'base/form/form-textarea',
34
+ component: GlFormTextarea,
35
+ parameters: {
36
+ bootstrapComponent: 'b-form-textarea',
37
+ knobs: { disable: true },
38
+ docs: {
39
+ description: {
40
+ component: readme,
41
+ },
42
+ },
43
+ },
44
+ };
@@ -38,9 +38,17 @@ export default {
38
38
  // Swap purpose of input and update events from underlying BFormTextarea.
39
39
  // See https://gitlab.com/gitlab-org/gitlab-ui/-/issues/631.
40
40
  input: (...args) => {
41
+ /**
42
+ * Emitted to update the v-model
43
+ */
41
44
  this.$emit('update', ...args);
42
45
  },
43
46
  update: (...args) => {
47
+ /**
48
+ * Triggered by user interaction.
49
+ * Emitted after any formatting (not including 'trim' or 'number' props).
50
+ * Useful for getting the currently entered value when the 'debounce' or 'lazy' props are set.
51
+ */
44
52
  this.$emit(model.event, ...args);
45
53
  },
46
54
  };