mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-24 17:32:15 +00:00
HXPMNT-542 display email for people (#10622)
This commit is contained in:
@@ -18,7 +18,6 @@
|
|||||||
import { FullNamePipe } from './full-name.pipe';
|
import { FullNamePipe } from './full-name.pipe';
|
||||||
|
|
||||||
describe('FullNamePipe', () => {
|
describe('FullNamePipe', () => {
|
||||||
|
|
||||||
let pipe: FullNamePipe;
|
let pipe: FullNamePipe;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
@@ -31,27 +30,32 @@ describe('FullNamePipe', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should return only firstName as fullName when there is no lastName ', () => {
|
it('should return only firstName as fullName when there is no lastName ', () => {
|
||||||
const user = {firstName : 'Abc'};
|
const user = { firstName: 'Abc' };
|
||||||
expect(pipe.transform(user)).toBe('Abc');
|
expect(pipe.transform(user)).toBe('Abc');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return only lastName as fullName when there is no firstName ', () => {
|
it('should return only lastName as fullName when there is no firstName ', () => {
|
||||||
const user = {lastName : 'Xyz'};
|
const user = { lastName: 'Xyz' };
|
||||||
expect(pipe.transform(user)).toBe('Xyz');
|
expect(pipe.transform(user)).toBe('Xyz');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return fullName when firstName and lastName are available', () => {
|
it('should return fullName when firstName and lastName are available', () => {
|
||||||
const user = {firstName : 'Abc', lastName : 'Xyz'};
|
const user = { firstName: 'Abc', lastName: 'Xyz' };
|
||||||
expect(pipe.transform(user)).toBe('Abc Xyz');
|
expect(pipe.transform(user)).toBe('Abc Xyz');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return username when firstName and lastName are not available', () => {
|
it('should return username when firstName and lastName are not available', () => {
|
||||||
const user = {firstName : '', lastName : '', username: 'username'};
|
const user = { firstName: '', lastName: '', username: 'username' };
|
||||||
expect(pipe.transform(user)).toBe('username');
|
expect(pipe.transform(user)).toBe('username');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return user eamil when firstName, lastName and username are not available', () => {
|
it('should return user eamil when firstName, lastName and username are not available', () => {
|
||||||
const user = {firstName : '', lastName : '', username: '', email: 'abcXyz@gmail.com'};
|
const user = { firstName: '', lastName: '', username: '', email: 'abcXyz@gmail.com' };
|
||||||
expect(pipe.transform(user)).toBe('abcXyz@gmail.com');
|
expect(pipe.transform(user)).toBe('abcXyz@gmail.com');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should display email and fullName if emailDisplayed param is true', () => {
|
||||||
|
const user = { firstName: 'John', lastName: 'Doe', username: '', email: 'abcXyz@gmail.com' };
|
||||||
|
expect(pipe.transform(user, true)).toBe('John Doe <abcXyz@gmail.com>');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -23,8 +23,9 @@ import { UserLike } from './user-like.interface';
|
|||||||
standalone: true
|
standalone: true
|
||||||
})
|
})
|
||||||
export class FullNamePipe implements PipeTransform {
|
export class FullNamePipe implements PipeTransform {
|
||||||
transform(user: UserLike): string {
|
transform(user: UserLike, emailDisplayed?: boolean): string {
|
||||||
return this.buildFullName(user) ? this.buildFullName(user) : this.buildFromUsernameOrEmail(user);
|
const fullName = this.buildFullName(user) ? this.buildFullName(user) : this.buildFromUsernameOrEmail(user);
|
||||||
|
return `${fullName} ${emailDisplayed ? '<' + user?.email + '>' : ''}`.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
buildFullName(user: UserLike): string {
|
buildFullName(user: UserLike): string {
|
||||||
|
@@ -11,22 +11,24 @@
|
|||||||
<mat-chip-grid #userMultipleChipList data-automation-id="adf-cloud-people-chip-list">
|
<mat-chip-grid #userMultipleChipList data-automation-id="adf-cloud-people-chip-list">
|
||||||
<mat-chip-row
|
<mat-chip-row
|
||||||
*ngFor="let user of selectedUsers"
|
*ngFor="let user of selectedUsers"
|
||||||
[removable]="!(user.readonly)"
|
[removable]="!user.readonly"
|
||||||
[attr.data-automation-id]="'adf-people-cloud-chip-' + user.username"
|
[attr.data-automation-id]="'adf-people-cloud-chip-' + user.username"
|
||||||
(removed)="onRemove(user)"
|
(removed)="onRemove(user)"
|
||||||
[disabled]="isReadonly() || isValidationLoading()"
|
[disabled]="isReadonly() || isValidationLoading()"
|
||||||
title="{{ (user.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}"
|
title="{{ (user.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}"
|
||||||
[matTooltip]="showFullNameOnHover ? (user | fullName) : ''"
|
[matTooltip]="showFullNameOnHover ? (user | fullName : true) : user.email"
|
||||||
>
|
>
|
||||||
{{user | fullName}}
|
{{ user | fullName }}
|
||||||
<mat-icon
|
<mat-icon
|
||||||
matChipRemove
|
matChipRemove
|
||||||
*ngIf="!(user.readonly || readOnly)"
|
*ngIf="!(user.readonly || readOnly)"
|
||||||
[attr.data-automation-id]="'adf-people-cloud-chip-remove-icon-' + user.username">
|
[attr.data-automation-id]="'adf-people-cloud-chip-remove-icon-' + user.username"
|
||||||
|
>
|
||||||
cancel
|
cancel
|
||||||
</mat-icon>
|
</mat-icon>
|
||||||
</mat-chip-row>
|
</mat-chip-row>
|
||||||
<input matInput
|
<input
|
||||||
|
matInput
|
||||||
[disabled]="isReadonly()"
|
[disabled]="isReadonly()"
|
||||||
[formControl]="searchUserCtrl"
|
[formControl]="searchUserCtrl"
|
||||||
[matAutocomplete]="auto"
|
[matAutocomplete]="auto"
|
||||||
@@ -38,27 +40,31 @@
|
|||||||
class="adf-cloud-input"
|
class="adf-cloud-input"
|
||||||
data-automation-id="adf-people-cloud-search-input"
|
data-automation-id="adf-people-cloud-search-input"
|
||||||
#userInput
|
#userInput
|
||||||
>
|
/>
|
||||||
</mat-chip-grid>
|
</mat-chip-grid>
|
||||||
|
|
||||||
<mat-autocomplete autoActiveFirstOption class="adf-people-cloud-list"
|
<mat-autocomplete
|
||||||
|
autoActiveFirstOption
|
||||||
|
class="adf-people-cloud-list"
|
||||||
#auto="matAutocomplete"
|
#auto="matAutocomplete"
|
||||||
(optionSelected)="onSelect($event.option.value)"
|
(optionSelected)="onSelect($event.option.value)"
|
||||||
[displayWith]="getDisplayName">
|
[displayWith]="getDisplayName"
|
||||||
<ng-container *ngIf="(searchUsers$ | async)?.length else noResults" >
|
>
|
||||||
<mat-option *ngFor="let user of searchUsers$ | async; let i = index" [value]="user"
|
<ng-container *ngIf="(searchUsers$ | async)?.length; else noResults">
|
||||||
class="adf-people-cloud-option-active">
|
<mat-option *ngFor="let user of searchUsers$ | async; let i = index" [value]="user" class="adf-people-cloud-option-active">
|
||||||
<div class="adf-people-cloud-row" id="adf-people-cloud-user-{{user.username}}"
|
<div class="adf-people-cloud-row" id="adf-people-cloud-user-{{ user.username }}" data-automation-id="adf-people-cloud-row">
|
||||||
data-automation-id="adf-people-cloud-row">
|
<div [outerHTML]="user | usernameInitials : 'adf-people-cloud-pic'"></div>
|
||||||
<div [outerHTML]="user | usernameInitials:'adf-people-cloud-pic'"></div>
|
<span class="adf-people-label-name"> {{ user | fullName : true }}</span>
|
||||||
<span class="adf-people-label-name"> {{user | fullName}}</span>
|
|
||||||
</div>
|
</div>
|
||||||
</mat-option>
|
</mat-option>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-template #noResults>
|
<ng-template #noResults>
|
||||||
<mat-option *ngIf="searchUserCtrl.hasError('searchTypingError') && !searchLoading" disabled
|
<mat-option
|
||||||
|
*ngIf="searchUserCtrl.hasError('searchTypingError') && !searchLoading"
|
||||||
|
disabled
|
||||||
class="adf-people-cloud-option-not-active"
|
class="adf-people-cloud-option-not-active"
|
||||||
data-automation-id="adf-people-cloud-no-results">
|
data-automation-id="adf-people-cloud-no-results"
|
||||||
|
>
|
||||||
<span> {{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</span>
|
<span> {{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</span>
|
||||||
</mat-option>
|
</mat-option>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
@@ -70,29 +76,40 @@
|
|||||||
<div class="adf-error-container" *ngIf="showErrors">
|
<div class="adf-error-container" *ngIf="showErrors">
|
||||||
<mat-error *ngIf="hasPreselectError() && !isValidationLoading()" [@transitionMessages]="subscriptAnimationState" class="adf-error">
|
<mat-error *ngIf="hasPreselectError() && !isValidationLoading()" [@transitionMessages]="subscriptAnimationState" class="adf-error">
|
||||||
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
||||||
<div class="adf-error-text">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName : validateUsersMessage } }}</div>
|
<div class="adf-error-text">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: validateUsersMessage } }}</div>
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="searchUserCtrl.hasError('pattern')" [@transitionMessages]="subscriptAnimationState" class="adf-error">
|
<mat-error *ngIf="searchUserCtrl.hasError('pattern')" [@transitionMessages]="subscriptAnimationState" class="adf-error">
|
||||||
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
||||||
<div class="adf-error-text">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate: { pattern: getValidationPattern() } }}</div>
|
<div class="adf-error-text">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate : { pattern: getValidationPattern() } }}</div>
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="searchUserCtrl.hasError('maxlength')" [@transitionMessages]="subscriptAnimationState" class="adf-error">
|
<mat-error *ngIf="searchUserCtrl.hasError('maxlength')" [@transitionMessages]="subscriptAnimationState" class="adf-error">
|
||||||
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
||||||
<div class="adf-error-text">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate: { requiredLength: getValidationMaxLength() } }}</div>
|
<div class="adf-error-text">
|
||||||
|
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate : { requiredLength: getValidationMaxLength() } }}
|
||||||
|
</div>
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="searchUserCtrl.hasError('minlength')" [@transitionMessages]="subscriptAnimationState" class="adf-error">
|
<mat-error *ngIf="searchUserCtrl.hasError('minlength')" [@transitionMessages]="subscriptAnimationState" class="adf-error">
|
||||||
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
||||||
<div class="adf-error-text">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate: { requiredLength: getValidationMinLength() } }}</div>
|
<div class="adf-error-text">
|
||||||
|
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate : { requiredLength: getValidationMinLength() } }}
|
||||||
|
</div>
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="(searchUserCtrl.hasError('required') || userChipsCtrl.hasError('required')) && isDirty()"
|
<mat-error
|
||||||
[@transitionMessages]="subscriptAnimationState" class="adf-error">
|
*ngIf="(searchUserCtrl.hasError('required') || userChipsCtrl.hasError('required')) && isDirty()"
|
||||||
|
[@transitionMessages]="subscriptAnimationState"
|
||||||
|
class="adf-error"
|
||||||
|
>
|
||||||
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
||||||
<div class="adf-error-text">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}</div>
|
<div class="adf-error-text">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}</div>
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="searchUserCtrl.hasError('searchTypingError') && !this.isFocused"
|
<mat-error
|
||||||
[@transitionMessages]="subscriptAnimationState" data-automation-id="invalid-users-typing-error" class="adf-error">
|
*ngIf="searchUserCtrl.hasError('searchTypingError') && !this.isFocused"
|
||||||
|
[@transitionMessages]="subscriptAnimationState"
|
||||||
|
data-automation-id="invalid-users-typing-error"
|
||||||
|
class="adf-error"
|
||||||
|
>
|
||||||
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
<mat-icon class="adf-error-icon">error_outline</mat-icon>
|
||||||
<div class="adf-error-text">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName : searchedValue } }}</div>
|
<div class="adf-error-text">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</div>
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
Reference in New Issue
Block a user