Project

General

Profile

1
import {Component, Input, ViewChild}  from '@angular/core';
2
import {Output, EventEmitter}         from '@angular/core';
3
import {Location}                     from '@angular/common';
4
import {ActivatedRoute,  Router}      from '@angular/router';
5
import {Title, Meta}                  from '@angular/platform-browser';
6

    
7
import {Observable}                   from 'rxjs/Observable';
8

    
9
import {Filter, Value, AdvancedField} from '../searchUtils/searchHelperClasses.class';
10
import {SearchResult}                 from '../../utils/entities/searchResult';
11
import {SearchFields, FieldDetails}   from '../../utils/properties/searchFields';
12
import {SearchUtilsClass}             from './searchUtils.class';
13
import {ModalLoading}                 from '../../utils/modal/loading.component';
14
import {StringUtils, Dates}           from '../../utils/string-utils.class';
15

    
16
import {PiwikService}                 from '../../utils/piwik/piwik.service';
17
import {EnvProperties}                from '../../utils/properties/env-properties';
18

    
19
@Component({
20
    selector: 'advanced-search-page',
21
    templateUrl: 'advancedSearchPage.component.html'
22
})
23
export class AdvancedSearchPageComponent {
24
  @Input() piwikSiteId = null;
25
  @Input() pageTitle = "";
26
  @Input() results = [];
27
  @Input() type;
28
  @Input() entityType;
29
  @Input() searchUtils:SearchUtilsClass = new SearchUtilsClass();
30
  @Input() fieldIds:  string[];
31
  @Input() fieldIdsMap;//:{ [key:string]:{ name:string, operator:string, type:string, indexField:string, equalityOperator:string  }} ;
32
  @Input() selectedFields:AdvancedField[];
33
  @Input() simpleSearchUrl: string;
34
  @ViewChild (ModalLoading) loading : ModalLoading ;
35
  @Input() csvParams: string;
36
  @Input() csvPath: string;
37
  @Input() simpleSearchLink: string = "";
38
  @Input() disableForms:boolean = false;
39
  @Input() loadPaging: boolean = true;
40
  @Input() oldTotalResults: number = 0;
41
  @Input() openaireLink: string;
42
  @Input() connectCommunityId: string;
43
  piwiksub: any;
44
  public parameterNames:string[] =[];
45
  public parameterValues:string[] =[];
46

    
47
  public baseURLWithParameters:string = '';
48

    
49
  public csvLimit: number = 0;
50
  public pagingLimit: number = 0;
51
  public resultsPerPage: number = 0;
52
  isPiwikEnabled = false;
53
  properties:EnvProperties;
54

    
55
  @Output() queryChange  = new EventEmitter();
56
  constructor (private route: ActivatedRoute,
57
               private location: Location,
58
               private _meta: Meta,
59
               private _title: Title,
60
               private _piwikService:PiwikService,
61
               private router: Router) {
62
   }
63

    
64
  ngOnInit() {
65
    this.route.data
66
      .subscribe((data: { envSpecific: EnvProperties }) => {
67
        this.properties = data.envSpecific;
68
        this.pagingLimit = data.envSpecific.pagingLimit;
69
        this.resultsPerPage =data.envSpecific.resultsPerPage;
70
        this.csvLimit = data.envSpecific.csvLimit;
71
        this.isPiwikEnabled = data.envSpecific.enablePiwikTrack;
72
        if(typeof window !== 'undefined') {
73
          this.updateUrl(data.envSpecific.baseLink+location.pathname);
74
        }
75
        if(typeof document !== 'undefined' && this.isPiwikEnabled){
76
          this.piwiksub = this._piwikService.trackView(this.properties, this.pageTitle, this.piwikSiteId).subscribe();
77
        }
78
      });
79

    
80
    var title = "Advanced search "+this.pageTitle;
81
    var description = "Openaire, search, repositories, open access, type, content provider, funder, project, "+ this.pageTitle;
82

    
83
    this.updateTitle(title);
84
    this.updateDescription(description);
85

    
86
    this.searchUtils.baseUrl = "/" + this.searchUtils.baseUrl;
87
    this.updateBaseUrlWithParameters();
88

    
89
  }
90

    
91
  ngOnDestroy() {
92
    if(this.piwiksub){
93
      this.piwiksub.unsubscribe();
94
    }
95
  }
96
  updateDescription(description:string) {
97
    this._meta.updateTag({content:description},"name='description'");
98
    this._meta.updateTag({content:description},"property='og:description'");
99
  }
100
  updateTitle(title:string) {
101
    var _prefix ="OpenAIRE | ";
102
    var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title);
103
    this._title.setTitle(_title);
104
    this._meta.updateTag({content:_title},"property='og:title'");
105
  }
