From 7bb2a1238753fa844965f4c4f60212fb3b5dc686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Agneray?= <francois.agneray@lam.fr> Date: Mon, 15 Apr 2019 16:11:11 +0200 Subject: [PATCH] #2 => done --- src/app/search/components/index.ts | 4 +- .../components/url-display.component.css | 0 .../components/url-display.component.html | 3 ++ .../components/url-display.component.ts | 22 ++++++++++ .../search/containers/result.component.html | 6 +++ src/app/search/containers/result.component.ts | 2 + .../search/store/model/select-criterion.ts | 2 +- src/app/search/store/search.action.ts | 16 ++++++++ src/app/search/store/search.effects.ts | 40 +++++++++++++++++-- 9 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 src/app/search/components/url-display.component.css create mode 100644 src/app/search/components/url-display.component.html create mode 100644 src/app/search/components/url-display.component.ts diff --git a/src/app/search/components/index.ts b/src/app/search/components/index.ts index f1788c08..b930452d 100644 --- a/src/app/search/components/index.ts +++ b/src/app/search/components/index.ts @@ -5,6 +5,7 @@ import { CriteriaTabsComponent } from './criteria-tabs.component'; import { OutputTabsComponent } from './output-tabs.component'; import { SummaryComponent } from './summary.component'; import { criteriaComponents } from './criteria'; +import { UrlDisplayComponent } from './url-display.component'; export const dummiesComponents = [ ProgressComponent, @@ -13,5 +14,6 @@ export const dummiesComponents = [ CriteriaTabsComponent, OutputTabsComponent, criteriaComponents, - SummaryComponent + SummaryComponent, + UrlDisplayComponent ]; diff --git a/src/app/search/components/url-display.component.css b/src/app/search/components/url-display.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/search/components/url-display.component.html b/src/app/search/components/url-display.component.html new file mode 100644 index 00000000..d931f1c7 --- /dev/null +++ b/src/app/search/components/url-display.component.html @@ -0,0 +1,3 @@ +<p> + <a target="_blank" [href]="getUrl()">{{Â getUrl() }}</a> +</p> \ No newline at end of file diff --git a/src/app/search/components/url-display.component.ts b/src/app/search/components/url-display.component.ts new file mode 100644 index 00000000..061357fb --- /dev/null +++ b/src/app/search/components/url-display.component.ts @@ -0,0 +1,22 @@ +import { Component, Input, ChangeDetectionStrategy, Output, EventEmitter } from '@angular/core'; + +import { Criterion } from '../store/model'; + +@Component({ + selector: 'app-url-display', + templateUrl: 'url-display.component.html', + styleUrls: [ 'url-display.component.css' ], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class UrlDisplayComponent { + @Input() apiPath: string; + @Input() datasetName: string; + @Input() criteriaList: Criterion[]; + @Input() outputList: number[]; + + getUrl() { + return this.apiPath + '/data/' + this.datasetName + '?a=' + + this.outputList.join(';') + '&c=' + + this.criteriaList.map(criterion => criterion.getCriterionStr()).join(';'); + } +} \ No newline at end of file diff --git a/src/app/search/containers/result.component.html b/src/app/search/containers/result.component.html index c9584683..9d7600a9 100644 --- a/src/app/search/containers/result.component.html +++ b/src/app/search/containers/result.component.html @@ -1,5 +1,11 @@ <div class="row mt-4"> <div class="col-12 col-md-8"> + <app-url-display + [apiPath]="apiPath" + [datasetName]="datasetName | async" + [criteriaList]="criteriaList | async" + [outputList]="outputList | async"> + </app-url-display> Datatable ? </div> <div class="col-12 col-md-4 pt-2"> diff --git a/src/app/search/containers/result.component.ts b/src/app/search/containers/result.component.ts index 8d19f0d0..bded6e07 100644 --- a/src/app/search/containers/result.component.ts +++ b/src/app/search/containers/result.component.ts @@ -4,6 +4,7 @@ import { ActivatedRoute, ParamMap } from '@angular/router'; import { Observable } from 'rxjs'; import { Store } from '@ngrx/store'; +import { environment } from '../../../environments/environment'; import { Criterion } from '../store/model'; import { Dataset, DatasetOutputFamily, OutputFamily, Category, Attribute } from '../../metamodel/model'; import * as searchActions from '../store/search.action'; @@ -26,6 +27,7 @@ interface StoreState { styleUrls: [ 'result.component.css' ] }) export class ResultComponent implements OnInit { + public apiPath: string = environment.apiUrl + '/search'; public datasetName: Observable<String>; public currentStep: Observable<string>; public datasetList: Observable<Dataset[]>; diff --git a/src/app/search/store/model/select-criterion.ts b/src/app/search/store/model/select-criterion.ts index 1caf64a1..2a656e31 100644 --- a/src/app/search/store/model/select-criterion.ts +++ b/src/app/search/store/model/select-criterion.ts @@ -14,6 +14,6 @@ export class SelectCriterion extends Criterion { } getCriterionStr(): string { - return this.id + '-se-' + this.option.value; + return this.id + ':eq:' + this.option.value; } } diff --git a/src/app/search/store/search.action.ts b/src/app/search/store/search.action.ts index a9fee9ae..c85684b1 100644 --- a/src/app/search/store/search.action.ts +++ b/src/app/search/store/search.action.ts @@ -4,9 +4,11 @@ import { Criterion } from './model'; export const CHANGE_STEP = 'Change Search Step'; export const SELECT_DATASET = 'Select Dataset'; +export const UPDATE_DEFAULT_CRITERIA_LIST = 'Update Default Criteria List Action'; export const UPDATE_CRITERIA_LIST = 'Update Criteria List'; export const ADD_CRITERION = 'Add Criterion'; export const DELETE_CRITERION = 'Delete Criterion'; +export const UPDATE_DEFAULT_OUTPUT_LIST = 'Update Default Output List'; export const UPDATE_OUTPUT_LIST = 'Update Output List'; export class ChangeStepAction implements Action { @@ -21,6 +23,12 @@ export class SelectDatasetAction implements Action { constructor(public payload: string) { } } +export class UpdateDefaultCriteriaListAction implements Action { + type = UPDATE_DEFAULT_CRITERIA_LIST; + + constructor(public payload: Criterion[]) { } +} + export class UpdateCriteriaListAction implements Action { type = UPDATE_CRITERIA_LIST; @@ -39,6 +47,12 @@ export class DeleteCriterionAction implements Action { constructor(public payload: number) { } } +export class UpdateDefaultOutputListAction implements Action { + type = UPDATE_DEFAULT_OUTPUT_LIST; + + constructor(public payload: number[]) { } +} + export class UpdateOutputListAction implements Action { type = UPDATE_OUTPUT_LIST; @@ -48,7 +62,9 @@ export class UpdateOutputListAction implements Action { export type Actions = ChangeStepAction | SelectDatasetAction + | UpdateDefaultCriteriaListAction | UpdateCriteriaListAction | AddCriterionAction | DeleteCriterionAction + | UpdateDefaultOutputListAction | UpdateOutputListAction; diff --git a/src/app/search/store/search.effects.ts b/src/app/search/store/search.effects.ts index 7c8f30a1..92f27497 100644 --- a/src/app/search/store/search.effects.ts +++ b/src/app/search/store/search.effects.ts @@ -1,16 +1,20 @@ import { Injectable } from '@angular/core'; import { Effect, Actions, ofType } from '@ngrx/effects'; -import { switchMap } from 'rxjs/operators'; +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 actions$: Actions, + private store$: Store<{search: fromSearch.State}> ) { } @Effect() @@ -30,9 +34,37 @@ export class SearchEffects { }); return [ - new searchActions.UpdateOutputListAction(outputList), - new searchActions.UpdateCriteriaListAction(criteriaList) + 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)); + } + }) + ); } -- GitLab