Project

General

Profile

1
import {Component, Input, Output, EventEmitter, ElementRef} from '@angular/core';
2
import {Observable}       from 'rxjs/Observable';
3
import { Subject } from 'rxjs/Subject';
4

    
5
import {AdvancedField, OPERATOR} from '../searchUtils/searchHelperClasses.class';
6
import {SearchFields} from '../../utils/properties/searchFields';
7
import {Dates} from '../../utils/string-utils.class';
8

    
9
@Component({
10
    selector: 'advanced-search-form',
11
    template: `
12
        <form class="uk-form">
13
        <table  class="uk-text-center">
14
            <tr *ngFor="let selectedField of selectedFields; let i = index" class="uk-form-row  ">
15
                    <td *ngIf ="i==0 ">Search for:</td>
16

    
17
                    <td *ngIf = "i != 0" ><select [(ngModel)]="selectedField.operatorId" name="selectOp_{{i}}" >
18
                          <option *ngFor="let op of operators" (change)="fieldOperatorChanged(i, op.id, op.id)" (click)="fieldOperatorChanged(i, op.id, op.id)" [value]="op.id">{{op.id}}</option>
19
                    </select></td>
20
                    <td><select [(ngModel)]="selectedField.id" name="selectField_{{i}}"  (click)="fieldIdsChanged(i)" >
21
                      <option *ngFor="let id of fieldIds"  [value]="id">{{fieldIdsMap[id].name}}</option>
22
                    </select> </td>
23
                    <td *ngIf = "selectedField.type == 'keyword'" class="uk-width-1-3" ><input  type="text" class="form-control" placeholder="Type keywords..."
24
                        [(ngModel)]="selectedField.value" name="value[{{i}}]"></td>
25
                    <td *ngIf = "selectedField.type == 'year'" class="uk-width-1-3"><input   type="text" class="form-control"  placeholder="Type Year..."
26
                    [(ngModel)]="selectedField.value" name="value[{{i}}]" (keyup)=validateDate(i,selectedField.value)></td>
27
                    <td *ngIf = "selectedField.type == 'vocabulary'" class="uk-width-1-3">
28
                      <static-autocomplete  [(vocabularyId)] = selectedField.param
29
                        [(list)] = this.fieldList[selectedField.id]  [entityName] = "entityType" [selectedValue]=selectedField.value [showSelected]=true
30
                         [placeHolderMessage] = "'Search for '+selectedField.name" [title] = "selectedField.name"   [multipleSelections]=false
31
                         (selectedValueChanged)="valueChanged($event,i)" (listUpdated) = "listUpdated($event,selectedField.id)"></static-autocomplete>
32
                    </td>
33
                    <td  *ngIf = " selectedField.type == 'refine'" class="uk-width-1-3">
34
                      <static-autocomplete [(list)] = this.fieldList[selectedField.id] [entityName] = "entityType" [fieldName] = [selectedField.id] [selectedValue]=selectedField.value [showSelected]=true [placeHolderMessage] = "'Search for '+selectedField.name" [title] = "selectedField.name"  [multipleSelections]=false (selectedValueChanged)="valueChanged($event,i)" (listUpdated) = "listUpdated($event,selectedField.id)"></static-autocomplete></td>
35
                    <td  *ngIf = "selectedField.type == 'entity'" class="uk-width-1-3"><entities-autocomplete  [entityType]=selectedField.param   [selectedValue]=selectedField.value [showSelected]=true
36
                       [placeHolderMessage] = "'Search for '+selectedField.name" [title] = "selectedField.name"  [multipleSelections]=false
37
                        (selectedValueChanged)="valueChanged($event,i)" (listUpdated) = "listUpdated($event,selectedField.id)" >
38
                    </entities-autocomplete></td>
39

    
40
                    <td *ngIf = "selectedField.type == 'boolean'" class="input-group">
41
                       <span class="input-group-addon">
42
                          <input type="radio" [(ngModel)]="selectedField.value"  [name]=selectedField.param value="true">Yes<br>
43
                      </span>
44
                      <span class="input-group-addon">
45
                        <input type="radio" [(ngModel)]="selectedField.value"  [name]=selectedField.param value="false">No<br>
46
                      </span>
47
                  </td>
48
                  <td  >
49
                    <button *ngIf="selectedFields.length > 1" type="button" class="uk-button uk-button-danger" (click)="removeField(i)">
50
                      <i class="uk-icon-minus"></i>
51
                    </button>
52
                    <button *ngIf="selectedFields.length == 1" type="button" class="uk-button uk-button-danger"  disabled>
53
                      <i class="uk-icon-minus" ></i>
54
                    </button>
55
                  </td>
56
                  <td *ngIf="i == selectedFields.length-1 " ><button type="button" class="uk-button uk-button-success" (click)="addField()">
57
                      <i class="uk-icon-plus"></i>
58
                  </button></td>
59
            </tr>
60
            </table>
61
            <div  class="uk-form-row uk-text-right">
62
              <button (click)="queryChanged()"  type="submit" class="uk-button uk-button-primary">Search</button>
63
            </div>
64

    
65
        </form>
66

    
67
    `
68
})
69
export class AdvancedSearchFormComponent {
70
  @Input() entityType;
71
  @Input() fieldIds:  string[];
72
  @Input() fieldIdsMap;
73
  @Input() selectedFields:AdvancedField[];
74
  @Output() queryChange  = new EventEmitter();
75
  newFieldId:string;
76
  newFieldName:string;
77
  fieldList:{[id:string]:any[]} = {};
78
  public searchFields:SearchFields = new SearchFields();
79

    
80
  public operators:  [{name:string, id:string}] = this.searchFields.ADVANCED_SEARCH_OPERATORS;
81
    constructor () {
82
      console.log("Constr: Advanced search form");
83
     }
84

    
85
    ngOnInit() {
86
      console.log("Init: Advanced search form");
87
      for(var i = 0; i < this.fieldIds.length; i++){
88
        this.fieldList[this.fieldIds[i]]=[];
89
      }
90
      this.newFieldId = this.fieldIds[0];
91
      this.newFieldName = this.fieldIdsMap[this.newFieldId].name;
92
     }
93

    
94
    queryChanged() {
95
        this.queryChange.emit({
96
            // selectedFields: this.selectedFields,
97
            // selectedQuantifiers: this.selectedQuantifiers,
98
            // keywords: this.keywords
99
        });
100
    }
101

    
102
    addField() {
103
        console.info("add filter"+this.fieldIds[0]+this.fieldIdsMap[this.fieldIds[0]].name+this.fieldIdsMap[this.fieldIds[0]].type);
104
        this.newFieldId = this.fieldIds[0];
105
        var type = this.fieldIdsMap[this.newFieldId].type;
106
        if(type == "boolean"){
107
          this.selectedFields.push(new AdvancedField(this.newFieldId,this.fieldIdsMap[this.newFieldId].param, this.fieldIdsMap[this.newFieldId].name, type, "true", "and"));
108
        }else{
109
          this.selectedFields.push(new AdvancedField(this.newFieldId, this.fieldIdsMap[this.newFieldId].param,this.fieldIdsMap[this.newFieldId].name, type, "", "and"));
110
        }
111

    
112
    }
113

    
114
    removeField(index: number) {
115
        console.info("remove filter");
116
        this.selectedFields.splice(index, 1);
117

    
118
    }
119

    
120
    fieldOperatorChanged(index: number, operatorId: string, operatorName: string) {
121
         this.selectedFields[index].operatorId = operatorId;
122
         this.selectedFields[index].operatorName = operatorName;
123
    }
124
    validateDate(index: number, value: string){
125
      this.selectedFields[index].valid = Dates.isValidYear(value);
126
    }
127

    
128
    fieldIdsChanged(index: number) {
129
      var id =this.selectedFields[index].id;
130
         this.selectedFields[index].name = this.fieldIdsMap[id].name;
131
         this.selectedFields[index].type = this.fieldIdsMap[id].type;
132
         this.selectedFields[index].value = "";
133
         this.selectedFields[index].param = this.fieldIdsMap[id].param;
134
         if(this.fieldIdsMap[id].type == "boolean"){
135
           this.selectedFields[index].value = "true";
136
         }
137
    }
138
    valueChanged($event,index:number){
139
      this.selectedFields[index].value = $event.value;
140
    }
141
    listUpdated($event,fieldId:number){
142
      this.fieldList[fieldId] = $event.value;
143
    }
144

    
145
}
(1-1/20)