106
  updateUrl(url:string) {
107
    this._meta.updateTag({content:url},"property='og:url'");
108
  }
109

    
110
  public getSelectedFiltersFromUrl(params) {
111
    for(var i=0; i< this.fieldIds.length ; i++){
112

    
113
         var fieldId =  this.fieldIds[i];
114
         var fieldparam =  (this.fieldIdsMap[fieldId])?this.fieldIdsMap[fieldId].param:"";
115
         if(!this.fieldIdsMap[fieldId]){
116

    
117
           console.error("Field: "+fieldId +" not found in fieldIds map");
118
         }
119

    
120
         var operatorId =  this.getOperatorParameter(fieldparam);
121
          if(params[fieldparam] != undefined && params[operatorId] != undefined) {
122
              var values:string [] = StringUtils.URIDecode(params[fieldparam]).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1);
123
             var operators:string [] = (StringUtils.URIDecode(params[operatorId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1);
124
              if(values.length == operators.length){
125
               for(var j=0; j< values.length ; j++){
126
                 if(this.fieldIdsMap[fieldId].type == "date"){
127
                   var value:string =StringUtils.unquote(values[j]);
128
                   var validDates:boolean = true;
129
                   var dateField:AdvancedField = new AdvancedField(fieldId,fieldparam,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,value,operators[j]) ;
130
                   if(value.indexOf("range") != -1){
131
                     dateField.dateValue.type="range";
132
                     if(value.length < 26 ){
133
                       validDates =false;
134
                     }else{
135
                       if(!Dates.isValidDate(value.substring(5,15)) || !Dates.isValidDate(value.substring(16,26))){
136
                         validDates =false;
137
                       }else {
138
                        dateField.dateValue.from = Dates.getDateFromString(value.substring(5,15));
139
                        dateField.dateValue.to = Dates.getDateFromString(value.substring(16,26));
140
                      }
141
                    }
142
                    //  "rangeYYYY-MM-DD:YYYY-MM-DD"
143
                   }else{
144
                     dateField.dateValue.setDatesByType(value);
145
                   }
146
                   if(validDates){
147
                     this.selectedFields.push(dateField);
148
                   }
149

    
150
                 }
151
                 else{
152
                     this.selectedFields.push(new AdvancedField(fieldId,fieldparam,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,StringUtils.unquote(values[j]),operators[j]) );
153
                 }
154
               }
155
             }
156
         }
157
   }
158
   if(this.selectedFields.length == 0){
159
     this.selectedFields.push(new AdvancedField(this.fieldIds[0],fieldparam,this.fieldIdsMap[this.fieldIds[0]].name,this.fieldIdsMap[this.fieldIds[0]].type,"","and"));
160
   }
161
  }
162
  private createUrlParameters(includePage:boolean){
163
    var params="";
164
    this.parameterNames.splice(0,this.parameterNames.length);
165
    this.parameterValues.splice(0,this.parameterValues.length);
166
    var fields: { [key:string]:{ values:string[], operators:string[] }}={};
167
     for(var i = 0; i< this.selectedFields.length; i++){
168
       if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && (this.selectedFields[i].value.length > 0  || this.selectedFields[i].type == "date" )){
169
        if(!fields[this.selectedFields[i].id]){
170
          fields[this.selectedFields[i].id] = {values:[], operators:[]};
171
          fields[this.selectedFields[i].id].values =[];
172
          fields[this.selectedFields[i].id].operators =[];
173
        }
174
        if(this.selectedFields[i].type == "date"){
175
           if(this.selectedFields[i].dateValue.type == "range"){
176
              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))));
177
          }else{
178
              fields[this.selectedFields[i].id].values.push(StringUtils.quote(StringUtils.URIEncode(this.selectedFields[i].dateValue.type)));
179
          }
180
        }else{
181
          fields[this.selectedFields[i].id].values.push(StringUtils.quote(StringUtils.URIEncode(this.selectedFields[i].value)));
182
        }
183
        fields[this.selectedFields[i].id].operators.push(this.selectedFields[i].operatorId);
184

    
185
      }
186
    }
