@gitlab/ui 70.0.1 → 71.1.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 +20 -0
- package/dist/components/base/datepicker/datepicker.js +1 -18
- package/dist/components/base/form/form_input/form_input.js +11 -31
- package/dist/components/base/form/form_select/form_select.js +11 -31
- package/dist/index.css.map +1 -1
- package/dist/tokens/css/tokens.css +1 -1
- package/dist/tokens/css/tokens.dark.css +1 -1
- package/dist/tokens/js/tokens.dark.js +1 -1
- package/dist/tokens/js/tokens.js +1 -1
- package/dist/tokens/scss/_tokens.dark.scss +1 -1
- package/dist/tokens/scss/_tokens.scss +1 -1
- package/dist/utility_classes.css +1 -1
- package/dist/utility_classes.css.map +1 -1
- package/dist/utils/constants.js +2 -6
- package/package.json +2 -2
- package/src/components/base/datepicker/datepicker.spec.js +0 -15
- package/src/components/base/datepicker/datepicker.stories.js +3 -7
- package/src/components/base/datepicker/datepicker.vue +1 -22
- package/src/components/base/form/form_input/form_input.spec.js +2 -54
- package/src/components/base/form/form_input/form_input.stories.js +12 -21
- package/src/components/base/form/form_input/form_input.vue +9 -30
- package/src/components/base/form/form_select/form_select.spec.js +3 -28
- package/src/components/base/form/form_select/form_select.stories.js +23 -9
- package/src/components/base/form/form_select/form_select.vue +9 -30
- package/src/scss/utilities.scss +42 -0
- package/src/scss/utility-mixins/text.scss +32 -0
- package/src/utils/constants.js +1 -6
package/dist/utils/constants.js
CHANGED
|
@@ -117,10 +117,6 @@ const buttonSizeOptions = {
|
|
|
117
117
|
small: 'sm',
|
|
118
118
|
medium: 'md'
|
|
119
119
|
};
|
|
120
|
-
const datepickerSizeOptionsMap = {
|
|
121
|
-
small: 'sm',
|
|
122
|
-
medium: 'md'
|
|
123
|
-
};
|
|
124
120
|
const datepickerWidthOptionsMap = {
|
|
125
121
|
sm: 'sm',
|
|
126
122
|
md: 'md',
|
|
@@ -242,7 +238,7 @@ const keyboard = {
|
|
|
242
238
|
tab: 'Tab'
|
|
243
239
|
};
|
|
244
240
|
const truncateOptions = POSITION;
|
|
245
|
-
const
|
|
241
|
+
const formInputWidths = {
|
|
246
242
|
xs: 'xs',
|
|
247
243
|
sm: 'sm',
|
|
248
244
|
md: 'md',
|
|
@@ -271,4 +267,4 @@ const loadingIconVariants = {
|
|
|
271
267
|
dots: 'dots'
|
|
272
268
|
};
|
|
273
269
|
|
|
274
|
-
export { COMMA, LEFT_MOUSE_BUTTON, alertVariantIconMap, alertVariantOptions, alignOptions, avatarShapeOptions, avatarSizeOptions, avatarsInlineSizeOptions, badgeForButtonOptions, badgeIconSizeOptions, badgeSizeOptions, badgeVariantOptions, bannerVariants, buttonCategoryOptions, buttonSizeOptions, buttonVariantOptions, colorThemes, columnOptions,
|
|
270
|
+
export { COMMA, LEFT_MOUSE_BUTTON, alertVariantIconMap, alertVariantOptions, alignOptions, avatarShapeOptions, avatarSizeOptions, avatarsInlineSizeOptions, badgeForButtonOptions, badgeIconSizeOptions, badgeSizeOptions, badgeVariantOptions, bannerVariants, buttonCategoryOptions, buttonSizeOptions, buttonVariantOptions, colorThemes, columnOptions, datepickerWidthOptionsMap, defaultDateFormat, drawerVariants, dropdownAllowedAutoPlacements, dropdownPlacements, dropdownVariantOptions, focusableTags, formInputWidths, formStateOptions, glThemes, iconSizeOptions, keyboard, labelColorOptions, labelSizeOptions, loadingIconSizes, loadingIconVariants, maxZIndex, modalButtonDefaults, modalSizeOptions, popoverPlacements, resizeDebounceTime, tabsButtonDefaults, targetOptions, toggleLabelPosition, tokenVariants, tooltipActionEvents, tooltipDelay, tooltipPlacements, triggerVariantOptions, truncateOptions, variantCssColorMap, variantOptions, variantOptionsWithNoDefault, viewModeOptions };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gitlab/ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "71.1.0",
|
|
4
4
|
"description": "GitLab UI Components",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"storybook-static": "yarn storybook-prep && storybook build -c .storybook -o storybook",
|
|
38
38
|
"pretest:unit": "yarn build-tokens",
|
|
39
39
|
"test": "run-s test:unit test:visual",
|
|
40
|
-
"test:integration": "NODE_ENV=test start-server-and-test start http://${STORYBOOK_HOST:-localhost}:9001/iframe.html 'yarn cy:run && yarn cy:a11y'",
|
|
40
|
+
"test:integration": "NODE_ENV=test start-server-and-test start http://${STORYBOOK_HOST:-localhost}:9001/iframe.html 'yarn cy:run && yarn cy:edge && yarn cy:a11y'",
|
|
41
41
|
"test:unit": "NODE_ENV=test jest --testPathIgnorePatterns storyshots.spec.js",
|
|
42
42
|
"test:unit:watch": "yarn test:unit --watch",
|
|
43
43
|
"test:unit:debug": "NODE_ENV=test node --inspect node_modules/.bin/jest --testPathIgnorePatterns storyshot.spec.js --watch --runInBand",
|
|
@@ -412,21 +412,6 @@ describe('datepicker component', () => {
|
|
|
412
412
|
expect(config.parse(dateString)).toEqual(parsedDate);
|
|
413
413
|
});
|
|
414
414
|
|
|
415
|
-
it.each`
|
|
416
|
-
size | expectedClass
|
|
417
|
-
${undefined} | ${'gl-form-input-md'}
|
|
418
|
-
${'small'} | ${'gl-form-input-sm'}
|
|
419
|
-
${'medium'} | ${'gl-form-input-md'}
|
|
420
|
-
`('applies $expectedClass class when size is $size', ({ size, expectedClass }) => {
|
|
421
|
-
const wrapper = mountWithOptions({
|
|
422
|
-
propsData: {
|
|
423
|
-
size,
|
|
424
|
-
},
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
expect(wrapper.classes()).toContain(expectedClass);
|
|
428
|
-
});
|
|
429
|
-
|
|
430
415
|
it.each`
|
|
431
416
|
width | expectedClass
|
|
432
417
|
${undefined} | ${'gl-form-input-md'}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import GlFormGroup from '../form/form_group/form_group.vue';
|
|
2
|
-
import { datepickerWidthOptionsMap
|
|
2
|
+
import { datepickerWidthOptionsMap } from '../../../utils/constants';
|
|
3
3
|
import { disableControls } from '../../../utils/stories_utils';
|
|
4
4
|
import { useFakeDate } from '../../../utils/use_fake_date';
|
|
5
5
|
import { makeContainer } from '../../../utils/story_decorators/container';
|
|
@@ -65,7 +65,7 @@ export const WithClearButton = (_args, { argTypes }) => ({
|
|
|
65
65
|
});
|
|
66
66
|
WithClearButton.args = generateProps();
|
|
67
67
|
|
|
68
|
-
export const
|
|
68
|
+
export const Widths = (_args, { argTypes }) => ({
|
|
69
69
|
...defaults,
|
|
70
70
|
props: Object.keys(argTypes),
|
|
71
71
|
data() {
|
|
@@ -91,7 +91,7 @@ export const DifferentSizes = (_args, { argTypes }) => ({
|
|
|
91
91
|
</div>
|
|
92
92
|
`,
|
|
93
93
|
});
|
|
94
|
-
|
|
94
|
+
Widths.args = generateProps();
|
|
95
95
|
|
|
96
96
|
export default {
|
|
97
97
|
title: 'base/datepicker',
|
|
@@ -137,9 +137,5 @@ export default {
|
|
|
137
137
|
options: datepickerWidthOptionsMap,
|
|
138
138
|
control: 'select',
|
|
139
139
|
},
|
|
140
|
-
size: {
|
|
141
|
-
options: datepickerSizeOptionsMap,
|
|
142
|
-
control: 'select',
|
|
143
|
-
},
|
|
144
140
|
},
|
|
145
141
|
};
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
<script>
|
|
3
3
|
import isString from 'lodash/isString';
|
|
4
4
|
import Pikaday from 'pikaday';
|
|
5
|
-
import {
|
|
6
|
-
defaultDateFormat,
|
|
7
|
-
datepickerWidthOptionsMap,
|
|
8
|
-
datepickerSizeOptionsMap,
|
|
9
|
-
} from '../../../utils/constants';
|
|
5
|
+
import { defaultDateFormat, datepickerWidthOptionsMap } from '../../../utils/constants';
|
|
10
6
|
import { areDatesEqual } from '../../../utils/datetime_utility';
|
|
11
7
|
import GlButton from '../button/button.vue';
|
|
12
8
|
import GlFormInput from '../form/form_input/form_input.vue';
|
|
@@ -185,20 +181,6 @@ export default {
|
|
|
185
181
|
default: null,
|
|
186
182
|
validator: (value) => Object.keys(datepickerWidthOptionsMap).includes(value),
|
|
187
183
|
},
|
|
188
|
-
/**
|
|
189
|
-
* ⚠️ DEPRECATED:
|
|
190
|
-
*
|
|
191
|
-
* Will be replaced by the
|
|
192
|
-
* property width
|
|
193
|
-
*
|
|
194
|
-
* Maximum width of the Datepicker
|
|
195
|
-
*/
|
|
196
|
-
size: {
|
|
197
|
-
type: String,
|
|
198
|
-
required: false,
|
|
199
|
-
default: null,
|
|
200
|
-
validator: (value) => Object.keys(datepickerSizeOptionsMap).includes(value),
|
|
201
|
-
},
|
|
202
184
|
},
|
|
203
185
|
data() {
|
|
204
186
|
return {
|
|
@@ -243,9 +225,6 @@ export default {
|
|
|
243
225
|
computedWidth() {
|
|
244
226
|
if (this.width) {
|
|
245
227
|
return this.width;
|
|
246
|
-
// eslint-disable-next-line no-else-return
|
|
247
|
-
} else if (this.size) {
|
|
248
|
-
return datepickerSizeOptionsMap[this.size];
|
|
249
228
|
}
|
|
250
229
|
|
|
251
230
|
return 'md';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { mount, shallowMount } from '@vue/test-utils';
|
|
2
|
-
import {
|
|
2
|
+
import { formInputWidths } from '../../../../utils/constants';
|
|
3
3
|
import GlFormInput from './form_input.vue';
|
|
4
4
|
|
|
5
5
|
const modelEvent = GlFormInput.model.event;
|
|
@@ -14,62 +14,10 @@ describe('GlFormInput', () => {
|
|
|
14
14
|
});
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
describe('size prop', () => {
|
|
18
|
-
describe('when number is passed', () => {
|
|
19
|
-
// Exclude the default null value
|
|
20
|
-
const sizes = Object.values(formInputSizes).filter(Boolean);
|
|
21
|
-
|
|
22
|
-
it.each(sizes)('adds correct class for size %s', (size) => {
|
|
23
|
-
createComponent({ size });
|
|
24
|
-
|
|
25
|
-
expect(wrapper.classes()).toEqual(['gl-form-input', `gl-form-input-${size}`]);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('does not add a size class if not given the size prop', () => {
|
|
29
|
-
createComponent();
|
|
30
|
-
|
|
31
|
-
expect(wrapper.classes()).toEqual(['gl-form-input']);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('does not add a size class if passed null', () => {
|
|
35
|
-
createComponent({ size: null });
|
|
36
|
-
|
|
37
|
-
expect(wrapper.classes()).toEqual(['gl-form-input']);
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
describe('when object is passed', () => {
|
|
42
|
-
describe('when `default` key is provided', () => {
|
|
43
|
-
it('adds responsive CSS classes and base class', () => {
|
|
44
|
-
createComponent({ size: { default: 'md', md: 'lg', lg: 'xl' } });
|
|
45
|
-
|
|
46
|
-
expect(wrapper.classes()).toEqual([
|
|
47
|
-
'gl-form-input',
|
|
48
|
-
'gl-form-input-md',
|
|
49
|
-
'gl-md-form-input-lg',
|
|
50
|
-
'gl-lg-form-input-xl',
|
|
51
|
-
]);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('when `default` key is not provided', () => {
|
|
56
|
-
it('adds responsive CSS classes', () => {
|
|
57
|
-
createComponent({ size: { md: 'lg', lg: 'xl' } });
|
|
58
|
-
|
|
59
|
-
expect(wrapper.classes()).toEqual([
|
|
60
|
-
'gl-form-input',
|
|
61
|
-
'gl-md-form-input-lg',
|
|
62
|
-
'gl-lg-form-input-xl',
|
|
63
|
-
]);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
|
|
69
17
|
describe('width prop', () => {
|
|
70
18
|
describe('when number is passed', () => {
|
|
71
19
|
// Exclude the default null value
|
|
72
|
-
const widths = Object.values(
|
|
20
|
+
const widths = Object.values(formInputWidths).filter(Boolean);
|
|
73
21
|
|
|
74
22
|
it.each(widths)('adds correct class for width %s', (width) => {
|
|
75
23
|
createComponent({ width });
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { formInputWidths } from '../../../../utils/constants';
|
|
2
2
|
import GlFormInput from './form_input.vue';
|
|
3
3
|
import readme from './form_input.md';
|
|
4
4
|
|
|
@@ -9,18 +9,15 @@ const template = `
|
|
|
9
9
|
:disabled="disabled"
|
|
10
10
|
:value="value"
|
|
11
11
|
:width="width"
|
|
12
|
-
:size="size"
|
|
13
12
|
/>`;
|
|
14
13
|
|
|
15
14
|
const generateProps = ({
|
|
16
|
-
width = GlFormInput.props.
|
|
17
|
-
size = GlFormInput.props.size.default,
|
|
15
|
+
width = GlFormInput.props.width.default,
|
|
18
16
|
value = '',
|
|
19
17
|
disabled = false,
|
|
20
18
|
readonly = false,
|
|
21
19
|
} = {}) => ({
|
|
22
20
|
width,
|
|
23
|
-
size,
|
|
24
21
|
value,
|
|
25
22
|
disabled,
|
|
26
23
|
readonly,
|
|
@@ -41,46 +38,44 @@ Disabled.args = generateProps({ value: 'some text', disabled: true });
|
|
|
41
38
|
export const Readonly = Template.bind({});
|
|
42
39
|
Readonly.args = generateProps({ value: 'readonly text', readonly: true });
|
|
43
40
|
|
|
44
|
-
export const
|
|
41
|
+
export const Widths = (args, { argTypes }) => ({
|
|
45
42
|
components: { GlFormInput },
|
|
46
43
|
props: Object.keys(argTypes),
|
|
47
44
|
data: () => ({
|
|
48
|
-
|
|
45
|
+
formInputWidths,
|
|
49
46
|
}),
|
|
50
47
|
template: `
|
|
51
48
|
<div>
|
|
52
49
|
<gl-form-input
|
|
53
|
-
v-for="(
|
|
54
|
-
:key="
|
|
50
|
+
v-for="(width, name) in formInputWidths"
|
|
51
|
+
:key="width"
|
|
55
52
|
:width="width"
|
|
56
|
-
:size="size"
|
|
57
53
|
:value="name"
|
|
54
|
+
class="gl-mb-4"
|
|
58
55
|
/>
|
|
59
56
|
</div>
|
|
60
57
|
`,
|
|
61
58
|
});
|
|
62
|
-
|
|
59
|
+
Widths.args = {};
|
|
63
60
|
|
|
64
|
-
export const
|
|
61
|
+
export const ResponsiveWidths = (args, { argTypes }) => ({
|
|
65
62
|
components: { GlFormInput },
|
|
66
63
|
props: Object.keys(argTypes),
|
|
67
64
|
template: `
|
|
68
65
|
<div>
|
|
69
66
|
<gl-form-input
|
|
70
67
|
:width="{ default: 'md', md: 'lg', lg: 'xl' }"
|
|
71
|
-
:size="{ default: 'md', md: 'lg', lg: 'xl' }"
|
|
72
68
|
value="With \`default\` key"
|
|
69
|
+
class="gl-mb-4"
|
|
73
70
|
/>
|
|
74
71
|
<gl-form-input
|
|
75
|
-
class="gl-mt-4"
|
|
76
72
|
:width="{ md: 'lg', lg: 'xl' }"
|
|
77
|
-
:size="{ md: 'lg', lg: 'xl' }"
|
|
78
73
|
value="Without \`default\` key"
|
|
79
74
|
/>
|
|
80
75
|
</div>
|
|
81
76
|
`,
|
|
82
77
|
});
|
|
83
|
-
|
|
78
|
+
ResponsiveWidths.args = {};
|
|
84
79
|
|
|
85
80
|
export default {
|
|
86
81
|
title: 'base/form/form-input',
|
|
@@ -95,11 +90,7 @@ export default {
|
|
|
95
90
|
},
|
|
96
91
|
argTypes: {
|
|
97
92
|
width: {
|
|
98
|
-
options:
|
|
99
|
-
control: 'select',
|
|
100
|
-
},
|
|
101
|
-
size: {
|
|
102
|
-
options: formInputSizes,
|
|
93
|
+
options: formInputWidths,
|
|
103
94
|
control: 'select',
|
|
104
95
|
},
|
|
105
96
|
},
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import isObject from 'lodash/isObject';
|
|
3
3
|
import { BFormInput } from 'bootstrap-vue';
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { formInputWidths } from '../../../../utils/constants';
|
|
6
6
|
|
|
7
7
|
const MODEL_PROP = 'value';
|
|
8
8
|
const MODEL_EVENT = 'input';
|
|
@@ -28,49 +28,28 @@ export default {
|
|
|
28
28
|
validator: (value) => {
|
|
29
29
|
const widths = isObject(value) ? Object.values(value) : [value];
|
|
30
30
|
|
|
31
|
-
return widths.every((width) => Object.values(
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
/**
|
|
35
|
-
* ⚠️ DEPRECATED:
|
|
36
|
-
*
|
|
37
|
-
* Will be replaced by the
|
|
38
|
-
* property width
|
|
39
|
-
*
|
|
40
|
-
* Maximum width of the input
|
|
41
|
-
*/
|
|
42
|
-
size: {
|
|
43
|
-
type: [String, Object],
|
|
44
|
-
required: false,
|
|
45
|
-
default: null,
|
|
46
|
-
validator: (value) => {
|
|
47
|
-
const sizes = isObject(value) ? Object.values(value) : [value];
|
|
48
|
-
|
|
49
|
-
return sizes.every((size) => Object.values(formInputSizes).includes(size));
|
|
31
|
+
return widths.every((width) => Object.values(formInputWidths).includes(width));
|
|
50
32
|
},
|
|
51
33
|
},
|
|
52
34
|
},
|
|
53
35
|
computed: {
|
|
54
|
-
computedWidth() {
|
|
55
|
-
return this.width ? this.width : this.size;
|
|
56
|
-
},
|
|
57
36
|
cssClasses() {
|
|
58
|
-
if (this.
|
|
37
|
+
if (this.width === null) {
|
|
59
38
|
return [];
|
|
60
39
|
}
|
|
61
40
|
|
|
62
|
-
if (isObject(this.
|
|
63
|
-
const { default:
|
|
41
|
+
if (isObject(this.width)) {
|
|
42
|
+
const { default: defaultWidth, ...nonDefaultWidths } = this.width;
|
|
64
43
|
|
|
65
44
|
return [
|
|
66
|
-
...(
|
|
67
|
-
...Object.entries(
|
|
68
|
-
([breakpoint,
|
|
45
|
+
...(defaultWidth ? [`gl-form-input-${defaultWidth}`] : []),
|
|
46
|
+
...Object.entries(nonDefaultWidths).map(
|
|
47
|
+
([breakpoint, width]) => `gl-${breakpoint}-form-input-${width}`
|
|
69
48
|
),
|
|
70
49
|
];
|
|
71
50
|
}
|
|
72
51
|
|
|
73
|
-
return [`gl-form-input-${this.
|
|
52
|
+
return [`gl-form-input-${this.width}`];
|
|
74
53
|
},
|
|
75
54
|
listeners() {
|
|
76
55
|
return {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { mount } from '@vue/test-utils';
|
|
2
|
-
import { formStateOptions,
|
|
2
|
+
import { formStateOptions, formInputWidths } from '../../../../utils/constants';
|
|
3
3
|
import { formSelectOptions } from './constants';
|
|
4
4
|
import GlFormSelect from './form_select.vue';
|
|
5
5
|
|
|
@@ -31,36 +31,11 @@ describe('GlFormSelect', () => {
|
|
|
31
31
|
});
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
-
describe('size prop', () => {
|
|
35
|
-
// Exclude the default null value
|
|
36
|
-
const nonNullSizes = excludeDefaultNull(formInputSizes);
|
|
37
|
-
|
|
38
|
-
it.each(nonNullSizes)('adds correct class for size %s', (size) => {
|
|
39
|
-
createComponent({ size });
|
|
40
|
-
|
|
41
|
-
expect(wrapper.classes().sort()).toEqual(
|
|
42
|
-
[...DEFAULT_SELECT_CLASSES, `gl-form-select-${size}`].sort()
|
|
43
|
-
);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('does not add a size class if not given the size prop', () => {
|
|
47
|
-
createComponent();
|
|
48
|
-
|
|
49
|
-
expect(wrapper.classes().sort()).toEqual([...DEFAULT_SELECT_CLASSES].sort());
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('does not add a size class if passed null', () => {
|
|
53
|
-
createComponent({ size: null });
|
|
54
|
-
|
|
55
|
-
expect(wrapper.classes().sort()).toEqual([...DEFAULT_SELECT_CLASSES].sort());
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
|
|
59
34
|
describe('width prop', () => {
|
|
60
35
|
// Exclude the default null value
|
|
61
|
-
const
|
|
36
|
+
const nonNullWidths = excludeDefaultNull(formInputWidths);
|
|
62
37
|
|
|
63
|
-
it.each(
|
|
38
|
+
it.each(nonNullWidths)('adds correct class for width %s', (width) => {
|
|
64
39
|
createComponent({ width });
|
|
65
40
|
|
|
66
41
|
expect(wrapper.classes().sort()).toEqual(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { formStateOptions,
|
|
1
|
+
import { formStateOptions, formInputWidths } from '../../../../utils/constants';
|
|
2
2
|
import GlFormSelect from './form_select.vue';
|
|
3
3
|
import { formSelectOptions } from './constants';
|
|
4
4
|
import readme from './form_select.md';
|
|
@@ -11,7 +11,6 @@ const template = `
|
|
|
11
11
|
<gl-form-select
|
|
12
12
|
v-model="selected"
|
|
13
13
|
:width="width"
|
|
14
|
-
:size="size"
|
|
15
14
|
:disabled="disabled"
|
|
16
15
|
:state="state"
|
|
17
16
|
:multiple="multiple"
|
|
@@ -22,7 +21,6 @@ const template = `
|
|
|
22
21
|
|
|
23
22
|
const generateProps = ({
|
|
24
23
|
width = null,
|
|
25
|
-
size = null,
|
|
26
24
|
state = null,
|
|
27
25
|
disabled = false,
|
|
28
26
|
multiple = false,
|
|
@@ -30,7 +28,6 @@ const generateProps = ({
|
|
|
30
28
|
options = formSelectOptions,
|
|
31
29
|
} = {}) => ({
|
|
32
30
|
width,
|
|
33
|
-
size,
|
|
34
31
|
disabled,
|
|
35
32
|
state,
|
|
36
33
|
multiple,
|
|
@@ -80,6 +77,27 @@ WithTruncation.args = generateProps({
|
|
|
80
77
|
],
|
|
81
78
|
});
|
|
82
79
|
|
|
80
|
+
export const Widths = (args, { argTypes }) => ({
|
|
81
|
+
components: { GlFormSelect },
|
|
82
|
+
props: Object.keys(argTypes),
|
|
83
|
+
data() {
|
|
84
|
+
return {
|
|
85
|
+
formInputWidths,
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
template: `
|
|
89
|
+
<div>
|
|
90
|
+
<div v-for="(width, name) in formInputWidths" :key="width" class="gl-mb-4">
|
|
91
|
+
<gl-form-select
|
|
92
|
+
v-model="name"
|
|
93
|
+
:width="width"
|
|
94
|
+
:options="[{ value: name, text: name }]">
|
|
95
|
+
</gl-form-select>
|
|
96
|
+
</div>
|
|
97
|
+
</div>`,
|
|
98
|
+
});
|
|
99
|
+
Widths.args = generateProps();
|
|
100
|
+
|
|
83
101
|
export default {
|
|
84
102
|
title: 'base/form/form-select',
|
|
85
103
|
component: GlFormSelect,
|
|
@@ -93,11 +111,7 @@ export default {
|
|
|
93
111
|
},
|
|
94
112
|
argTypes: {
|
|
95
113
|
width: {
|
|
96
|
-
options:
|
|
97
|
-
control: 'select',
|
|
98
|
-
},
|
|
99
|
-
size: {
|
|
100
|
-
options: formInputSizes,
|
|
114
|
+
options: formInputWidths,
|
|
101
115
|
control: 'select',
|
|
102
116
|
},
|
|
103
117
|
state: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { BFormSelect } from 'bootstrap-vue';
|
|
3
3
|
import isObject from 'lodash/isObject';
|
|
4
|
-
import {
|
|
4
|
+
import { formInputWidths } from '../../../../utils/constants';
|
|
5
5
|
|
|
6
6
|
export default {
|
|
7
7
|
name: 'GlFormSelect',
|
|
@@ -20,49 +20,28 @@ export default {
|
|
|
20
20
|
validator: (value) => {
|
|
21
21
|
const widths = isObject(value) ? Object.values(value) : [value];
|
|
22
22
|
|
|
23
|
-
return widths.every((width) => Object.values(
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
/**
|
|
27
|
-
* ⚠️ DEPRECATED:
|
|
28
|
-
*
|
|
29
|
-
* Will be replaced by the
|
|
30
|
-
* property width
|
|
31
|
-
*
|
|
32
|
-
* Maximum width of the Select
|
|
33
|
-
*/
|
|
34
|
-
size: {
|
|
35
|
-
type: [String, Object],
|
|
36
|
-
required: false,
|
|
37
|
-
default: null,
|
|
38
|
-
validator: (value) => {
|
|
39
|
-
const sizes = isObject(value) ? Object.values(value) : [value];
|
|
40
|
-
|
|
41
|
-
return sizes.every((size) => Object.values(formInputSizes).includes(size));
|
|
23
|
+
return widths.every((width) => Object.values(formInputWidths).includes(width));
|
|
42
24
|
},
|
|
43
25
|
},
|
|
44
26
|
},
|
|
45
27
|
computed: {
|
|
46
|
-
computedWidth() {
|
|
47
|
-
return this.width ? this.width : this.size;
|
|
48
|
-
},
|
|
49
28
|
cssClasses() {
|
|
50
|
-
if (this.
|
|
29
|
+
if (this.width === null) {
|
|
51
30
|
return [];
|
|
52
31
|
}
|
|
53
32
|
|
|
54
|
-
if (isObject(this.
|
|
55
|
-
const { default:
|
|
33
|
+
if (isObject(this.width)) {
|
|
34
|
+
const { default: defaultWidth, ...nonDefaultWidths } = this.width;
|
|
56
35
|
|
|
57
36
|
return [
|
|
58
|
-
...(
|
|
59
|
-
...Object.entries(
|
|
60
|
-
([breakpoint,
|
|
37
|
+
...(defaultWidth ? [`gl-form-select-${defaultWidth}`] : []),
|
|
38
|
+
...Object.entries(nonDefaultWidths).map(
|
|
39
|
+
([breakpoint, width]) => `gl-${breakpoint}-form-select-${width}`
|
|
61
40
|
),
|
|
62
41
|
];
|
|
63
42
|
}
|
|
64
43
|
|
|
65
|
-
return [`gl-form-select-${this.
|
|
44
|
+
return [`gl-form-select-${this.width}`];
|
|
66
45
|
},
|
|
67
46
|
},
|
|
68
47
|
};
|
package/src/scss/utilities.scss
CHANGED
|
@@ -8361,6 +8361,48 @@ $gl-animate-skeleton-loader-max-width: 64 * $grid-size;
|
|
|
8361
8361
|
.gl-text-overflow-ellipsis\! {
|
|
8362
8362
|
text-overflow: ellipsis !important;
|
|
8363
8363
|
}
|
|
8364
|
+
.gl-line-clamp-1 {
|
|
8365
|
+
white-space: normal;
|
|
8366
|
+
-webkit-line-clamp: 1;
|
|
8367
|
+
-webkit-box-orient: vertical;
|
|
8368
|
+
display: -webkit-box;
|
|
8369
|
+
overflow: hidden;
|
|
8370
|
+
}
|
|
8371
|
+
.gl-line-clamp-1\! {
|
|
8372
|
+
white-space: normal !important;
|
|
8373
|
+
-webkit-line-clamp: 1 !important;
|
|
8374
|
+
-webkit-box-orient: vertical !important;
|
|
8375
|
+
display: -webkit-box !important;
|
|
8376
|
+
overflow: hidden !important;
|
|
8377
|
+
}
|
|
8378
|
+
.gl-line-clamp-2 {
|
|
8379
|
+
white-space: normal;
|
|
8380
|
+
-webkit-line-clamp: 2;
|
|
8381
|
+
-webkit-box-orient: vertical;
|
|
8382
|
+
display: -webkit-box;
|
|
8383
|
+
overflow: hidden;
|
|
8384
|
+
}
|
|
8385
|
+
.gl-line-clamp-2\! {
|
|
8386
|
+
white-space: normal !important;
|
|
8387
|
+
-webkit-line-clamp: 2 !important;
|
|
8388
|
+
-webkit-box-orient: vertical !important;
|
|
8389
|
+
display: -webkit-box !important;
|
|
8390
|
+
overflow: hidden !important;
|
|
8391
|
+
}
|
|
8392
|
+
.gl-line-clamp-3 {
|
|
8393
|
+
white-space: normal;
|
|
8394
|
+
-webkit-line-clamp: 3;
|
|
8395
|
+
-webkit-box-orient: vertical;
|
|
8396
|
+
display: -webkit-box;
|
|
8397
|
+
overflow: hidden;
|
|
8398
|
+
}
|
|
8399
|
+
.gl-line-clamp-3\! {
|
|
8400
|
+
white-space: normal !important;
|
|
8401
|
+
-webkit-line-clamp: 3 !important;
|
|
8402
|
+
-webkit-box-orient: vertical !important;
|
|
8403
|
+
display: -webkit-box !important;
|
|
8404
|
+
overflow: hidden !important;
|
|
8405
|
+
}
|
|
8364
8406
|
.gl-text-indent-0 {
|
|
8365
8407
|
text-indent: 0;
|
|
8366
8408
|
}
|
|
@@ -67,6 +67,38 @@
|
|
|
67
67
|
text-overflow: ellipsis;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Line clamp utilities
|
|
72
|
+
*
|
|
73
|
+
* Naming convention: gl-line-clamp-{value}
|
|
74
|
+
*/
|
|
75
|
+
@mixin gl-line-clamp-1 {
|
|
76
|
+
white-space: normal;
|
|
77
|
+
-webkit-line-clamp: 1;
|
|
78
|
+
-webkit-box-orient: vertical;
|
|
79
|
+
// stylelint-disable-next-line value-no-vendor-prefix
|
|
80
|
+
display: -webkit-box;
|
|
81
|
+
overflow: hidden;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@mixin gl-line-clamp-2 {
|
|
85
|
+
white-space: normal;
|
|
86
|
+
-webkit-line-clamp: 2;
|
|
87
|
+
-webkit-box-orient: vertical;
|
|
88
|
+
// stylelint-disable-next-line value-no-vendor-prefix
|
|
89
|
+
display: -webkit-box;
|
|
90
|
+
overflow: hidden;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@mixin gl-line-clamp-3 {
|
|
94
|
+
white-space: normal;
|
|
95
|
+
-webkit-line-clamp: 3;
|
|
96
|
+
-webkit-box-orient: vertical;
|
|
97
|
+
// stylelint-disable-next-line value-no-vendor-prefix
|
|
98
|
+
display: -webkit-box;
|
|
99
|
+
overflow: hidden;
|
|
100
|
+
}
|
|
101
|
+
|
|
70
102
|
/**
|
|
71
103
|
* Text indent utilities
|
|
72
104
|
*
|
package/src/utils/constants.js
CHANGED
|
@@ -144,11 +144,6 @@ export const buttonSizeOptions = {
|
|
|
144
144
|
medium: 'md',
|
|
145
145
|
};
|
|
146
146
|
|
|
147
|
-
export const datepickerSizeOptionsMap = {
|
|
148
|
-
small: 'sm',
|
|
149
|
-
medium: 'md',
|
|
150
|
-
};
|
|
151
|
-
|
|
152
147
|
export const datepickerWidthOptionsMap = {
|
|
153
148
|
sm: 'sm',
|
|
154
149
|
md: 'md',
|
|
@@ -290,7 +285,7 @@ export const keyboard = {
|
|
|
290
285
|
|
|
291
286
|
export const truncateOptions = POSITION;
|
|
292
287
|
|
|
293
|
-
export const
|
|
288
|
+
export const formInputWidths = {
|
|
294
289
|
xs: 'xs',
|
|
295
290
|
sm: 'sm',
|
|
296
291
|
md: 'md',
|