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

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

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

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

    
49
    `
50
})
51
export class AdvancedSearchPageComponent {
52
  @Input() pageTitle = "";
53
  @Input() results = [];
54
  @Input() entityType;
55
  @Input() page:number = 1;
56
  @Input() size: number = 10;
57
  @Input() totalResults: number = 0;
58
  @Input() fieldIds:  string[];
59
  @Input() fieldIdsMap:{ [key:string]:{ name:string, operator:string, type:string, indexField:string }} ;
60
  @Input() selectedFields:AdvancedField[];
61
  @Input() baseUrl:string = '';
62
  @Input() status: number;
63
  @Input() simpleSearchUrl: string;
64

    
65
  private baseURLWithParameters:string = '';
66

    
67
  // private searchFields:SearchFields = new SearchFields();
68

    
69

    
70
  @Output() queryChange  = new EventEmitter();
71
  constructor (private location: Location) {
72
    console.log("Constr: AdvancedSearchPageComponent");
73
  }
74

    
75
  ngOnInit() {
76
    console.log("Init: AdvancedSearchPageComponent");
77

    
78
     this.totalResults = this.results.length;
79
  }
80
  public getSelectedFiltersFromUrl(params){
81
    for(var i=0; i< this.fieldIds.length ; i++){
82
         var fieldId =  this.fieldIds[i];
83
         var operatorId =  this.fieldIdsMap[fieldId].operator;
84
          if(params[fieldId] != undefined && params[operatorId] != undefined) {
85
            console.log(fieldId + " " + params[fieldId]+" Op: "+ operatorId + " "+ params[operatorId] );
86
             var values:string [] = decodeURIComponent(params[fieldId]).split(",");
87
             var operators:string [] = decodeURIComponent(params[operatorId]).split(",");
88
             console.log(values + " " + " Op: "+ operators  );
89
             if(values.length == operators.length){
90
               for(var j=0; j< values.length ; j++){
91
                 this.selectedFields.push(new AdvancedField(fieldId,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,values[j],operators[j]) )
92
               }
93
             }
94
         }
95
   }
96
   if(this.selectedFields.length == 0){
97
     this.selectedFields.push(new AdvancedField(this.fieldIds[0],this.fieldIdsMap[this.fieldIds[0]].name,this.fieldIdsMap[this.fieldIds[0]].type,"","and"));
98
   }
99
  }
100
  private createUrlParameters(includePage:boolean){
101
    var params="";
102
    var fields: { [key:string]:{ values:string[], operators:string[] }}={};
103

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

    
114
      }
115
    }
116
    for(var i = 0; i< this.fieldIds.length; i++){
117
      if(fields[this.fieldIds[i]]){
118
        params+="&"+this.fieldIds[i]+"="+fields[this.fieldIds[i]].values.join()+
119
        "&"+this.fieldIdsMap[this.fieldIds[i]].operator+"="+fields[this.fieldIds[i]].operators.join()
120
      }
121
    }
122
    if(includePage && this.page != 1){
123
      params += "&page="+this.page;
124
    }
125
    return params;
126
  }
127
  public createQueryParameters(){
128
    var params="";
129
    for(var i = 0; i< this.selectedFields.length; i++){
130
      console.info("Creating Parameter:" + this.selectedFields[i].id+" :"+this.selectedFields[i].value);
131
      if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && this.selectedFields[i].value != ""){
132
        params +="&"+ this.selectedFields[i].id
133
        + "="+ encodeURIComponent(this.selectedFields[i].value)+"&"+this.fieldIdsMap[this.selectedFields[i].id].operator
134
        + "=" + this.selectedFields[i].operatorId;
135
      }
136
    }
137

    
138
    console.info("Parameter:" + params);
139
    return params;
140

    
141
  }
142
  clearFilters(){
143
  }
144

    
145
  goTo(page:number = 1){
146
      console.info("goto");
147
      //console.info("keyword: "+this.keyword);
148
    this.page = page;
149
    var urlParameters = this.createUrlParameters(true);
150
    var queryParameters = this.createQueryParameters();
151
    this.location.go(location.pathname,urlParameters);
152
    this.queryChange.emit({
153
        value: queryParameters
154
    });
155

    
156
  }
157

    
158
  queryChanged($event) {
159

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