Skip to content
This repository has been archived by the owner on May 24, 2024. It is now read-only.

[terra-avatar] Changed fallback to initials from user icon for avatar #2621

Merged
merged 21 commits into from
Mar 28, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
9b6a5d4
Changed fallback to initials for avatar
supreethmr Sep 3, 2019
9382491
Merge branch 'master' into Added_Initial_fallback
supreethmr Sep 5, 2019
3e9cb4c
Merge branch 'master' into Added_Initial_fallback
supreethmr Sep 9, 2019
565f141
changes of Code review comment
supreethmr Sep 10, 2019
706b591
Made Initials as Required Prop
supreethmr Sep 16, 2019
84c6038
Merge branch 'master' into Added_Initial_fallback
supreethmr Sep 19, 2019
32352b5
Merge branch 'master' into Added_Initial_fallback
supreethmr Sep 20, 2019
9a25680
added role to initials so that screen reader reads the both intials a…
supreethmr Sep 26, 2019
197e280
Merge branch 'master' into Added_Initial_fallback
supreethmr Sep 26, 2019
919d7f4
Merge branch 'master' into Added_Initial_fallback
supreethmr Sep 27, 2019
4698f86
screenshot update
supreethmr Sep 27, 2019
64b7c72
Update packages/terra-avatar/docs/avatar.md
supreethmr Oct 15, 2019
e7b8744
removed obselete snapshots
supreethmr Oct 16, 2019
ce1f8fe
Removing Tests which were not required with new changes
supreethmr Oct 16, 2019
d8098a5
Merge branch 'master' into Added_Initial_fallback
ryanthemanuel Oct 28, 2019
87fde47
Merge branch 'master' into Added_Initial_fallback
supreethmr Nov 4, 2019
9c50d3a
Update CONTRIBUTORS.md
jeremyfuksa Nov 4, 2019
05df907
Merge remote-tracking branch 'origin/master' into Added_Initial_fallback
rm012685 Mar 27, 2020
21fdee0
Merge branch 'master' into Added_Initial_fallback
ryanthemanuel Mar 27, 2020
be42bf4
Merge branch 'master' into Added_Initial_fallback
ryanthemanuel Mar 28, 2020
900a3fd
Fix tests
rm012685 Mar 28, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/terra-avatar/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ ChangeLog

Unreleased
----------
### Changed
* Changed generateImage function to Fallback to Initials if Provided.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe saying 'Changed the load behavior such that if the image fails to load and initials are provided, the avatar falls back to the initials display.' is more clear to a consumer.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated here


2.25.0 - (August 21, 2019)
------------------
Expand Down
12 changes: 8 additions & 4 deletions packages/terra-avatar/src/common/AvatarUtils.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,21 @@ const getColorVariant = (hashValue) => {
/**
* Render placeholder.
*/
const generateImagePlaceholder = (alt, isAriaHidden, variant) => {
const avatarIconClassNames = cx(['icon', variant]);
const generateImagePlaceholder = (alt, isAriaHidden, variant, initials) => {
if (initials && initials.length <= 2) {
const avatarTextClassNames = cx('initials');
return <span className={avatarTextClassNames} alt={alt} aria-label={alt} aria-hidden={isAriaHidden}>{initials.toUpperCase()}</span>;
}

const avatarIconClassNames = cx(['icon', variant]);
return <span className={avatarIconClassNames} role="img" aria-label={alt} alt={alt} aria-hidden={isAriaHidden} />;
};

/**
* Render image with placeholder.
*/
const generateImage = (image, alt, isAriaHidden, variant, handleFallback) => {
const icon = generateImagePlaceholder(alt, isAriaHidden, variant);
const generateImage = (image, alt, isAriaHidden, variant, handleFallback, initials) => {
const icon = generateImagePlaceholder(alt, isAriaHidden, variant, initials);
return <TerraImage className={cx('image')} src={image} placeholder={icon} alt={alt} onError={handleFallback} fit="cover" />;
};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import React from 'react';
import Avatar from '../../../../index';

export default () => <Avatar image="invalid-image-url" initials="JD" alt="User" id="invalid-image-avatar" />;
4 changes: 2 additions & 2 deletions packages/terra-avatar/src/variants/Avatar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ class Avatar extends React.Component {
let avatarContent;

if (image) {
avatarContent = generateImage(image, alt, isAriaHidden, AVATAR_VARIANTS.USER, this.handleFallback);
} else if (initials && (initials.length === 1 || initials.length === 2)) {
avatarContent = generateImage(image, alt, isAriaHidden, AVATAR_VARIANTS.USER, this.handleFallback, initials);
} else if (initials && initials.length <= 2) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just curious, could these redundant checks be probably avoided if the default value of initials is set to an empty string instead of undefined and if the length of the initials prop is custom-validated during datatype validation?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant checks have been removed and validating this only at generateImagePlaceholder function : here

const avatarTextClassNames = cx('initials');
avatarContent = <span className={avatarTextClassNames} alt={alt} aria-label={alt} aria-hidden={isAriaHidden}>{initials.toUpperCase()}</span>;
} else {
Expand Down
8 changes: 7 additions & 1 deletion packages/terra-avatar/tests/jest/Avatar.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,13 @@ describe('Avatar', () => {
expect(wrapper).toMatchSnapshot();
});

it('should render fallback user avatar when invalid image is passed in', () => {
it('should render fallback initials when invalid image is passed in with initials', () => {
const avatar = <Avatar image="https://path/to/invalid_image.jpg" initials="JD" alt="placeholder" />;
const wrapper = render(avatar);
expect(wrapper).toMatchSnapshot();
});

it('should render fallback user avatar when invalid image is passed in without initials', () => {
const avatar = <Avatar image="https://path/to/invalid_image.jpg" alt="placeholder" />;
const wrapper = render(avatar);
expect(wrapper).toMatchSnapshot();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,35 @@ exports[`Avatar should render an isDeceased avatar 1`] = `
</div>
`;

exports[`Avatar should render fallback user avatar when invalid image is passed in 1`] = `
exports[`Avatar should render fallback initials when invalid image is passed in with initials 1`] = `
<div
class="avatar five image"
>
<div>
<div
class="hidden"
>
<img
alt="placeholder"
class="image cover default image"
src="https://path/to/invalid_image.jpg"
/>
</div>
<div>
<span
alt="placeholder"
aria-hidden="false"
aria-label="placeholder"
class="initials"
>
JD
</span>
</div>
</div>
</div>
`;

exports[`Avatar should render fallback user avatar when invalid image is passed in without initials 1`] = `
<div
class="avatar five image"
>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 8 additions & 2 deletions packages/terra-avatar/tests/wdio/avatar-common-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,14 @@ Terra.describeViewports('Avatar', ['huge'], () => {
Terra.it.matchesScreenshot({ selector: '#image-avatar' });
});

describe('Invalid Image Avatar', () => {
before(() => browser.url('/#/raw/tests/terra-avatar/avatar/avatar/invalid-image-avatar'));
describe('Invalid Image Avatar With Initials', () => {
before(() => browser.url('/#/raw/tests/terra-avatar/avatar/avatar/invalid-image-avatar-with-initials'));

Terra.it.validatesElement({ selector: '#invalid-image-avatar' });
});

describe('Invalid Image Avatar Without Initials', () => {
before(() => browser.url('/#/raw/tests/terra-avatar/avatar/avatar/invalid-image-avatar-without-initials'));

Terra.it.validatesElement({ selector: '#invalid-image-avatar' });
});
Expand Down