UNPKG

primeng

Version:

[![npm version](https://badge.fury.io/js/primeng.svg)](https://badge.fury.io/js/primeng) [![npm downloads](https://img.shields.io/npm/dm/primeng.svg)](https://www.npmjs.com/package/primeng) [![Actions CI](https://github.com/primefaces/primeng/workflows/No

778 lines 94.7 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, forwardRef, Input, NgModule, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { PrimeTemplate, SharedModule } from 'primeng/api'; import { DomHandler } from 'primeng/dom'; import { ChevronDownIcon } from 'primeng/icons/chevrondown'; import { SearchIcon } from 'primeng/icons/search'; import { TimesIcon } from 'primeng/icons/times'; import { OverlayModule } from 'primeng/overlay'; import { RippleModule } from 'primeng/ripple'; import { TreeModule } from 'primeng/tree'; import { ObjectUtils } from 'primeng/utils'; import * as i0 from "@angular/core"; import * as i1 from "primeng/api"; import * as i2 from "@angular/common"; import * as i3 from "primeng/overlay"; import * as i4 from "primeng/tree"; export const TREESELECT_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TreeSelect), multi: true }; export class TreeSelect { constructor(config, cd, el, overlayService) { this.config = config; this.cd = cd; this.el = el; this.overlayService = overlayService; this.type = 'button'; this.scrollHeight = '400px'; this.metaKeySelection = true; this.display = 'comma'; this.selectionMode = 'single'; this.emptyMessage = ''; this.filter = false; this.filterBy = 'label'; this.filterMode = 'lenient'; this.filterInputAutoFocus = true; this.propagateSelectionDown = true; this.propagateSelectionUp = true; this.showClear = false; this.resetFilterOnHide = true; this.onNodeExpand = new EventEmitter(); this.onNodeCollapse = new EventEmitter(); this.onShow = new EventEmitter(); this.onHide = new EventEmitter(); this.onClear = new EventEmitter(); this.onFilter = new EventEmitter(); this.onNodeUnselect = new EventEmitter(); this.onNodeSelect = new EventEmitter(); this.filterValue = null; this.expandedNodes = []; this.onModelChange = () => { }; this.onModelTouched = () => { }; } get options() { return this._options; } set options(options) { this._options = options; this.updateTreeState(); } get showTransitionOptions() { return this._showTransitionOptions; } set showTransitionOptions(val) { this._showTransitionOptions = val; console.warn('The showTransitionOptions property is deprecated since v14.2.0, use overlayOptions property instead.'); } get hideTransitionOptions() { return this._hideTransitionOptions; } set hideTransitionOptions(val) { this._hideTransitionOptions = val; console.warn('The hideTransitionOptions property is deprecated since v14.2.0, use overlayOptions property instead.'); } ngOnInit() { this.updateTreeState(); } ngAfterContentInit() { if (this.templates.length) { this.templateMap = {}; } this.templates.forEach((item) => { switch (item.getType()) { case 'value': this.valueTemplate = item.template; break; case 'header': this.headerTemplate = item.template; break; case 'empty': this.emptyTemplate = item.template; break; case 'footer': this.footerTemplate = item.template; break; case 'clearicon': this.clearIconTemplate = item.template; break; case 'triggericon': this.triggerIconTemplate = item.template; break; case 'filtericon': this.filterIconTemplate = item.template; break; case 'closeicon': this.closeIconTemplate = item.template; break; case 'itemtogglericon': this.itemTogglerIconTemplate = item.template; break; case 'itemcheckboxicon': this.itemCheckboxIconTemplate = item.template; break; case 'itemloadingicon': this.itemLoadingIconTemplate = item.template; break; default: //TODO: @deprecated Used "value" template instead if (item.name) this.templateMap[item.name] = item.template; else this.valueTemplate = item.template; break; } }); } onOverlayAnimationStart(event) { switch (event.toState) { case 'visible': if (this.filter) { ObjectUtils.isNotEmpty(this.filterValue) && this.treeViewChild?._filter(this.filterValue); this.filterInputAutoFocus && this.filterViewChild.nativeElement.focus(); } break; } } onSelectionChange(event) { this.value = event; this.onModelChange(this.value); this.cd.markForCheck(); } onClick(event) { if (this.disabled) { return; } if (!this.overlayViewChild?.el?.nativeElement?.contains(event.target) && !DomHandler.hasClass(event.target, 'p-treeselect-close')) { if (this.overlayVisible) { this.hide(); } else { this.show(); } this.focusInput.nativeElement.focus(); } } onKeyDown(event) { switch (event.which) { //down case 40: if (!this.overlayVisible && event.altKey) { this.show(); event.preventDefault(); } else if (this.overlayVisible && this.panelEl?.nativeElement) { let focusableElements = DomHandler.getFocusableElements(this.panelEl.nativeElement); if (focusableElements && focusableElements.length > 0) { focusableElements[0].focus(); } event.preventDefault(); } break; //space case 32: if (!this.overlayVisible) { this.show(); event.preventDefault(); } break; //enter and escape case 13: case 27: if (this.overlayVisible) { this.hide(); event.preventDefault(); } break; //tab case 9: this.hide(); break; default: break; } } onFilterInput(event) { this.filterValue = event.target.value; this.treeViewChild?._filter(this.filterValue); this.onFilter.emit({ originalEvent: event, filteredValue: this.treeViewChild?.filteredNodes }); } show() { this.overlayVisible = true; } hide(event) { this.overlayVisible = false; this.resetFilter(); this.onHide.emit(event); this.cd.markForCheck(); } clear(event) { this.value = null; this.resetExpandedNodes(); this.resetPartialSelected(); this.onModelChange(this.value); this.onClear.emit(); event.stopPropagation(); } checkValue() { return this.value !== null && ObjectUtils.isNotEmpty(this.value); } resetFilter() { if (this.filter && !this.resetFilterOnHide) { this.filteredNodes = this.treeViewChild?.filteredNodes; this.treeViewChild?.resetFilter(); } else { this.filterValue = null; } } updateTreeState() { if (this.value) { let selectedNodes = this.selectionMode === 'single' ? [this.value] : [...this.value]; this.resetExpandedNodes(); this.resetPartialSelected(); if (selectedNodes && this.options) { this.updateTreeBranchState(null, null, selectedNodes); } } } updateTreeBranchState(node, path, selectedNodes) { if (node) { if (this.isSelected(node)) { this.expandPath(path); selectedNodes.splice(selectedNodes.indexOf(node), 1); } if (selectedNodes.length > 0 && node.children) { for (let childNode of node.children) { this.updateTreeBranchState(childNode, [...path, node], selectedNodes); } } } else { for (let childNode of this.options) { this.updateTreeBranchState(childNode, [], selectedNodes); } } } expandPath(expandedNodes) { for (let node of expandedNodes) { node.expanded = true; } this.expandedNodes = [...expandedNodes]; } nodeExpand(event) { this.onNodeExpand.emit(event); this.expandedNodes.push(event.node); } nodeCollapse(event) { this.onNodeCollapse.emit(event); this.expandedNodes.splice(this.expandedNodes.indexOf(event.node), 1); } resetExpandedNodes() { for (let node of this.expandedNodes) { node.expanded = false; } this.expandedNodes = []; } resetPartialSelected(nodes = this.options) { if (!nodes) { return; } for (let node of nodes) { node.partialSelected = false; if (node.children && node.children?.length > 0) { this.resetPartialSelected(node.children); } } } findSelectedNodes(node, keys, selectedNodes) { if (node) { if (this.isSelected(node)) { selectedNodes.push(node); delete keys[node.key]; } if (Object.keys(keys).length && node.children) { for (let childNode of node.children) { this.findSelectedNodes(childNode, keys, selectedNodes); } } } else { for (let childNode of this.options) { this.findSelectedNodes(childNode, keys, selectedNodes); } } } isSelected(node) { return this.findIndexInSelection(node) != -1; } findIndexInSelection(node) { let index = -1; if (this.value) { if (this.selectionMode === 'single') { let areNodesEqual = (this.value.key && this.value.key === node.key) || this.value == node; index = areNodesEqual ? 0 : -1; } else { for (let i = 0; i < this.value.length; i++) { let selectedNode = this.value[i]; let areNodesEqual = (selectedNode.key && selectedNode.key === node.key) || selectedNode == node; if (areNodesEqual) { index = i; break; } } } } return index; } onSelect(node) { this.onNodeSelect.emit(node); if (this.selectionMode === 'single') { this.hide(); } } onUnselect(node) { this.onNodeUnselect.emit(node); } onFocus() { this.focused = true; } onBlur() { this.focused = false; } writeValue(value) { this.value = value; this.updateTreeState(); this.cd.markForCheck(); } registerOnChange(fn) { this.onModelChange = fn; } registerOnTouched(fn) { this.onModelTouched = fn; } setDisabledState(val) { this.disabled = val; this.cd.markForCheck(); } containerClass() { return { 'p-treeselect p-component p-inputwrapper': true, 'p-treeselect-chip': this.display === 'chip', 'p-disabled': this.disabled, 'p-focus': this.focused }; } labelClass() { return { 'p-treeselect-label': true, 'p-placeholder': this.label === this.placeholder, 'p-treeselect-label-empty': !this.placeholder && this.emptyValue }; } get emptyValue() { return !this.value || Object.keys(this.value).length === 0; } get emptyOptions() { return !this.options || this.options.length === 0; } get label() { let value = this.value || []; return value.length ? value.map((node) => node.label).join(', ') : this.selectionMode === 'single' && this.value ? value.label : this.placeholder; } } TreeSelect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: TreeSelect, deps: [{ token: i1.PrimeNGConfig }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.OverlayService }], target: i0.ɵɵFactoryTarget.Component }); TreeSelect.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.4", type: TreeSelect, selector: "p-treeSelect", inputs: { type: "type", inputId: "inputId", scrollHeight: "scrollHeight", disabled: "disabled", metaKeySelection: "metaKeySelection", display: "display", selectionMode: "selectionMode", tabindex: "tabindex", ariaLabelledBy: "ariaLabelledBy", placeholder: "placeholder", panelClass: "panelClass", panelStyle: "panelStyle", panelStyleClass: "panelStyleClass", containerStyle: "containerStyle", containerStyleClass: "containerStyleClass", labelStyle: "labelStyle", labelStyleClass: "labelStyleClass", overlayOptions: "overlayOptions", emptyMessage: "emptyMessage", appendTo: "appendTo", filter: "filter", filterBy: "filterBy", filterMode: "filterMode", filterPlaceholder: "filterPlaceholder", filterLocale: "filterLocale", filterInputAutoFocus: "filterInputAutoFocus", propagateSelectionDown: "propagateSelectionDown", propagateSelectionUp: "propagateSelectionUp", showClear: "showClear", resetFilterOnHide: "resetFilterOnHide", options: "options", showTransitionOptions: "showTransitionOptions", hideTransitionOptions: "hideTransitionOptions" }, outputs: { onNodeExpand: "onNodeExpand", onNodeCollapse: "onNodeCollapse", onShow: "onShow", onHide: "onHide", onClear: "onClear", onFilter: "onFilter", onNodeUnselect: "onNodeUnselect", onNodeSelect: "onNodeSelect" }, host: { properties: { "class.p-inputwrapper-filled": "!emptyValue", "class.p-inputwrapper-focus": "focused || overlayVisible", "class.p-treeselect-clearable": "showClear && !disabled" }, classAttribute: "p-element p-inputwrapper" }, providers: [TREESELECT_VALUE_ACCESSOR], queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "containerEl", first: true, predicate: ["container"], descendants: true }, { propertyName: "focusInput", first: true, predicate: ["focusInput"], descendants: true }, { propertyName: "filterViewChild", first: true, predicate: ["filter"], descendants: true }, { propertyName: "treeViewChild", first: true, predicate: ["tree"], descendants: true }, { propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true }, { propertyName: "overlayViewChild", first: true, predicate: ["overlay"], descendants: true }], ngImport: i0, template: ` <div #container [ngClass]="containerClass()" [class]="containerStyleClass" [ngStyle]="containerStyle" (click)="onClick($event)"> <div class="p-hidden-accessible"> <input #focusInput type="text" role="listbox" [attr.id]="inputId" readonly [disabled]="disabled" (focus)="onFocus()" (blur)="onBlur()" (keydown)="onKeyDown($event)" [attr.tabindex]="tabindex" aria-haspopup="true" [attr.aria-expanded]="overlayVisible" [attr.aria-labelledby]="ariaLabelledBy" /> </div> <div class="p-treeselect-label-container"> <div [ngClass]="labelClass()" [class]="labelStyleClass" [ngStyle]="labelStyle"> <ng-container *ngIf="valueTemplate; else defaultValueTemplate"> <ng-container *ngTemplateOutlet="valueTemplate; context: { $implicit: value, placeholder: placeholder }"></ng-container> </ng-container> <ng-template #defaultValueTemplate> <ng-container *ngIf="display === 'comma'; else chipsValueTemplate"> {{ label || 'empty' }} </ng-container> <ng-template #chipsValueTemplate> <div *ngFor="let node of value" class="p-treeselect-token"> <span class="p-treeselect-token-label">{{ node.label }}</span> </div> <ng-container *ngIf="emptyValue">{{ placeholder || 'empty' }}</ng-container> </ng-template> </ng-template> </div> <ng-container *ngIf="checkValue() && !disabled && showClear"> <TimesIcon *ngIf="!clearIconTemplate" [styleClass]="'p-treeselect-clear-icon'" (click)="clear($event)"/> <span *ngIf="clearIconTemplate" class="p-treeselect-clear-icon" (click)="clear($event)"> <ng-template *ngTemplateOutlet="clearIconTemplate;"></ng-template> </span> </ng-container> </div> <div class="p-treeselect-trigger"> <ChevronDownIcon *ngIf="!triggerIconTemplate" [styleClass]="'p-treeselect-trigger-icon'"/> <span *ngIf="triggerIconTemplate" class="p-treeselect-trigger-icon"> <ng-template *ngTemplateOutlet="triggerIconTemplate"></ng-template> </span> </div> <p-overlay #overlay [(visible)]="overlayVisible" [options]="overlayOptions" [target]="'@parent'" [appendTo]="appendTo" [showTransitionOptions]="showTransitionOptions" [hideTransitionOptions]="hideTransitionOptions" (onAnimationStart)="onOverlayAnimationStart($event)" (onShow)="onShow.emit($event)" (onHide)="hide($event)" > <ng-template pTemplate="content"> <div #panel class="p-treeselect-panel p-component" [ngStyle]="panelStyle" [class]="panelStyleClass" [ngClass]="panelClass"> <ng-container *ngTemplateOutlet="headerTemplate; context: { $implicit: value, options: options }"></ng-container> <div class="p-treeselect-header" *ngIf="filter"> <div class="p-treeselect-filter-container"> <input #filter type="text" autocomplete="off" class="p-treeselect-filter p-inputtext p-component" [attr.placeholder]="filterPlaceholder" (keydown.enter)="$event.preventDefault()" (input)="onFilterInput($event)" [value]="filterValue" /> <SearchIcon *ngIf="!filterIconTemplate" [styleClass]="'p-treeselect-filter-icon'"/> <span *ngIf="filterIconTemplate" class="p-treeselect-filter-icon"> <ng-template *ngTemplateOutlet="filterIconTemplate"></ng-template> </span> </div> <button class="p-treeselect-close p-link" (click)="hide()"> <TimesIcon *ngIf="!closeIconTemplate" [styleClass]="'p-treeselect-filter-icon'"/> <span *ngIf="closeIconTemplate" class="p-treeselect-filter-icon"> <ng-template *ngTemplateOutlet="closeIconTemplate"></ng-template> </span> </button> </div> <div class="p-treeselect-items-wrapper" [ngStyle]="{ 'max-height': scrollHeight }"> <p-tree #tree [value]="options" [propagateSelectionDown]="propagateSelectionDown" [propagateSelectionUp]="propagateSelectionUp" [selectionMode]="selectionMode" (selectionChange)="onSelectionChange($event)" [selection]="value" [metaKeySelection]="metaKeySelection" (onNodeExpand)="nodeExpand($event)" (onNodeCollapse)="nodeCollapse($event)" (onNodeSelect)="onSelect($event)" [emptyMessage]="emptyMessage" (onNodeUnselect)="onUnselect($event)" [filterBy]="filterBy" [filterMode]="filterMode" [filterPlaceholder]="filterPlaceholder" [filterLocale]="filterLocale" [filteredNodes]="filteredNodes" [_templateMap]="templateMap" > <ng-container *ngIf="emptyTemplate"> <ng-template pTemplate="empty"> <ng-container *ngTemplateOutlet="emptyTemplate"></ng-container> </ng-template> </ng-container> <ng-template pTemplate="togglericon" let-expanded *ngIf="itemTogglerIconTemplate"> <ng-container *ngTemplateOutlet="itemTogglerIconTemplate; context: { $implicit: expanded }"></ng-container> </ng-template> <ng-template pTemplate="checkboxicon" *ngIf="itemCheckboxIconTemplate"> <ng-template *ngTemplateOutlet="itemCheckboxIconTemplate"></ng-template> </ng-template> <ng-template pTemplate="loadingicon" *ngIf="itemLoadingIconTemplate"> <ng-container *ngTemplateOutlet="itemLoadingIconTemplate"></ng-container> </ng-template> </p-tree> </div> <ng-container *ngTemplateOutlet="footerTemplate; context: { $implicit: value, options: options }"></ng-container> </div> </ng-template> </p-overlay> </div> `, isInline: true, styles: [".p-treeselect{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.p-treeselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-treeselect-label-container{overflow:hidden;flex:1 1 auto;cursor:pointer}.p-treeselect-label{display:block;white-space:nowrap;cursor:pointer;overflow:hidden;text-overflow:ellipsis}.p-treeselect-label-empty{overflow:hidden;visibility:hidden}.p-treeselect-token{cursor:default;display:inline-flex;align-items:center;flex:0 0 auto}.p-treeselect-items-wrapper{overflow:auto}.p-treeselect-header{display:flex;align-items:center;justify-content:space-between}.p-treeselect-filter-container{position:relative;flex:1 1 auto}.p-treeselect-filter-icon{position:absolute;top:50%;margin-top:-.5rem}.p-treeselect-filter-container .p-inputtext{width:100%}.p-treeselect-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden;position:relative;margin-left:auto}.p-treeselect-clear-icon{position:absolute;top:50%;margin-top:-.5rem}.p-fluid .p-treeselect{display:flex}.p-treeselect-clear-icon{position:absolute;top:50%;margin-top:-.5rem;cursor:pointer}.p-treeselect-clearable{position:relative}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i2.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i0.forwardRef(function () { return i3.Overlay; }), selector: "p-overlay", inputs: ["visible", "mode", "style", "styleClass", "contentStyle", "contentStyleClass", "target", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "listener", "responsive", "options"], outputs: ["visibleChange", "onBeforeShow", "onShow", "onBeforeHide", "onHide", "onAnimationStart", "onAnimationDone"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.PrimeTemplate; }), selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i0.forwardRef(function () { return i4.Tree; }), selector: "p-tree", inputs: ["value", "selectionMode", "selection", "style", "styleClass", "contextMenu", "layout", "draggableScope", "droppableScope", "draggableNodes", "droppableNodes", "metaKeySelection", "propagateSelectionUp", "propagateSelectionDown", "loading", "loadingIcon", "emptyMessage", "ariaLabel", "togglerAriaLabel", "ariaLabelledBy", "validateDrop", "filter", "filterBy", "filterMode", "filterPlaceholder", "filteredNodes", "filterLocale", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "indentation", "_templateMap", "trackBy", "virtualNodeHeight"], outputs: ["selectionChange", "onNodeSelect", "onNodeUnselect", "onNodeExpand", "onNodeCollapse", "onNodeContextMenuSelect", "onNodeDrop", "onLazyLoad", "onScroll", "onScrollIndexChange", "onFilter"] }, { kind: "component", type: i0.forwardRef(function () { return SearchIcon; }), selector: "SearchIcon" }, { kind: "component", type: i0.forwardRef(function () { return TimesIcon; }), selector: "TimesIcon" }, { kind: "component", type: i0.forwardRef(function () { return ChevronDownIcon; }), selector: "ChevronDownIcon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: TreeSelect, decorators: [{ type: Component, args: [{ selector: 'p-treeSelect', template: ` <div #container [ngClass]="containerClass()" [class]="containerStyleClass" [ngStyle]="containerStyle" (click)="onClick($event)"> <div class="p-hidden-accessible"> <input #focusInput type="text" role="listbox" [attr.id]="inputId" readonly [disabled]="disabled" (focus)="onFocus()" (blur)="onBlur()" (keydown)="onKeyDown($event)" [attr.tabindex]="tabindex" aria-haspopup="true" [attr.aria-expanded]="overlayVisible" [attr.aria-labelledby]="ariaLabelledBy" /> </div> <div class="p-treeselect-label-container"> <div [ngClass]="labelClass()" [class]="labelStyleClass" [ngStyle]="labelStyle"> <ng-container *ngIf="valueTemplate; else defaultValueTemplate"> <ng-container *ngTemplateOutlet="valueTemplate; context: { $implicit: value, placeholder: placeholder }"></ng-container> </ng-container> <ng-template #defaultValueTemplate> <ng-container *ngIf="display === 'comma'; else chipsValueTemplate"> {{ label || 'empty' }} </ng-container> <ng-template #chipsValueTemplate> <div *ngFor="let node of value" class="p-treeselect-token"> <span class="p-treeselect-token-label">{{ node.label }}</span> </div> <ng-container *ngIf="emptyValue">{{ placeholder || 'empty' }}</ng-container> </ng-template> </ng-template> </div> <ng-container *ngIf="checkValue() && !disabled && showClear"> <TimesIcon *ngIf="!clearIconTemplate" [styleClass]="'p-treeselect-clear-icon'" (click)="clear($event)"/> <span *ngIf="clearIconTemplate" class="p-treeselect-clear-icon" (click)="clear($event)"> <ng-template *ngTemplateOutlet="clearIconTemplate;"></ng-template> </span> </ng-container> </div> <div class="p-treeselect-trigger"> <ChevronDownIcon *ngIf="!triggerIconTemplate" [styleClass]="'p-treeselect-trigger-icon'"/> <span *ngIf="triggerIconTemplate" class="p-treeselect-trigger-icon"> <ng-template *ngTemplateOutlet="triggerIconTemplate"></ng-template> </span> </div> <p-overlay #overlay [(visible)]="overlayVisible" [options]="overlayOptions" [target]="'@parent'" [appendTo]="appendTo" [showTransitionOptions]="showTransitionOptions" [hideTransitionOptions]="hideTransitionOptions" (onAnimationStart)="onOverlayAnimationStart($event)" (onShow)="onShow.emit($event)" (onHide)="hide($event)" > <ng-template pTemplate="content"> <div #panel class="p-treeselect-panel p-component" [ngStyle]="panelStyle" [class]="panelStyleClass" [ngClass]="panelClass"> <ng-container *ngTemplateOutlet="headerTemplate; context: { $implicit: value, options: options }"></ng-container> <div class="p-treeselect-header" *ngIf="filter"> <div class="p-treeselect-filter-container"> <input #filter type="text" autocomplete="off" class="p-treeselect-filter p-inputtext p-component" [attr.placeholder]="filterPlaceholder" (keydown.enter)="$event.preventDefault()" (input)="onFilterInput($event)" [value]="filterValue" /> <SearchIcon *ngIf="!filterIconTemplate" [styleClass]="'p-treeselect-filter-icon'"/> <span *ngIf="filterIconTemplate" class="p-treeselect-filter-icon"> <ng-template *ngTemplateOutlet="filterIconTemplate"></ng-template> </span> </div> <button class="p-treeselect-close p-link" (click)="hide()"> <TimesIcon *ngIf="!closeIconTemplate" [styleClass]="'p-treeselect-filter-icon'"/> <span *ngIf="closeIconTemplate" class="p-treeselect-filter-icon"> <ng-template *ngTemplateOutlet="closeIconTemplate"></ng-template> </span> </button> </div> <div class="p-treeselect-items-wrapper" [ngStyle]="{ 'max-height': scrollHeight }"> <p-tree #tree [value]="options" [propagateSelectionDown]="propagateSelectionDown" [propagateSelectionUp]="propagateSelectionUp" [selectionMode]="selectionMode" (selectionChange)="onSelectionChange($event)" [selection]="value" [metaKeySelection]="metaKeySelection" (onNodeExpand)="nodeExpand($event)" (onNodeCollapse)="nodeCollapse($event)" (onNodeSelect)="onSelect($event)" [emptyMessage]="emptyMessage" (onNodeUnselect)="onUnselect($event)" [filterBy]="filterBy" [filterMode]="filterMode" [filterPlaceholder]="filterPlaceholder" [filterLocale]="filterLocale" [filteredNodes]="filteredNodes" [_templateMap]="templateMap" > <ng-container *ngIf="emptyTemplate"> <ng-template pTemplate="empty"> <ng-container *ngTemplateOutlet="emptyTemplate"></ng-container> </ng-template> </ng-container> <ng-template pTemplate="togglericon" let-expanded *ngIf="itemTogglerIconTemplate"> <ng-container *ngTemplateOutlet="itemTogglerIconTemplate; context: { $implicit: expanded }"></ng-container> </ng-template> <ng-template pTemplate="checkboxicon" *ngIf="itemCheckboxIconTemplate"> <ng-template *ngTemplateOutlet="itemCheckboxIconTemplate"></ng-template> </ng-template> <ng-template pTemplate="loadingicon" *ngIf="itemLoadingIconTemplate"> <ng-container *ngTemplateOutlet="itemLoadingIconTemplate"></ng-container> </ng-template> </p-tree> </div> <ng-container *ngTemplateOutlet="footerTemplate; context: { $implicit: value, options: options }"></ng-container> </div> </ng-template> </p-overlay> </div> `, host: { class: 'p-element p-inputwrapper', '[class.p-inputwrapper-filled]': '!emptyValue', '[class.p-inputwrapper-focus]': 'focused || overlayVisible', '[class.p-treeselect-clearable]': 'showClear && !disabled' }, changeDetection: ChangeDetectionStrategy.OnPush, providers: [TREESELECT_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None, styles: [".p-treeselect{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.p-treeselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-treeselect-label-container{overflow:hidden;flex:1 1 auto;cursor:pointer}.p-treeselect-label{display:block;white-space:nowrap;cursor:pointer;overflow:hidden;text-overflow:ellipsis}.p-treeselect-label-empty{overflow:hidden;visibility:hidden}.p-treeselect-token{cursor:default;display:inline-flex;align-items:center;flex:0 0 auto}.p-treeselect-items-wrapper{overflow:auto}.p-treeselect-header{display:flex;align-items:center;justify-content:space-between}.p-treeselect-filter-container{position:relative;flex:1 1 auto}.p-treeselect-filter-icon{position:absolute;top:50%;margin-top:-.5rem}.p-treeselect-filter-container .p-inputtext{width:100%}.p-treeselect-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden;position:relative;margin-left:auto}.p-treeselect-clear-icon{position:absolute;top:50%;margin-top:-.5rem}.p-fluid .p-treeselect{display:flex}.p-treeselect-clear-icon{position:absolute;top:50%;margin-top:-.5rem;cursor:pointer}.p-treeselect-clearable{position:relative}\n"] }] }], ctorParameters: function () { return [{ type: i1.PrimeNGConfig }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.OverlayService }]; }, propDecorators: { type: [{ type: Input }], inputId: [{ type: Input }], scrollHeight: [{ type: Input }], disabled: [{ type: Input }], metaKeySelection: [{ type: Input }], display: [{ type: Input }], selectionMode: [{ type: Input }], tabindex: [{ type: Input }], ariaLabelledBy: [{ type: Input }], placeholder: [{ type: Input }], panelClass: [{ type: Input }], panelStyle: [{ type: Input }], panelStyleClass: [{ type: Input }], containerStyle: [{ type: Input }], containerStyleClass: [{ type: Input }], labelStyle: [{ type: Input }], labelStyleClass: [{ type: Input }], overlayOptions: [{ type: Input }], emptyMessage: [{ type: Input }], appendTo: [{ type: Input }], filter: [{ type: Input }], filterBy: [{ type: Input }], filterMode: [{ type: Input }], filterPlaceholder: [{ type: Input }], filterLocale: [{ type: Input }], filterInputAutoFocus: [{ type: Input }], propagateSelectionDown: [{ type: Input }], propagateSelectionUp: [{ type: Input }], showClear: [{ type: Input }], resetFilterOnHide: [{ type: Input }], options: [{ type: Input }], templates: [{ type: ContentChildren, args: [PrimeTemplate] }], containerEl: [{ type: ViewChild, args: ['container'] }], focusInput: [{ type: ViewChild, args: ['focusInput'] }], filterViewChild: [{ type: ViewChild, args: ['filter'] }], treeViewChild: [{ type: ViewChild, args: ['tree'] }], panelEl: [{ type: ViewChild, args: ['panel'] }], overlayViewChild: [{ type: ViewChild, args: ['overlay'] }], onNodeExpand: [{ type: Output }], onNodeCollapse: [{ type: Output }], onShow: [{ type: Output }], onHide: [{ type: Output }], onClear: [{ type: Output }], onFilter: [{ type: Output }], onNodeUnselect: [{ type: Output }], onNodeSelect: [{ type: Output }], showTransitionOptions: [{ type: Input }], hideTransitionOptions: [{ type: Input }] } }); export class TreeSelectModule { } TreeSelectModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: TreeSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); TreeSelectModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.4", ngImport: i0, type: TreeSelectModule, declarations: [TreeSelect], imports: [CommonModule, OverlayModule, RippleModule, SharedModule, TreeModule, SearchIcon, TimesIcon, ChevronDownIcon], exports: [TreeSelect, OverlayModule, SharedModule, TreeModule] }); TreeSelectModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: TreeSelectModule, imports: [CommonModule, OverlayModule, RippleModule, SharedModule, TreeModule, SearchIcon, TimesIcon, ChevronDownIcon, OverlayModule, SharedModule, TreeModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: TreeSelectModule, decorators: [{ type: NgModule, args: [{ imports: [CommonModule, OverlayModule, RippleModule, SharedModule, TreeModule, SearchIcon, TimesIcon, ChevronDownIcon], exports: [TreeSelect, OverlayModule, SharedModule, TreeModule], declarations: [TreeSelect] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZXNlbGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy90cmVlc2VsZWN0L3RyZWVzZWxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBb0IsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxlQUFlLEVBQWMsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBMEIsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlPLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBaUQsYUFBYSxFQUFFLFlBQVksRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUNuSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBVyxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFRLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFFNUMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQVE7SUFDMUMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQztJQUN6QyxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7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