From cee9d0422b5901f3f0265fd19349923baa07df92 Mon Sep 17 00:00:00 2001 From: Andreas Awouters Date: Tue, 24 Dec 2024 15:14:03 +0100 Subject: [PATCH 1/3] 122839: Load nodes up to defined preloadLevel --- .../vocabulary-treeview.component.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts index 017416e8c2..ae410d8013 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts @@ -165,12 +165,20 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { ); this.nodeMap.set(node.item.id, newNode); - if ((((level + 1) < this.preloadLevel) && newNode.childrenLoaded) + if ((((level + 1) < this.preloadLevel)) || (newNode.isSearchNode && newNode.childrenLoaded) || newNode.isInInitValueHierarchy) { - if (!newNode.isSearchNode) { + + if (newNode.item.id === LOAD_MORE || newNode.item.id === LOAD_MORE_ROOT) { + // When a 'LOAD_MORE' node is encountered, the parent already has a lot of expanded children + // so this is a good point to stop expanding. + return newNode; + } + + if (!newNode.childrenLoaded) { this.loadChildren(newNode); } + this.treeControl.expand(newNode); } return newNode; From 9406f7b0850f34a3138efa6f98b6785a05eda64b Mon Sep 17 00:00:00 2001 From: Andreas Awouters Date: Tue, 24 Dec 2024 15:48:15 +0100 Subject: [PATCH 2/3] 122839: Retrieve preloadLevel from vocabulary before creating tree --- .../vocabulary-treeview.component.ts | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts index ae410d8013..5ef70f75fe 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts @@ -1,7 +1,7 @@ import { FlatTreeControl } from '@angular/cdk/tree'; import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { map } from 'rxjs/operators'; +import { map, tap, switchMap } from 'rxjs/operators'; import { Observable, Subscription } from 'rxjs'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; @@ -18,7 +18,9 @@ import { VocabularyTreeFlatDataSource } from './vocabulary-tree-flat-data-source import { CoreState } from '../../../core/core-state.model'; import { lowerCase } from 'lodash/string'; import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service'; -import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; +import { getFirstSucceededRemoteDataPayload, getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { Vocabulary } from '../../../core/submission/vocabularies/models/vocabulary.model'; +import { RemoteData } from '../../../core/data/remote-data'; /** * Component that shows a hierarchical vocabulary in a tree view @@ -219,20 +221,35 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit { */ ngOnInit(): void { this.subs.push( - this.vocabularyTreeviewService.getData().subscribe((data) => { + this.vocabularyService.findVocabularyById(this.vocabularyOptions.name).pipe( + // Retrieve the configured preloadLevel from REST + getFirstCompletedRemoteData(), + map((vocabularyRD: RemoteData) => { + if (vocabularyRD.hasSucceeded && + hasValue(vocabularyRD.payload.preloadLevel) && + vocabularyRD.payload.preloadLevel > 1) { + return vocabularyRD.payload.preloadLevel; + } else { + // Set preload level to 1 in case request fails + return 1; + } + }), + tap(preloadLevel => this.preloadLevel = preloadLevel), + tap(() => this.vocabularyTreeviewService.initialize(this.vocabularyOptions, new PageInfo(), this.selectedItems, null)), + switchMap(() => this.vocabularyTreeviewService.getData()), + ).subscribe((data) => { this.dataSource.data = data; }) ); + + this.loading = this.vocabularyTreeviewService.isLoading(); + this.translate.get(`search.filters.filter.${this.vocabularyOptions.name}.head`).pipe( map((type) => lowerCase(type)), ).subscribe( (type) => this.description = this.translate.get('vocabulary-treeview.info', { type }) ); - - this.loading = this.vocabularyTreeviewService.isLoading(); - - this.vocabularyTreeviewService.initialize(this.vocabularyOptions, new PageInfo(), this.selectedItems, null); } /** From 4ffde928d46cdfaa0489aeb5760c3cfcff21a76b Mon Sep 17 00:00:00 2001 From: Andreas Awouters Date: Thu, 2 Jan 2025 14:42:17 +0100 Subject: [PATCH 3/3] 122839: Fix vocabulary-treeview component tests --- .../vocabulary-treeview/vocabulary-treeview.component.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts index 9e6e8dedd3..c36e529042 100644 --- a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts @@ -22,6 +22,7 @@ import { authReducer } from '../../../core/auth/auth.reducer'; import { storeModuleConfig } from '../../../app.reducer'; import { By } from '@angular/platform-browser'; import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service'; +import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; describe('VocabularyTreeviewComponent test suite', () => { @@ -56,7 +57,8 @@ describe('VocabularyTreeviewComponent test suite', () => { findEntryDetailById: jasmine.createSpy('findEntryDetailById'), searchTopEntries: jasmine.createSpy('searchTopEntries'), getEntryDetailChildren: jasmine.createSpy('getEntryDetailChildren'), - clearSearchTopRequests: jasmine.createSpy('clearSearchTopRequests') + clearSearchTopRequests: jasmine.createSpy('clearSearchTopRequests'), + findVocabularyById: createSuccessfulRemoteDataObject$({ preloadLevel: 2 }), }); initialState = {