@gitlab/ui 32.64.0 → 32.66.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 +28 -0
- package/dist/components/base/paginated_list/paginated_list.documentation.js +2 -5
- package/dist/components/base/toast/toast.documentation.js +2 -5
- package/dist/components/utilities/intersection_observer/intersection_observer.documentation.js +1 -20
- package/dist/components/utilities/intersection_observer/intersection_observer.js +12 -0
- package/dist/utility_classes.css +1 -1
- package/dist/utility_classes.css.map +1 -1
- package/documentation/documented_stories.js +3 -0
- package/package.json +1 -1
- package/src/components/base/paginated_list/paginated_list.documentation.js +0 -2
- package/src/components/base/paginated_list/paginated_list.md +0 -2
- package/src/components/base/paginated_list/paginated_list.stories.js +162 -154
- package/src/components/base/toast/toast.documentation.js +0 -2
- package/src/components/base/toast/toast.md +0 -11
- package/src/components/base/toast/toast.stories.js +66 -50
- package/src/components/utilities/intersection_observer/intersection_observer.documentation.js +0 -23
- package/src/components/utilities/intersection_observer/intersection_observer.stories.js +91 -80
- package/src/components/utilities/intersection_observer/intersection_observer.vue +15 -0
- package/src/scss/utilities.scss +30 -4
- package/src/scss/utility-mixins/flex.scss +1 -1
- package/src/scss/utility-mixins/opacity.scss +8 -0
- package/src/scss/utility-mixins/spacing.scss +7 -1
- package/dist/components/base/paginated_list/examples/index.js +0 -49
- package/dist/components/base/paginated_list/examples/paginated_list.basic.example.js +0 -51
- package/dist/components/base/paginated_list/examples/paginated_list.no_filter.example.js +0 -51
- package/dist/components/base/paginated_list/examples/paginated_list.with_empty_list.example.js +0 -38
- package/dist/components/base/paginated_list/examples/paginated_list.with_filter_function.example.js +0 -51
- package/dist/components/base/paginated_list/examples/paginated_list.with_header_slot.example.js +0 -51
- package/dist/components/base/paginated_list/examples/paginated_list.with_row_slot.example.js +0 -53
- package/dist/components/base/paginated_list/examples/paginated_list.with_subheader_slot.example.js +0 -51
- package/dist/components/base/toast/examples/index.js +0 -19
- package/dist/components/base/toast/examples/toast.action.example.js +0 -40
- package/dist/components/base/toast/examples/toast.default.example.js +0 -38
- package/dist/components/utilities/intersection_observer/examples/index.js +0 -19
- package/dist/components/utilities/intersection_observer/examples/intersection_observer.image.example.js +0 -62
- package/dist/components/utilities/intersection_observer/examples/intersection_observer.last_appeared.example.js +0 -83
- package/src/components/base/paginated_list/examples/index.js +0 -57
- package/src/components/base/paginated_list/examples/paginated_list.basic.example.vue +0 -19
- package/src/components/base/paginated_list/examples/paginated_list.no_filter.example.vue +0 -20
- package/src/components/base/paginated_list/examples/paginated_list.with_empty_list.example.vue +0 -3
- package/src/components/base/paginated_list/examples/paginated_list.with_filter_function.example.vue +0 -20
- package/src/components/base/paginated_list/examples/paginated_list.with_header_slot.example.vue +0 -23
- package/src/components/base/paginated_list/examples/paginated_list.with_row_slot.example.vue +0 -25
- package/src/components/base/paginated_list/examples/paginated_list.with_subheader_slot.example.vue +0 -23
- package/src/components/base/toast/examples/index.js +0 -22
- package/src/components/base/toast/examples/toast.action.example.vue +0 -11
- package/src/components/base/toast/examples/toast.default.example.vue +0 -3
- package/src/components/utilities/intersection_observer/examples/index.js +0 -23
- package/src/components/utilities/intersection_observer/examples/intersection_observer.image.example.vue +0 -29
- package/src/components/utilities/intersection_observer/examples/intersection_observer.last_appeared.example.vue +0 -43
package/package.json
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
import { withKnobs, object, array, boolean, number, text } from '@storybook/addon-knobs';
|
|
2
|
-
import { documentedStoriesOf } from '../../../../documentation/documented_stories';
|
|
3
1
|
import { GlPaginatedList, GlButton } from '../../../../index';
|
|
4
2
|
import readme from './paginated_list.md';
|
|
5
3
|
|
|
6
|
-
const
|
|
7
|
-
GlPaginatedList,
|
|
8
|
-
GlButton,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const list = [
|
|
4
|
+
const sampleList = [
|
|
12
5
|
{ id: 'foo' },
|
|
13
6
|
{ id: 'bar' },
|
|
14
7
|
{ id: 'baz' },
|
|
@@ -33,167 +26,182 @@ const template = `
|
|
|
33
26
|
:page="page"
|
|
34
27
|
:filterable="filterable"
|
|
35
28
|
:filter="filter"
|
|
29
|
+
:item-key="itemKey"
|
|
36
30
|
:emptyMessage="emptyMessage"
|
|
37
31
|
:emptySearchMessage="emptySearchMessage"
|
|
38
32
|
/>
|
|
39
33
|
`;
|
|
40
34
|
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
35
|
+
const generateProps = ({
|
|
36
|
+
list = [...sampleList],
|
|
37
|
+
perPage = 10,
|
|
38
|
+
page = 1,
|
|
39
|
+
filterable = true,
|
|
40
|
+
filter = 'id',
|
|
41
|
+
itemKey = 'id',
|
|
42
|
+
emptyMessage = 'There are currently no items in this list.',
|
|
43
|
+
emptySearchMessage = 'Sorry, your filter produced no results.',
|
|
44
|
+
} = {}) => ({
|
|
45
|
+
list,
|
|
46
|
+
perPage,
|
|
47
|
+
page,
|
|
48
|
+
filterable,
|
|
49
|
+
filter,
|
|
50
|
+
itemKey,
|
|
51
|
+
emptyMessage,
|
|
52
|
+
emptySearchMessage,
|
|
53
|
+
});
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
const Template = (args, { argTypes }) => ({
|
|
56
|
+
components: {
|
|
57
|
+
GlPaginatedList,
|
|
58
|
+
GlButton,
|
|
59
|
+
},
|
|
60
|
+
props: Object.keys(argTypes),
|
|
61
|
+
template,
|
|
62
|
+
});
|
|
58
63
|
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
:list="list"
|
|
62
|
-
:perPage="perPage"
|
|
63
|
-
:page="page"
|
|
64
|
-
:filterable="filterable"
|
|
65
|
-
:filter="filter"
|
|
66
|
-
:emptyMessage="emptyMessage"
|
|
67
|
-
:emptySearchMessage="emptySearchMessage"
|
|
68
|
-
>
|
|
64
|
+
export const Default = Template.bind({});
|
|
65
|
+
Default.args = generateProps();
|
|
69
66
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
`;
|
|
67
|
+
export const NoFilter = (args, { argTypes }) => ({
|
|
68
|
+
components: {
|
|
69
|
+
GlPaginatedList,
|
|
70
|
+
GlButton,
|
|
71
|
+
},
|
|
72
|
+
props: Object.keys(argTypes),
|
|
73
|
+
template,
|
|
74
|
+
});
|
|
75
|
+
NoFilter.args = generateProps({
|
|
76
|
+
filterable: false,
|
|
77
|
+
});
|
|
82
78
|
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
79
|
+
export const WithEmptyList = (args, { argTypes }) => ({
|
|
80
|
+
components: {
|
|
81
|
+
GlPaginatedList,
|
|
82
|
+
GlButton,
|
|
83
|
+
},
|
|
84
|
+
props: Object.keys(argTypes),
|
|
85
|
+
template,
|
|
86
|
+
});
|
|
87
|
+
WithEmptyList.args = generateProps({
|
|
88
|
+
list: emptyList,
|
|
89
|
+
});
|
|
93
90
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
91
|
+
export const WithHeaderSlot = (args, { argTypes }) => ({
|
|
92
|
+
components: {
|
|
93
|
+
GlPaginatedList,
|
|
94
|
+
GlButton,
|
|
95
|
+
},
|
|
96
|
+
props: Object.keys(argTypes),
|
|
97
|
+
template: `
|
|
98
|
+
<gl-paginated-list
|
|
99
|
+
:list="list"
|
|
100
|
+
:perPage="perPage"
|
|
101
|
+
:page="page"
|
|
102
|
+
:filterable="filterable"
|
|
103
|
+
:filter="filter"
|
|
104
|
+
:item-key="itemKey"
|
|
105
|
+
:emptyMessage="emptyMessage"
|
|
106
|
+
:emptySearchMessage="emptySearchMessage"
|
|
99
107
|
>
|
|
100
|
-
{{ listItem.id }}
|
|
101
|
-
</gl-button>
|
|
102
|
-
</template>
|
|
103
108
|
|
|
104
|
-
|
|
105
|
-
|
|
109
|
+
<template #header>
|
|
110
|
+
<gl-button
|
|
111
|
+
variant="success"
|
|
112
|
+
class="order-1"
|
|
113
|
+
@click="alert"
|
|
114
|
+
>
|
|
115
|
+
Foo Button
|
|
116
|
+
</gl-button>
|
|
117
|
+
</template>
|
|
106
118
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
perPage: {
|
|
114
|
-
type: Number,
|
|
115
|
-
default: number('perPage', 10),
|
|
116
|
-
},
|
|
117
|
-
page: {
|
|
118
|
-
type: Number,
|
|
119
|
-
default: number('page', 1),
|
|
120
|
-
},
|
|
121
|
-
filterable: {
|
|
122
|
-
type: Boolean,
|
|
123
|
-
default: boolean('filterable', true),
|
|
124
|
-
},
|
|
125
|
-
filter: {
|
|
126
|
-
type: String,
|
|
127
|
-
default: text('filter', 'id'),
|
|
128
|
-
},
|
|
129
|
-
itemKey: {
|
|
130
|
-
type: String,
|
|
131
|
-
default: text('itemKey', 'id'),
|
|
119
|
+
</gl-paginated-list>
|
|
120
|
+
`,
|
|
121
|
+
methods: {
|
|
122
|
+
alert() {
|
|
123
|
+
// eslint-disable-next-line no-alert
|
|
124
|
+
window.alert('clicked');
|
|
132
125
|
},
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
},
|
|
137
|
-
emptySearchMessage: {
|
|
138
|
-
type: String,
|
|
139
|
-
default: text('emptySearchMessage', 'Sorry, your filter produced no results.'),
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
}
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
WithHeaderSlot.args = generateProps();
|
|
143
129
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
130
|
+
export const WithSubheaderSlot = (args, { argTypes }) => ({
|
|
131
|
+
components: {
|
|
132
|
+
GlPaginatedList,
|
|
133
|
+
GlButton,
|
|
134
|
+
},
|
|
135
|
+
props: Object.keys(argTypes),
|
|
136
|
+
template: `
|
|
137
|
+
<gl-paginated-list
|
|
138
|
+
:list="list"
|
|
139
|
+
:perPage="perPage"
|
|
140
|
+
:page="page"
|
|
141
|
+
:filterable="filterable"
|
|
142
|
+
:filter="filter"
|
|
143
|
+
:item-key="itemKey"
|
|
144
|
+
:emptyMessage="emptyMessage"
|
|
145
|
+
:emptySearchMessage="emptySearchMessage"
|
|
146
|
+
>
|
|
147
|
+
|
|
148
|
+
<template #subheader>
|
|
149
|
+
Dropdown content can go here when like when an action button is clicked
|
|
150
|
+
</template>
|
|
151
|
+
|
|
152
|
+
</gl-paginated-list>
|
|
153
|
+
`,
|
|
154
|
+
});
|
|
155
|
+
WithSubheaderSlot.args = generateProps();
|
|
156
|
+
|
|
157
|
+
export const WithRowSlot = (args, { argTypes }) => ({
|
|
158
|
+
components: {
|
|
159
|
+
GlPaginatedList,
|
|
160
|
+
GlButton,
|
|
161
|
+
},
|
|
162
|
+
props: Object.keys(argTypes),
|
|
163
|
+
template: `
|
|
164
|
+
<gl-paginated-list
|
|
165
|
+
:list="list"
|
|
166
|
+
:perPage="perPage"
|
|
167
|
+
:page="page"
|
|
168
|
+
:filterable="filterable"
|
|
169
|
+
:filter="filter"
|
|
170
|
+
:item-key="itemKey"
|
|
171
|
+
:emptyMessage="emptyMessage"
|
|
172
|
+
:emptySearchMessage="emptySearchMessage"
|
|
173
|
+
>
|
|
174
|
+
|
|
175
|
+
<template slot-scope="{ listItem }" >
|
|
176
|
+
<gl-button
|
|
177
|
+
variant="success"
|
|
178
|
+
class="order-1"
|
|
179
|
+
@click="alert"
|
|
180
|
+
>
|
|
181
|
+
{{ listItem.id }}
|
|
182
|
+
</gl-button>
|
|
183
|
+
</template>
|
|
184
|
+
|
|
185
|
+
</gl-paginated-list>
|
|
186
|
+
`,
|
|
187
|
+
methods: {
|
|
188
|
+
alert() {
|
|
189
|
+
// eslint-disable-next-line no-alert
|
|
190
|
+
window.alert('clicked');
|
|
182
191
|
},
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
// eslint-disable-next-line no-alert
|
|
196
|
-
window.alert('clicked');
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
WithRowSlot.args = generateProps();
|
|
195
|
+
|
|
196
|
+
export default {
|
|
197
|
+
title: 'base/paginated-list',
|
|
198
|
+
component: GlPaginatedList,
|
|
199
|
+
parameters: {
|
|
200
|
+
knobs: { disable: true },
|
|
201
|
+
docs: {
|
|
202
|
+
description: {
|
|
203
|
+
component: readme,
|
|
197
204
|
},
|
|
198
205
|
},
|
|
199
|
-
}
|
|
206
|
+
},
|
|
207
|
+
};
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
# Toast
|
|
2
|
-
|
|
3
|
-
<!-- STORY -->
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
1
|
|
|
7
2
|
Toasts are used to display system messages. The messages are short and straightforward. It may
|
|
8
3
|
contain a dismiss button, and an action button depending on the situation.
|
|
@@ -51,9 +46,3 @@ Below are the options you can pass to create a toast
|
|
|
51
46
|
| action | Object | close | Add single actions to toast |
|
|
52
47
|
| toastClass | String, Array | 'gl-toast' | Custom css class name of the toast |
|
|
53
48
|
| onComplete | Function | null | Trigger when toast is completed |
|
|
54
|
-
|
|
55
|
-
## Under the hood
|
|
56
|
-
|
|
57
|
-
Toast uses [`BToast`] internally. So please take a look at their extensive documentation for more information.
|
|
58
|
-
|
|
59
|
-
[`btoast`]: https://bootstrap-vue.org/docs/components/toast
|
|
@@ -1,66 +1,82 @@
|
|
|
1
1
|
import Vue from 'vue';
|
|
2
|
-
import { documentedStoriesOf } from '../../../../documentation/documented_stories';
|
|
3
2
|
import { GlToast } from '../../../../index';
|
|
4
3
|
import readme from './toast.md';
|
|
5
4
|
|
|
6
5
|
Vue.use(GlToast);
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
const Template = () => ({
|
|
8
|
+
components: { GlToast },
|
|
9
|
+
template: `
|
|
10
|
+
<gl-button @click="showToast()">
|
|
11
|
+
Show default toast
|
|
12
|
+
</gl-button>`,
|
|
13
|
+
methods: {
|
|
14
|
+
showToast() {
|
|
15
|
+
this.$toast.show('This is the default toast.');
|
|
15
16
|
},
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
},
|
|
18
|
+
mounted() {
|
|
19
|
+
this.showToast();
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export const Default = Template.bind({});
|
|
24
|
+
|
|
25
|
+
export const WithActions = () => ({
|
|
26
|
+
components: { GlToast },
|
|
27
|
+
template: `
|
|
28
|
+
<gl-button @click="showToast()">
|
|
29
|
+
Show toast with actions
|
|
30
|
+
</gl-button>`,
|
|
31
|
+
methods: {
|
|
32
|
+
showToast() {
|
|
33
|
+
this.$toast.show('This is a toast with an action.', {
|
|
34
|
+
action: {
|
|
35
|
+
text: 'Undo',
|
|
36
|
+
onClick: () => {},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
18
39
|
},
|
|
19
|
-
}
|
|
20
|
-
|
|
40
|
+
},
|
|
41
|
+
mounted() {
|
|
42
|
+
this.showToast();
|
|
43
|
+
},
|
|
44
|
+
});
|
|
21
45
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
46
|
+
export const WithLongContent = () => ({
|
|
47
|
+
components: { GlToast },
|
|
48
|
+
template: `
|
|
49
|
+
<gl-button @click="showToast()">
|
|
50
|
+
Show toast with a long content
|
|
51
|
+
</gl-button>`,
|
|
52
|
+
methods: {
|
|
53
|
+
showToast() {
|
|
54
|
+
this.$toast.show(
|
|
55
|
+
'This is a toast with a long content and an action. Notice how the text wraps to multiple lines when the max-width is reached.',
|
|
56
|
+
{
|
|
28
57
|
action: {
|
|
29
|
-
text: 'Undo',
|
|
58
|
+
text: 'Undo action',
|
|
30
59
|
onClick: () => {},
|
|
31
60
|
},
|
|
32
|
-
}
|
|
33
|
-
|
|
61
|
+
}
|
|
62
|
+
);
|
|
34
63
|
},
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
}
|
|
64
|
+
},
|
|
65
|
+
mounted() {
|
|
66
|
+
this.showToast();
|
|
67
|
+
},
|
|
68
|
+
});
|
|
40
69
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
text: 'Undo action',
|
|
51
|
-
onClick: () => {},
|
|
52
|
-
},
|
|
53
|
-
}
|
|
54
|
-
);
|
|
70
|
+
export default {
|
|
71
|
+
title: 'base/toast',
|
|
72
|
+
component: GlToast,
|
|
73
|
+
parameters: {
|
|
74
|
+
bootstrapComponent: 'toast',
|
|
75
|
+
knobs: { disable: true },
|
|
76
|
+
docs: {
|
|
77
|
+
description: {
|
|
78
|
+
component: readme,
|
|
55
79
|
},
|
|
56
80
|
},
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
documentedStoriesOf('base/toast', readme)
|
|
64
|
-
.add('default', generateDefault())
|
|
65
|
-
.add('with actions', generateWithActions())
|
|
66
|
-
.add('with long content', generateLong());
|
|
81
|
+
},
|
|
82
|
+
};
|
package/src/components/utilities/intersection_observer/intersection_observer.documentation.js
CHANGED
|
@@ -1,28 +1,5 @@
|
|
|
1
|
-
import examples from './examples';
|
|
2
1
|
import * as description from './intersection_observer.md';
|
|
3
2
|
|
|
4
3
|
export default {
|
|
5
4
|
description,
|
|
6
|
-
examples,
|
|
7
|
-
propsInfo: {
|
|
8
|
-
options: {
|
|
9
|
-
additionalInfo: 'Extra options to pass directly to the intersection observer API.',
|
|
10
|
-
},
|
|
11
|
-
},
|
|
12
|
-
events: [
|
|
13
|
-
{
|
|
14
|
-
event: 'appear',
|
|
15
|
-
description: 'Emitted when the element appears on the page',
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
event: 'disappear',
|
|
19
|
-
description: 'Emitted when the element disappears from the page',
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
slots: [
|
|
23
|
-
{
|
|
24
|
-
slot: 'default',
|
|
25
|
-
description: "The element you wish to observe, or a fallback if the observer doesn't work.",
|
|
26
|
-
},
|
|
27
|
-
],
|
|
28
5
|
};
|