Project

General

Profile

1
import {Component, Input, ViewChild, Output, EventEmitter} from '@angular/core';
2
import {Observable}       from 'rxjs/Observable';
3
import {Location} from '@angular/common';
4
import {  Router} from '@angular/router';
5
import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class';
6
import {SearchResult}     from '../../utils/entities/searchResult';
7
import {SearchFields} from '../../utils/properties/searchFields';
8
import {SearchUtilsClass} from './searchUtils.class';
9
import {ModalLoading} from '../../utils/modal/loading.component';
10
import {StringUtils, Dates} from '../../utils/string-utils.class';
11
import { Meta} from '../../../angular2-meta';
12
import {OpenaireProperties} from '../../utils/properties/openaireProperties';
13
import {PiwikService} from '../../utils/piwik/piwik.service';
14

    
15
@Component({
16
    selector: 'advanced-search-page',
17
    templateUrl: 'advancedSearchPage.component.html'
18
})
19
export class AdvancedSearchPageComponent {
20
  @Input() pageTitle = "";
21
  @Input() results = [];
22
  @Input() type;
23
  @Input() entityType;
24
  @Input() searchUtils:SearchUtilsClass = new SearchUtilsClass();
25
  @Input() fieldIds:  string[];
26
  @Input() fieldIdsMap;//:{ [key:string]:{ name:string, operator:string, type:string, indexField:string, equalityOperator:string  }} ;
27
  @Input() selectedFields:AdvancedField[];
28
  @Input() simpleSearchUrl: string;
29
  @ViewChild (ModalLoading) loading : ModalLoading ;
30
  @Input() csvParams: string;
31
  @Input() csvPath: string;
32
  @Input() simpleSearchLink: string = "";
33
  @Input() disableForms:boolean = false;
34
  @Input() loadPaging: boolean = true;
35
  @Input() oldTotalResults: number = 0;
36

    
37
  piwiksub: any;
38
  public parameterNames:string[] =[];
39
  public parameterValues:string[] =[];
40

    
41
  public baseURLWithParameters:string = '';
42

    
43
  @Output() queryChange  = new EventEmitter();
44
  constructor (private location: Location, private _meta: Meta, private _piwikService:PiwikService, private router: Router) {
45
   }
46

    
47
  ngOnInit() {
48
    this.updateTitle("Advanced search "+this.pageTitle);
49
    this.updateDescription("Openaire, search, repositories, open access, type, content provider, funder, project, "+ this.pageTitle);
50
    if(typeof window !== 'undefined') {
51
      this.updateUrl(OpenaireProperties.getBaseLink()+location.pathname);
52
    }
53

    
54
      this.searchUtils.baseUrl = "/" + this.searchUtils.baseUrl;
55
     this.updateBaseUrlWithParameters();
56
     if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){
57
       this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe();
58
     }
59
  }
60

    
61
  ngOnDestroy() {
62
    if(this.piwiksub){
63
  this.piwiksub.unsubscribe();
64
}
65
  }
66
  updateDescription(description:string){
67
    this._meta.updateMeta("description", description);
68
    this._meta.updateProperty("og:description", description);
69
  }
70
  updateTitle(title:string){
71
    var _prefix ="OpenAIRE | ";
72
    var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title);
73
    this._meta.setTitle(_title );
74
    this._meta.updateProperty("og:title",_title);
75
  }
76
  updateUrl(url:string){
77
    this._meta.updateProperty("og:url", url);
78
  }
