diff --git a/src/components/flatTree/flatTree.component.ts b/src/components/flatTree/flatTree.component.ts index a7996c0662a31de7bf07c6d08990fa4614a2d285..d8cd1d832244fca9882eff9ecc18889a7d9bac79 100644 --- a/src/components/flatTree/flatTree.component.ts +++ b/src/components/flatTree/flatTree.component.ts @@ -1,4 +1,4 @@ -import {EventEmitter, Component, Input, Output, ChangeDetectionStrategy, OnChanges, ViewChild} from "@angular/core"; +import {EventEmitter, Component, Input, Output, ChangeDetectionStrategy, ViewChild, AfterViewChecked} from "@angular/core"; import { FlattenedTreeInterface } from "./flattener.pipe"; import {CdkVirtualScrollViewport} from "@angular/cdk/scrolling"; @@ -15,7 +15,7 @@ import {CdkVirtualScrollViewport} from "@angular/cdk/scrolling"; changeDetection:ChangeDetectionStrategy.OnPush }) -export class FlatTreeComponent implements OnChanges { +export class FlatTreeComponent implements AfterViewChecked { @Input() inputItem : any = { name : 'Untitled', children : [] @@ -34,8 +34,9 @@ export class FlatTreeComponent implements OnChanges { @Input() findChildren : (item:any)=>any[] = (item)=>item.children ? item.children : [] @Input() searchFilter : (item:any)=>boolean | null = ()=>true - @ViewChild('flatTreeVirtualScrollViewPort') _temp: CdkVirtualScrollViewport - @Output() uncollaspedItemsNumber = new EventEmitter<number>() + @ViewChild('flatTreeVirtualScrollViewPort') virtualScrollViewPort: CdkVirtualScrollViewport + @Output() totalRenderedListChanged = new EventEmitter<{ previous: number, current: number }>() + private totalDataLength: number = null public flattenedItems : any[] = [] @@ -46,10 +47,15 @@ export class FlatTreeComponent implements OnChanges { collapsedLevels: Set<string> = new Set() uncollapsedLevels : Set<string> = new Set() - ngOnChanges(): void { - if (this._temp) { - setTimeout(() => {this.uncollaspedItemsNumber.emit(this._temp.getDataLength())}) - } + ngAfterViewChecked(){ + const currentTotalDataLength = this.virtualScrollViewPort.getDataLength() + const previousDataLength = this.totalDataLength + + this.totalRenderedListChanged.emit({ + current: currentTotalDataLength, + previous: previousDataLength + }) + this.totalDataLength = currentTotalDataLength } toggleCollapse(flattenedItem:FlattenedTreeInterface){ @@ -62,7 +68,6 @@ export class FlatTreeComponent implements OnChanges { } this.collapsedLevels = new Set(this.collapsedLevels) this.uncollapsedLevels = new Set(this.uncollapsedLevels) - setTimeout(() => {this.uncollaspedItemsNumber.emit(this._temp.getDataLength())}) } isCollapsed(flattenedItem:FlattenedTreeInterface):boolean{ diff --git a/src/ui/regionHierachy/regionHierarchy.component.ts b/src/ui/regionHierachy/regionHierarchy.component.ts index f9a8c11551e77c35032250ba0ffe8ae92487f941..f8b4fd35dba949a3b4fc7620ad67309a41f0f7c4 100644 --- a/src/ui/regionHierachy/regionHierarchy.component.ts +++ b/src/ui/regionHierachy/regionHierarchy.component.ts @@ -62,15 +62,20 @@ export class RegionHierarchy implements OnInit, AfterViewInit{ @ViewChild('searchTermInput', {read: ElementRef}) private searchTermInput: ElementRef - countItemsIntoTheTree: number + /** + * set the height to max, bound by max-height + */ + numTotalRenderedRegions: number = 999 windowHeight: number @HostListener('document:click', ['$event']) closeRegion(event: MouseEvent) { const contains = this.el.nativeElement.contains(event.target) this.showRegionTree = contains - if (!this.showRegionTree) + if (!this.showRegionTree){ this.searchTerm = '' + this.numTotalRenderedRegions = 999 + } } @HostListener('window:resize', ['$event']) @@ -149,15 +154,6 @@ export class RegionHierarchy implements OnInit, AfterViewInit{ this.changeSearchTerm(ev) }) ) - - setTimeout(() => { - this.countItemsIntoTheTree = 1 - if (this.aggregatedRegionTree.children && - this.aggregatedRegionTree.children.length > 0) { - this.countItems(this.aggregatedRegionTree) - } - }) - } getInputPlaceholder(parcellation:any) { @@ -174,20 +170,14 @@ export class RegionHierarchy implements OnInit, AfterViewInit{ } - countItems(objectToCount) { - objectToCount.children.forEach(object => { - this.countItemsIntoTheTree += 1 - if (object.children && object.children.length > 0) this.countItems(object) - }) - } - - uncollapsedFlatTreeItems(event) { - this.countItemsIntoTheTree = event + handleTotalRenderedListChanged(changeEvent: {previous: number, current: number}){ + const { current } = changeEvent + this.numTotalRenderedRegions = current } regionHierarchyHeight(){ return({ - 'height' : (this.countItemsIntoTheTree * 15 + 60).toString() + 'px', + 'height' : (this.numTotalRenderedRegions * 15 + 60).toString() + 'px', 'max-height': (this.windowHeight - 100) + 'px' }) } diff --git a/src/ui/regionHierachy/regionHierarchy.template.html b/src/ui/regionHierachy/regionHierarchy.template.html index bb3c6d299f6509eb038c0a898e83e87b60bb61ea..91d9f552cb194227a8e4462ed6e9b82868e3f40c 100644 --- a/src/ui/regionHierachy/regionHierarchy.template.html +++ b/src/ui/regionHierachy/regionHierarchy.template.html @@ -38,7 +38,7 @@ class="tree-body"> <flat-tree-component (treeNodeClick)="handleClickRegion($event)" - (uncollaspedItemsNumber)="uncollapsedFlatTreeItems($event)" + (totalRenderedListChanged)="handleTotalRenderedListChanged($event)" [inputItem]="aggregatedRegionTree" [renderNode]="displayTreeNode" [searchFilter]="filterTreeBySearch">