@gitlab/ui 38.0.1 → 38.2.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 (140) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +1 -1
  3. package/dist/components/base/breadcrumb/breadcrumb.js +10 -5
  4. package/dist/components/base/{filtered_search/examples/filtered_search.single_unique.example.js → breadcrumb/breadcrumb_item.js} +32 -28
  5. package/dist/components/base/dropdown/dropdown.documentation.js +1 -5
  6. package/dist/components/base/dropdown/dropdown_item.documentation.js +2 -3
  7. package/dist/components/base/filtered_search/filtered_search.documentation.js +2 -66
  8. package/dist/components/base/filtered_search/filtered_search.js +51 -20
  9. package/dist/components/base/filtered_search/filtered_search_suggestion.documentation.js +2 -8
  10. package/dist/components/base/filtered_search/filtered_search_suggestion.js +5 -1
  11. package/dist/components/base/filtered_search/filtered_search_suggestion_list.documentation.js +2 -7
  12. package/dist/components/base/filtered_search/filtered_search_suggestion_list.js +4 -0
  13. package/dist/components/base/filtered_search/filtered_search_term.documentation.js +2 -44
  14. package/dist/components/base/filtered_search/filtered_search_term.js +37 -0
  15. package/dist/components/base/filtered_search/filtered_search_token.documentation.js +2 -31
  16. package/dist/components/base/filtered_search/filtered_search_token.js +80 -23
  17. package/dist/components/base/filtered_search/filtered_search_token_segment.documentation.js +2 -46
  18. package/dist/components/base/filtered_search/filtered_search_token_segment.js +48 -0
  19. package/dist/components/base/filtered_search/filtered_search_utils.js +42 -9
  20. package/dist/components/base/form/form_checkbox_tree/form_checkbox_tree.documentation.js +2 -27
  21. package/dist/components/base/form/form_checkbox_tree/form_checkbox_tree.js +16 -1
  22. package/dist/components/charts/series_label/series_label.js +6 -1
  23. package/dist/index.css +1 -1
  24. package/dist/index.css.map +1 -1
  25. package/dist/utils/use_mock_intersection_observer.js +2 -2
  26. package/documentation/components_documentation.js +0 -4
  27. package/documentation/documented_stories.js +10 -1
  28. package/package.json +11 -9
  29. package/src/components/base/avatar_link/avatar_link.stories.js +2 -2
  30. package/src/components/base/breadcrumb/breadcrumb.spec.js +24 -10
  31. package/src/components/base/breadcrumb/breadcrumb.vue +11 -6
  32. package/src/components/base/breadcrumb/breadcrumb_item.spec.js +45 -0
  33. package/src/components/base/breadcrumb/breadcrumb_item.vue +43 -0
  34. package/src/components/base/dropdown/dropdown.documentation.js +0 -3
  35. package/src/components/base/dropdown/dropdown.md +7 -2
  36. package/src/components/base/dropdown/dropdown.stories.js +487 -439
  37. package/src/components/base/dropdown/dropdown_item.documentation.js +0 -1
  38. package/src/components/base/dropdown/dropdown_item.md +0 -6
  39. package/src/components/base/dropdown/dropdown_item.stories.js +107 -35
  40. package/src/components/base/filtered_search/filtered_search.documentation.js +0 -76
  41. package/src/components/base/filtered_search/filtered_search.md +3 -4
  42. package/src/components/base/filtered_search/filtered_search.spec.js +37 -12
  43. package/src/components/base/filtered_search/filtered_search.stories.js +260 -17
  44. package/src/components/base/filtered_search/filtered_search.vue +57 -14
  45. package/src/components/base/filtered_search/filtered_search_suggestion.documentation.js +0 -6
  46. package/src/components/base/filtered_search/filtered_search_suggestion.md +1 -7
  47. package/src/components/base/filtered_search/filtered_search_suggestion.stories.js +26 -18
  48. package/src/components/base/filtered_search/filtered_search_suggestion.vue +6 -0
  49. package/src/components/base/filtered_search/filtered_search_suggestion_list.documentation.js +0 -5
  50. package/src/components/base/filtered_search/filtered_search_suggestion_list.md +1 -7
  51. package/src/components/base/filtered_search/filtered_search_suggestion_list.stories.js +33 -25
  52. package/src/components/base/filtered_search/filtered_search_suggestion_list.vue +5 -0
  53. package/src/components/base/filtered_search/filtered_search_term.documentation.js +0 -41
  54. package/src/components/base/filtered_search/filtered_search_term.md +0 -2
  55. package/src/components/base/filtered_search/filtered_search_term.stories.js +33 -26
  56. package/src/components/base/filtered_search/filtered_search_term.vue +54 -0
  57. package/src/components/base/filtered_search/filtered_search_token.documentation.js +0 -26
  58. package/src/components/base/filtered_search/filtered_search_token.md +1 -3
  59. package/src/components/base/filtered_search/filtered_search_token.spec.js +31 -1
  60. package/src/components/base/filtered_search/filtered_search_token.stories.js +137 -132
  61. package/src/components/base/filtered_search/filtered_search_token.vue +93 -21
  62. package/src/components/base/filtered_search/filtered_search_token_segment.documentation.js +0 -43
  63. package/src/components/base/filtered_search/filtered_search_token_segment.md +0 -2
  64. package/src/components/base/filtered_search/filtered_search_token_segment.stories.js +86 -79
  65. package/src/components/base/filtered_search/filtered_search_token_segment.vue +42 -0
  66. package/src/components/base/filtered_search/filtered_search_utils.js +38 -5
  67. package/src/components/base/form/form.stories.js +2 -0
  68. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.documentation.js +0 -26
  69. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.md +0 -4
  70. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.stories.js +123 -92
  71. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.vue +13 -1
  72. package/src/components/base/form/form_radio/form_radio.spec.js +21 -8
  73. package/src/components/base/form/form_radio_group/form_radio_group.stories.js +2 -1
  74. package/src/components/base/markdown/markdown.scss +21 -0
  75. package/src/components/base/markdown/markdown_typescale_demo.html +17 -6
  76. package/src/components/base/navbar/navbar.stories.js +2 -1
  77. package/src/components/base/skeleton_loader/skeleton_loader.stories.js +67 -21
  78. package/src/components/base/tabs/tabs/tabs.stories.js +2 -2
  79. package/src/components/charts/series_label/series_label.stories.js +6 -3
  80. package/src/components/charts/series_label/series_label.vue +3 -0
  81. package/src/scss/typescale/typescale.md +0 -2
  82. package/src/scss/typescale/typescale.stories.js +17 -4
  83. package/src/utils/use_mock_intersection_observer.js +3 -3
  84. package/dist/components/base/dropdown/dropdown_divider.documentation.js +0 -8
  85. package/dist/components/base/dropdown/dropdown_form.documentation.js +0 -17
  86. package/dist/components/base/dropdown/dropdown_section_header.documentation.js +0 -8
  87. package/dist/components/base/dropdown/dropdown_text.documentation.js +0 -8
  88. package/dist/components/base/dropdown/examples/dropdown.default.example.js +0 -38
  89. package/dist/components/base/dropdown/examples/dropdown.links.example.js +0 -38
  90. package/dist/components/base/dropdown/examples/dropdown.with_avatar_and_secondary_text.example.js +0 -38
  91. package/dist/components/base/dropdown/examples/dropdown.with_checked_items.example.js +0 -38
  92. package/dist/components/base/dropdown/examples/dropdown.with_clear_all.example.js +0 -38
  93. package/dist/components/base/dropdown/examples/dropdown.with_divider.example.js +0 -38
  94. package/dist/components/base/dropdown/examples/dropdown.with_form.example.js +0 -38
  95. package/dist/components/base/dropdown/examples/dropdown.with_header.example.js +0 -38
  96. package/dist/components/base/dropdown/examples/dropdown.with_highlighted_items.example.js +0 -38
  97. package/dist/components/base/dropdown/examples/dropdown.with_icons.example.js +0 -38
  98. package/dist/components/base/dropdown/examples/dropdown.with_right_align.example.js +0 -38
  99. package/dist/components/base/dropdown/examples/dropdown.with_search.example.js +0 -67
  100. package/dist/components/base/dropdown/examples/dropdown.with_section_headers.example.js +0 -38
  101. package/dist/components/base/dropdown/examples/index.js +0 -85
  102. package/dist/components/base/filtered_search/examples/filtered_search.default.example.js +0 -422
  103. package/dist/components/base/filtered_search/examples/filtered_search.friendly.example.js +0 -423
  104. package/dist/components/base/filtered_search/examples/filtered_search.history.example.js +0 -91
  105. package/dist/components/base/filtered_search/examples/filtered_search.multi_select.example.js +0 -196
  106. package/dist/components/base/filtered_search/examples/index.js +0 -32
  107. package/dist/components/base/form/form_checkbox_tree/examples/form_checkbox_tree.basic.example.js +0 -103
  108. package/dist/components/base/form/form_checkbox_tree/examples/index.js +0 -13
  109. package/src/components/base/dropdown/dropdown_divider.documentation.js +0 -6
  110. package/src/components/base/dropdown/dropdown_divider.md +0 -7
  111. package/src/components/base/dropdown/dropdown_divider.stories.js +0 -16
  112. package/src/components/base/dropdown/dropdown_form.documentation.js +0 -9
  113. package/src/components/base/dropdown/dropdown_form.md +0 -4
  114. package/src/components/base/dropdown/dropdown_form.stories.js +0 -17
  115. package/src/components/base/dropdown/dropdown_section_header.documentation.js +0 -6
  116. package/src/components/base/dropdown/dropdown_section_header.stories.js +0 -17
  117. package/src/components/base/dropdown/dropdown_text.documentation.js +0 -6
  118. package/src/components/base/dropdown/dropdown_text.stories.js +0 -16
  119. package/src/components/base/dropdown/examples/dropdown.default.example.vue +0 -7
  120. package/src/components/base/dropdown/examples/dropdown.links.example.vue +0 -7
  121. package/src/components/base/dropdown/examples/dropdown.with_avatar_and_secondary_text.example.vue +0 -7
  122. package/src/components/base/dropdown/examples/dropdown.with_checked_items.example.vue +0 -6
  123. package/src/components/base/dropdown/examples/dropdown.with_clear_all.example.vue +0 -7
  124. package/src/components/base/dropdown/examples/dropdown.with_divider.example.vue +0 -9
  125. package/src/components/base/dropdown/examples/dropdown.with_form.example.vue +0 -10
  126. package/src/components/base/dropdown/examples/dropdown.with_header.example.vue +0 -7
  127. package/src/components/base/dropdown/examples/dropdown.with_highlighted_items.example.vue +0 -9
  128. package/src/components/base/dropdown/examples/dropdown.with_icons.example.vue +0 -43
  129. package/src/components/base/dropdown/examples/dropdown.with_right_align.example.vue +0 -7
  130. package/src/components/base/dropdown/examples/dropdown.with_search.example.vue +0 -38
  131. package/src/components/base/dropdown/examples/dropdown.with_section_headers.example.vue +0 -10
  132. package/src/components/base/dropdown/examples/index.js +0 -99
  133. package/src/components/base/filtered_search/examples/filtered_search.default.example.vue +0 -298
  134. package/src/components/base/filtered_search/examples/filtered_search.friendly.example.vue +0 -300
  135. package/src/components/base/filtered_search/examples/filtered_search.history.example.vue +0 -50
  136. package/src/components/base/filtered_search/examples/filtered_search.multi_select.example.vue +0 -132
  137. package/src/components/base/filtered_search/examples/filtered_search.single_unique.example.vue +0 -31
  138. package/src/components/base/filtered_search/examples/index.js +0 -38
  139. package/src/components/base/form/form_checkbox_tree/examples/form_checkbox_tree.basic.example.vue +0 -77
  140. package/src/components/base/form/form_checkbox_tree/examples/index.js +0 -15