79

    
80
  public getSelectedFiltersFromUrl(params){
81
    for(var i=0; i< this.fieldIds.length ; i++){
82

    
83
         var fieldId =  this.fieldIds[i];
84
         var fieldparam =  (this.fieldIdsMap[fieldId])?this.fieldIdsMap[fieldId].param:"";
85
         if(!this.fieldIdsMap[fieldId]){
86

    
87
           console.error("Field: "+fieldId +" not found in fieldIds map");
88
         }
89

    
90
         var operatorId =  this.getOperatorParameter(fieldparam);
91
          if(params[fieldparam] != undefined && params[operatorId] != undefined) {
92
              var values:string [] = StringUtils.URIDecode(params[fieldparam]).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1);
93
             var operators:string [] = (StringUtils.URIDecode(params[operatorId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1);
94
              if(values.length == operators.length){
95
               for(var j=0; j< values.length ; j++){
96
                 if(this.fieldIdsMap[fieldId].type == "date"){
97
                   var value:string =StringUtils.unquote(values[j]);
98
                   var validDates:boolean = true;
99
                   var dateField:AdvancedField = new AdvancedField(fieldId,fieldparam,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,value,operators[j]) ;
100
                   if(value.indexOf("range") != -1){
101
                     dateField.dateValue.type="range";
102
                     if(value.length < 26 ){
103
                       validDates =false;
104
                     }else{
105
                       if(!Dates.isValidDate(value.substring(5,15)) || !Dates.isValidDate(value.substring(16,26))){
106
                         validDates =false;
107
                       }else {
108
                        dateField.dateValue.from = Dates.getDateFromString(value.substring(5,15));
109
                        dateField.dateValue.to = Dates.getDateFromString(value.substring(16,26));
110
                      }
111
                    }
112
                    //  "rangeYYYY-MM-DD:YYYY-MM-DD"
113
                   }else{
114
                     dateField.dateValue.setDatesByType(value);
115
                   }
116
                   if(validDates){
117
                     this.selectedFields.push(dateField);
118
                   }
119

    
120
                 }else{
121
                   this.selectedFields.push(new AdvancedField(fieldId,fieldparam,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,StringUtils.unquote(values[j]),operators[j]) );
122
                 }
123
               }
124
             }
125
         }
126
   }
127
   if(this.selectedFields.length == 0){
128
     this.selectedFields.push(new AdvancedField(this.fieldIds[0],fieldparam,this.fieldIdsMap[this.fieldIds[0]].name,this.fieldIdsMap[this.fieldIds[0]].type,"","and"));
129
   }
130
  }
131
  private createUrlParameters(includePage:boolean){
132
    var params="";
133
    this.parameterNames.splice(0,this.parameterNames.length);
134
    this.parameterValues.splice(0,this.parameterValues.length);
135
    var fields: { [key:string]:{ values:string[], operators:string[] }}={};
136
     for(var i = 0; i< this.selectedFields.length; i++){
137
       if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && (this.selectedFields[i].value.length > 0  || this.selectedFields[i].type == "date" )){
138
        if(!fields[this.selectedFields[i].id]){
139
          fields[this.selectedFields[i].id] = {values:[], operators:[]};
140
          fields[this.selectedFields[i].id].values =[];
141
          fields[this.selectedFields[i].id].operators =[];
142
        }
143
        if(this.selectedFields[i].type == "date"){
144
           if(this.selectedFields[i].dateValue.type == "range"){
145
              fields[this.selectedFields[i].id].values.push(StringUtils.quote(StringUtils.URIEncode("range"+Dates.getDateToString(this.selectedFields[i].dateValue.from)+":"+Dates.getDateToString(this.selectedFields[i].dateValue.to))));
146
          }else{
147
              fields[this.selectedFields[i].id].values.push(StringUtils.quote(StringUtils.URIEncode(this.selectedFields[i].dateValue.type)));
148
          }
149
        }else{
150
          fields[this.selectedFields[i].id].values.push(StringUtils.quote(StringUtils.URIEncode(this.selectedFields[i].value)));
151
        }
152
        fields[this.selectedFields[i].id].operators.push(this.selectedFields[i].operatorId);
153

    
154
      }
155
    }
156
    for(var i = 0; i< this.fieldIds.length; i++){
157
      if(fields[this.fieldIds[i]]){
158

    
159
        params+="&"+this.fieldIdsMap[this.fieldIds[i]].param+"="+fields[this.fieldIds[i]].values.join()+
160
        "&"+this.getOperatorParameter(this.fieldIdsMap[this.fieldIds[i]].param)+"="+fields[this.fieldIds[i]].operators.join()
161
        this.parameterNames.push(this.fieldIdsMap[this.fieldIds[i]].param);
162
        this.parameterValues.push(fields[this.fieldIds[i]].values.join());
163
        this.parameterNames.push(this.getOperatorParameter(this.fieldIdsMap[this.fieldIds[i]].param));
164
        this.parameterValues.push(fields[this.fieldIds[i]].operators.join());
165
      }
166
    }
167
    if(includePage && this.searchUtils.page != 1){
168
      params += "&page="+this.searchUtils.page;
169
    }
170
     return '?'+params;
171
  }
