blob: c08183180480e5e2f9fda293b22afd417aa5ebe8 [file] [log] [blame]
{"version":3,"file":"tree.js","sources":["../../../src/cdk/tree/tree-module.ts","../../../src/cdk/tree/toggle.ts","../../../src/cdk/tree/padding.ts","../../../src/cdk/tree/nested-node.ts","../../../src/cdk/tree/tree.ts","../../../src/cdk/tree/tree-errors.ts","../../../src/cdk/tree/node.ts","../../../src/cdk/tree/outlet.ts","../../../src/cdk/tree/control/nested-tree-control.ts","../../../src/cdk/tree/control/flat-tree-control.ts","../../../src/cdk/tree/control/base-tree-control.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {CdkTreeNodeOutlet} from './outlet';\nimport {CdkTreeNodePadding} from './padding';\nimport {CdkTreeNodeToggle} from './toggle';\nimport {CdkTree, CdkTreeNode} from './tree';\nimport {CdkTreeNodeDef} from './node';\nimport {CdkNestedTreeNode} from './nested-node';\n\nconst EXPORTED_DECLARATIONS = [\n CdkNestedTreeNode,\n CdkTreeNodeDef,\n CdkTreeNodePadding,\n CdkTreeNodeToggle,\n CdkTree,\n CdkTreeNode,\n CdkTreeNodeOutlet,\n];\n\n@NgModule({\n imports: [CommonModule],\n exports: EXPORTED_DECLARATIONS,\n declarations: EXPORTED_DECLARATIONS,\n providers: [FocusMonitor, CdkTreeNodeDef]\n})\nexport class CdkTreeModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {Directive, HostListener, Input} from '@angular/core';\n\nimport {CdkTree, CdkTreeNode} from './tree';\n\n/**\n * Node toggle to expand/collapse the node.\n */\n@Directive({selector: '[cdkTreeNodeToggle]'})\nexport class CdkTreeNodeToggle<T> {\n /** Whether expand/collapse the node recursively. */\n @Input('cdkTreeNodeToggleRecursive')\n get recursive(): boolean { return this._recursive; }\n set recursive(value: boolean) { this._recursive = coerceBooleanProperty(value); }\n protected _recursive = false;\n\n constructor(protected _tree: CdkTree<T>,\n protected _treeNode: CdkTreeNode<T>) {}\n\n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritten.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n @HostListener('click', ['$event'])\n _toggle(event: Event): void {\n this.recursive\n ? this._tree.treeControl.toggleDescendants(this._treeNode.data)\n : this._tree.treeControl.toggle(this._treeNode.data);\n\n event.stopPropagation();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceNumberProperty} from '@angular/cdk/coercion';\nimport {Directive, ElementRef, Input, OnDestroy, Optional, Renderer2} from '@angular/core';\nimport {takeUntil} from 'rxjs/operators';\nimport {Subject} from 'rxjs';\nimport {CdkTree, CdkTreeNode} from './tree';\n\n/** Regex used to split a string on its CSS units. */\nconst cssUnitPattern = /([A-Za-z%]+)$/;\n\n/**\n * Indent for the children tree dataNodes.\n * This directive will add left-padding to the node to show hierarchy.\n */\n@Directive({\n selector: '[cdkTreeNodePadding]',\n})\nexport class CdkTreeNodePadding<T> implements OnDestroy {\n /** Current padding value applied to the element. Used to avoid unnecessarily hitting the DOM. */\n private _currentPadding: string|null;\n\n /** Subject that emits when the component has been destroyed. */\n private _destroyed = new Subject<void>();\n\n /** CSS units used for the indentation value. */\n indentUnits = 'px';\n\n /** The level of depth of the tree node. The padding will be `level * indent` pixels. */\n @Input('cdkTreeNodePadding')\n get level(): number { return this._level; }\n set level(value: number) {\n this._level = coerceNumberProperty(value);\n this._setPadding();\n }\n _level: number;\n\n /**\n * The indent for each level. Can be a number or a CSS string.\n * Default number 40px from material design menu sub-menu spec.\n */\n @Input('cdkTreeNodePaddingIndent')\n get indent(): number | string { return this._indent; }\n set indent(indent: number | string) {\n let value = indent;\n let units = 'px';\n\n if (typeof indent === 'string') {\n const parts = indent.split(cssUnitPattern);\n value = parts[0];\n units = parts[1] || units;\n }\n\n this.indentUnits = units;\n this._indent = coerceNumberProperty(value);\n this._setPadding();\n }\n _indent: number = 40;\n\n constructor(private _treeNode: CdkTreeNode<T>,\n private _tree: CdkTree<T>,\n private _renderer: Renderer2,\n private _element: ElementRef<HTMLElement>,\n @Optional() private _dir: Directionality) {\n this._setPadding();\n if (_dir) {\n _dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this._setPadding(true));\n }\n\n // In Ivy the indentation binding might be set before the tree node's data has been added,\n // which means that we'll miss the first render. We have to subscribe to changes in the\n // data to ensure that everything is up to date.\n _treeNode._dataChanges.subscribe(() => this._setPadding());\n }\n\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** The padding indent value for the tree node. Returns a string with px numbers if not null. */\n _paddingIndent(): string|null {\n const nodeLevel = (this._treeNode.data && this._tree.treeControl.getLevel)\n ? this._tree.treeControl.getLevel(this._treeNode.data)\n : null;\n const level = this._level || nodeLevel;\n return level ? `${level * this._indent}${this.indentUnits}` : null;\n }\n\n _setPadding(forceChange = false) {\n const padding = this._paddingIndent();\n\n if (padding !== this._currentPadding || forceChange) {\n const element = this._element.nativeElement;\n const paddingProp = this._dir && this._dir.value === 'rtl' ? 'paddingRight' : 'paddingLeft';\n const resetProp = paddingProp === 'paddingLeft' ? 'paddingRight' : 'paddingLeft';\n this._renderer.setStyle(element, paddingProp, padding);\n this._renderer.setStyle(element, resetProp, null);\n this._currentPadding = padding;\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n AfterContentInit,\n ContentChildren,\n Directive,\n ElementRef,\n IterableDiffer,\n IterableDiffers,\n OnDestroy,\n QueryList,\n} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\n\nimport {CDK_TREE_NODE_OUTLET_NODE, CdkTreeNodeOutlet} from './outlet';\nimport {CdkTree, CdkTreeNode} from './tree';\nimport {getTreeControlFunctionsMissingError} from './tree-errors';\n\n/**\n * Nested node is a child of `<cdk-tree>`. It works with nested tree.\n * By using `cdk-nested-tree-node` component in tree node template, children of the parent node will\n * be added in the `cdkTreeNodeOutlet` in tree node template.\n * For example:\n * ```html\n * <cdk-nested-tree-node>\n * {{node.name}}\n * <ng-template cdkTreeNodeOutlet></ng-template>\n * </cdk-nested-tree-node>\n * ```\n * The children of node will be automatically added to `cdkTreeNodeOutlet`, the result dom will be\n * like this:\n * ```html\n * <cdk-nested-tree-node>\n * {{node.name}}\n * <cdk-nested-tree-node>{{child1.name}}</cdk-nested-tree-node>\n * <cdk-nested-tree-node>{{child2.name}}</cdk-nested-tree-node>\n * </cdk-nested-tree-node>\n * ```\n */\n@Directive({\n selector: 'cdk-nested-tree-node',\n exportAs: 'cdkNestedTreeNode',\n host: {\n '[attr.aria-expanded]': 'isExpanded',\n '[attr.role]': 'role',\n 'class': 'cdk-tree-node cdk-nested-tree-node',\n },\n providers: [\n {provide: CdkTreeNode, useExisting: CdkNestedTreeNode},\n {provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: CdkNestedTreeNode}\n ]\n})\nexport class CdkNestedTreeNode<T> extends CdkTreeNode<T> implements AfterContentInit, OnDestroy {\n /** Differ used to find the changes in the data provided by the data source. */\n private _dataDiffer: IterableDiffer<T>;\n\n /** The children data dataNodes of current node. They will be placed in `CdkTreeNodeOutlet`. */\n protected _children: T[];\n\n /** The children node placeholder. */\n @ContentChildren(CdkTreeNodeOutlet, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n })\n nodeOutlet: QueryList<CdkTreeNodeOutlet>;\n\n constructor(protected _elementRef: ElementRef<HTMLElement>,\n protected _tree: CdkTree<T>,\n protected _differs: IterableDiffers) {\n super(_elementRef, _tree);\n }\n\n ngAfterContentInit() {\n this._dataDiffer = this._differs.find([]).create(this._tree.trackBy);\n if (!this._tree.treeControl.getChildren) {\n throw getTreeControlFunctionsMissingError();\n }\n const childrenNodes = this._tree.treeControl.getChildren(this.data);\n if (Array.isArray(childrenNodes)) {\n this.updateChildrenNodes(childrenNodes as T[]);\n } else if (childrenNodes instanceof Observable) {\n childrenNodes.pipe(takeUntil(this._destroyed))\n .subscribe(result => this.updateChildrenNodes(result));\n }\n this.nodeOutlet.changes.pipe(takeUntil(this._destroyed))\n .subscribe(() => this.updateChildrenNodes());\n }\n\n ngOnDestroy() {\n this._clear();\n super.ngOnDestroy();\n }\n\n /** Add children dataNodes to the NodeOutlet */\n protected updateChildrenNodes(children?: T[]): void {\n const outlet = this._getNodeOutlet();\n if (children) {\n this._children = children;\n }\n if (outlet && this._children) {\n const viewContainer = outlet.viewContainer;\n this._tree.renderNodeChanges(this._children, this._dataDiffer, viewContainer, this._data);\n } else {\n // Reset the data differ if there's no children nodes displayed\n this._dataDiffer.diff([]);\n }\n }\n\n /** Clear the children dataNodes. */\n protected _clear(): void {\n const outlet = this._getNodeOutlet();\n if (outlet) {\n outlet.viewContainer.clear();\n this._dataDiffer.diff([]);\n }\n }\n\n /** Gets the outlet for the current node. */\n private _getNodeOutlet() {\n const outlets = this.nodeOutlet;\n\n if (outlets) {\n // Note that since we use `descendants: true` on the query, we have to ensure\n // that we don't pick up the outlet of a child node by accident.\n return outlets.find(outlet => !outlet._node || outlet._node === this);\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {FocusableOption} from '@angular/cdk/a11y';\nimport {CollectionViewer, DataSource, isDataSource} from '@angular/cdk/collections';\nimport {\n AfterContentChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n Input,\n IterableChangeRecord,\n IterableDiffer,\n IterableDiffers,\n OnDestroy,\n OnInit,\n QueryList,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n TrackByFunction\n} from '@angular/core';\nimport {BehaviorSubject, Observable, of as observableOf, Subject, Subscription} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {TreeControl} from './control/tree-control';\nimport {CdkTreeNodeDef, CdkTreeNodeOutletContext} from './node';\nimport {CdkTreeNodeOutlet} from './outlet';\nimport {\n getTreeControlFunctionsMissingError,\n getTreeControlMissingError,\n getTreeMissingMatchingNodeDefError,\n getTreeMultipleDefaultNodeDefsError,\n getTreeNoValidDataSourceError\n} from './tree-errors';\n\n/**\n * CDK tree component that connects with a data source to retrieve data of type `T` and renders\n * dataNodes with hierarchy. Updates the dataNodes when new data is provided by the data source.\n */\n@Component({\n moduleId: module.id,\n selector: 'cdk-tree',\n exportAs: 'cdkTree',\n template: `<ng-container cdkTreeNodeOutlet></ng-container>`,\n host: {\n 'class': 'cdk-tree',\n 'role': 'tree',\n },\n encapsulation: ViewEncapsulation.None,\n\n // The \"OnPush\" status for the `CdkTree` component is effectively a noop, so we are removing it.\n // The view for `CdkTree` consists entirely of templates declared in other views. As they are\n // declared elsewhere, they are checked when their declaration points are checked.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default\n})\nexport class CdkTree<T> implements AfterContentChecked, CollectionViewer, OnDestroy, OnInit {\n /** Subject that emits when the component has been destroyed. */\n private _onDestroy = new Subject<void>();\n\n /** Differ used to find the changes in the data provided by the data source. */\n private _dataDiffer: IterableDiffer<T>;\n\n /** Stores the node definition that does not have a when predicate. */\n private _defaultNodeDef: CdkTreeNodeDef<T> | null;\n\n /** Data subscription */\n private _dataSubscription: Subscription | null;\n\n /** Level of nodes */\n private _levels: Map<T, number> = new Map<T, number>();\n\n /**\n * Provides a stream containing the latest data array to render. Influenced by the tree's\n * stream of view window (what dataNodes are currently on screen).\n * Data source can be an observable of data array, or a data array to render.\n */\n @Input()\n get dataSource(): DataSource<T> | Observable<T[]> | T[] { return this._dataSource; }\n set dataSource(dataSource: DataSource<T> | Observable<T[]> | T[]) {\n if (this._dataSource !== dataSource) {\n this._switchDataSource(dataSource);\n }\n }\n private _dataSource: DataSource<T> | Observable<T[]> | T[];\n\n /** The tree controller */\n @Input() treeControl: TreeControl<T>;\n\n /**\n * Tracking function that will be used to check the differences in data changes. Used similarly\n * to `ngFor` `trackBy` function. Optimize node operations by identifying a node based on its data\n * relative to the function to know if a node should be added/removed/moved.\n * Accepts a function that takes two parameters, `index` and `item`.\n */\n @Input() trackBy: TrackByFunction<T>;\n\n // Outlets within the tree's template where the dataNodes will be inserted.\n @ViewChild(CdkTreeNodeOutlet, {static: true}) _nodeOutlet: CdkTreeNodeOutlet;\n\n /** The tree node template for the tree */\n @ContentChildren(CdkTreeNodeDef) _nodeDefs: QueryList<CdkTreeNodeDef<T>>;\n\n // TODO(tinayuangao): Setup a listener for scrolling, emit the calculated view to viewChange.\n // Remove the MAX_VALUE in viewChange\n /**\n * Stream containing the latest information on what rows are being displayed on screen.\n * Can be used by the data source to as a heuristic of what data should be provided.\n */\n viewChange =\n new BehaviorSubject<{start: number, end: number}>({start: 0, end: Number.MAX_VALUE});\n\n constructor(private _differs: IterableDiffers,\n private _changeDetectorRef: ChangeDetectorRef) {}\n\n ngOnInit() {\n this._dataDiffer = this._differs.find([]).create(this.trackBy);\n if (!this.treeControl) {\n throw getTreeControlMissingError();\n }\n }\n\n ngOnDestroy() {\n this._nodeOutlet.viewContainer.clear();\n\n this._onDestroy.next();\n this._onDestroy.complete();\n\n if (this._dataSource && typeof (this._dataSource as DataSource<T>).disconnect === 'function') {\n (this.dataSource as DataSource<T>).disconnect(this);\n }\n\n if (this._dataSubscription) {\n this._dataSubscription.unsubscribe();\n this._dataSubscription = null;\n }\n }\n\n ngAfterContentChecked() {\n const defaultNodeDefs = this._nodeDefs.filter(def => !def.when);\n if (defaultNodeDefs.length > 1) {\n throw getTreeMultipleDefaultNodeDefsError();\n }\n this._defaultNodeDef = defaultNodeDefs[0];\n\n if (this.dataSource && this._nodeDefs && !this._dataSubscription) {\n this._observeRenderChanges();\n }\n }\n\n\n // TODO(tinayuangao): Work on keyboard traversal and actions, make sure it's working for RTL\n // and nested trees.\n\n /**\n * Switch to the provided data source by resetting the data and unsubscribing from the current\n * render change subscription if one exists. If the data source is null, interpret this by\n * clearing the node outlet. Otherwise start listening for new data.\n */\n private _switchDataSource(dataSource: DataSource<T> | Observable<T[]> | T[]) {\n if (this._dataSource && typeof (this._dataSource as DataSource<T>).disconnect === 'function') {\n (this.dataSource as DataSource<T>).disconnect(this);\n }\n\n if (this._dataSubscription) {\n this._dataSubscription.unsubscribe();\n this._dataSubscription = null;\n }\n\n // Remove the all dataNodes if there is now no data source\n if (!dataSource) {\n this._nodeOutlet.viewContainer.clear();\n }\n\n this._dataSource = dataSource;\n if (this._nodeDefs) {\n this._observeRenderChanges();\n }\n }\n\n /** Set up a subscription for the data provided by the data source. */\n private _observeRenderChanges() {\n let dataStream: Observable<T[] | ReadonlyArray<T>> | undefined;\n\n if (isDataSource(this._dataSource)) {\n dataStream = this._dataSource.connect(this);\n } else if (this._dataSource instanceof Observable) {\n dataStream = this._dataSource;\n } else if (Array.isArray(this._dataSource)) {\n dataStream = observableOf(this._dataSource);\n }\n\n if (dataStream) {\n this._dataSubscription = dataStream.pipe(takeUntil(this._onDestroy))\n .subscribe(data => this.renderNodeChanges(data));\n } else {\n throw getTreeNoValidDataSourceError();\n }\n }\n\n /** Check for changes made in the data and render each change (node added/removed/moved). */\n renderNodeChanges(data: T[] | ReadonlyArray<T>, dataDiffer: IterableDiffer<T> = this._dataDiffer,\n viewContainer: ViewContainerRef = this._nodeOutlet.viewContainer,\n parentData?: T) {\n const changes = dataDiffer.diff(data);\n if (!changes) { return; }\n\n changes.forEachOperation((item: IterableChangeRecord<T>,\n adjustedPreviousIndex: number | null,\n currentIndex: number | null) => {\n if (item.previousIndex == null) {\n this.insertNode(data[currentIndex!], currentIndex!, viewContainer, parentData);\n } else if (currentIndex == null) {\n viewContainer.remove(adjustedPreviousIndex!);\n this._levels.delete(item.item);\n } else {\n const view = viewContainer.get(adjustedPreviousIndex!);\n viewContainer.move(view!, currentIndex);\n }\n });\n\n this._changeDetectorRef.detectChanges();\n }\n\n /**\n * Finds the matching node definition that should be used for this node data. If there is only\n * one node definition, it is returned. Otherwise, find the node definition that has a when\n * predicate that returns true with the data. If none return true, return the default node\n * definition.\n */\n _getNodeDef(data: T, i: number): CdkTreeNodeDef<T> {\n if (this._nodeDefs.length === 1) { return this._nodeDefs.first; }\n\n const nodeDef =\n this._nodeDefs.find(def => def.when && def.when(i, data)) || this._defaultNodeDef;\n if (!nodeDef) { throw getTreeMissingMatchingNodeDefError(); }\n\n return nodeDef;\n }\n\n /**\n * Create the embedded view for the data node template and place it in the correct index location\n * within the data node view container.\n */\n insertNode(nodeData: T, index: number, viewContainer?: ViewContainerRef, parentData?: T) {\n const node = this._getNodeDef(nodeData, index);\n\n // Node context that will be provided to created embedded view\n const context = new CdkTreeNodeOutletContext<T>(nodeData);\n\n // If the tree is flat tree, then use the `getLevel` function in flat tree control\n // Otherwise, use the level of parent node.\n if (this.treeControl.getLevel) {\n context.level = this.treeControl.getLevel(nodeData);\n } else if (typeof parentData !== 'undefined' && this._levels.has(parentData)) {\n context.level = this._levels.get(parentData)! + 1;\n } else {\n context.level = 0;\n }\n this._levels.set(nodeData, context.level);\n\n // Use default tree nodeOutlet, or nested node's nodeOutlet\n const container = viewContainer ? viewContainer : this._nodeOutlet.viewContainer;\n container.createEmbeddedView(node.template, context, index);\n\n // Set the data to just created `CdkTreeNode`.\n // The `CdkTreeNode` created from `createEmbeddedView` will be saved in static variable\n // `mostRecentTreeNode`. We get it from static variable and pass the node data to it.\n if (CdkTreeNode.mostRecentTreeNode) {\n CdkTreeNode.mostRecentTreeNode.data = nodeData;\n }\n }\n}\n\n\n/**\n * Tree node for CdkTree. It contains the data in the tree node.\n */\n@Directive({\n selector: 'cdk-tree-node',\n exportAs: 'cdkTreeNode',\n host: {\n '[attr.aria-expanded]': 'isExpanded',\n '[attr.aria-level]': 'role === \"treeitem\" ? level : null',\n '[attr.role]': 'role',\n 'class': 'cdk-tree-node',\n },\n})\nexport class CdkTreeNode<T> implements FocusableOption, OnDestroy {\n /**\n * The most recently created `CdkTreeNode`. We save it in static variable so we can retrieve it\n * in `CdkTree` and set the data to it.\n */\n static mostRecentTreeNode: CdkTreeNode<any> | null = null;\n\n /** Subject that emits when the component has been destroyed. */\n protected _destroyed = new Subject<void>();\n\n /** Emits when the node's data has changed. */\n _dataChanges = new Subject<void>();\n\n /** The tree node's data. */\n get data(): T { return this._data; }\n set data(value: T) {\n if (value !== this._data) {\n this._data = value;\n this._setRoleFromData();\n this._dataChanges.next();\n }\n }\n protected _data: T;\n\n get isExpanded(): boolean {\n return this._tree.treeControl.isExpanded(this._data);\n }\n\n get level(): number {\n return this._tree.treeControl.getLevel ? this._tree.treeControl.getLevel(this._data) : 0;\n }\n\n /**\n * The role of the node should be 'group' if it's an internal node,\n * and 'treeitem' if it's a leaf node.\n */\n @Input() role: 'treeitem' | 'group' = 'treeitem';\n\n constructor(protected _elementRef: ElementRef<HTMLElement>,\n protected _tree: CdkTree<T>) {\n CdkTreeNode.mostRecentTreeNode = this as CdkTreeNode<T>;\n }\n\n ngOnDestroy() {\n // If this is the last tree node being destroyed,\n // clear out the reference to avoid leaking memory.\n if (CdkTreeNode.mostRecentTreeNode === this) {\n CdkTreeNode.mostRecentTreeNode = null;\n }\n\n this._dataChanges.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** Focuses the menu item. Implements for FocusableOption. */\n focus(): void {\n this._elementRef.nativeElement.focus();\n }\n\n protected _setRoleFromData(): void {\n if (this._tree.treeControl.isExpandable) {\n this.role = this._tree.treeControl.isExpandable(this._data) ? 'group' : 'treeitem';\n } else {\n if (!this._tree.treeControl.getChildren) {\n throw getTreeControlFunctionsMissingError();\n }\n const childrenNodes = this._tree.treeControl.getChildren(this._data);\n if (Array.isArray(childrenNodes)) {\n this._setRoleFromChildren(childrenNodes as T[]);\n } else if (childrenNodes instanceof Observable) {\n childrenNodes.pipe(takeUntil(this._destroyed))\n .subscribe(children => this._setRoleFromChildren(children));\n }\n }\n }\n\n protected _setRoleFromChildren(children: T[]) {\n this.role = children && children.length ? 'group' : 'treeitem';\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Returns an error to be thrown when there is no usable data.\n * @docs-private\n */\nexport function getTreeNoValidDataSourceError() {\n return Error(`A valid data source must be provided.`);\n}\n\n/**\n * Returns an error to be thrown when there are multiple nodes that are missing a when function.\n * @docs-private\n */\nexport function getTreeMultipleDefaultNodeDefsError() {\n return Error(`There can only be one default row without a when predicate function.`);\n}\n\n/**\n * Returns an error to be thrown when there are no matching node defs for a particular set of data.\n * @docs-private\n */\nexport function getTreeMissingMatchingNodeDefError() {\n return Error(`Could not find a matching node definition for the provided node data.`);\n}\n\n/**\n * Returns an error to be thrown when there are tree control.\n * @docs-private\n */\nexport function getTreeControlMissingError() {\n return Error(`Could not find a tree control for the tree.`);\n}\n\n/**\n * Returns an error to be thrown when tree control did not implement functions for flat/nested node.\n * @docs-private\n */\nexport function getTreeControlFunctionsMissingError() {\n return Error(`Could not find functions for nested/flat tree in tree control.`);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, TemplateRef} from '@angular/core';\n\n\n/** Context provided to the tree node component. */\nexport class CdkTreeNodeOutletContext<T> {\n /** Data for the node. */\n $implicit: T;\n\n /** Depth of the node. */\n level: number;\n\n /** Index location of the node. */\n index?: number;\n\n /** Length of the number of total dataNodes. */\n count?: number;\n\n constructor(data: T) {\n this.$implicit = data;\n }\n}\n\n/**\n * Data node definition for the CdkTree.\n * Captures the node's template and a when predicate that describes when this node should be used.\n */\n@Directive({\n selector: '[cdkTreeNodeDef]',\n inputs: [\n 'when: cdkTreeNodeDefWhen'\n ],\n})\nexport class CdkTreeNodeDef<T> {\n /**\n * Function that should return true if this node template should be used for the provided node\n * data and index. If left undefined, this node will be considered the default node template to\n * use when no other when functions return true for the data.\n * For every node, there must be at least one when function that passes or an undefined to\n * default.\n */\n when: (index: number, nodeData: T) => boolean;\n\n /** @docs-private */\n constructor(public template: TemplateRef<any>) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n Directive,\n Inject,\n InjectionToken,\n Optional,\n ViewContainerRef,\n} from '@angular/core';\n\n/**\n * Injection token used to provide a `CdkTreeNode` to its outlet.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nexport const CDK_TREE_NODE_OUTLET_NODE = new InjectionToken<{}>('CDK_TREE_NODE_OUTLET_NODE');\n\n/**\n * Outlet for nested CdkNode. Put `[cdkTreeNodeOutlet]` on a tag to place children dataNodes\n * inside the outlet.\n */\n@Directive({\n selector: '[cdkTreeNodeOutlet]'\n})\nexport class CdkTreeNodeOutlet {\n constructor(\n public viewContainer: ViewContainerRef,\n @Inject(CDK_TREE_NODE_OUTLET_NODE) @Optional() public _node?: any) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {Observable} from 'rxjs';\nimport {take, filter} from 'rxjs/operators';\nimport {BaseTreeControl} from './base-tree-control';\n\n/** Nested tree control. Able to expand/collapse a subtree recursively for NestedNode type. */\nexport class NestedTreeControl<T> extends BaseTreeControl<T> {\n\n /** Construct with nested tree function getChildren. */\n constructor(public getChildren: (dataNode: T) => (Observable<T[]> | T[] | undefined | null)) {\n super();\n }\n\n /**\n * Expands all dataNodes in the tree.\n *\n * To make this working, the `dataNodes` variable of the TreeControl must be set to all root level\n * data nodes of the tree.\n */\n expandAll(): void {\n this.expansionModel.clear();\n const allNodes = this.dataNodes.reduce((accumulator: T[], dataNode) =>\n [...accumulator, ...this.getDescendants(dataNode), dataNode], []);\n this.expansionModel.select(...allNodes);\n }\n\n /** Gets a list of descendant dataNodes of a subtree rooted at given data node recursively. */\n getDescendants(dataNode: T): T[] {\n const descendants: T[] = [];\n\n this._getDescendants(descendants, dataNode);\n // Remove the node itself\n return descendants.splice(1);\n }\n\n /** A helper function to get descendants recursively. */\n protected _getDescendants(descendants: T[], dataNode: T): void {\n descendants.push(dataNode);\n const childrenNodes = this.getChildren(dataNode);\n if (Array.isArray(childrenNodes)) {\n childrenNodes.forEach((child: T) => this._getDescendants(descendants, child));\n } else if (childrenNodes instanceof Observable) {\n // TypeScript as of version 3.5 doesn't seem to treat `Boolean` like a function that\n // returns a `boolean` specifically in the context of `filter`, so we manually clarify that.\n childrenNodes.pipe(take(1), filter(Boolean as () => boolean))\n .subscribe(children => {\n for (const child of children) {\n this._getDescendants(descendants, child);\n }\n });\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {BaseTreeControl} from './base-tree-control';\n\n/** Flat tree control. Able to expand/collapse a subtree recursively for flattened tree. */\nexport class FlatTreeControl<T> extends BaseTreeControl<T> {\n\n /** Construct with flat tree data node functions getLevel and isExpandable. */\n constructor(public getLevel: (dataNode: T) => number,\n public isExpandable: (dataNode: T) => boolean) {\n super();\n }\n\n /**\n * Gets a list of the data node's subtree of descendent data nodes.\n *\n * To make this working, the `dataNodes` of the TreeControl must be flattened tree nodes\n * with correct levels.\n */\n getDescendants(dataNode: T): T[] {\n const startIndex = this.dataNodes.indexOf(dataNode);\n const results: T[] = [];\n\n // Goes through flattened tree nodes in the `dataNodes` array, and get all descendants.\n // The level of descendants of a tree node must be greater than the level of the given\n // tree node.\n // If we reach a node whose level is equal to the level of the tree node, we hit a sibling.\n // If we reach a node whose level is greater than the level of the tree node, we hit a\n // sibling of an ancestor.\n for (let i = startIndex + 1;\n i < this.dataNodes.length && this.getLevel(dataNode) < this.getLevel(this.dataNodes[i]);\n i++) {\n results.push(this.dataNodes[i]);\n }\n return results;\n }\n\n /**\n * Expands all data nodes in the tree.\n *\n * To make this working, the `dataNodes` variable of the TreeControl must be set to all flattened\n * data nodes of the tree.\n */\n expandAll(): void {\n this.expansionModel.select(...this.dataNodes);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {SelectionModel} from '@angular/cdk/collections';\nimport {Observable} from 'rxjs';\nimport {TreeControl} from './tree-control';\n\n/** Base tree control. It has basic toggle/expand/collapse operations on a single data node. */\nexport abstract class BaseTreeControl<T> implements TreeControl<T> {\n\n /** Gets a list of descendent data nodes of a subtree rooted at given data node recursively. */\n abstract getDescendants(dataNode: T): T[];\n\n /** Expands all data nodes in the tree. */\n abstract expandAll(): void;\n\n /** Saved data node for `expandAll` action. */\n dataNodes: T[];\n\n /** A selection model with multi-selection to track expansion status. */\n expansionModel: SelectionModel<T> = new SelectionModel<T>(true);\n\n /** Get depth of a given data node, return the level number. This is for flat tree node. */\n getLevel: (dataNode: T) => number;\n\n /**\n * Whether the data node is expandable. Returns true if expandable.\n * This is for flat tree node.\n */\n isExpandable: (dataNode: T) => boolean;\n\n /** Gets a stream that emits whenever the given data node's children change. */\n getChildren: (dataNode: T) => (Observable<T[]> | T[] | undefined | null);\n\n /** Toggles one single data node's expanded/collapsed state. */\n toggle(dataNode: T): void {\n this.expansionModel.toggle(dataNode);\n }\n\n /** Expands one single data node. */\n expand(dataNode: T): void {\n this.expansionModel.select(dataNode);\n }\n\n /** Collapses one single data node. */\n collapse(dataNode: T): void {\n this.expansionModel.deselect(dataNode);\n }\n\n /** Whether a given data node is expanded or not. Returns true if the data node is expanded. */\n isExpanded(dataNode: T): boolean {\n return this.expansionModel.isSelected(dataNode);\n }\n\n /** Toggles a subtree rooted at `node` recursively. */\n toggleDescendants(dataNode: T): void {\n this.expansionModel.isSelected(dataNode)\n ? this.collapseDescendants(dataNode)\n : this.expandDescendants(dataNode);\n }\n\n /** Collapse all dataNodes in the tree. */\n collapseAll(): void {\n this.expansionModel.clear();\n }\n\n /** Expands a subtree rooted at given data node recursively. */\n expandDescendants(dataNode: T): void {\n let toBeProcessed = [dataNode];\n toBeProcessed.push(...this.getDescendants(dataNode));\n this.expansionModel.select(...toBeProcessed);\n }\n\n /** Collapses a subtree rooted at given data node recursively. */\n collapseDescendants(dataNode: T): void {\n let toBeProcessed = [dataNode];\n toBeProcessed.push(...this.getDescendants(dataNode));\n this.expansionModel.deselect(...toBeProcessed);\n }\n}\n"],"names":["observableOf"],"mappings":"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"}