truly-ui
Version:
Web Components for Desktop Applications.
567 lines (565 loc) • 87.3 kB
JavaScript
/*
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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