diff --git a/client/src/app/instance/search-multiple/components/result/overview.component.html b/client/src/app/instance/search-multiple/components/result/overview.component.html index d1414ccfd11268375ba7aa63f0bdd8ed11e112bb..91b90040c64e0fa910f1e502ff2d7c33d34a5be1 100644 --- a/client/src/app/instance/search-multiple/components/result/overview.component.html +++ b/client/src/app/instance/search-multiple/components/result/overview.component.html @@ -24,7 +24,7 @@ </div> <hr class="my-4"> <div class="text-center"> - <a routerLink="/search-multiple/position" [queryParams]="queryParams" class="btn btn-lg btn-outline-primary"> + <a routerLink="/instance/{{ instanceSelected }}/search-multiple/position" class="btn btn-lg btn-outline-primary"> <span class="fas fa-undo"></span> Try something else </a> </div> @@ -61,6 +61,12 @@ </span> <span *ngIf="getCountByDataset(dataset.name) < 2"> object found</span> <span *ngIf="getCountByDataset(dataset.name) > 1"> objects found</span> + <hr *ngIf="getCountByDataset(dataset.name) > 0" class="my-4"> + <div *ngIf="getCountByDataset(dataset.name) > 0" class="text-center"> + <a routerLink="/instance/{{ instanceSelected }}/search/result/{{ dataset.name }}" [queryParams]="getCsQueryParams()" class="btn btn-outline-primary"> + <span class="fas fa-forward"></span> Go to result + </a> + </div> </li> </ul> </div> diff --git a/client/src/app/instance/search-multiple/components/result/overview.component.ts b/client/src/app/instance/search-multiple/components/result/overview.component.ts index a2f646528ee445c09bc44079aa4dfd209f2cdf33..e85af4d2feed7f641e352c6f5a998a7a596899c8 100644 --- a/client/src/app/instance/search-multiple/components/result/overview.component.ts +++ b/client/src/app/instance/search-multiple/components/result/overview.component.ts @@ -17,6 +17,7 @@ import { ConeSearch, SearchMultipleDatasetLength, SearchMultipleQueryParams } fr templateUrl: 'overview.component.html' }) export class OverviewComponent { + @Input() instanceSelected: string; @Input() datasetFamilyList: DatasetFamily[]; @Input() datasetList: Dataset[]; @Input() coneSearch: ConeSearch; @@ -84,4 +85,10 @@ export class OverviewComponent { getCountByDataset(dname: string): number { return this.dataLength.find(datasetLength => datasetLength.datasetName === dname).length; } + + getCsQueryParams() { + return { + cs: `${this.coneSearch.ra}:${this.coneSearch.dec}:${this.coneSearch.radius}` + } + } } diff --git a/client/src/app/instance/search-multiple/containers/abstract-search-multiple.component.ts b/client/src/app/instance/search-multiple/containers/abstract-search-multiple.component.ts index 31963675cfccf9cad0f6fc918746de8d14dce7cf..d8bbadd476b404c8b20a43d728284d0423c3a67f 100644 --- a/client/src/app/instance/search-multiple/containers/abstract-search-multiple.component.ts +++ b/client/src/app/instance/search-multiple/containers/abstract-search-multiple.component.ts @@ -1,7 +1,7 @@ import { Directive, OnDestroy, OnInit } from '@angular/core'; import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; +import { Observable, Subscription } from 'rxjs'; import { Dataset, DatasetFamily } from 'src/app/metamodel/models'; import { ConeSearch, SearchMultipleQueryParams } from '../../store/models'; @@ -14,6 +14,7 @@ import * as coneSearchSelector from 'src/app/instance/store/selectors/cone-searc @Directive() export abstract class AbstractSearchMultipleComponent implements OnInit, OnDestroy { + public pristine: Observable<boolean>; public instanceSelected: Observable<string>; public datasetFamilyListIsLoading: Observable<boolean>; public datasetFamilyListIsLoaded: Observable<boolean>; @@ -26,14 +27,17 @@ export abstract class AbstractSearchMultipleComponent implements OnInit, OnDestr public coneSearch: Observable<ConeSearch>; public queryParams: Observable<SearchMultipleQueryParams>; + private datasetListSubscription: Subscription; + constructor(protected store: Store<{ }>) { + this.pristine = this.store.select(searchMultipleSelector.selectPristine); this.instanceSelected = this.store.select(instanceSelector.selectInstanceNameByRoute); this.datasetFamilyListIsLoading = store.select(datasetFamilySelector.selectDatasetFamilyListIsLoading); this.datasetFamilyListIsLoaded = store.select(datasetFamilySelector.selectDatasetFamilyListIsLoaded); this.datasetFamilyList = store.select(datasetFamilySelector.selectAllDatasetFamilies); this.datasetListIsLoading = this.store.select(datasetSelector.selectDatasetListIsLoading); this.datasetListIsLoaded = this.store.select(datasetSelector.selectDatasetListIsLoaded); - this.datasetList = this.store.select(datasetSelector.selectAllDatasets); + this.datasetList = this.store.select(datasetSelector.selectAllConeSearchDatasets); this.currentStep = this.store.select(searchMultipleSelector.selectCurrentStep) this.selectedDatasets = this.store.select(searchMultipleSelector.selectSelectedDatasets); this.coneSearch = this.store.select(coneSearchSelector.selectConeSearch); @@ -41,8 +45,14 @@ export abstract class AbstractSearchMultipleComponent implements OnInit, OnDestr } ngOnInit() { - Promise.resolve(null).then(() => this.store.dispatch(searchMultipleActions.initSearch())); + this.datasetListSubscription = this.datasetListIsLoaded.subscribe(datasetListIsLoaded => { + if (datasetListIsLoaded) { + Promise.resolve(null).then(() => this.store.dispatch(searchMultipleActions.initSearch())); + } + }) } - ngOnDestroy() { } + ngOnDestroy() { + this.datasetListSubscription.unsubscribe(); + } } diff --git a/client/src/app/instance/search-multiple/containers/position.component.html b/client/src/app/instance/search-multiple/containers/position.component.html index cb9ef95ac04f1c138c374839ea1d7f1b1b673f56..c12f7eee58be2fcc472afa3b853db897c874d433 100644 --- a/client/src/app/instance/search-multiple/containers/position.component.html +++ b/client/src/app/instance/search-multiple/containers/position.component.html @@ -1,7 +1,7 @@ -<app-spinner *ngIf="(datasetFamilyListIsLoading | async) || (datasetListIsLoading | async)"> +<app-spinner *ngIf="(pristine | async) || (datasetFamilyListIsLoading | async) || (datasetListIsLoading | async)"> </app-spinner> -<div *ngIf="(datasetFamilyListIsLoaded | async) && (datasetListIsLoaded | async)" class="row mt-4"> +<div *ngIf="!(pristine | async) && (datasetFamilyListIsLoaded | async) && (datasetListIsLoaded | async)" class="row mt-4"> <div class="col-12 col-md-8 col-lg-9"> <div class="border rounded my-2"> <p class="border-bottom bg-light text-primary mb-0 py-4 pl-4">Cone Search</p> diff --git a/client/src/app/instance/search-multiple/containers/result-multiple.component.html b/client/src/app/instance/search-multiple/containers/result-multiple.component.html index 84f8d63baeb4f9c77d79318e7e780478827f220a..258f1567d2d3f55ae3fba8ef57b014824078f4a8 100644 --- a/client/src/app/instance/search-multiple/containers/result-multiple.component.html +++ b/client/src/app/instance/search-multiple/containers/result-multiple.component.html @@ -4,6 +4,7 @@ <div *ngIf="(datasetFamilyListIsLoaded | async) && (datasetListIsLoaded | async) || (dataLengthIsLoaded | async)" class="row mt-4"> <div class="col-12"> <app-overview + [instanceSelected]="instanceSelected | async" [datasetFamilyList]="datasetFamilyList | async" [datasetList]="datasetList | async" [coneSearch]="coneSearch | async" diff --git a/client/src/app/instance/search-multiple/containers/result-multiple.component.ts b/client/src/app/instance/search-multiple/containers/result-multiple.component.ts index d6118271b0b79d7b3b2c78d976895db25aaf337c..3e4d66b40fbfcad6aabcededb30c6f628554f20d 100644 --- a/client/src/app/instance/search-multiple/containers/result-multiple.component.ts +++ b/client/src/app/instance/search-multiple/containers/result-multiple.component.ts @@ -22,7 +22,6 @@ import * as searchMultipleSelector from 'src/app/instance/store/selectors/search templateUrl: 'result-multiple.component.html' }) export class ResultMultipleComponent extends AbstractSearchMultipleComponent { - public pristine: Observable<boolean>; public dataLength: Observable<SearchMultipleDatasetLength[]>; public dataLengthIsLoading: Observable<boolean>; public dataLengthIsLoaded: Observable<boolean>; @@ -34,7 +33,6 @@ export class ResultMultipleComponent extends AbstractSearchMultipleComponent { constructor(protected store: Store<{ }>) { super(store); - this.pristine = this.store.select(searchMultipleSelector.selectPristine); this.dataLength = this.store.select(searchMultipleSelector.selectDataLength); this.dataLengthIsLoading = this.store.select(searchMultipleSelector.selectDataLengthIsLoading); this.dataLengthIsLoaded = this.store.select(searchMultipleSelector.selectDataLengthIsLoaded); diff --git a/client/src/app/instance/store/actions/search-multiple.actions.ts b/client/src/app/instance/store/actions/search-multiple.actions.ts index 173a56ecdefca93deb1a7e68bdf5fed647fc2fc5..87d20074517eeb51f87b1895a8c81f6d9a5161a8 100644 --- a/client/src/app/instance/store/actions/search-multiple.actions.ts +++ b/client/src/app/instance/store/actions/search-multiple.actions.ts @@ -12,6 +12,7 @@ import { createAction, props } from '@ngrx/store'; import { SearchMultipleDatasetLength, SearchMultipleDatasetData } from '../models'; export const initSearch = createAction('[Search Multiple] Init Search'); +export const restartSearch = createAction('[Search Multiple] Restart Search'); export const markAsDirty = createAction('[Search Multiple] Mark As Dirty'); export const changeStep = createAction('[Search Multiple] Change Step', props<{ step: string }>()); export const checkDatasets = createAction('[Search Multiple] Check Datasets'); diff --git a/client/src/app/instance/store/effects/search-multiple.effects.ts b/client/src/app/instance/store/effects/search-multiple.effects.ts index 270789015b600dd49474755fb8e232fe46cbfe6d..84382d44732bfb1c719f7d0cbaa96e4326c693a3 100644 --- a/client/src/app/instance/store/effects/search-multiple.effects.ts +++ b/client/src/app/instance/store/effects/search-multiple.effects.ts @@ -17,6 +17,8 @@ import { ToastrService } from 'ngx-toastr'; import { SearchMultipleDatasetLength } from '../models'; import { SearchService } from '../services/search.service'; +import * as instanceSelector from 'src/app/metamodel/selectors/instance.selector'; +import * as datasetSelector from 'src/app/metamodel/selectors/dataset.selector'; import * as searchMultipleActions from '../actions/search-multiple.actions'; import * as searchMultipleSelector from '../selectors/search-multiple.selector'; import * as coneSearchActions from '../actions/cone-search.actions'; @@ -30,9 +32,19 @@ export class SearchMultipleEffects { concatLatestFrom(() => [ this.store.select(searchMultipleSelector.selectPristine), this.store.select(coneSearchSelector.selectConeSearchByRoute), - this.store.select(searchMultipleSelector.selectSelectedDatasetsByRoute) + this.store.select(searchMultipleSelector.selectSelectedDatasetsByRoute), + this.store.select(instanceSelector.selectInstanceByRouteName), + this.store.select(datasetSelector.selectAllConeSearchDatasets) ]), - mergeMap(([action, pristine, coneSearchByRoute, selectedDatasetsByRoute]) => { + mergeMap(([action, pristine, coneSearchByRoute, selectedDatasetsByRoute, instance, datasetList]) => { + if (!pristine && !coneSearchByRoute) { + // Restart search + return [ + coneSearchActions.deleteConeSearch(), + searchMultipleActions.restartSearch() + ]; + } + if (!pristine) { // Default form parameters already loaded or no dataset selected return of({ type: '[No Action] Load Default Form Parameters' }); @@ -61,6 +73,11 @@ export class SearchMultipleEffects { searchMultipleActions.updateSelectedDatasets({ selectedDatasets }), searchMultipleActions.checkDatasets() ); + } else if (instance.config.search.search_multiple_all_datasets_selected) { + const selectedDatasets = datasetList.map(dataset => dataset.name); + actions.push( + searchMultipleActions.updateSelectedDatasets({ selectedDatasets }) + ); } // Returns actions and mark the form as dirty @@ -69,6 +86,13 @@ export class SearchMultipleEffects { ) ); + restartSearch$ = createEffect(() => + this.actions$.pipe( + ofType(searchMultipleActions.restartSearch), + map(() => searchMultipleActions.initSearch()) + ) + ); + retrieveDataLength$ = createEffect(() => this.actions$.pipe( ofType(searchMultipleActions.retrieveDataLength), diff --git a/client/src/app/instance/store/reducers/search-multiple.reducer.ts b/client/src/app/instance/store/reducers/search-multiple.reducer.ts index af05dbdaadd5ec3696b250db39375cd7a3f0a875..bd73fbba1df15c2853d55d21157e8a7f30fb1dbb 100644 --- a/client/src/app/instance/store/reducers/search-multiple.reducer.ts +++ b/client/src/app/instance/store/reducers/search-multiple.reducer.ts @@ -44,6 +44,10 @@ export const initialState: State = { export const searchMultipleReducer = createReducer( initialState, + on(searchMultipleActions.restartSearch, () => ({ + ...initialState, + currentStep: 'position' + })), on(searchMultipleActions.changeStep, (state, { step }) => ({ ...state, currentStep: step diff --git a/client/src/app/metamodel/selectors/dataset.selector.ts b/client/src/app/metamodel/selectors/dataset.selector.ts index 71294e9175bcb756fcbef983db7288edc3a18da3..d456b9e12640f2340cb11dd66d80c6edea60fb35 100644 --- a/client/src/app/metamodel/selectors/dataset.selector.ts +++ b/client/src/app/metamodel/selectors/dataset.selector.ts @@ -57,3 +57,8 @@ export const selectDatasetNameByRoute = createSelector( reducer.selectRouterState, router => router.state.params.dname as string ); + +export const selectAllConeSearchDatasets = createSelector( + selectAllDatasets, + datasetList => datasetList.filter(dataset => dataset.config.cone_search.cone_search_enabled) +); \ No newline at end of file