Project

General

Profile

1
import {Component, Input, ViewChild, Output, EventEmitter,ElementRef} from '@angular/core';
2
import {Observable}       from 'rxjs/Observable';
3
import {Location} from '@angular/common';
4
import {  Router} from '@angular/router';
5

    
6
import { Filter, Value} from './searchHelperClasses.class';
7
import {SearchResult}     from '../../utils/entities/searchResult';
8
import {SearchFields} from '../../utils/properties/searchFields';
9
import {SearchUtilsClass} from './searchUtils.class';
10
import {DOI, StringUtils} from '../../utils/string-utils.class';
11
import {ModalLoading} from '../../utils/modal/loading.component';
12
import { Meta} from '../../../angular2-meta';
13
import{SearchFilterComponent} from './searchFilter.component';
14
import {SearchFilterModalComponent} from './searchFilterModal.component';
15
import {OpenaireProperties} from '../../utils/properties/openaireProperties';
16
import { ErrorCodes} from '../../utils/properties/openaireProperties';
17
import {PiwikService} from '../../utils/piwik/piwik.service';
18

    
19

    
20
@Component({
21
    selector: 'search-page',
22
    template: `
23
<div id="tm-main" class=" uk-section  uk-margin-small-top tm-middle"   >
24
  <div uk-grid uk-grid>
25
   <div class="tm-main uk-width-1-1@s uk-width-1-1@m  uk-width-1-1@l uk-row-first ">
26
    <div class="">
27
      <!--div class="page-header">
28
          <h2>{{pageTitle}}</h2>
29
      </div-->
30
            <!--div  class="uk-width-1-1  uk-margin uk-padding uk-panel  uk-background-muted"-->
31
            <div   [class]="'uk-background-norepeat uk-background-cover uk-section uk-flex uk-flex-middle '+searchFormClass" >
32
              <div   class="uk-width-1-1">
33
                <div   class="uk-width-1-1">
34
                  <search-form [isDisabled]="disableForms" [(keyword)]="searchUtils.keyword" (keywordChange)="keywordChanged($event)" [placeholderText]="formPlaceholderText"></search-form>
35
                </div>
36
                <div   class="uk-width-1-1  uk-light">
37
                <!--link to advanced search -->
38
                <a *ngIf = "advancedSearchLink && advancedSearchLink.length > 0" routerLinkActive="router-link-active" [class]="(disableForms)?'uk-float-right  uk-light uk-disabled uk-link-muted':'uk-float-right  uk-light'" [routerLink]=advancedSearchLink >More search options <span class="uk-icon">
39
                    <svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="chevron-right" ratio="1"><polyline fill="none" stroke="#000" stroke-width="1.03" points="7 4 13 10 7 16"></polyline></svg>
40
                    </span>
41
                </a>
42
                <div *ngIf="isFiltered()" class = "uk-container uk-text-center ">
43
                  <span *ngIf = "searchUtils.keyword.length > 0">Keywords: <span [innerHtml]="searchUtils.keyword"></span><a (click) = "clearKeywords() " [class]="(disableForms)?'uk-icon-button uk-disabled':'uk-icon-button'"><span class=" clickable " aria-hidden="true"><span class="uk-icon">
44
                      <svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="close" ratio="1"><path fill="none" stroke="#000" stroke-width="1.06" d="M16,16 L4,4"></path><path fill="none" stroke="#000" stroke-width="1.06" d="M16,4 L4,16"></path></svg>
45
                        </span></span></a>
46
                  </span>
47
                  <span *ngFor="let filter of filters " >
48
                    <span *ngIf = "filter.countSelectedValues > 0"> {{filter.title}}:
49
                      <span *ngFor="let value of getSelectedValues(filter); let i = index;  let end = last; " ><span [innerHtml]="(value.name.length > 25)?value.name.substring(0,25)+'...':value.name" title="value.name"></span><a (click) = "removeFilter(value, filter) " [class]="(disableForms)?'uk-icon-button uk-disabled':'uk-icon-button'"><span class=" clickable" aria-hidden="true"><span class="uk-icon">
50
                          <svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="close" ratio="1"><path fill="none" stroke="#000" stroke-width="1.06" d="M16,16 L4,4"></path><path fill="none" stroke="#000" stroke-width="1.06" d="M16,4 L4,16"></path></svg>
51
                          </span></span></a>
52
                          <span *ngIf="!end">, </span>
53
                      </span>
54
                    </span>
55
                  </span>
56

    
57
                  <a (click)="clearFilters()" [class]="(disableForms)?'uk-disabled uk-link-muted':''">
58
                   Clear All
59
                  </a>
60
                </div>
61
                <div *ngIf= "showUnknownFilters"  class = " uk-text-center  uk-light">
62
                <a (click) = "clearFilters() " >Try new Query</a>
63
                </div>
64
                </div>
65

    
66
            </div>
67
      </div>
68
    <div  class="uk-container">
69
      <div  [class]="(showRefine)?'uk-width-3-4@m  uk-width-3-4@l  uk-width-1-1@s uk-float-right':'uk-width-1-1'">
70
          <div  *ngIf="showRefine" class="uk-offcanvas-content uk-hidden@m">
71

    
72
                <a href="#offcanvas-usage" uk-toggle><svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" ratio="1"><rect x="6" y="4" width="12" height="1"></rect><rect x="6" y="9" width="12" height="1"></rect><rect x="6" y="14" width="12" height="1"></rect><rect x="2" y="4" width="2" height="1"></rect><rect x="2" y="9" width="2" height="1"></rect><rect x="2" y="14" width="2" height="1"></rect></svg></a>
73

    
74
                <div id="offcanvas-usage" uk-offcanvas>
75
                    <div class="uk-offcanvas-bar">
76
                        <button class="uk-offcanvas-close" type="button" uk-close></button>
77
                        <div class="uk-text-large">Filter By:</div>
78
                        <search-filter  *ngFor="let filter of filters "  [addShowMore]=false [isDisabled]="disableForms" [filter]="filter"  [showResultCount]=showResultCount (change)="filterChanged($event)" (toggleModal)="toggleModal($event)"></search-filter>
79
                    </div>
80
                </div>
81

    
82
        </div>
83

    
84
        <search-paging [type]="type" [(searchUtils)] = "searchUtils"  [(results)] = "results"  [(baseUrl)] = "baseUrl" [(parameterNames)] = "parameterNames" [(parameterValues)] = "parameterValues" ></search-paging>
85
        <search-download [type]="csvPath" [csvParams]="csvParams" [totalResults]="searchUtils.totalResults" (downloadClick)="downloadClicked($event)"></search-download>
86

    
87
        <p *ngIf="tableViewLink" class="uk-text-right">
88
                    <a routerLinkActive="router-link-active" [class]="(disableForms)?'uk-disabled uk-link-muted':''" [routerLink]=tableViewLink >
89
                      <span class="uk-icon"><svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="table" ratio="1"><rect x="1" y="3" width="18" height="1"></rect><rect x="1" y="7" width="18" height="1"></rect><rect x="1" y="11" width="18" height="1"></rect><rect x="1" y="15" width="18" height="1"></rect></svg></span>
90
                      Show results in table view
91
                    </a>
92
        </p>
93
        </div>
94
        <div  class="uk-grid uk-width-1-1 uk-margin">
95
            <div  *ngIf="showRefine" class=" search-filters uk-width-1-4@l  uk-width-1-4@m  uk-width-1-1@s uk-visible@m">
96
               <search-filter  *ngFor="let filter of filters " [isDisabled]="disableForms" [filter]="filter"  [showResultCount]=showResultCount (change)="filterChanged($event)" (toggleModal)="toggleModal($event)"></search-filter>
97
            </div>
98

    
99
            <div [class]="(showRefine)?'uk-width-3-4@m  uk-width-3-4@l  uk-width-1-1@s uk-first-column':''" >
100

    
101
              <search-result    *ngIf="!tableView"
102
                                [results]="results"
103
                                [status]="searchUtils.status"
104
                                [type]="entityType" [urlParam]="urlParam"
105
                                [showLoading]="true">
106
              </search-result>
107

    
108
            </div>
109

    
110

    
111
          </div>
112
        </div>
113
      </div>
114
    </div>
115
  </div>
116

    
117

    
118

    
119
    `
120
})
121
export class SearchPageComponent {
122
  @Input() pageTitle = "";
123
  @Input() formPlaceholderText = "Type Keywords...";
124
  @Input() results = [];
125
  @Input() filters = [];
126
  @Input() type:string = "";
127
  @Input() entityType: string = "";
128
  @Input() searchUtils:SearchUtilsClass = new SearchUtilsClass();
129
  @Output() queryChange  = new EventEmitter();
130
  @Output() downloadClick = new EventEmitter();
131
  @Input() baseUrl:string = '';
132
  @Input() showResultCount:boolean = true;
133
  @Input() showRefine:boolean = true;
134
  @Input() refineFields = [];
135
  @Input() csvParams: string;
136
  @Input() csvPath: string;
137
  @Input() advancedSearchLink: string = "";
138
  @Input() tableViewLink: string;
139
  @Input() disableForms: boolean = false;
140
  @Input() tableView: boolean = false;
141
  @Input() searchFormClass: string = "searchForm";
142
  @ViewChild (ModalLoading) loading : ModalLoading ;
143
  public fieldIdsMap;//:  { [key:string]:{ name:string, operator:string, type:string, indexField:string, equalityOperator:string  }};
144
  private searchFieldsHelper:SearchFields = new SearchFields();
145
  private queryParameters: Map<string, string>  = new Map<string,string>();
146
  private baseURLWithParameters:string = '';
147
  private sub: any; piwiksub: any;
148
  public countFilters= 0;
149
  public urlParam: string;
150
  public parameterNames:string[] =[];
151
  public parameterValues:string[] =[];
152
  public showUnknownFilters:boolean = false; // when a filter exists in query but has no results, so no filters returned from the query
153
  //@ViewChild (SearchFilterModalComponent) searchFilterModal : SearchFilterModalComponent ;
154
  public currentFilter: Filter;
155

    
156
  constructor (private location: Location , private _meta: Meta,private element: ElementRef,private _piwikService:PiwikService, private router: Router) {
157
   }
158

    
159
  ngOnInit() {
160
    if (typeof document !== 'undefined') {
161
       this.element.nativeElement.scrollIntoView();
162
    }
163
        this.updateBaseUrlWithParameters(this.filters);
164
        this.defineUrlParam();
165
        this.updateTitle(this.pageTitle);
166
        this.updateDescription("Openaire, search, repositories, open access, type, content provider, funder, project, " + this.type + "," +this.pageTitle);
167
        if(typeof window !== 'undefined') {
168
          this.updateUrl(OpenaireProperties.getBaseLink()+location.pathname);
169
        }
170
        if(typeof document !== 'undefined' && OpenaireProperties.isPiwikTrackEnabled()){
171
          this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe();
172
        }
173
        // console.info(this.entityType + "   " + this.urlParam + this.type);
174
  }
175
  ngAfterViewChecked(){
176

    
177
  }
178
  ngOnDestroy() {
179
    if(this.piwiksub){
180
      this.piwiksub.unsubscribe();
181
    }
182
  }
183
  toggleModal($event) {
184
    this.currentFilter = $event.value;
185
    //this.searchFilterModal.open();
186
  }
187

    
188
  updateDescription(description:string){
189
    this._meta.updateMeta("description", description);
190
    this._meta.updateProperty("og:description", description);
191
  }
192
  updateTitle(title:string){
193
    var _prefix ="OpenAIRE | ";
194
    var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title);
195
    this._meta.setTitle(_title );
196
    this._meta.updateProperty("og:title",_title);
197
  }
