@gitlab/ui 32.43.3 → 32.44.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.
- package/CHANGELOG.md +7 -0
- package/dist/components/base/avatar/avatar.documentation.js +2 -5
- package/dist/components/base/avatar_link/avatar_link.documentation.js +2 -5
- package/dist/components/base/form/form_input/form_input.documentation.js +2 -27
- package/dist/components/base/form/form_input/form_input.js +23 -6
- package/dist/components/base/form/form_text/form_text.documentation.js +1 -4
- package/dist/components/base/pagination/pagination.documentation.js +2 -85
- package/dist/components/base/pagination/pagination.js +76 -0
- package/dist/components/base/segmented_control/segmented_control.documentation.js +2 -14
- package/dist/components/base/segmented_control/segmented_control.js +6 -0
- package/documentation/documented_stories.js +5 -0
- package/package.json +11 -10
- package/src/components/base/alert/alert.spec.js +2 -2
- package/src/components/base/avatar/avatar.documentation.js +0 -2
- package/src/components/base/avatar/avatar.md +0 -2
- package/src/components/base/avatar/avatar.spec.js +1 -2
- package/src/components/base/avatar/avatar.stories.js +88 -101
- package/src/components/base/avatar_link/avatar_link.documentation.js +0 -2
- package/src/components/base/avatar_link/avatar_link.md +4 -7
- package/src/components/base/avatar_link/avatar_link.stories.js +66 -54
- package/src/components/base/filtered_search/filtered_search.spec.js +35 -35
- package/src/components/base/filtered_search/filtered_search_term.spec.js +1 -1
- package/src/components/base/form/form_input/form_input.documentation.js +0 -31
- package/src/components/base/form/form_input/form_input.md +0 -2
- package/src/components/base/form/form_input/form_input.stories.js +50 -42
- package/src/components/base/form/form_input/form_input.vue +23 -6
- package/src/components/base/form/form_input_group/form_input_group.spec.js +1 -3
- package/src/components/base/form/form_text/form_text.documentation.js +0 -2
- package/src/components/base/form/form_text/form_text.md +1 -3
- package/src/components/base/form/form_text/form_text.stories.js +20 -8
- package/src/components/base/icon/icon.spec.js +1 -4
- package/src/components/base/infinite_scroll/infinite_scroll.spec.js +1 -4
- package/src/components/base/modal/modal.spec.js +19 -23
- package/src/components/base/paginated_list/__snapshots__/paginated_list.spec.js.snap +10 -10
- package/src/components/base/pagination/pagination.documentation.js +0 -100
- package/src/components/base/pagination/pagination.md +5 -9
- package/src/components/base/pagination/pagination.spec.js +1 -4
- package/src/components/base/pagination/pagination.stories.js +109 -117
- package/src/components/base/pagination/pagination.vue +85 -0
- package/src/components/base/search_box_by_click/search_box_by_click.spec.js +1 -5
- package/src/components/base/segmented_control/segmented_control.documentation.js +0 -15
- package/src/components/base/segmented_control/segmented_control.md +0 -2
- package/src/components/base/segmented_control/segmented_control.stories.js +46 -36
- package/src/components/base/segmented_control/segmented_control.vue +5 -0
- package/src/components/base/sorting/sorting.spec.js +1 -4
- package/src/components/base/toast/toast.spec.js +4 -6
- package/src/components/base/token/token.spec.js +1 -4
- package/src/components/base/token_selector/token_container.spec.js +2 -3
- package/src/components/charts/gauge/gauge.spec.js +7 -7
- package/src/components/charts/sparkline/sparkline.spec.js +1 -4
- package/src/components/utilities/friendly_wrap/friendly_wrap.spec.js +1 -4
- package/src/components/utilities/intersperse/intersperse.spec.js +1 -4
- package/src/directives/hover_load/hover_load.spec.js +2 -13
- package/src/directives/outside/outside.spec.js +1 -6
- package/src/directives/resize_observer/resize_observer.spec.js +4 -10
- package/src/scss/storybook.scss +8 -0
- package/dist/components/base/avatar/examples/avatar.fallback.example.js +0 -38
- package/dist/components/base/avatar/examples/avatar.image.example.js +0 -38
- package/dist/components/base/avatar/examples/avatar.rect.example.js +0 -38
- package/dist/components/base/avatar/examples/avatar.tooltip.example.js +0 -38
- package/dist/components/base/avatar/examples/index.js +0 -31
- package/dist/components/base/avatar_link/examples/avatar.link.example.js +0 -38
- package/dist/components/base/avatar_link/examples/index.js +0 -13
- package/dist/components/base/form/form_input/examples/form_input/form_input.text.example.js +0 -38
- package/dist/components/base/form/form_input/examples/form_input/form_input.text_disabled.example.js +0 -38
- package/dist/components/base/form/form_input/examples/form_input/form_input.text_reactive.example.js +0 -57
- package/dist/components/base/form/form_input/examples/form_input/index.js +0 -22
- package/dist/components/base/form/form_text/examples/form_text.basic.example.js +0 -38
- package/dist/components/base/form/form_text/examples/index.js +0 -13
- package/dist/components/base/pagination/examples/index.js +0 -37
- package/dist/components/base/pagination/examples/pagination.basic.example.js +0 -45
- package/dist/components/base/pagination/examples/pagination.compact.example.js +0 -58
- package/dist/components/base/pagination/examples/pagination.double_truncation.example.js +0 -45
- package/dist/components/base/pagination/examples/pagination.event.example.js +0 -51
- package/dist/components/base/pagination/examples/pagination.links.example.js +0 -45
- package/dist/components/base/segmented_control/examples/index.js +0 -19
- package/dist/components/base/segmented_control/examples/segmented_control.basic.example.js +0 -65
- package/dist/components/base/segmented_control/examples/segmented_control.whitespace.example.js +0 -55
- package/src/components/base/avatar/examples/avatar.fallback.example.vue +0 -3
- package/src/components/base/avatar/examples/avatar.image.example.vue +0 -3
- package/src/components/base/avatar/examples/avatar.rect.example.vue +0 -6
- package/src/components/base/avatar/examples/avatar.tooltip.example.vue +0 -3
- package/src/components/base/avatar/examples/index.js +0 -36
- package/src/components/base/avatar_link/examples/avatar.link.example.vue +0 -5
- package/src/components/base/avatar_link/examples/index.js +0 -15
- package/src/components/base/form/form_input/examples/form_input/form_input.text.example.vue +0 -3
- package/src/components/base/form/form_input/examples/form_input/form_input.text_disabled.example.vue +0 -3
- package/src/components/base/form/form_input/examples/form_input/form_input.text_reactive.example.vue +0 -24
- package/src/components/base/form/form_input/examples/form_input/index.js +0 -26
- package/src/components/base/form/form_text/examples/form_text.basic.example.vue +0 -5
- package/src/components/base/form/form_text/examples/index.js +0 -15
- package/src/components/base/pagination/examples/index.js +0 -43
- package/src/components/base/pagination/examples/pagination.basic.example.vue +0 -17
- package/src/components/base/pagination/examples/pagination.compact.example.vue +0 -33
- package/src/components/base/pagination/examples/pagination.double_truncation.example.vue +0 -11
- package/src/components/base/pagination/examples/pagination.event.example.vue +0 -26
- package/src/components/base/pagination/examples/pagination.links.example.vue +0 -18
- package/src/components/base/segmented_control/examples/index.js +0 -22
- package/src/components/base/segmented_control/examples/segmented_control.basic.example.vue +0 -19
- package/src/components/base/segmented_control/examples/segmented_control.whitespace.example.vue +0 -18
|
@@ -1,121 +1,75 @@
|
|
|
1
|
-
import { select, text, number, withKnobs } from '@storybook/addon-knobs';
|
|
2
1
|
import Vue from 'vue';
|
|
3
|
-
import { documentedStoriesOf } from '../../../../documentation/documented_stories';
|
|
4
2
|
import { GlTooltipDirective } from '../../../directives/tooltip';
|
|
5
3
|
import { avatarSizeOptions, avatarShapeOptions, tooltipPlacements } from '../../../utils/constants';
|
|
6
4
|
import readme from './avatar.md';
|
|
7
5
|
|
|
8
6
|
Vue.directive('gl-tooltip', GlTooltipDirective);
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
type: Number,
|
|
15
|
-
default: select('size', avatarSizeOptions, defaultSize),
|
|
16
|
-
},
|
|
17
|
-
shape: {
|
|
18
|
-
type: String,
|
|
19
|
-
default: select('shape', avatarShapeOptions, 'circle'),
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
return props;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function generateProjectFallbackProps() {
|
|
27
|
-
const defaultSize = avatarSizeOptions[1];
|
|
28
|
-
const props = {
|
|
29
|
-
entityId: {
|
|
30
|
-
type: Number,
|
|
31
|
-
default: number('entityId', 123),
|
|
32
|
-
},
|
|
33
|
-
entityName: {
|
|
34
|
-
type: String,
|
|
35
|
-
default: text('entityName', 'Some Project'),
|
|
36
|
-
},
|
|
37
|
-
size: {
|
|
38
|
-
type: Number,
|
|
39
|
-
default: select('size', avatarSizeOptions, defaultSize),
|
|
40
|
-
},
|
|
41
|
-
};
|
|
8
|
+
const generateImageProps = ({ size = 64, shape = 'circle' } = {}) => ({
|
|
9
|
+
size,
|
|
10
|
+
shape,
|
|
11
|
+
});
|
|
42
12
|
|
|
43
|
-
|
|
44
|
-
|
|
13
|
+
const generateProjectFallbackProps = ({
|
|
14
|
+
size = 64,
|
|
15
|
+
entityId = 123,
|
|
16
|
+
entityName = 'Some Project',
|
|
17
|
+
} = {}) => ({
|
|
18
|
+
entityId,
|
|
19
|
+
entityName,
|
|
20
|
+
size,
|
|
21
|
+
});
|
|
45
22
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
default: text('entityName', '🦊Tanuki'),
|
|
56
|
-
},
|
|
57
|
-
size: {
|
|
58
|
-
type: Number,
|
|
59
|
-
default: select('size', avatarSizeOptions, defaultSize),
|
|
60
|
-
},
|
|
61
|
-
};
|
|
23
|
+
const generateEmojiProjectProps = ({
|
|
24
|
+
size = 64,
|
|
25
|
+
entityId = 123,
|
|
26
|
+
entityName = '🦊Tanuki',
|
|
27
|
+
} = {}) => ({
|
|
28
|
+
entityId,
|
|
29
|
+
entityName,
|
|
30
|
+
size,
|
|
31
|
+
});
|
|
62
32
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const props = {
|
|
68
|
-
tooltipText: {
|
|
69
|
-
type: String,
|
|
70
|
-
default: text('tooltipText', 'Avatar tooltip'),
|
|
71
|
-
},
|
|
72
|
-
placement: {
|
|
73
|
-
type: String,
|
|
74
|
-
default: select('placement', tooltipPlacements, 'top'),
|
|
75
|
-
},
|
|
76
|
-
};
|
|
33
|
+
const generateTooltipProps = ({ tooltipText = 'Avatar tooltip', placement = 'top' } = {}) => ({
|
|
34
|
+
tooltipText,
|
|
35
|
+
placement,
|
|
36
|
+
});
|
|
77
37
|
|
|
78
|
-
|
|
79
|
-
|
|
38
|
+
const template = `
|
|
39
|
+
<gl-avatar
|
|
40
|
+
:entity-name="entityName"
|
|
41
|
+
:entity-id="entityId"
|
|
42
|
+
:size="size"
|
|
43
|
+
shape="rect" />
|
|
44
|
+
`;
|
|
80
45
|
|
|
81
|
-
|
|
82
|
-
.
|
|
83
|
-
|
|
84
|
-
props: generateImageProps(),
|
|
85
|
-
template: `
|
|
46
|
+
export const Image = (args, { argTypes }) => ({
|
|
47
|
+
props: Object.keys(argTypes),
|
|
48
|
+
template: `
|
|
86
49
|
<gl-avatar
|
|
87
50
|
:size="size"
|
|
88
51
|
:shape="shape"
|
|
89
52
|
src="https://about.gitlab.com/images/press/gitlab-summit-south-africa.jpg"
|
|
90
53
|
/>
|
|
91
54
|
`,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
shape="rect" />
|
|
111
|
-
`,
|
|
112
|
-
}))
|
|
113
|
-
.add('with-tooltip', () => ({
|
|
114
|
-
props: {
|
|
115
|
-
...generateImageProps(),
|
|
116
|
-
...generateTooltipProps(),
|
|
117
|
-
},
|
|
118
|
-
template: `
|
|
55
|
+
});
|
|
56
|
+
Image.args = generateImageProps();
|
|
57
|
+
|
|
58
|
+
export const ProjectFallback = (args, { argTypes }) => ({
|
|
59
|
+
props: Object.keys(argTypes),
|
|
60
|
+
template,
|
|
61
|
+
});
|
|
62
|
+
ProjectFallback.args = generateProjectFallbackProps();
|
|
63
|
+
|
|
64
|
+
export const EmojiProjectName = (args, { argTypes }) => ({
|
|
65
|
+
props: Object.keys(argTypes),
|
|
66
|
+
template,
|
|
67
|
+
});
|
|
68
|
+
EmojiProjectName.args = generateEmojiProjectProps();
|
|
69
|
+
|
|
70
|
+
export const WithTooltip = (args, { argTypes }) => ({
|
|
71
|
+
props: Object.keys(argTypes),
|
|
72
|
+
template: `
|
|
119
73
|
<gl-avatar
|
|
120
74
|
:size="size"
|
|
121
75
|
:shape="shape"
|
|
@@ -124,4 +78,37 @@ documentedStoriesOf('base/avatar', readme)
|
|
|
124
78
|
v-gl-tooltip="{ placement }"
|
|
125
79
|
/>
|
|
126
80
|
`,
|
|
127
|
-
|
|
81
|
+
});
|
|
82
|
+
WithTooltip.args = { ...generateImageProps(), ...generateTooltipProps() };
|
|
83
|
+
|
|
84
|
+
export default {
|
|
85
|
+
title: 'base/avatar',
|
|
86
|
+
parameters: {
|
|
87
|
+
knobs: { disable: true },
|
|
88
|
+
docs: {
|
|
89
|
+
description: {
|
|
90
|
+
component: readme,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
argTypes: {
|
|
95
|
+
size: {
|
|
96
|
+
options: avatarSizeOptions,
|
|
97
|
+
control: {
|
|
98
|
+
type: 'select',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
shape: {
|
|
102
|
+
options: avatarShapeOptions,
|
|
103
|
+
control: {
|
|
104
|
+
type: 'select',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
placement: {
|
|
108
|
+
options: tooltipPlacements,
|
|
109
|
+
control: {
|
|
110
|
+
type: 'select',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
## Avatar link
|
|
2
|
-
|
|
3
1
|
`<gl-avatar-link>` decorates `<gl-avatar>` with hyperlink functionality. It accepts the same
|
|
4
2
|
properties as the `<gl-link>` component and it works in the same way too. The main purpose of this
|
|
5
3
|
component is to apply visual enhancements that makes evident that the user can interact with the
|
|
@@ -10,20 +8,20 @@ avatar.
|
|
|
10
8
|
When wrapping an `<gl-avatar>` component, `<gl-avatar-link>` darkens
|
|
11
9
|
the border that surrounds the avatar image or fallback text when hovering over it.
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
```vue
|
|
14
12
|
<gl-avatar-link target="blank" href="https://gitlab.com/gitlab-org/gitlab">
|
|
15
13
|
<gl-avatar
|
|
16
14
|
:size="32"
|
|
17
15
|
:src="avatarUrl"
|
|
18
16
|
/>
|
|
19
17
|
</gl-avatar-link>
|
|
20
|
-
|
|
18
|
+
```
|
|
21
19
|
|
|
22
20
|
When wrapping an `<avatar-labeled>` component, `<avatar-link>` underlines
|
|
23
21
|
the label and sub-label text when hovering over the avatar. It also applies the
|
|
24
22
|
same effects described in the first example.
|
|
25
23
|
|
|
26
|
-
|
|
24
|
+
```vue
|
|
27
25
|
<gl-avatar-link target="blank" href="https://gitlab.com/gitlab-org/gitlab">
|
|
28
26
|
<gl-avatar-labeled
|
|
29
27
|
:size="32"
|
|
@@ -32,5 +30,4 @@ same effects described in the first example.
|
|
|
32
30
|
sub-label="@gitlab"
|
|
33
31
|
/>
|
|
34
32
|
</gl-avatar-link>
|
|
35
|
-
|
|
36
|
-
~~~
|
|
33
|
+
```
|
|
@@ -1,71 +1,83 @@
|
|
|
1
|
-
import { select, text, withKnobs } from '@storybook/addon-knobs';
|
|
2
|
-
import { documentedStoriesOf } from '../../../../documentation/documented_stories';
|
|
3
1
|
import { avatarSizeOptions, avatarShapeOptions } from '../../../utils/constants';
|
|
4
2
|
import readme from './avatar_link.md';
|
|
5
3
|
|
|
6
|
-
const generateDefaultProps = (
|
|
7
|
-
href
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
size: {
|
|
16
|
-
type: Number,
|
|
17
|
-
default: select('size', avatarSizeOptions, 32),
|
|
18
|
-
},
|
|
4
|
+
const generateDefaultProps = ({
|
|
5
|
+
href = 'https://gitlab.com/gitlab-org/gitlab',
|
|
6
|
+
shape = 'circle',
|
|
7
|
+
size = 32,
|
|
8
|
+
} = {}) => ({
|
|
9
|
+
href,
|
|
10
|
+
shape,
|
|
11
|
+
size,
|
|
19
12
|
});
|
|
20
13
|
|
|
21
|
-
const generateLabelsProps = () => ({
|
|
22
|
-
label
|
|
23
|
-
|
|
24
|
-
default: text('label', 'GitLab User'),
|
|
25
|
-
},
|
|
26
|
-
subLabel: {
|
|
27
|
-
type: String,
|
|
28
|
-
default: text('subLabel', '@gitlab'),
|
|
29
|
-
},
|
|
14
|
+
const generateLabelsProps = ({ label = 'GitLab User', subLabel = '@gitlab' } = {}) => ({
|
|
15
|
+
label,
|
|
16
|
+
subLabel,
|
|
30
17
|
});
|
|
31
18
|
|
|
32
|
-
const generateImageProps = (
|
|
33
|
-
src
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
'src',
|
|
37
|
-
'https://assets.gitlab-static.net/uploads/-/system/project/avatar/278964/logo-extra-whitespace.png?width=64'
|
|
38
|
-
),
|
|
39
|
-
},
|
|
19
|
+
const generateImageProps = ({
|
|
20
|
+
src = 'https://assets.gitlab-static.net/uploads/-/system/project/avatar/278964/logo-extra-whitespace.png?width=64',
|
|
21
|
+
} = {}) => ({
|
|
22
|
+
src,
|
|
40
23
|
});
|
|
41
24
|
|
|
42
|
-
|
|
43
|
-
.
|
|
44
|
-
|
|
45
|
-
props: { ...generateDefaultProps(), ...generateImageProps() },
|
|
46
|
-
template: `
|
|
25
|
+
export const Default = (args, { argTypes }) => ({
|
|
26
|
+
props: Object.keys(argTypes),
|
|
27
|
+
template: `
|
|
47
28
|
<gl-avatar-link target="blank" :href="href">
|
|
48
29
|
<gl-avatar :src="src" :size="size" :shape="shape" />
|
|
49
30
|
</gl-avatar-link>
|
|
50
31
|
`,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
32
|
+
});
|
|
33
|
+
Default.args = { ...generateDefaultProps(), ...generateImageProps() };
|
|
34
|
+
|
|
35
|
+
export const WithLabeledAvatar = (args, { argTypes }) => ({
|
|
36
|
+
props: Object.keys(argTypes),
|
|
37
|
+
template: `
|
|
38
|
+
<gl-avatar-link target="blank" :href="href">
|
|
39
|
+
<gl-avatar-labeled :src="src" :size="size" :shape="shape" :label="label" :sub-label="subLabel" />
|
|
40
|
+
</gl-avatar-link>
|
|
41
|
+
`,
|
|
42
|
+
});
|
|
43
|
+
WithLabeledAvatar.args = {
|
|
44
|
+
...generateDefaultProps({}),
|
|
45
|
+
...generateLabelsProps({}),
|
|
46
|
+
...generateImageProps({}),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const WithNoImageAvatar = (args, { argTypes }) => ({
|
|
50
|
+
props: Object.keys(argTypes),
|
|
51
|
+
template: `
|
|
67
52
|
<gl-avatar-link target="blank" :href="href">
|
|
68
53
|
<gl-avatar-labeled :entity-name="label" :label="label" :sub-label="subLabel" :size="size" :shape="shape" />
|
|
69
54
|
</gl-avatar-link>
|
|
70
55
|
`,
|
|
71
|
-
|
|
56
|
+
});
|
|
57
|
+
WithNoImageAvatar.args = { ...generateDefaultProps({}), ...generateLabelsProps({}) };
|
|
58
|
+
|
|
59
|
+
export default {
|
|
60
|
+
title: 'base/avatar/avatar-link',
|
|
61
|
+
parameters: {
|
|
62
|
+
knobs: { disable: true },
|
|
63
|
+
docs: {
|
|
64
|
+
description: {
|
|
65
|
+
component: readme,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
argTypes: {
|
|
70
|
+
shape: {
|
|
71
|
+
options: avatarShapeOptions,
|
|
72
|
+
control: {
|
|
73
|
+
type: 'select',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
size: {
|
|
77
|
+
options: avatarSizeOptions,
|
|
78
|
+
control: {
|
|
79
|
+
type: 'select',
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Vue from 'vue';
|
|
2
|
+
import { shallowMount, mount } from '@vue/test-utils';
|
|
2
3
|
import GlFilteredSearch from './filtered_search.vue';
|
|
3
4
|
import GlFilteredSearchSuggestion from './filtered_search_suggestion.vue';
|
|
4
5
|
import GlFilteredSearchSuggestionList from './filtered_search_suggestion_list.vue';
|
|
@@ -14,8 +15,7 @@ const FakeToken = {
|
|
|
14
15
|
render: (h) => h('div'),
|
|
15
16
|
};
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
localVue.directive('GlTooltip', () => {});
|
|
18
|
+
Vue.directive('GlTooltip', () => {});
|
|
19
19
|
|
|
20
20
|
let wrapper;
|
|
21
21
|
describe('Filtered search', () => {
|
|
@@ -23,12 +23,11 @@ describe('Filtered search', () => {
|
|
|
23
23
|
availableTokens: [{ type: 'faketoken', token: FakeToken }],
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
const findSearchBox = () => wrapper.
|
|
26
|
+
const findSearchBox = () => wrapper.findComponent({ name: 'GlSearchBoxByClickStub' });
|
|
27
27
|
|
|
28
28
|
const createComponent = (props) => {
|
|
29
29
|
wrapper = shallowMount(GlFilteredSearch, {
|
|
30
30
|
propsData: { ...defaultProps, ...props },
|
|
31
|
-
localVue,
|
|
32
31
|
stubs: {
|
|
33
32
|
GlSearchBoxByClick: {
|
|
34
33
|
name: 'GlSearchBoxByClickStub',
|
|
@@ -116,11 +115,11 @@ describe('Filtered search', () => {
|
|
|
116
115
|
});
|
|
117
116
|
await wrapper.vm.$nextTick();
|
|
118
117
|
|
|
119
|
-
wrapper.
|
|
118
|
+
wrapper.findComponent(FakeToken).vm.$emit('activate');
|
|
120
119
|
|
|
121
120
|
await wrapper.vm.$nextTick();
|
|
122
121
|
|
|
123
|
-
expect(wrapper.
|
|
122
|
+
expect(wrapper.findComponent(FakeToken).props('active')).toBe(true);
|
|
124
123
|
});
|
|
125
124
|
|
|
126
125
|
it('deactivates token when requested', async () => {
|
|
@@ -129,8 +128,8 @@ describe('Filtered search', () => {
|
|
|
129
128
|
});
|
|
130
129
|
await wrapper.vm.$nextTick();
|
|
131
130
|
|
|
132
|
-
wrapper.
|
|
133
|
-
wrapper.
|
|
131
|
+
wrapper.findComponent(FakeToken).vm.$emit('activate');
|
|
132
|
+
wrapper.findComponent(FakeToken).vm.$emit('deactivate');
|
|
134
133
|
|
|
135
134
|
await wrapper.vm.$nextTick();
|
|
136
135
|
|
|
@@ -148,12 +147,12 @@ describe('Filtered search', () => {
|
|
|
148
147
|
});
|
|
149
148
|
await wrapper.vm.$nextTick();
|
|
150
149
|
|
|
151
|
-
wrapper.
|
|
150
|
+
wrapper.findComponent(FakeToken).vm.$emit('activate');
|
|
152
151
|
wrapper.findAllComponents(FakeToken).at(1).vm.$emit('deactivate');
|
|
153
152
|
|
|
154
153
|
await wrapper.vm.$nextTick();
|
|
155
154
|
|
|
156
|
-
expect(wrapper.
|
|
155
|
+
expect(wrapper.findComponent(FakeToken).props('active')).toBe(true);
|
|
157
156
|
});
|
|
158
157
|
|
|
159
158
|
it('removes empty term tokens on deactivate', async () => {
|
|
@@ -187,7 +186,7 @@ describe('Filtered search', () => {
|
|
|
187
186
|
});
|
|
188
187
|
await wrapper.vm.$nextTick();
|
|
189
188
|
|
|
190
|
-
wrapper.
|
|
189
|
+
wrapper.findComponent(FakeToken).vm.$emit('destroy');
|
|
191
190
|
|
|
192
191
|
await wrapper.vm.$nextTick();
|
|
193
192
|
|
|
@@ -203,16 +202,16 @@ describe('Filtered search', () => {
|
|
|
203
202
|
});
|
|
204
203
|
await wrapper.vm.$nextTick();
|
|
205
204
|
|
|
206
|
-
wrapper.
|
|
205
|
+
wrapper.findComponent(FakeToken).vm.$emit('destroy');
|
|
207
206
|
|
|
208
207
|
await wrapper.vm.$nextTick();
|
|
209
208
|
|
|
210
|
-
expect(wrapper.
|
|
209
|
+
expect(wrapper.findComponent(GlFilteredSearchTerm).props('active')).toBe(true);
|
|
211
210
|
});
|
|
212
211
|
|
|
213
212
|
it('does not destroy last token', async () => {
|
|
214
213
|
createComponent();
|
|
215
|
-
wrapper.
|
|
214
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('destroy');
|
|
216
215
|
|
|
217
216
|
await wrapper.vm.$nextTick();
|
|
218
217
|
|
|
@@ -224,7 +223,7 @@ describe('Filtered search', () => {
|
|
|
224
223
|
it('replaces token when requested', async () => {
|
|
225
224
|
createComponent();
|
|
226
225
|
wrapper
|
|
227
|
-
.
|
|
226
|
+
.findComponent(GlFilteredSearchTerm)
|
|
228
227
|
.vm.$emit('replace', { type: 'faketoken', value: { data: 'test' } });
|
|
229
228
|
|
|
230
229
|
await wrapper.vm.$nextTick();
|
|
@@ -245,7 +244,7 @@ describe('Filtered search', () => {
|
|
|
245
244
|
await wrapper.vm.$nextTick();
|
|
246
245
|
|
|
247
246
|
wrapper
|
|
248
|
-
.
|
|
247
|
+
.findComponent(GlFilteredSearchTerm)
|
|
249
248
|
.vm.$emit('replace', { type: 'faketoken', value: { data: 'test' } });
|
|
250
249
|
|
|
251
250
|
await wrapper.vm.$nextTick();
|
|
@@ -258,8 +257,8 @@ describe('Filtered search', () => {
|
|
|
258
257
|
|
|
259
258
|
it('inserts single token when requested', async () => {
|
|
260
259
|
createComponent({ value: ['one'] });
|
|
261
|
-
wrapper.
|
|
262
|
-
wrapper.
|
|
260
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('activate');
|
|
261
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('split');
|
|
263
262
|
|
|
264
263
|
await wrapper.vm.$nextTick();
|
|
265
264
|
|
|
@@ -273,8 +272,8 @@ describe('Filtered search', () => {
|
|
|
273
272
|
createComponent({ value: ['one', 'two'] });
|
|
274
273
|
await wrapper.vm.$nextTick();
|
|
275
274
|
|
|
276
|
-
wrapper.
|
|
277
|
-
wrapper.
|
|
275
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('activate');
|
|
276
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('split');
|
|
278
277
|
|
|
279
278
|
await wrapper.vm.$nextTick();
|
|
280
279
|
|
|
@@ -288,11 +287,11 @@ describe('Filtered search', () => {
|
|
|
288
287
|
|
|
289
288
|
it('inserts multiple tokens when requested', async () => {
|
|
290
289
|
createComponent({ value: ['one'] });
|
|
291
|
-
wrapper.
|
|
290
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('activate');
|
|
292
291
|
|
|
293
292
|
await wrapper.vm.$nextTick();
|
|
294
293
|
|
|
295
|
-
wrapper.
|
|
294
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('split', ['foo', 'bar']);
|
|
296
295
|
|
|
297
296
|
await wrapper.vm.$nextTick();
|
|
298
297
|
|
|
@@ -306,7 +305,7 @@ describe('Filtered search', () => {
|
|
|
306
305
|
|
|
307
306
|
it('submits entire search when submit is requested', () => {
|
|
308
307
|
createComponent();
|
|
309
|
-
wrapper.
|
|
308
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
|
|
310
309
|
expect(wrapper.emitted().submit).toBeDefined();
|
|
311
310
|
});
|
|
312
311
|
});
|
|
@@ -315,7 +314,7 @@ describe('Filtered search', () => {
|
|
|
315
314
|
createComponent({
|
|
316
315
|
value: ['one'],
|
|
317
316
|
});
|
|
318
|
-
wrapper.
|
|
317
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
|
|
319
318
|
expect(wrapper.emitted().submit).toBeDefined();
|
|
320
319
|
expect(wrapper.emitted().submit[0][0]).toStrictEqual(['one']);
|
|
321
320
|
});
|
|
@@ -324,7 +323,7 @@ describe('Filtered search', () => {
|
|
|
324
323
|
createComponent({
|
|
325
324
|
value: ['one', 'two', { type: 'faketoken', value: { data: 'smth' } }, 'four', 'five'],
|
|
326
325
|
});
|
|
327
|
-
wrapper.
|
|
326
|
+
wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
|
|
328
327
|
expect(wrapper.emitted().submit).toBeDefined();
|
|
329
328
|
expect(wrapper.emitted().submit[0][0]).toStrictEqual([
|
|
330
329
|
'one two',
|
|
@@ -339,7 +338,7 @@ describe('Filtered search', () => {
|
|
|
339
338
|
});
|
|
340
339
|
await wrapper.vm.$nextTick();
|
|
341
340
|
|
|
342
|
-
const fakeTokenInstance = wrapper.
|
|
341
|
+
const fakeTokenInstance = wrapper.findComponent(FakeToken);
|
|
343
342
|
expect(fakeTokenInstance.exists()).toBe(true);
|
|
344
343
|
expect(Object.keys(fakeTokenInstance.attributes())).toEqual(
|
|
345
344
|
expect.arrayContaining(['current-value', 'index', 'config', 'value'])
|
|
@@ -383,7 +382,6 @@ describe('Filtered search integration tests', () => {
|
|
|
383
382
|
|
|
384
383
|
const mountComponent = (props) => {
|
|
385
384
|
wrapper = mount(GlFilteredSearch, {
|
|
386
|
-
localVue,
|
|
387
385
|
propsData: {
|
|
388
386
|
availableTokens: testTokens,
|
|
389
387
|
...props,
|
|
@@ -432,7 +430,7 @@ describe('Filtered search integration tests', () => {
|
|
|
432
430
|
});
|
|
433
431
|
|
|
434
432
|
it('displays suggestions list', () => {
|
|
435
|
-
const suggestions = wrapper.
|
|
433
|
+
const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
|
|
436
434
|
expect(suggestions.exists()).toBe(true);
|
|
437
435
|
expect(suggestions.findAllComponents(GlFilteredSearchSuggestion)).toHaveLength(
|
|
438
436
|
testTokens.filter((t) => !t.disabled).length
|
|
@@ -445,7 +443,7 @@ describe('Filtered search integration tests', () => {
|
|
|
445
443
|
|
|
446
444
|
await wrapper.vm.$nextTick();
|
|
447
445
|
|
|
448
|
-
const suggestions = wrapper.
|
|
446
|
+
const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
|
|
449
447
|
expect(suggestions.exists()).toBe(true);
|
|
450
448
|
expect(suggestions.findAllComponents(GlFilteredSearchSuggestion)).toHaveLength(1);
|
|
451
449
|
});
|
|
@@ -456,7 +454,7 @@ describe('Filtered search integration tests', () => {
|
|
|
456
454
|
|
|
457
455
|
await wrapper.vm.$nextTick();
|
|
458
456
|
|
|
459
|
-
const suggestions = wrapper.
|
|
457
|
+
const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
|
|
460
458
|
expect(suggestions.exists()).toBe(true);
|
|
461
459
|
expect(suggestions.findAllComponents(GlFilteredSearchSuggestion)).toHaveLength(3);
|
|
462
460
|
});
|
|
@@ -467,7 +465,7 @@ describe('Filtered search integration tests', () => {
|
|
|
467
465
|
|
|
468
466
|
await wrapper.vm.$nextTick();
|
|
469
467
|
|
|
470
|
-
const suggestions = wrapper.
|
|
468
|
+
const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
|
|
471
469
|
expect(suggestions.exists()).toBe(false);
|
|
472
470
|
});
|
|
473
471
|
|
|
@@ -481,7 +479,7 @@ describe('Filtered search integration tests', () => {
|
|
|
481
479
|
|
|
482
480
|
await wrapper.vm.$nextTick();
|
|
483
481
|
|
|
484
|
-
const token = wrapper.
|
|
482
|
+
const token = wrapper.findComponent(GlFilteredSearchToken);
|
|
485
483
|
expect(token.exists()).toBe(true);
|
|
486
484
|
});
|
|
487
485
|
|
|
@@ -518,7 +516,7 @@ describe('Filtered search integration tests', () => {
|
|
|
518
516
|
|
|
519
517
|
await wrapper.vm.$nextTick();
|
|
520
518
|
|
|
521
|
-
const suggestions = wrapper.
|
|
519
|
+
const suggestions = wrapper.findComponent(GlFilteredSearchSuggestionList);
|
|
522
520
|
expect(suggestions.exists()).toBe(true);
|
|
523
521
|
expect(suggestions.findAllComponents(GlFilteredSearchSuggestion)).toHaveLength(2);
|
|
524
522
|
});
|
|
@@ -549,7 +547,9 @@ describe('Filtered search integration tests', () => {
|
|
|
549
547
|
|
|
550
548
|
await wrapper.vm.$nextTick();
|
|
551
549
|
|
|
552
|
-
expect(document.activeElement).toBe(
|
|
550
|
+
expect(document.activeElement).toBe(
|
|
551
|
+
wrapper.findComponent(GlFilteredSearchTerm).find('input').element
|
|
552
|
+
);
|
|
553
553
|
});
|
|
554
554
|
|
|
555
555
|
it('clicking clear button clears component input', async () => {
|
|
@@ -64,7 +64,7 @@ describe('Filtered search term', () => {
|
|
|
64
64
|
({ originalEvent, emittedEvent }) => {
|
|
65
65
|
createComponent({ active: true, value: { data: 'something' } });
|
|
66
66
|
|
|
67
|
-
wrapper.
|
|
67
|
+
wrapper.findComponent(segmentStub).vm.$emit(originalEvent);
|
|
68
68
|
|
|
69
69
|
return wrapper.vm.$nextTick().then(() => {
|
|
70
70
|
expect(wrapper.emitted()[emittedEvent]).toHaveLength(1);
|