@@ -2,5 +2,4 @@ import description from './dropdown_item.md';
2
2
 
3
3
  export default {
4
4
  description,
5
- bootstrapComponent: 'b-dropdown',
6
5
  };
@@ -1,8 +1,2 @@
1
- # Dropdown Item
2
-
3
- <!-- STORY -->
4
-
5
- ## Usage
6
-
7
1
  The dropdown item component is meant to be used for clickable entries inside a dropdown component.
8
2
  If you provide the `href` attribute, it renders a link instead of a button.
@@ -1,42 +1,114 @@
1
- import { withKnobs } from '@storybook/addon-knobs';
2
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
1
+ import iconSpriteInfo from '@gitlab/svgs/dist/icons.json';
3
2
  import { GlDropdownItem } from '../../../index';
3
+ import { variantCssColorMap } from '../../../utils/constants';
4
4
  import readme from './dropdown_item.md';
5
5
 
6
6
  const components = {
7
7
  GlDropdownItem,
8
8
  };
9
9
 
10
- documentedStoriesOf('base/dropdown/dropdown-item', readme)
11
- .addDecorator(withKnobs)
12
- .add('default', () => ({
13
- props: {},
14
- components,
15
- template: '<ul class="list-unstyled"><gl-dropdown-item>Some item</gl-dropdown-item></ul>',
16
- }))
17
- .add('checked', () => ({
18
- props: {},
19
- components,
20
- template:
21
- '<ul class="list-unstyled"><gl-dropdown-item is-checked is-check-item>Some item</gl-dropdown-item></ul>',
22
- }))
23
- .add('checked with avatar', () => ({
24
- props: {},
25
- components,
26
- template: `<ul class="list-unstyled">
27
- <gl-dropdown-item
28
- is-checked
29
- is-check-item
30
- is-check-centered
31
- avatar-url="./img/avatar.png"
32
- secondary-text="@sytses"
33
- >
34
- Sid Sijbrandij
35
- </gl-dropdown-item></ul>`,
36
- }))
37
- .add('checked with secondary text', () => ({
38
- props: {},
39
- components,
40
- template:
41
- '<ul class="list-unstyled"><gl-dropdown-item is-checked is-check-item secondary-text="Lorem ipsum dolar sit amit...">Some item</gl-dropdown-item></ul>',
42
- }));
10
+ const wrap = (template) => `
11
+ <ul class="gl-list-style-none gl-pl-0">
12
+ <gl-dropdown-item
13
+ :avatar-url="avatarUrl"
14
+ :icon-color="iconColor"
15
+ :icon-name="iconName"
16
+ :icon-right-aria-label="iconRightAriaLabel"
17
+ :icon-right-name="iconRightName"
18
+ :is-checked="isChecked"
19
+ :is-check-item="isCheckItem"
20
+ :is-check-centered="isCheckCentered"
21
+ :secondary-text="secondaryText">
22
+ ${template}
23
+ </gl-dropdown-item>
24
+ </ul>
25
+ `;
26
+
27
+ const defaultValue = (prop) => GlDropdownItem.props[prop].default;
28
+
29
+ const generateProps = ({
30
+ avatarUrl = defaultValue('avatarUrl'),
31
+ iconColor = defaultValue('iconColor'),
32
+ iconName = defaultValue('iconName'),
33
+ iconRightAriaLabel = defaultValue('iconRightAriaLabel'),
34
+ iconRightName = defaultValue('iconRightName'),
35
+ isChecked = defaultValue('isChecked'),
36
+ isCheckItem = defaultValue('isCheckItem'),
37
+ isCheckCentered = defaultValue('isCheckCentered'),
38
+ secondaryText = defaultValue('secondaryText'),
39
+ } = {}) => ({
40
+ avatarUrl,
41
+ iconColor,
42
+ iconName,
43
+ iconRightAriaLabel,
44
+ iconRightName,
45
+ isChecked,
46
+ isCheckItem,
47
+ isCheckCentered,
48
+ secondaryText,
49
+ });
50
+
51
+ export const Default = (args, { argTypes }) => ({
52
+ props: Object.keys(argTypes),
53
+ components,
54
+ template: wrap('Some item'),
55
+ });
56
+ Default.args = generateProps();
57
+
58
+ export const Checked = (args, { argTypes }) => ({
59
+ props: Object.keys(argTypes),
60
+ components,
61
+ template: wrap('Some item'),
62
+ });
63
+ Checked.args = generateProps({ isChecked: true, isCheckItem: true });
64
+
65
+ export const CheckedWithAvatar = (args, { argTypes }) => ({
66
+ props: Object.keys(argTypes),
67
+ components,
68
+ template: wrap('Sid Sijbrandij'),
69
+ });
70
+ CheckedWithAvatar.args = generateProps({
71
+ isChecked: true,
72
+ isCheckItem: true,
73
+ isCheckCentered: true,
74
+ avatarUrl: './img/avatar.png',
75
+ secondaryText: '@sytses',
76
+ });
77
+
78
+ export const CheckedWithSecondaryText = (args, { argTypes }) => ({
79
+ props: Object.keys(argTypes),
80
+ components,
81
+ template: wrap('Some item'),
82
+ });
83
+ CheckedWithSecondaryText.args = generateProps({
84
+ isChecked: true,
85
+ isCheckItem: true,
86
+ secondaryText: 'Lorem ipsum dolar sit amit...',
87
+ });
88
+
89
+ export default {
90
+ title: 'base/dropdown/dropdown-item',
91
+ component: GlDropdownItem,
92
+ parameters: {
93
+ bootstrapComponent: 'b-dropdown-item',
94
+ docs: {
95
+ description: {
96
+ component: readme,
97
+ },
98
+ },
99
+ },
100
+ argTypes: {
101
+ iconColor: {
102
+ options: Object.keys(variantCssColorMap),
103
+ control: {
104
+ type: 'select',
105
+ },
106
+ },
107
+ iconName: {
108
+ options: iconSpriteInfo.icons,
109
+ control: {
110
+ type: 'select',
111
+ },
112
+ },
113
+ },
114
+ };
@@ -1,82 +1,6 @@
1
- import examples from './examples';
2
1
  import * as description from './filtered_search.md';
