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

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

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

    
41
                    <!--/div-->
42
                    <div>
43
                        <search-result [results]="results" [status]=searchUtils.status  [page]="searchUtils.page"></search-result>
44
                    </div>
45
                <!--/div>
46
            </div-->
47
        </div>
48
    </div>
49

    
50
    `
51
})
52
export class AdvancedSearchPageComponent {
53
  @Input() pageTitle = "";
54
  @Input() results = [];
55
  @Input() entityType;
56
  @Input() searchUtils:SearchUtilsClass = new SearchUtilsClass();
57
  @Input() fieldIds:  string[];
58
  @Input() fieldIdsMap:{ [key:string]:{ name:string, operator:string, type:string, indexField:string, equalityOperator:string  }} ;
59
  @Input() selectedFields:AdvancedField[];
60
  @Input() simpleSearchUrl: string;
61

    
62
  public baseURLWithParameters:string = '';
63

    
64
  @Output() queryChange  = new EventEmitter();
65
  constructor (private location: Location) {
66
   }
67

    
68
  ngOnInit() {
69
     this.updateBaseUrlWithParameters();
70
    //  this.searchUtils.totalResults = this.results.length;
71
  }
72
  public getSelectedFiltersFromUrl(params){
73
    for(var i=0; i< this.fieldIds.length ; i++){
74
         var fieldId =  this.fieldIds[i];
75
         var operatorId =  this.fieldIdsMap[fieldId].operator;
76
          if(params[fieldId] != undefined && params[operatorId] != undefined) {
77
              var values:string [] = decodeURIComponent(params[fieldId]).split(",");
78
             var operators:string [] = decodeURIComponent(params[operatorId]).split(",");
79
              if(values.length == operators.length){
80
               for(var j=0; j< values.length ; j++){
81
                 this.selectedFields.push(new AdvancedField(fieldId,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,values[j],operators[j]) )
82
               }
83
             }
84
         }
85
   }
86
   if(this.selectedFields.length == 0){
87
     this.selectedFields.push(new AdvancedField(this.fieldIds[0],this.fieldIdsMap[this.fieldIds[0]].name,this.fieldIdsMap[this.fieldIds[0]].type,"","and"));
88
   }
89
  }
90
  private createUrlParameters(includePage:boolean){
91
    var params="";
92
    var fields: { [key:string]:{ values:string[], operators:string[] }}={};
93

    
94
    for(var i = 0; i< this.selectedFields.length; i++){
95
      if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && this.selectedFields[i].value.length > 0){
96
        if(!fields[this.selectedFields[i].id]){
97
          fields[this.selectedFields[i].id] = {values:[], operators:[]};
98
          fields[this.selectedFields[i].id].values =[];
99
          fields[this.selectedFields[i].id].operators =[];
100
        }
101
        fields[this.selectedFields[i].id].values.push(this.selectedFields[i].value);
102
        fields[this.selectedFields[i].id].operators.push(this.selectedFields[i].operatorId);
103

    
104
      }
105
    }
106
    for(var i = 0; i< this.fieldIds.length; i++){
107
      if(fields[this.fieldIds[i]]){
108
        params+="&"+this.fieldIds[i]+"="+fields[this.fieldIds[i]].values.join()+
109
        "&"+this.fieldIdsMap[this.fieldIds[i]].operator+"="+fields[this.fieldIds[i]].operators.join()
110
      }
111
    }
112
    if(includePage && this.searchUtils.page != 1){
113
      params += "&page="+this.searchUtils.page;
114
    }
115
    return '?'+params;
116
  }
117
  public createQueryParameters(){
118
    var params="";
119
    var countParams = 0;
120
    for(var i = 0; i< this.selectedFields.length; i++){
121
      if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && this.selectedFields[i].value != ""){
122
        if(this.selectedFields[i].id == "q"){
123
          var op = "";
124
          // if()
125
          params += (countParams == 0 ? "" : this.selectedFields[i].operatorId) + " " + '"' + encodeURIComponent(this.selectedFields[i].value) + '"' + " ";
126
        }else if(countParams == 0 && this.selectedFields[i].operatorId == "not"){
127
            params += " "+ this.fieldIdsMap[this.selectedFields[i].id].indexField +  " <> "+'"' + encodeURIComponent(this.selectedFields[i].value) +'"' + " ";
128
        }else{
129
          params += (countParams == 0 ? "" : this.selectedFields[i].operatorId + " " ) + this.fieldIdsMap[this.selectedFields[i].id].indexField + this.fieldIdsMap[this.selectedFields[i].id].equalityOperator+'"' + encodeURIComponent(this.selectedFields[i].value) +'"' + " ";
130

    
131
        }
132

    
133
        countParams++;
134
      }
135
    }
136

    
137
     return params;
138

    
139
  }
140
  clearFilters(){
141
  }
142

    
143
  goTo(page:number = 1){
144
     this.searchUtils.page = page;
145
    var urlParameters = this.createUrlParameters(true);
146
    var queryParameters = this.createQueryParameters();
147
    this.location.go(location.pathname,urlParameters);
148
    this.queryChange.emit({
149
        value: queryParameters
150
    });
151

    
152
  }
153

    
154
  queryChanged($event) {
155

    
156
     this.goTo(1);
157
  }
158
  pageChanged($event) {
159
    this.searchUtils.page = +$event.value;
160
    this.goTo(this.searchUtils.page);
161
  }
162
  /*
163
  * Update the url with proper parameters. This is used as base url in Paging Component
164
  */
165
  public updateBaseUrlWithParameters(){
166
    this.baseURLWithParameters = this.searchUtils.baseUrl + this.createUrlParameters(false);
167
   }
168
}
(2-2/10)