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
  @Input() searchFormClass: string = "searchForm";
44
  piwiksub: any;
45
  public parameterNames:string[] =[];
46
  public parameterValues:string[] =[];
47

    
48
  public baseURLWithParameters:string = '';
49

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

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

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

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

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

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

    
90
  }
91

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

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

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

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

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

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

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

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

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

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

    
237
  }
238
  clearFilters(){
239
  }
240

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

    
260
  queryChanged($event) {
261

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