Project

General

Profile

1
import {
2
  Component,
3
  Input,
4
  Output,
5
  EventEmitter,
6
  OnInit,
7
  OnChanges,
8
  SimpleChanges
9
} from '@angular/core';
10
import { Filter, Value} from './searchHelperClasses.class';
11
import {ActivatedRoute, Router} from "@angular/router";
12
import {properties} from "../../../../environments/environment";
13
import 'rxjs/add/operator/filter';
14
@Component({
15
    selector: 'search-filter',
16
    templateUrl: 'searchFilter.component.html'
17
})
18

    
19
export class SearchFilterComponent implements OnInit, OnChanges{
20

    
21
  @Input() filter:Filter;
22
  @Input() showResultCount:boolean = true;
23
  @Input() isDisabled:boolean = false;
24
  @Input() addShowMore:boolean = true;
25
  @Input() showMoreInline: boolean = true;
26
  @Input() filterValuesNum: number = 6;
27
  public showAll:boolean = false;
28
  public _maxCharacters:number =28;
29

    
30
  @Output() toggleModal = new EventEmitter();
31

    
32
  @Output() modalChange = new EventEmitter();
33
  @Output() onFilterChange = new EventEmitter();
34
  keyword = "";
35
  sortBy = "name";
36
  queryParams = {};
37
  @Input() actionRoute:boolean = false;
38
  @Input() quickFilter: { filter: Filter, selected: boolean, filterId: string, value: string };
39
  sub;
40
  public isOpen:boolean=false;
41

    
42
    constructor (private _router: Router, private route: ActivatedRoute) {
43
    }
44
  ngOnDestroy() {
45
    if(this.sub){
46
      this.sub.unsubscribe();
47
    }
48
  }
49
    ngOnInit() {
50
      this.sub = this.route.queryParams.subscribe(params => {
51
        this.queryParams = Object.assign({}, params);
52
      });
53
      this.filter.values = this.filter.values.filter(value => !value.name.toLowerCase().includes('unknown') && !value.name.toLowerCase().includes('not available'));
54
      if(this.filter.filterType == "radio"){
55
        this.filter.radioValue = "";
56
        this.filter.values.forEach(value => {
57
          if(value.selected){
58
            this.filter.radioValue = value.id
59
          }
60
        });
61
      }
62
    }
63
    
64
    ngOnChanges(changes: SimpleChanges) {
65
      if(changes.filter) {
66
        this.filter.values = this.filter.values.filter(value => !value.name.toLowerCase().includes('unknown') && !value.name.toLowerCase().includes('not available'));
67
        if(this.filter.filterType == "radio"){
68
          this.filter.radioValue = "";
69
          this.filter.values.forEach(value => {
70
            if(value.selected){
71
              this.filter.radioValue = value.id
72
            }
73
          });
74
        }
75
      }
76
    }
77
  
78
  public _formatTitle(title,length){
79
      return (((title+" ("+length+")").length >this._maxCharacters)?(title.substring(0,(this._maxCharacters - (" ("+length+")").length - ('...').length))+"..."):title)+" ("+(length>95?"100":length)+")";
80
    }
81
    public _formatName(value){
82
      //let maxLineLength = 24;
83
      let maxLineLength = 35;
84

    
85
      //1 space after checkbox
86
      //3 space before number + parenthesis
87
      if(!this.showResultCount && value.name.length+1 > maxLineLength ){
88
        return value.name.substr(0, maxLineLength -3 -1)+'...';
89
      }
90
      if(value.name.length+value.number.toLocaleString().length +1 +3> maxLineLength){
91
        return value.name.substr(0, (maxLineLength- 3 -4 - value.number.toLocaleString().length))+'...';
92
      }
93

    
94
      return value.name;
95
    }
96

    
97
    filterKeywords(value){
98
      if(this.keyword.length > 0){
99
        if(value.toLowerCase().indexOf(this.keyword.toLowerCase()) ==-1){
100
          return false;
101
        }
102
      }
103
      return true;
104
    }
105
    filterChange(selected:boolean){
106
      if(selected){
107
          this.filter.countSelectedValues++;
108
      }else{
109
          this.filter.countSelectedValues--;
110
      }
111
      this.onFilterChange.emit({
112
          value: this.filter
113
      });
114
    }
115
    uniqueFilterChange(value: Value) {
116
      let tmp = value.selected;
117
      value.selected = !tmp;
118

    
119
      if(value.selected){
120
        this.filter.countSelectedValues = 1;
121
      }else{
122
        this.filter.countSelectedValues = 0;
123
      }
124

    
125
      this.filter.values.forEach(value => {
126
          value.selected = (value.id == this.filter.radioValue);
127
      });
128
      this.onFilterChange.emit({
129
        value: this.filter
130
      });
131
    }
132
    clearFilter() {
133
      for (var i=0; i < this.filter.values.length; i++){
134
        this.filter.values[i].selected = false;
135
      }
136
      this.filter.countSelectedValues = 0;
137
      this.onFilterChange.emit({
138
        value: this.filter
139
      });
140
      this.filter.radioValue = "";
141
    }
142

    
143
  getSelectedAndTopValues(filter, topNum: number = 6):any{
144
    var values = [];
145

    
146
    for (let i=0; i < topNum; i++){
147
      if(filter.values.length <= i) {
148
        break;
149
      }
150
      values.push(filter.values[i]);
151
    }
152

    
153
    if(filter.countSelectedValues >0){
154
      for (let i=topNum; i < filter.values.length; i++){
155
        if(filter.values[i].selected){
156
          values.push(filter.values[i]);
157
        }
158
      }
159
    }
160

    
161
    return values;
162
  }
163

    
164
    getSelectedValues(filter, sortBy:string = "num"):any{
165
      var selected = [];
166
      if(filter.countSelectedValues >0){
167
        for (var i=0; i < filter.values.length; i++){
168
          if(filter.values[i].selected){
169
            selected.push(filter.values[i]);
170
          }
171
        }
172
      }
173
      if(sortBy == "name"){
174

    
175
        selected.sort((n1,n2)=> {
176
          if (n1.name > n2.name) {
177
              return 1;
178
          }
179

    
180
          if (n1.name < n2.name) {
181
              return -1;
182
          }
183

    
184
          return 0;
185
        });
186
      }
187
      return selected;
188

    
189
    }
190
    getNotSelectedValues(filter, sortBy:string = "num"):any{
191
      var notSselected = [];
192
      for (var i=0; i < filter.values.length; i++){
193
        if(!filter.values[i].selected){
194
          notSselected.push(filter.values[i]);
195
        }
196
      }
197

    
198
      if(sortBy == "name"){
199

    
200
        notSselected.sort((n1,n2)=> {
201
          if (n1.name > n2.name) {
202
              return 1;
203
          }
204
          if (n1.name < n2.name) {
205
              return -1;
206
          }
207

    
208
          return 0;
209
        });
210
      }
211
      return notSselected;
212
    }
213

    
214
    sort(values: Value[]) {
215
      let sorted: Value[] = values.slice();
216
      if(this.sortBy == "name"){
217

    
218
        sorted.sort((n1,n2)=> {
219
          if (n1.name.toLowerCase() > n2.name.toLowerCase()) {
220
            return 1;
221
          }
222

    
223
          if (n1.name < n2.name) {
224
            return -1;
225
          }
226

    
227
          return 0;
228
        });
229
      }
230
      return sorted;
231
    }
232

    
233
  toggle() {
234
    this.isOpen = !this.isOpen;
235
  }
236

    
237
  getFilterName(value){
238
    let name = value.name +" ("+ value.number.format()+")";
239
    console.log(name);
240
    return name;
241
  }
242
  getRoute(){
243
    return properties.baseLink + this._router.url.split("?")[0];
244
  }
245
  getParams(filter:Filter, value:Value){
246
      let params = Object.assign({}, this.queryParams);
247
      let qf=false;
248
      if(this.quickFilter && this.quickFilter.filterId == filter.filterId && this.quickFilter.selected && value.id == this.quickFilter.value){
249
        params['qf']="false";
250
        qf=true;
251
      }
252
      if(params[filter.filterId] && params[filter.filterId].indexOf(encodeURIComponent(value.id))==-1 && !qf) {
253
        //has other values of this filter --> add this value
254
        params[filter.filterId] = params[filter.filterId] + ',' + '"' + encodeURIComponent(value.id) + '"';
255
      }else if(params[filter.filterId] && params[filter.filterId].indexOf(encodeURIComponent(value.id))!=-1) {
256
        // has this filter and the value -- > remove it
257

    
258
        let values = params[filter.filterId].split(',');
259
        values.splice(values.indexOf('"' + encodeURIComponent(value.id)+'"'), 1);
260
        params[filter.filterId] =values.join(',');
261
        if(values.length == 0){
262
          delete params[filter.filterId];
263
        }
264
      } else if(!qf){
265
        //has no filter, no value --> add the value
266
          params[filter.filterId] = '"' + encodeURIComponent(value.id) + '"' ;
267
      }
268
      delete params['page'];
269
      return params;
270
  }
271
}
(26-26/47)