Project

General

Profile

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

    
21
export class SearchFilterComponent implements OnInit, OnChanges{
22

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

    
32
  @Output() toggleModal = new EventEmitter();
33

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

    
43
    constructor (private _router: Router, private route: ActivatedRoute) {
44
    }
45

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

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

    
91
      return value.name;
92
    }
93

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

    
116
      if(value.selected){
117
        this.filter.countSelectedValues = 1;
118
      }else{
119
        this.filter.countSelectedValues = 0;
120
      }
121

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

    
140
  getSelectedAndTopValues(filter, topNum: number = 6):any{
141
    var values = [];
142

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

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

    
158
    return values;
159
  }
160

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

    
172
        selected.sort((n1,n2)=> {
173
          if (n1.name > n2.name) {
174
              return 1;
175
          }
176

    
177
          if (n1.name < n2.name) {
178
              return -1;
179
          }
180

    
181
          return 0;
182
        });
183
      }
184
      return selected;
185

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

    
195
      if(sortBy == "name"){
196

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

    
205
          return 0;
206
        });
207
      }
208
      return notSselected;
209
    }
210

    
211
    sort(values: Value[]) {
212
      let sorted: Value[] = values.slice();
213
      if(this.sortBy == "name"){
214

    
215
        sorted.sort((n1,n2)=> {
216
          if (n1.name.toLowerCase() > n2.name.toLowerCase()) {
217
            return 1;
218
          }
219

    
220
          if (n1.name < n2.name) {
221
            return -1;
222
          }
223

    
224
          return 0;
225
        });
226
      }
227
      return sorted;
228
    }
229

    
230
  toggle() {
231
    this.isOpen = !this.isOpen;
232
  }
233

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

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