187
    for(var i = 0; i< this.fieldIds.length; i++){
188
      if(fields[this.fieldIds[i]]){
189

    
190
        params+="&"+this.fieldIdsMap[this.fieldIds[i]].param+"="+fields[this.fieldIds[i]].values.join()+
191
        "&"+ this.fieldIdsMap[this.fieldIds[i]].operator+"="+fields[this.fieldIds[i]].operators.join()
192
        this.parameterNames.push(this.fieldIdsMap[this.fieldIds[i]].param);
193
        this.parameterValues.push(fields[this.fieldIds[i]].values.join());
194
        this.parameterNames.push( this.fieldIdsMap[this.fieldIds[i]].operator);
195
        this.parameterValues.push(fields[this.fieldIds[i]].operators.join());
196
      }
197
    }
198
    if(includePage && this.searchUtils.page != 1){
199
      params += "&page="+this.searchUtils.page;
200
    }
201
     return '?'+params;
202
  }
203
  public createQueryParameters(){
204
    var params="";
205
    var countParams = 0;
206
    for(var i = 0; i< this.selectedFields.length; i++){
207
      if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && (this.selectedFields[i].value != "" ||this.selectedFields[i].type == "date")){
208
        console.log("createQueryParameters::"+this.selectedFields[i].type);
209
        if(this.selectedFields[i].type == "date"){
210
          if(this.selectedFields[i].dateValue.type != "any"){
211
            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)) + " "
212
            + StringUtils.URIEncode(Dates.getDateToString(this.selectedFields[i].dateValue.to)) + '"' + " ";
213
          }
214
        }else{
215
          if(this.selectedFields[i].id == "q"){
216
            var op = "";
217
            // if()
218
            params += (countParams == 0 ? "" : this.selectedFields[i].operatorId) + " " + '"' + StringUtils.URIEncode(this.selectedFields[i].value) + '"' + " ";
219
          }else if(countParams == 0 && this.selectedFields[i].operatorId == "not"){
220
              params += " "+ this.selectedFields[i].id +  " <> "+'"' + StringUtils.URIEncode(this.selectedFields[i].value) +'"' + " ";
221
          }else{
222
            params += (countParams == 0 ? "" : this.selectedFields[i].operatorId + " " ) + this.selectedFields[i].id + this.fieldIdsMap[this.selectedFields[i].id].equalityOperator+'"' + encodeURIComponent(this.selectedFields[i].value) +'"' + " ";
223

    
224
          }
225
      }
226
        countParams++;
227
      }
228
    }
229

    
230
    //community
231
    if(this.connectCommunityId ){
232
      params += (countParams == 0 ? "" : " and " ) + "communityId exact "+'"' + this.connectCommunityId +'"' + " ";
233
    }
234
     return params;
235

    
236
  }
237
  clearFilters(){
238
  }
239

    
240
  goTo(page:number = 1){
241
     this.searchUtils.page = page;
242
    var urlParameters = this.createUrlParameters(true);
243
    var queryParameters = this.createQueryParameters();
244
    this.location.go(location.pathname,urlParameters);
245
    this.queryChange.emit({
246
        value: queryParameters
247
    });
248
    /* Code For Piwik*/
249
        if (typeof localStorage !== 'undefined') {
250
          console.log("In PreviousRouteRecorder : "+this.router.url );
251
          localStorage.setItem('previousRoute', this.router.url);
252
        }
253
        if(this.isPiwikEnabled && (typeof document !== 'undefined')){
254
          this.piwiksub = this._piwikService.trackView(this.properties, this.pageTitle, this.piwikSiteId).subscribe();
255
        }
256
        /* End Piwik Code */
257
  }
258

    
259
  queryChanged($event) {
260

    
261
     this.goTo(1);
262
  }
263
  pageChanged($event) {
264
    this.searchUtils.page = +$event.value;
265
    this.goTo(this.searchUtils.page);
266
  }
267
  /*
268
  * Update the url with proper parameters. This is used as base url in Paging Component
269
  */
270
  public updateBaseUrlWithParameters(){
271
    this.baseURLWithParameters = this.searchUtils.baseUrl + this.createUrlParameters(false);
272
   }
273
   getOperatorParameter(parameter:string):string{
274
     for (let id of this.fieldIds) {
275
       if(this.fieldIdsMap[id]["param"] == parameter){
276
         return this.fieldIdsMap[id]["operator"];
277
       }
278
     }    
279
   }
280
   // for loading
281
   public openLoading(){
282
     this.loading.open();
283
   }
284
   public closeLoading(){
285
       this.loading.close();
286
   }
287
}
(5-5/36)