@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.
- package/CHANGELOG.md +27 -0
- package/README.md +1 -1
- package/dist/components/base/breadcrumb/breadcrumb.js +10 -5
- package/dist/components/base/{filtered_search/examples/filtered_search.single_unique.example.js → breadcrumb/breadcrumb_item.js} +32 -28
- package/dist/components/base/dropdown/dropdown.documentation.js +1 -5
- package/dist/components/base/dropdown/dropdown_item.documentation.js +2 -3
- package/dist/components/base/filtered_search/filtered_search.documentation.js +2 -66
- package/dist/components/base/filtered_search/filtered_search.js +51 -20
- package/dist/components/base/filtered_search/filtered_search_suggestion.documentation.js +2 -8
- package/dist/components/base/filtered_search/filtered_search_suggestion.js +5 -1
- package/dist/components/base/filtered_search/filtered_search_suggestion_list.documentation.js +2 -7
- package/dist/components/base/filtered_search/filtered_search_suggestion_list.js +4 -0
- package/dist/components/base/filtered_search/filtered_search_term.documentation.js +2 -44
- package/dist/components/base/filtered_search/filtered_search_term.js +37 -0
- package/dist/components/base/filtered_search/filtered_search_token.documentation.js +2 -31
- package/dist/components/base/filtered_search/filtered_search_token.js +80 -23
- package/dist/components/base/filtered_search/filtered_search_token_segment.documentation.js +2 -46
- package/dist/components/base/filtered_search/filtered_search_token_segment.js +48 -0
- package/dist/components/base/filtered_search/filtered_search_utils.js +42 -9
- package/dist/components/base/form/form_checkbox_tree/form_checkbox_tree.documentation.js +2 -27
- package/dist/components/base/form/form_checkbox_tree/form_checkbox_tree.js +16 -1
- package/dist/components/charts/series_label/series_label.js +6 -1
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/utils/use_mock_intersection_observer.js +2 -2
- package/documentation/components_documentation.js +0 -4
- package/documentation/documented_stories.js +10 -1
- package/package.json +11 -9
- package/src/components/base/avatar_link/avatar_link.stories.js +2 -2
- package/src/components/base/breadcrumb/breadcrumb.spec.js +24 -10
- package/src/components/base/breadcrumb/breadcrumb.vue +11 -6
- package/src/components/base/breadcrumb/breadcrumb_item.spec.js +45 -0
- package/src/components/base/breadcrumb/breadcrumb_item.vue +43 -0
- package/src/components/base/dropdown/dropdown.documentation.js +0 -3
- package/src/components/base/dropdown/dropdown.md +7 -2
- package/src/components/base/dropdown/dropdown.stories.js +487 -439
- package/src/components/base/dropdown/dropdown_item.documentation.js +0 -1
- package/src/components/base/dropdown/dropdown_item.md +0 -6
- package/src/components/base/dropdown/dropdown_item.stories.js +107 -35
- package/src/components/base/filtered_search/filtered_search.documentation.js +0 -76
- package/src/components/base/filtered_search/filtered_search.md +3 -4
- package/src/components/base/filtered_search/filtered_search.spec.js +37 -12
- package/src/components/base/filtered_search/filtered_search.stories.js +260 -17
- package/src/components/base/filtered_search/filtered_search.vue +57 -14
- package/src/components/base/filtered_search/filtered_search_suggestion.documentation.js +0 -6
- package/src/components/base/filtered_search/filtered_search_suggestion.md +1 -7
- package/src/components/base/filtered_search/filtered_search_suggestion.stories.js +26 -18
- package/src/components/base/filtered_search/filtered_search_suggestion.vue +6 -0
- package/src/components/base/filtered_search/filtered_search_suggestion_list.documentation.js +0 -5
- package/src/components/base/filtered_search/filtered_search_suggestion_list.md +1 -7
- package/src/components/base/filtered_search/filtered_search_suggestion_list.stories.js +33 -25
- package/src/components/base/filtered_search/filtered_search_suggestion_list.vue +5 -0
- package/src/components/base/filtered_search/filtered_search_term.documentation.js +0 -41
- package/src/components/base/filtered_search/filtered_search_term.md +0 -2
- package/src/components/base/filtered_search/filtered_search_term.stories.js +33 -26
- package/src/components/base/filtered_search/filtered_search_term.vue +54 -0
- package/src/components/base/filtered_search/filtered_search_token.documentation.js +0 -26
- package/src/components/base/filtered_search/filtered_search_token.md +1 -3
- package/src/components/base/filtered_search/filtered_search_token.spec.js +31 -1
- package/src/components/base/filtered_search/filtered_search_token.stories.js +137 -132
- package/src/components/base/filtered_search/filtered_search_token.vue +93 -21
- package/src/components/base/filtered_search/filtered_search_token_segment.documentation.js +0 -43
- package/src/components/base/filtered_search/filtered_search_token_segment.md +0 -2
- package/src/components/base/filtered_search/filtered_search_token_segment.stories.js +86 -79
- package/src/components/base/filtered_search/filtered_search_token_segment.vue +42 -0
- package/src/components/base/filtered_search/filtered_search_utils.js +38 -5
- package/src/components/base/form/form.stories.js +2 -0
- package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.documentation.js +0 -26
- package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.md +0 -4
- package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.stories.js +123 -92
- package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.vue +13 -1
- package/src/components/base/form/form_radio/form_radio.spec.js +21 -8
- package/src/components/base/form/form_radio_group/form_radio_group.stories.js +2 -1
- package/src/components/base/markdown/markdown.scss +21 -0
- package/src/components/base/markdown/markdown_typescale_demo.html +17 -6
- package/src/components/base/navbar/navbar.stories.js +2 -1
- package/src/components/base/skeleton_loader/skeleton_loader.stories.js +67 -21
- package/src/components/base/tabs/tabs/tabs.stories.js +2 -2
- package/src/components/charts/series_label/series_label.stories.js +6 -3
- package/src/components/charts/series_label/series_label.vue +3 -0
- package/src/scss/typescale/typescale.md +0 -2
- package/src/scss/typescale/typescale.stories.js +17 -4
- package/src/utils/use_mock_intersection_observer.js +3 -3
- package/dist/components/base/dropdown/dropdown_divider.documentation.js +0 -8
- package/dist/components/base/dropdown/dropdown_form.documentation.js +0 -17
- package/dist/components/base/dropdown/dropdown_section_header.documentation.js +0 -8
- package/dist/components/base/dropdown/dropdown_text.documentation.js +0 -8
- package/dist/components/base/dropdown/examples/dropdown.default.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.links.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_avatar_and_secondary_text.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_checked_items.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_clear_all.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_divider.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_form.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_header.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_highlighted_items.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_icons.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_right_align.example.js +0 -38
- package/dist/components/base/dropdown/examples/dropdown.with_search.example.js +0 -67
- package/dist/components/base/dropdown/examples/dropdown.with_section_headers.example.js +0 -38
- package/dist/components/base/dropdown/examples/index.js +0 -85
- package/dist/components/base/filtered_search/examples/filtered_search.default.example.js +0 -422
- package/dist/components/base/filtered_search/examples/filtered_search.friendly.example.js +0 -423
- package/dist/components/base/filtered_search/examples/filtered_search.history.example.js +0 -91
- package/dist/components/base/filtered_search/examples/filtered_search.multi_select.example.js +0 -196
- package/dist/components/base/filtered_search/examples/index.js +0 -32
- package/dist/components/base/form/form_checkbox_tree/examples/form_checkbox_tree.basic.example.js +0 -103
- package/dist/components/base/form/form_checkbox_tree/examples/index.js +0 -13
- package/src/components/base/dropdown/dropdown_divider.documentation.js +0 -6
- package/src/components/base/dropdown/dropdown_divider.md +0 -7
- package/src/components/base/dropdown/dropdown_divider.stories.js +0 -16
- package/src/components/base/dropdown/dropdown_form.documentation.js +0 -9
- package/src/components/base/dropdown/dropdown_form.md +0 -4
- package/src/components/base/dropdown/dropdown_form.stories.js +0 -17
- package/src/components/base/dropdown/dropdown_section_header.documentation.js +0 -6
- package/src/components/base/dropdown/dropdown_section_header.stories.js +0 -17
- package/src/components/base/dropdown/dropdown_text.documentation.js +0 -6
- package/src/components/base/dropdown/dropdown_text.stories.js +0 -16
- package/src/components/base/dropdown/examples/dropdown.default.example.vue +0 -7
- package/src/components/base/dropdown/examples/dropdown.links.example.vue +0 -7
- package/src/components/base/dropdown/examples/dropdown.with_avatar_and_secondary_text.example.vue +0 -7
- package/src/components/base/dropdown/examples/dropdown.with_checked_items.example.vue +0 -6
- package/src/components/base/dropdown/examples/dropdown.with_clear_all.example.vue +0 -7
- package/src/components/base/dropdown/examples/dropdown.with_divider.example.vue +0 -9
- package/src/components/base/dropdown/examples/dropdown.with_form.example.vue +0 -10
- package/src/components/base/dropdown/examples/dropdown.with_header.example.vue +0 -7
- package/src/components/base/dropdown/examples/dropdown.with_highlighted_items.example.vue +0 -9
- package/src/components/base/dropdown/examples/dropdown.with_icons.example.vue +0 -43
- package/src/components/base/dropdown/examples/dropdown.with_right_align.example.vue +0 -7
- package/src/components/base/dropdown/examples/dropdown.with_search.example.vue +0 -38
- package/src/components/base/dropdown/examples/dropdown.with_section_headers.example.vue +0 -10
- package/src/components/base/dropdown/examples/index.js +0 -99
- package/src/components/base/filtered_search/examples/filtered_search.default.example.vue +0 -298
- package/src/components/base/filtered_search/examples/filtered_search.friendly.example.vue +0 -300
- package/src/components/base/filtered_search/examples/filtered_search.history.example.vue +0 -50
- package/src/components/base/filtered_search/examples/filtered_search.multi_select.example.vue +0 -132
- package/src/components/base/filtered_search/examples/filtered_search.single_unique.example.vue +0 -31
- package/src/components/base/filtered_search/examples/index.js +0 -38
- package/src/components/base/form/form_checkbox_tree/examples/form_checkbox_tree.basic.example.vue +0 -77
- 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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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,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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
},
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
```
|
|
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
|
});
|