198
  updateUrl(url:string){
199
    this._meta.updateProperty("og:url", url);
200
  }
201
  private defineUrlParam() {
202
      if(this.entityType == "publication") {
203
          this.urlParam = "articleId";
204
      } else if(this.entityType == "dataset") {
205
          this.urlParam = "datasetId";
206
      } else if(this.entityType == "project") {
207
          this.urlParam = "projectId";
208
      } else if(this.entityType == "organization") {
209
          this.urlParam = "organizationId";
210
      } else {
211
          this.urlParam = "datasourceId";
212
      }
213
  }
214

    
215
  public getQueryParametersFromUrl(params){
216
    // var parameters = "";
217
    var allFqs = "";
218

    
219
    for(var i=0; i< this.refineFields.length ; i++){
220
         var filterId =  this.refineFields[i];
221

    
222
          if(params[filterId] != undefined) {
223
            if(this.queryParameters == undefined){
224
              this.queryParameters = new Map<string,string>();
225
            }
226
             this.queryParameters[filterId]=StringUtils.URIDecode(params[filterId]);
227
             let values = (StringUtils.URIDecode(this.queryParameters[filterId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1);
228
             var countvalues = 0;
229
             var fq = "";
230
             for(let value of values) {
231
               countvalues++;
232
               var paramId = this.fieldIdsMap[filterId].param;
233
              // parameters+='&' + paramId+ '='+ value;//+"&" + this.fieldIdsMap[paramId].operator + "="+((countvalues == 1)?"and":"or");
234
              fq+=(fq.length > 0 ? " " + "or" + " ":"" ) + filterId +" exact " +value;// StringUtils.quote(value) ;
235
             }
236
             if(countvalues > 0){
237
               fq="&fq="+fq;
238
             }
239
             allFqs += fq;
240
          }
241

    
242

    
243
   }
244
   var keyword = params['keyword'];
245
   var doiQuery = "";
246
   var keywordQuery = "";
247
   if((keyword && keyword.length > 0)){
248
      if((this.type == 'publications' ||this.type == 'research data')){
249
        var DOIs:string[] = DOI.getDOIsFromString(keyword);
250
       var doisParams = "";
251

    
252
       for(var i =0 ;i < DOIs.length; i++){
253
         doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"';
254
       }
255
       if(doisParams.length > 0){
256
         doiQuery += "&"+doisParams;
257
       }else {
258
        keywordQuery += "&q="+StringUtils.URIEncode(keyword);
259
       }
260
     }else{
261
        keywordQuery += "&q="+StringUtils.URIEncode(keyword);
262

    
263
     }
264
   }
265
   return (doiQuery.length > 0 ? doiQuery:keywordQuery) + allFqs;
266
 }
267
 public getIndexQueryParametersFromUrl(params){
268
  //  var parameters = "";
269
   var allFqs = "";
270

    
271
   for(var i=0; i< this.refineFields.length ; i++){
272
        var filterId =  this.refineFields[i];
273
        var fq = "";
274
         if(params[filterId] != undefined) {
275
           if(this.queryParameters == undefined){
276
             this.queryParameters = new Map<string,string>();
277
           }
278
            this.queryParameters[filterId]=decodeURIComponent(params[filterId]);
279
            let values = (decodeURIComponent(this.queryParameters[filterId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1);
280
            var countvalues = 0
281
            for(let value of values) {
282
              countvalues++;
283
              // parameters+= ((countvalues == 1)?" and (":" or ")+ filterId+ '='+ value;
284
              fq+=(fq.length > 0 ? " " + "or" + " ":"" ) + filterId + " exact " + value;//StringUtils.quote(value);
285
            }
286
            // parameters+= " ) ";
287
            if(countvalues > 0){
288
              fq="&fq="+fq;
289
            }
290
            allFqs += fq;
291
        }
292

    
293
  }
294
  var keyword = params['keyword'];
295
  var doiQuery = "";
296
  var keywordQuery = "";
297
  if((keyword && keyword.length > 0)){
298
    if((this.type == 'publications' ||this.type == 'research data')){
299
      var DOIs:string[] = DOI.getDOIsFromString(keyword);
300
      var doisParams = "";
301

    
302
      for(var i =0 ;i < DOIs.length; i++){
303
        doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"';
304
      }
305
      if(doisParams.length > 0){
306
        doiQuery += "&"+doisParams;
307
      }
308
    }else{
309
       keywordQuery += "and ("+StringUtils.quote(StringUtils.URIEncode(keyword)) +")";
310

    
311
    }
312
  }
313
  return (doiQuery.length > 0 ? doiQuery:keywordQuery) + allFqs;
314

    
315
}
316
 /*
317
 * Mark as check the new filters that are selected, when you get them from search
318
 */
319
  public checkSelectedFilters(filters:Filter[]){
320
    this.filters = filters;
321
       for(var i=0; i< filters.length ; i++){
322
            var filter:Filter = filters[i];
323
            filter.countSelectedValues = 0;
324
              if(this.queryParameters[filter.filterId] != undefined) {
325
                let values = (decodeURIComponent(this.queryParameters[filter.filterId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1);
326
                     for(let filterValue of filter.values) {
327
                       if(values.indexOf(StringUtils.quote(filterValue.id)) > -1) {
328
                            filterValue.selected = true;
329
                            filter.countSelectedValues++;
330
                         }else{
331
                           filterValue.selected = false;
332

    
333
                         }
334
                    }
335
            }else{
336
              for(let filterValue of filter.values) {
337
                 filterValue.selected = false;
338
              }
339
            }
340
        }
341

    
342
        return filters;
343
  }
344
  /*
345
  * Update the url with proper parameters. This is used as base url in Paging Component
346
  */
347
  public updateBaseUrlWithParameters(filters:Filter[]){
348
    this.baseURLWithParameters = this.baseUrl + this.createUrlParameters(filters,false);
349

    
350
  }
351
  /*
352
  *
353
  */
354
  private createUrlParameters(filters:Filter[], includePage:boolean){
355
    var allLimits="";//location.search.slice(1);
356
    this.parameterNames.splice(0,this.parameterNames.length);
357
    this.parameterValues.splice(0,this.parameterValues.length);
358

    
359
    for (let filter of filters){
360
      var filterLimits="";
361
      if(filter.countSelectedValues > 0){
362
        for (let value of filter.values){
363
          if(value.selected == true){
364
            filterLimits+=((filterLimits.length == 0)?'':',') +'"'+ StringUtils.URIEncode(value.id)+'"';
365
           }
366
        }
367
        this.queryParameters[filter.filterId]=filterLimits;
368
        if(filterLimits.length > 0){
369
          this.parameterNames.push(filter.filterId);
370
          this.parameterValues.push(filterLimits);
371
        }
372
        allLimits+=(allLimits.length==0?"?":"&")+((filterLimits.length == 0 )?'':filter.filterId + '='+ filterLimits) ;
373
      }
374
    }
375
    if(this.searchUtils.keyword.length > 0 ){
376
       allLimits+=(allLimits.length==0?"?":"&")+'keyword=' + this.searchUtils.keyword;
377
      this.parameterNames.push("keyword");
378
      this.parameterValues.push(this.searchUtils.keyword);
379
     }
380
    if(this.searchUtils.page != 1 && includePage){
381
       allLimits+=((allLimits.length == 0)?'?':'&') + 'page=' + this.searchUtils.page;
382
    }
383

    
384
    return allLimits;
385
  }
386
  /*
387
  *
388
  */
389
  private createSearchQueryParameters(filters:Filter[]){
390
    var allFqs = "";
391
    for (let filter of filters){
392
      if(filter.countSelectedValues > 0){
393
        var fq = "";
394
        var count_selected=0;
395
        for (let value of filter.values){
396
          if(value.selected == true){
397
              count_selected++;
398
              fq+=(fq.length > 0 ? " " + filter.filterOperator + " ":"" ) + filter.filterId +  " exact " + StringUtils.quote(StringUtils.URIEncode(value.id));
399
           }
400
        }
401
        fq="&fq="+fq;
402
        allFqs += fq;
403
      }
404
    }
405
    var doiQuery = "";
406
    var keywordQuery = "";
407
    if((this.searchUtils.keyword && this.searchUtils.keyword.length > 0)){
408
      if((this.type == 'publications' ||this.type == 'research data')){
409
        var DOIs:string[] = DOI.getDOIsFromString(this.searchUtils.keyword);
410
        var doisParams = "";
411

    
412
        for(var i =0 ;i < DOIs.length; i++){
413
          doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"';
414
        }
415
        if(doisParams.length > 0){
416
          doiQuery += "&"+doisParams;
417
        }else{
418
          keywordQuery += "&q="+StringUtils.URIEncode(this.searchUtils.keyword);
419
        }
420
      }else{
421
           keywordQuery += "&q="+StringUtils.URIEncode(this.searchUtils.keyword);
422
      }
423
    }
424

    
425
    return (doiQuery.length > 0 ? doiQuery:keywordQuery) + allFqs;
426

    
427
  }
428
  private createIndexQueryParameters(filters:Filter[]){
429
    var allFqs = "";
430
    for (let filter of filters){
431
      if(filter.countSelectedValues > 0){
432
        var count_selected=0;
433
        var fq = "";
434
        for (let value of filter.values){
435
          if(value.selected == true){
436
              count_selected++;
437
               fq+=(fq.length > 0 ? " " + filter.filterOperator + " ":"" ) + filter.filterId + " exact " + StringUtils.quote(StringUtils.URIEncode(value.id));
438
           }
439
        }
440
        if(count_selected > 0){
441
          fq="&fq="+fq;
442
          allFqs += fq;
443
        }
444
      }
445
    }
446
    var doiQuery = "";
447
    var keywordQuery = "";
448
    if((this.searchUtils.keyword && this.searchUtils.keyword.length > 0)){
449
      if((this.type == 'publications' ||this.type == 'research data')){
450
        var DOIs:string[] = DOI.getDOIsFromString(this.searchUtils.keyword);
451
        var doisParams = "";
452
        for(var i =0 ;i < DOIs.length; i++){
453
          doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"';
454
        }
455
        if(doisParams.length > 0){
456
          doiQuery += "&"+doisParams;
457
        }
458
      }else{
459
         keywordQuery += " and ("+StringUtils.quote(StringUtils.URIEncode(this.searchUtils.keyword)) +")"
460

    
461
      }
462
    }
463
    return (doiQuery.length > 0 ? doiQuery:keywordQuery) + allFqs;
464

    
465
  }
466
  public isFiltered(){
467
    var filtered=false;
468
    this.showUnknownFilters = false;
469
    for (let filter of this.filters){
470
       if(filter.countSelectedValues > 0){
471
           filtered = true;
472
           break;
473
       }
474
     }
475
    if(this.searchUtils.keyword.length > 0 ){
476
      filtered = true;
477
    }
478
    var errorCodes:ErrorCodes = new ErrorCodes();
479
    if(this.queryParameters.keys() && this.searchUtils.totalResults == 0 && this.searchUtils.status !=errorCodes.LOADING ){
480
      this.showUnknownFilters = true;
481
    }
482
    return filtered;
483
  }
484
  private clearKeywords(){
485
    if(this.searchUtils.keyword.length > 0 ){
486
      this.searchUtils.keyword ='';
487
    }
488
    this.goTo(1);
489
  }
490
  private clearFilters(){
491
    for (var i =0 ; i <  this.filters.length; i++){
492
         for (var j=0; j <  this.filters[i].countSelectedValues; j++){
493
          if(this.filters[i].values[j].selected){
494
            this.filters[i].values[j].selected = false;
495
           }
496
        this.filters[i].countSelectedValues = 0;
497
      }
498
    }
499
    this.clearKeywords();
500

    
501
  }
502
  private removeFilter(value:Value,filter:Filter){
503
    filter.countSelectedValues--;
504
    if(value.selected == true){
505
      value.selected = false;
506
     }
507
    this.goTo(1);
508

    
509
  }
510
  goTo(page:number = 1){
511
    this.searchUtils.page = page;
512
    console.info("searchUtils.page goto = "+this.searchUtils.page);
513
    this.queryParameters = new Map<string,string>();
514
    var urlParameters = this.createUrlParameters(this.filters,true);
515
    console.info("urlParams : "+urlParameters);
516
    this.updateBaseUrlWithParameters(this.filters);
517
    var queryParameters = this.createSearchQueryParameters(this.filters);
518
    console.info("queryParams : "+queryParameters);
519
    var indexQuery = this.createIndexQueryParameters(this.filters);
520

    
521
    this.location.go(location.pathname,urlParameters);
522
/* Code For Piwik*/
523
    if (typeof localStorage !== 'undefined') {
524
      console.log("In PreviousRouteRecorder : "+this.router.url );
525
      localStorage.setItem('previousRoute', this.router.url);
526
    }
527
    if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){
528
      this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe();
529
    }
530
    /* End Piwik Code */
531
    this.queryChange.emit({
532
        value: queryParameters,
533
        index:indexQuery
534

    
535
    });
536
    if (typeof document !== 'undefined') {
537
       this.element.nativeElement.scrollIntoView();
538
    }
539
  }
540
  filterChanged($event){
541
    console.info("filter Changed");
542
       this.goTo(1);
543
  }
544
  keywordChanged($event) {
545
       this.searchUtils.keyword = $event.value;
546
       this.goTo(1);
547
  }
548

    
549
	downloadClicked($event) {
550
		if($event.value == true) {
551
		    var queryParameters = this.createSearchQueryParameters(this.filters);
552

    
553
		    this.downloadClick.emit({
554
		        value: queryParameters
555
		    });
556
		}
557
	}
558

    
559
  /*
560
  * Get A sub-array of this.refineFields array, which contains the ids of the selected filters
561
  */
562
  public getSelectedFilters():string[] {
563
    var selected:string[] = [];
564
    for(var i=0; i <  this.filters.length; i++){
565
      var filter:Filter = this.filters[i];
566
      if(filter.countSelectedValues > 0){
567
          selected.push(filter.filterId);
568
      }
569
    }
570
    return selected;
571
  }
572
  /*
573
  * Get A sub-array of this.refineFields array, which contains the ids of the selected parameters
574
  */
575
  private getSelectedParameters():string[] {
576
    var selected:string[] = [];
577
    var params:string[] = Object.keys(this.queryParameters);
578
    for(var i=0; i <  params.length; i++){
579
       if(this.refineFields.indexOf(params[i]) > -1){
580
          selected.push(params[i]);
581
      }
582
    }
583
    return selected;
584
  }
585
  /*
586
  * Get A sub-array of this.refineFields array, which hides hidden fields (e.g Funding level 0,1,2,..), and contains those that depend on another fields (e.g  Funding level 0 if Funder is selected )
587
  */
588
  public getFields():string[] {
589
    var selected_filters:string[] = this.getSelectedFilters();
590
    if(selected_filters.length == 0){
591
      selected_filters = this.getSelectedParameters();
592
    }
593
    var fields:string[] = [];
594
    for(var i =0 ; i < this.refineFields.length;i++){
595
      var dependentTo = this.searchFieldsHelper.DEPENDENT_FIELDS[this.refineFields[i]];
596

    
597
      //if filter is not marked as hidden OR it is hidden but it is dependent to a field that it IS selected
598
      if(this.searchFieldsHelper.HIDDEN_FIELDS.indexOf(this.refineFields[i]) == -1 || (selected_filters.indexOf(dependentTo) != -1) || (selected_filters.indexOf(this.refineFields[i]) != -1) ){
599
          fields.push(this.refineFields[i]);
600
       }
601
    }
602
    return fields;
603
  }
604
  /*
605
  * Get a query  string of all fields, that want to get from search (e.g. &fields=funderid&fields=projectstartyear&...))
606
  */
607
  public getRefineFieldsQuery():string{
608

    
609
    var fields:string[] = this.getFields();
610
    var fieldsStr = ""
611
    for(var i =0 ; i < fields.length  ;i++){
612
        fieldsStr+="&fields="+fields[i];
613
    }
614
    return "&refine=true"+fieldsStr;
615
  }
616

    
617
  // for loading
618
  public openLoading(){
619
    if(this.loading){
620
      this.loading.open();
621
    }
622
  }
623
  public closeLoading(){
624
    if(this.loading){
625
      this.loading.close();
626
    }
627
  }
628
  getSelectedValues(filter):any{
629
    var selected = [];
630
    if(filter.countSelectedValues >0){
631
      for (var i=0; i < filter.values.length; i++){
632
        if(filter.values[i].selected){
633
          selected.push(filter.values[i]);
634
        }
635
      }
636
    }
637
    return selected;
638

    
639
  }
640
}
(18-18/28)