ngx-mat-tag-input
Version:
Angular tags-input based on Material Angular
165 lines • 18.2 kB
JavaScript
var NgxMatTagInputComponent_1;
import { __decorate } from "tslib";
import { Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { COMMA, ENTER } from '@angular/cdk/keycodes';
import { map, startWith } from 'rxjs/operators';
let NgxMatTagInputComponent = NgxMatTagInputComponent_1 = class NgxMatTagInputComponent {
constructor() {
this.items = [];
this.selectedTags = [];
this.reset = new EventEmitter();
this.ngModelChange = new EventEmitter();
this.change = new EventEmitter();
this.focus = new EventEmitter();
this.select = new EventEmitter();
this.touched = new EventEmitter();
this.separatorKeysCodes = [ENTER, COMMA];
this.searchControl = new FormControl();
this.onChange = () => {
};
this.onTouched = () => {
};
}
get value() {
return this.selectedTags;
}
set value(value) {
this.selectedTags = value;
this.onChange(value);
this._change(value);
this.onTouched();
}
ngOnInit() {
this.filteredItems = this.searchControl.valueChanges.pipe(startWith(null), map((tag) => tag ? this._filter(tag) : this.items.slice()));
}
writeValue(obj) {
if (obj) {
this.value = obj;
}
if (obj === null) {
this.value = [];
}
}
registerOnChange(fn) {
this.change.emit(fn);
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
this.touched.emit(fn);
}
setDisabledState(isDisabled) {
this.searchControl.disable();
}
_modelChange(event) {
this.ngModelChange.emit(event);
}
_change(event) {
this.change.emit(event);
}
_focus(event) {
this.focus.emit(event);
}
add(event) {
const input = event.input;
const value = event.value;
if ((value || '').trim()) {
this.selectedTags.push(value.trim());
}
if (input) {
input.value = '';
}
this.searchControl.setValue(null);
this._change(this.selectedTags);
}
remove(fruit) {
const index = this.selectedTags.indexOf(fruit);
if (index >= 0) {
this.selectedTags.splice(index, 1);
}
this._change(this.selectedTags);
}
selected(event) {
this.pushTag(event.option.value);
this.tagsInput.nativeElement.value = '';
this.searchControl.setValue(null);
this.select.emit(event.option.value);
}
clear() {
this.selectedTags = [];
}
pushTag(tag) {
if (!this.selectedTags.includes(tag)) {
this.selectedTags.push(tag);
this._change(this.selectedTags);
}
}
_filter(value) {
const filterValue = (this.displayBy && value[this.displayBy] ? value[this.displayBy] : value).toLowerCase();
if (this.displayBy) {
return this.items.filter(option => option[this.displayBy].toLowerCase().includes(filterValue));
}
else {
return this.items.filter(option => option.toLowerCase().includes(filterValue));
}
}
};
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "appearance", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "readonly", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "items", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "placeholder", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "displayBy", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "isLoading", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "selectedTags", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "reset", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "ngModelChange", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "change", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "focus", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "select", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "touched", void 0);
__decorate([
ViewChild('tagsInput')
], NgxMatTagInputComponent.prototype, "tagsInput", void 0);
NgxMatTagInputComponent = NgxMatTagInputComponent_1 = __decorate([
Component({
selector: 'ngx-mat-tag-input',
template: "<mat-form-field [appearance]=\"appearance\" class=\"mat-tag-input-container\">\r\n <mat-chip-list #chipList>\r\n <mat-chip (removed)=\"remove(item)\" *ngFor=\"let item of selectedTags\" [removable]=\"true\" [selectable]=\"true\">\r\n {{displayBy ? item[displayBy] : item}}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n <input #tagsInput\r\n (focus)=\"_focus($event)\" (matChipInputTokenEnd)=\"add($event)\" (ngModelChange)=\"_modelChange($event)\"\r\n [formControl]=\"searchControl\" [matAutocomplete]=\"auto\" [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [placeholder]=\"placeholder\">\r\n </mat-chip-list>\r\n <button (click)=\"clear()\" *ngIf=\"selectedTags.length !== 0\" mat-button mat-icon-button\r\n matSuffix>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n <mat-option *ngIf=\"isLoading\" class=\"centered\">\r\n <mat-spinner diameter=\"40\"></mat-spinner>\r\n </mat-option>\r\n <mat-option *ngFor=\"let item of filteredItems | async\" [value]=\"item\">\r\n {{displayBy ? item[displayBy] : item}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n</mat-form-field>\r\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxMatTagInputComponent_1),
multi: true
}
],
styles: [".mat-tag-input-container{width:100%}.centered{width:100%;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;align-items:center}.centered mat-spinner{left:45%}"]
})
], NgxMatTagInputComponent);
export { NgxMatTagInputComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hdC10YWctaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LW1hdC10YWctaW5wdXQvIiwic291cmNlcyI6WyJsaWIvbmd4LW1hdC10YWctaW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBdUIsV0FBVyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEYsT0FBTyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQU1uRCxPQUFPLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBYzlDLElBQWEsdUJBQXVCLCtCQUFwQyxNQUFhLHVCQUF1QjtJQXVCbEM7UUFuQlMsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUlsQixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUV4QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFJaEMsdUJBQWtCLEdBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUMsa0JBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBd0J6QyxhQUFRLEdBQVEsR0FBRyxFQUFFO1FBQ3JCLENBQUMsQ0FBQTtRQUVELGNBQVMsR0FBUSxHQUFHLEVBQUU7UUFDdEIsQ0FBQyxDQUFB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bnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0NPTU1BLCBFTlRFUn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkQXBwZWFyYW5jZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnR9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQge01hdENoaXBJbnB1dEV2ZW50fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc3RhcnRXaXRofSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1tYXQtdGFnLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1tYXQtdGFnLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LW1hdC10YWctaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hNYXRUYWdJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hNYXRUYWdJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuO1xuICBASW5wdXQoKSBpdGVtczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgZGlzcGxheUJ5OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgQElucHV0KCkgc2VsZWN0ZWRUYWdzOiBhbnlbXSA9IFtdO1xuXG4gIEBPdXRwdXQoKSByZXNldCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG5nTW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRvdWNoZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgndGFnc0lucHV0JykgdGFnc0lucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIHB1YmxpYyBzZXBhcmF0b3JLZXlzQ29kZXM6IG51bWJlcltdID0gW0VOVEVSLCBDT01NQV07XG4gIHB1YmxpYyBzZWFyY2hDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcblxuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhZ3M7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy5zZWxlY3RlZFRhZ3MgPSB2YWx1ZTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLl9jaGFuZ2UodmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLnNlYXJjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICBtYXAoKHRhZzogYW55IHwgbnVsbCkgPT4gdGFnID8gdGhpcy5fZmlsdGVyKHRhZykgOiB0aGlzLml0ZW1zLnNsaWNlKCkpKTtcbiAgfVxuXG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7XG4gIH1cblxuICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHtcbiAgfVxuXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAob2JqKSB7XG4gICAgICB0aGlzLnZhbHVlID0gb2JqO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChmbik7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgdGhpcy50b3VjaGVkLmVtaXQoZm4pO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoQ29udHJvbC5kaXNhYmxlKCk7XG4gIH1cblxuICBfbW9kZWxDaGFuZ2UoZXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdChldmVudClcbiAgfVxuXG4gIF9jaGFuZ2UoZXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIF9mb2N1cyhldmVudCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXMuZW1pdChldmVudClcbiAgfVxuXG4gIGFkZChldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LmlucHV0O1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWU7XG4gICAgaWYgKCh2YWx1ZSB8fCAnJykudHJpbSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFncy5wdXNoKHZhbHVlLnRyaW0oKSk7XG4gICAgfVxuICAgIGlmIChpbnB1dCkge1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICB9XG4gICAgdGhpcy5zZWFyY2hDb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHRoaXMuX2NoYW5nZSh0aGlzLnNlbGVjdGVkVGFncyk7XG4gIH1cblxuICByZW1vdmUoZnJ1aXQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZFRhZ3MuaW5kZXhPZihmcnVpdCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMuX2NoYW5nZSh0aGlzLnNlbGVjdGVkVGFncyk7XG4gIH1cblxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMucHVzaFRhZyhldmVudC5vcHRpb24udmFsdWUpO1xuICAgIHRoaXMudGFnc0lucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLnNlYXJjaENvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5zZWxlY3QuZW1pdChldmVudC5vcHRpb24udmFsdWUpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFRhZ3MgPSBbXTtcbiAgfVxuXG4gIHB1c2hUYWcodGFnOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUYWdzLmluY2x1ZGVzKHRhZykpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWdzLnB1c2godGFnKTtcbiAgICAgIHRoaXMuX2NoYW5nZSh0aGlzLnNlbGVjdGVkVGFncyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyKHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSAodGhpcy5kaXNwbGF5QnkgJiYgdmFsdWVbdGhpcy5kaXNwbGF5QnldID8gdmFsdWVbdGhpcy5kaXNwbGF5QnldIDogdmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHRoaXMuZGlzcGxheUJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIob3B0aW9uID0+IG9wdGlvblt0aGlzLmRpc3BsYXlCeV0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XG4gICAgfVxuICB9XG5cblxufVxuIl19