@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
@@ -1,32 +1,28 @@
1
- import { withKnobs } from '@storybook/addon-knobs';
2
1
  import { GlFilteredSearchSuggestionList, GlFilteredSearchSuggestion } from '../../../index';
3
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
4
2
  import { provide } from './common_story_options';
5
3
  import readme from './filtered_search_suggestion_list.md';
6
4
 
7
- documentedStoriesOf('base/filtered-search/suggestion-list', readme)
8
- .addDecorator(withKnobs)
9
- .add('default', () => ({
10
- components: { GlFilteredSearchSuggestionList, GlFilteredSearchSuggestion },
11
- data() {
12
- return {
13
- iteration: 1,
14
- items: Array.from({ length: 5 }).map((_, idx) => `item-${idx}-iteration-1`),
15
- };
5
+ export const Default = () => ({
6
+ components: { GlFilteredSearchSuggestionList, GlFilteredSearchSuggestion },
7
+ data() {
8
+ return {
9
+ iteration: 1,
10
+ items: Array.from({ length: 5 }).map((_, idx) => `item-${idx}-iteration-1`),
11
+ };
12
+ },
13
+ provide,
14
+ methods: {
15
+ change() {
16
+ this.iteration += 1;
17
+ this.items = Array.from({ length: 3 + Math.floor(Math.random() * 5) }).map(
18
+ (_, idx) => `item-${idx}-iteration-${this.iteration}`
19
+ );
16
20
  },
17
- provide,
18
- methods: {
19
- change() {
20
- this.iteration += 1;
21
- this.items = Array.from({ length: 3 + Math.floor(Math.random() * 5) }).map(
22
- (_, idx) => `item-${idx}-iteration-${this.iteration}`
23
- );
24
- },
25
- },
26
- mounted() {
27
- this.$refs.suggestions.nextItem();
28
- },
29
- template: `
21
+ },
22
+ mounted() {
23
+ this.$refs.suggestions.nextItem();
24
+ },
25
+ template: `
30
26
  <div>
31
27
  <button @click="$refs.suggestions.prevItem()">prev</button>
32
28
  <button @click="$refs.suggestions.nextItem()">next</button>
@@ -38,4 +34,16 @@ documentedStoriesOf('base/filtered-search/suggestion-list', readme)
38
34
  </gl-filtered-search-suggestion-list>
39
35
  </div>
40
36
  `,
41
- }));
37
+ });
38
+
39
+ export default {
40
+ title: 'base/filtered-search/suggestion-list',
41
+ component: GlFilteredSearchSuggestionList,
42
+ parameters: {
43
+ docs: {
44
+ description: {
45
+ component: readme,
46
+ },
47
+ },
48
+ },
49
+ };
@@ -1,5 +1,6 @@
1
1
  <script>
2
2
  export default {
3
+ name: 'GlFilteredSearchSuggestionList',
3
4
  inject: ['suggestionsListClass'],
4
5
  provide() {
5
6
  return {
@@ -7,6 +8,9 @@ export default {
7
8
  };
8
9
  },
9
10
  props: {
11
+ /**
12
+ * Value to be initially selected in list.
13
+ */
10
14
  initialValue: {
11
15
  required: false,
12
16
  validator: () => true,
@@ -84,6 +88,7 @@ export default {
84
88
  </script>
85
89
  <template>
86
90
  <ul :class="listClasses">
91
+ <!-- @slot The suggestions (implemented with GlFilteredSearchSuggestion). -->
87
92
  <slot></slot>
88
93
  </ul>
89
94
  </template>
@@ -2,45 +2,4 @@ import * as description from './filtered_search_term.md';
2
2
 
3
3
  export default {
4
4
  description,
5
- bootstrapComponent: null,
6
- propsInfo: {
7
- availableTokens: {
8
- additionalInfo: 'Tokens available for this filtered search instance',
9
- },
10
- active: {
11
- additionalInfo: 'If this term token is currently active',
12
- },
13
- value: {
14
- additionalInfo: 'Current term value',
15
- },
16
- searchInputAttributes: {
17
- additionalInfo: 'HTML attributes to add to the search input',
18
- },
19
- isLastToken: {
20
- additionalInfo: 'If this is the last token',
21
- },
22
- },
23
- events: [
24
- { event: 'activate', description: 'Emitted when this term token is clicked' },
25
- { event: 'deactivate', description: 'Emitted when this term token loses its focus' },
26
- {
27
- event: 'destroy',
28
- description: 'Emitted when token value is empty and backspace is pressed',
29
- },
30
- {
31
- event: 'replace',
32
- args: [{ arg: 'token', description: '(Object) Replacement token configuration' }],
33
- description: 'Emitted when autocomplete entry is selected',
34
- },
35
- {
36
- event: 'split',
37
- args: [
38
- {
39
- arg: 'newTokens',
40
- description: '(Array) Token configurations',
41
- },
42
- ],
43
- description: 'Emitted when Space is pressed in-between term text',
44
- },
45
- ],
46
5
  };
@@ -1,5 +1,3 @@
1
- # Filtered Search Term
2
-
3
1
  The filtered search term is a component for managing "free input" in the filtered search component.
4
2
  It is responsible for autocompleting available tokens and "converting" to a relevant
5
3
  component when an autocomplete item is selected.
@@ -1,7 +1,5 @@
1
- import { withKnobs, boolean } from '@storybook/addon-knobs';
2
1
  import PortalVue from 'portal-vue';
3
2
  import Vue from 'vue';
4
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
5
3
  import { provide } from './common_story_options';
6
4
  import readme from './filtered_search_term.md';
7
5
  import GlFilteredSearchTerm from './filtered_search_term.vue';
@@ -13,29 +11,25 @@ const availableTokens = [
13
11
  { title: 'Demo2', type: 'demo2', icon: 'rocket', token: {} },
14
12
  ];
15
13
 
16
- documentedStoriesOf('base/filtered-search/term', readme)
17
- .addDecorator(withKnobs)
18
- .add('default', () => ({
19
- components: {
20
- GlFilteredSearchTerm,
21
- },
22
- provide,
23
- props: {
24
- active: {
25
- type: Boolean,
26
- default: boolean('active', true),
27
- },
28
- },
29
- data() {
30
- return {
31
- value: { data: 'demo' },
32
- availableTokens,
33
- };
34
- },
35
- mounted() {
36
- this.$nextTick(() => document.activeElement.blur());
37
- },
38
- template: `
14
+ const generateProps = ({ active = true } = {}) => ({ active });
15
+
16
+ // eslint-disable-next-line no-unused-vars
17
+ export const Default = (_args, { argTypes }) => ({
18
+ props: ['active'],
19
+ components: {
20
+ GlFilteredSearchTerm,
21
+ },
22
+ provide,
23
+ data() {
24
+ return {
25
+ value: { data: 'demo' },
26
+ availableTokens,
27
+ };
28
+ },
29
+ mounted() {
30
+ this.$nextTick(() => document.activeElement.blur());
31
+ },
32
+ template: `
39
33
  <div>
40
34
  <div> {{ value.data }} </div>
41
35
  <div class="gl-border-1 gl-border-solid gl-border-gray-200">
@@ -51,4 +45,17 @@ documentedStoriesOf('base/filtered-search/term', readme)
51
45
  </div>
52
46
  </div>
53
47
  `,
54
- }));
48
+ });
49
+ Default.args = generateProps();
50
+
51
+ export default {
52
+ title: 'base/filtered-search/term',
53
+ component: GlFilteredSearchTerm,
54
+ parameters: {
55
+ docs: {
56
+ description: {
57
+ component: readme,
58
+ },
59
+ },
60
+ },
61
+ };
@@ -4,21 +4,31 @@ import GlFilteredSearchTokenSegment from './filtered_search_token_segment.vue';
4
4
  import { INTENT_ACTIVATE_PREVIOUS } from './filtered_search_utils';
5
5
 
6
6
  export default {
7
+ name: 'GlFilteredSearchTerm',
7
8
  components: {
8
9
  GlFilteredSearchTokenSegment,
9
10
  GlFilteredSearchSuggestion,
10
11
  },
11
12
  inheritAttrs: false,
12
13
  props: {
14
+ /**
15
+ * Tokens available for this filtered search instance.
16
+ */
13
17
  availableTokens: {
14
18
  type: Array,
15
19
  required: true,
16
20
  },
21
+ /**
22
+ * Determines if the term is being edited or not.
23
+ */
17
24
  active: {
18
25
  type: Boolean,
19
26
  required: false,
20
27
  default: false,
21
28
  },
29
+ /**
30
+ * Current term value.
31
+ */
22
32
  value: {
23
33
  type: Object,
24
34
  required: false,
@@ -29,16 +39,25 @@ export default {
29
39
  required: false,
30
40
  default: '',
31
41
  },
42
+ /**
43
+ * HTML attributes to add to the search input.
44
+ */
32
45
  searchInputAttributes: {
33
46
  type: Object,
34
47
  required: false,
35
48
  default: () => ({}),
36
49
  },
50
+ /**
51
+ * If this is the last token.
52
+ */
37
53
  isLastToken: {
38
54
  type: Boolean,
39
55
  required: false,
40
56
  default: false,
41
57
  },
58
+ /**
59
+ * The current `value` (tokens) of the ancestor GlFilteredSearch component.
60
+ */
42
61
  currentValue: {
43
62
  type: Array,
44
63
  required: false,
@@ -56,12 +75,25 @@ export default {
56
75
  return this.value.data;
57
76
  },
58
77
  set(data) {
78
+ /**
79
+ * Emitted when the token changes its value.
80
+ *
81
+ * @event input
82
+ * @type {object} dataObj Object containing the update value.
83
+ */
59
84
  this.$emit('input', { data });
60
85
  },
61
86
  },
62
87
  },
63
88
  methods: {
64
89
  onBackspace() {
90
+ /**
91
+ * Emitted when token value is empty and backspace is pressed.
92
+ * Includes user intent to activate previous token.
93
+ *
94
+ * @event destroy
95
+ * @type {object} details The user intent
96
+ */
65
97
  this.$emit('destroy', { intent: INTENT_ACTIVATE_PREVIOUS });
66
98
  },
67
99
  },
@@ -70,6 +102,28 @@ export default {
70
102
 
71
103
  <template>
72
104
  <div class="gl-h-auto gl-filtered-search-term">
105
+ <!--
106
+ Emitted when this term token is clicked.
107
+ @event activate
108
+ -->
109
+ <!--
110
+ Emitted when this term token will lose its focus.
111
+ @event deactivate
112
+ -->
113
+ <!--
114
+ Emitted when autocomplete entry is selected.
115
+ @event replace
116
+ @property {object} token Replacement token configuration.
117
+ -->
118
+ <!--
119
+ Emitted when the token is submitted.
120
+ @event submit
121
+ -->
122
+ <!--
123
+ Emitted when Space is pressed in-between term text.
124
+ @event split
125
+ @property {array} newTokens Token configurations
126
+ -->
73
127
  <gl-filtered-search-token-segment
74
128
  v-model="internalValue"
75
129
  class="gl-filtered-search-term-token"
@@ -2,30 +2,4 @@ import * as description from './filtered_search_token.md';
2
2
 
3
3
  export default {
4
4
  description,
5
- bootstrapComponent: null,
6
- propsInfo: {
7
- title: {
8
- additionalInfo: 'Token title',
9
- },
10
- config: {
11
- additionalInfo: 'Token configuration with available operators and options',
12
- },
13
- active: {
14
- additionalInfo: 'If this token is currently active',
15
- },
16
- value: {
17
- additionalInfo: 'Current value',
18
- },
19
- replace: {
20
- args: [{ arg: 'token', description: '(Object) Replacement token configuration' }],
21
- description: 'Emitted when this token is converted to another type',
22
- },
23
- },
24
- slots: [
25
- { name: 'view', description: 'Template for token value in inactive state' },
26
- {
27
- name: 'suggestions',
28
- description: 'Slot for rendering autocomplete suggestions when no options are provided.',
29
- },
30
- ],
31
5
  };
@@ -1,5 +1,3 @@
1
- # Filtered Search Binary Token
2
-
3
1
  Filtered search token is a helper component, intended to
4
2
  simplify the creation of filters tokens which consist of a title, operators
5
3
  and an editable value with autocomplete. This component abstracts token management
@@ -11,7 +9,7 @@ This component is not intended to be used outside of the `GlFilteredSearch` comp
11
9
 
12
10
  Make sure to pass `$listeners` to `gl-filtered-search-token`, or route events properly:
13
11
 
14
- ```js
12
+ ```html
15
13
  <gl-filtered-search-token
16
14
  title="Confidential"
17
15
  :active="active"
@@ -225,8 +225,16 @@ describe('Filtered search token', () => {
225
225
  mountComponent({ value: { operator: '=', data: 'something' } });
226
226
  const closeWrapper = wrapper.find('.gl-token-close');
227
227
  closeWrapper.element.closest = () => closeWrapper.element;
228
- closeWrapper.trigger('mousedown');
229
228
 
229
+ const preventDefaultSpy = jest.fn();
230
+ const stopPropagationSpy = jest.fn();
231
+ closeWrapper.trigger('mousedown', {
232
+ preventDefault: preventDefaultSpy,
233
+ stopPropagation: stopPropagationSpy,
234
+ });
235
+
236
+ expect(preventDefaultSpy).toHaveBeenCalled();
237
+ expect(stopPropagationSpy).toHaveBeenCalled();
230
238
  expect(wrapper.emitted().destroy).toHaveLength(1);
231
239
  });
232
240
 
@@ -247,6 +255,16 @@ describe('Filtered search token', () => {
247
255
  expect(wrapper.emitted().input[0][0].operator).toBe('=');
248
256
  expect(findDataSegment().props().active).toBe(true);
249
257
  });
258
+
259
+ it('does not mutate its value prop', async () => {
260
+ const originalValue = () => ({ operator: '', data: '' });
261
+ const value = observable(originalValue());
262
+ mountComponent({ active: true, value });
263
+
264
+ await wrapper.find('input').trigger('keydown', { key: 'q' });
265
+
266
+ expect(value).toEqual(originalValue());
267
+ });
250
268
  });
251
269
 
252
270
  describe('when multi select', () => {
@@ -270,5 +288,17 @@ describe('Filtered search token', () => {
270
288
 
271
289
  expect(wrapper.emitted('input')).toEqual([[{ data: '', operator: '=' }]]);
272
290
  });
291
+
292
+ it('passes down the value prop to the data segment if it changes', async () => {
293
+ createComponent({
294
+ value: { operator: '=', data: 'alpha' },
295
+ });
296
+
297
+ await wrapper.setProps({
298
+ value: { operator: '=', data: 'gamma' },
299
+ });
300
+
301
+ expect(findDataSegment().props('value')).toEqual('gamma');
302
+ });
273
303
  });
274
304
  });