ngx-bootstrap-treeview
Version:
Ngx Bootstrap Treeview - Simple library to visualize, search and interact with tree data
766 lines • 83.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChildren, QueryList, ElementRef, Renderer2, NgZone, ChangeDetectorRef, ViewChild } from '@angular/core';
import { Tree } from '../../models/tree.model';
import { faSquare, faCheckSquare, faFolder, faFolderOpen, faMinus, faCheck } from '@fortawesome/free-solid-svg-icons';
import { trigger, style, transition, animate, keyframes } from '@angular/animations';
import { Leaf } from '../../models/leaf.model';
import { LeafClickedEvent } from '../../models/leaf-clicked-event.model';
import { NgxBootstrapTreeviewMapper } from '../../utils/ngx-bootstrap-treeview-mapper';
import { ContextMenuService } from '../../services/context-menu.service';
export class NgxBootstrapTreeviewComponent {
/**
* @param {?} _host
* @param {?} _renderer
* @param {?} _zone
* @param {?} _changeDetector
* @param {?} _contextMenuService
*/
constructor(_host, _renderer, _zone, _changeDetector, _contextMenuService) {
this._host = _host;
this._renderer = _renderer;
this._zone = _zone;
this._changeDetector = _changeDetector;
this._contextMenuService = _contextMenuService;
this.contextMenus = {
leafMenu: {},
branchMenu: {},
rootMenu: {}
};
this.disableSelectedElements = false;
this.emptyFolderLabel = 'This folder is empty';
this.isAnimationDisabled = false;
this.isFirstLevel = true;
// This one is true IF AND ONLY IF we're at the top level, be it a root or a branch.
// This is because a branch where isFirstLevel = true is not always our first treeview instance
this.isFirstInstance = true;
this.preselectedItems = [];
// Icons inputs
this.openedFolderIcon = faFolderOpen;
this.closedFolderIcon = faFolder;
this.unselectedLeafIcon = faSquare;
this.selectedLeafIcon = faCheckSquare;
this.anyChildrenSelectedIcon = faMinus;
this.allChildrenSelectedIcon = faCheck;
this.filterString = '';
this.matchBranches = true;
this.branchClicked = new EventEmitter();
this.leafClicked = new EventEmitter();
this.selectedLeaves = [];
}
/**
* @return {?}
*/
ngOnInit() {
// We throw an exception if we have item or items but no mapper indicating how to handle them
if (!this.mapper && (this.item || this.items)) {
throw new Error('"item" or "items" are invalid parameters if you don\'t provide a mapper');
}
// If we have a mapper, it will handle "item" and "items"
if (this.mapper) {
if (this.items) {
this.trees = this.items.map(item => this.mapper.mapTree(item));
}
if (this.item) {
this.tree = this.mapper.mapTree(this.item);
}
}
// If we want to display one or more trees
if (this.trees && this.trees.length > 1) {
this.isRoot = true;
this.isBranch = this.isLeaf = false;
// return;
}
else if (this.trees) {
// Otherwise, we have trees but with less than 2 elements, we assign it to tree
// So ngOnInit() can keep going normaly
this.tree = this.trees[0];
}
if (this.tree && (this.tree.children || this.tree.loadChildren)) {
this.isBranch = true;
}
else {
this.isBranch = false;
}
this._resetDisplayedData();
if (!this.isRoot) {
this.isLeaf = !this.isBranch;
}
this.leavesCount = this.countLeaves(this.tree);
if (this.preselectedItems) {
this.preselectedItems.forEach(value => {
this.select(value);
});
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
// The this.tree || this.trees is used to avoid anerror since ngOnChanges is called before ngOnInit()
if ('filterString' in changes && (this.displayedTree || this.displayedTrees)) {
this._zone.runOutsideAngular(() => {
if (this._filterTrigger) {
clearTimeout(this._filterTrigger);
this._filterTrigger = null;
}
this._filterTrigger = setTimeout(() => {
this._zone.run(() => {
if (this.displayedTrees) {
this.displayedTrees = this._filterTrees();
}
else if (this.displayedTree) {
this.displayedTree = this._filterTree(this.displayedTree);
}
this._changeDetector.detectChanges();
if (this.filterString) {
this.unfoldAll();
}
else {
this._resetDisplayedData();
this.foldAll();
}
});
}, 250);
});
}
}
/**
* @return {?}
*/
onClick() {
if (this.isLeaf) {
this.onLeafClicked();
}
if (this.isBranch) {
if (this.loggingService) {
this.loggingService.log(`🌴 Branche cliquée: ${this.tree.label}`);
}
this.onBranchClicked();
}
}
/**
* @param {?} leafClickedEvent
* @return {?}
*/
onChildLeafClicked(leafClickedEvent) {
if (this.loggingService && this.isBranch) {
this.loggingService.log(`➡ Event entrant dans le parent ${this.tree.label}:`, leafClickedEvent);
}
else if (this.loggingService && this.isRoot) {
this.loggingService.log(`➡ Event entrant dans la racine:`, leafClickedEvent);
}
// When a child leaf is clicked, we check our selectedLeaves to select or unselect the clicked one
if (!this._leafExistsIn(this.selectedLeaves, leafClickedEvent.leaf)) {
this._selectLeaf(leafClickedEvent.leaf);
}
else {
this._unselectLeaf(leafClickedEvent.leaf);
}
// Now that the leaf is selected/unselected, we merge our selectedLeaves with the ones of the event
leafClickedEvent.selectedLeaves = this.selectedLeaves;
if (this.isBranch && this.loggingService) {
this.loggingService.log(`⬅ Event sortant de ${this.tree.label} vers un parent:`, leafClickedEvent);
}
else if (this.loggingService && this.isRoot) {
this.loggingService.log(`⬅ Event sortant de la racine:`, leafClickedEvent);
}
this.leafClicked.emit(leafClickedEvent);
}
/**
* @return {?}
*/
onLeafClicked() {
if (this.loggingService) {
this.loggingService.log('🍂 Feuille cliqué:', this.tree.label);
}
if (!this.disableSelectedElements || !this.isOpened) {
this._leafToggle();
}
}
/**
* @param {?} tree
* @return {?}
*/
countLeaves(tree) {
/** @type {?} */
let leavesCount = 0;
if (tree && (!tree.children || tree.loadChildren)) {
leavesCount = 1;
}
else if (tree) {
tree.children.forEach(child => {
leavesCount += this.countLeaves(child);
});
}
return leavesCount;
}
/**
* @param {?} value
* @return {?}
*/
select(value) {
if (this.isLeaf && this.tree.value === value && !this.isOpened) {
this._leafToggle();
}
else if (this.isRoot || this.isBranch) {
this.children.forEach((child) => {
child.select(value);
});
}
}
/**
* @param {?} value
* @return {?}
*/
unselect(value) {
if (this.isLeaf && this.tree.value === value && this.isOpened) {
this._leafToggle();
}
else if (this.isRoot || this.isBranch) {
this.children.forEach((child) => {
child.unselect(value);
});
}
}
/**
* @return {?}
*/
onBranchClicked() {
this._branchToggle();
this.branchClicked.emit(this.tree);
}
/**
* @param {?} branch
* @return {?}
*/
onChildBranchClicked(branch) {
this.branchClicked.emit(branch);
if (this.rootsContainer) {
requestAnimationFrame(() => {
// We use requestAnimationFrame because we want this to be processed once rerendering is complete
this.rootsContainer.nativeElement.style.height = this.computeHeight() + 'px';
});
}
}
/**
* @param {?} event
* @return {?}
*/
onContextMenu(event) {
event.stopPropagation();
event.preventDefault();
this._contextMenuService.fire({
target: this.tree,
event: event
});
}
/**
* @return {?}
*/
onElementAdded() {
this.leavesCount = this.countLeaves(this.tree);
return true;
}
/**
* @param {?} event
* @return {?}
*/
onRootContextMenu(event) {
event.stopPropagation();
event.preventDefault();
this._contextMenuService.fire({
event,
target: null
});
}
/**
* @param {?=} id
* @return {?}
*/
fold(id) {
if (!id) {
this._fold();
}
else {
this._foldId(id);
}
}
/**
* @param {?=} id
* @return {?}
*/
unfold(id) {
if (!id) {
this._unfold();
}
else {
this._unfoldId(id);
}
}
/**
* @return {?}
*/
show() {
/** @type {?} */
const domElement = this._host.nativeElement;
this._renderer.removeClass(domElement, 'd-none');
}
/**
* @return {?}
*/
hide() {
/** @type {?} */
const domElement = this._host.nativeElement;
this._renderer.addClass(domElement, 'd-none');
}
/**
* @param {?} filterString
* @param {?=} item
* @return {?}
*/
filter(filterString, item) {
if (this.isRoot) {
this.children.forEach((child) => {
child.filter(this.filterString);
});
}
else {
if (!item) {
item = this.tree;
}
/** @type {?} */
const matchingElementsCount = this.countFilteredItems(filterString, item);
if (matchingElementsCount === 0) {
this.hide();
}
else {
this.show();
if (filterString !== '') {
this._unfold();
}
else {
this._fold();
}
}
}
}
/**
* @param {?} filterString
* @param {?} item
* @return {?}
*/
countFilteredItems(filterString, item) {
/** @type {?} */
let matchingElementsCount = 0;
if (item.children) {
if (!filterString.length) {
return 1;
}
matchingElementsCount = item.children.reduce((acc, child) => acc + this.countFilteredItems(filterString, child), 0);
}
else {
/** @type {?} */
const regex = new RegExp(filterString, 'i');
if (regex.test(item.label)) {
matchingElementsCount++;
}
}
return matchingElementsCount;
}
/**
* @return {?}
*/
unfoldAll() {
// A branch will unfold itself
if (this.isBranch && !this.isOpened) {
this._branchToggle();
this._changeDetector.detectChanges();
}
// If we're not a leaf, we unfold all of our children
if (!this.isLeaf) {
this.children.forEach((child) => {
child.unfoldAll();
});
}
}
/**
* @return {?}
*/
foldAll() {
// A branch will fold itself
if (this.isBranch && this.isOpened) {
this._branchToggle();
}
// If we're not a leaf, we unfold all of our children
if (!this.isLeaf) {
this.children.forEach((child) => {
child.foldAll();
});
}
}
/**
* @return {?}
*/
computeHeight() {
if (!this.isRoot) {
return this.treeview.nativeElement.scrollHeight;
}
return this.children.reduce((prevValue, currentValue) => {
return prevValue + currentValue.computeHeight();
}, 0);
}
/**
* @return {?}
*/
_unfold() {
if (this.isBranch && !this.isOpened) {
this._branchToggle();
}
}
/**
* @return {?}
*/
_fold() {
if (this.isBranch && this.isOpened) {
this._branchToggle();
}
}
/**
* @param {?} id
* @return {?}
*/
_unfoldId(id) {
if (this.isBranch && this.tree.value === id && !this.isOpened) {
this._branchToggle();
}
else if (this.isBranch && this.children.length) {
this.children.forEach((child) => {
child.unfold(id);
});
}
}
/**
* @param {?} id
* @return {?}
*/
_foldId(id) {
if (this.isBranch && this.tree.value === id && this.isOpened) {
this._branchToggle();
}
else if (this.isBranch && this.children.length) {
this.children.forEach((child) => {
child.fold(id);
});
}
}
/**
* @return {?}
*/
_leafToggle() {
this.isOpened = !this.isOpened;
/** @type {?} */
const leaf = new Leaf(this.tree);
if (this.isOpened) {
this._selectLeaf(leaf);
}
else {
this._unselectLeaf(leaf);
}
/** @type {?} */
const event = new LeafClickedEvent(leaf, this.selectedLeaves);
this.leafClicked.emit(event);
}
/**
* @return {?}
*/
_branchToggle() {
this.isOpened = !this.isOpened;
}
/**
* @param {?} leaf
* @return {?}
*/
_selectLeaf(leaf) {
if (!this.isRoot && this.loggingService) {
this.loggingService.log(`✔️ Feuille sélectionnée dans ${this.tree.label}:`, leaf);
}
else if (this.loggingService) {
this.loggingService.log(`✔️ Feuille sélectionnée dans la racine:`, leaf);
}
if (!this._leafExistsIn(this.selectedLeaves, leaf)) {
this.selectedLeaves = [...this.selectedLeaves, leaf];
}
}
/**
* @param {?} leaf
* @return {?}
*/
_unselectLeaf(leaf) {
if (!this.isRoot && this.loggingService) {
this.loggingService.log(`❌ Feuille désélectionnée dans ${this.tree.label}:`, leaf);
}
else if (this.loggingService) {
this.loggingService.log(`❌ Feuille désélectionnée dans la racine:`, leaf);
}
/** @type {?} */
const index = this._leafIndex(this.selectedLeaves, leaf);
if (index !== -1) {
this.selectedLeaves.splice(index, 1);
}
}
// Function used to check if a given leaf does exist in sleectedLeaves array
// We use this because of the new Leaf(), which causes reference comparison of Array.indexOf() not to work
/**
* @param {?} leaves
* @param {?} leaf
* @return {?}
*/
_leafIndex(leaves, leaf) {
/** @type {?} */
let result = -1;
leaves.forEach((selectedLeaf, index) => {
if (selectedLeaf.value === leaf.value && selectedLeaf.label === leaf.label) {
result = index;
}
});
return result;
}
/**
* @param {?} leaves
* @param {?} leaf
* @return {?}
*/
_leafExistsIn(leaves, leaf) {
return this._leafIndex(leaves, leaf) !== -1;
}
/**
* @param {?} tree
* @return {?}
*/
_copyTree(tree) {
/** @type {?} */
const isTree = !!tree.children;
/** @type {?} */
const result = {
value: tree.value,
label: tree.label,
data: tree.data
};
if (isTree) {
/** @type {?} */
const children = tree.children.map(child => this._copyTree(child));
return Object.assign({}, result, { children });
}
else {
return result;
}
}
/**
* @param {?} trees
* @return {?}
*/
_copyTrees(trees) {
return trees.map((tree) => this._copyTree(tree));
}
/**
* @param {?=} trees
* @param {?=} filterString
* @return {?}
*/
_filterTrees(trees = this.trees, filterString = this.filterString) {
/** @type {?} */
const copies = this._copyTrees(trees);
if (filterString !== '') {
/** @type {?} */
const displayedTrees = copies
.map(copy => {
return this._filterTree(copy, filterString);
})
.filter(filteredCopy => !!filteredCopy);
return displayedTrees;
}
else {
return copies;
}
}
// This method alters tree.children and returns true if any elements matched the filter string
/**
* @param {?} tree
* @param {?=} filterString
* @return {?}
*/
_filterTree(tree, filterString = this.filterString) {
/** @type {?} */
const regex = new RegExp(filterString, 'i');
if (!tree.children) {
// Leaf handling
return regex.test(tree.label) ? tree : null;
}
else if (tree.children && tree.children.length) {
if (this.matchBranches && regex.test(tree.label)) {
return tree;
}
// Non empty branches handling
tree.children = tree.children.map((child) => this._filterTree(child)).filter(child => !!child);
return tree.children.length ? tree : null;
}
return null;
}
/**
* @return {?}
*/
_resetDisplayedData() {
if (this.tree) {
this.displayedTree = this._copyTree(this.tree);
}
else if (this.trees) {
this.displayedTrees = this._copyTrees(this.trees);
}
}
}
NgxBootstrapTreeviewComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'ngx-bootstrap-treeview',
template: "<!-- This part is used if we have a single tree inputed to our component -->\r\n<ul\r\n [ngClass]=\"{\r\n branch: displayedTree.children,\r\n leaf: !displayedTree.children,\r\n opened: isOpened,\r\n 'pl-0': isFirstLevel,\r\n disabled: isLeaf && isOpened && disableSelectedElements\r\n }\"\r\n *ngIf=\"displayedTree\"\r\n class=\"mb-0\"\r\n #treeview\r\n>\r\n <li>\r\n <a [routerLink]=\"[]\" (click)=\"onClick()\" (contextmenu)=\"onContextMenu($event)\">\r\n <!-- Icons if we're reprensenting a branch -->\r\n <span class=\"icon\">\r\n <!-- Folder closed, no children selected -->\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"closedFolderIcon\"\r\n *ngIf=\"displayedTree.children && !isOpened && !selectedLeaves.length\"\r\n ></fa-icon>\r\n\r\n <!-- Folder closed, children selected but not all -->\r\n <fa-layers\r\n [fixedWidth]=\"true\"\r\n *ngIf=\"\r\n displayedTree.children &&\r\n !isOpened &&\r\n selectedLeaves.length > 0 &&\r\n selectedLeaves.length < this.leavesCount\r\n \"\r\n >\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"closedFolderIcon\"></fa-icon>\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"anyChildrenSelectedIcon\" transform=\"shrink-6 down-1\"></fa-icon>\r\n </fa-layers>\r\n\r\n <!-- Folder closed, all children selected -->\r\n <fa-layers\r\n [fixedWidth]=\"true\"\r\n *ngIf=\"\r\n displayedTree.children && !isOpened && selectedLeaves.length === leavesCount && leavesCount > 0\r\n \"\r\n >\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"closedFolderIcon\"></fa-icon>\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"allChildrenSelectedIcon\" transform=\"shrink-8 down-1\"></fa-icon>\r\n </fa-layers>\r\n\r\n <!-- Folder opened, no children selected -->\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"openedFolderIcon\"\r\n *ngIf=\"displayedTree.children && isOpened && !selectedLeaves.length\"\r\n ></fa-icon>\r\n\r\n <!-- Folder opened, children selected but not all -->\r\n <fa-layers\r\n [fixedWidth]=\"true\"\r\n *ngIf=\"\r\n displayedTree.children &&\r\n isOpened &&\r\n selectedLeaves.length > 0 &&\r\n selectedLeaves.length < this.leavesCount\r\n \"\r\n >\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"openedFolderIcon\"></fa-icon>\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"anyChildrenSelectedIcon\"\r\n transform=\"shrink-8 down-3 right-2\"\r\n class=\"opened-folder-mask\"\r\n ></fa-icon>\r\n </fa-layers>\r\n <!-- Folder opened, all children selected -->\r\n <fa-layers\r\n [fixedWidth]=\"true\"\r\n *ngIf=\"\r\n displayedTree.children && isOpened && selectedLeaves.length === leavesCount && leavesCount > 0\r\n \"\r\n >\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"openedFolderIcon\"></fa-icon>\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"allChildrenSelectedIcon\"\r\n transform=\"shrink-12 down-3 right-1\"\r\n class=\"opened-folder-mask\"\r\n ></fa-icon>\r\n </fa-layers>\r\n <!-- /branch icons -->\r\n\r\n <!-- Icons if we're reprensenting a leaf -->\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"unselectedLeafIcon\"\r\n *ngIf=\"!displayedTree.children && !isOpened\"\r\n ></fa-icon>\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"selectedLeafIcon\"\r\n *ngIf=\"!displayedTree.children && isOpened\"\r\n ></fa-icon>\r\n </span>\r\n <span class=\"label\">\r\n {{ displayedTree.label }}\r\n </span>\r\n </a>\r\n\r\n <div\r\n *ngIf=\"displayedTree.children && isOpened\"\r\n class=\"children\"\r\n [@.disabled]=\"isAnimationDisabled\"\r\n [@childrenAnimationTrigger]\r\n >\r\n <ul *ngIf=\"displayedTree.children.length === 0\">\r\n <li>\r\n <i>{{ emptyFolderLabel }}</i>\r\n </li>\r\n </ul>\r\n <ng-container *ngFor=\"let branch of displayedTree.children\">\r\n <ngx-bootstrap-treeview\r\n *ngIf=\"onElementAdded()\"\r\n [tree]=\"branch\"\r\n (branchClicked)=\"onChildBranchClicked($event)\"\r\n (leafClicked)=\"onChildLeafClicked($event)\"\r\n [selectedLeafIcon]=\"selectedLeafIcon\"\r\n [unselectedLeafIcon]=\"unselectedLeafIcon\"\r\n [openedFolderIcon]=\"openedFolderIcon\"\r\n [closedFolderIcon]=\"closedFolderIcon\"\r\n [canSelectBranch]=\"canSelectBranch\"\r\n [anyChildrenSelectedIcon]=\"anyChildrenSelectedIcon\"\r\n [allChildrenSelectedIcon]=\"allChildrenSelectedIcon\"\r\n [loggingService]=\"loggingService\"\r\n [isFirstInstance]=\"false\"\r\n [isFirstLevel]=\"false\"\r\n [disableSelectedElements]=\"disableSelectedElements\"\r\n [emptyFolderLabel]=\"emptyFolderLabel\"\r\n >\r\n </ngx-bootstrap-treeview>\r\n </ng-container>\r\n </div>\r\n </li>\r\n</ul>\r\n<!-- END Single tree provided -->\r\n\r\n<!-- Context menu, only shown once, so either on root or on branch if first level -->\r\n<ngx-bootstrap-treeview-context-menu\r\n *ngIf=\"contextMenus && isFirstInstance\"\r\n [config]=\"contextMenus\"\r\n [rootContextMenu]=\"contextMenus.rootMenu\"\r\n [branchContextMenu]=\"contextMenus.branchMenu\"\r\n [leafContextMenu]=\"contextMenus.leafMenu\"\r\n>\r\n</ngx-bootstrap-treeview-context-menu>\r\n\r\n<!-- If we provided an array of trees as an input, this part will be called -->\r\n<div *ngIf=\"displayedTrees\" (contextmenu)=\"onRootContextMenu($event)\" #rootsContainer>\r\n <ngx-bootstrap-treeview\r\n *ngFor=\"let displayedTree of displayedTrees\"\r\n [tree]=\"displayedTree\"\r\n (branchClicked)=\"onChildBranchClicked($event)\"\r\n (leafClicked)=\"onChildLeafClicked($event)\"\r\n [selectedLeafIcon]=\"selectedLeafIcon\"\r\n [unselectedLeafIcon]=\"unselectedLeafIcon\"\r\n [openedFolderIcon]=\"openedFolderIcon\"\r\n [closedFolderIcon]=\"closedFolderIcon\"\r\n [canSelectBranch]=\"canSelectBranch\"\r\n [anyChildrenSelectedIcon]=\"anyChildrenSelectedIcon\"\r\n [allChildrenSelectedIcon]=\"allChildrenSelectedIcon\"\r\n [loggingService]=\"loggingService\"\r\n [disableSelectedElements]=\"disableSelectedElements\"\r\n [isAnimationDisabled]=\"isAnimationDisabled\"\r\n [isFirstInstance]=\"false\"\r\n [emptyFolderLabel]=\"emptyFolderLabel\"\r\n ></ngx-bootstrap-treeview>\r\n</div>\r\n<!-- End multiple trees provided -->\r\n",
animations: [
trigger('childrenAnimationTrigger', [
transition(':leave', [animate('0.25s', style({ transform: 'translateX(-100%)', display: 'none' }))]),
transition(':enter', [
animate('0.25s', keyframes([
style({ transform: 'translateX(-100%)', display: 'block', offset: 0 }),
style({ transform: 'translateX(0%)', offset: 1 })
]))
])
])
],
styles: ["ul{list-style-type:none;overflow:visible;float:left;clear:left}ul li{position:relative;display:inline-block}ul fa-icon,ul fa-layers fa-icon{color:#000}ul fa-layers fa-icon:not(:first-child) ::ng-deep svg[data-prefix=fas]{color:#fff}ul fa-layers fa-icon.opened-folder-mask ::ng-deep svg{-webkit-transform:skew(-45deg,0);transform:skew(-45deg,0)}:host{display:block}:host>div{position:relative}"]
}] }
];
/** @nocollapse */
NgxBootstrapTreeviewComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 },
{ type: NgZone },
{ type: ChangeDetectorRef },
{ type: ContextMenuService }
];
NgxBootstrapTreeviewComponent.propDecorators = {
canSelectBranch: [{ type: Input }],
contextMenus: [{ type: Input }],
disableSelectedElements: [{ type: Input }],
emptyFolderLabel: [{ type: Input }],
isAnimationDisabled: [{ type: Input }],
isFirstLevel: [{ type: Input }],
isFirstInstance: [{ type: Input }],
isOpened: [{ type: Input }],
item: [{ type: Input }],
items: [{ type: Input }],
loggingService: [{ type: Input }],
mapper: [{ type: Input }],
preselectedItems: [{ type: Input }],
tree: [{ type: Input }],
trees: [{ type: Input }],
openedFolderIcon: [{ type: Input }],
closedFolderIcon: [{ type: Input }],
unselectedLeafIcon: [{ type: Input }],
selectedLeafIcon: [{ type: Input }],
anyChildrenSelectedIcon: [{ type: Input }],
allChildrenSelectedIcon: [{ type: Input }],
filterString: [{ type: Input }],
matchBranches: [{ type: Input }],
branchClicked: [{ type: Output }],
leafClicked: [{ type: Output }],
children: [{ type: ViewChildren, args: [NgxBootstrapTreeviewComponent,] }],
treeview: [{ type: ViewChild, args: ['treeview',] }],
rootsContainer: [{ type: ViewChild, args: ['rootsContainer',] }]
};
if (false) {
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.canSelectBranch;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.contextMenus;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.disableSelectedElements;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.emptyFolderLabel;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isAnimationDisabled;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isFirstLevel;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isFirstInstance;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isOpened;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.item;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.items;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.loggingService;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.mapper;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.preselectedItems;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.tree;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.trees;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.openedFolderIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.closedFolderIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.unselectedLeafIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.selectedLeafIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.anyChildrenSelectedIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.allChildrenSelectedIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.filterString;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.matchBranches;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.branchClicked;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.leafClicked;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.children;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.treeview;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.rootsContainer;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.selectedLeaves;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.leavesCount;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isBranch;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isLeaf;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isRoot;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.displayedTrees;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.displayedTree;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._filterTrigger;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._host;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._renderer;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._zone;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._changeDetector;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._contextMenuService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC10cmVldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYm9vdHN0cmFwLXRyZWV2aWV3LyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9uZ3gtYm9vdHN0cmFwLXRyZWV2aWV3L25neC1ib290c3RyYXAtdHJlZXZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFHVCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0MsT0FBTyxFQUNILFFBQVEsRUFDUixhQUFhLEVBQ2IsUUFBUSxFQUNSLFlBQVksRUFDWixPQUFPLEVBQ1AsT0FBTyxFQUVWLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBUyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFekUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFdkYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFzQnpFLE1BQU0sT0FBTyw2QkFBNkI7Ozs7Ozs7O0lBK0d0QyxZQUNZLEtBQThCLEVBQzlCLFNBQW9CLEVBQ3BCLEtBQWEsRUFDYixlQUFrQyxFQUNsQyxtQkFBdUM7UUFKdkMsVUFBSyxHQUFMLEtBQUssQ0FBeUI7UUFDOUIsY0FBUyxHQUFULFNBQVMsQ0FB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