Skip to content
Snippets Groups Projects
documentation.effects.ts 9.84 KiB
Newer Older
  • Learn to ignore specific revisions
  • /**
     * This file is part of Anis Client.
     *
     * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
    
    import { Injectable } from '@angular/core';
    
    import { Actions, createEffect, ofType, concatLatestFrom } from '@ngrx/effects';
    import { Store, Action  } from '@ngrx/store';
    import { of } from 'rxjs';
    import { map, tap, mergeMap, catchError } from 'rxjs/operators';
    import { ToastrService } from 'ngx-toastr';
    
    import { criterionToString, stringToCriterion } from '../models';
    import { SearchService } from '../services/search.service';
    import * as documentationActions from '../actions/documentation.actions';
    import * as searchActions from '../actions/search.actions';
    import * as attributeActions from 'src/app/metamodel/actions/attribute.actions';
    import * as attributeSelector from 'src/app/metamodel/selectors/attribute.selector';
    import * as criteriaFamilyActions from 'src/app/metamodel/actions/criteria-family.actions';
    import * as outputFamilyActions from 'src/app/metamodel/actions/output-family.actions';
    import * as outputCategoryActions from 'src/app/metamodel/actions/output-category.actions';
    import * as datasetSelector from 'src/app/metamodel/selectors/dataset.selector';
    import * as searchSelector from '../selectors/search.selector';
    
    @Injectable()
    export class DocumentationEffects {
        loadAttributeList$ = createEffect(() =>
            this.actions$.pipe(
                ofType(documentationActions.loadAttributeList),
                concatLatestFrom(() => this.store.select(datasetSelector.selectDatasetNameByRoute)),
                mergeMap(([action, datasetName]) => {
                    console.log('ok');
                    return of(attributeActions.loadAttributeList());
                })
            )
        );
    
        // initSearch$ = createEffect(() =>
        //     this.actions$.pipe(
        //         ofType(searchActions.initSearch),
        //         concatLatestFrom(() => [
        //             this.store.select(datasetSelector.selectDatasetNameByRoute),
        //             this.store.select(searchSelector.selectCurrentDataset),
        //             this.store.select(searchSelector.selectPristine),
        //             this.store.select(searchSelector.selectStepsByRoute)
        //         ]),
        //         mergeMap(([action, datasetName, currentDataset, pristine, steps]) => {
        //             // User has changed dataset: reload initial state + init search
        //             if (datasetName && currentDataset && datasetName !== currentDataset) {
        //                 return of(searchActions.restartSearch());
        //             }
        //
        //             // User has selected a dataset or page is reloaded: load dataset metamodel
        //             if (datasetName && pristine) {
        //                 let actions: Action[] = [
        //                     searchActions.changeCurrentDataset({ currentDataset: datasetName }),
        //                     attributeActions.loadAttributeList(),
        //                     criteriaFamilyActions.loadCriteriaFamilyList(),
        //                     outputFamilyActions.loadOutputFamilyList(),
        //                     outputCategoryActions.loadOutputCategoryList()
        //                 ];
        //                 if (steps) {
        //                     if(steps[0] === '1') {
        //                         actions.push(searchActions.checkCriteria());
        //                     }
        //                     if(steps[1] === '1') {
        //                         actions.push(searchActions.checkOutput());
        //                     }
        //                     if(steps[2] === '1') {
        //                         actions.push(searchActions.checkResult());
        //                     }
        //                 }
        //                 return actions;
        //             }
        //
        //             // User come back to the search module: reload initial state
        //             if(!datasetName && !pristine) {
        //                 return of(searchActions.resetSearch());
        //             }
        //
        //             // User change step and it's the same search: No action
        //             return of({ type: '[No Action] Init Search' });
        //         })
        //     )
        // );
        //
        // restartSearch$ = createEffect(() =>
        //     this.actions$.pipe(
        //         ofType(searchActions.restartSearch),
        //         map(() => searchActions.initSearch())
        //     )
        // );
        //
        // loadDefaultFormParameters$ = createEffect(() =>
        //     this.actions$.pipe(
        //         ofType(searchActions.loadDefaultFormParameters),
        //         concatLatestFrom(() => [
        //             this.store.select(attributeSelector.selectAllAttributes),
        //             this.store.select(searchSelector.selectCriteriaListByRoute),
        //             this.store.select(searchSelector.selectOutputListByRoute)
        //         ]),
        //         mergeMap(([action, attributeList, criteriaList, outputList]) => {
        //             // Update criteria list
        //             let defaultCriteriaList = [];
        //             if (criteriaList) {
        //                 // Build criteria list with the URL query parameters (c)
        //                 defaultCriteriaList = criteriaList.split(';').map((c: string) => {
        //                     const params = c.split('::');
        //                     const attribute = attributeList.find(a => a.id === parseInt(params[0], 10));
        //                     return stringToCriterion(attribute, params);
        //                 });
        //             } else {
        //                 // Build default criteria list with the attribute list metamodel configuration
        //                 defaultCriteriaList = attributeList
        //                     .filter(attribute => attribute.id_criteria_family && attribute.search_type && attribute.min)
        //                     .map(attribute => stringToCriterion(attribute));
        //             }
        //
        //             // Update output list
        //             let defaultOutputList = [];
        //             if (outputList) {
        //                 // Build output list with the URL query parameters (a)
        //                 defaultOutputList = outputList.split(';').map((o: string) => parseInt(o, 10));
        //             } else {
        //                 // Build default output list with the attribute list metamodel configuration
        //                 defaultOutputList = attributeList
        //                     .filter(attribute => attribute.selected && attribute.id_output_category)
        //                     .map(attribute => attribute.id);
        //             }
        //
        //             // Returns actions and mark the form as dirty
        //             return [
        //                 searchActions.updateCriteriaList({ criteriaList: defaultCriteriaList }),
        //                 searchActions.updateOutputList({ outputList: defaultOutputList }),
        //                 searchActions.markAsDirty()
        //             ];
        //         })
        //     )
        // );
        //
        // retrieveDataLength$ = createEffect(() =>
        //     this.actions$.pipe(
        //         ofType(searchActions.retrieveDataLength),
        //         concatLatestFrom(() => [
        //             this.store.select(datasetSelector.selectDatasetNameByRoute),
        //             this.store.select(searchSelector.selectCriteriaList)
        //         ]),
        //         mergeMap(([action, datasetName, criteriaList]) => {
        //             let query = datasetName + '?a=count';
        //             if (criteriaList.length > 0) {
        //                 query += '&c=' + criteriaList.map(criterion => criterionToString(criterion)).join(';');
        //             }
        //
        //             return this.searchService.retrieveDataLength(query)
        //                 .pipe(
        //                     map((response: { nb: number }[]) => searchActions.retrieveDataLengthSuccess({ length: response[0].nb })),
        //                     catchError(() => of(searchActions.retrieveDataLengthFail()))
        //                 )
        //         })
        //     )
        // );
        //
        // retrieveDataLengthFail$ = createEffect(() =>
        //     this.actions$.pipe(
        //         ofType(searchActions.retrieveDataLengthFail),
        //         tap(() => this.toastr.error('Loading Failed', 'The search data length loading failed'))
        //     ), { dispatch: false}
        // );
        //
        // retrieveData$ = createEffect(() =>
        //     this.actions$.pipe(
        //         ofType(searchActions.retrieveData),
        //         concatLatestFrom(() => [
        //             this.store.select(datasetSelector.selectDatasetNameByRoute),
        //             this.store.select(searchSelector.selectCriteriaList),
        //             this.store.select(searchSelector.selectOutputList)
        //         ]),
        //         mergeMap(([action, datasetName, criteriaList, outputList]) => {
        //             let query = datasetName + '?a=' + outputList.join(';');
        //             if (criteriaList.length > 0) {
        //                 query += '&c=' + criteriaList.map(criterion => criterionToString(criterion)).join(';');
        //             }
        //             query += '&p=' + action.pagination.nbItems + ':' + action.pagination.page;
        //             query += '&o=' + action.pagination.sortedCol + ':' + action.pagination.order;
        //
        //             return this.searchService.retrieveData(query)
        //                 .pipe(
        //                     map((data: any[]) => searchActions.retrieveDataSuccess({ data })),
        //                     catchError(() => of(searchActions.retrieveDataFail()))
        //                 )
        //         })
        //     )
        // );
        //
        // retrieveDataFail$ = createEffect(() =>
        //     this.actions$.pipe(
        //         ofType(searchActions.retrieveDataFail),
        //         tap(() => this.toastr.error('Loading Failed', 'The search data loading failed'))
        //     ), { dispatch: false}
        // );
    
        constructor(
            private actions$: Actions,
            private store: Store<{ }>
        ) {}
    }