UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

567 lines (565 loc) 87.3 kB
/* MIT License Copyright (c) 2019 Temainfo Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Component, Input, Optional, Inject, ViewChildren, EventEmitter, Output, ViewChild, Self, } from '@angular/core'; import { ActiveDescendantKeyManager } from '@angular/cdk/a11y'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { AUTOCOMPLETE_CONFIG } from './interfaces/autocomplete.config'; import { DataSourceList } from '../core/classes/datasource-list'; import { TlItemSelectedDirective } from '../core/directives/itemSelected/item-selected.directive'; import { scrollIntoView } from '../core/helper/scrollIntoView'; import { SelectedItemService } from './services/selected-item.service'; import { Subscription } from 'rxjs'; import * as objectPath from 'object-path'; import { ValueAccessorBase } from '../input/core/value-accessor'; import { TlInput } from '../input/input'; import * as i0 from "@angular/core"; import * as i1 from "../i18n/i18n.service"; import * as i2 from "./services/selected-item.service"; import * as i3 from "@angular/forms"; import * as i4 from "@angular/common"; import * as i5 from "@angular/cdk/overlay"; import * as i6 from "@angular/cdk/scrolling"; import * as i7 from "../input/input"; import * as i8 from "../loader/loader"; import * as i9 from "../blockui/blockui"; import * as i10 from "../internals/components/label/label"; import * as i11 from "../core/components/filter/filter-container"; import * as i12 from "../core/directives/itemSelected/item-selected.directive"; import * as i13 from "./components/autocomplete-template"; import * as i14 from "./selected-validator"; import * as i15 from "../misc/highlight.pipe"; export class TlAutoComplete extends ValueAccessorBase { set data(value) { this._data = value; } get data() { return this._data; } set control(item) { this._control = item; } constructor(autoCompleteConfig, change, i18n, itemSelectedService, ngControl) { super(); this.change = change; this.i18n = i18n; this.itemSelectedService = itemSelectedService; this.ngControl = ngControl; this.totalLength = 1000; this.filterOperator = '%'; this.rowsPage = 100; this.lazyMode = false; this.rowHeight = 40; this.debounceTime = 200; this.keyText = ''; this.keyValue = null; this.openFocus = true; this.chainFilter = false; this.loading = false; this.clearButton = true; this.clearOnSelect = false; this.disabled = null; this.required = null; this.color = 'basic'; this.labelPlacement = 'left'; this.textBefore = null; this.textAfter = null; this.iconBefore = null; this.iconAfter = null; this.labelSize = '100px'; this.height = '23px'; this.containerHeight = '200px'; this.searchBy = ''; this.label = ''; this.identifier = null; this.placeholder = 'Search...'; this.modelMode = 'object'; this.lazyLoad = new EventEmitter(); this.selectItem = new EventEmitter(); this.changeSelected = new EventEmitter(); this.filter = new EventEmitter(); this.clickAddon = new EventEmitter(); this.isOpen = false; this.focused = false; this.description = ''; this.nothingFound = false; this.messageLoading = this.i18n.getLocale().AutoComplete.messageLoading; this.nothingFoundMessage = this.i18n.getLocale().AutoComplete.nothingFoundMessage; this.filtering = false; this.modelInitialized = false; this.lastItemScrolled = 0; this.subscription = new Subscription(); this._data = []; this.setControl(); this.setOptions(autoCompleteConfig); } get control() { return this.ngControl?.control; } setControl() { if (this.ngControl) { this.ngControl.valueAccessor = this; } } ngAfterContentInit() { this.handleModelLazy(); this.handleModelCached(); this.listenModelChanges(); this.change.markForCheck(); } ngAfterViewInit() { this.keyManager = new ActiveDescendantKeyManager(this.listItems); this.tempContainerHeight = this.containerHeight; this.validateKeyValue(); } getNativeInput() { return this.tlinput.getNativeInput(); } validateKeyValue() { if (!this.isModelModeString() && !this.keyValue && !this.identifier) { throw Error('The AutoComplete should have an [identifier] key property, ' + ' because the property [keyValue] is null and the list is working on [modelMode] \'object\''); } } listenModelChanges() { if (this.control) { this.control.valueChanges.subscribe((value) => { if (this.dataSource) { this.handleModelLazy(); this.handleModelCached(); } }); } } handleItemSelected() { if (this.itemSelectedService.itemSelected) { this.scrollToIndex().then(value => { this.keyManager.setActiveItem(this.itemSelectedService.itemSelected.indexSelected); }); } } scrollToIndex() { return new Promise(resolve => { setTimeout(() => { if (this.cdkVirtualScroll) { this.cdkVirtualScroll.scrollToIndex(this.lastItemScrolled); this.change.markForCheck(); } resolve(); }, 200); }); } onScrollIndexChange($event) { if ($event > 0) { this.lastItemScrolled = $event; } } onInput() { this.setIsOpen(true); this.setFiltering(true); } close() { if (!this.control.disabled) { this.value = null; this.setDescriptionValue(''); this.selected = null; } } onBackdropClick() { this.setIsOpen(false); this.setFiltering(false); } handleModelLazy() { if (this.value && this.lazyMode) { const value = objectPath.get(this.value, this.keyText); if (value) { this.setDescriptionValue(value); this.handleKeyModelValue(this.value); this.changeSelected.emit(this.value); } } } setDescriptionValue(value) { this.description = value; } handleModelCached() { if (this.dataSource && !this.lazyMode && this.data.length > 0) { this.data.forEach((value) => { if (this.value) { if (String(this.getItemCompare(value)) === String(this.getCompareModel())) { this.setDescriptionValue(objectPath.get(value, this.keyText)); this.handleKeyModelValue(value); this.changeSelected.emit(value); } } }); } } getItemCompare(value) { if (!this.keyValue || this.isModelModeString()) { return objectPath.get(value, this.identifier); } return objectPath.get(value, this.keyValue); } handleKeyModelValue(value) { this.modelInitialized = true; this.selected = value; if (!this.isModelModeString() && this.keyValue) { this.value = objectPath.get(value, this.keyValue); return; } if (this.isModelModeString() && !this.keyValue) { this.value = objectPath.get(value, this.identifier); return; } if (this.isModelModeString() && this.keyValue) { this.value = objectPath.get(value, this.keyValue); return; } this.value = value; } setOptions(options) { if (options) { const self = this; Object.keys(options).forEach(function (key) { self[key] = options[key]; }); } } setSelected(itemDirective) { this.selected = itemDirective.itemSelected; this.keyManager.setActiveItem(itemDirective); this.itemSelectedService.itemSelected = itemDirective; } stopEvent($event) { $event.preventDefault(); $event.stopPropagation(); } handleKeyArrowDown($event) { if (this.loading) { this.stopEvent($event); return; } this.handleEventOpenList($event); if (!this.keyManager.activeItem) { this.keyManager.setFirstItemActive(); return; } this.keyManager.onKeydown($event); scrollIntoView(this.keyManager.activeItem.element.nativeElement); } handleKeyArrowUp($event) { this.handleEventOpenList($event); if (!this.keyManager.activeItem) { this.keyManager.setFirstItemActive(); return; } this.keyManager.onKeydown($event); scrollIntoView(this.keyManager.activeItem.element.nativeElement); } handleKeyBackspace() { this.value = null; } handleEventOpenList($event) { if (this.isOpen) { this.stopEvent($event); } } handleKeyEscape($event) { if (this.isOpen) { $event.stopPropagation(); } this.setIsOpen(false); } handleKeyEnter($event) { if (this.keyManager.activeItem && this.isOpen) { if (this.keyManager.activeItem.itemSelected) { this.selectItem.emit(this.keyManager.activeItem.itemSelected); this.setSelected(this.keyManager.activeItem); this.setDescriptionValue(objectPath.get(this.keyManager.activeItem.itemSelected, this.keyText)); this.handleKeyModelValue(this.keyManager.activeItem.itemSelected); } this.handleClose($event); } } handleFocus() { this.focused = true; if (this.openFocus && !this.keyManager.activeItem && !this.isDisabled && !this.disabled) { if (this.openFocus) { this.setIsOpen(true); } } } isModelModeString() { return this.modelMode === 'string'; } getCompareModel() { if (this.keyValue && !this.isModelModeString()) { return objectPath.get(this.value, this.keyValue); } if (!this.isModelModeString() && !this.keyValue) { return objectPath.get(this.value, this.identifier); } return this.value; } onSelectItem(value, item) { this.setDescriptionValue(objectPath.get(value, this.keyText)); this.handleKeyModelValue(value); this.setSelected(item); this.selectItem.emit(value); this.handleClose(); this.change.detectChanges(); } handleClose($event) { if (this.clearOnSelect) { this.setDescriptionValue(''); this.tlinput.setFocus(); this.selected = null; if ($event) { $event.stopPropagation(); } } this.setIsOpen(false); } setUpData(value) { if (!this.dataSource) { this.dataSource = new DataSourceList({ dataSource: value, pageSize: this.rowsPage, totalLength: this.totalLength, lazyMode: this.lazyMode }); this.listenLoadData(); this.handleModelCached(); } this.dataSource.setData(value); this.loading = false; // this.setContainerHeight( value ); this.setNotFound(value.length === 0); this.setFirstItemActive(); } setContainerHeight(data) { if (this.filtering) { const currentHeight = parseInt(this.containerHeight, 10); const maxContent = Math.round(currentHeight / this.rowHeight); if (data.length === 0) { this.tempContainerHeight = this.rowHeight + 'px'; } else if (data.length <= maxContent) { this.tempContainerHeight = (data.length * this.rowHeight) + 'px'; } else { this.tempContainerHeight = this.containerHeight; } this.change.detectChanges(); } } setFirstItemActive() { if (this.keyManager) { setTimeout(() => { this.keyManager.setFirstItemActive(); }, 100); } } listenLoadData() { this.subscription.add(this.dataSource.loadMoreData.subscribe((data) => { this.lazyLoad.emit({ skip: data.skip, limit: data.limit, ...this.getFilters(this.description) }); this.loading = true; })); } onPositionChange($event) { this.positionOverlay = $event.connectionPair.originY; this.change.detectChanges(); } setIsOpen(value) { this.isOpen = value; } getItemText(item) { return objectPath.get(item, this.keyText); } toggleIsOpen() { if (!this.disabled && !this.isDisabled) { this.isOpen = !this.isOpen; this.tlinput.setFocus(); this.handleItemSelected(); } } getFilters(term) { const fields = {}; fields[this.searchBy] = !this.chainFilter ? { matchMode: 'contains', value: term } : term.split(this.filterOperator).map((value) => { return { matchMode: 'contains', value: value }; }); return { fields: fields, operator: 'or' }; } setScrollVirtual() { if (this.cdkVirtualScroll) { this.cdkVirtualScroll.elementRef.nativeElement.scrollTop = 0; } } onFilter($event) { this.setScrollVirtual(); this.setFiltering(true); this.dataSource.resetPages(); if (this.lazyMode) { this.filter.emit(this.getFilters($event)); return; } if ($event) { this.dataSource.setArray($event.length); this.setUpData($event); return; } this.dataSource.setData([]); this.setNotFound(true); this.selected = null; } setFiltering(value) { this.filtering = value; } setNotFound(value) { this.nothingFound = value; } ngOnChanges({ data, totalLength }) { if (totalLength && !totalLength['firstChange']) { if (this.dataSource) { this.dataSource.setArray(totalLength['currentValue']); } } if (data && this.lazyMode) { this.setUpData(data['currentValue']); return; } if (data && data['currentValue'] !== undefined && !this.lazyMode) { if (data['currentValue'].length > 0) { this.setUpData(data['currentValue']); } } } ngOnDestroy() { this.subscription.unsubscribe(); if (this.dataSource) { this.dataSource.unsubscribe(); } } } /** @nocollapse */ TlAutoComplete.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlAutoComplete, deps: [{ token: AUTOCOMPLETE_CONFIG, optional: true }, { token: i0.ChangeDetectorRef }, { token: i1.I18nService }, { token: i2.SelectedItemService }, { token: i3.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlAutoComplete.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlAutoComplete, selector: "tl-autocomplete", inputs: { data: "data", control: "control", totalLength: "totalLength", filterOperator: "filterOperator", rowsPage: "rowsPage", lazyMode: "lazyMode", rowHeight: "rowHeight", template: "template", debounceTime: "debounceTime", keyText: "keyText", keyValue: "keyValue", openFocus: "openFocus", chainFilter: "chainFilter", loading: "loading", clearButton: "clearButton", clearOnSelect: "clearOnSelect", disabled: "disabled", required: "required", color: "color", labelPlacement: "labelPlacement", textBefore: "textBefore", textAfter: "textAfter", iconBefore: "iconBefore", iconAfter: "iconAfter", labelSize: "labelSize", height: "height", containerHeight: "containerHeight", searchBy: "searchBy", label: "label", identifier: "identifier", placeholder: "placeholder", modelMode: "modelMode" }, outputs: { lazyLoad: "lazyLoad", selectItem: "selectItem", changeSelected: "changeSelected", filter: "filter", clickAddon: "clickAddon" }, providers: [SelectedItemService], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }, { propertyName: "cdkVirtualScroll", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "tlinput", first: true, predicate: TlInput, descendants: true, static: true }, { propertyName: "listItems", predicate: TlItemSelectedDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"ui-autocomplete-box\">\n <tl-label *ngIf=\"label\" [required]=\"required\" [labelTitle]=\"label\" [labelPlacement]=\"labelPlacement\" [labelSize]=\"labelSize\"></tl-label>\n <div [class]=\"'ui-autocomplete-wrapper ' + color\">\n <div class=\"ui-wrapper-filter\"\n #wrapper\n [class.disabled]=\"disabled || isDisabled\"\n [style.height]=\"height\"\n [class.opened]=\"isOpen && positionOverlay !== 'top'\"\n [class.openedAbove]=\"positionOverlay === 'top' && isOpen\">\n <div *ngIf=\"loading\" class=\"ui-loading\" [style.height]=\"height\">\n <tl-loader></tl-loader>\n </div>\n <tl-input\n (overlayOrigin)=\"trigger = $event\"\n [disabled]=\"disabled || isDisabled\"\n [placeholder]=\"placeholder\"\n [color]=\"color\"\n [clearButton]=\"clearButton\"\n [iconBefore]=\"iconBefore\"\n [iconAfter]=\"iconAfter\"\n [textBefore]=\"textBefore\"\n [textAfter]=\"textAfter\"\n [height]=\"height\"\n [required]=\"required\"\n (clear)=\"close()\"\n (click)=\"toggleIsOpen()\"\n (clickAddon)=\"clickAddon.emit($event)\"\n (keydown.backspace)=\"handleKeyBackspace()\"\n (keydown.ArrowUp)=\"handleKeyArrowUp($event)\"\n (keydown.ArrowDown)=\"handleKeyArrowDown($event)\"\n (keydown.escape)=\"handleKeyEscape($event)\"\n selectedItem\n [selected]=\"value\"\n class=\"ui-input\"\n [(ngModel)]=\"description\"\n (keydown.enter)=\"handleKeyEnter($event)\"\n (keydown.shift.tab)=\"isOpen = false\"\n (keydown.tab)=\"isOpen = false\"\n (focus)=\"handleFocus()\"\n (focusout)=\"focused = false\"\n (input)=\"onInput()\">\n </tl-input>\n <input readonly notform class=\"ui-model-input\" [(ngModel)]=\"value\">\n </div>\n <tl-filter-container [searchTerm]=\"description\"\n [debounceTime]=\"debounceTime\"\n [lazyMode]=\"lazyMode\"\n [source]=\"data\"\n [searchBy]=\"searchBy\"\n (filter)=\"onFilter($event)\">\n <ng-template cdkConnectedOverlay\n (backdropClick)=\"onBackdropClick()\"\n (positionChange)=\"onPositionChange($event)\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayOpen]=\"isOpen\">\n <cdk-virtual-scroll-viewport [class]=\"'ui-scroll-view ' + color\"\n [style.height]=\"tempContainerHeight\"\n [itemSize]=\"rowHeight\"\n [style.width]=\"wrapper.offsetWidth - 2 + 'px'\"\n (scrolledIndexChange)=\"onScrollIndexChange($event)\"\n [tlBlockui]=\"nothingFound\"\n [blockuiConfig]=\"{ 'message': nothingFoundMessage }\"\n [class.scrollOpenedAbove]=\"positionOverlay === 'top' && isOpen\"\n [class.scrollOpened]=\"isOpen && positionOverlay !== 'top'\">\n <div [style.height]=\"rowHeight + 'px'\"\n [itemSelected]=\"item\"\n [indexSelected]=\"i\"\n #select=\"selectItem\"\n *cdkVirtualFor=\"let item of dataSource; let i = index\"\n (mousedown)=\"onSelectItem(item, select)\"\n class=\"ui-list-item\">\n <ng-container *ngIf=\"template; else templateContent\">\n <tl-autocomplete-template\n [style.width]=\"'100%'\"\n *ngIf=\"item; else loadingMessage\"\n [template]=\"template\"\n [item]=\"item\"\n [index]=\"i\">\n </tl-autocomplete-template>\n </ng-container>\n <ng-template #templateContent>\n <span *ngIf=\"item; else loadingMessage\" [innerHTML]=\"getItemText(item) | highlight:description\"></span>\n </ng-template>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n <ng-template #loadingMessage>\n {{ !nothingFound ? messageLoading : ' ' }}\n </ng-template>\n </tl-filter-container>\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}.ui-loading{position:absolute;width:20px;right:5px}.ui-close{position:absolute;right:5px;top:4px;height:18px;width:18px;display:flex;align-items:center;justify-content:center;font-size:1.6em;opacity:.3;z-index:1}.ui-close:hover{cursor:pointer}.ui-autocomplete-box{display:table;width:100%}.scrollOpenedAbove{border-bottom:0!important;border-radius:3px 3px 0 0!important}.ui-scroll-view{overflow-y:scroll;scroll-snap-type:y mandatory;-ms-scroll-snap-type:mandatory;scroll-snap-stop:always;overflow-x:hidden;width:100%;outline:none;height:200px;border:1px solid #ccc;border-top:0;border-radius:0 0 3px 3px;outline:0;top:-3px;box-sizing:content-box;background:#ffffff}.ui-scroll-view::-webkit-scrollbar{width:8px}.ui-scroll-view::-webkit-scrollbar-thumb{border-radius:5px}.scrollOpened{animation:slide-in-top .2s both}.ui-selected-wrapper{display:table-cell;position:absolute;background:#c3c3c3;width:calc(100% - 6px);height:calc(100% - 6px);box-sizing:border-box;border-radius:3px;padding:0 5px;pointer-events:none;opacity:.2;margin:3px;z-index:0;top:0}.ui-wrapper-filter{height:30px;border-radius:3px;position:relative;display:flex;align-items:center}.ui-wrapper-filter .ui-input{border:0;outline:none;height:100%;width:100%}.ui-wrapper-filter .ui-model-input{left:0;position:absolute;visibility:hidden}.openedAbove{border-radius:0 0 3px 3px!important;border:1px solid #40a9ff!important}.opened{outline:0;border-radius:3px 3px 0 0!important;border-right-width:1px!important;pointer-events:none}.ui-list-item{display:flex;align-items:center;padding:10px;background:#fff;cursor:pointer;outline:none;border-top:1px solid rgba(204,204,204,.3);color:#575656}.ui-list-item>.ui-icon{padding-right:5px}.ui-list-item:focus:not(.selected){opacity:1}.ui-list-item:hover{background:#eeeeee}.ui-list-item.selected{opacity:1;transition:background .1s linear}.ui-list-item.selected ::ng-deep span{background:transparent!important}@keyframes slide-in-top{0%{transform:translateY(-10px);opacity:0}to{transform:translateY(0);opacity:1}}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i6.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i6.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i6.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i7.TlInput, selector: "tl-input", inputs: ["textBefore", "textAfter", "labelPlacement", "labelSize", "name", "label", "color", "iconBefore", "iconAfter", "clearButton", "readonly", "required", "disabled", "autocomplete", "maxlength", "tabindex", "textAlign", "mask", "placeholder", "type", "height", "withBorder", "flatBorder"], outputs: ["clear", "overlayOrigin", "clickAddon", "click", "focus", "blur", "valid", "completeMask"] }, { kind: "component", type: i8.TlLoader, selector: "tl-loader", inputs: ["color", "strokeWidth"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.TlBlockUI, selector: "[tlBlockui]", inputs: ["tlBlockui", "dimensionsFrom", "blockuiConfig"] }, { kind: "component", type: i10.TlLabel, selector: "tl-label", inputs: ["labelPlacement", "required", "labelSize", "labelTitle"] }, { kind: "component", type: i11.TlFilterContainer, selector: "tl-filter-container", inputs: ["searchTerm", "source", "searchBy", "lazyMode", "debounceTime"], outputs: ["filter"], exportAs: ["filterContainer"] }, { kind: "directive", type: i12.TlItemSelectedDirective, selector: "[itemSelected]", inputs: ["indexSelected", "itemSelected"], exportAs: ["selectItem"] }, { kind: "component", type: i13.TlAutocompleteTemplate, selector: "tl-autocomplete-template", inputs: ["template", "item", "index"] }, { kind: "directive", type: i14.SelectedValidatorDirective, selector: "[selectedItem]", inputs: ["selected"] }, { kind: "pipe", type: i15.HighlightPipe, name: "highlight" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlAutoComplete, decorators: [{ type: Component, args: [{ selector: 'tl-autocomplete', providers: [SelectedItemService], template: "<div class=\"ui-autocomplete-box\">\n <tl-label *ngIf=\"label\" [required]=\"required\" [labelTitle]=\"label\" [labelPlacement]=\"labelPlacement\" [labelSize]=\"labelSize\"></tl-label>\n <div [class]=\"'ui-autocomplete-wrapper ' + color\">\n <div class=\"ui-wrapper-filter\"\n #wrapper\n [class.disabled]=\"disabled || isDisabled\"\n [style.height]=\"height\"\n [class.opened]=\"isOpen && positionOverlay !== 'top'\"\n [class.openedAbove]=\"positionOverlay === 'top' && isOpen\">\n <div *ngIf=\"loading\" class=\"ui-loading\" [style.height]=\"height\">\n <tl-loader></tl-loader>\n </div>\n <tl-input\n (overlayOrigin)=\"trigger = $event\"\n [disabled]=\"disabled || isDisabled\"\n [placeholder]=\"placeholder\"\n [color]=\"color\"\n [clearButton]=\"clearButton\"\n [iconBefore]=\"iconBefore\"\n [iconAfter]=\"iconAfter\"\n [textBefore]=\"textBefore\"\n [textAfter]=\"textAfter\"\n [height]=\"height\"\n [required]=\"required\"\n (clear)=\"close()\"\n (click)=\"toggleIsOpen()\"\n (clickAddon)=\"clickAddon.emit($event)\"\n (keydown.backspace)=\"handleKeyBackspace()\"\n (keydown.ArrowUp)=\"handleKeyArrowUp($event)\"\n (keydown.ArrowDown)=\"handleKeyArrowDown($event)\"\n (keydown.escape)=\"handleKeyEscape($event)\"\n selectedItem\n [selected]=\"value\"\n class=\"ui-input\"\n [(ngModel)]=\"description\"\n (keydown.enter)=\"handleKeyEnter($event)\"\n (keydown.shift.tab)=\"isOpen = false\"\n (keydown.tab)=\"isOpen = false\"\n (focus)=\"handleFocus()\"\n (focusout)=\"focused = false\"\n (input)=\"onInput()\">\n </tl-input>\n <input readonly notform class=\"ui-model-input\" [(ngModel)]=\"value\">\n </div>\n <tl-filter-container [searchTerm]=\"description\"\n [debounceTime]=\"debounceTime\"\n [lazyMode]=\"lazyMode\"\n [source]=\"data\"\n [searchBy]=\"searchBy\"\n (filter)=\"onFilter($event)\">\n <ng-template cdkConnectedOverlay\n (backdropClick)=\"onBackdropClick()\"\n (positionChange)=\"onPositionChange($event)\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayOpen]=\"isOpen\">\n <cdk-virtual-scroll-viewport [class]=\"'ui-scroll-view ' + color\"\n [style.height]=\"tempContainerHeight\"\n [itemSize]=\"rowHeight\"\n [style.width]=\"wrapper.offsetWidth - 2 + 'px'\"\n (scrolledIndexChange)=\"onScrollIndexChange($event)\"\n [tlBlockui]=\"nothingFound\"\n [blockuiConfig]=\"{ 'message': nothingFoundMessage }\"\n [class.scrollOpenedAbove]=\"positionOverlay === 'top' && isOpen\"\n [class.scrollOpened]=\"isOpen && positionOverlay !== 'top'\">\n <div [style.height]=\"rowHeight + 'px'\"\n [itemSelected]=\"item\"\n [indexSelected]=\"i\"\n #select=\"selectItem\"\n *cdkVirtualFor=\"let item of dataSource; let i = index\"\n (mousedown)=\"onSelectItem(item, select)\"\n class=\"ui-list-item\">\n <ng-container *ngIf=\"template; else templateContent\">\n <tl-autocomplete-template\n [style.width]=\"'100%'\"\n *ngIf=\"item; else loadingMessage\"\n [template]=\"template\"\n [item]=\"item\"\n [index]=\"i\">\n </tl-autocomplete-template>\n </ng-container>\n <ng-template #templateContent>\n <span *ngIf=\"item; else loadingMessage\" [innerHTML]=\"getItemText(item) | highlight:description\"></span>\n </ng-template>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n <ng-template #loadingMessage>\n {{ !nothingFound ? messageLoading : ' ' }}\n </ng-template>\n </tl-filter-container>\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}.ui-loading{position:absolute;width:20px;right:5px}.ui-close{position:absolute;right:5px;top:4px;height:18px;width:18px;display:flex;align-items:center;justify-content:center;font-size:1.6em;opacity:.3;z-index:1}.ui-close:hover{cursor:pointer}.ui-autocomplete-box{display:table;width:100%}.scrollOpenedAbove{border-bottom:0!important;border-radius:3px 3px 0 0!important}.ui-scroll-view{overflow-y:scroll;scroll-snap-type:y mandatory;-ms-scroll-snap-type:mandatory;scroll-snap-stop:always;overflow-x:hidden;width:100%;outline:none;height:200px;border:1px solid #ccc;border-top:0;border-radius:0 0 3px 3px;outline:0;top:-3px;box-sizing:content-box;background:#ffffff}.ui-scroll-view::-webkit-scrollbar{width:8px}.ui-scroll-view::-webkit-scrollbar-thumb{border-radius:5px}.scrollOpened{animation:slide-in-top .2s both}.ui-selected-wrapper{display:table-cell;position:absolute;background:#c3c3c3;width:calc(100% - 6px);height:calc(100% - 6px);box-sizing:border-box;border-radius:3px;padding:0 5px;pointer-events:none;opacity:.2;margin:3px;z-index:0;top:0}.ui-wrapper-filter{height:30px;border-radius:3px;position:relative;display:flex;align-items:center}.ui-wrapper-filter .ui-input{border:0;outline:none;height:100%;width:100%}.ui-wrapper-filter .ui-model-input{left:0;position:absolute;visibility:hidden}.openedAbove{border-radius:0 0 3px 3px!important;border:1px solid #40a9ff!important}.opened{outline:0;border-radius:3px 3px 0 0!important;border-right-width:1px!important;pointer-events:none}.ui-list-item{display:flex;align-items:center;padding:10px;background:#fff;cursor:pointer;outline:none;border-top:1px solid rgba(204,204,204,.3);color:#575656}.ui-list-item>.ui-icon{padding-right:5px}.ui-list-item:focus:not(.selected){opacity:1}.ui-list-item:hover{background:#eeeeee}.ui-list-item.selected{opacity:1;transition:background .1s linear}.ui-list-item.selected ::ng-deep span{background:transparent!important}@keyframes slide-in-top{0%{transform:translateY(-10px);opacity:0}to{transform:translateY(0);opacity:1}}\n"] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [AUTOCOMPLETE_CONFIG] }] }, { type: i0.ChangeDetectorRef }, { type: i1.I18nService }, { type: i2.SelectedItemService }, { type: i3.NgControl, decorators: [{ type: Optional }, { type: Self }] }]; }, propDecorators: { data: [{ type: Input, args: ['data'] }], control: [{ type: Input, args: ['control'] }], totalLength: [{ type: Input }], filterOperator: [{ type: Input }], rowsPage: [{ type: Input }], lazyMode: [{ type: Input }], rowHeight: [{ type: Input }], template: [{ type: Input }], debounceTime: [{ type: Input }], keyText: [{ type: Input }], keyValue: [{ type: Input }], openFocus: [{ type: Input }], chainFilter: [{ type: Input }], loading: [{ type: Input }], clearButton: [{ type: Input }], clearOnSelect: [{ type: Input }], disabled: [{ type: Input }], required: [{ type: Input }], color: [{ type: Input }], labelPlacement: [{ type: Input }], textBefore: [{ type: Input }], textAfter: [{ type: Input }], iconBefore: [{ type: Input }], iconAfter: [{ type: Input }], labelSize: [{ type: Input }], height: [{ type: Input }], containerHeight: [{ type: Input }], searchBy: [{ type: Input }], label: [{ type: Input }], identifier: [{ type: Input }], placeholder: [{ type: Input }], modelMode: [{ type: Input }], lazyLoad: [{ type: Output }], selectItem: [{ type: Output }], changeSelected: [{ type: Output }], filter: [{ type: Output }], clickAddon: [{ type: Output }], input: [{ type: ViewChild, args: ['input', { static: true }] }], cdkVirtualScroll: [{ type: ViewChild, args: [CdkVirtualScrollViewport, { static: false }] }], listItems: [{ type: ViewChildren, args: [TlItemSelectedDirective] }], tlinput: [{ type: ViewChild, args: [TlInput, { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxPQUFPLEVBQ0wsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFhLFlBQVksRUFDM0QsWUFBWSxFQUFFLE1BQU0sRUFBK0MsU0FBUyxFQUM3QyxJQUFJLEdBQ3BDLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxtQkFBbUIsRUFBc0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDbEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVF6QyxNQUFN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