Project

General

Profile

1
import {Component, ElementRef, EventEmitter, Input, Output} from '@angular/core';
2
import {SearchProjectsService} from '../../services/searchProjects.service';
3
import {ProjectService} from '../../landingPages/project/project.service';
4
import {ClaimEntity, ClaimProject} from './claimHelper.class';
5
import {EnvProperties} from '../../utils/properties/env-properties';
6
import {ErrorCodes} from '../../utils/properties/errorCodes';
7
import {StringUtils} from "../../utils/string-utils.class";
8
import {Filter, Value} from "../../searchPages/searchUtils/searchHelperClasses.class";
9
import {RangeFilter} from "../../utils/rangeFilter/rangeFilterHelperClasses.class";
10
import {SearchFields} from "../../utils/properties/searchFields";
11
import {NewSearchPageComponent} from "../../searchPages/searchUtils/newSearchPage.component";
12

    
13
declare var UIkit:any;
14

    
15
@Component({
16
    selector: 'claim-projects-search-form',
17

    
18
    templateUrl:'claimProjectSearchForm.component.html',
19

    
20
})
21
export class ClaimProjectsSearchFormComponent {
22
   ngOnInit() {
23
     // this.getFunders();
24
     // this.search(this.page, this.size);
25
   }
26
  //  @ViewChild (ModalLoading) loading : ModalLoading ;
27

    
28
  // @Input() public inline: boolean = false ; // for claimed started from landing pages
29
  public query = '';
30
  @Input() public selectedProjects:ClaimEntity[]=[] ;
31
  public elementRef;
32

    
33
  // public funders:string[];
34
  // public selectedFunderId:string ="0";
35
  // selectedFunderName:string ="Select funder:";
36
  @Output() projectSelected = new EventEmitter();
37
  @Input() public properties:EnvProperties;
38
  @Input() public inlineClaim:boolean=false;
39
  @Input()  localStoragePrefix:string = "";
40
  @Input() basketLimit;
41

    
42
  public errorCodes:ErrorCodes = new ErrorCodes();
43
  public projects:string[];
44
  public warningMessage = "";
45
  openaireResults:ClaimEntity[] = [];
46
  openaireResultsNum: number ;
47
  openaireResultsPage : number = 1;
48
  openaireResultsStatus:number = this.errorCodes.NONE;
49
  page : number = 1;
50
  size:number = 5;
51
  keyword:string = '';
52
  showResults = false;
53

    
54
  // public openaireRefineFields: string[] = ["relfunder",  "relproject", "resultbestaccessright", "instancetypename", "resultlanguagename", "community"];
55
  // public openaireRefineFieldsQuery: string = "&refine=true&fields=funder&fields=projectstartyear&fields=projectendyear&fields=projectecsc39";
56
  public refineFields: string[] = ["funder"];
57
  public refineFieldsQuery: string = "&refine=true&fields=funder";
58
  filters = [];
59
  prevFilters = [];
60
  // startYear = "";
61
  // endYear = "";
62
  public rangeFilters: RangeFilter[] = [];
63
  public searchFields: SearchFields = new SearchFields();
64
  public rangeFields:string[][] = this.searchFields.PROJECT_RANGE_FIELDS;
65
  constructor(private _service: ProjectService, private _projectService: SearchProjectsService, myElement: ElementRef) {
66
      this.elementRef = myElement;
67
    this.rangeFilters = RangeFilter.parse(this.rangeFields,"project");
68

    
69
  }
70

    
71

    
72
  search(page,size) {
73
    if(this.keyword.length == 0){
74
      this.showResults =false;
75
      return;
76
    }
77
    this.showResults =true;
78
    this.openaireResults = [];
79
    this.openaireResultsStatus = this.errorCodes.LOADING;
80
    this.prevFilters = this.filters;
81

    
82
    //searchProjects (params: string, refineParams:string, page: number, size: number, refineFields:string[] , properties:EnvProperties ):any {
83
    this._projectService.searchProjects(this.createOpenaireQueryParams(),(page==1)? this.refineFieldsQuery:null, page, size, (page==1)?this.refineFields:[], this.properties).subscribe(
84
      data => {
85
          if(data != null) {
86
              this.openaireResultsPage=page;
87
              this.openaireResultsNum = data[0];
88
              this.openaireResults =ClaimProjectsSearchFormComponent.openaire2ClaimEntity(data[1], this.properties);
89
              if(data[2] && data[2].length > 0){
90
                this.filters =  this.checkSelectedFilters( data[2], this.prevFilters);
91
              }
92

    
93
              this.openaireResultsStatus = this.errorCodes.DONE;
94
              if(this.openaireResultsNum == 0){
95
                this.openaireResultsStatus = this.errorCodes.NONE;
96
              }
97
          }else {
98
            this.openaireResultsStatus = this.errorCodes.ERROR;
99
          }
100
       },
101
      err => {
102
        this.openaireResultsStatus = this.errorCodes.ERROR;
103
        //console.log(err.status);
104
        ClaimProjectsSearchFormComponent.handleError("Error getting projects by keyword: "+this.keyword, err);
105
      }
106
    );
107
  }
108
// select(entity){
109
//   if(this.selectedProjects.length > 50){
110
//     UIkit.notification({
111
//         message : 'Your basket exceeds the number of allowed projects (50)',
112
//         status  : 'warning',
113
//         timeout : 1500,
114
//         pos     : 'top-center'
115
//     });
116
//     return;
117
//   }
118
//     this.query = "";
119
//     // this.searchTermStream.next(this.query); //clear
120
//     entity = entity.value;
121
//     // var project: ClaimProject = new ClaimProject();
122
//     // project.funderId = entity.funderId;
123
//     // project.funderName = entity.funderName;
124
//     // project.id = entity.id;
125
//     // project.projectName = entity.projectName;
126
//     // project.projectAcronym = entity.projectAcronym;
127
//     // project.startDate = entity.startDate;
128
//     // project.endDate = entity.endDate;
129
//     // project.code = entity.code;
130
//     // project.jurisdiction = entity.jurisdiction;
131
//     // project.fundingLevel0 = entity.fundingLevel0;
132
//
133
//
134
//     var index:number =this.selectedProjects.indexOf(entity);
135
//     var found:boolean = false;
136
//     this.warningMessage = "";
137
//
138
//     for (var _i = 0; _i < this.selectedProjects.length; _i++) {
139
//         let project = this.selectedProjects[_i];
140
//         if(entity.id == project.id){
141
//               found=true;
142
//               this.warningMessage = "Project already in your basket";
143
//         }
144
//      }
145
//
146
//     if (!found) {
147
//       this.selectedProjects.push(entity);
148
//       if(this.selectedProjects != null){
149
//         localStorage.setItem(this.localStoragePrefix + "projects", JSON.stringify(this.selectedProjects));
150
//       }
151
//       this.projectSelected.emit({
152
//         value: true
153
//       });
154
//
155
//     }
156
// }
157
/*  static showItem(item):string{
158
    return ((item.field[1]['@value'])?item.field[1]['@value']+" - ":"" ) + item.field[3]['@value'];
159
  }*/
160
  remove(item){
161
    let index:number =this.selectedProjects.indexOf(item);
162
     if (index > -1) {
163
        this.selectedProjects.splice(index, 1);
164
    }
165

    
166
  }
167
/*  handleClick(event){
168
   var clickedComponent = event.target;
169
   var inside = false;
170
   do {
171
       if (clickedComponent === this.elementRef.nativeElement) {
172
           inside = true;
173
       }
174
      clickedComponent = clickedComponent.parentNode;
175
   } while (clickedComponent);
176

    
177
  }*/
178
  static openaire2ClaimEntity(items, properties:EnvProperties){
179
    const projects: ClaimEntity[] = [];
180
    for(const item of items){
181
      const entity: ClaimEntity = new ClaimEntity();
182
      entity.project = new ClaimProject();
183
      entity.project.funderId = item.funderId;
184
      entity.project.funderName = item.funderShortname;
185
      entity.id = item.id;
186
      entity.project.url = properties.searchLinkToProject + entity.id;
187
      entity.title = item.title.name;
188
      entity.project.acronym = item.acronym;
189
      entity.project.startDate = item.startYear;
190
      entity.project.endDate = item.endYear;
191
      entity.project.code = item.code;
192
      entity.project.jurisdiction = item.jurisdiction;
193
      entity.project.fundingLevel0 = item.fundingLevel0;
194
      entity.type="project";
195
      projects.push(entity);
196
    }
197
    return projects;
198
  }
199
  private openaireResultsPageChange($event) {
200
     this.openaireResultsPage=$event.value;
201
     this.openaireResults = [];
202
     this.search(this.openaireResultsPage,this.size);
203
  }
204
  private static handleError(message: string, error) {
205
      console.error("Claim project search form (component): "+message, error);
206
  }
207

    
208

    
209
  createOpenaireQueryParams():string {
210
    let query = "";
211
    if(this.keyword.length > 0){
212
      query += "q=" + StringUtils.quote(StringUtils.URIEncode(this.keyword));
213
    }
214

    
215
    /*if(this.startYear.length > 0 ){
216
      query+='&fq=projectstartyear exact \"'+this.startYear+'\"'
217
    }
218
    if(this.endYear.length > 0 ){
219
      query+='&fq=projectendyear exact \"'+this.endYear+'\"'
220
    }*/
221
    let allFqs = "";
222
    for (let filter of this.filters){
223
      if(filter.countSelectedValues > 0){
224
        let count_selected=0;
225
        let fq = "";
226
        for (let value of filter.values){
227
          if(value.selected == true){
228
            count_selected++;
229
            fq+=(fq.length > 0 ? " " + filter.filterOperator + " ":"" ) + filter.filterId + " exact " + (StringUtils.quote(value.id));
230
          }
231
        }
232
        if(count_selected > 0){
233
          fq="&fq="+StringUtils.URIEncode(fq);
234
          allFqs += fq;
235
        }
236
      }
237
    }
238
    for (let i=0; i<this.rangeFilters.length; i++){
239
      let filter = this.rangeFilters[i];
240
      //selectedFromValue, selectedToValue, equalityOp, equalityOpFrom, equalityOpTo, filterOp ){
241
      allFqs+= NewSearchPageComponent.createRangeFilterQuery(this.rangeFields[i],filter.selectedFromValue, filter.selectedToValue, " within ", ">=" ,"<=", "and" )
242
    }
243
    return query+allFqs;
244

    
245
  }
246
  public yearChanged() {
247
    this.search(this.page, this.size);
248

    
249
  }
250

    
251
  filterChanged($event) {
252
    this.search(this.page, this.size);
253

    
254
  }
255
  public checkSelectedFilters(filters:Filter[], prevFilters:Filter[]){
256
    for(let i=0; i< filters.length ; i++){
257
      let filter:Filter = filters[i];
258
      filter.countSelectedValues = 0;
259
      let prevFilterSelectedValues:string[] = [];
260
      for(let j=0; j< prevFilters.length ; j++){
261
        if(filters[i].filterId == prevFilters[j].filterId){
262
          if(prevFilters[j].countSelectedValues >0){
263
            for(let filterValue of prevFilters[j].values) {
264
              if(filterValue.selected){
265
                prevFilterSelectedValues.push(filterValue.id);
266
              }
267
            }
268

    
269
          }
270
          break;
271
        }
272
      }
273
      for(let filterValue of filter.values) {
274
        if(prevFilterSelectedValues.indexOf(filterValue.id) > -1) {
275
          filterValue.selected = true;
276
          filter.countSelectedValues++;
277
        }
278

    
279
      }
280

    
281
    }
282
    return filters;
283
  }
284
  totalPages(totalResults: number): number {
285
    let totalPages:any = totalResults/(this.size);
286
    if(!(Number.isInteger(totalPages))) {
287
      totalPages = (parseInt(totalPages, 10) + 1);
288
    }
289
    return totalPages;
290
  }
291

    
292
  getSelectedValues(filter): any {
293
    var selected = [];
294
    if (filter.countSelectedValues > 0) {
295
      for (var i = 0; i < filter.values.length; i++) {
296
        if (filter.values[i].selected) {
297
          selected.push(filter.values[i]);
298
        }
299
      }
300
    }
301
    return selected;
302

    
303
  }
304
  dateFilterChanged(filter:RangeFilter) {
305
    if (filter.selectedFromValue && filter.selectedToValue) {
306
      filter.selectedFromAndToValues = filter.selectedFromValue + "-" + filter.selectedToValue;
307
    } else if (filter.selectedFromValue) {
308
      filter.selectedFromAndToValues = "From " + filter.selectedFromValue;
309
    } else if (filter.selectedToValue) {
310
      filter.selectedFromAndToValues = "Until " + filter.selectedToValue;
311
    }
312
    this.filterChanged(null);
313
  }
314

    
315
  private removeFilter(value: Value, filter: Filter) {
316
    filter.countSelectedValues--;
317
    if (value.selected == true) {
318
      value.selected = false;
319
    }
320
    // this.search(false);
321
    this.filterChanged(null);
322
  }
323

    
324
  public countFilters(): number {
325
    let filters = 0;
326
    for (let filter of this.filters) {
327
      if (filter.countSelectedValues > 0) {
328
        filters += filter.countSelectedValues;
329
      }
330
    }
331
    for (let filter of this.rangeFilters) {
332
      if (filter.selectedFromValue || filter.selectedToValue) {
333
        filters += 1;
334
      }
335
    }
336
    return filters;
337
  }
338

    
339
  private clearFilters() {
340
    for (let i = 0; i < this.filters.length; i++) {
341
      for (let j = 0; j < this.filters[i].countSelectedValues; j++) {
342
        if (this.filters[i].values[j].selected) {
343
          this.filters[i].values[j].selected = false;
344
        }
345
        this.filters[i].countSelectedValues = 0;
346
      }
347
    }
348
    for(let filter of this.rangeFilters){
349
      this.removeRangeFilter(filter);
350
    }
351
    this.filterChanged(null);
352
  }
353
  public removeRangeFilter(filter: RangeFilter) {
354
    filter.selectedFromValue = null;
355
    filter.selectedToValue = null;
356
    filter.selectedFromAndToValues = null;
357
    this.filterChanged(null);
358
  }
359
}
(7-7/15)