BigW Consortium Gitlab
Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gitlab-ce
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Forest Godfrey
gitlab-ce
Commits
bc3195da
Commit
bc3195da
authored
Oct 16, 2017
by
Eric Eastwood
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add lazy option to UserAvatarImage
parent
b3f74903
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
78 additions
and
28 deletions
+78
-28
user_avatar_image.vue
...s/vue_shared/components/user_avatar/user_avatar_image.vue
+23
-8
add-lazy-option-to-user-avatar-image-component.yml
...leased/add-lazy-option-to-user-avatar-image-component.yml
+5
-0
user_avatar_image_spec.js
...e_shared/components/user_avatar/user_avatar_image_spec.js
+50
-20
No files found.
app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image.vue
View file @
bc3195da
...
...
@@ -7,6 +7,7 @@
Sample configuration:
<user-avatar-image
:lazy="true"
:img-src="userAvatarSrc"
:img-alt="tooltipText"
:tooltip-text="tooltipText"
...
...
@@ -16,11 +17,17 @@
*/
import
defaultAvatarUrl
from
'images/no_avatar.png'
;
import
{
placeholderImage
}
from
'../../../lazy_loader'
;
import
tooltip
from
'../../directives/tooltip'
;
export
default
{
name
:
'UserAvatarImage'
,
props
:
{
lazy
:
{
type
:
Boolean
,
required
:
false
,
default
:
false
,
},
imgSrc
:
{
type
:
String
,
required
:
false
,
...
...
@@ -56,18 +63,21 @@ export default {
tooltip
,
},
computed
:
{
// API response sends null when gravatar is disabled and
// we provide an empty string when we use it inside user avatar link.
// In both cases we should render the defaultAvatarUrl
sanitizedSource
()
{
return
this
.
imgSrc
===
''
||
this
.
imgSrc
===
null
?
defaultAvatarUrl
:
this
.
imgSrc
;
},
resultantSrcAttribute
()
{
return
this
.
lazy
?
placeholderImage
:
this
.
sanitizedSource
;
},
tooltipContainer
()
{
return
this
.
tooltipText
?
'body'
:
null
;
},
avatarSizeClass
()
{
return
`s
${
this
.
size
}
`
;
},
// API response sends null when gravatar is disabled and
// we provide an empty string when we use it inside user avatar link.
// In both cases we should render the defaultAvatarUrl
imageSource
()
{
return
this
.
imgSrc
===
''
||
this
.
imgSrc
===
null
?
defaultAvatarUrl
:
this
.
imgSrc
;
},
},
};
</
script
>
...
...
@@ -76,11 +86,16 @@ export default {
<img
v-tooltip
class=
"avatar"
:class=
"[avatarSizeClass, cssClasses]"
:src=
"imageSource"
:class=
"
{
lazy,
[avatarSizeClass]: true,
[cssClasses]: true
}"
:src="resultantSrcAttribute"
:width="size"
:height="size"
:alt="imgAlt"
:data-src="sanitizedSource"
:data-container="tooltipContainer"
:data-placement="tooltipPlacement"
:title="tooltipText"
...
...
changelogs/unreleased/add-lazy-option-to-user-avatar-image-component.yml
0 → 100644
View file @
bc3195da
---
title
:
Add lazy option to UserAvatarImage
merge_request
:
14895
author
:
type
:
changed
spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js
View file @
bc3195da
import
Vue
from
'vue'
;
import
UserAvatarImage
from
'~/vue_shared/components/user_avatar/user_avatar_image.vue'
;
import
{
placeholderImage
}
from
'~/lazy_loader'
;
import
userAvatarImage
from
'~/vue_shared/components/user_avatar/user_avatar_image.vue'
;
import
mountComponent
from
'../../../helpers/vue_mount_component_helper'
;
const
UserAvatarImageComponent
=
Vue
.
extend
(
UserAvatarImage
);
const
DEFAULT_PROPS
=
{
size
:
99
,
imgSrc
:
'myavatarurl.com'
,
imgAlt
:
'mydisplayname'
,
cssClasses
:
'myextraavatarclass'
,
tooltipText
:
'tooltip text'
,
tooltipPlacement
:
'bottom'
,
};
describe
(
'User Avatar Image Component'
,
function
()
{
let
vm
;
let
UserAvatarImage
;
beforeEach
(()
=>
{
UserAvatarImage
=
Vue
.
extend
(
userAvatarImage
);
});
describe
(
'Initialization'
,
function
()
{
beforeEach
(
function
()
{
this
.
propsData
=
{
size
:
99
,
imgSrc
:
'myavatarurl.com'
,
imgAlt
:
'mydisplayname'
,
cssClasses
:
'myextraavatarclass'
,
tooltipText
:
'tooltip text'
,
tooltipPlacement
:
'bottom'
,
};
this
.
userAvatarImage
=
new
UserAvatarImageComponent
({
propsData
:
this
.
propsData
,
vm
=
mountComponent
(
UserAvatarImage
,
{
...
DEFAULT_PROPS
,
}).
$mount
();
});
it
(
'should return a defined Vue component'
,
function
()
{
expect
(
this
.
userAvatarImage
).
toBeDefined
();
expect
(
vm
).
toBeDefined
();
});
it
(
'should have <img> as a child element'
,
function
()
{
expect
(
this
.
userAvatarImage
.
$el
.
tagName
).
toBe
(
'IMG'
);
expect
(
vm
.
$el
.
tagName
).
toBe
(
'IMG'
);
expect
(
vm
.
$el
.
getAttribute
(
'src'
)).
toBe
(
DEFAULT_PROPS
.
imgSrc
);
expect
(
vm
.
$el
.
getAttribute
(
'data-src'
)).
toBe
(
DEFAULT_PROPS
.
imgSrc
);
expect
(
vm
.
$el
.
getAttribute
(
'alt'
)).
toBe
(
DEFAULT_PROPS
.
imgAlt
);
});
it
(
'should properly compute tooltipContainer'
,
function
()
{
expect
(
this
.
userAvatarImage
.
tooltipContainer
).
toBe
(
'body'
);
expect
(
vm
.
tooltipContainer
).
toBe
(
'body'
);
});
it
(
'should properly render tooltipContainer'
,
function
()
{
expect
(
this
.
userAvatarImage
.
$el
.
getAttribute
(
'data-container'
)).
toBe
(
'body'
);
expect
(
vm
.
$el
.
getAttribute
(
'data-container'
)).
toBe
(
'body'
);
});
it
(
'should properly compute avatarSizeClass'
,
function
()
{
expect
(
this
.
userAvatarImage
.
avatarSizeClass
).
toBe
(
's99'
);
expect
(
vm
.
avatarSizeClass
).
toBe
(
's99'
);
});
it
(
'should properly render img css'
,
function
()
{
const
classList
=
this
.
userAvatarImage
.
$el
.
classList
;
const
classList
=
vm
.
$el
.
classList
;
const
containsAvatar
=
classList
.
contains
(
'avatar'
);
const
containsSizeClass
=
classList
.
contains
(
's99'
);
const
containsCustomClass
=
classList
.
contains
(
'myextraavatarclass'
);
const
containsCustomClass
=
classList
.
contains
(
DEFAULT_PROPS
.
cssClasses
);
const
lazyClass
=
classList
.
contains
(
'lazy'
);
expect
(
containsAvatar
).
toBe
(
true
);
expect
(
containsSizeClass
).
toBe
(
true
);
expect
(
containsCustomClass
).
toBe
(
true
);
expect
(
lazyClass
).
toBe
(
false
);
});
});
describe
(
'Initialization when lazy'
,
function
()
{
beforeEach
(
function
()
{
vm
=
mountComponent
(
UserAvatarImage
,
{
...
DEFAULT_PROPS
,
lazy
:
true
,
}).
$mount
();
});
it
(
'should add lazy attributes'
,
function
()
{
const
classList
=
vm
.
$el
.
classList
;
const
lazyClass
=
classList
.
contains
(
'lazy'
);
expect
(
lazyClass
).
toBe
(
true
);
expect
(
vm
.
$el
.
getAttribute
(
'src'
)).
toBe
(
placeholderImage
);
expect
(
vm
.
$el
.
getAttribute
(
'data-src'
)).
toBe
(
DEFAULT_PROPS
.
imgSrc
);
});
});
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment