@treeview/ngx-treeview
Version:
An Angular Boostrap treeview component
1 lines • 67 kB
Source Map (JSON)
{"version":3,"file":"treeview-ngx-treeview.mjs","sources":["../../../projects/ngx-treeview/src/lib/directives/dropdown.directive.ts","../../../projects/ngx-treeview/src/lib/directives/dropdown-menu.directive.ts","../../../projects/ngx-treeview/src/lib/directives/dropdown-toggle.directive.ts","../../../projects/ngx-treeview/src/lib/helpers/treeview-helper.ts","../../../projects/ngx-treeview/src/lib/models/treeview-item.ts","../../../projects/ngx-treeview/src/lib/models/treeview-i18n.ts","../../../projects/ngx-treeview/src/lib/models/treeview-config.ts","../../../projects/ngx-treeview/src/lib/helpers/treeview-event-parser.ts","../../../projects/ngx-treeview/src/lib/components/treeview-item/treeview-item.component.ts","../../../projects/ngx-treeview/src/lib/components/treeview-item/treeview-item.component.html","../../../projects/ngx-treeview/src/lib/components/treeview/treeview.component.ts","../../../projects/ngx-treeview/src/lib/components/treeview/treeview.component.html","../../../projects/ngx-treeview/src/lib/components/dropdown-treeview/dropdown-treeview.component.ts","../../../projects/ngx-treeview/src/lib/components/dropdown-treeview/dropdown-treeview.component.html","../../../projects/ngx-treeview/src/lib/pipes/treeview.pipe.ts","../../../projects/ngx-treeview/src/lib/treeview.module.ts","../../../projects/ngx-treeview/src/public-api.ts","../../../projects/ngx-treeview/src/treeview-ngx-treeview.ts"],"sourcesContent":["import { Directive, Input, Output, HostBinding, HostListener, EventEmitter } from '@angular/core';\r\nimport { isNil } from 'lodash';\r\n\r\n@Directive({\r\n selector: '[ngxDropdown]',\r\n exportAs: 'ngxDropdown'\r\n})\r\nexport class DropdownDirective {\r\n toggleElement: any;\r\n @Input('open') internalOpen = false;\r\n @Output() openChange = new EventEmitter<boolean>();\r\n\r\n @HostBinding('class.show') get isOpen(): boolean {\r\n return this.internalOpen;\r\n }\r\n\r\n @HostListener('keyup.esc')\r\n onKeyupEsc(): void {\r\n this.close();\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (event.button !== 2 && !this.isEventFromToggle(event)) {\r\n this.close();\r\n }\r\n }\r\n\r\n open(): void {\r\n if (!this.internalOpen) {\r\n this.internalOpen = true;\r\n this.openChange.emit(true);\r\n }\r\n }\r\n\r\n close(): void {\r\n if (this.internalOpen) {\r\n this.internalOpen = false;\r\n this.openChange.emit(false);\r\n }\r\n }\r\n\r\n toggle(): void {\r\n if (this.isOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n private isEventFromToggle(event: MouseEvent): boolean {\r\n return !isNil(this.toggleElement) && this.toggleElement.contains(event.target);\r\n }\r\n}\r\n","import { Directive, HostBinding } from '@angular/core';\r\nimport { DropdownDirective } from './dropdown.directive';\r\n\r\n@Directive({\r\n selector: '[ngxDropdownMenu]',\r\n host: {\r\n '[class.dropdown-menu]': 'true',\r\n '[class.show]': 'dropdown.isOpen'\r\n }\r\n})\r\nexport class DropdownMenuDirective {\r\n constructor(\r\n public dropdown: DropdownDirective\r\n ) { }\r\n}\r\n","import { Directive, ElementRef } from '@angular/core';\r\nimport { DropdownDirective } from './dropdown.directive';\r\n\r\n@Directive({\r\n selector: '[ngxDropdownToggle]',\r\n host: {\r\n class: 'dropdown-toggle',\r\n 'aria-haspopup': 'true',\r\n '[attr.aria-expanded]': 'dropdown.isOpen',\r\n '(click)': 'dropdown.toggle()'\r\n }\r\n})\r\nexport class DropdownToggleDirective {\r\n constructor(\r\n public dropdown: DropdownDirective,\r\n elementRef: ElementRef\r\n ) {\r\n dropdown.toggleElement = elementRef.nativeElement;\r\n }\r\n}\r\n","import { concat, isNil, pull } from 'lodash';\r\nimport { TreeviewItem } from '../models/treeview-item';\r\n\r\nexport const TreeviewHelper = {\r\n findItem,\r\n findItemInList,\r\n findParent,\r\n removeItem,\r\n concatSelection\r\n};\r\n\r\nfunction findItem(root: TreeviewItem, value: any): TreeviewItem {\r\n if (isNil(root)) {\r\n return undefined;\r\n }\r\n\r\n if (root.value === value) {\r\n return root;\r\n }\r\n\r\n if (root.children) {\r\n for (const child of root.children) {\r\n const foundItem = findItem(child, value);\r\n if (foundItem) {\r\n return foundItem;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction findItemInList(list: TreeviewItem[], value: any): TreeviewItem {\r\n if (isNil(list)) {\r\n return undefined;\r\n }\r\n\r\n for (const item of list) {\r\n const foundItem = findItem(item, value);\r\n if (foundItem) {\r\n return foundItem;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction findParent(root: TreeviewItem, item: TreeviewItem): TreeviewItem {\r\n if (isNil(root) || isNil(root.children)) {\r\n return undefined;\r\n }\r\n\r\n for (const child of root.children) {\r\n if (child === item) {\r\n return root;\r\n } else {\r\n const parent = findParent(child, item);\r\n if (parent) {\r\n return parent;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction removeItem(root: TreeviewItem, item: TreeviewItem): boolean {\r\n const parent = findParent(root, item);\r\n if (parent) {\r\n pull(parent.children, item);\r\n if (parent.children.length === 0) {\r\n parent.children = undefined;\r\n } else {\r\n parent.correctChecked();\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction concatSelection(items: TreeviewItem[], checked: TreeviewItem[], unchecked: TreeviewItem[]): { [k: string]: TreeviewItem[] } {\r\n let checkedItems = [...checked];\r\n let uncheckedItems = [...unchecked];\r\n for (const item of items) {\r\n const selection = item.getSelection();\r\n checkedItems = concat(checkedItems, selection.checkedItems);\r\n uncheckedItems = concat(uncheckedItems, selection.uncheckedItems);\r\n }\r\n return {\r\n checked: checkedItems,\r\n unchecked: uncheckedItems\r\n };\r\n}\r\n","import { isBoolean, isNil, isString } from 'lodash';\r\nimport { TreeviewHelper } from '../helpers/treeview-helper';\r\n\r\nexport interface TreeviewSelection {\r\n checkedItems: TreeviewItem[];\r\n uncheckedItems: TreeviewItem[];\r\n}\r\n\r\nexport interface TreeItem {\r\n text: string;\r\n value: any;\r\n disabled?: boolean;\r\n checked?: boolean;\r\n collapsed?: boolean;\r\n children?: TreeItem[];\r\n}\r\n\r\nexport class TreeviewItem {\r\n private internalDisabled = false;\r\n private internalChecked = true;\r\n private internalCollapsed = false;\r\n private internalChildren: TreeviewItem[];\r\n text: string;\r\n value: any;\r\n\r\n constructor(item: TreeItem, autoCorrectChecked = false) {\r\n if (isNil(item)) {\r\n throw new Error('Item must be defined');\r\n }\r\n if (isString(item.text)) {\r\n this.text = item.text;\r\n } else {\r\n throw new Error('A text of item must be string object');\r\n }\r\n this.value = item.value;\r\n if (isBoolean(item.checked)) {\r\n this.checked = item.checked;\r\n }\r\n if (isBoolean(item.collapsed)) {\r\n this.collapsed = item.collapsed;\r\n }\r\n if (isBoolean(item.disabled)) {\r\n this.disabled = item.disabled;\r\n }\r\n if (!isNil(item.children) && item.children.length > 0) {\r\n this.children = item.children.map(child => {\r\n if (this.disabled === true) {\r\n child.disabled = true;\r\n }\r\n\r\n return new TreeviewItem(child);\r\n });\r\n }\r\n\r\n if (autoCorrectChecked) {\r\n this.correctChecked();\r\n }\r\n }\r\n\r\n get checked(): boolean {\r\n return this.internalChecked;\r\n }\r\n\r\n set checked(value: boolean) {\r\n if (!this.internalDisabled) {\r\n if (this.internalChecked !== value) {\r\n this.internalChecked = value;\r\n }\r\n }\r\n }\r\n\r\n get indeterminate(): boolean {\r\n return this.checked === undefined;\r\n }\r\n\r\n setCheckedRecursive(value: boolean): void {\r\n if (!this.internalDisabled) {\r\n this.internalChecked = value;\r\n if (!isNil(this.internalChildren)) {\r\n this.internalChildren.forEach(child => child.setCheckedRecursive(value));\r\n }\r\n }\r\n }\r\n\r\n get disabled(): boolean {\r\n return this.internalDisabled;\r\n }\r\n\r\n set disabled(value: boolean) {\r\n if (this.internalDisabled !== value) {\r\n this.internalDisabled = value;\r\n if (!isNil(this.internalChildren)) {\r\n this.internalChildren.forEach(child => child.disabled = value);\r\n }\r\n }\r\n }\r\n\r\n get collapsed(): boolean {\r\n return this.internalCollapsed;\r\n }\r\n\r\n set collapsed(value: boolean) {\r\n if (this.internalCollapsed !== value) {\r\n this.internalCollapsed = value;\r\n }\r\n }\r\n\r\n setCollapsedRecursive(value: boolean): void {\r\n this.internalCollapsed = value;\r\n if (!isNil(this.internalChildren)) {\r\n this.internalChildren.forEach(child => child.setCollapsedRecursive(value));\r\n }\r\n }\r\n\r\n get children(): TreeviewItem[] {\r\n return this.internalChildren;\r\n }\r\n\r\n set children(value: TreeviewItem[]) {\r\n if (this.internalChildren !== value) {\r\n if (!isNil(value) && value.length === 0) {\r\n throw new Error('Children must be not an empty array');\r\n }\r\n this.internalChildren = value;\r\n if (!isNil(this.internalChildren)) {\r\n let checked = null;\r\n this.internalChildren.forEach(child => {\r\n if (checked === null) {\r\n checked = child.checked;\r\n } else {\r\n if (child.checked !== checked) {\r\n checked = undefined;\r\n return;\r\n }\r\n }\r\n });\r\n this.internalChecked = checked;\r\n }\r\n }\r\n }\r\n\r\n getSelection(): TreeviewSelection {\r\n let checkedItems: TreeviewItem[] = [];\r\n let uncheckedItems: TreeviewItem[] = [];\r\n if (isNil(this.internalChildren)) {\r\n if (this.internalChecked) {\r\n checkedItems.push(this);\r\n } else {\r\n uncheckedItems.push(this);\r\n }\r\n } else {\r\n const selection = TreeviewHelper.concatSelection(this.internalChildren, checkedItems, uncheckedItems);\r\n checkedItems = selection.checked;\r\n uncheckedItems = selection.unchecked;\r\n }\r\n\r\n return {\r\n checkedItems,\r\n uncheckedItems\r\n };\r\n }\r\n\r\n correctChecked(): void {\r\n this.internalChecked = this.getCorrectChecked();\r\n }\r\n\r\n private getCorrectChecked(): boolean {\r\n let checked: boolean = null;\r\n if (!isNil(this.internalChildren)) {\r\n for (const child of this.internalChildren) {\r\n child.internalChecked = child.getCorrectChecked();\r\n if (checked === null) {\r\n checked = child.internalChecked;\r\n } else if (checked !== child.internalChecked) {\r\n checked = undefined;\r\n break;\r\n }\r\n }\r\n } else {\r\n checked = this.checked;\r\n }\r\n\r\n return checked;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { TreeviewSelection } from './treeview-item';\r\n\r\n@Injectable()\r\nexport abstract class TreeviewI18n {\r\n abstract getText(selection: TreeviewSelection): string;\r\n abstract getAllCheckboxText(): string;\r\n abstract getFilterPlaceholder(): string;\r\n abstract getFilterNoItemsFoundText(): string;\r\n abstract getTooltipCollapseExpandText(isCollapse: boolean): string;\r\n}\r\n\r\n@Injectable()\r\nexport class DefaultTreeviewI18n extends TreeviewI18n {\r\n getText(selection: TreeviewSelection): string {\r\n if (selection.uncheckedItems.length === 0) {\r\n if (selection.checkedItems.length > 0) {\r\n return this.getAllCheckboxText();\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n switch (selection.checkedItems.length) {\r\n case 0:\r\n return 'Select options';\r\n case 1:\r\n return selection.checkedItems[0].text;\r\n default:\r\n return `${selection.checkedItems.length} options selected`;\r\n }\r\n }\r\n\r\n getAllCheckboxText(): string {\r\n return 'All';\r\n }\r\n\r\n getFilterPlaceholder(): string {\r\n return 'Filter';\r\n }\r\n\r\n getFilterNoItemsFoundText(): string {\r\n return 'No items found';\r\n }\r\n\r\n getTooltipCollapseExpandText(isCollapse: boolean): string {\r\n return isCollapse ? 'Expand' : 'Collapse';\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class TreeviewConfig {\r\n hasAllCheckBox = true;\r\n hasCheckBoxes = false;\r\n hasFilter = false;\r\n hasCollapseExpand = false;\r\n decoupleChildFromParent = false;\r\n compact = true\r\n maxHeight = 500;\r\n\r\n get hasDivider(): boolean {\r\n return this.hasFilter || this.hasAllCheckBox || this.hasCollapseExpand;\r\n }\r\n\r\n public static create(fields?: {\r\n hasAllCheckBox?: boolean,\r\n hasCheckBoxes?: boolean,\r\n hasFilter?: boolean,\r\n hasCollapseExpand?: boolean,\r\n decoupleChildFromParent?: boolean\r\n compact?: boolean,\r\n maxHeight?: number,\r\n }): TreeviewConfig {\r\n const config = new TreeviewConfig();\r\n Object.assign(config, fields);\r\n return config;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { isNil } from 'lodash';\r\nimport { TreeviewItem } from '../models/treeview-item';\r\nimport { TreeviewComponent } from '../components/treeview/treeview.component';\r\n\r\n@Injectable()\r\nexport abstract class TreeviewEventParser {\r\n abstract getSelectedChange(component: TreeviewComponent): any[];\r\n}\r\n\r\n@Injectable()\r\nexport class DefaultTreeviewEventParser extends TreeviewEventParser {\r\n getSelectedChange(component: TreeviewComponent): any[] {\r\n const checkedItems = component.selection.checkedItems;\r\n if (!isNil(checkedItems)) {\r\n return checkedItems.map(item => item.value);\r\n }\r\n\r\n return [];\r\n }\r\n}\r\n\r\nexport interface DownlineTreeviewItem {\r\n item: TreeviewItem;\r\n parent: DownlineTreeviewItem;\r\n}\r\n\r\n@Injectable()\r\nexport class DownlineTreeviewEventParser extends TreeviewEventParser {\r\n getSelectedChange(component: TreeviewComponent): any[] {\r\n const items = component.items;\r\n if (!isNil(items)) {\r\n let result: DownlineTreeviewItem[] = [];\r\n items.forEach(item => {\r\n const links = this.getLinks(item, null);\r\n if (!isNil(links)) {\r\n result = result.concat(links);\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n private getLinks(item: TreeviewItem, parent: DownlineTreeviewItem): DownlineTreeviewItem[] {\r\n if (!isNil(item.children)) {\r\n const link = {\r\n item,\r\n parent\r\n };\r\n let result: DownlineTreeviewItem[] = [];\r\n item.children.forEach(child => {\r\n const links = this.getLinks(child, link);\r\n if (!isNil(links)) {\r\n result = result.concat(links);\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n if (item.checked) {\r\n return [{\r\n item,\r\n parent\r\n }];\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class OrderDownlineTreeviewEventParser extends TreeviewEventParser {\r\n private currentDownlines: DownlineTreeviewItem[] = [];\r\n private parser = new DownlineTreeviewEventParser();\r\n\r\n getSelectedChange(component: TreeviewComponent): any[] {\r\n const newDownlines: DownlineTreeviewItem[] = this.parser.getSelectedChange(component);\r\n if (this.currentDownlines.length === 0) {\r\n this.currentDownlines = newDownlines;\r\n } else {\r\n const intersectDownlines: DownlineTreeviewItem[] = [];\r\n this.currentDownlines.forEach(downline => {\r\n let foundIndex = -1;\r\n const length = newDownlines.length;\r\n for (let i = 0; i < length; i++) {\r\n if (downline.item.value === newDownlines[i].item.value) {\r\n foundIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (foundIndex !== -1) {\r\n intersectDownlines.push(newDownlines[foundIndex]);\r\n newDownlines.splice(foundIndex, 1);\r\n }\r\n });\r\n\r\n this.currentDownlines = intersectDownlines.concat(newDownlines);\r\n }\r\n\r\n return this.currentDownlines;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output, TemplateRef } from '@angular/core';\r\nimport { isNil } from 'lodash';\r\nimport { TreeviewItem } from '../../models/treeview-item';\r\nimport { TreeviewConfig } from '../../models/treeview-config';\r\nimport { TreeviewItemTemplateContext } from '../../models/treeview-item-template-context';\r\n\r\n@Component({\r\n selector: 'ngx-treeview-item',\r\n templateUrl: './treeview-item.component.html',\r\n styleUrls: ['./treeview-item.component.scss']\r\n})\r\nexport class TreeviewItemComponent {\r\n @Input() config: TreeviewConfig;\r\n @Input() template: TemplateRef<TreeviewItemTemplateContext>;\r\n @Input() item: TreeviewItem;\r\n @Output() checkedChange = new EventEmitter<boolean>();\r\n\r\n constructor(\r\n private defaultConfig: TreeviewConfig\r\n ) {\r\n this.config = this.defaultConfig;\r\n }\r\n\r\n onCollapseExpand = () => {\r\n this.item.collapsed = !this.item.collapsed;\r\n }\r\n\r\n onCheckedChange = () => {\r\n const checked = this.item.checked;\r\n if (!isNil(this.item.children) && !this.config.decoupleChildFromParent) {\r\n this.item.children.forEach(child => child.setCheckedRecursive(checked));\r\n }\r\n this.checkedChange.emit(checked);\r\n }\r\n\r\n onChildCheckedChange(child: TreeviewItem, checked: boolean): void {\r\n if (!this.config.decoupleChildFromParent) {\r\n let itemChecked: boolean = null;\r\n for (const childItem of this.item.children) {\r\n if (itemChecked === null) {\r\n itemChecked = childItem.checked;\r\n } else if (itemChecked !== childItem.checked) {\r\n itemChecked = undefined;\r\n break;\r\n }\r\n }\r\n\r\n if (itemChecked === null) {\r\n itemChecked = false;\r\n }\r\n\r\n if (this.item.checked !== itemChecked) {\r\n this.item.checked = itemChecked;\r\n }\r\n\r\n }\r\n\r\n this.checkedChange.emit(checked);\r\n }\r\n}\r\n","<div *ngIf=\"item\" class=\"treeview-item\">\r\n <ng-template [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{item: item, onCollapseExpand: onCollapseExpand, onCheckedChange: onCheckedChange}\">\r\n </ng-template>\r\n <div *ngIf=\"!item.collapsed\">\r\n <ngx-treeview-item [config]=\"config\" *ngFor=\"let child of item.children\" [item]=\"child\" [template]=\"template\"\r\n (checkedChange)=\"onChildCheckedChange(child, $event)\">\r\n </ngx-treeview-item>\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, SimpleChanges, OnChanges, TemplateRef, OnInit } from '@angular/core';\r\nimport { isNil, includes } from 'lodash';\r\nimport { TreeviewI18n } from '../../models/treeview-i18n';\r\nimport { TreeviewItem, TreeviewSelection } from '../../models/treeview-item';\r\nimport { TreeviewConfig } from '../../models/treeview-config';\r\nimport { TreeviewHeaderTemplateContext } from '../../models/treeview-header-template-context';\r\nimport { TreeviewItemTemplateContext } from '../../models/treeview-item-template-context';\r\nimport { TreeviewHelper } from '../../helpers/treeview-helper';\r\nimport { TreeviewEventParser } from '../../helpers/treeview-event-parser';\r\n\r\nclass FilterTreeviewItem extends TreeviewItem {\r\n private readonly refItem: TreeviewItem;\r\n constructor(item: TreeviewItem) {\r\n super({\r\n text: item.text,\r\n value: item.value,\r\n disabled: item.disabled,\r\n checked: item.checked,\r\n collapsed: item.collapsed,\r\n children: item.children\r\n });\r\n this.refItem = item;\r\n }\r\n\r\n updateRefChecked(): void {\r\n this.children.forEach(child => {\r\n if (child instanceof FilterTreeviewItem) {\r\n child.updateRefChecked();\r\n }\r\n });\r\n\r\n let refChecked = this.checked;\r\n if (refChecked) {\r\n for (const refChild of this.refItem.children) {\r\n if (!refChild.checked) {\r\n refChecked = false;\r\n break;\r\n }\r\n }\r\n }\r\n this.refItem.checked = refChecked;\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-treeview',\r\n templateUrl: './treeview.component.html',\r\n styleUrls: ['./treeview.component.scss']\r\n})\r\nexport class TreeviewComponent implements OnChanges, OnInit {\r\n @Input() headerTemplate: TemplateRef<TreeviewHeaderTemplateContext>;\r\n @Input() itemTemplate: TemplateRef<TreeviewItemTemplateContext>;\r\n @Input() items: TreeviewItem[];\r\n @Input() config: TreeviewConfig;\r\n @Output() selectedChange = new EventEmitter<any[]>();\r\n @Output() filterChange = new EventEmitter<string>();\r\n headerTemplateContext: TreeviewHeaderTemplateContext;\r\n allItem: TreeviewItem;\r\n filterText = '';\r\n filterItems: TreeviewItem[];\r\n selection: TreeviewSelection;\r\n\r\n constructor(\r\n public i18n: TreeviewI18n,\r\n private defaultConfig: TreeviewConfig,\r\n private eventParser: TreeviewEventParser\r\n ) {\r\n this.config = this.defaultConfig;\r\n this.allItem = new TreeviewItem({ text: 'All', value: undefined });\r\n }\r\n\r\n get hasFilterItems(): boolean {\r\n return !isNil(this.filterItems) && this.filterItems.length > 0;\r\n }\r\n\r\n get maxHeight(): string {\r\n return `${this.config.maxHeight}`;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createHeaderTemplateContext();\r\n this.generateSelection();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const itemsSimpleChange = changes.items;\r\n if (!isNil(itemsSimpleChange) && !isNil(this.items)) {\r\n this.updateFilterItems();\r\n this.updateCollapsedOfAll();\r\n this.raiseSelectedChange();\r\n }\r\n }\r\n\r\n onAllCollapseExpand(): void {\r\n this.allItem.collapsed = !this.allItem.collapsed;\r\n this.filterItems.forEach(item => item.setCollapsedRecursive(this.allItem.collapsed));\r\n }\r\n\r\n onFilterTextChange(text: string): void {\r\n this.filterText = text;\r\n this.filterChange.emit(text);\r\n this.updateFilterItems();\r\n }\r\n\r\n onAllCheckedChange(): void {\r\n const checked = this.allItem.checked;\r\n this.filterItems.forEach(item => {\r\n item.setCheckedRecursive(checked);\r\n if (item instanceof FilterTreeviewItem) {\r\n item.updateRefChecked();\r\n }\r\n });\r\n\r\n this.raiseSelectedChange();\r\n }\r\n\r\n onItemCheckedChange(item: TreeviewItem, checked: boolean): void {\r\n if (item instanceof FilterTreeviewItem) {\r\n item.updateRefChecked();\r\n }\r\n\r\n this.updateCheckedOfAll();\r\n this.raiseSelectedChange();\r\n }\r\n\r\n raiseSelectedChange(): void {\r\n this.generateSelection();\r\n const values = this.eventParser.getSelectedChange(this);\r\n setTimeout(() => {\r\n this.selectedChange.emit(values);\r\n });\r\n }\r\n\r\n private createHeaderTemplateContext(): void {\r\n this.headerTemplateContext = {\r\n config: this.config,\r\n item: this.allItem,\r\n onCheckedChange: () => this.onAllCheckedChange(),\r\n onCollapseExpand: () => this.onAllCollapseExpand(),\r\n onFilterTextChange: (text) => this.onFilterTextChange(text)\r\n };\r\n }\r\n\r\n private generateSelection(): void {\r\n let checkedItems: TreeviewItem[] = [];\r\n let uncheckedItems: TreeviewItem[] = [];\r\n if (!isNil(this.items)) {\r\n const selection = TreeviewHelper.concatSelection(this.items, checkedItems, uncheckedItems);\r\n checkedItems = selection.checked;\r\n uncheckedItems = selection.unchecked;\r\n }\r\n\r\n this.selection = {\r\n checkedItems,\r\n uncheckedItems\r\n };\r\n }\r\n\r\n private updateFilterItems(): void {\r\n if (this.filterText !== '') {\r\n const filterItems: TreeviewItem[] = [];\r\n const filterText = this.filterText.toLowerCase();\r\n this.items.forEach(item => {\r\n const newItem = this.filterItem(item, filterText);\r\n if (!isNil(newItem)) {\r\n filterItems.push(newItem);\r\n }\r\n });\r\n this.filterItems = filterItems;\r\n } else {\r\n this.filterItems = this.items;\r\n }\r\n\r\n this.updateCheckedOfAll();\r\n }\r\n\r\n private filterItem(item: TreeviewItem, filterText: string): TreeviewItem {\r\n const isMatch = includes(item.text.toLowerCase(), filterText);\r\n if (isMatch) {\r\n return item;\r\n } else {\r\n if (!isNil(item.children)) {\r\n const children: TreeviewItem[] = [];\r\n item.children.forEach(child => {\r\n const newChild = this.filterItem(child, filterText);\r\n if (!isNil(newChild)) {\r\n children.push(newChild);\r\n }\r\n });\r\n if (children.length > 0) {\r\n const newItem = new FilterTreeviewItem(item);\r\n newItem.collapsed = false;\r\n newItem.children = children;\r\n return newItem;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private updateCheckedOfAll(): void {\r\n let itemChecked: boolean = null;\r\n for (const filterItem of this.filterItems) {\r\n if (itemChecked === null) {\r\n itemChecked = filterItem.checked;\r\n } else if (itemChecked !== filterItem.checked) {\r\n itemChecked = undefined;\r\n break;\r\n }\r\n }\r\n\r\n if (itemChecked === null) {\r\n itemChecked = false;\r\n }\r\n\r\n this.allItem.checked = itemChecked;\r\n }\r\n\r\n private updateCollapsedOfAll(): void {\r\n let hasItemExpanded = false;\r\n for (const filterItem of this.filterItems) {\r\n if (!filterItem.collapsed) {\r\n hasItemExpanded = true;\r\n break;\r\n }\r\n }\r\n\r\n this.allItem.collapsed = !hasItemExpanded;\r\n }\r\n}\r\n","<ng-template #defaultItemTemplate let-item=\"item\" let-onCollapseExpand=\"onCollapseExpand\"\r\n let-onCheckedChange=\"onCheckedChange\">\r\n <div class=\"d-flex align-items-center\" style=\"display: flex;\" [ngClass]=\"{'row-item': !config.compact}\">\r\n <i *ngIf=\"item.children\" (click)=\"onCollapseExpand()\" aria-hidden=\"true\" [ngSwitch]=\"item.collapsed\" class=\"me-1\">\r\n <svg *ngSwitchCase=\"true\" width=\"0.8rem\" height=\"0.8rem\" viewBox=\"0 0 16 16\" class=\"bi bi-caret-right-fill\"\r\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12.14 8.753l-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"false\" width=\"0.8rem\" height=\"0.8rem\" viewBox=\"0 0 16 16\" class=\"bi bi-caret-down-fill\"\r\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M7.247 11.14L2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\" />\r\n </svg>\r\n </i>\r\n <div class=\"form-check mb-0\">\r\n <input type=\"checkbox\" class=\"form-check-input\" *ngIf=\"config.hasCheckBoxes\" [(ngModel)]=\"item.checked\" (ngModelChange)=\"onCheckedChange()\"\r\n [disabled]=\"item.disabled\" [indeterminate]=\"item.indeterminate\" />\r\n <label class=\"form-check-label\" (click)=\"item.checked = !item.checked; onCheckedChange()\">\r\n {{item.text}}\r\n </label>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #defaultHeaderTemplate let-config=\"config\" let-item=\"item\" let-onCollapseExpand=\"onCollapseExpand\"\r\n let-onCheckedChange=\"onCheckedChange\" let-onFilterTextChange=\"onFilterTextChange\">\r\n <div *ngIf=\"config.hasFilter\" class=\"row row-filter\">\r\n <div class=\"col-12\">\r\n <input class=\"form-control\" type=\"text\" [placeholder]=\"i18n.getFilterPlaceholder()\" [(ngModel)]=\"filterText\"\r\n (ngModelChange)=\"onFilterTextChange($event)\" />\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasFilterItems\">\r\n <div *ngIf=\"(config.hasCheckBoxes && config.hasAllCheckBox) || config.hasCollapseExpand\" class=\"row row-all\">\r\n <div class=\"col-12\">\r\n <div class=\"form-check form-check-inline\" *ngIf=\"config.hasCheckBoxes && config.hasAllCheckBox\">\r\n <input type=\"checkbox\" class=\"form-check-input\" [(ngModel)]=\"item.checked\" (ngModelChange)=\"onCheckedChange()\"\r\n [indeterminate]=\"item.indeterminate\" />\r\n <label class=\"form-check-label\" (click)=\"item.checked = !item.checked; onCheckedChange()\">\r\n {{i18n.getAllCheckboxText()}}\r\n </label>\r\n </div>\r\n <label *ngIf=\"config.hasCollapseExpand\" class=\"float-end form-check-label\" (click)=\"onCollapseExpand()\">\r\n <i [title]=\"i18n.getTooltipCollapseExpandText(item.collapsed)\" aria-hidden=\"true\" [ngSwitch]=\"item.collapsed\">\r\n <svg *ngSwitchCase=\"true\" width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" class=\"bi bi-arrows-angle-expand\"\r\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill-rule=\"evenodd\"\r\n d=\"M1.5 10.036a.5.5 0 0 1 .5.5v3.5h3.5a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5v-4a.5.5 0 0 1 .5-.5z\" />\r\n <path fill-rule=\"evenodd\"\r\n d=\"M6.354 9.646a.5.5 0 0 1 0 .708l-4.5 4.5a.5.5 0 0 1-.708-.708l4.5-4.5a.5.5 0 0 1 .708 0zm8.5-8.5a.5.5 0 0 1 0 .708l-4.5 4.5a.5.5 0 0 1-.708-.708l4.5-4.5a.5.5 0 0 1 .708 0z\" />\r\n <path fill-rule=\"evenodd\"\r\n d=\"M10.036 1.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 .5.5v4a.5.5 0 1 1-1 0V2h-3.5a.5.5 0 0 1-.5-.5z\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"false\" width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" class=\"bi bi-arrows-angle-contract\"\r\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill-rule=\"evenodd\"\r\n d=\"M9.5 2.036a.5.5 0 0 1 .5.5v3.5h3.5a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5v-4a.5.5 0 0 1 .5-.5z\" />\r\n <path fill-rule=\"evenodd\"\r\n d=\"M14.354 1.646a.5.5 0 0 1 0 .708l-4.5 4.5a.5.5 0 1 1-.708-.708l4.5-4.5a.5.5 0 0 1 .708 0zm-7.5 7.5a.5.5 0 0 1 0 .708l-4.5 4.5a.5.5 0 0 1-.708-.708l4.5-4.5a.5.5 0 0 1 .708 0z\" />\r\n <path fill-rule=\"evenodd\"\r\n d=\"M2.036 9.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-1 0V10h-3.5a.5.5 0 0 1-.5-.5z\" />\r\n </svg>\r\n </i>\r\n </label>\r\n </div>\r\n </div>\r\n <div *ngIf=\"config.hasDivider\" class=\"dropdown-divider\"></div>\r\n </div>\r\n</ng-template>\r\n<div class=\"treeview-header\">\r\n <ng-template [ngTemplateOutlet]=\"headerTemplate || defaultHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"headerTemplateContext\">\r\n </ng-template>\r\n</div>\r\n<div [ngSwitch]=\"hasFilterItems\" class=\"treeview-wrapper\">\r\n <div *ngSwitchCase=\"true\" class=\"treeview-container\" [style.max-height.px]=\"maxHeight\">\r\n <ngx-treeview-item *ngFor=\"let item of filterItems\" [config]=\"config\" [item]=\"item\"\r\n [template]=\"itemTemplate || defaultItemTemplate\" (checkedChange)=\"onItemCheckedChange(item, $event)\">\r\n </ngx-treeview-item>\r\n </div>\r\n <div *ngSwitchCase=\"false\" class=\"treeview-text\">\r\n {{i18n.getFilterNoItemsFoundText()}}\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output, ViewChild, TemplateRef } from '@angular/core';\r\nimport { TreeviewI18n } from '../../models/treeview-i18n';\r\nimport { TreeviewItem } from '../../models/treeview-item';\r\nimport { TreeviewConfig } from '../../models/treeview-config';\r\nimport { TreeviewComponent } from '../treeview/treeview.component';\r\nimport { TreeviewHeaderTemplateContext } from '../../models/treeview-header-template-context';\r\nimport { TreeviewItemTemplateContext } from '../../models/treeview-item-template-context';\r\n\r\n@Component({\r\n selector: 'ngx-dropdown-treeview',\r\n templateUrl: './dropdown-treeview.component.html',\r\n styleUrls: ['./dropdown-treeview.component.scss']\r\n})\r\nexport class DropdownTreeviewComponent {\r\n @Input() buttonClass = 'btn-outline-secondary';\r\n @Input() headerTemplate: TemplateRef<TreeviewHeaderTemplateContext>;\r\n @Input() itemTemplate: TemplateRef<TreeviewItemTemplateContext>;\r\n @Input() items: TreeviewItem[];\r\n @Input() config: TreeviewConfig;\r\n @Output() selectedChange = new EventEmitter<any[]>(true);\r\n @Output() filterChange = new EventEmitter<string>();\r\n @ViewChild(TreeviewComponent, { static: false }) treeviewComponent: TreeviewComponent;\r\n buttonLabel: string;\r\n\r\n constructor(\r\n public i18n: TreeviewI18n,\r\n private defaultConfig: TreeviewConfig\r\n ) {\r\n this.config = this.defaultConfig;\r\n }\r\n\r\n onSelectedChange(values: any[]): void {\r\n this.buttonLabel = this.i18n.getText(this.treeviewComponent.selection);\r\n this.selectedChange.emit(values);\r\n }\r\n\r\n onFilterChange(text: string): void {\r\n this.filterChange.emit(text);\r\n }\r\n}\r\n","<div class=\"dropdown\" ngxDropdown>\r\n <button class=\"btn\" [ngClass]=\"buttonClass\" type=\"button\" role=\"button\" ngxDropdownToggle>\r\n {{buttonLabel}}\r\n </button>\r\n <div ngxDropdownMenu aria-labelledby=\"dropdownMenu\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dropdown-container treeview-wrapper\">\r\n <ngx-treeview [config]=\"config\" [headerTemplate]=\"headerTemplate\" [items]=\"items\" [itemTemplate]=\"itemTemplate\"\r\n (selectedChange)=\"onSelectedChange($event)\" (filterChange)=\"onFilterChange($event)\">\r\n </ngx-treeview>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { isNil } from 'lodash';\r\nimport { TreeviewItem } from '../models/treeview-item';\r\n\r\n@Pipe({\r\n name: 'ngxTreeview'\r\n})\r\nexport class TreeviewPipe implements PipeTransform {\r\n transform(objects: any[], textField: string): TreeviewItem[] {\r\n if (isNil(objects)) {\r\n return undefined;\r\n }\r\n\r\n return objects.map(object => new TreeviewItem({ text: object[textField], value: object }));\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DropdownDirective } from './directives/dropdown.directive';\r\nimport { DropdownMenuDirective } from './directives/dropdown-menu.directive';\r\nimport { DropdownToggleDirective } from './directives/dropdown-toggle.directive';\r\nimport { DropdownTreeviewComponent } from './components/dropdown-treeview/dropdown-treeview.component';\r\nimport { TreeviewComponent } from './components/treeview/treeview.component';\r\nimport { TreeviewItemComponent } from './components/treeview-item/treeview-item.component';\r\nimport { TreeviewPipe } from './pipes/treeview.pipe';\r\nimport { TreeviewI18n, DefaultTreeviewI18n } from './models/treeview-i18n';\r\nimport { TreeviewConfig } from './models/treeview-config';\r\nimport { TreeviewEventParser, DefaultTreeviewEventParser } from './helpers/treeview-event-parser';\r\n\r\n@NgModule({\r\n imports: [\r\n FormsModule,\r\n CommonModule\r\n ],\r\n declarations: [\r\n TreeviewComponent,\r\n TreeviewItemComponent,\r\n TreeviewPipe,\r\n DropdownDirective,\r\n DropdownMenuDirective,\r\n DropdownToggleDirective,\r\n DropdownTreeviewComponent\r\n ], exports: [\r\n TreeviewComponent,\r\n TreeviewPipe,\r\n DropdownTreeviewComponent\r\n ]\r\n})\r\nexport class TreeviewModule {\r\n static forRoot(): ModuleWithProviders<TreeviewModule> {\r\n return {\r\n ngModule: TreeviewModule,\r\n providers: [\r\n TreeviewConfig,\r\n { provide: TreeviewI18n, useClass: DefaultTreeviewI18n },\r\n { provide: TreeviewEventParser, useClass: DefaultTreeviewEventParser }\r\n ]\r\n };\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-treeview\r\n */\r\n\r\nexport * from './lib/treeview.module';\r\nexport * from './lib/components/treeview/treeview.component';\r\nexport * from './lib/components/dropdown-treeview/dropdown-treeview.component';\r\nexport * from './lib/pipes/treeview.pipe';\r\nexport * from './lib/directives/dropdown-toggle.directive';\r\nexport * from './lib/directives/dropdown.directive';\r\nexport * from './lib/models/treeview-item';\r\nexport * from './lib/models/treeview-config';\r\nexport * from './lib/models/treeview-i18n';\r\nexport * from './lib/models/treeview-item-template-context';\r\nexport * from './lib/helpers/treeview-event-parser';\r\nexport * from './lib/helpers/treeview-helper';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DropdownDirective","i1.TreeviewConfig","i2","i1.TreeviewI18n","i2.TreeviewConfig","i3.TreeviewEventParser","i6.TreeviewItemComponent","i3","i4.TreeviewComponent","i5.DropdownDirective","i6.DropdownMenuDirective","i7.DropdownToggleDirective"],"mappings":"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