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 {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class';
5
import {SearchResult}     from '../../utils/entities/searchResult';
6
import {SearchFields} from '../../utils/properties/searchFields';
7
import {SearchUtilsClass} from './searchUtils.class';
8
import {ModalLoading} from '../../utils/modal/loading.component';
9

    
10
@Component({
11
    selector: 'advanced-search-page',
12
    template: `
13

    
14
    <div class="uk-margin-top">
15
        <div class="page-header">
16
            <h1>{{pageTitle}}</h1>
17
        </div>
18
        <div>
19
            <!--div class="row row-offcanvas row-offcanvas-right">
20
                <div class="col-xs-12 col-sm-3">
21
                    <a *ngIf="isFiltered()" (click)="clearFilters()" > Clear Filters</a>
22
                    <p *ngFor="let filter of filters " >
23
                        <search-filter [filter]="filter"   (change)="filterChanged($event)"></search-filter>
24
                    </p>
25
                </div>
26
                [(fields)]="fields"
27
                                      [(selectedFields)]="selectedFields"
28
                                      [(quantifiers)]="quantifiers"
29
                                      [(selectedQuantifiers)]="selectedQuantifiers"
30
                                      [(keywords)]="keywords"
31
                <div class="col-xs-6 col-sm-9 sidebar-offcanvas" id="sidebar"-->
32
                    <advanced-search-form
33
                     [entityType] = "entityType"
34
                     [(fieldIds)]="fieldIds"
35
                     [(fieldIdsMap)]="fieldIdsMap"
36
                     [(selectedFields)]="selectedFields"
37
                                          (queryChange)="queryChanged($event)">
38
                    </advanced-search-form>
39
                    <!--div class="uk-text-right" *ngIf="results  && results.length>= size"-->
40
                        <search-paging [type]="type" [(searchUtils)] = "searchUtils"  [(results)] = "results" [(baseUrl)] = "baseURLWithParameters"    ></search-paging>
41
                        <search-download [type]="csvPath" [csvParams]="csvParams" [totalResults]="searchUtils.totalResults" ></search-download>
42

    
43
                    <!--/div-->
44
                    <div>
45
                        <search-result [results]="results" [status]=searchUtils.status  [page]="searchUtils.page"></search-result>
46
                    </div>
47
                <!--/div>
48
            </div-->
49
        </div>
50
    </div>
51
    <modal-loading [message]= "'Loading results...'"></modal-loading>
52

    
53
    `
54
})
55
export class AdvancedSearchPageComponent {
56
  @Input() pageTitle = "";
57
  @Input() results = [];
58
  @Input() type;
59
  @Input() entityType;
60
  @Input() searchUtils:SearchUtilsClass = new SearchUtilsClass();
61
  @Input() fieldIds:  string[];
62
  @Input() fieldIdsMap;//:{ [key:string]:{ name:string, operator:string, type:string, indexField:string, equalityOperator:string  }} ;
63
  @Input() selectedFields:AdvancedField[];
64
  @Input() simpleSearchUrl: string;
65
  @ViewChild (ModalLoading) loading : ModalLoading ;
66
  @Input() csvParams: string;
67
  @Input() csvPath: string;
68

    
69
  public baseURLWithParameters:string = '';
70

    
71
  @Output() queryChange  = new EventEmitter();
72
  constructor (private location: Location) {
73
   }
74

    
75
  ngOnInit() {
76
     this.updateBaseUrlWithParameters();
77
    //  this.searchUtils.totalResults = this.results.length;
78
  }
79
  public getSelectedFiltersFromUrl(params){
80
    for(var i=0; i< this.fieldIds.length ; i++){
81
         var fieldId =  this.fieldIds[i];
82
         var fieldparam =  this.fieldIdsMap[fieldId].param;
83

    
84
         var operatorId =  this.getOperatorParameter(fieldparam);
85
          if(params[fieldparam] != undefined && params[operatorId] != undefined) {
86
              var values:string [] = decodeURIComponent(params[fieldparam]).split(",");
87
             var operators:string [] = decodeURIComponent(params[operatorId]).split(",");
88
              if(values.length == operators.length){
89
               for(var j=0; j< values.length ; j++){
90
                 this.selectedFields.push(new AdvancedField(fieldId,fieldparam,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,values[j],operators[j]) )
91
               }
92
             }
93
         }
94
   }
95
   if(this.selectedFields.length == 0){
96
     this.selectedFields.push(new AdvancedField(this.fieldIds[0],fieldparam,this.fieldIdsMap[this.fieldIds[0]].name,this.fieldIdsMap[this.fieldIds[0]].type,"","and"));
97
   }
98
  }
99
  private createUrlParameters(includePage:boolean){
100
    var params="";
101
    var fields: { [key:string]:{ values:string[], operators:string[] }}={};
102

    
103
    for(var i = 0; i< this.selectedFields.length; i++){
104
      if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && this.selectedFields[i].value.length > 0){
105
        if(!fields[this.selectedFields[i].id]){
106
          fields[this.selectedFields[i].id] = {values:[], operators:[]};
107
          fields[this.selectedFields[i].id].values =[];
108
          fields[this.selectedFields[i].id].operators =[];
109
        }
110
        fields[this.selectedFields[i].id].values.push(this.selectedFields[i].value);
111
        fields[this.selectedFields[i].id].operators.push(this.selectedFields[i].operatorId);
112

    
113
      }
114
    }
115
    for(var i = 0; i< this.fieldIds.length; i++){
116
      if(fields[this.fieldIds[i]]){
117
        params+="&"+this.fieldIdsMap[this.fieldIds[i]].param+"="+fields[this.fieldIds[i]].values.join()+
118
        "&"+this.getOperatorParameter(this.fieldIdsMap[this.fieldIds[i]].param)+"="+fields[this.fieldIds[i]].operators.join()
119
      }
120
    }
121
    if(includePage && this.searchUtils.page != 1){
122
      params += "&page="+this.searchUtils.page;
123
    }
124
    return '?'+params;
125
  }
126
  public createQueryParameters(){
127
    var params="";
128
    var countParams = 0;
129
    for(var i = 0; i< this.selectedFields.length; i++){
130
      if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && this.selectedFields[i].value != ""){
131
        if(this.selectedFields[i].id == "q"){
132
          var op = "";
133
          // if()
134
          params += (countParams == 0 ? "" : this.selectedFields[i].operatorId) + " " + '"' + encodeURIComponent(this.selectedFields[i].value) + '"' + " ";
135
        }else if(countParams == 0 && this.selectedFields[i].operatorId == "not"){
136
            params += " "+ this.selectedFields[i].id +  " <> "+'"' + encodeURIComponent(this.selectedFields[i].value) +'"' + " ";
137
        }else{
138
          params += (countParams == 0 ? "" : this.selectedFields[i].operatorId + " " ) + this.selectedFields[i].id + this.fieldIdsMap[this.selectedFields[i].id].equalityOperator+'"' + encodeURIComponent(this.selectedFields[i].value) +'"' + " ";
139

    
140
        }
141

    
142
        countParams++;
143
      }
144
    }
145

    
146
     return params;
147

    
148
  }
