ng-devui
Version:
DevUI components based on Angular
535 lines • 89.1 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { I18nService } from 'ng-devui/i18n';
import { ToggleMenuContainerComponent, ToggleMenuListComponent, ToggleMenuSearchComponent } from 'ng-devui/toggle-menu';
import { DevConfigService, WithConfig } from 'ng-devui/utils';
import { isEmpty } from 'lodash-es';
import { BehaviorSubject, fromEvent, of } from 'rxjs';
import { debounceTime, map, switchMap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "ng-devui/i18n";
import * as i2 from "ng-devui/utils";
import * as i3 from "@angular/common";
import * as i4 from "ng-devui/toggle-menu";
export class TagsInputComponent {
get getPlaceHolder() {
const maxPlaceholder = this.maxPlaceholder === undefined ? `${this.i18nTagsInputText.tagsReachMaxNumber}${this.maxTags}` : this.maxPlaceholder;
return this.selectedItems.length >= this.maxTags ? maxPlaceholder : this.placeholder;
}
constructor(i18n, devConfigService, cdr) {
this.i18n = i18n;
this.devConfigService = devConfigService;
this.cdr = cdr;
/**
* 【必选】记录输入的标签
*/
this.tags = [];
/**
* 【可选】disabled 灰化状态
*/
this.disabled = false;
/**
* 【可选】使用的属性名
*/
this.displayProperty = 'name';
/**
* 【可选】输入的placeholder
*/
this.placeholder = '';
/**
* 【可选】输入标签的最小长度
*/
this.minLength = 3;
/**
* 【可选】输入标签的最大长度, 524288为 input 支持最大值
*/
this.maxLength = 524288;
/**
* 【可选】标签的最小个数
*/
this.minTags = 0;
/**
* 【可选】标签的最大个数
*/
this.maxTags = Number.MAX_SAFE_INTEGER;
/**
* 【可选】输入框的spellcheck
*/
this.spellcheck = true;
/**
* 【可选】是否appendToBody
*/
this.appendToBody = false;
this.appendToBodyDirections = ['rightDown', 'leftDown', 'rightUp', 'leftUp'];
/**
* 【可选】是否虚拟滚动
*/
this.virtualScroll = false;
/**
* 【可选】是否使用下拉列表
*/
this.showSuggestion = true;
/**
* 【可选】下拉选项
*/
this.suggestionList = [];
/**
* 【可选】是否按空格添加tag
*/
this.isAddBySpace = true;
/**
* 【可选】默认两行显示,false 则单行显示
*/
this.multiline = true;
this.generateOptionFromInput = true;
/**
* 【可选】大小写敏感
*/
this.caseSensitivity = false;
this.showAnimation = true;
this.styleType = 'default';
/**
* 输出函数,当选中某个选项项后,将会调用此函数,参数为当前选择项的值。如果需要获取所有选择状态的值,请参考(ngModelChange)方法
*/
this.valueChange = new EventEmitter();
this.searchChange = new EventEmitter();
this.newTag = '';
this.availableOptions = [];
this.selectedItems = [];
/**
* 对于用户传入的suggestionList不做修改,数据的操作在_suggestionList上进行
*/
this._suggestionList = [];
this.newTagValid = false;
this.isReduce = false;
this.isOpen = false;
this.DEBOUNCE_TIME = 300;
this.KEYS = {
backspace: 8,
tab: 9,
enter: 13,
escape: 27,
space: 32,
up: 38,
down: 40,
left: 37,
right: 39,
delete: 46,
comma: 188,
};
this.onChange = (_) => null;
this.onTouch = () => null;
}
setI18nText() {
this.i18nCommonText = this.i18n.getI18nText().common;
this.i18nTagsInputText = this.i18n.getI18nText().tagsInput;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nCommonText = data.common;
this.i18nTagsInputText = data.tagsInput;
});
}
writeValue(value) {
if (!value) {
return;
}
this.tags = value;
this.isReduce = false;
this.reduceSuggestionList();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouch = fn;
}
ngOnInit() {
this.setI18nText();
this.valueParser = (item) => {
const str = String(item) ? item.toString() : '';
const obj = typeof item === 'object' ? item[this.displayProperty] || '' : str;
return this.tagTemplate ? item : obj;
};
this.newTag = '';
this._suggestionList = [...this.suggestionList];
this.searchFn = (term) => {
const data = this.showSuggestion && this._suggestionList ? this._suggestionList : [];
const matchItem = data.find((item) => this.caseSensitivity ? item[this.displayProperty] === term : item[this.displayProperty].toLowerCase() === term.toLowerCase());
const result = data.filter((item) => {
const str = this.caseSensitivity
? item[this.displayProperty].indexOf(term) !== -1
: item[this.displayProperty].toLowerCase().indexOf(term.toLowerCase()) !== -1;
return term === '' ? true : str;
});
return of(matchItem ? [matchItem] : result);
};
this.registerFilterChange();
}
ngAfterViewInit() {
if (this.searchBox) {
const inputDom = this.searchBox.el.nativeElement.querySelector('input');
// input失焦不冒泡,直接监听事件处理会早于list中点击事件传递到该组件,因此增加debounceTime待下拉列表关闭后判断是否插入标签
this.blurEventSubscription = fromEvent(inputDom, 'blur')
.pipe(debounceTime(this.DEBOUNCE_TIME))
.subscribe(() => {
if (this.isOpen) {
return;
}
if (this.generateOptionFromInput && !isEmpty(this.newTag)) {
this.addTag();
}
});
}
}
ngOnChanges(changes) {
if (changes && changes.suggestionList && changes.suggestionList.currentValue) {
this._suggestionList = [...this.suggestionList];
this.reduceSuggestionList();
if (this.sourceSubscription && this.searchFn) {
this.sourceSubscription.next('');
}
}
if (changes && changes.tags && changes.tags.currentValue) {
this.reduceSuggestionList();
}
}
ngOnDestroy() {
if (this.sourceSubscription) {
this.sourceSubscription.unsubscribe();
}
if (this.blurEventSubscription) {
this.blurEventSubscription.unsubscribe();
}
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
}
registerFilterChange() {
this.sourceSubscription = new BehaviorSubject('');
this.sourceSubscription
.pipe(map((term) => {
this.tagIsValid();
return term;
}), switchMap((term) => this.searchFn(term)))
.subscribe((options) => {
this.availableOptions = options;
const flag = this.checkBeforeGenerate?.(this.newTag);
const flags = [this.generateOptionFromInput, !!this.newTag, this.newTagValid, flag];
if (!flags.includes(false)) {
const obj = { isDevuiTagsInputCreated: true };
obj[this.displayProperty] = this.newTag;
if (this.availableOptions.length && this.availableOptions[0].isDevuiTagsInputCreated) {
this.availableOptions[0] = obj;
}
else {
this.availableOptions.unshift(obj);
}
}
if (this.selectBoxContainer) {
this.selectBoxContainer.updatePosition();
}
if (this.selectBox) {
this.selectBox.resetIndex(!options.length);
}
});
}
checkIsIncludes(option, item, isString) {
const key = this.displayProperty;
const value = isString ? item : item[key];
return this.caseSensitivity ? option[key] === value : option[key].toLowerCase() === value.toLowerCase();
}
reduceSuggestionList() {
this.selectedItems = this.tags.map((option, id) => ({ option, id }));
if (this.isReduce) {
return;
}
if (this.suggestionList.length > 0) {
this.isReduce = true;
// 使用用户最初传入的数据来进行过滤
this._suggestionList = this.suggestionList.filter((suggestion) => {
return this.selectedItems.findIndex(({ option }) => this.checkIsIncludes(option, suggestion)) === -1;
});
if (this.sourceSubscription && this.searchFn) {
this.sourceSubscription.next('');
}
}
}
host_click() {
if (!this.disabled) {
const dom = this.searchBox.el.nativeElement.querySelector('input');
if (dom && this.selectBox) {
dom.focus();
if (this.selectBox.availableOptions.length) {
this.selectBox.resetIndex(false);
}
}
}
}
passEvent(data) {
const { event, type } = data;
switch (type) {
case 'keydown.enter':
case 'blur':
// keydown.enter 和 keydown 都接收会重复处理
// 点击会聚焦input,input失焦事件不会冒泡,单独处理
break;
case 'keydown': {
const hotkeys = [this.KEYS.enter, this.KEYS.tab];
if (this.isAddBySpace) {
hotkeys.push(this.KEYS.space);
}
if (hotkeys.includes(event.keyCode)) {
event.preventDefault();
event.stopPropagation();
if (this.selectBox?.selectIndex !== -1) {
this.addSuggestionByIndex(this.selectBox.selectIndex, this.availableOptions[this.selectBox.selectIndex]);
}
else if (this.generateOptionFromInput) {
this.addTag();
}
}
break;
}
default:
this.inputEvent = { event, type };
}
}
addSuggestionByIndex(index, value) {
if (index < 0 ||
index >= this.availableOptions.length ||
this.maxTags <= this.selectedItems.length ||
this.selectedItems.findIndex(({ option }) => this.checkIsIncludes(option, value)) !== -1) {
return;
}
this.canAdd(value).then((result) => {
if (!result) {
return;
}
const tag = this.availableOptions[index];
const isCreated = tag.isDevuiTagsInputCreated;
delete tag.isDevuiTagsInputCreated;
this.checkMaxTags(tag);
this.onChange(this.selectedItems.map((tagItem) => tagItem.option));
this.valueChange.emit(tag);
if (!isCreated) {
const suggestionListIndex = this._suggestionList.findIndex((item) => this.checkIsIncludes(item, value));
this._suggestionList.splice(suggestionListIndex, 1);
}
this.delayResetNewTag();
this.sourceSubscription.next('');
});
}
removeTag(data) {
const { index } = data;
// 立即移除会导致toggle-menu-container无法判断event.target是否在容器中,从而关闭下拉菜单
setTimeout(() => {
if (index < 0 || index >= this.selectedItems.length) {
return;
}
// onPush下 数组长度变化不会触发变更检测
this.availableOptions = [...this.availableOptions, this.selectedItems[index]?.option];
this._suggestionList = [...this._suggestionList, this.selectedItems[index]?.option];
const tag = this.selectedItems[index].option;
this.selectedItems.splice(index, 1);
if (this.selectedItems.length === 0) {
this.selectBoxContainer.updatePosition();
}
this.onChange(this.selectedItems.map((tagItem) => tagItem.option));
this.valueChange.emit(tag);
});
}
tagIsValid() {
const tag = this.newTag;
const result = tag &&
tag.length >= this.minLength &&
tag.length <= this.maxLength &&
(this.showSuggestion ? this._suggestionList.findIndex((item) => this.checkIsIncludes(item, tag, true)) === -1 : true) &&
this.selectedItems.findIndex(({ option }) => this.checkIsIncludes(option, tag, true)) === -1 &&
!this.isEmptyString(tag);
this.newTagValid = tag === '' || !!result;
return result;
}
isEmptyString(tag) {
const temp = tag.match(/\s/g);
if (temp) {
return tag.length === temp.length;
}
else {
return false;
}
}
addTag() {
this.canAdd()
.then((result) => {
if (result && this.maxTags > this.selectedItems.length) {
if (this.tagIsValid()) {
const obj = {};
obj[this.displayProperty] = this.newTag;
this.checkMaxTags(obj);
this.onChange(this.selectedItems.map((tagItem) => tagItem.option));
this.valueChange.emit(this.newTag);
}
}
else {
this.newTagValid = false;
}
})
.finally(() => {
if (this.newTag && this.newTagValid) {
this.delayResetNewTag();
this.sourceSubscription.next('');
}
});
}
canAdd(value) {
let checkResult = Promise.resolve(true);
if (this.checkBeforeAdd) {
const result = this.checkBeforeAdd(value || this.newTag);
if (typeof result !== 'undefined') {
if (result.then) {
checkResult = result;
}
else if (result.subscribe) {
checkResult = result.toPromise();
}
else {
checkResult = Promise.resolve(result);
}
}
}
return checkResult;
}
checkMaxTags(tag) {
this.selectedItems.push({ id: this.selectedItems.length, option: tag });
if (this.selectedItems.length >= this.maxTags) {
this.isOpen = false;
}
}
setValue({ option, index }) {
this.addSuggestionByIndex(index, option);
}
searchInputValueChange(event) {
if (this.selectBox) {
this.selectBox.selectIndex = -1;
}
this.newTag = (event || '').trim();
this.searchChange.emit(this.newTag);
this.sourceSubscription.next(this.newTag);
}
toggleChangeFn(event) {
if (!event) {
this.onTouch();
this.cdr.detectChanges();
}
this.isOpen = event;
}
delayResetNewTag() {
setTimeout(() => {
// 放在timeout里是因为如果用空格添加tag,会导致添加之后输入框里有个空格。
this.newTag = '';
}, 50);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TagsInputComponent, deps: [{ token: i1.I18nService }, { token: i2.DevConfigService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TagsInputComponent, selector: "d-tags-input", inputs: { tags: "tags", disabled: "disabled", displayProperty: "displayProperty", placeholder: "placeholder", maxPlaceholder: "maxPlaceholder", minLength: "minLength", maxLength: "maxLength", minTags: "minTags", maxTags: "maxTags", spellcheck: "spellcheck", appendToBody: "appendToBody", appendToBodyDirections: "appendToBodyDirections", appendToBodyScrollStrategy: "appendToBodyScrollStrategy", virtualScroll: "virtualScroll", showSuggestion: "showSuggestion", suggestionList: "suggestionList", isAddBySpace: "isAddBySpace", multiline: "multiline", maxHeight: "maxHeight", generateOptionFromInput: "generateOptionFromInput", caseSensitivity: "caseSensitivity", itemTemplate: "itemTemplate", tagTemplate: "tagTemplate", noResultItemTemplate: "noResultItemTemplate", checkBeforeGenerate: "checkBeforeGenerate", checkBeforeAdd: "checkBeforeAdd", showAnimation: "showAnimation", styleType: "styleType" }, outputs: { valueChange: "valueChange", searchChange: "searchChange" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TagsInputComponent),
multi: true,
},
], viewQueries: [{ propertyName: "tagsInputWrapperItem", first: true, predicate: ["tagsInputWrapper"], descendants: true, static: true }, { propertyName: "selectBoxContainer", first: true, predicate: ToggleMenuContainerComponent, descendants: true }, { propertyName: "selectBox", first: true, predicate: ToggleMenuListComponent, descendants: true }, { propertyName: "searchBox", first: true, predicate: ToggleMenuSearchComponent, descendants: true }], exportAs: ["TagsInput"], usesOnChanges: true, ngImport: i0, template: "<div\r\n #tagsInputWrapper\r\n class=\"devui-tags-host {{ multiline ? 'multi-inline' : 'init-inline' }}\"\r\n [class.devui-gray-style]=\"styleType === 'gray'\"\r\n [class.disabled]=\"disabled || selectedItems?.length >= maxTags\"\r\n tabindex=\"-1\"\r\n (click)=\"host_click()\"\r\n>\r\n <d-toggle-menu-container\r\n [isOpen]=\"isOpen\"\r\n [appendToBody]=\"appendToBody\"\r\n [appendToBodyDirections]=\"appendToBodyDirections\"\r\n [appendToBodyScrollStrategy]=\"appendToBodyScrollStrategy\"\r\n [selectWrapper]=\"tagsInputWrapperItem\"\r\n [disabled]=\"disabled || selectedItems?.length >= maxTags\"\r\n [paused]=\"!showSuggestion\"\r\n [toggleOnFocus]=\"true\"\r\n [showAnimation]=\"showAnimation\"\r\n [closeScope]=\"'blank'\"\r\n (passEvent)=\"passEvent($event)\"\r\n (toggleChange)=\"toggleChangeFn($event)\"\r\n >\r\n <d-toggle-menu-label\r\n [multiItems]=\"selectedItems\"\r\n [valueParser]=\"valueParser\"\r\n [disabled]=\"disabled\"\r\n [maxHeight]=\"maxHeight\"\r\n [maxWidth]=\"'100%'\"\r\n [mode]=\"multiline ? 'multiple-line' : 'scroll-y'\"\r\n [customViewTemplate]=\"tagTemplate\"\r\n (removeChange)=\"removeTag($event)\"\r\n ></d-toggle-menu-label>\r\n <d-toggle-menu-search\r\n *ngIf=\"!disabled || selectedItems?.length === 0\"\r\n [inputValue]=\"newTag\"\r\n [maxLength]=\"maxLength\"\r\n [searchPlaceholder]=\"getPlaceHolder\"\r\n [searchFn]=\"searchFn\"\r\n [spellcheck]=\"spellcheck\"\r\n [isShowSearchIcon]=\"false\"\r\n [disabled]=\"disabled || selectedItems?.length >= maxTags\"\r\n [delay]=\"0\"\r\n (searchInputValueChange)=\"searchInputValueChange($event)\"\r\n ></d-toggle-menu-search>\r\n <d-toggle-menu-list\r\n [eventHandle]=\"inputEvent\"\r\n [options]=\"availableOptions\"\r\n [value]=\"selectedItems\"\r\n [virtualScroll]=\"virtualScroll\"\r\n [hasSelectIndex]=\"true\"\r\n [isFiltering]=\"newTag?.length > 0\"\r\n [listItemTemplate]=\"listItem\"\r\n [noResultItemTemplate]=\"noResultItemTemplate\"\r\n [closeScope]=\"'blank'\"\r\n (toggleChange)=\"toggleChangeFn($event)\"\r\n (valueChange)=\"setValue($event)\"\r\n >\r\n <ng-template #listItem let-item=\"item\" let-index=\"index\" let-selectIndex=\"selectIndex\" let-choose=\"choose\">\r\n <d-toggle-menu-list-item\r\n [item]=\"item\"\r\n [index]=\"index\"\r\n [selectIndex]=\"selectIndex\"\r\n [highlightToggle]=\"false\"\r\n [customTemplate]=\"itemTemplate\"\r\n [filterKey]=\"displayProperty\"\r\n (chooseItem)=\"choose($event)\"\r\n >\r\n <span itemSuffix *ngIf=\"index === 0 && item.option.isDevuiTagsInputCreated\" class=\"devui-tags-create-item\">\r\n {{ i18nTagsInputText?.create }}\r\n </span>\r\n </d-toggle-menu-list-item>\r\n </ng-template>\r\n </d-toggle-menu-list>\r\n </d-toggle-menu-container>\r\n</div>\r\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}:host{display:block;outline:none}:host .devui-tags-host{position:relative;height:100%;outline:none;background-color:var(--devui-base-bg, #ffffff)}:host .devui-tags-host:active{outline:0}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container{flex-wrap:wrap;align-content:flex-start}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container d-toggle-menu-search .devui-toggle-menu-search>input{height:26px}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container.disabled{cursor:not-allowed}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container.disabled d-toggle-menu-container div.devui-toggle-menu{background-color:var(--devui-disabled-bg, #f3f3f3)}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container.disabled d-toggle-menu-search .devui-toggle-menu-search input{cursor:not-allowed}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container d-toggle-menu-list ul d-toggle-menu-list-item .devui-dropdown-item:not(.disabled):active,:host ::ng-deep .devui-tags-host .devui-toggle-menu-container d-toggle-menu-list ul d-toggle-menu-list-item .devui-dropdown-item:not(.disabled):active:hover{color:var(--devui-list-item-hover-text, #000000);background-color:var(--devui-list-item-hover-bg, #f2f2f3)}:host ::ng-deep .devui-tags-host.init-inline{height:28px;border-radius:var(--devui-border-radius, 2px);border:solid 1px var(--devui-form-control-line, #dbdbdb)}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container{justify-content:flex-start;flex-wrap:nowrap;overflow:hidden;border:none;padding-bottom:12px}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container:hover{overflow-x:auto;overflow-x:overlay}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container d-toggle-menu-label{width:auto;max-width:none;background-color:transparent}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container d-toggle-menu-label ul.devui-select-tag-list{white-space:nowrap}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container d-toggle-menu-search .devui-toggle-menu-search{min-width:160px}:host ::ng-deep .devui-tags-host.multi-inline d-toggle-menu-label{width:100%;border-radius:var(--devui-border-radius, 2px);background-color:var(--devui-base-bg, #ffffff)}:host ::ng-deep .devui-tags-host:not(.devui-gray-style.multi-inline) .devui-toggle-menu-container{background-color:transparent!important}:host ::ng-deep .devui-tags-host.devui-gray-style d-toggle-menu-label,:host ::ng-deep .devui-tags-host.devui-gray-style .devui-toggle-menu-search>input[class*=devui-]:not([disabled]){background-color:transparent!important}:host ::ng-deep .devui-tags-host.devui-gray-style.init-inline,:host ::ng-deep .devui-tags-host.devui-gray-style.multi-inline .devui-toggle-menu-container{background-color:var(--devui-gray-form-control-bg, #f5f5f5);border-color:transparent;transition:all var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}:host ::ng-deep .devui-tags-host.devui-gray-style.init-inline.disabled,:host ::ng-deep .devui-tags-host.devui-gray-style.multi-inline .devui-toggle-menu-container.disabled{background-color:var(--devui-disabled-bg, #f3f3f3)}:host ::ng-deep .devui-tags-host.devui-gray-style.init-inline:not(.disabled):hover,:host ::ng-deep .devui-tags-host.devui-gray-style.multi-inline .devui-toggle-menu-container:not(.disabled):hover{background-color:var(--devui-gray-form-control-hover-bg, #dfdfdf)}:host ::ng-deep .devui-tags-host.devui-gray-style.init-inline:not(.disabled):focus-within,:host ::ng-deep .devui-tags-host.devui-gray-style.multi-inline .devui-toggle-menu-container:not(.disabled):focus-within{background-color:var(--devui-base-bg, #ffffff);border-color:var(--devui-brand, #0a59f7)}::ng-deep .devui-dropdown-menu d-toggle-menu-list-item .devui-dropdown-item:not(.disabled):active,::ng-deep .devui-dropdown-menu d-toggle-menu-list-item .devui-dropdown-item:not(.disabled):active:hover{color:var(--devui-list-item-hover-text, #000000);background-color:var(--devui-list-item-hover-bg, #f2f2f3)}::ng-deep .devui-dropdown-menu .devui-tags-create-item{float:right;font-size:var(--devui-font-size, 12px);color:var(--devui-placeholder, #808080)}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.ToggleMenuContainerComponent, selector: "d-toggle-menu-container", inputs: ["isOpen", "appendToBody", "appendToBodyDirections", "appendToBodyScrollStrategy", "width", "size", "overview", "position", "disabled", "paused", "showAnimation", "toggleOnFocus", "closeScope", "direction", "selectWrapper"], outputs: ["toggleChange", "passEvent"] }, { kind: "component", type: i4.ToggleMenuLabelComponent, selector: "d-toggle-menu-label", inputs: ["mode", "multiItems", "disabled", "maxWidth", "maxHeight", "optionDisabledKey", "customViewTemplate", "valueParser"], outputs: ["removeChange"] }, { kind: "component", type: i4.ToggleMenuListItemComponent, selector: "d-toggle-menu-list-item", inputs: ["item", "index", "selectIndex", "activeIndex", "formatter", "filterKey", "optionDisabledKey", "optionGroupKey", "highlightToggle", "highlightItemClass", "multiple", "isShowKeyword", "keyword", "customTemplate", "color"], outputs: ["chooseItem"] }, { kind: "component", type: i4.ToggleMenuListComponent, selector: "d-toggle-menu-list", inputs: ["options", "optionDisabledKey", "optionImmutableKey", "optionGroupKey", "size", "keyword", "isFiltering", "enableLazyLoad", "virtualScroll", "listItemTemplate", "loadingTemplateRef", "noResultItemTemplate", "customViewTemplate", "customViewDirection", "templateItemSize", "scrollHeight", "selectIndex", "hasSelectIndex", "multiple", "multiItems", "value", "isSelectAll", "keepMultipleOrder", "eventHandle", "closeScope"], outputs: ["toggleChange", "valueChange", "loadMore"] }, { kind: "component", type: i4.ToggleMenuSearchComponent, selector: "d-toggle-menu-search", inputs: ["searchPlaceholder", "isShowSearchIcon", "inputValue", "inputWidth", "filterKey", "maxLength", "disabled", "spellcheck", "options", "delay", "formatter", "searchFn"], outputs: ["searchInputValueChange"] }] }); }
}
__decorate([
WithConfig(),
__metadata("design:type", String)
], TagsInputComponent.prototype, "appendToBodyScrollStrategy", void 0);
__decorate([
WithConfig(),
__metadata("design:type", Object)
], TagsInputComponent.prototype, "showAnimation", void 0);
__decorate([
WithConfig(),
__metadata("design:type", Object)
], TagsInputComponent.prototype, "styleType", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TagsInputComponent, decorators: [{
type: Component,
args: [{ selector: 'd-tags-input', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TagsInputComponent),
multi: true,
},
], exportAs: 'TagsInput', preserveWhitespaces: false, template: "<div\r\n #tagsInputWrapper\r\n class=\"devui-tags-host {{ multiline ? 'multi-inline' : 'init-inline' }}\"\r\n [class.devui-gray-style]=\"styleType === 'gray'\"\r\n [class.disabled]=\"disabled || selectedItems?.length >= maxTags\"\r\n tabindex=\"-1\"\r\n (click)=\"host_click()\"\r\n>\r\n <d-toggle-menu-container\r\n [isOpen]=\"isOpen\"\r\n [appendToBody]=\"appendToBody\"\r\n [appendToBodyDirections]=\"appendToBodyDirections\"\r\n [appendToBodyScrollStrategy]=\"appendToBodyScrollStrategy\"\r\n [selectWrapper]=\"tagsInputWrapperItem\"\r\n [disabled]=\"disabled || selectedItems?.length >= maxTags\"\r\n [paused]=\"!showSuggestion\"\r\n [toggleOnFocus]=\"true\"\r\n [showAnimation]=\"showAnimation\"\r\n [closeScope]=\"'blank'\"\r\n (passEvent)=\"passEvent($event)\"\r\n (toggleChange)=\"toggleChangeFn($event)\"\r\n >\r\n <d-toggle-menu-label\r\n [multiItems]=\"selectedItems\"\r\n [valueParser]=\"valueParser\"\r\n [disabled]=\"disabled\"\r\n [maxHeight]=\"maxHeight\"\r\n [maxWidth]=\"'100%'\"\r\n [mode]=\"multiline ? 'multiple-line' : 'scroll-y'\"\r\n [customViewTemplate]=\"tagTemplate\"\r\n (removeChange)=\"removeTag($event)\"\r\n ></d-toggle-menu-label>\r\n <d-toggle-menu-search\r\n *ngIf=\"!disabled || selectedItems?.length === 0\"\r\n [inputValue]=\"newTag\"\r\n [maxLength]=\"maxLength\"\r\n [searchPlaceholder]=\"getPlaceHolder\"\r\n [searchFn]=\"searchFn\"\r\n [spellcheck]=\"spellcheck\"\r\n [isShowSearchIcon]=\"false\"\r\n [disabled]=\"disabled || selectedItems?.length >= maxTags\"\r\n [delay]=\"0\"\r\n (searchInputValueChange)=\"searchInputValueChange($event)\"\r\n ></d-toggle-menu-search>\r\n <d-toggle-menu-list\r\n [eventHandle]=\"inputEvent\"\r\n [options]=\"availableOptions\"\r\n [value]=\"selectedItems\"\r\n [virtualScroll]=\"virtualScroll\"\r\n [hasSelectIndex]=\"true\"\r\n [isFiltering]=\"newTag?.length > 0\"\r\n [listItemTemplate]=\"listItem\"\r\n [noResultItemTemplate]=\"noResultItemTemplate\"\r\n [closeScope]=\"'blank'\"\r\n (toggleChange)=\"toggleChangeFn($event)\"\r\n (valueChange)=\"setValue($event)\"\r\n >\r\n <ng-template #listItem let-item=\"item\" let-index=\"index\" let-selectIndex=\"selectIndex\" let-choose=\"choose\">\r\n <d-toggle-menu-list-item\r\n [item]=\"item\"\r\n [index]=\"index\"\r\n [selectIndex]=\"selectIndex\"\r\n [highlightToggle]=\"false\"\r\n [customTemplate]=\"itemTemplate\"\r\n [filterKey]=\"displayProperty\"\r\n (chooseItem)=\"choose($event)\"\r\n >\r\n <span itemSuffix *ngIf=\"index === 0 && item.option.isDevuiTagsInputCreated\" class=\"devui-tags-create-item\">\r\n {{ i18nTagsInputText?.create }}\r\n </span>\r\n </d-toggle-menu-list-item>\r\n </ng-template>\r\n </d-toggle-menu-list>\r\n </d-toggle-menu-container>\r\n</div>\r\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}:host{display:block;outline:none}:host .devui-tags-host{position:relative;height:100%;outline:none;background-color:var(--devui-base-bg, #ffffff)}:host .devui-tags-host:active{outline:0}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container{flex-wrap:wrap;align-content:flex-start}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container d-toggle-menu-search .devui-toggle-menu-search>input{height:26px}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container.disabled{cursor:not-allowed}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container.disabled d-toggle-menu-container div.devui-toggle-menu{background-color:var(--devui-disabled-bg, #f3f3f3)}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container.disabled d-toggle-menu-search .devui-toggle-menu-search input{cursor:not-allowed}:host ::ng-deep .devui-tags-host .devui-toggle-menu-container d-toggle-menu-list ul d-toggle-menu-list-item .devui-dropdown-item:not(.disabled):active,:host ::ng-deep .devui-tags-host .devui-toggle-menu-container d-toggle-menu-list ul d-toggle-menu-list-item .devui-dropdown-item:not(.disabled):active:hover{color:var(--devui-list-item-hover-text, #000000);background-color:var(--devui-list-item-hover-bg, #f2f2f3)}:host ::ng-deep .devui-tags-host.init-inline{height:28px;border-radius:var(--devui-border-radius, 2px);border:solid 1px var(--devui-form-control-line, #dbdbdb)}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container{justify-content:flex-start;flex-wrap:nowrap;overflow:hidden;border:none;padding-bottom:12px}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container:hover{overflow-x:auto;overflow-x:overlay}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container d-toggle-menu-label{width:auto;max-width:none;background-color:transparent}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container d-toggle-menu-label ul.devui-select-tag-list{white-space:nowrap}:host ::ng-deep .devui-tags-host.init-inline div.devui-toggle-menu-container d-toggle-menu-search .devui-toggle-menu-search{min-width:160px}:host ::ng-deep .devui-tags-host.multi-inline d-toggle-menu-label{width:100%;border-radius:var(--devui-border-radius, 2px);background-color:var(--devui-base-bg, #ffffff)}:host ::ng-deep .devui-tags-host:not(.devui-gray-style.multi-inline) .devui-toggle-menu-container{background-color:transparent!important}:host ::ng-deep .devui-tags-host.devui-gray-style d-toggle-menu-label,:host ::ng-deep .devui-tags-host.devui-gray-style .devui-toggle-menu-search>input[class*=devui-]:not([disabled]){background-color:transparent!important}:host ::ng-deep .devui-tags-host.devui-gray-style.init-inline,:host ::ng-deep .devui-tags-host.devui-gray-style.multi-inline .devui-toggle-menu-container{background-color:var(--devui-gray-form-control-bg, #f5f5f5);border-color:transparent;transition:all var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}:host ::ng-deep .devui-tags-host.devui-gray-style.init-inline.disabled,:host ::ng-deep .devui-tags-host.devui-gray-style.multi-inline .devui-toggle-menu-container.disabled{background-color:var(--devui-disabled-bg, #f3f3f3)}:host ::ng-deep .devui-tags-host.devui-gray-style.init-inline:not(.disabled):hover,:host ::ng-deep .devui-tags-host.devui-gray-style.multi-inline .devui-toggle-menu-container:not(.disabled):hover{background-color:var(--devui-gray-form-control-hover-bg, #dfdfdf)}:host ::ng-deep .devui-tags-host.devui-gray-style.init-inline:not(.disabled):focus-within,:host ::ng-deep .devui-tags-host.devui-gray-style.multi-inline .devui-toggle-menu-container:not(.disabled):focus-within{background-color:var(--devui-base-bg, #ffffff);border-color:var(--devui-brand, #0a59f7)}::ng-deep .devui-dropdown-menu d-toggle-menu-list-item .devui-dropdown-item:not(.disabled):active,::ng-deep .devui-dropdown-menu d-toggle-menu-list-item .devui-dropdown-item:not(.disabled):active:hover{color:var(--devui-list-item-hover-text, #000000);background-color:var(--devui-list-item-hover-bg, #f2f2f3)}::ng-deep .devui-dropdown-menu .devui-tags-create-item{float:right;font-size:var(--devui-font-size, 12px);color:var(--devui-placeholder, #808080)}\n"] }]
}], ctorParameters: () => [{ type: i1.I18nService }, { type: i2.DevConfigService }, { type: i0.ChangeDetectorRef }], propDecorators: { tags: [{
type: Input
}], disabled: [{
type: Input
}], displayProperty: [{
type: Input
}], placeholder: [{
type: Input
}], maxPlaceholder: [{
type: Input
}], minLength: [{
type: Input
}], maxLength: [{
type: Input
}], minTags: [{
type: Input
}], maxTags: [{
type: Input
}], spellcheck: [{
type: Input
}], appendToBody: [{
type: Input
}], appendToBodyDirections: [{
type: Input
}], appendToBodyScrollStrategy: [{
type: Input
}], virtualScroll: [{
type: Input
}], showSuggestion: [{
type: Input
}], suggestionList: [{
type: Input
}], isAddBySpace: [{
type: Input
}], multiline: [{
type: Input
}], maxHeight: [{
type: Input
}], generateOptionFromInput: [{
type: Input
}], caseSensitivity: [{
type: Input
}], itemTemplate: [{
type: Input
}], tagTemplate: [{
type: Input
}], noResultItemTemplate: [{
type: Input
}], checkBeforeGenerate: [{
type: Input
}], checkBeforeAdd: [{
type: Input
}], showAnimation: [{
type: Input
}], styleType: [{
type: Input
}], valueChange: [{
type: Output
}], searchChange: [{
type: Output
}], tagsInputWrapperItem: [{
type: ViewChild,
args: ['tagsInputWrapper', { static: true }]
}], selectBoxContainer: [{
type: ViewChild,
args: [ToggleMenuContainerComponent]
}], selectBox: [{
type: ViewChild,
args: [ToggleMenuListComponent]
}], searchBox: [{
type: ViewChild,
args: [ToggleMenuSearchComponent]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS90YWdzLWlucHV0L3RhZ3MuaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvdGFncy1pbnB1dC90YWdzLmlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBSUwsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBaUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hILE9BQU8sRUFBeUQsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBYyxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFnQjlELE1BQU0sT0FBTyxrQkFBa0I7SUE2RjdCLElBQUksY0FBYztRQUNoQixNQUFNLGNBQWMsR0FDbEIsSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxSCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN2RixDQUFDO0lBc0NELFlBQW9CLElBQWlCLEVBQVUsZ0JBQWtDLEVBQVUsR0FBc0I7UUFBN0YsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXRJakg7O1dBRUc7UUFDTSxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ25COztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQjs7V0FFRztRQUNNLG9CQUFlLEdBQUcsTUFBTSxDQUFDO1FBQ2xDOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFLMUI7O1dBRUc7UUFDTSxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCOztXQUVHO1FBQ00sY0FBUyxHQUFHLE1BQU0sQ0FBQztRQUM1Qjs7V0FFRztRQUNNLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDckI7O1dBRUc7UUFDTSxZQUFPLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ25EOztXQUVHO1FBQ00sZUFBVSxHQUFHLElBQUksQ0FBQztRQUMzQjs7V0FFRztRQUNNLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLDJCQUFzQixHQUFxRCxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRW5JOztXQUVHO1FBQ00sa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDL0I7O1dBRUc7UUFDTSxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUMvQjs7V0FFRztRQUNNLG1CQUFjLEdBQVEsRUFBRSxDQUFDO1FBQ2xDOztXQUVHO1FBQ00saUJBQVksR0FBRyxJQUFJLENBQUM7UUFDN0I7O1dBRUc7UUFDTSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBS2pCLDRCQUF1QixHQUFHLElBQUksQ0FBQztRQUN4Qzs7V0FFRztRQUNNLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBTVYsa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFDckIsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUM3Qzs7V0FFRztRQUNPLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN0QyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFZakQsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUN0QixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQjs7V0FFRztRQUNILG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQU1QLGtCQUFhLEdBQUcsR0FBRyxDQUFDO1FBRXBCLFNBQUksR0FBUTtZQUNsQixTQUFTLEVBQUUsQ0FBQztZQUNaLEdBQUcsRUFBRSxDQUFDO1lBQ04sS0FBSyxFQUFFLEVBQUU7WUFDVCxNQUFNLEVBQUUsRUFBRTtZQUNWLEtBQUssRUFBRSxFQUFFO1lBQ1QsRUFBRSxFQUFFLEVBQUU7WUFDTixJQUFJLEVBQUUsRUFBRTtZQUNSLElBQUksRUFBRSxFQUFFO1lBQ1IsS0FBSyxFQUFFLEVBQUU7WUFDVCxNQUFNLEVBQUUsRUFBRTtZQUNWLEtBQUssRUFBRSxHQUFHO1NBQ1gsQ0FBQztRQUlNLGFBQVEsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFFdUYsQ0FBQztJQUU3RyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDckQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQzNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMxQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hELE1BQU0sR0FBRyxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM5RSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FDN0gsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWU7b0JBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2pELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDaEYsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hFLHlFQUF5RTtZQUN6RSxJQUFJLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7aUJBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUN0QyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNoQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQzFELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdFLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQjthQUNwQixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDekM7YUFDQSxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyRCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sR0FBRyxHQUFHLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUNyRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUNqQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckMsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0MsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUztRQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFHLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUs