UNPKG

ng-devui

Version:

DevUI components based on Angular

535 lines 89.1 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS90YWdzLWlucHV0L3RhZ3MuaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvdGFncy1pbnB1dC90YWdzLmlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBSUwsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBaUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hILE9BQU8sRUFBeUQsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBYyxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFnQjlELE1BQU0sT0FBTyxrQkFBa0I7SUE2RjdCLElBQUksY0FBYztRQUNoQixNQUFNLGNBQWMsR0FDbEIsSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNB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