primeng
Version:
[](https://badge.fury.io/js/primeng) [](https://www.npmjs.com/package/primeng) [ => 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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