@gitlab/ui 61.3.0 → 62.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 +25 -0
- package/dist/components/base/avatar/avatar.js +36 -1
- package/dist/components/base/daterange_picker/daterange_picker.js +1 -1
- package/dist/components/base/token_selector/token_container.js +1 -1
- package/dist/index.css.map +1 -1
- package/dist/utility_classes.css +1 -1
- package/dist/utility_classes.css.map +1 -1
- package/package.json +2 -2
- package/src/components/base/avatar/avatar.spec.js +32 -0
- package/src/components/base/avatar/avatar.stories.js +16 -0
- package/src/components/base/avatar/avatar.vue +37 -1
- package/src/components/base/daterange_picker/daterange_picker.vue +1 -1
- package/src/components/base/token_selector/token_container.vue +1 -1
- package/src/scss/utilities.scss +0 -72
- package/src/scss/utility-mixins/flex.scss +0 -41
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gitlab/ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "62.1.0",
|
|
4
4
|
"description": "GitLab UI Components",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
"bootstrap": "4.6.2",
|
|
120
120
|
"cypress": "^11.2.0",
|
|
121
121
|
"emoji-regex": "^10.0.0",
|
|
122
|
-
"eslint": "8.
|
|
122
|
+
"eslint": "8.38.0",
|
|
123
123
|
"eslint-import-resolver-jest": "3.0.2",
|
|
124
124
|
"eslint-plugin-cypress": "2.13.2",
|
|
125
125
|
"eslint-plugin-storybook": "0.6.11",
|
|
@@ -56,4 +56,36 @@ describe('GlAvatar', () => {
|
|
|
56
56
|
});
|
|
57
57
|
});
|
|
58
58
|
});
|
|
59
|
+
|
|
60
|
+
describe('fallbackOnError property', () => {
|
|
61
|
+
const findImage = () => wrapper.find('img');
|
|
62
|
+
|
|
63
|
+
beforeEach(() => {
|
|
64
|
+
createWrapper({ fallbackOnError: true, src: 'someproject.jpg' });
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('shows fallback identicon when image fails to load', async () => {
|
|
68
|
+
await findImage().trigger('error');
|
|
69
|
+
|
|
70
|
+
expect(findImage().exists()).toBe(false);
|
|
71
|
+
expect(wrapper.find('.gl-avatar-identicon').exists()).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('emits load-error event when image fails to load', async () => {
|
|
75
|
+
await findImage().trigger('error');
|
|
76
|
+
|
|
77
|
+
expect(wrapper.emitted('load-error')).toHaveLength(1);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('allows changing the source when initially provided image fails to load', async () => {
|
|
81
|
+
await findImage().trigger('error');
|
|
82
|
+
|
|
83
|
+
expect(findImage().exists()).toBe(false);
|
|
84
|
+
|
|
85
|
+
await wrapper.setProps({ src: 'foo.jpg' });
|
|
86
|
+
|
|
87
|
+
expect(findImage().exists()).toBe(true);
|
|
88
|
+
expect(wrapper.find('.gl-avatar-identicon').exists()).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
59
91
|
});
|
|
@@ -104,6 +104,22 @@ export const WithTooltip = (args, { argTypes }) => ({
|
|
|
104
104
|
});
|
|
105
105
|
WithTooltip.args = { ...generateImageProps(), ...generateTooltipProps() };
|
|
106
106
|
|
|
107
|
+
export const FallbackOnAvatarLoadFailure = (args, { argTypes }) => ({
|
|
108
|
+
components,
|
|
109
|
+
props: Object.keys(argTypes),
|
|
110
|
+
template: `
|
|
111
|
+
<gl-avatar
|
|
112
|
+
:entity-name="entityName"
|
|
113
|
+
:entity-id="entityId"
|
|
114
|
+
:size="size"
|
|
115
|
+
:fallback-on-error="true"
|
|
116
|
+
src="someproject.jpg"
|
|
117
|
+
alt="Some Project"
|
|
118
|
+
/>
|
|
119
|
+
`,
|
|
120
|
+
});
|
|
121
|
+
FallbackOnAvatarLoadFailure.args = { ...generateProjectFallbackProps(), ...generateImageProps() };
|
|
122
|
+
|
|
107
123
|
export default {
|
|
108
124
|
title: 'base/avatar',
|
|
109
125
|
component: GlAvatar,
|
|
@@ -24,6 +24,14 @@ export default {
|
|
|
24
24
|
required: false,
|
|
25
25
|
default: '',
|
|
26
26
|
},
|
|
27
|
+
/**
|
|
28
|
+
* Show fallback identicon when image fails to load
|
|
29
|
+
*/
|
|
30
|
+
fallbackOnError: {
|
|
31
|
+
type: Boolean,
|
|
32
|
+
required: false,
|
|
33
|
+
default: false,
|
|
34
|
+
},
|
|
27
35
|
alt: {
|
|
28
36
|
type: String,
|
|
29
37
|
required: false,
|
|
@@ -56,6 +64,11 @@ export default {
|
|
|
56
64
|
default: avatarShapeOptions.circle,
|
|
57
65
|
},
|
|
58
66
|
},
|
|
67
|
+
data() {
|
|
68
|
+
return {
|
|
69
|
+
imageLoadError: false,
|
|
70
|
+
};
|
|
71
|
+
},
|
|
59
72
|
computed: {
|
|
60
73
|
sizeClasses() {
|
|
61
74
|
if (isNumber(this.size)) {
|
|
@@ -85,15 +98,38 @@ export default {
|
|
|
85
98
|
identiconText() {
|
|
86
99
|
return getAvatarChar(this.entityName);
|
|
87
100
|
},
|
|
101
|
+
showImage() {
|
|
102
|
+
// Don't show when image is not present
|
|
103
|
+
if (!this.src) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
// Don't show when fallbackOnError is true and there was failure to load image
|
|
107
|
+
if (this.src && this.fallbackOnError && this.imageLoadError) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
watch: {
|
|
114
|
+
src(newSrc, oldSrc) {
|
|
115
|
+
if (newSrc !== oldSrc) this.imageLoadError = false;
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
methods: {
|
|
119
|
+
handleLoadError(event) {
|
|
120
|
+
this.imageLoadError = true;
|
|
121
|
+
this.$emit('load-error', event);
|
|
122
|
+
},
|
|
88
123
|
},
|
|
89
124
|
};
|
|
90
125
|
</script>
|
|
91
126
|
<template>
|
|
92
127
|
<img
|
|
93
|
-
v-if="
|
|
128
|
+
v-if="showImage"
|
|
94
129
|
:src="src"
|
|
95
130
|
:alt="alt"
|
|
96
131
|
:class="['gl-avatar', { 'gl-avatar-circle': isCircle }, sizeClasses]"
|
|
132
|
+
@error="handleLoadError"
|
|
97
133
|
/>
|
|
98
134
|
<div
|
|
99
135
|
v-else
|
|
@@ -128,7 +128,7 @@ export default {
|
|
|
128
128
|
</script>
|
|
129
129
|
|
|
130
130
|
<template>
|
|
131
|
-
<div class="gl-display-flex gl-flex-
|
|
131
|
+
<div class="gl-display-flex gl-flex-nowrap gl-align-items-flex-start gl-w-full">
|
|
132
132
|
<div
|
|
133
133
|
ref="tokenContainer"
|
|
134
134
|
class="gl-display-flex gl-flex-wrap gl-align-items-center gl-my-n1 gl-mx-n1 gl-w-full"
|
package/src/scss/utilities.scss
CHANGED
|
@@ -3387,78 +3387,6 @@
|
|
|
3387
3387
|
}
|
|
3388
3388
|
}
|
|
3389
3389
|
|
|
3390
|
-
.gl-flex-wrap-wrap {
|
|
3391
|
-
flex-wrap: wrap;
|
|
3392
|
-
}
|
|
3393
|
-
|
|
3394
|
-
.gl-flex-wrap-wrap\! {
|
|
3395
|
-
flex-wrap: wrap !important;
|
|
3396
|
-
}
|
|
3397
|
-
|
|
3398
|
-
.gl-lg-flex-wrap-wrap {
|
|
3399
|
-
@include gl-media-breakpoint-up(lg) {
|
|
3400
|
-
flex-wrap: wrap;
|
|
3401
|
-
}
|
|
3402
|
-
}
|
|
3403
|
-
|
|
3404
|
-
.gl-lg-flex-wrap-wrap\! {
|
|
3405
|
-
@include gl-media-breakpoint-up(lg) {
|
|
3406
|
-
flex-wrap: wrap !important;
|
|
3407
|
-
}
|
|
3408
|
-
}
|
|
3409
|
-
|
|
3410
|
-
.gl-xl-flex-wrap-wrap {
|
|
3411
|
-
@include gl-media-breakpoint-up(xl) {
|
|
3412
|
-
flex-wrap: wrap;
|
|
3413
|
-
}
|
|
3414
|
-
}
|
|
3415
|
-
|
|
3416
|
-
.gl-xl-flex-wrap-wrap\! {
|
|
3417
|
-
@include gl-media-breakpoint-up(xl) {
|
|
3418
|
-
flex-wrap: wrap !important;
|
|
3419
|
-
}
|
|
3420
|
-
}
|
|
3421
|
-
|
|
3422
|
-
.gl-sm-flex-wrap-wrap {
|
|
3423
|
-
@include gl-media-breakpoint-up(sm) {
|
|
3424
|
-
flex-wrap: wrap;
|
|
3425
|
-
}
|
|
3426
|
-
}
|
|
3427
|
-
|
|
3428
|
-
.gl-sm-flex-wrap-wrap\! {
|
|
3429
|
-
@include gl-media-breakpoint-up(sm) {
|
|
3430
|
-
flex-wrap: wrap !important;
|
|
3431
|
-
}
|
|
3432
|
-
}
|
|
3433
|
-
|
|
3434
|
-
.gl-flex-wrap-wrap-reverse {
|
|
3435
|
-
flex-wrap: wrap-reverse;
|
|
3436
|
-
}
|
|
3437
|
-
|
|
3438
|
-
.gl-flex-wrap-wrap-reverse\! {
|
|
3439
|
-
flex-wrap: wrap-reverse !important;
|
|
3440
|
-
}
|
|
3441
|
-
|
|
3442
|
-
.gl-flex-wrap-nowrap {
|
|
3443
|
-
flex-wrap: nowrap;
|
|
3444
|
-
}
|
|
3445
|
-
|
|
3446
|
-
.gl-flex-wrap-nowrap\! {
|
|
3447
|
-
flex-wrap: nowrap !important;
|
|
3448
|
-
}
|
|
3449
|
-
|
|
3450
|
-
.gl-sm-flex-wrap-nowrap {
|
|
3451
|
-
@include gl-media-breakpoint-up(sm) {
|
|
3452
|
-
flex-wrap: nowrap;
|
|
3453
|
-
}
|
|
3454
|
-
}
|
|
3455
|
-
|
|
3456
|
-
.gl-sm-flex-wrap-nowrap\! {
|
|
3457
|
-
@include gl-media-breakpoint-up(sm) {
|
|
3458
|
-
flex-wrap: nowrap !important;
|
|
3459
|
-
}
|
|
3460
|
-
}
|
|
3461
|
-
|
|
3462
3390
|
.gl-flex-direction-column {
|
|
3463
3391
|
flex-direction: column;
|
|
3464
3392
|
}
|
|
@@ -101,47 +101,6 @@
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
/**
|
|
105
|
-
* `gl-*flex-wrap-wrap` is deprecated; use `gl-*flex-wrap` instead.
|
|
106
|
-
* TODO: delete `gl-*flex-wrap-wrap` utilities classes, see
|
|
107
|
-
* https://gitlab.com/gitlab-org/gitlab-ui/-/issues/2204
|
|
108
|
-
*/
|
|
109
|
-
@mixin gl-flex-wrap-wrap {
|
|
110
|
-
flex-wrap: wrap;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
@mixin gl-lg-flex-wrap-wrap {
|
|
114
|
-
@include gl-media-breakpoint-up(lg) {
|
|
115
|
-
@include gl-flex-wrap-wrap;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
@mixin gl-xl-flex-wrap-wrap {
|
|
120
|
-
@include gl-media-breakpoint-up(xl) {
|
|
121
|
-
@include gl-flex-wrap-wrap;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
@mixin gl-sm-flex-wrap-wrap {
|
|
126
|
-
@include gl-media-breakpoint-up(sm) {
|
|
127
|
-
@include gl-flex-wrap-wrap;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
@mixin gl-flex-wrap-wrap-reverse {
|
|
132
|
-
flex-wrap: wrap-reverse;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
@mixin gl-flex-wrap-nowrap {
|
|
136
|
-
flex-wrap: nowrap;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
@mixin gl-sm-flex-wrap-nowrap {
|
|
140
|
-
@include gl-media-breakpoint-up(sm) {
|
|
141
|
-
@include gl-flex-wrap-nowrap;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
104
|
@mixin gl-flex-direction-column {
|
|
146
105
|
flex-direction: column;
|
|
147
106
|
}
|