172
  public createQueryParameters(){
173
    var params="";
174
    var countParams = 0;
175
    for(var i = 0; i< this.selectedFields.length; i++){
176
      if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && (this.selectedFields[i].value != "" ||this.selectedFields[i].type == "date")){
177
        console.log("createQueryParameters::"+this.selectedFields[i].type);
178
        if(this.selectedFields[i].type == "date"){
179
          if(this.selectedFields[i].dateValue.type != "any"){
180
            params += (countParams == 0 ? "" : this.selectedFields[i].operatorId) + " " + this.selectedFields[i].id + this.fieldIdsMap[this.selectedFields[i].id].equalityOperator+ '"' + StringUtils.URIEncode(Dates.getDateToString(this.selectedFields[i].dateValue.from)) + " "
181
            + StringUtils.URIEncode(Dates.getDateToString(this.selectedFields[i].dateValue.to)) + '"' + " ";
182
          }
183
        }else{
184
          if(this.selectedFields[i].id == "q"){
185
            var op = "";
186
            // if()
187
            params += (countParams == 0 ? "" : this.selectedFields[i].operatorId) + " " + '"' + StringUtils.URIEncode(this.selectedFields[i].value) + '"' + " ";
188
          }else if(countParams == 0 && this.selectedFields[i].operatorId == "not"){
189
              params += " "+ this.selectedFields[i].id +  " <> "+'"' + StringUtils.URIEncode(this.selectedFields[i].value) +'"' + " ";
190
          }else{
191
            params += (countParams == 0 ? "" : this.selectedFields[i].operatorId + " " ) + this.selectedFields[i].id + this.fieldIdsMap[this.selectedFields[i].id].equalityOperator+'"' + encodeURIComponent(this.selectedFields[i].value) +'"' + " ";
192

    
193
          }
194
      }
195
        countParams++;
196
      }
197
    }
198

    
199
     return params;
200

    
201
  }
202
  clearFilters(){
203
  }
204

    
205
  goTo(page:number = 1){
206
     this.searchUtils.page = page;
207
    var urlParameters = this.createUrlParameters(true);
208
    var queryParameters = this.createQueryParameters();
209
    this.location.go(location.pathname,urlParameters);
210
    this.queryChange.emit({
211
        value: queryParameters
212
    });
213
    /* Code For Piwik*/
214
        if (typeof localStorage !== 'undefined') {
215
          console.log("In PreviousRouteRecorder : "+this.router.url );
216
          localStorage.setItem('previousRoute', this.router.url);
217
        }
218
        if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){
219
          this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe();
220
        }
221
        /* End Piwik Code */
222
  }
223

    
224
  queryChanged($event) {
225

    
226
     this.goTo(1);
227
  }
228
  pageChanged($event) {
229
    this.searchUtils.page = +$event.value;
230
    this.goTo(this.searchUtils.page);
231
  }
232
  /*
233
  * Update the url with proper parameters. This is used as base url in Paging Component
234
  */
235
  public updateBaseUrlWithParameters(){
236
    this.baseURLWithParameters = this.searchUtils.baseUrl + this.createUrlParameters(false);
237
   }
238
   getOperatorParameter(parameter:string):string{
239
     if(parameter.length > 2){
240
       return parameter.substring(0,2);
241
     }else if(parameter == "q"){
242
       return "op";
243
     }else{
244
       return parameter+"Op";
245
     }
246
   }
247
   // for loading
248
   public openLoading(){
249
     this.loading.open();
250
   }
251
   public closeLoading(){
252
       this.loading.close();
253
   }
254
}
(5-5/36)