149
  clearFilters(){
150
  }
151

    
152
  goTo(page:number = 1){
153
     this.searchUtils.page = page;
154
    var urlParameters = this.createUrlParameters(true);
155
    var queryParameters = this.createQueryParameters();
156
    this.location.go(location.pathname,urlParameters);
157
    this.queryChange.emit({
158
        value: queryParameters
159
    });
160

    
161
  }
162

    
163
  queryChanged($event) {
164

    
165
     this.goTo(1);
166
  }
167
  pageChanged($event) {
168
    this.searchUtils.page = +$event.value;
169
    this.goTo(this.searchUtils.page);
170
  }
171
  /*
172
  * Update the url with proper parameters. This is used as base url in Paging Component
173
  */
174
  public updateBaseUrlWithParameters(){
175
    this.baseURLWithParameters = this.searchUtils.baseUrl + this.createUrlParameters(false);
176
   }
177
   getOperatorParameter(parameter:string):string{
178
     if(parameter.length > 2){
179
       return parameter.substring(0,2);
180
     }else if(parameter == "q"){
181
       return "op";
182
     }else{
183
       return parameter+"Op";
184
     }
185
   }
186
   // for loading
187
   public openLoading(){
188
     this.loading.open();
189
   }
190
   public closeLoading(){
191
       this.loading.close();
192
   }
193
}
(3-3/20)