@gitlab/ui 32.43.2 → 32.45.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 +29 -0
- package/README.md +6 -1
- package/config.js +15 -3
- 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/form/form_textarea/form_textarea.documentation.js +1 -20
- package/dist/components/base/form/form_textarea/form_textarea.js +8 -0
- package/dist/components/base/label/label.documentation.js +2 -9
- package/dist/components/base/label/label.js +23 -1
- 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/dist/components/base/skeleton_loader/skeleton_loader.documentation.js +2 -28
- package/dist/components/base/skeleton_loader/skeleton_loader.js +30 -0
- package/dist/components/charts/chart/chart.js +17 -4
- package/dist/components/charts/heatmap/heatmap.js +1 -9
- package/dist/components/charts/sparkline/sparkline.js +1 -1
- package/dist/config.js +15 -3
- package/dist/utility_classes.css +1 -1
- package/dist/utility_classes.css.map +1 -1
- package/documentation/documented_stories.js +8 -0
- package/package.json +13 -12
- 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/form/form_textarea/form_textarea.documentation.js +0 -25
- package/src/components/base/form/form_textarea/form_textarea.stories.js +31 -30
- package/src/components/base/form/form_textarea/form_textarea.vue +8 -0
- 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/label/label.documentation.js +2 -12
- package/src/components/base/label/label.md +2 -7
- package/src/components/base/label/label.stories.js +66 -92
- package/src/components/base/label/label.vue +22 -2
- 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/skeleton_loader/skeleton_loader.documentation.js +0 -27
- package/src/components/base/skeleton_loader/skeleton_loader.md +0 -2
- package/src/components/base/skeleton_loader/skeleton_loader.stories.js +23 -9
- package/src/components/base/skeleton_loader/skeleton_loader.vue +24 -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/chart/chart.spec.js +33 -4
- package/src/components/charts/chart/chart.vue +16 -4
- package/src/components/charts/gauge/gauge.spec.js +7 -7
- package/src/components/charts/heatmap/heatmap.vue +2 -9
- package/src/components/charts/sparkline/sparkline.spec.js +1 -4
- package/src/components/charts/sparkline/sparkline.vue +7 -1
- 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/src/scss/utilities.scss +8 -0
- package/src/scss/utility-mixins/transform.scss +4 -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/form/form_textarea/examples/form_textarea.basic.example.js +0 -47
- package/dist/components/base/form/form_textarea/examples/form_textarea.invalid.example.js +0 -47
- package/dist/components/base/form/form_textarea/examples/form_textarea.plaintext.example.js +0 -47
- package/dist/components/base/form/form_textarea/examples/form_textarea.readonly.example.js +0 -45
- package/dist/components/base/form/form_textarea/examples/form_textarea.submit.example.js +0 -47
- package/dist/components/base/form/form_textarea/examples/index.js +0 -37
- package/dist/components/base/label/examples/index.js +0 -19
- package/dist/components/base/label/examples/label.basic.example.js +0 -38
- package/dist/components/base/label/examples/label.scoped.example.js +0 -38
- 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/dist/components/base/skeleton_loader/examples/ci_header_skeleton.basic.example.js +0 -38
- package/dist/components/base/skeleton_loader/examples/default_skeleton.basic.example.js +0 -38
- package/dist/components/base/skeleton_loader/examples/default_skeleton_custom_props.basic.example.js +0 -38
- package/dist/components/base/skeleton_loader/examples/index.js +0 -37
- package/dist/components/base/skeleton_loader/examples/issue_card_skeleton.basic.example.js +0 -38
- package/dist/components/base/skeleton_loader/examples/job_log_skeleton.basic.example.js +0 -38
- 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/form/form_textarea/examples/form_textarea.basic.example.vue +0 -11
- package/src/components/base/form/form_textarea/examples/form_textarea.invalid.example.vue +0 -11
- package/src/components/base/form/form_textarea/examples/form_textarea.plaintext.example.vue +0 -13
- package/src/components/base/form/form_textarea/examples/form_textarea.readonly.example.vue +0 -9
- package/src/components/base/form/form_textarea/examples/form_textarea.submit.example.vue +0 -11
- package/src/components/base/form/form_textarea/examples/index.js +0 -43
- package/src/components/base/label/examples/index.js +0 -22
- package/src/components/base/label/examples/label.basic.example.vue +0 -3
- package/src/components/base/label/examples/label.scoped.example.vue +0 -3
- 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
- package/src/components/base/skeleton_loader/examples/ci_header_skeleton.basic.example.vue +0 -10
- package/src/components/base/skeleton_loader/examples/default_skeleton.basic.example.vue +0 -3
- package/src/components/base/skeleton_loader/examples/default_skeleton_custom_props.basic.example.vue +0 -9
- package/src/components/base/skeleton_loader/examples/index.js +0 -44
- package/src/components/base/skeleton_loader/examples/issue_card_skeleton.basic.example.vue +0 -26
- package/src/components/base/skeleton_loader/examples/job_log_skeleton.basic.example.vue +0 -13
|
@@ -13,36 +13,60 @@ export default {
|
|
|
13
13
|
name: 'GlSkeletonLoader',
|
|
14
14
|
functional: true,
|
|
15
15
|
props: {
|
|
16
|
+
/**
|
|
17
|
+
* It will be set in the viewbox attr in the <svg />.
|
|
18
|
+
* Defaults to 400 when skeleton is passed via the slot. Defaults to 235 when default skeleton is used
|
|
19
|
+
*/
|
|
16
20
|
width: {
|
|
17
21
|
type: Number,
|
|
18
22
|
default: null,
|
|
19
23
|
required: false,
|
|
20
24
|
},
|
|
25
|
+
/**
|
|
26
|
+
* It will be set in the viewbox attr in the <svg />. Defaults to 130 when skeleton is passed via the slot.
|
|
27
|
+
* Defaults to the combined height of the lines when default skeleton is used
|
|
28
|
+
*/
|
|
21
29
|
height: {
|
|
22
30
|
type: Number,
|
|
23
31
|
default: null,
|
|
24
32
|
required: false,
|
|
25
33
|
},
|
|
34
|
+
/**
|
|
35
|
+
* Aspect ratio option of <svg/>
|
|
36
|
+
*/
|
|
26
37
|
preserveAspectRatio: {
|
|
27
38
|
type: String,
|
|
28
39
|
default: 'xMidYMid meet',
|
|
29
40
|
required: false,
|
|
30
41
|
},
|
|
42
|
+
/**
|
|
43
|
+
* Required if you're using <base url="/" /> in your <head />. Defaults to an empty string.
|
|
44
|
+
* This prop is common used as: <gl-skeleton-loader :base-url="$route.fullPath" /> which will fill the SVG attribute with the relative path.
|
|
45
|
+
*/
|
|
31
46
|
baseUrl: {
|
|
32
47
|
type: String,
|
|
33
48
|
default: '',
|
|
34
49
|
required: false,
|
|
35
50
|
},
|
|
51
|
+
/**
|
|
52
|
+
* Defaults to unique id
|
|
53
|
+
*/
|
|
36
54
|
uniqueKey: {
|
|
37
55
|
type: String,
|
|
38
56
|
default: () => uid(),
|
|
39
57
|
required: false,
|
|
40
58
|
},
|
|
59
|
+
/**
|
|
60
|
+
* Number of lines to show when using the default skeleton
|
|
61
|
+
*/
|
|
41
62
|
lines: {
|
|
42
63
|
type: Number,
|
|
43
64
|
default: 3,
|
|
44
65
|
required: false,
|
|
45
66
|
},
|
|
67
|
+
/**
|
|
68
|
+
* If the default skeleton lines should all be the same width
|
|
69
|
+
*/
|
|
46
70
|
equalWidthLines: {
|
|
47
71
|
type: Boolean,
|
|
48
72
|
default: false,
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { mount
|
|
1
|
+
import { mount } from '@vue/test-utils';
|
|
2
2
|
import GlDropdown from '../dropdown/dropdown.vue';
|
|
3
3
|
import GlDropdownItem from '../dropdown/dropdown_item.vue';
|
|
4
4
|
import GlIcon from '../icon/icon.vue';
|
|
5
5
|
import GlSorting from './sorting.vue';
|
|
6
6
|
import GlSortingItem from './sorting_item.vue';
|
|
7
7
|
|
|
8
|
-
const localVue = createLocalVue();
|
|
9
|
-
|
|
10
8
|
describe('sorting component', () => {
|
|
11
9
|
let wrapper;
|
|
12
10
|
|
|
@@ -35,7 +33,6 @@ describe('sorting component', () => {
|
|
|
35
33
|
'<gl-sorting-item>Third item</gl-sorting-item>',
|
|
36
34
|
],
|
|
37
35
|
},
|
|
38
|
-
localVue,
|
|
39
36
|
propsData: {
|
|
40
37
|
...defaultProps,
|
|
41
38
|
...propsData,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Vue from 'vue';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
2
3
|
import GlToast from './toast';
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
localVue.use(GlToast);
|
|
5
|
+
Vue.use(GlToast);
|
|
6
6
|
const Component = {
|
|
7
7
|
template: `<div />`,
|
|
8
8
|
};
|
|
@@ -11,9 +11,7 @@ describe('GlToast', () => {
|
|
|
11
11
|
let wrapper;
|
|
12
12
|
|
|
13
13
|
beforeEach(() => {
|
|
14
|
-
wrapper = mount(Component
|
|
15
|
-
localVue,
|
|
16
|
-
});
|
|
14
|
+
wrapper = mount(Component);
|
|
17
15
|
});
|
|
18
16
|
|
|
19
17
|
it('attaches $toast propery', () => {
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { shallowMount
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
2
|
import CloseButton from '../../shared_components/close_button/close_button.vue';
|
|
3
3
|
import Token from './token.vue';
|
|
4
4
|
|
|
5
|
-
const localVue = createLocalVue();
|
|
6
|
-
|
|
7
5
|
const findIcon = (wrapper) => wrapper.findComponent(CloseButton);
|
|
8
6
|
|
|
9
7
|
describe('Token component', () => {
|
|
@@ -13,7 +11,6 @@ describe('Token component', () => {
|
|
|
13
11
|
|
|
14
12
|
const createComponent = (propsData) =>
|
|
15
13
|
shallowMount(Token, {
|
|
16
|
-
localVue,
|
|
17
14
|
propsData,
|
|
18
15
|
});
|
|
19
16
|
|
|
@@ -40,12 +40,12 @@ describe('GlTokenContainer', () => {
|
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
const findTokenByName = (name) => {
|
|
43
|
-
const tokenWrappers = wrapper.
|
|
43
|
+
const tokenWrappers = wrapper.findAll('[role=option]');
|
|
44
44
|
|
|
45
45
|
return tokenWrappers.wrappers.find((tokenWrapper) => tokenWrapper.text() === name);
|
|
46
46
|
};
|
|
47
47
|
|
|
48
|
-
const findTokenContainer = () => wrapper.
|
|
48
|
+
const findTokenContainer = () => wrapper.findComponent({ ref: 'tokenContainer' });
|
|
49
49
|
|
|
50
50
|
const blurActiveElement = () => document.activeElement?.blur?.();
|
|
51
51
|
|
|
@@ -173,7 +173,6 @@ describe('GlTokenContainer', () => {
|
|
|
173
173
|
describe('when escape key is pressed', () => {
|
|
174
174
|
it('fires `cancel-focus` event', async () => {
|
|
175
175
|
await setup(0, keyboard.escape);
|
|
176
|
-
|
|
177
176
|
expect(wrapper.emitted('cancel-focus')).toBeTruthy();
|
|
178
177
|
});
|
|
179
178
|
});
|
|
@@ -2,6 +2,7 @@ import { shallowMount } from '@vue/test-utils';
|
|
|
2
2
|
import * as echarts from 'echarts';
|
|
3
3
|
import Chart from './chart.vue';
|
|
4
4
|
import createTheme from '~/utils/charts/theme';
|
|
5
|
+
import { useMockResizeObserver } from '~helpers/mock_dom_observer';
|
|
5
6
|
|
|
6
7
|
const defaultHeight = 400;
|
|
7
8
|
|
|
@@ -21,11 +22,12 @@ describe('chart component', () => {
|
|
|
21
22
|
const themeName = 'gitlab';
|
|
22
23
|
let wrapper;
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
const { trigger: triggerResize } = useMockResizeObserver();
|
|
26
|
+
|
|
27
|
+
it('initializes chart using $refs.chart', async () => {
|
|
25
28
|
wrapper = shallowMount(...mountArgs);
|
|
26
|
-
|
|
29
|
+
await wrapper.vm.$nextTick();
|
|
27
30
|
|
|
28
|
-
it('initializes chart using $refs.chart', () => {
|
|
29
31
|
expect(echarts.init).toHaveBeenCalledWith(
|
|
30
32
|
wrapper.findComponent({ ref: 'chart' }).element,
|
|
31
33
|
themeName,
|
|
@@ -37,11 +39,34 @@ describe('chart component', () => {
|
|
|
37
39
|
);
|
|
38
40
|
});
|
|
39
41
|
|
|
40
|
-
it('
|
|
42
|
+
it('does not resize the chart when responsive = false', async () => {
|
|
43
|
+
wrapper = shallowMount(...mountArgs);
|
|
44
|
+
await wrapper.vm.$nextTick();
|
|
45
|
+
// initial call when chart gets created
|
|
46
|
+
expect(wrapper.vm.chart.resize).toHaveBeenCalledTimes(1);
|
|
47
|
+
|
|
48
|
+
triggerResize(wrapper.element);
|
|
49
|
+
expect(wrapper.vm.chart.resize).toHaveBeenCalledTimes(1);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('resizes the chart when responsive = true', async () => {
|
|
53
|
+
wrapper = shallowMount(Chart, { propsData: { options: {}, responsive: true } });
|
|
54
|
+
await wrapper.vm.$nextTick();
|
|
55
|
+
expect(wrapper.vm.chart.resize).toHaveBeenCalledTimes(1);
|
|
56
|
+
|
|
57
|
+
triggerResize(wrapper.element);
|
|
58
|
+
|
|
59
|
+
expect(wrapper.vm.chart.resize).toHaveBeenCalledTimes(2);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('emits "created" after initializing chart', async () => {
|
|
63
|
+
wrapper = shallowMount(...mountArgs);
|
|
64
|
+
await wrapper.vm.$nextTick();
|
|
41
65
|
expect(wrapper.emitted('created')).toEqual([[wrapper.vm.chart]]);
|
|
42
66
|
});
|
|
43
67
|
|
|
44
68
|
it('uses GitLab theme', () => {
|
|
69
|
+
wrapper = shallowMount(...mountArgs);
|
|
45
70
|
const [firstRegisterThemeCall] = echarts.registerTheme.mock.calls;
|
|
46
71
|
expect(firstRegisterThemeCall[0]).toBe(themeName);
|
|
47
72
|
expect(JSON.stringify(firstRegisterThemeCall[1])).toEqual(JSON.stringify(createTheme()));
|
|
@@ -87,6 +112,10 @@ describe('chart component', () => {
|
|
|
87
112
|
});
|
|
88
113
|
|
|
89
114
|
describe('methods', () => {
|
|
115
|
+
beforeEach(() => {
|
|
116
|
+
wrapper = shallowMount(...mountArgs);
|
|
117
|
+
});
|
|
118
|
+
|
|
90
119
|
describe('draw method', () => {
|
|
91
120
|
it('sets chart options', () => {
|
|
92
121
|
wrapper.vm.draw();
|
|
@@ -2,8 +2,12 @@
|
|
|
2
2
|
import * as echarts from 'echarts';
|
|
3
3
|
import { defaultHeight, defaultWidth, validRenderers } from '../../../utils/charts/config';
|
|
4
4
|
import createTheme, { themeName } from '../../../utils/charts/theme';
|
|
5
|
+
import { GlResizeObserverDirective } from '../../../directives/resize_observer/resize_observer';
|
|
5
6
|
|
|
6
7
|
export default {
|
|
8
|
+
directives: {
|
|
9
|
+
resizeObserver: GlResizeObserverDirective,
|
|
10
|
+
},
|
|
7
11
|
props: {
|
|
8
12
|
options: {
|
|
9
13
|
type: Object,
|
|
@@ -42,6 +46,11 @@ export default {
|
|
|
42
46
|
return validRenderers.includes(renderer);
|
|
43
47
|
},
|
|
44
48
|
},
|
|
49
|
+
responsive: {
|
|
50
|
+
type: Boolean,
|
|
51
|
+
required: false,
|
|
52
|
+
default: false,
|
|
53
|
+
},
|
|
45
54
|
},
|
|
46
55
|
data() {
|
|
47
56
|
return {
|
|
@@ -80,7 +89,7 @@ export default {
|
|
|
80
89
|
echarts.connect(this.groupId);
|
|
81
90
|
}
|
|
82
91
|
|
|
83
|
-
this.chart.on('click', this.
|
|
92
|
+
this.chart.on('click', this.handleClick);
|
|
84
93
|
/**
|
|
85
94
|
* Emitted after calling `echarts.init`
|
|
86
95
|
*/
|
|
@@ -89,7 +98,7 @@ export default {
|
|
|
89
98
|
this.setChartSize();
|
|
90
99
|
},
|
|
91
100
|
beforeDestroy() {
|
|
92
|
-
this.chart.off('click', this.
|
|
101
|
+
this.chart.off('click', this.handleClick);
|
|
93
102
|
},
|
|
94
103
|
methods: {
|
|
95
104
|
draw() {
|
|
@@ -105,7 +114,7 @@ export default {
|
|
|
105
114
|
height: this.height || defaultHeight,
|
|
106
115
|
});
|
|
107
116
|
},
|
|
108
|
-
|
|
117
|
+
handleClick(params) {
|
|
109
118
|
/**
|
|
110
119
|
* Emitted when clicked on a data item in the chart (e.g., a bar/column).
|
|
111
120
|
*
|
|
@@ -114,10 +123,13 @@ export default {
|
|
|
114
123
|
*/
|
|
115
124
|
this.$emit('chartItemClicked', { chart: this.chart, params });
|
|
116
125
|
},
|
|
126
|
+
handleResize() {
|
|
127
|
+
if (this.responsive) this.chart.resize();
|
|
128
|
+
},
|
|
117
129
|
},
|
|
118
130
|
};
|
|
119
131
|
</script>
|
|
120
132
|
|
|
121
133
|
<template>
|
|
122
|
-
<div ref="chart"></div>
|
|
134
|
+
<div ref="chart" v-resize-observer="handleResize"></div>
|
|
123
135
|
</template>
|
|
@@ -108,7 +108,7 @@ describe('gauge component', () => {
|
|
|
108
108
|
createComponent({ value: 'not a number' });
|
|
109
109
|
|
|
110
110
|
return wrapper.vm.$nextTick().then(() => {
|
|
111
|
-
|
|
111
|
+
expect(wrapper).toHaveLoggedVueErrors();
|
|
112
112
|
expect(findDetailText()).toBe(placeholder);
|
|
113
113
|
});
|
|
114
114
|
});
|
|
@@ -196,7 +196,7 @@ describe('gauge component', () => {
|
|
|
196
196
|
it('if some of them are invalid values they are skipped', () => {
|
|
197
197
|
createComponent({ thresholds: [undefined, 95, 'a string', NaN, 50, 15, 25] });
|
|
198
198
|
|
|
199
|
-
|
|
199
|
+
expect(wrapper).toHaveLoggedVueErrors();
|
|
200
200
|
|
|
201
201
|
expect(findAxisColor().length).toBe(3);
|
|
202
202
|
});
|
|
@@ -215,7 +215,7 @@ describe('gauge component', () => {
|
|
|
215
215
|
it('when some values are invalid', () => {
|
|
216
216
|
createComponent({ thresholds: [NaN, 95, undefined, 'a string', 50, 15, 25] });
|
|
217
217
|
|
|
218
|
-
|
|
218
|
+
expect(wrapper).toHaveLoggedVueErrors();
|
|
219
219
|
|
|
220
220
|
expect(findAxisColor().length).toBe(3);
|
|
221
221
|
expect(findAxisColor()[0]).toEqual([0.5, gaugeSafeHues[0]]);
|
|
@@ -235,12 +235,12 @@ describe('gauge component', () => {
|
|
|
235
235
|
});
|
|
236
236
|
|
|
237
237
|
describe('when thresholds that are not numbers are set, they will not show on the arc', () => {
|
|
238
|
-
beforeEach(() => {
|
|
238
|
+
beforeEach(async () => {
|
|
239
239
|
createComponent({ thresholds: ['not a number', NaN, undefined] });
|
|
240
240
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
await wrapper.vm.$nextTick();
|
|
242
|
+
// eslint-disable-next-line jest/no-standalone-expect
|
|
243
|
+
expect(wrapper).toHaveLoggedVueErrors();
|
|
244
244
|
});
|
|
245
245
|
|
|
246
246
|
it('axis has a single color set', () => {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import merge from 'lodash/merge';
|
|
3
3
|
import { white, gray100 } from '../../../../scss_to_js/scss_variables';
|
|
4
|
-
import { GlResizeObserverDirective } from '../../../directives/resize_observer/resize_observer';
|
|
5
4
|
import { getDefaultTooltipContent } from '../../../utils/charts/config';
|
|
6
5
|
import { TOOLTIP_LEFT_OFFSET } from '../../../utils/charts/constants';
|
|
7
6
|
import { heatmapHues } from '../../../utils/charts/theme';
|
|
@@ -49,9 +48,6 @@ export default {
|
|
|
49
48
|
ChartTooltip,
|
|
50
49
|
TooltipDefaultFormat,
|
|
51
50
|
},
|
|
52
|
-
directives: {
|
|
53
|
-
resizeObserver: GlResizeObserverDirective,
|
|
54
|
-
},
|
|
55
51
|
mixins: [ToolboxMixin],
|
|
56
52
|
props: {
|
|
57
53
|
options: {
|
|
@@ -237,9 +233,6 @@ export default {
|
|
|
237
233
|
this.chart = chart;
|
|
238
234
|
this.$emit('created', chart);
|
|
239
235
|
},
|
|
240
|
-
handleResize() {
|
|
241
|
-
return this.responsive && this.chart.resize();
|
|
242
|
-
},
|
|
243
236
|
showHideTooltip(mouseEvent) {
|
|
244
237
|
this.tooltip.show = this.chart.containPixel('grid', [mouseEvent.zrX, mouseEvent.zrY]);
|
|
245
238
|
},
|
|
@@ -262,8 +255,8 @@ export default {
|
|
|
262
255
|
</script>
|
|
263
256
|
|
|
264
257
|
<template>
|
|
265
|
-
<div
|
|
266
|
-
<chart :options="computedOptions" @created="onCreated" />
|
|
258
|
+
<div class="gl-heatmap">
|
|
259
|
+
<chart v-bind="$attrs" :options="computedOptions" @created="onCreated" v-on="$listeners" />
|
|
267
260
|
<chart-tooltip
|
|
268
261
|
v-if="chart"
|
|
269
262
|
:show="tooltip.show"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { shallowMount
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
2
|
import Chart from '../chart/chart.vue';
|
|
3
3
|
import SparklineChart from './sparkline.vue';
|
|
4
4
|
import { waitForAnimationFrame } from '~/utils/test_utils';
|
|
@@ -19,14 +19,11 @@ jest.mock('~/directives/resize_observer/resize_observer', () => ({
|
|
|
19
19
|
},
|
|
20
20
|
}));
|
|
21
21
|
|
|
22
|
-
const localVue = createLocalVue();
|
|
23
|
-
|
|
24
22
|
describe('sparkline chart component', () => {
|
|
25
23
|
let wrapper;
|
|
26
24
|
let componentOptions;
|
|
27
25
|
const factory = () => {
|
|
28
26
|
componentOptions = {
|
|
29
|
-
localVue,
|
|
30
27
|
propsData: {
|
|
31
28
|
data: [[]],
|
|
32
29
|
variant: null,
|
|
@@ -181,7 +181,13 @@ export default {
|
|
|
181
181
|
>
|
|
182
182
|
<slot name="default"></slot>
|
|
183
183
|
<div class="gl-flex-grow-1 gl-relative">
|
|
184
|
-
<chart
|
|
184
|
+
<chart
|
|
185
|
+
v-bind="$attrs"
|
|
186
|
+
:height="height"
|
|
187
|
+
:options="options"
|
|
188
|
+
@created="onChartCreated"
|
|
189
|
+
v-on="$listeners"
|
|
190
|
+
/>
|
|
185
191
|
<chart-tooltip
|
|
186
192
|
v-if="chartInstance"
|
|
187
193
|
:show="tooltip.show"
|
|
@@ -115,12 +115,9 @@ describe('Friendly wrap component', () => {
|
|
|
115
115
|
});
|
|
116
116
|
|
|
117
117
|
// Assert prop validation failed
|
|
118
|
-
expect(
|
|
118
|
+
expect(wrapper).toHaveLoggedVueErrors();
|
|
119
119
|
|
|
120
120
|
// But it still rendered
|
|
121
121
|
expect(wrapper.text()).toBe('');
|
|
122
|
-
|
|
123
|
-
// Prevent test failure due to console.error calls
|
|
124
|
-
global.console.error.mockReset();
|
|
125
122
|
});
|
|
126
123
|
});
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import { shallowMount
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
2
|
import Intersperse from './intersperse.vue';
|
|
3
3
|
|
|
4
|
-
const localVue = createLocalVue();
|
|
5
|
-
|
|
6
4
|
describe('Intersperse Component', () => {
|
|
7
5
|
let wrapper;
|
|
8
6
|
|
|
9
7
|
const createComponent = (defaultSlot = [], options = {}) => {
|
|
10
8
|
wrapper = shallowMount(Intersperse, {
|
|
11
|
-
localVue,
|
|
12
9
|
slots: {
|
|
13
10
|
default: defaultSlot,
|
|
14
11
|
},
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { shallowMount
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
2
|
import { HoverLoadDirective as hoverLoad } from './hover_load';
|
|
3
3
|
|
|
4
4
|
describe('hover load directive', () => {
|
|
5
5
|
let wrapper;
|
|
6
|
-
const localVue = createLocalVue();
|
|
7
6
|
const findTarget = () => wrapper.find('.target');
|
|
8
7
|
|
|
9
8
|
const createComponent = (handleLoad) => {
|
|
@@ -19,7 +18,7 @@ describe('hover load directive', () => {
|
|
|
19
18
|
template: `<div v-hover-load="handleLoad" class="target"></div>`,
|
|
20
19
|
};
|
|
21
20
|
|
|
22
|
-
wrapper = shallowMount(component
|
|
21
|
+
wrapper = shallowMount(component);
|
|
23
22
|
};
|
|
24
23
|
|
|
25
24
|
afterEach(() => {
|
|
@@ -48,16 +47,6 @@ describe('hover load directive', () => {
|
|
|
48
47
|
}
|
|
49
48
|
);
|
|
50
49
|
|
|
51
|
-
it.each([3, '', undefined, null, false, {}, []])(
|
|
52
|
-
'throws if the handler is %p instead of a function',
|
|
53
|
-
(directiveValue) => {
|
|
54
|
-
// we are going to throw, so we need to suppress error messages in jest output
|
|
55
|
-
jest.spyOn(global.console, 'error').mockImplementation(() => {});
|
|
56
|
-
|
|
57
|
-
expect(() => createComponent(directiveValue)).toThrow(TypeError);
|
|
58
|
-
}
|
|
59
|
-
);
|
|
60
|
-
|
|
61
50
|
it('cleans up the mouseover event when component is destroyed', () => {
|
|
62
51
|
createComponent(jest.fn());
|
|
63
52
|
|
|
@@ -121,9 +121,6 @@ describe('outside directive', () => {
|
|
|
121
121
|
|
|
122
122
|
expect(global.console).toHaveLoggedVueErrors();
|
|
123
123
|
expect(document.addEventListener).not.toHaveBeenCalled();
|
|
124
|
-
|
|
125
|
-
// Prevent test failure due to console.error calls
|
|
126
|
-
global.console.error.mockReset();
|
|
127
124
|
});
|
|
128
125
|
|
|
129
126
|
it('attaches the global listener on first initialisation', async () => {
|
|
@@ -212,9 +209,6 @@ describe('outside directive', () => {
|
|
|
212
209
|
find('outside').trigger('click');
|
|
213
210
|
|
|
214
211
|
expect(onClick.mock.calls).toEqual([]);
|
|
215
|
-
|
|
216
|
-
// Prevent test failure due to console.error calls
|
|
217
|
-
global.console.error.mockReset();
|
|
218
212
|
}
|
|
219
213
|
);
|
|
220
214
|
});
|
|
@@ -313,6 +307,7 @@ describe('outside directive', () => {
|
|
|
313
307
|
throw new Error('mock error');
|
|
314
308
|
});
|
|
315
309
|
|
|
310
|
+
jest.spyOn(global.console, 'error');
|
|
316
311
|
await createComponent({
|
|
317
312
|
methods: {
|
|
318
313
|
onClickThrow,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { shallowMount
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
2
|
import { GlResizeObserverDirective } from './resize_observer';
|
|
3
3
|
import { useMockResizeObserver } from '~helpers/mock_dom_observer';
|
|
4
4
|
|
|
@@ -6,8 +6,6 @@ describe('resize observer directive', () => {
|
|
|
6
6
|
const { trigger, observersCount, observesElement } = useMockResizeObserver();
|
|
7
7
|
|
|
8
8
|
const mockHandleResize = jest.fn();
|
|
9
|
-
|
|
10
|
-
const localVue = createLocalVue();
|
|
11
9
|
let wrapper;
|
|
12
10
|
|
|
13
11
|
const createComponent = ({ template, data = {} } = {}) => {
|
|
@@ -26,7 +24,7 @@ describe('resize observer directive', () => {
|
|
|
26
24
|
},
|
|
27
25
|
};
|
|
28
26
|
|
|
29
|
-
wrapper = shallowMount(component
|
|
27
|
+
wrapper = shallowMount(component);
|
|
30
28
|
};
|
|
31
29
|
|
|
32
30
|
it('shares one observer between multiple directive instances', () => {
|
|
@@ -102,11 +100,6 @@ describe('resize observer directive', () => {
|
|
|
102
100
|
});
|
|
103
101
|
|
|
104
102
|
describe('check directive value', () => {
|
|
105
|
-
afterEach(() => {
|
|
106
|
-
// we are going to throw, so we need to suppress Vue error messages in jest output
|
|
107
|
-
global.console.error.mockReset();
|
|
108
|
-
});
|
|
109
|
-
|
|
110
103
|
it.each([3, '', undefined, null, false, {}, []])(
|
|
111
104
|
'throws if the handler is %p instead of a function',
|
|
112
105
|
(directiveValue) => {
|
|
@@ -123,8 +116,9 @@ describe('resize observer directive', () => {
|
|
|
123
116
|
};
|
|
124
117
|
|
|
125
118
|
expect(() => {
|
|
126
|
-
wrapper = shallowMount(testComponentWithoutHandler
|
|
119
|
+
wrapper = shallowMount(testComponentWithoutHandler);
|
|
127
120
|
}).toThrow(TypeError);
|
|
121
|
+
expect(wrapper).toHaveLoggedVueErrors();
|
|
128
122
|
}
|
|
129
123
|
);
|
|
130
124
|
});
|
package/src/scss/storybook.scss
CHANGED
|
@@ -12,3 +12,11 @@
|
|
|
12
12
|
@import 'utilities';
|
|
13
13
|
|
|
14
14
|
@import 'components';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Custom padding for docs pages. This improves the integration in Pajamas pages.
|
|
18
|
+
*/
|
|
19
|
+
.sbdocs-wrapper {
|
|
20
|
+
padding-top: $gl-spacing-scale-2 !important;
|
|
21
|
+
padding-bottom: 0 !important;
|
|
22
|
+
}
|
package/src/scss/utilities.scss
CHANGED
|
@@ -6113,6 +6113,14 @@
|
|
|
6113
6113
|
transform: translateX(100%) !important
|
|
6114
6114
|
}
|
|
6115
6115
|
|
|
6116
|
+
.gl-translate-x-n50 {
|
|
6117
|
+
transform: translateX(-50%)
|
|
6118
|
+
}
|
|
6119
|
+
|
|
6120
|
+
.gl-translate-x-n50\! {
|
|
6121
|
+
transform: translateX(-50%) !important
|
|
6122
|
+
}
|
|
6123
|
+
|
|
6116
6124
|
.gl-translate-y-0 {
|
|
6117
6125
|
transform: translateY(0)
|
|
6118
6126
|
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
|
|
2
|
-
|
|
3
|
-
/* script */
|
|
4
|
-
|
|
5
|
-
/* template */
|
|
6
|
-
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-avatar',{attrs:{"entity-name":"Some Project","shape":"rect"}})};
|
|
7
|
-
var __vue_staticRenderFns__ = [];
|
|
8
|
-
|
|
9
|
-
/* style */
|
|
10
|
-
const __vue_inject_styles__ = undefined;
|
|
11
|
-
/* scoped */
|
|
12
|
-
const __vue_scope_id__ = undefined;
|
|
13
|
-
/* module identifier */
|
|
14
|
-
const __vue_module_identifier__ = undefined;
|
|
15
|
-
/* functional template */
|
|
16
|
-
const __vue_is_functional_template__ = false;
|
|
17
|
-
/* style inject */
|
|
18
|
-
|
|
19
|
-
/* style inject SSR */
|
|
20
|
-
|
|
21
|
-
/* style inject shadow dom */
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const __vue_component__ = __vue_normalize__(
|
|
26
|
-
{ render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
|
|
27
|
-
__vue_inject_styles__,
|
|
28
|
-
{},
|
|
29
|
-
__vue_scope_id__,
|
|
30
|
-
__vue_is_functional_template__,
|
|
31
|
-
__vue_module_identifier__,
|
|
32
|
-
false,
|
|
33
|
-
undefined,
|
|
34
|
-
undefined,
|
|
35
|
-
undefined
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
export default __vue_component__;
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
|
|
2
|
-
|
|
3
|
-
/* script */
|
|
4
|
-
|
|
5
|
-
/* template */
|
|
6
|
-
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-avatar',{attrs:{"src":"https://about.gitlab.com/images/press/gitlab-summit-south-africa.jpg"}})};
|
|
7
|
-
var __vue_staticRenderFns__ = [];
|
|
8
|
-
|
|
9
|
-
/* style */
|
|
10
|
-
const __vue_inject_styles__ = undefined;
|
|
11
|
-
/* scoped */
|
|
12
|
-
const __vue_scope_id__ = undefined;
|
|
13
|
-
/* module identifier */
|
|
14
|
-
const __vue_module_identifier__ = undefined;
|
|
15
|
-
/* functional template */
|
|
16
|
-
const __vue_is_functional_template__ = false;
|
|
17
|
-
/* style inject */
|
|
18
|
-
|
|
19
|
-
/* style inject SSR */
|
|
20
|
-
|
|
21
|
-
/* style inject shadow dom */
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const __vue_component__ = __vue_normalize__(
|
|
26
|
-
{ render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
|
|
27
|
-
__vue_inject_styles__,
|
|
28
|
-
{},
|
|
29
|
-
__vue_scope_id__,
|
|
30
|
-
__vue_is_functional_template__,
|
|
31
|
-
__vue_module_identifier__,
|
|
32
|
-
false,
|
|
33
|
-
undefined,
|
|
34
|
-
undefined,
|
|
35
|
-
undefined
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
export default __vue_component__;
|