3
2
 
4
3
  export default {
5
4
  description,
6
5
  followsDesignSystem: true,
7
- bootstrapComponent: null,
8
- examples,
9
- propsInfo: {
10
- value: {
11
- additionalInfo: 'If provided, used as value of filtered search',
12
- },
13
- historyItems: {
14
- additionalInfo: 'If provided, used as history items for this component',
15
- },
16
- availableTokens: {
17
- additionalInfo: 'Available tokens',
18
- },
19
- placeholder: {
20
- additionalInfo: 'If provided, used as history items for this component',
21
- },
22
- recentSearchesHeader: {
23
- additionalInfo: 'i18n for recent searches title within history dropdown',
24
- },
25
- clearButtonTitle: {
26
- additionalInfo: 'i18n for clear button title',
27
- },
28
- closeButtonTitle: {
29
- additionalInfo: 'i18n for close button title within history dropdown',
30
- },
31
- clearRecentSearchesText: {
32
- additionalInfo: 'i18n for recent searches clear text',
33
- },
34
- suggestionsListClass: {
35
- additionalInfo:
36
- 'Additional classes to add to the suggestion list menu. NOTE: this not reactive, and the value must be available and fixed when the component is instantiated',
37
- },
38
- searchButtonAttributes: {
39
- additionalInfo: 'HTML attributes to add to the search button',
40
- },
41
- searchInputAttributes: {
42
- additionalInfo: 'HTML attributes to add to the search input',
43
- },
44
- },
45
- events: [
46
- {
47
- event: 'clear',
48
- description: 'Emitted when search is cleared',
49
- },
50
- {
51
- event: 'submit',
52
- args: [
53
- {
54
- arg: 'tokens',
55
- description: '(Array)',
56
- },
57
- ],
58
- description: 'Emitted when search is submitted',
59
- },
60
- {
61
- event: 'history-item-selected',
62
- args: [
63
- {
64
- arg: 'value',
65
- description: 'History item',
66
- },
67
- ],
68
- description: 'Emitted when item from history is selected',
69
- },
70
- {
71
- event: 'clear-history',
72
- description: 'Emitted when clear history button is clicked',
73
- },
74
- ],
75
- slots: [
76
- {
77
- name: 'history-item',
78
- description:
79
- 'Slot to customize history item in history dropdown. Used only if using history items',
80
- },
81
- ],
82
6
  };
