@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
@@ -90,6 +90,10 @@ export const setupStorybookReadme = () =>
90
90
  'GlAccordionItem',
91
91
  'GlDaterangePicker',
92
92
  'GlBarChart',
93
+ 'GlCarousel',
94
+ 'GlMarkdown',
95
+ 'GlTokenSelector',
96
+ 'GlTooltip',
93
97
  ],
94
98
  components: {
95
99
  GlComponentDocumentation,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "32.38.0",
3
+ "version": "32.42.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -82,21 +82,21 @@
82
82
  "@arkweid/lefthook": "^0.7.6",
83
83
  "@babel/core": "^7.10.2",
84
84
  "@babel/preset-env": "^7.10.2",
85
- "@gitlab/eslint-plugin": "9.4.0",
85
+ "@gitlab/eslint-plugin": "10.0.0",
86
86
  "@gitlab/stylelint-config": "2.6.0",
87
- "@gitlab/svgs": "1.220.0",
87
+ "@gitlab/svgs": "1.223.0",
88
88
  "@rollup/plugin-commonjs": "^11.1.0",
89
89
  "@rollup/plugin-node-resolve": "^7.1.3",
90
90
  "@rollup/plugin-replace": "^2.3.2",
91
- "@storybook/addon-a11y": "6.3.12",
92
- "@storybook/addon-docs": "6.3.12",
93
- "@storybook/addon-essentials": "6.3.12",
94
- "@storybook/addon-knobs": "6.3.1",
95
- "@storybook/addon-storyshots": "6.3.12",
96
- "@storybook/addon-storyshots-puppeteer": "6.3.12",
97
- "@storybook/addon-viewport": "6.3.12",
98
- "@storybook/theming": "6.3.12",
99
- "@storybook/vue": "6.3.12",
91
+ "@storybook/addon-a11y": "6.4.5",
92
+ "@storybook/addon-docs": "6.4.5",
93
+ "@storybook/addon-essentials": "6.4.5",
94
+ "@storybook/addon-knobs": "6.4.0",
95
+ "@storybook/addon-storyshots": "6.4.5",
96
+ "@storybook/addon-storyshots-puppeteer": "6.4.5",
97
+ "@storybook/addon-viewport": "6.4.5",
98
+ "@storybook/theming": "6.4.5",
99
+ "@storybook/vue": "6.4.5",
100
100
  "@vue/test-utils": "1.1.3",
101
101
  "autoprefixer": "^9.7.6",
102
102
  "babel-jest": "^26.6.3",
@@ -129,7 +129,7 @@
129
129
  "postcss-scss": "^2.1.1",
130
130
  "prettier": "2.2.1",
131
131
  "pug": "^2.0.3",
132
- "puppeteer": "^10.4.0",
132
+ "puppeteer": "11.0.0",
133
133
  "raw-loader": "^0.5.1",
134
134
  "rollup": "^2.53.1",
135
135
  "rollup-plugin-babel": "^4.4.0",
@@ -6,10 +6,6 @@ import GlAccordionItem from './accordion_item.vue';
6
6
  describe('GlAccordion', () => {
7
7
  let wrapper;
8
8
 
9
- afterEach(() => {
10
- wrapper.destroy();
11
- });
12
-
13
9
  const createComponent = ({ headerLevel = 3, autoCollapse = false } = {}) => {
14
10
  wrapper = mount(
15
11
  Vue.extend({
@@ -10,10 +10,6 @@ describe('GlAccordionItem', () => {
10
10
  const defaultTitle = 'Item 1';
11
11
  const defaultSlot = 'Hello';
12
12
 
13
- afterEach(() => {
14
- wrapper.destroy();
15
- });
16
-
17
13
  const createComponent = (props = {}, { defaultHeaderLevel = 3, accordionSetId = false } = {}) => {
18
14
  wrapper = mount(GlAccordionItem, {
19
15
  directives: {
@@ -26,10 +26,6 @@ describe('Alert component', () => {
26
26
  const findActionsContainer = () => wrapper.find('.gl-alert-actions');
27
27
  const findActionButtons = () => wrapper.findAll('.gl-alert-action');
28
28
 
29
- afterEach(() => {
30
- wrapper.destroy();
31
- });
32
-
33
29
  describe('by default', () => {
34
30
  beforeEach(() => {
35
31
  createComponent({ slots: { default: DummyComponent } });
@@ -20,8 +20,6 @@ describe('avatar labeled', () => {
20
20
  });
21
21
  };
22
22
 
23
- afterEach(() => wrapper.destroy());
24
-
25
23
  it('sets avatar alt attribute to an empty string', () => {
26
24
  const altText = 'alt text';
27
25
 
@@ -23,8 +23,6 @@ describe('avatars inline', () => {
23
23
 
24
24
  const findBadgeTooltip = () => wrapper.findComponent(GlTooltip);
25
25
 
26
- afterEach(() => wrapper.destroy());
27
-
28
26
  it('displays all avatars when component is not collapsed', () => {
29
27
  buildWrapper({ avatars, maxVisible: 1, avatarSize: 24, collapsed: false });
30
28
 
@@ -15,8 +15,6 @@ describe('badge', () => {
15
15
  });
16
16
  };
17
17
 
18
- afterEach(() => wrapper.destroy());
19
-
20
18
  describe('with "icon" prop', () => {
21
19
  describe.each`
22
20
  scenario | hasSlot | iconName | expectedRole
@@ -14,10 +14,6 @@ describe('Broadcast message component', () => {
14
14
  createComponent({ slots: { default: 'some message' } });
15
15
  });
16
16
 
17
- afterEach(() => {
18
- wrapper.destroy();
19
- });
20
-
21
17
  it('clicking on dismiss button emits a dismiss event', () => {
22
18
  findDismissButton().vm.$emit('click');
23
19
 
@@ -10,11 +10,6 @@ describe('button component', () => {
10
10
  };
11
11
  const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
12
12
 
13
- afterEach(() => {
14
- wrapper.destroy();
15
- wrapper = null;
16
- });
17
-
18
13
  it('renders a button', () => {
19
14
  buildWrapper();
20
15
 
@@ -20,11 +20,6 @@ describe('GlCard', () => {
20
20
  const findHeader = () => wrapper.find('.gl-card-header');
21
21
  const findFooter = () => wrapper.find('.gl-card-footer');
22
22
 
23
- afterEach(() => {
24
- wrapper.destroy();
25
- wrapper = null;
26
- });
27
-
28
23
  describe('with just the body content', () => {
29
24
  beforeEach(() => {
30
25
  createWrapper({
@@ -1,8 +1,6 @@
1
1
  import description from './carousel.md';
2
- import examples from './examples';
3
2
 
4
3
  export default {
5
4
  description,
6
- examples,
7
5
  bootstrapComponent: 'b-carousel',
8
6
  };
@@ -1,5 +1,3 @@
1
- ## Carousel
2
-
3
1
  The carousel is a slideshow for cycling through a series of content, built with CSS 3D
4
2
  transforms. It works with a series of images, text, or custom markup. It also includes support
5
3
  for previous/next controls and indicators.
@@ -17,10 +17,6 @@ describe('Carousel component', () => {
17
17
  });
18
18
  });
19
19
 
20
- afterEach(() => {
21
- wrapper.destroy();
22
- });
23
-
24
20
  it('renders a BCarousel component', () => {
25
21
  expect(wrapper.findComponent(BCarousel).exists()).toBe(true);
26
22
  });
@@ -1,16 +1,8 @@
1
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
2
1
  import readme from './carousel.md';
3
2
  import GlCarousel from './carousel.vue';
4
3
  import GlCarouselSlide from './carousel_slide.vue';
5
4
 
6
- const components = {
7
- GlCarousel,
8
- GlCarouselSlide,
9
- };
10
-
11
- documentedStoriesOf('base/carousel', readme).add('default carousel', () => ({
12
- components,
13
- template: `
5
+ const template = `
14
6
  <gl-carousel
15
7
  :interval="0"
16
8
  controls
@@ -34,5 +26,26 @@ documentedStoriesOf('base/carousel', readme).add('default carousel', () => ({
34
26
 
35
27
  <!-- Slides with image only -->
36
28
  <gl-carousel-slide img-src="./img/carousel_slide3.jpg"/>
37
- </gl-carousel>`,
38
- }));
29
+ </gl-carousel>
30
+ `;
31
+
32
+ const Template = () => ({
33
+ components: { GlCarousel, GlCarouselSlide },
34
+ template,
35
+ });
36
+
37
+ export const Default = Template.bind({});
38
+
39
+ export default {
40
+ title: 'base/carousel',
41
+ component: GlCarousel,
42
+ parameters: {
43
+ bootstrapComponent: 'b-carousel',
44
+ knobs: { disable: true },
45
+ docs: {
46
+ description: {
47
+ component: readme,
48
+ },
49
+ },
50
+ },
51
+ };
@@ -17,10 +17,6 @@ describe('Collapse component', () => {
17
17
  });
18
18
  });
19
19
 
20
- afterEach(() => {
21
- wrapper.destroy();
22
- });
23
-
24
20
  it('renders a BCollapse', () => {
25
21
  expect(wrapper.findComponent(BCollapse).exists()).toBe(true);
26
22
  });
@@ -148,10 +148,6 @@ describe('datepicker component', () => {
148
148
  clearButton = findClearButton(wrapper);
149
149
  };
150
150
 
151
- afterEach(() => {
152
- wrapper.destroy();
153
- });
154
-
155
151
  it('renders clear button', async () => {
156
152
  await setup();
157
153
 
@@ -24,11 +24,6 @@ describe('Daterange Picker', () => {
24
24
  const findStartPicker = () => wrapper.findAllComponents(Datepicker).at(0);
25
25
  const findEndPicker = () => wrapper.findAllComponents(Datepicker).at(1);
26
26
 
27
- afterEach(() => {
28
- wrapper.destroy();
29
- wrapper = null;
30
- });
31
-
32
27
  it('renders two datepickers', () => {
33
28
  factory();
34
29
  expect(findStartPicker().exists()).toBe(true);
@@ -7,10 +7,6 @@ describe('drawer component', () => {
7
7
  wrapper = shallowMount(Drawer, { propsData: props, slots });
8
8
  };
9
9
 
10
- afterEach(() => {
11
- wrapper.destroy();
12
- });
13
-
14
10
  describe('default settings', () => {
15
11
  describe('when open is true', () => {
16
12
  it('makes gl-drawer visible when open is true', () => {
@@ -24,8 +24,6 @@ describe('new dropdown', () => {
24
24
  });
25
25
  };
26
26
 
27
- afterEach(() => wrapper.destroy());
28
-
29
27
  const findByTestId = (testId) => wrapper.find(`[data-testid="${testId}"]`);
30
28
 
31
29
  const findSplitButton = () => wrapper.find('.btn:not(.gl-dropdown-toggle)');
@@ -14,8 +14,6 @@ describe('dropdown item', () => {
14
14
 
15
15
  const findCheckbox = () => wrapper.find('[data-testid="dropdown-item-checkbox"]');
16
16
 
17
- afterEach(() => wrapper.destroy());
18
-
19
17
  describe('checkbox', () => {
20
18
  it.each`
21
19
  props | shouldExist
@@ -39,11 +39,6 @@ describe('Filtered search', () => {
39
39
  });
40
40
  };
41
41
 
42
- afterEach(() => {
43
- wrapper.destroy();
44
- wrapper = null;
45
- });
46
-
47
42
  describe('value manipulation', () => {
48
43
  it('creates term when empty', () => {
49
44
  createComponent();
@@ -423,11 +418,6 @@ describe('Filtered search integration tests', () => {
423
418
  }
424
419
  });
425
420
 
426
- afterEach(() => {
427
- wrapper.destroy();
428
- wrapper = null;
429
- });
430
-
431
421
  describe('when first term is clicked', () => {
432
422
  beforeEach(async () => {
433
423
  mountComponent();
@@ -253,6 +253,7 @@ export default {
253
253
  :value="tokens"
254
254
  :history-items="historyItems"
255
255
  :clearable="hasValue"
256
+ data-testid="filtered-search-input"
256
257
  @submit="submit"
257
258
  @input="applyNewValue"
258
259
  @history-item-selected="$emit('history-item-selected', $event)"
@@ -25,11 +25,6 @@ describe('Filtered search suggestion component', () => {
25
25
  });
26
26
  });
27
27
 
28
- afterEach(() => {
29
- wrapper.destroy();
30
- wrapper = null;
31
- });
32
-
33
28
  beforeAll(() => {
34
29
  if (!HTMLElement.prototype.scrollIntoView) {
35
30
  HTMLElement.prototype.scrollIntoView = jest.fn();
@@ -12,11 +12,6 @@ describe('Filtered search suggestion list component', () => {
12
12
  });
13
13
  });
14
14
 
15
- afterEach(() => {
16
- wrapper.destroy();
17
- wrapper = null;
18
- });
19
-
20
15
  it('has expected public methods', () => {
21
16
  expect(wrapper.vm.register).toBeInstanceOf(Function);
22
17
  expect(wrapper.vm.unregister).toBeInstanceOf(Function);
@@ -29,11 +29,6 @@ describe('Filtered search term', () => {
29
29
  });
30
30
  };
31
31
 
32
- afterEach(() => {
33
- wrapper.destroy();
34
- wrapper = null;
35
- });
36
-
37
32
  it('renders value in inactive mode', () => {
38
33
  createComponent({ value: { data: 'test-value' } });
39
34
  expect(wrapper.html()).toMatchSnapshot();
@@ -38,11 +38,6 @@ describe('Filtered search token', () => {
38
38
  });
39
39
  };
40
40
 
41
- afterEach(() => {
42
- wrapper.destroy();
43
- wrapper = null;
44
- });
45
-
46
41
  describe('when activated', () => {
47
42
  it('emits activate when operator segment is clicked', () => {
48
43
  createComponent();
@@ -189,6 +189,7 @@ export default {
189
189
 
190
190
  const handlers = {
191
191
  Enter: () => {
192
+ e.preventDefault();
192
193
  if (suggestedValue != null) {
193
194
  this.applySuggestion(suggestedValue);
194
195
  } else {
@@ -197,10 +198,12 @@ export default {
197
198
  },
198
199
  ':': () => {
199
200
  if (suggestedValue != null) {
201
+ e.preventDefault();
200
202
  this.applySuggestion(suggestedValue);
201
203
  }
202
204
  },
203
205
  Escape: () => {
206
+ e.preventDefault();
204
207
  this.$emit('complete');
205
208
  },
206
209
  };
@@ -217,7 +220,6 @@ export default {
217
220
  }
218
221
 
219
222
  if (Object.keys(handlers).includes(key)) {
220
- e.preventDefault();
221
223
  handlers[key]();
222
224
  return;
223
225
  }
@@ -244,6 +246,7 @@ export default {
244
246
  <div
245
247
  class="gl-filtered-search-token-segment"
246
248
  :class="{ 'gl-filtered-search-token-segment-active': active }"
249
+ data-testid="filtered-search-token-segment"
247
250
  @mousedown.left="emitIfInactive"
248
251
  >
249
252
  <template v-if="active">
@@ -108,11 +108,6 @@ describe('GlFormCheckboxTree', () => {
108
108
  });
109
109
  };
110
110
 
111
- afterEach(() => {
112
- wrapper.destroy();
113
- wrapper = null;
114
- });
115
-
116
111
  describe.each`
117
112
  description | shape | expected | initiallyChecked | indeterminateBoxes
118
113
  ${'non-nested'} | ${SHAPE.NO_NESTING} | ${5} | ${['1', '2', '3']} | ${[]}
@@ -48,10 +48,6 @@ describe('GlFormCombobox', () => {
48
48
  const setInput = (val) => findInput().setValue(val);
49
49
  const arrowDown = () => findInput().trigger('keydown.down');
50
50
 
51
- afterEach(() => {
52
- wrapper.destroy();
53
- });
54
-
55
51
  describe('match and filter functionality', () => {
56
52
  beforeEach(() => {
57
53
  createComponent();
@@ -14,11 +14,6 @@ describe('GlFormInput', () => {
14
14
  });
15
15
  };
16
16
 
17
- afterEach(() => {
18
- wrapper.destroy();
19
- wrapper = null;
20
- });
21
-
22
17
  describe('size prop', () => {
23
18
  // Exclude the default null value
24
19
  const sizes = Object.values(formInputSizes).filter(Boolean);
@@ -1,5 +1,5 @@
1
1
  import { shallowMount } from '@vue/test-utils';
2
- import { BInputGroup } from 'bootstrap-vue';
2
+ import { BInputGroup, BFormInput } from 'bootstrap-vue';
3
3
  import GlDropdownItem from '../../dropdown/dropdown_item.vue';
4
4
  import InputGroup from './form_input_group.vue';
5
5
 
@@ -12,10 +12,6 @@ describe('Input Group', () => {
12
12
  });
13
13
  };
14
14
 
15
- afterEach(() => {
16
- wrapper.destroy();
17
- });
18
-
19
15
  it('renders without errors', () => {
20
16
  createWrapper();
21
17
  expect(wrapper.findComponent(BInputGroup).exists()).toBe(true);
@@ -54,6 +50,23 @@ describe('Input Group', () => {
54
50
  expect(wrapper.emitted('input')).toBeUndefined();
55
51
  });
56
52
 
53
+ describe('`inputClass` prop', () => {
54
+ it.each`
55
+ inputClass
56
+ ${'foo-bar baz'}
57
+ ${['foo-bar', 'baz']}
58
+ ${{ 'foo-bar': true, baz: true }}
59
+ `('correctly adds classes to input when `inputClass` prop is $inputClass', ({ inputClass }) => {
60
+ createWrapper({
61
+ propsData: { inputClass },
62
+ });
63
+
64
+ expect(wrapper.findComponent(BFormInput).classes()).toEqual(
65
+ expect.arrayContaining(['gl-form-input', 'foo-bar', 'baz'])
66
+ );
67
+ });
68
+ });
69
+
57
70
  describe('predefined options', () => {
58
71
  const options = [
59
72
  { name: 'Foo', value: 'foo.com' },
@@ -32,6 +32,11 @@ export default {
32
32
  required: false,
33
33
  default: undefined,
34
34
  },
35
+ inputClass: {
36
+ type: [String, Array, Object],
37
+ required: false,
38
+ default: '',
39
+ },
35
40
  },
36
41
  data() {
37
42
  return {
@@ -73,7 +78,7 @@ export default {
73
78
  <b-form-input
74
79
  ref="input"
75
80
  v-model="localValue"
76
- class="gl-form-input"
81
+ :class="['gl-form-input', inputClass]"
77
82
  :aria-label="label"
78
83
  v-bind="$attrs"
79
84
  v-on="$listeners"
@@ -44,10 +44,6 @@ describe('GlFormRadio', () => {
44
44
  createWrapper();
45
45
  });
46
46
 
47
- afterEach(() => {
48
- wrapper.destroy();
49
- });
50
-
51
47
  it('checks the radio button correctly on mount', () => {
52
48
  const radio = findRadio(firstOption.value);
53
49
  expect(radio.element.checked).toBe(true);
@@ -35,10 +35,6 @@ describe('GlFormRadioGroup', () => {
35
35
  createWrapper();
36
36
  });
37
37
 
38
- afterEach(() => {
39
- wrapper.destroy();
40
- });
41
-
42
38
  it('checks the radio button correctly on mount', () => {
43
39
  const radio = findRadio(firstOption.value);
44
40
  expect(radio.element.checked).toBe(true);
@@ -15,11 +15,6 @@ describe('GlFormSelect', () => {
15
15
  });
16
16
  };
17
17
 
18
- afterEach(() => {
19
- wrapper.destroy();
20
- wrapper = null;
21
- });
22
-
23
18
  describe('state prop', () => {
24
19
  it.each`
25
20
  state | expectedClasses
@@ -13,11 +13,6 @@ describe('GlFormTextArea', () => {
13
13
  });
14
14
  };
15
15
 
16
- afterEach(() => {
17
- wrapper.destroy();
18
- wrapper = null;
19
- });
20
-
21
16
  describe('v-model', () => {
22
17
  describe('value binding', () => {
23
18
  beforeEach(() => {
@@ -29,8 +29,6 @@ describe('Icon component', () => {
29
29
  const validateName = (name) => Icon.props.name.validator(name);
30
30
 
31
31
  afterEach(() => {
32
- wrapper.destroy();
33
-
34
32
  if (consoleSpy) {
35
33
  consoleSpy.mockRestore();
36
34
  }
@@ -60,7 +60,6 @@ describe('Infinite Scroll component', () => {
60
60
 
61
61
  afterEach(() => {
62
62
  throttle.mockClear();
63
- wrapper.destroy();
64
63
  });
65
64
 
66
65
  it('emits nothing on creation', () => {
@@ -17,11 +17,6 @@ describe('GlKeysetPagination', () => {
17
17
  });
18
18
  };
19
19
 
20
- afterEach(() => {
21
- wrapper.destroy();
22
- wrapper = null;
23
- });
24
-
25
20
  const findPrevButton = () => wrapper.find('[data-testid="prevButton"]');
26
21
  const findNextButton = () => wrapper.find('[data-testid="nextButton"]');
27
22
 
@@ -35,10 +35,6 @@ describe('Label component', () => {
35
35
  });
36
36
  };
37
37
 
38
- afterEach(() => {
39
- wrapper.destroy();
40
- });
41
-
42
38
  const findLink = () => wrapper.findComponent(GlLink);
43
39
  const findTitle = () => wrapper.find('.gl-label-text');
44
40
  const findSubTitle = () => wrapper.find('.gl-label-text-scoped');
@@ -8,11 +8,6 @@ describe('link component', () => {
8
8
  wrapper = mount(Link, options);
9
9
  };
10
10
 
11
- afterEach(() => {
12
- wrapper.destroy();
13
- wrapper = null;
14
- });
15
-
16
11
  describe('default settings', () => {
17
12
  beforeEach(() => {
18
13
  createWrapper();
@@ -11,10 +11,6 @@ describe('loading icon component', () => {
11
11
  const findSpinnerEl = () => wrapper.find(`.${baseCssClass}`);
12
12
  const getSpinnerClasses = () => findSpinnerEl().classes();
13
13
 
14
- afterEach(() => {
15
- wrapper.destroy();
16
- });
17
-
18
14
  describe('display', () => {
19
15
  it('should render as a block by default', () => {
20
16
  createComponent();