UNPKG

ng-devui

Version:

DevUI components based on Angular

671 lines (669 loc) 110 kB
import { __decorate, __metadata } from 'tslib'; import * as i3$1 from '@angular/cdk/overlay'; import { CdkOverlayOrigin, CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay'; import * as i1$1 from '@angular/common'; import { DOCUMENT, CommonModule } from '@angular/common'; import * as i0 from '@angular/core'; import { EventEmitter, Component, ChangeDetectionStrategy, Input, Output, ViewChild, Inject, ContentChild, HostListener, HostBinding, NgModule } from '@angular/core'; import * as i2 from 'ng-devui/utils'; import { fadeInOut, addClassToOrigin, removeClassFromOrigin, AppendToBodyDirectionsConfig, formWithDropDown, WithConfig, HighlightModule, LazyLoadModule } from 'ng-devui/utils'; import * as i1$2 from 'ng-devui/window-ref'; import { WindowRefModule } from 'ng-devui/window-ref'; import * as i7 from '@angular/cdk/scrolling'; import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling'; import * as i1 from 'ng-devui/i18n'; import * as i3 from '@angular/forms'; import { FormsModule } from '@angular/forms'; import * as i4 from 'ng-devui/checkbox'; import { CheckBoxModule } from 'ng-devui/checkbox'; import * as i6 from 'ng-devui/loading'; import { LoadingModule } from 'ng-devui/loading'; import * as i2$1 from 'ng-devui/tags'; import { TagsModule } from 'ng-devui/tags'; import { of, fromEvent } from 'rxjs'; import { map, filter, debounceTime } from 'rxjs/operators'; class ToggleMenuListComponent { /** * 【可选】下拉菜单高度,建议使用px作为高度单位 */ set scrollHeight(value) { this._scrollHeight = `${parseInt(value, 10)}px`; } get scrollHeight() { return this._scrollHeight; } get realVirtualScrollItemSize() { const itemSize = (this.templateItemSize || this.virtualScrollItemSize[this.size || 'normal']) + this.virtualScrollItemSize.space; const num = Math.round(this.scrollHeightNum / itemSize) || 10; this.minBuffer = num * 1.5 * itemSize; this.maxBuffer = num * 2.5 * itemSize; return itemSize; } constructor(changeDetectorRef, i18n) { this.changeDetectorRef = changeDetectorRef; this.i18n = i18n; /** * 【必选】下拉选项资源,支持Array<string>, Array<{key: value}> */ this.options = []; /** * 【当传入资源(options)类型为Array<{key: value},必选】针对传入资源options的每项对应字段做禁用操作的key */ this.optionDisabledKey = ''; /** * 【当传入资源(options)类型为Array<{key: value},必选】针对传入资源options的每项对应字段禁止变更的key */ this.optionImmutableKey = ''; /** * 【当传入资源(options)类型为Array<{key: value},可选】如使用分组需设置 */ this.optionGroupKey = ''; /** * 【可选】是否在搜索过滤状态中 */ this.isFiltering = false; /** * 【可选】启用数据懒加载,默认不启用 */ this.enableLazyLoad = false; /** * 【可选】是否虚拟滚动 */ this.virtualScroll = false; /** * customViewTemplate的方向,支持下方和右方 */ this.customViewDirection = 'bottom'; this.selectIndex = -1; this.multiItems = []; /** * 【可选】是否支持全选 */ this.isSelectAll = false; /** * 【可选】配置多选的时候是否维持原数组排序还是用户选择的顺序排序,默认是用户顺序 */ this.keepMultipleOrder = 'user-select'; this.closeScope = 'all'; /** * select下拉toggle事件,值为true或false */ this.toggleChange = new EventEmitter(); this.valueChange = new EventEmitter(); this.loadMore = new EventEmitter(); this._scrollHeight = '300px'; this.availableOptions = []; this.activeIndex = -1; this.allChecked = false; this.halfChecked = false; this.showLoading = false; this.virtualScrollViewportSizeMightChange = false; this.virtualScrollItemSize = { sm: 30, normal: 36, lg: 50, space: 4, }; // 容器边距,虚拟滚动设置高度需考虑上下边距 this.CONTAINER_MARGINS = 12; this.choose = ({ option, index, event }) => { if (event) { event.preventDefault(); event.stopPropagation(); } if (typeof option === 'object' && Object.keys(option).length === 0) { this.toggleChange.emit(false); return; } if (this.optionDisabledKey && option[this.optionDisabledKey]) { return; } if (this.optionImmutableKey && option[this.optionImmutableKey]) { return; } if (this.optionGroupKey && option[this.optionGroupKey]) { return; } if (this.multiple) { const indexOfOption = this.multiItems.findIndex((item) => JSON.stringify(item.option) === JSON.stringify(option)); if (indexOfOption === -1) { this.multiItems.push({ id: index, option }); } else { this.multiItems.splice(indexOfOption, 1); } if (this.keepMultipleOrder === 'origin') { this.multiItems.sort((a, b) => a.id - b.id); } this.value = this.multiItems.map((item) => item.option); } else { this.value = option; this.activeIndex = index; this.selectIndex = index; if (this.closeScope === 'all') { this.toggleChange.emit(false); } if (this.virtualScrollViewportSizeMightChange) { // 解决虚拟滚动更新options长度展开前无法获取正确高度影响 setTimeout(() => { if (this.virtualScrollViewportSizeMightChange && this.virtualScrollViewport) { this.virtualScrollViewportSizeMightChange = false; this.virtualScrollViewport.checkViewportSize(); } }, 0); } } this.valueChange.emit({ value: this.value, multiItems: this.multiItems, option, event, index }); this.setAvailableOptions(); this.setChecked(this.value); }; } ngOnInit() { this.setI18nText(); } ngOnChanges(changes) { const { options, value, eventHandle } = changes; if (options) { this.availableOptions = this.options; this.setAvailableOptions(); // 显示数据变更,需要判断全选半选状态 if (this.isSelectAll) { const selectedItemForFilterOptions = []; this.multiItems.forEach((item) => { this.availableOptions.forEach((option) => { if (item.id === option.id) { selectedItemForFilterOptions.push(item); } }); }); this.setChecked(selectedItemForFilterOptions); } if (!this.hasSelectIndex && !this.multiple && (!this.value || (this.availableOptions && !this.availableOptions.find((option) => option.option === this.value)))) { this.selectIndex = this.isFiltering && this.availableOptions && this.availableOptions.length > 0 ? 0 : -1; } if (this.virtualScroll && this.virtualScrollViewport) { this.virtualScrollViewportSizeMightChange = true; this.virtualScrollViewport.checkViewportSize(); } this.changeDetectorRef.markForCheck(); } if (value) { this.setAvailableOptions(); } if (eventHandle?.currentValue) { const evt = eventHandle.currentValue; const { event, type } = evt; switch (type) { case 'keydown.esc': this.onEscKeyup(event); break; case 'keydown.ArrowUp': this.handleKeyUpEvent(event); break; case 'keydown.ArrowDown': this.handleKeyDownEvent(event); break; case 'keydown.enter': this.handleKeyEnterEvent(event); break; default: } } } ngOnDestroy() { if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } } setI18nText() { this.i18nCommonText = this.i18n.getI18nText().common; this.i18nSubscription = this.i18n.langChange().subscribe((data) => { this.i18nCommonText = data.common; }); } setAvailableOptions() { if (!Array.isArray(this.availableOptions)) { return; } const result = this.multiple ? this.value : [this.value]; const _value = this.value ? result : []; this.availableOptions = this.availableOptions.map((item, index) => item.id >= 0 && item.option ? { isChecked: _value.findIndex((i) => JSON.stringify(i) === JSON.stringify(item.option)) > -1, id: item.id, option: item.option, } : { isChecked: _value.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) > -1, id: index, option: item }); } setChecked(selectedItem) { if (!selectedItem) { return; } if (!this.isSelectAll) { return; } this.halfChecked = false; if (selectedItem.length === this.availableOptions.length) { this.allChecked = true; } else if (selectedItem.length === 0) { this.allChecked = false; } else { this.halfChecked = true; } } selectAll() { const mutableOption = this.optionImmutableKey ? this.availableOptions.filter((item) => !item.option[this.optionImmutableKey]) : this.availableOptions; const selectedImmutableOption = this.optionImmutableKey ? this.multiItems.filter((item) => item.option[this.optionImmutableKey]) : []; if (mutableOption && mutableOption.length > this.multiItems.length - selectedImmutableOption.length) { mutableOption.forEach((item) => { const indexOfOption = this.multiItems.findIndex((i) => JSON.stringify(i.option) === JSON.stringify(item.option)); if (indexOfOption === -1) { this.multiItems.push({ id: item.id, option: item.option }); } }); } else { this.multiItems = [...selectedImmutableOption]; } this.value = this.multiItems.map((item) => item.option); this.valueChange.emit({ value: this.value, multiItems: this.multiItems }); this.setChecked(this.value); } trackByFn(index, item) { return index; } onEscKeyup(event) { if (event) { event.stopPropagation(); } this.toggleChange.emit(false); } handleKeyUpEvent(event) { if (event) { event.preventDefault(); event.stopPropagation(); } this.selectIndex = this.selectIndex === 0 || this.selectIndex === -1 ? this.availableOptions.length - 1 : this.selectIndex - 1; this.scrollToActive(); } handleKeyDownEvent(event) { if (event) { event.preventDefault(); event.stopPropagation(); } this.selectIndex = this.selectIndex === this.availableOptions.length - 1 ? 0 : this.selectIndex + 1; this.scrollToActive(); } handleKeyEnterEvent(event) { if (event) { event.preventDefault(); event.stopPropagation(); } const item = this.availableOptions[this.selectIndex]; if (item) { this.choose({ option: item.option, index: item.id, event: null }); } else if (this.closeScope === 'all') { this.toggleChange.emit(false); } } scrollToActive() { const that = this; setTimeout(() => { try { const selectIndex = that.selectIndex + (that.isSelectAll ? 1 : 0); // 多了个全选会导致问题,index需要加1 const scrollPane = that.dropdownUl.nativeElement.children[selectIndex]; if (scrollPane.scrollIntoViewIfNeeded) { scrollPane.scrollIntoViewIfNeeded(false); } else { const containerInfo = that.dropdownUl.nativeElement.getBoundingClientRect(); const elementInfo = scrollPane.getBoundingClientRect(); if (elementInfo.bottom > containerInfo.bottom || elementInfo.top < containerInfo.top) { scrollPane.scrollIntoView(false); } } } catch (e) { } }); } resetIndex(resetSelectIndex = true) { this.selectIndex = resetSelectIndex ? -1 : 0; this.activeIndex = -1; this.changeDetectorRef.markForCheck(); } showSelectAll() { return this.isSelectAll && this.multiple && this.availableOptions.length > 0; } getVirtualScrollHeight(len, size) { if (len > 0) { let height = (this.templateItemSize || this.virtualScrollItemSize[size || 'normal']) * len + this.virtualScrollItemSize.space * (len - 1); if (this.isSelectAll && this.multiple) { height += this.virtualScrollItemSize[size ? size : 'normal'] + this.virtualScrollItemSize.space; } const scrollHeight = parseInt(this.scrollHeight, 10); this.scrollHeightNum = height > scrollHeight ? scrollHeight : height; return `${this.scrollHeightNum + this.CONTAINER_MARGINS * 2}px`; } } loadMoreEvent(event) { this.showLoading = true; this.loadMore.emit({ instance: this, event }); } loadStart() { this.showLoading = true; this.changeDetectorRef.detectChanges(); } loadFinish() { this.showLoading = false; this.changeDetectorRef.detectChanges(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ToggleMenuListComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ToggleMenuListComponent, selector: "d-toggle-menu-list", inputs: { options: "options", optionDisabledKey: "optionDisabledKey", optionImmutableKey: "optionImmutableKey", optionGroupKey: "optionGroupKey", size: "size", keyword: "keyword", isFiltering: "isFiltering", enableLazyLoad: "enableLazyLoad", virtualScroll: "virtualScroll", listItemTemplate: "listItemTemplate", loadingTemplateRef: "loadingTemplateRef", noResultItemTemplate: "noResultItemTemplate", customViewTemplate: "customViewTemplate", customViewDirection: "customViewDirection", templateItemSize: "templateItemSize", scrollHeight: "scrollHeight", selectIndex: "selectIndex", hasSelectIndex: "hasSelectIndex", multiple: "multiple", multiItems: "multiItems", value: "value", isSelectAll: "isSelectAll", keepMultipleOrder: "keepMultipleOrder", eventHandle: "eventHandle", closeScope: "closeScope" }, outputs: { toggleChange: "toggleChange", valueChange: "valueChange", loadMore: "loadMore" }, viewQueries: [{ propertyName: "dropdownUl", first: true, predicate: ["dropdownUl"], descendants: true }, { propertyName: "virtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ul\n class=\"devui-dropdown-menu-wrap {{ size ? 'devui-dropdown-menu-' + size : '' }}\"\n dLoading\n positionType=\"relative\"\n [showLoading]=\"showLoading\"\n [message]=\"i18nCommonText?.loading\"\n [loadingTemplateRef]=\"loadingTemplateRef\"\n [backdrop]=\"true\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n>\n <ng-content></ng-content>\n <ul\n #dropdownUl\n *ngIf=\"!virtualScroll || enableLazyLoad; else scrollViewTpl\"\n class=\"devui-select-list-unstyled devui-scrollbar\"\n [ngStyle]=\"{ 'max-height': scrollHeight, width: '100%' }\"\n dLazyLoad\n [enableLazyLoad]=\"enableLazyLoad\"\n (loadMore)=\"loadMoreEvent($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"selectAllTpl\"></ng-template>\n <ng-container *ngFor=\"let item of availableOptions; let index = index; trackBy: trackByFn\">\n <!--list-item \u5355\u4E2A\u9009\u9879\u6A21\u677F-->\n <ng-template\n [ngTemplateOutlet]=\"listItemTemplate\"\n [ngTemplateOutletContext]=\"{\n item: item,\n index: index,\n selectIndex: selectIndex,\n activeIndex: activeIndex,\n choose: choose\n }\"\n ></ng-template>\n </ng-container>\n <div *ngIf=\"availableOptions?.length === 0\" class=\"devui-no-data-tip\">\n <ng-container *ngIf=\"noResultItemTemplate; else noResultDefaultTpl\">\n <ng-template [ngTemplateOutlet]=\"noResultItemTemplate\" [ngTemplateOutletContext]=\"{ options: options }\"></ng-template>\n </ng-container>\n </div>\n </ul>\n</ul>\n<ng-container *ngIf=\"customViewTemplate\">\n <div class=\"devui-select-custom-area\">\n <ng-template [ngTemplateOutlet]=\"customViewTemplate\" [ngTemplateOutletContext]=\"{ $implicit: this, choose: choose }\"></ng-template>\n </div>\n</ng-container>\n\n<!--\u865A\u62DF\u6EDA\u52A8\u6A21\u677F-->\n<ng-template #scrollViewTpl>\n <cdk-virtual-scroll-viewport\n [ngStyle]=\"{\n height: getVirtualScrollHeight(availableOptions.length, size),\n width: '100%',\n 'max-height': scrollHeight\n }\"\n [itemSize]=\"realVirtualScrollItemSize\"\n [minBufferPx]=\"minBuffer\"\n [maxBufferPx]=\"maxBuffer\"\n class=\"viewport-wrapper devui-select-list-unstyled devui-scrollbar\"\n #dropdownUl\n >\n <ng-template [ngTemplateOutlet]=\"selectAllTpl\"></ng-template>\n <ng-container *cdkVirtualFor=\"let item of availableOptions; let index = index; trackBy: trackByFn\">\n <ng-template\n [ngTemplateOutlet]=\"listItemTemplate\"\n [ngTemplateOutletContext]=\"{\n item: item,\n index: index,\n selectIndex: selectIndex,\n activeIndex: activeIndex,\n choose: choose\n }\"\n ></ng-template>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n</ng-template>\n\n<!--\u5168\u9009\u6A21\u677F-->\n<ng-template #selectAllTpl>\n <li class=\"devui-dropdown-item\" *ngIf=\"showSelectAll()\" (click)=\"selectAll()\">\n <span>\n <d-checkbox [label]=\"i18nCommonText.checkAll\" [isShowTitle]=\"false\" [halfchecked]=\"halfChecked\" [(ngModel)]=\"allChecked\"></d-checkbox>\n </span>\n </li>\n</ng-template>\n\n<!--\u65E0\u5185\u5BB9\u6A21\u677F-->\n<ng-template #noResultDefaultTpl>{{ isFiltering ? i18nCommonText?.noRecordsFound : i18nCommonText?.noData }}</ng-template>\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 li{font-size:var(--devui-font-size-lg, 14px);min-height:40px;line-height:28px;padding:8px 12px;width:100%;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;border:0;background-color:transparent;color:var(--devui-text, #191919);cursor:pointer}:host li:hover{background-color:var(--devui-list-item-hover-bg, #f2f2f3);color:var(--devui-list-item-hover-text, #000000)}:host ::ng-deep d-toggle-menu-search .devui-toggle-menu-search>input{background-color:var(--devui-embed-search-bg, #f2f2f3)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.CheckBoxComponent, selector: "d-checkbox", inputs: ["name", "label", "cssClass", "color", "disabled", "isShowTitle", "title", "labelTemplate", "halfchecked", "showAnimation", "showGlowStyle", "beforeChange"], outputs: ["change"] }, { kind: "directive", type: i2.LazyLoadDirective, selector: "[dLazyLoad]", inputs: ["enableLazyLoad", "contentMode", "target", "imgLoadSrc", "direction"], outputs: ["loadMore"] }, { kind: "directive", type: i6.LoadingDirective, selector: "[dLoading]", inputs: ["backdrop", "message", "positionType", "showLoading", "view", "zIndex", "loading", "loadingStyle", "loadingTemplateRef"], exportAs: ["dLoading"] }, { kind: "directive", type: i7.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i7.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i7.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], animations: [fadeInOut], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ToggleMenuListComponent, decorators: [{ type: Component, args: [{ selector: 'd-toggle-menu-list', animations: [fadeInOut], changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<ul\n class=\"devui-dropdown-menu-wrap {{ size ? 'devui-dropdown-menu-' + size : '' }}\"\n dLoading\n positionType=\"relative\"\n [showLoading]=\"showLoading\"\n [message]=\"i18nCommonText?.loading\"\n [loadingTemplateRef]=\"loadingTemplateRef\"\n [backdrop]=\"true\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n>\n <ng-content></ng-content>\n <ul\n #dropdownUl\n *ngIf=\"!virtualScroll || enableLazyLoad; else scrollViewTpl\"\n class=\"devui-select-list-unstyled devui-scrollbar\"\n [ngStyle]=\"{ 'max-height': scrollHeight, width: '100%' }\"\n dLazyLoad\n [enableLazyLoad]=\"enableLazyLoad\"\n (loadMore)=\"loadMoreEvent($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"selectAllTpl\"></ng-template>\n <ng-container *ngFor=\"let item of availableOptions; let index = index; trackBy: trackByFn\">\n <!--list-item \u5355\u4E2A\u9009\u9879\u6A21\u677F-->\n <ng-template\n [ngTemplateOutlet]=\"listItemTemplate\"\n [ngTemplateOutletContext]=\"{\n item: item,\n index: index,\n selectIndex: selectIndex,\n activeIndex: activeIndex,\n choose: choose\n }\"\n ></ng-template>\n </ng-container>\n <div *ngIf=\"availableOptions?.length === 0\" class=\"devui-no-data-tip\">\n <ng-container *ngIf=\"noResultItemTemplate; else noResultDefaultTpl\">\n <ng-template [ngTemplateOutlet]=\"noResultItemTemplate\" [ngTemplateOutletContext]=\"{ options: options }\"></ng-template>\n </ng-container>\n </div>\n </ul>\n</ul>\n<ng-container *ngIf=\"customViewTemplate\">\n <div class=\"devui-select-custom-area\">\n <ng-template [ngTemplateOutlet]=\"customViewTemplate\" [ngTemplateOutletContext]=\"{ $implicit: this, choose: choose }\"></ng-template>\n </div>\n</ng-container>\n\n<!--\u865A\u62DF\u6EDA\u52A8\u6A21\u677F-->\n<ng-template #scrollViewTpl>\n <cdk-virtual-scroll-viewport\n [ngStyle]=\"{\n height: getVirtualScrollHeight(availableOptions.length, size),\n width: '100%',\n 'max-height': scrollHeight\n }\"\n [itemSize]=\"realVirtualScrollItemSize\"\n [minBufferPx]=\"minBuffer\"\n [maxBufferPx]=\"maxBuffer\"\n class=\"viewport-wrapper devui-select-list-unstyled devui-scrollbar\"\n #dropdownUl\n >\n <ng-template [ngTemplateOutlet]=\"selectAllTpl\"></ng-template>\n <ng-container *cdkVirtualFor=\"let item of availableOptions; let index = index; trackBy: trackByFn\">\n <ng-template\n [ngTemplateOutlet]=\"listItemTemplate\"\n [ngTemplateOutletContext]=\"{\n item: item,\n index: index,\n selectIndex: selectIndex,\n activeIndex: activeIndex,\n choose: choose\n }\"\n ></ng-template>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n</ng-template>\n\n<!--\u5168\u9009\u6A21\u677F-->\n<ng-template #selectAllTpl>\n <li class=\"devui-dropdown-item\" *ngIf=\"showSelectAll()\" (click)=\"selectAll()\">\n <span>\n <d-checkbox [label]=\"i18nCommonText.checkAll\" [isShowTitle]=\"false\" [halfchecked]=\"halfChecked\" [(ngModel)]=\"allChecked\"></d-checkbox>\n </span>\n </li>\n</ng-template>\n\n<!--\u65E0\u5185\u5BB9\u6A21\u677F-->\n<ng-template #noResultDefaultTpl>{{ isFiltering ? i18nCommonText?.noRecordsFound : i18nCommonText?.noData }}</ng-template>\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 li{font-size:var(--devui-font-size-lg, 14px);min-height:40px;line-height:28px;padding:8px 12px;width:100%;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;border:0;background-color:transparent;color:var(--devui-text, #191919);cursor:pointer}:host li:hover{background-color:var(--devui-list-item-hover-bg, #f2f2f3);color:var(--devui-list-item-hover-text, #000000)}:host ::ng-deep d-toggle-menu-search .devui-toggle-menu-search>input{background-color:var(--devui-embed-search-bg, #f2f2f3)}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.I18nService }], propDecorators: { options: [{ type: Input }], optionDisabledKey: [{ type: Input }], optionImmutableKey: [{ type: Input }], optionGroupKey: [{ type: Input }], size: [{ type: Input }], keyword: [{ type: Input }], isFiltering: [{ type: Input }], enableLazyLoad: [{ type: Input }], virtualScroll: [{ type: Input }], listItemTemplate: [{ type: Input }], loadingTemplateRef: [{ type: Input }], noResultItemTemplate: [{ type: Input }], customViewTemplate: [{ type: Input }], customViewDirection: [{ type: Input }], templateItemSize: [{ type: Input }], scrollHeight: [{ type: Input }], selectIndex: [{ type: Input }], hasSelectIndex: [{ type: Input }], multiple: [{ type: Input }], multiItems: [{ type: Input }], value: [{ type: Input }], isSelectAll: [{ type: Input }], keepMultipleOrder: [{ type: Input }], eventHandle: [{ type: Input }], closeScope: [{ type: Input }], toggleChange: [{ type: Output }], valueChange: [{ type: Output }], loadMore: [{ type: Output }], dropdownUl: [{ type: ViewChild, args: ['dropdownUl'] }], virtualScrollViewport: [{ type: ViewChild, args: [CdkVirtualScrollViewport] }] } }); class ToggleMenuContainerComponent { set isOpen(value) { if (this._isOpen === value) { // 如果toggle-container自身触发开关,父级组件的isOpen随toggleChange改变,会通过input再次返回导致重复触发,通过值是否变化屏蔽该次触发 return; } this._isOpen = value; this.toggleChange.emit(value); this.setDocumentClickListener(); if (this.selectWrapper) { this.dropDownWidth = this.width ? this.width : this.selectWrapper.nativeElement.offsetWidth; } if (value) { addClassToOrigin(this.selectWrapper); setTimeout(() => { this.startAnimation = true; this.changeDetectorRef.detectChanges(); }); } else { removeClassFromOrigin(this.selectWrapper); } } get isOpen() { return this._isOpen; } constructor(doc, element, windowRef, ngZone, renderer, changeDetectorRef, devConfigService, scrollStrategyOption) { this.doc = doc; this.element = element; this.windowRef = windowRef; this.ngZone = ngZone; this.renderer = renderer; this.changeDetectorRef = changeDetectorRef; this.devConfigService = devConfigService; this.scrollStrategyOption = scrollStrategyOption; /** * 【可选】是否appendToBody */ this.appendToBody = false; this.appendToBodyDirections = ['rightDown', 'leftDown', 'rightUp', 'leftUp']; /** * 【可选】是否禁用下拉框 */ this.disabled = false; /** * 【可选】暂停使用下拉功能,不添加禁用效果 */ this.paused = false; /** * 【可选】是否展示动效 */ this.showAnimation = true; /** * 【可选】是否支持聚焦自动展开下拉 */ this.toggleOnFocus = false; this.closeScope = 'all'; this.direction = 'down'; /** * select下拉toggle事件,值为true或false */ this.toggleChange = new EventEmitter(); this.passEvent = new EventEmitter(); this._isOpen = false; this.isInit = true; this.isMouseEvent = false; this.startAnimation = false; this.labelMinHeight = 20; // position.top小于20px时候,表示光标在第一行 this.popDirection = 'bottom'; this.menuPosition = 'bottom'; this.onDocumentClick = (event) => { if (this.listInstance && this.isOpen && this.selectBoxElement && !this.selectBoxElement.nativeElement.contains(event.target)) { this.isOpen = false; this.listInstance.selectIndex = this.listInstance.activeIndex ? this.listInstance.activeIndex : -1; this.changeDetectorRef.detectChanges(); } }; this.document = this.doc; this.scrollStrategy = this.scrollStrategyOption.reposition(); } ngOnInit() { this.isInit = false; this.setPositions(); } ngOnChanges(changes) { const { appendToBodyDirections, appendToBodyScrollStrategy } = changes; const globalScrollStrategy = this.devConfigService.getConfigForApi('appendToBodyScrollStrategy'); if (appendToBodyDirections) { this.setPositions(); } if (this.appendToBodyScrollStrategy && (appendToBodyScrollStrategy || globalScrollStrategy)) { const func = this.scrollStrategyOption[this.appendToBodyScrollStrategy]; this.scrollStrategy = func(); } } animationEnd() { if (!this.isOpen && this.selectMenuElement && this.showAnimation) { const targetElement = this.selectMenuElement.nativeElement; this.startAnimation = false; setTimeout(() => { // 动画会覆盖导致display还是block, 所以要等动画覆盖完 this.renderer.setStyle(targetElement, 'display', 'none'); }); } } setPositions() { if (this.appendToBodyDirections && this.appendToBodyDirections.length > 0) { this.overlayPositions = this.appendToBodyDirections .map((position) => { if (typeof position === 'string') { return AppendToBodyDirectionsConfig[position]; } else { return position; } }) .filter((position) => position !== undefined); } else { this.overlayPositions = undefined; } } updatePosition() { if (this.appendToBody) { setTimeout(() => { if (this.connectedOverlay && this.connectedOverlay.overlayRef) { this.connectedOverlay.overlayRef.updatePosition(); } }); } } setPassEvent(event, type) { if (this.isOpen || this.paused) { this.passEvent.emit({ event, type }); } } onPositionChange(position) { this.menuPosition = position.connectionPair.originY; } setDocumentClickListener() { this.ngZone.runOutsideAngular(() => { if (this.isOpen) { this.document.addEventListener('click', this.onDocumentClick); } else { this.document.removeEventListener('click', this.onDocumentClick); } }); } // mousedown mouseup解决focus与click冲突问题 setMouseEventTrue(event) { this.isMouseEvent = true; } setMouseEventFalse(event) { this.isMouseEvent = false; } autoToggle(event) { event.preventDefault(); event.stopPropagation(); if (this.toggleOnFocus && !this.disabled && !this.paused && !this.isOpen && !this.isMouseEvent) { this.toggle(); } } toggle(event) { if (this.disabled || this.paused) { this.isOpen = false; return; } if (!this.isOpen) { if (!this.appendToBody) { let direction = ''; switch (this.direction) { case 'auto': direction = this.isBottomRectEnough() ? 'bottom' : 'top'; break; case 'down': direction = 'bottom'; break; case 'up': direction = 'top'; break; default: direction = 'bottom'; } this.popDirection = direction; } else { this.updateCdkConnectedOverlayOrigin(); } } else { if (!this.showAnimation) { this.startAnimation = false; } if (this.closeScope === 'none' || (this.closeScope === 'blank' && this.element.nativeElement.contains(event.target))) { return; } } this.isOpen = !this.isOpen; } isBottomRectEnough() { const selectMenuElement = this.selectWrapper.nativeElement; const selectInputElement = this.selectBoxElement; const displayStyle = selectMenuElement.style.display || window.getComputedStyle(selectMenuElement).display; let tempStyle; if (displayStyle === 'none') { // 必要, 否则首次展开必有问题, 如果animationEnd之后设置为none也会有问题 tempStyle = { visibility: selectMenuElement.style.visibility, display: selectMenuElement.style.display, transform: selectMenuElement.style.transform, }; this.renderer.setStyle(selectMenuElement, 'visibility', 'hidden'); this.renderer.setStyle(selectMenuElement, 'display', 'block'); this.renderer.setStyle(selectMenuElement, 'transform', 'translate(0, -9999)'); } const elementHeight = selectMenuElement.offsetHeight; const bottomDistance = this.windowRef.innerHeight - selectInputElement.nativeElement.getBoundingClientRect().bottom; const isBottomEnough = bottomDistance >= elementHeight; if (displayStyle === 'none') { this.renderer.setStyle(selectMenuElement, 'visibility', tempStyle.visibility); this.renderer.setStyle(selectMenuElement, 'display', tempStyle.display); this.renderer.setStyle(selectMenuElement, 'transform', tempStyle.transform); } return isBottomEnough; } updateCdkConnectedOverlayOrigin() { if (this.selectWrapper?.nativeElement) { this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(formWithDropDown(this.selectWrapper) || this.selectWrapper.nativeElement); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ToggleMenuContainerComponent, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i1$2.WindowRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i2.DevConfigService }, { token: i3$1.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ToggleMenuContainerComponent, selector: "d-toggle-menu-container", inputs: { isOpen: "isOpen", appendToBody: "appendToBody", appendToBodyDirections: "appendToBodyDirections", appendToBodyScrollStrategy: "appendToBodyScrollStrategy", width: "width", size: "size", overview: "overview", position: "position", disabled: "disabled", paused: "paused", showAnimation: "showAnimation", toggleOnFocus: "toggleOnFocus", closeScope: "closeScope", direction: "direction", selectWrapper: "selectWrapper" }, outputs: { toggleChange: "toggleChange", passEvent: "passEvent" }, host: { listeners: { "mousedown": "setMouseEventTrue($event)", "mouseup": "setMouseEventFalse($event)" } }, queries: [{ propertyName: "listInstance", first: true, predicate: ToggleMenuListComponent, descendants: true }], viewQueries: [{ propertyName: "selectBoxElement", first: true, predicate: ["selectBox"], descendants: true, static: true }, { propertyName: "selectMenuElement", first: true, predicate: ["selectMenu"], descendants: true, static: true }, { propertyName: "connectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n #selectBox\r\n class=\"devui-toggle-menu-container devui-toggle-menu{{ size ? '-' + size : '' }} {{ disabled ? 'disabled' : '' }}\"\r\n [tabindex]=\"0\"\r\n (click)=\"toggle($event)\"\r\n (focus)=\"autoToggle($event); setPassEvent($event, 'focus')\"\r\n (blur)=\"setPassEvent($event, 'blur')\"\r\n (keydown.esc)=\"setPassEvent($event, 'keydown.esc')\"\r\n (keydown.ArrowUp)=\"setPassEvent($event, 'keydown.ArrowUp')\"\r\n (keydown.ArrowDown)=\"setPassEvent($event, 'keydown.ArrowDown')\"\r\n (keydown.enter)=\"setPassEvent($event, 'keydown.enter')\"\r\n (keydown)=\"setPassEvent($event, 'keydown')\"\r\n>\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"appendToBody; else selectDropdownTpl\">\r\n <ng-template\r\n cdk-connected-overlay\r\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\r\n [cdkConnectedOverlayWidth]=\"dropDownWidth\"\r\n [cdkConnectedOverlayOpen]=\"isOpen\"\r\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\r\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\r\n (positionChange)=\"onPositionChange($event)\"\r\n (backdropClick)=\"isOpen = false\"\r\n (detach)=\"isOpen && (isOpen = false)\"\r\n >\r\n <ng-template [ngTemplateOutlet]=\"selectDropdownTpl\"></ng-template>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #selectDropdownTpl>\r\n <div\r\n #selectMenu\r\n class=\"devui-dropdown-menu\"\r\n [ngClass]=\"{\r\n 'devui-dropdown-menu-cdk': appendToBody,\r\n 'devui-custom-right': listInstance?.customViewDirection === 'right',\r\n 'devui-custom-left': listInstance?.customViewDirection === 'left',\r\n 'devui-custom-top': listInstance?.customViewDirection === 'top',\r\n 'devui-dropdown-menu-multiple': listInstance?.multiple\r\n }\"\r\n [@fadeInOut]=\"isOpen && startAnimation ? (appendToBody ? menuPosition : popDirection) : 'void'\"\r\n (@fadeInOut.done)=\"animationEnd()\"\r\n [@.disabled]=\"!showAnimation\"\r\n >\r\n <ng-content select=\"d-toggle-menu-list\"></ng-content>\r\n </div>\r\n </ng-template>\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 .devui-toggle-menu-container{padding:0;width:100%;height:auto;outline:none;display:flex;flex-direction:row;justify-content:space-between;align-items:center;border-radius:var(--devui-border-radius, 2px);border:solid 1px var(--devui-form-control-line, #dbdbdb);background-color:var(--devui-base-bg, #ffffff)}:host .devui-toggle-menu-container.disabled{color:var(--devui-disabled-text, #c2c2c2);border-color:var(--devui-disabled-line, #e6e6e6);background-color:var(--devui-disabled-bg, #f3f3f3)}:host ::ng-deep d-toggle-menu-label{max-width:100%}:host ::ng-deep .devui-toggle-menu{font-size:var(--devui-font-size-md, 12px);min-height:26px}:host ::ng-deep .devui-toggle-menu d-toggle-menu-input,:host ::ng-deep .devui-toggle-menu d-toggle-menu-placeholder,:host ::ng-deep .devui-toggle-menu d-toggle-menu-search{font-size:var(--devui-font-size-md, 12px);min-height:26px;line-height:18px}:host ::ng-deep .devui-toggle-menu-lg{font-size:var(--devui-font-size-lg, 14px);min-height:46px}:host ::ng-deep .devui-toggle-menu-lg d-toggle-menu-input,:host ::ng-deep .devui-toggle-menu-lg d-toggle-menu-placeholder,:host ::ng-deep .devui-toggle-menu-lg d-toggle-menu-search{font-size:var(--devui-font-size-lg, 14px);min-height:46px;line-height:46px}:host ::ng-deep .devui-toggle-menu-lg d-toggle-menu-list-item{font-size:var(--devui-font-size-lg, 14px);min-height:40px;line-height:28px}:host ::ng-deep .devui-toggle-menu-sm{font-size:var(--devui-font-size-sm, 12px);min-height:24px}:host ::ng-deep .devui-toggle-menu-sm d-toggle-menu-input,:host ::ng-deep .devui-toggle-menu-sm d-toggle-menu-placeholder,:host ::ng-deep .devui-toggle-menu-sm d-toggle-menu-search,:host ::ng-deep .devui-toggle-menu-sm d-toggle-menu-list-item{font-size:var(--devui-font-size-sm, 12px);min-height:24px;line-height:14px}:host ::ng-deep .devui-toggle-menu-sm d-toggle-menu-list-item{min-height:26px}.devui-dropdown-menu{width:100%;padding-bottom:0}.devui-dropdown-menu:not(.devui-dropdown-menu-cdk){width:calc(100% + 2px);left:-1px;margin:4px 0}.devui-dropdown-menu-cdk{position:static;display:block;width:100%}::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk{font-size:var(--devui-font-size-md, 12px);min-height:26px}::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk d-toggle-menu-input,::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk d-toggle-menu-placeholder,::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk d-toggle-menu-search{font-size:var(--devui-font-size-md, 12px);min-height:26px;line-height:18px}::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-lg{font-size:var(--devui-font-size-lg, 14px);min-height:46px}::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-lg d-toggle-menu-input,::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-lg d-toggle-menu-placeholder,::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-lg d-toggle-menu-search{font-size:var(--devui-font-size-lg, 14px);min-height:46px;line-height:46px}::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-lg d-toggle-menu-list-item{font-size:var(--devui-font-size-lg, 14px);min-height:40px;line-height:28px}::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-sm{font-size:var(--devui-font-size-sm, 12px);min-height:24px}::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-sm d-toggle-menu-input,::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-sm d-toggle-menu-placeholder,::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-sm d-toggle-menu-search,::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-sm d-toggle-menu-list-item{font-size:var(--devui-font-size-sm, 12px);min-height:24px;line-height:14px}::ng-deep .devui-dropdown-menu.devui-dropdown-menu-cdk-sm d-toggle-menu-list-item{min-height:26px}::ng-deep .devui-dropdown-menu.devui-custom-right d-toggle-menu-list,::ng-deep .devui-dropdown-menu.devui-custom-left d-toggle-menu-list,::ng-deep .devui-dropdown-menu.devui-custom-top d-toggle-menu-list{width:100%;display:flex!important}::ng-deep .devui-dropdown-menu.devui-custom-right d-toggle-menu-list .devui-dropdown-menu-wrap,::ng-deep .devui-dropdown-menu.devui-custom-left d-toggle-menu-list .devui-dropdown-menu-wrap,::ng-deep .devui-dropdown-menu.devui-custom-top d-toggle-menu-list .devui-dropdown-menu-wrap{display:inline-block}::ng-deep .devui-dropdown-menu.devui-custom-right d-toggle-menu-list .devui-select-custom-area,::ng-deep .devui-dropdown-menu.devui-custom-left d-toggle-menu-list .devui-select-custom-area,::ng-deep .devui-dropdown-menu.devui-custom-top d-toggle-menu-list .devui-select-custom-area{display:inline-block;overflow:auto}::ng-deep .devui-dropdown-menu.devui-custom-right d-toggle-menu-list:not(.devui-custom-top)>.devui-dropdown-menu-wrap,::ng-deep .devui-dropdown-menu.devui-custom-left d-toggle-menu-list:not(.devui-custom-top)>.devui-dropdown-menu-wrap,::ng-deep .devui-dropdown-menu.devui-custom-top d-toggle-menu-list:not(.devui-custom-top)>.devui-dropdown-menu-wrap{width:calc(50% - 1px)}::ng-deep .devui-dropdown-menu.devui-custom-right d-toggle-menu-list:not(.devui-custom-top)>.devui-select-custom-area,::ng-deep .devui-dropdown-menu.devui-custom-left d-toggle-menu-list:not(.devui-custom-top)>.devui-select-custom-area,::ng-deep .devui-dropdown-menu.devui-custom-top d-toggle-menu-list:not(.devui-custom-top)>.devui-select-custom-area{width:50%}::ng-deep .devui-dropdown-menu.devui-custom-right d-toggle-menu-list:not(.devui-custom-top)>.devui-select-custom-area>.devui-select-custom-area:before,::ng-deep .devui-dropdown-menu.devui-custom-left d-toggle-menu-list:not(.devui-custom-top)>.devui-select-custom-area>.devui-select-custom-area:before,::ng-deep .devui-dropdown-menu.devui-custom-top d-toggle-menu-list:not(.devui-custom-top)>.devui-select-custom-area>.devui-select-custom-area:before{display:none}::ng-deep .devui-dropdown-menu.devui-custom-top{flex-direction:column-reverse}::ng-deep .devui-dropdown-menu.devui-custom-left d-toggle-menu-list .devui-select-custom-area{border-right:1px solid var(--devui-dividing-line, #f0f0f0);order:-1}::ng-deep .devui-dropdown-menu.devui-custom-right d-toggle-menu-list .devui-select-custom-area{border-left:1px solid var(--devui-dividing-line, #f0f0f0)}::ng-deep .devui-dropdown-menu.devui-custom-top>.devui-select-custom-area{border-bottom:1px solid var(--devui-dividing-line, #f0f0f0)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "