import { Injectable } from '@angular/core'; import { Effect, Actions, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { of } from 'rxjs'; import { switchMap, withLatestFrom } from 'rxjs/operators'; import * as criteriaActions from '../../metamodel/action/criteria.action'; import * as searchActions from './search.action'; import * as fromSearch from './search.reducer'; import { BetweenCriterion } from './model'; @Injectable() export class SearchEffects { constructor( private actions$: Actions, private store$: Store<{search: fromSearch.State}> ) { } @Effect() loadDatasetAttributeListSuccessAction$ = this.actions$.pipe( ofType(criteriaActions.LOAD_DATASET_ATTRIBUTE_LIST_SUCCESS), switchMap((action: criteriaActions.LoadDatasetAttributeListSuccessAction) => { const outputList = action.payload .filter(attribute => attribute.selected && attribute.id_output_family) .map(attribute => attribute.id); const criteriaList = action.payload .filter(attribute => attribute.id_criteria_family && attribute.search_type && attribute.min) .map(attribute => { if (attribute.search_type === 'bw') { return new BetweenCriterion(attribute.id, attribute.min.toString(), attribute.max.toString()); } }); return [ new searchActions.UpdateDefaultOutputListAction(outputList), new searchActions.UpdateDefaultCriteriaListAction(criteriaList) ]; }) ); @Effect() updateDefaultOutputListAction$ = this.actions$.pipe( ofType(searchActions.UPDATE_DEFAULT_OUTPUT_LIST), withLatestFrom(this.store$), switchMap(([action, state]) => { if (state.search.outputList.length > 0) { return of({type: 'No Action'}); } else { const updateDefaultOutputListAction = action as searchActions.UpdateDefaultOutputListAction; return of(new searchActions.UpdateOutputListAction(updateDefaultOutputListAction.payload)); } }) ); @Effect() updateDefaultCriteriaListAction$ = this.actions$.pipe( ofType(searchActions.UPDATE_DEFAULT_CRITERIA_LIST), withLatestFrom(this.store$), switchMap(([action, state]) => { if (state.search.criteriaList.length > 0) { return of({type: 'No Action'}); } else { const updateDefaultCriteriaListAction = action as searchActions.UpdateDefaultCriteriaListAction; return of(new searchActions.UpdateCriteriaListAction(updateDefaultCriteriaListAction.payload)); } }) ); }