diff --git a/src/app/metamodel/effects/attribute.effects.ts b/src/app/metamodel/effects/attribute.effects.ts index 95cb91eeef0c1255b65f737bc764908784161513..af615839f2a4ad12abd88e413f194e6ce6dea17a 100644 --- a/src/app/metamodel/effects/attribute.effects.ts +++ b/src/app/metamodel/effects/attribute.effects.ts @@ -42,14 +42,14 @@ export class AttributeEffects { ofType(attributeActions.LOAD_MULTIPLE_ATTRIBUTE_LISTS), switchMap((action: attributeActions.LoadMultipleAttributeListsAction) => { let requests: Observable<any>[] = []; - action.payload.map(dname => { + action.payload.forEach(dname => { requests.push(this.attributeService.retrieveAttributeList(dname)); }); return forkJoin(requests); }), switchMap((data: { datasetName: string, attributeList: Attribute[] }[]) => { let attributesByDataset: AttributesByDataset[] = []; - data.map(d => { + data.forEach(d => { const attributeList: AttributesByDataset = { datasetName: d.datasetName, isLoading: false, diff --git a/src/app/metamodel/selectors/dataset.selector.spec.ts b/src/app/metamodel/selectors/dataset.selector.spec.ts index 9922a005626fb53069e032654598317ff46da51c..a09e545762c2645a4ebee0212138778d61ed4c88 100644 --- a/src/app/metamodel/selectors/dataset.selector.spec.ts +++ b/src/app/metamodel/selectors/dataset.selector.spec.ts @@ -1,5 +1,7 @@ import * as datasetSelector from './dataset.selector'; import * as fromDataset from '../reducers/dataset.reducer'; +import { Dataset } from '../model'; +import { DATASET_LIST } from '../../../settings/test-data'; describe('[Metamodel] Dataset selector', () => { it('should get datasetSearchMetaIsLoading', () => { @@ -21,6 +23,20 @@ describe('[Metamodel] Dataset selector', () => { const state = { metamodel: { dataset: { ...fromDataset.initialState }}}; expect(datasetSelector.getDatasetList(state).length).toEqual(0); }); + + it('should get datasetList with cone search enabled', () => { + const state = { + metamodel: { + dataset: { + ...fromDataset.initialState, + datasetList: DATASET_LIST + } + } + }; + const datasetWithConeSearchList: Dataset[] = datasetSelector.getDatasetWithConeSearchList(state); + expect(datasetWithConeSearchList.length).toEqual(1); + expect(datasetWithConeSearchList[0].name).toEqual('cat_1'); + }); it('should get datasetFamilyList', () => { const state = { metamodel: { dataset: { ...fromDataset.initialState }}}; diff --git a/src/app/metamodel/selectors/dataset.selector.ts b/src/app/metamodel/selectors/dataset.selector.ts index 740d9a0b104e68872c4e4cd2044317401c0c8d35..64866336fa252bb45f0d2b3304260d395e58df56 100644 --- a/src/app/metamodel/selectors/dataset.selector.ts +++ b/src/app/metamodel/selectors/dataset.selector.ts @@ -2,6 +2,7 @@ import { createSelector } from '@ngrx/store'; import * as metamodel from '../reducers'; import * as dataset from '../reducers/dataset.reducer'; +import { Dataset } from '../model'; export const getDatasetState = createSelector( metamodel.getMetamodelState, @@ -28,6 +29,13 @@ export const getDatasetList = createSelector( dataset.getDatasetList ); +export const getDatasetWithConeSearchList = createSelector( + getDatasetList, + (datasetList: Dataset[]) => { + return datasetList.filter(d => d.config.cone_search && d.config.cone_search.enabled === true); + } +); + export const getDatasetFamilyList = createSelector( getDatasetState, dataset.getDatasetFamilyList diff --git a/src/app/search-multiple/components/datasets/dataset-list.component.html b/src/app/search-multiple/components/datasets/dataset-list.component.html index 6feadc596866901a175ffd8f72a0328813baa173..489444e2fbc642e5ecff92759c7f9d51656c740b 100644 --- a/src/app/search-multiple/components/datasets/dataset-list.component.html +++ b/src/app/search-multiple/components/datasets/dataset-list.component.html @@ -1,5 +1,5 @@ <div class="row"> - <div *ngFor="let project of getProjectSortedByName()" class="col-12 col-lg-6 col-xl-4 my-3 text-center"> + <div *ngFor="let project of getProject()" class="col-12 col-lg-6 col-xl-4 my-3 text-center"> <app-datasets-by-project [project]="project" [datasetList]="getDatasetsByProject(project.name)" diff --git a/src/app/search-multiple/components/datasets/dataset-list.component.spec.ts b/src/app/search-multiple/components/datasets/dataset-list.component.spec.ts index ce893263b45580c1793edd5d5e446453b20f2d9e..9d389694f6017ce816d20f38786a713ab9101b97 100644 --- a/src/app/search-multiple/components/datasets/dataset-list.component.spec.ts +++ b/src/app/search-multiple/components/datasets/dataset-list.component.spec.ts @@ -3,7 +3,7 @@ import { Component, Input, ViewChild } from '@angular/core'; import { DatasetListComponent } from './dataset-list.component'; import { Project, Dataset } from '../../../metamodel/model'; -import { PROJECT_LIST, DATASET_LIST } from '../../../../settings/test-data'; +import { PROJECT_LIST, DATASET } from '../../../../settings/test-data'; describe('[SearchMultiple][Datasets] Component: DatasetListComponent', () => { @Component({ @@ -19,7 +19,7 @@ describe('[SearchMultiple][Datasets] Component: DatasetListComponent', () => { @ViewChild(DatasetListComponent, { static: false }) public testedComponent: DatasetListComponent; public projectList: Project[] = PROJECT_LIST; - public datasetList: Dataset[] = DATASET_LIST; + public datasetList: Dataset[] = [DATASET]; public selectedDatasets: string[] = []; } @@ -54,24 +54,22 @@ describe('[SearchMultiple][Datasets] Component: DatasetListComponent', () => { expect(testedComponent).toBeTruthy(); }); - it('#getProjectSortedByName() should return sorted project list', () => { - const sortedProjectList: Project[] = testedComponent.getProjectSortedByName(); - expect(sortedProjectList.length).toBe(2); + it('#getProject() should return sorted project list', () => { + const sortedProjectList: Project[] = testedComponent.getProject(); + expect(sortedProjectList.length).toBe(1); expect(sortedProjectList[0].name).toBe('project_1'); - expect(sortedProjectList[1].name).toBe('project_2'); }); it('#getDatasetsByProject() should return dataset list for the given project', () => { const datasetList: Dataset[] = testedComponent.getDatasetsByProject('project_1'); - expect(datasetList.length).toBe(2); + expect(datasetList.length).toBe(1); expect(datasetList[0].name).toBe('cat_1'); - expect(datasetList[1].name).toBe('cat_2'); }); it('#getIsAllSelected() should return true if all datasets of the given project are selected', () => { - testHostComponent.selectedDatasets = ['cat_3']; + testHostComponent.selectedDatasets = ['cat_1']; testHostFixture.detectChanges(); - expect(testedComponent.getIsAllSelected('project_2')).toBeTruthy(); + expect(testedComponent.getIsAllSelected('project_1')).toBeTruthy(); }); it('#getIsAllSelected() should return false if not all datasets of the given project are selected', () => { diff --git a/src/app/search-multiple/components/datasets/dataset-list.component.ts b/src/app/search-multiple/components/datasets/dataset-list.component.ts index 2291178b693ae60063a35a3a4ffa7b2c2b85b991..17e704ac8edecc5d9099b8aa46ad32cec978f81e 100644 --- a/src/app/search-multiple/components/datasets/dataset-list.component.ts +++ b/src/app/search-multiple/components/datasets/dataset-list.component.ts @@ -14,8 +14,18 @@ export class DatasetListComponent { @Output() updateSelectedDatasets: EventEmitter<string[]> = new EventEmitter(); - getProjectSortedByName(): Project[] { - return [...this.projectList].sort((a, b) => a.name.localeCompare(b.name)); + // Return project that contains datasets with cone search enabled + // Return projects are sorted by name + getProject(): Project[] { + const projectNames: string[] = []; + this.datasetList.forEach(d => { + if (!projectNames.includes(d.project_name)) { + projectNames.push(d.project_name); + } + }); + return [...this.projectList] + .filter(p => projectNames.includes(p.name)) + .sort((a, b) => a.name.localeCompare(b.name)); } getDatasetsByProject(projectName: string): Dataset[] { diff --git a/src/app/search-multiple/components/result/datasets-result.component.ts b/src/app/search-multiple/components/result/datasets-result.component.ts index e699ebdb175b9d1455b1c0e962c0be0e2992e176..616d043382d29734683b1a3518a6a07078b93ef4 100644 --- a/src/app/search-multiple/components/result/datasets-result.component.ts +++ b/src/app/search-multiple/components/result/datasets-result.component.ts @@ -33,7 +33,7 @@ export class DatasetsResultComponent { projectOrderedByName.map(p => { this.datasetList.filter(d => d.project_name === p.name) .sort(sortByDisplay) - .map(d => { + .forEach(d => { this.datasetsCount.map(c => { if (c.dname === d.name && c.count > 0) { datasets.push(d); diff --git a/src/app/search-multiple/components/result/overview.component.ts b/src/app/search-multiple/components/result/overview.component.ts index 8a67002003533863c077c0f6ad5c3ad416b790aa..cb220cb1a51f971cf91d5ee5e293e8fbb966bca9 100644 --- a/src/app/search-multiple/components/result/overview.component.ts +++ b/src/app/search-multiple/components/result/overview.component.ts @@ -28,7 +28,7 @@ export class OverviewComponent { let total: number = 0; this.datasetsCount .filter(c => c.count > 0) - .map(c => total += c.count) + .forEach(c => total += c.count) return total; } @@ -38,7 +38,7 @@ export class OverviewComponent { getProjectSortedByName(): Project[] { let projectWithSelectedDataset: Project[] = []; - this.selectedDatasets.map(dname => { + this.selectedDatasets.forEach(dname => { const dataset: Dataset = this.datasetList.find(d => d.name === dname); const project: Project = this.projectList.find(p => p.name === dataset.project_name); if (!projectWithSelectedDataset.includes(project)) { diff --git a/src/app/search-multiple/components/summary-multiple.component.html b/src/app/search-multiple/components/summary-multiple.component.html index 9dc698a6f7c69819a0ddf4df205692245926e538..c73d7bc0f05622c6813c0198b500b75e86f3de87 100644 --- a/src/app/search-multiple/components/summary-multiple.component.html +++ b/src/app/search-multiple/components/summary-multiple.component.html @@ -33,7 +33,7 @@ <div *ngIf="!noSelectedDatasets"> <!-- Accordion projects --> <accordion [isAnimated]="true"> - <accordion-group *ngFor="let project of getProjectSortedByName()" #ag panelClass="abstract-accordion" [isOpen]="accordionProjectIsOpen" class="pl-5"> + <accordion-group *ngFor="let project of getProject()" #ag panelClass="abstract-accordion" [isOpen]="accordionProjectIsOpen" class="pl-5"> <button class="btn btn-link btn-block clearfix pb-1 text-primary" accordion-heading> <div class="pull-left float-left"> {{ project.label }} diff --git a/src/app/search-multiple/components/summary-multiple.component.spec.ts b/src/app/search-multiple/components/summary-multiple.component.spec.ts index 99eb6b8d5aba829d20ab2afc5f418e92af7df019..da27af05674cc874803031a98ce953fa847777d5 100644 --- a/src/app/search-multiple/components/summary-multiple.component.spec.ts +++ b/src/app/search-multiple/components/summary-multiple.component.spec.ts @@ -4,7 +4,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { AccordionModule } from 'ngx-bootstrap/accordion'; import { SummaryMultipleComponent } from './summary-multiple.component'; -import { DATASET_LIST, PROJECT_LIST } from '../../../settings/test-data'; +import { DATASET, DATASET_LIST, PROJECT_LIST } from '../../../settings/test-data'; describe('[SearchMultiple] Component: SummaryMultipleComponent', () => { let component: SummaryMultipleComponent; @@ -23,10 +23,10 @@ describe('[SearchMultiple] Component: SummaryMultipleComponent', () => { expect(component).toBeTruthy(); }); - it('#getProjectSortedByName() should return list of projects', () => { + it('#getProject() should return list of projects that contains datasets with cone search enabled', () => { component.projectList = PROJECT_LIST; - expect(component.getProjectSortedByName()[0].name).toBe('project_1'); - expect(component.getProjectSortedByName()[1].name).toBe('project_2'); + component.datasetList = [DATASET]; + expect(component.getProject()[0].name).toBe('project_1'); }); it('#getSelectedDatasetsByProject() should return list of selected datasets for the given project', () => { diff --git a/src/app/search-multiple/components/summary-multiple.component.ts b/src/app/search-multiple/components/summary-multiple.component.ts index 4814605ea71bb920767e97cc8ca117b2be7fc89c..30d829e77a4a967cf4b83269f7e51928873cb65b 100644 --- a/src/app/search-multiple/components/summary-multiple.component.ts +++ b/src/app/search-multiple/components/summary-multiple.component.ts @@ -24,8 +24,18 @@ export class SummaryMultipleComponent { accordionProjectIsOpen = true; - getProjectSortedByName(): Project[] { - return [...this.projectList].sort((a, b) => a.name.localeCompare(b.name)); + // Return project that contains datasets with cone search enabled + // Returned projects are sorted by name + getProject(): Project[] { + const projectNames: string[] = []; + this.datasetList.forEach(d => { + if (!projectNames.includes(d.project_name)) { + projectNames.push(d.project_name); + } + }); + return [...this.projectList] + .filter(p => projectNames.includes(p.name)) + .sort((a, b) => a.name.localeCompare(b.name)); } getSelectedDatasetsByProject(projectName: string): Dataset[] { diff --git a/src/app/search-multiple/containers/datasets.component.ts b/src/app/search-multiple/containers/datasets.component.ts index 721e8f8ab2c9bcfaf43f7cb010d578d8e8aa15b6..cd3dd58b60894e3002a2f4685f1b7c2e1480ed23 100644 --- a/src/app/search-multiple/containers/datasets.component.ts +++ b/src/app/search-multiple/containers/datasets.component.ts @@ -42,7 +42,7 @@ export class DatasetsComponent implements OnInit { this.datasetSearchMetaIsLoaded = store.select(metamodelSelector.getDatasetSearchMetaIsLoaded); this.currentStep = store.select(searchMultipleSelector.getCurrentStep); this.projectList = store.select(metamodelSelector.getProjectList); - this.datasetList = store.select(metamodelSelector.getDatasetList); + this.datasetList = store.select(metamodelSelector.getDatasetWithConeSearchList); this.isValidConeSearch = this.store.select(coneSearchSelector.getIsValidConeSearch); this.selectedDatasets = this.store.select(searchMultipleSelector.getSelectedDatasets); this.noSelectedDatasets = this.store.select(searchMultipleSelector.getNoSelectedDatasets); diff --git a/src/app/search-multiple/containers/position.component.ts b/src/app/search-multiple/containers/position.component.ts index a101b8fd498142910adaa8e314f1daab00176e5d..036630e18ea8349250aa03564278fa70393427ae 100644 --- a/src/app/search-multiple/containers/position.component.ts +++ b/src/app/search-multiple/containers/position.component.ts @@ -45,7 +45,7 @@ export class PositionComponent implements OnInit { this.isValidConeSearch = this.store.select(coneSearchSelector.getIsValidConeSearch); this.coneSearch = this.store.select(coneSearchSelector.getConeSearch); this.projectList = store.select(metamodelSelector.getProjectList); - this.datasetList = store.select(metamodelSelector.getDatasetList); + this.datasetList = store.select(metamodelSelector.getDatasetWithConeSearchList); this.selectedDatasets = store.select(searchMultipleSelector.getSelectedDatasets); this.noSelectedDatasets = store.select(searchMultipleSelector.getNoSelectedDatasets); this.queryParams = this.store.select(searchMultipleSelector.getQueryParams); diff --git a/src/app/search-multiple/store/search-multiple.effects.ts b/src/app/search-multiple/store/search-multiple.effects.ts index 495c98ccbf8348c50d75df0c14e010d262ca7552..f3d41e8a260c99efa38c74af43bf659a2f77fffe 100644 --- a/src/app/search-multiple/store/search-multiple.effects.ts +++ b/src/app/search-multiple/store/search-multiple.effects.ts @@ -69,8 +69,9 @@ export class SearchMultipleEffects { switchMap(([action, state]) => { if (state.searchMultiple.selectedDatasets.length === 0) { const loadDatasetSearchMetaSuccessAction = action as datasetActions.LoadDatasetSearchMetaSuccessAction; - const datasetList: Dataset[] = loadDatasetSearchMetaSuccessAction.payload[1]; - const selectedDatasets: string[] = datasetList.map(d => d.name); + const datasetWithConeSearchList: Dataset[] = loadDatasetSearchMetaSuccessAction.payload[1] + .filter(d => d.config.cone_search && d.config.cone_search.enabled === true); + const selectedDatasets: string[] = datasetWithConeSearchList.map(d => d.name); return of(new searchMultipleActions.InitSelectedDatasetsAction(selectedDatasets)); } else { return of({ type: '[No Action] ' + searchMultipleActions.INIT_SELECTED_DATASETS }); @@ -85,7 +86,7 @@ export class SearchMultipleEffects { switchMap(([action, state]) => { const datasetList: Dataset[] = state.metamodel.dataset.datasetList; let requests: Observable<any>[] = []; - state.searchMultiple.selectedDatasets.map(dname => { + state.searchMultiple.selectedDatasets.forEach(dname => { const datasetConfig = datasetList.find(d => d.name === dname).config; if (datasetConfig !== null && 'cone_search' in datasetConfig && datasetConfig.cone_search.enabled) { let query: string = dname + '?a=count'; @@ -98,11 +99,11 @@ export class SearchMultipleEffects { withLatestFrom(this.store$), switchMap(([data, state]) => { let counts: { dname: string, count: number }[] = []; - data.map(d => { + data.forEach(d => { counts.push(d); }); const datasetList: Dataset[] = state.metamodel.dataset.datasetList; - state.searchMultiple.selectedDatasets.map(dname => { + state.searchMultiple.selectedDatasets.forEach(dname => { const datasetConfig = datasetList.find(d => d.name === dname).config; if (datasetConfig === null || !('cone_search' in datasetConfig) || !datasetConfig.cone_search.enabled) { counts.push({ dname: dname, count: 0}); @@ -157,7 +158,7 @@ export class SearchMultipleEffects { return this.searchMultipleService.retrieveData(dname, query).pipe( map((data: { datasetName: string, data: any[] }) => new searchMultipleActions.RetrieveDataSuccessAction(data)), // TODO: Pass dname - catchError(() => of(new searchMultipleActions.RetrieveDataFailAction('toto'))) + catchError(() => of(new searchMultipleActions.RetrieveDataFailAction(''))) ); }) ); diff --git a/src/settings/test-data/dataset-list.ts b/src/settings/test-data/dataset-list.ts index 253cdce81928d00bebb6ba9720b67ffa690ae252..73f8d562a10bcd50c45e02f777b9bd98b4f3f9de 100644 --- a/src/settings/test-data/dataset-list.ts +++ b/src/settings/test-data/dataset-list.ts @@ -35,7 +35,7 @@ export const DATASET_LIST: Dataset[] = [ selectable_row: false, project_name: 'project_2', id_dataset_family: 2, - config: null + config: {} }, { name: 'cat_2', @@ -48,6 +48,6 @@ export const DATASET_LIST: Dataset[] = [ selectable_row: false, project_name: 'project_1', id_dataset_family: 2, - config: null + config: {} } ];