@@ -1,5 +1,3 @@
1
- # Filtered Search
2
-
3
1
  The filtered search component is responsible for managing search with possible filters.
4
2
 
5
3
  ## Usage
@@ -61,6 +59,7 @@ const availableTokens = [
61
59
  Pass the list of tokens to the search component. Optionally, you can use `v-model` to receive
62
60
  realtime updates:
63
61
 
64
- ```js
65
- <gl-filtered-search :available-tokens="tokens" v-model="value" />
62
+ ```html
63
+
64
+ <gl-filtered-search :available-tokens="tokens" v-model="value" />
66
65
  ```
@@ -1,4 +1,5 @@
1
1
  import Vue, { nextTick } from 'vue';
2
+ import { omit } from 'lodash';
2
3
  import { shallowMount, mount } from '@vue/test-utils';
3
4
  import GlFilteredSearch from './filtered_search.vue';
4
5
  import GlFilteredSearchSuggestion from './filtered_search_suggestion.vue';
@@ -17,6 +18,8 @@ const FakeToken = {
17
18
 
18
19
  Vue.directive('GlTooltip', () => {});
19
20
 
21
+ const stripId = (token) => (typeof token === 'object' ? omit(token, 'id') : token);
22
+
20
23
  let wrapper;
21
24
  describe('Filtered search', () => {
22
25
  const defaultProps = {
@@ -41,7 +44,7 @@ describe('Filtered search', () => {
41
44
  describe('value manipulation', () => {
42
45
  it('creates term when empty', () => {
43
46
  createComponent();
44
- expect(wrapper.emitted().input[0][0]).toStrictEqual([
47
+ expect(wrapper.emitted().input[0][0].map(stripId)).toStrictEqual([
45
48
  { type: TERM_TOKEN_TYPE, value: { data: '' } },
46
49
  ]);
47
50
  });
@@ -56,7 +59,7 @@ describe('Filtered search', () => {
56
59
  value: [{ type: 'faketoken', value: { data: '' } }],
57
60
  });
58
61
 
59
- expect(wrapper.emitted().input[0][0].pop()).toStrictEqual({
62
+ expect(stripId(wrapper.emitted().input[0][0].pop())).toStrictEqual({
60
63
  type: TERM_TOKEN_TYPE,
61
64
  value: { data: '' },
62
65
  });
@@ -172,7 +175,7 @@ describe('Filtered search', () => {
172
175
 
173
176
  await nextTick();
174
177
 
175
- expect(wrapper.emitted().input.pop()[0]).toStrictEqual([
178
+ expect(wrapper.emitted().input.pop()[0].map(stripId)).toStrictEqual([
176
179
  { type: 'faketoken', value: { data: '' } },
177
180
  { type: TERM_TOKEN_TYPE, value: { data: 'one' } },
178
181
  { type: TERM_TOKEN_TYPE, value: { data: 'three' } },
@@ -190,7 +193,7 @@ describe('Filtered search', () => {
190
193
 
191
194
  await nextTick();
192
195
 
193
- expect(wrapper.emitted().input.pop()[0]).toStrictEqual([
196
+ expect(wrapper.emitted().input.pop()[0].map(stripId)).toStrictEqual([
194
197
  { type: TERM_TOKEN_TYPE, value: { data: 'one' } },
195
198
  { type: TERM_TOKEN_TYPE, value: { data: '' } },
196
199
  ]);
@@ -305,7 +308,7 @@ describe('Filtered search', () => {
305
308
 
306
309
  await nextTick();
307
310
 
308
- expect(wrapper.emitted().input.pop()[0]).toStrictEqual([
311
+ expect(wrapper.emitted().input.pop()[0].map(stripId)).toStrictEqual([
309
312
  { type: TERM_TOKEN_TYPE, value: { data: '' } },
310
313
  ]);
311
314
  });
@@ -318,7 +321,7 @@ describe('Filtered search', () => {
318
321
 
319
322
  await nextTick();
320
323
 
321
- expect(wrapper.emitted().input.pop()[0]).toStrictEqual([
324
+ expect(wrapper.emitted().input.pop()[0].map(stripId)).toStrictEqual([
322
325
  { type: 'faketoken', value: { data: 'test' } },
323
326
  { type: TERM_TOKEN_TYPE, value: { data: '' } },
324
327
  ]);
@@ -339,7 +342,7 @@ describe('Filtered search', () => {
339
342
 
340
343
  await nextTick();
341
344
 
342
- expect(wrapper.emitted().input.pop()[0]).toStrictEqual([
345
+ expect(wrapper.emitted().input.pop()[0].map(stripId)).toStrictEqual([
343
346
  { type: 'faketoken', value: { data: 'test' } },
344
347
  { type: TERM_TOKEN_TYPE, value: { data: '' } },
345
348
  ]);
@@ -352,7 +355,7 @@ describe('Filtered search', () => {
352
355
 
353
356
  await nextTick();
354
357
 
355
- expect(wrapper.emitted().input.pop()[0]).toStrictEqual([
358
+ expect(wrapper.emitted().input.pop()[0].map(stripId)).toStrictEqual([
356
359
  { type: TERM_TOKEN_TYPE, value: { data: 'one' } },
357
360
  { type: TERM_TOKEN_TYPE, value: { data: '' } },
358
361
  ]);
@@ -368,7 +371,7 @@ describe('Filtered search', () => {
368
371
  await nextTick();
369
372
 
370
373
  expect(wrapper.findAllComponents(GlFilteredSearchTerm).at(2).props('active')).toBe(true);
371
- expect(wrapper.emitted().input.pop()[0]).toStrictEqual([
374
+ expect(wrapper.emitted().input.pop()[0].map(stripId)).toStrictEqual([
372
375
  { type: TERM_TOKEN_TYPE, value: { data: 'one' } },
373
376
  { type: TERM_TOKEN_TYPE, value: { data: 'two' } },
374
377
  { type: TERM_TOKEN_TYPE, value: { data: '' } },
@@ -385,7 +388,7 @@ describe('Filtered search', () => {
385
388
 
386
389
  await nextTick();
387
390
 
388
- expect(wrapper.emitted().input.pop()[0]).toStrictEqual([
391
+ expect(wrapper.emitted().input.pop()[0].map(stripId)).toStrictEqual([
389
392
  { type: TERM_TOKEN_TYPE, value: { data: 'one' } },
390
393
  { type: TERM_TOKEN_TYPE, value: { data: 'foo' } },
391
394
  { type: TERM_TOKEN_TYPE, value: { data: 'bar' } },
@@ -415,7 +418,7 @@ describe('Filtered search', () => {
415
418
  });
416
419
  wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
417
420
  expect(wrapper.emitted().submit).toBeDefined();
418
- expect(wrapper.emitted().submit[0][0]).toStrictEqual([
421
+ expect(wrapper.emitted().submit[0][0].map(stripId)).toStrictEqual([
419
422
  'one two',
420
423
  { type: 'faketoken', value: { data: 'smth' } },
421
424
  'four five',
@@ -475,7 +478,7 @@ describe('Filtered search', () => {
475
478
  });
476
479
  await nextTick();
477
480
 
478
- expect(wrapper.findComponent(GlFilteredSearchTerm).props('currentValue')).toEqual([
481
+ expect(wrapper.findComponent(GlFilteredSearchTerm).props('currentValue').map(stripId)).toEqual([
479
482
  { type: 'filtered-search-term', value: { data: 'one' } },
480
483
  { type: 'filtered-search-term', value: { data: '' } },
481
484
  ]);
@@ -705,4 +708,26 @@ describe('Filtered search integration tests', () => {
705
708
 
706
709
  expect(wrapper.findAllComponents(GlFilteredSearchTerm)).toHaveLength(1);
707
710
  });
711
+
712
+ // Regression test for https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1761
713
+ it('does not incorrectly activate next token of the same type after token destruction', async () => {
714
+ mountComponent({
715
+ value: [
716
+ { type: 'static', value: { data: 'first', operator: '=' } },
717
+ { type: 'static', value: { data: 'second', operator: '=' } },
718
+ { type: 'unique', value: { data: 'something' } },
719
+ ],
720
+ });
721
+ await nextTick();
722
+
723
+ expect(
724
+ wrapper.findAllComponents(GlFilteredSearchToken).wrappers.map((cmp) => cmp.props('active'))
725
+ ).toEqual([false, false, false]);
726
+
727
+ await wrapper.find('.gl-token-close').trigger('mousedown');
728
+
729
+ expect(
730
+ wrapper.findAllComponents(GlFilteredSearchToken).wrappers.map((cmp) => cmp.props('active'))
731
+ ).toEqual([false, false]);
732
+ });
708
733
  });