Subtle border on invalid emails inputs (in invitation dialog)

* Mutli auto compolete component extended
This commit is contained in:
Kristian Ntavidi 2021-07-21 12:16:22 +03:00
parent 7ab5c56072
commit a212f4e5a1
5 changed files with 40 additions and 2 deletions

View File

@ -36,4 +36,6 @@ export interface MultipleAutoCompleteConfiguration {
autoSelectFirstOptionOnBlur?: boolean;
appendClassToItem?: {class: string, applyFunc: (item:any) => boolean}[];
}

View File

@ -1,7 +1,7 @@
<div class="row multiple-auto-complete" ngForm>
<mat-chip-list #chipList ngDefaultControl>
<ng-container *ngIf="value as values">
<mat-chip *ngFor="let value of values" [disabled]="disabled" [selectable]="selectable" [removable]="removable">
<mat-chip *ngFor="let value of values" [disabled]="disabled" [selectable]="selectable" [removable]="removable" [ngClass]="computeClass(value)">
<ng-container *ngIf="_selectedItems.get(stringify(value)) as selectedItem">
<ng-template #cellTemplate *ngIf="_selectedValueTemplate(selectedItem)" [ngTemplateOutlet]="_selectedValueTemplate(selectedItem)" [ngTemplateOutletContext]="{ item: selectedItem }"></ng-template>
<div *ngIf="!_selectedValueTemplate(selectedItem)">{{_displayFn(selectedItem)}}</div>

View File

@ -365,6 +365,9 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp
get popupItemActionIcon(): string {
return this.configuration.popupItemActionIcon != null ? this.configuration.popupItemActionIcon : '';
}
get appendClassToItem(): {class: string, applyFunc: (item: any) => boolean}[]{
return this.configuration.appendClassToItem !== null ? this.configuration.appendClassToItem : null;
}
//Chip Functions
_addItem(event: MatChipInputEvent): void {
@ -400,4 +403,19 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp
if (event != null) { event.stopPropagation(); }
this.optionActionClicked.emit(item);
}
private readonly empyObj = {};
computeClass(value: any){
if(!(this.appendClassToItem && this.appendClassToItem.length)){
return this.empyObj;
}
const classes = this.appendClassToItem.filter(e=> e.applyFunc(value));
return classes.reduce((r, current) => {
r[current.class] = true;
return r;
} , {});
}
}

View File

@ -121,3 +121,15 @@
background: #129d99;
color: #ffffff;
}
@keyframes blink{
0% {border: 1px solid rgba(255, 0, 0, 0.2);}
50% {border: 1px solid rgba(255, 0, 0, 0.5);}
100% {border: 1px solid rgba(255, 0, 0, 0.2);}
}
:host ::ng-deep .invalid-email{
border: 1px solid red;
// animation: blink 1.4s infinite;
// animation-fill-mode: both;
}

View File

@ -69,7 +69,13 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni
const result = typeof(item) === 'string' ? item : item.email;
return result;
},
autoSelectFirstOptionOnBlur: true
autoSelectFirstOptionOnBlur: true,
appendClassToItem: [{class: 'invalid-email', applyFunc: (item)=> {
const val = typeof(item) === 'string'? item : item.email;
const regexp = new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/);
return !regexp.test(val);
}
}]
};
add(event: MatChipInputEvent): void {