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