diff --git a/src/app/search/components/index.ts b/src/app/search/components/index.ts index f1788c08fd3bc068b9b6b08894fa18e807259816..b930452d3cade602192b49c9221519d4b192e688 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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..d931f1c7b0ae30f00cfb6e4a204b52e9048f2e04 --- /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 0000000000000000000000000000000000000000..061357fb21e1fd2bf242510e5eee6387056144fe --- /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 c95846831f0a68107b8d82a039edd17717ebdb9f..9d7600a9bc32774a6067b56d6487ba0f70be3cc8 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 8d19f0d0895d21275d2bba12df5626bf7fc909d6..bded6e07e66f1ff45d04fbdd6920198686399abe 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 1caf64a18f3ab27942c83b37e9120a04bc7dab86..2a656e312f1435f8db7df8b5007070ccdaf60c4a 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 a9fee9ae3eeea6b8144b769e30d1ec5142cc2906..c85684b1b729b9868433c83d43a4b7937e70e26c 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 7c8f30a19acccbba240a478afdb622f942cf43a0..92f27497bd3ec8125d990556f2e02823497f6966 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)); + } + }) + ); }