UNPKG

ngx-bootstrap-treeview

Version:

Ngx Bootstrap Treeview - Simple library to visualize, search and interact with tree data

766 lines 83.6 kB
/** * @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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