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

    
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

    
37
  public isOpen:boolean=false;
38

    
39
    constructor () {
40
    }
41

    
42
    ngOnInit() {
43
      this.filter.values = this.filter.values.filter(value => !value.name.toLowerCase().includes('unknown') && !value.name.toLowerCase().includes('not available'));
44
      if(this.filter.filterType == "radio"){
45
        this.filter.values.forEach(value => {
46
          if(value.selected){
47
            this.filter.radioValue = value.id
48
          }
49
        });
50
      }
51
    }
52
    
53
    ngOnChanges(changes: SimpleChanges) {
54
      if(changes.filter) {
55
        this.filter.values = this.filter.values.filter(value => !value.name.toLowerCase().includes('unknown') && !value.name.toLowerCase().includes('not available'));
56
      }
57
    }
58
  
59
  public _formatTitle(title,length){
60
      return (((title+" ("+length+")").length >this._maxCharacters)?(title.substring(0,(this._maxCharacters - (" ("+length+")").length - ('...').length))+"..."):title+" ("+(length>95?"100":length)+")")
61
    }
62
    public _formatName(value){
63
      //let maxLineLength = 24;
64
      let maxLineLength = 35;
65

    
66
      //1 space after checkbox
67
      //3 space before number + parenthesis
68
      if(!this.showResultCount && value.name.length+1 > maxLineLength ){
69
        return value.name.substr(0, maxLineLength -3 -1)+'...';
70
      }
71
      if(value.name.length+value.number.toLocaleString().length +1 +3> maxLineLength){
72
        return value.name.substr(0, (maxLineLength- 3 -4 - value.number.toLocaleString().length))+'...';
73
      }
74

    
75
      return value.name;
76
    }
77

    
78
    filterKeywords(value){
79
      if(this.keyword.length > 0){
80
        if(value.toLowerCase().indexOf(this.keyword.toLowerCase()) ==-1){
81
          return false;
82
        }
83
      }
84
      return true;
85
    }
86
    filterChange(selected:boolean){
87
      if(selected){
88
          this.filter.countSelectedValues++;
89
      }else{
90
          this.filter.countSelectedValues--;
91
      }
92
      this.onFilterChange.emit({
93
          value: this.filter
94
      });
95
    }
96
    uniqueFilterChange(value: Value) {
97
      let tmp = value.selected;
98
      value.selected = !tmp;
99

    
100
      if(value.selected){
101
        this.filter.countSelectedValues++;
102
      }else{
103
        this.filter.countSelectedValues--;
104
      }
105

    
106
      this.filter.values.forEach(value => {
107
          value.selected = (value.id == this.filter.radioValue);
108
      });
109
      this.onFilterChange.emit({
110
        value: this.filter
111
      });
112
    }
113
    clearFilter() {
114
      for (var i=0; i < this.filter.values.length; i++){
115
        this.filter.values[i].selected = false;
116
      }
117
      this.filter.countSelectedValues = 0;
118
      this.onFilterChange.emit({
119
        value: this.filter
120
      });
121
      this.filter.radioValue = "";
122
    }
123

    
124
  getSelectedAndTopValues(filter, topNum: number = 6):any{
125
    var values = [];
126

    
127
    for (let i=0; i < topNum; i++){
128
      if(filter.values.length <= i) {
129
        break;
130
      }
131
      values.push(filter.values[i]);
132
    }
133

    
134
    if(filter.countSelectedValues >0){
135
      for (let i=topNum; i < filter.values.length; i++){
136
        if(filter.values[i].selected){
137
          values.push(filter.values[i]);
138
        }
139
      }
140
    }
141

    
142
    return values;
143
  }
144

    
145
    getSelectedValues(filter, sortBy:string = "num"):any{
146
      var selected = [];
147
      if(filter.countSelectedValues >0){
148
        for (var i=0; i < filter.values.length; i++){
149
          if(filter.values[i].selected){
150
            selected.push(filter.values[i]);
151
          }
152
        }
153
      }
154
      if(sortBy == "name"){
155

    
156
        selected.sort((n1,n2)=> {
157
          if (n1.name > n2.name) {
158
              return 1;
159
          }
160

    
161
          if (n1.name < n2.name) {
162
              return -1;
163
          }
164

    
165
          return 0;
166
        });
167
      }
168
      return selected;
169

    
170
    }
171
    getNotSelectedValues(filter, sortBy:string = "num"):any{
172
      var notSselected = [];
173
      for (var i=0; i < filter.values.length; i++){
174
        if(!filter.values[i].selected){
175
          notSselected.push(filter.values[i]);
176
        }
177
      }
178

    
179
      if(sortBy == "name"){
180

    
181
        notSselected.sort((n1,n2)=> {
182
          if (n1.name > n2.name) {
183
              return 1;
184
          }
185
          if (n1.name < n2.name) {
186
              return -1;
187
          }
188

    
189
          return 0;
190
        });
191
      }
192
      return notSselected;
193
    }
194

    
195
    sort(values: Value[]) {
196
      let sorted: Value[] = values.slice();
197
      if(this.sortBy == "name"){
198

    
199
        sorted.sort((n1,n2)=> {
200
          if (n1.name > n2.name) {
201
            return 1;
202
          }
203

    
204
          if (n1.name < n2.name) {
205
            return -1;
206
          }
207

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

    
214
  toggle() {
215
    this.isOpen = !this.isOpen;
216
  }
217

    
218
  getFilterName(value){
219
    let name = value.name +" ("+ value.number.format()+")";
220
    console.log(name);
221
    return name;
222
  }
223
}
(31-31/55)