Project

General

Profile

1 61381 k.triantaf
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
import {Subscriber} from "rxjs";
13
14
declare var UIkit:any;
15
16
@Component({
17
    selector: 'claim-projects-search-form',
18
19
    templateUrl:'claimProjectSearchForm.component.html',
20
21
})
22
export class ClaimProjectsSearchFormComponent {
23
   ngOnInit() {
24
     // this.getFunders();
25
     // this.search(this.page, this.size);
26
   }
27
  //  @ViewChild (ModalLoading) loading : ModalLoading ;
28
29
  // @Input() public inline: boolean = false ; // for claimed started from landing pages
30
  public query = '';
31
  @Input() public selectedProjects:ClaimEntity[]=[] ;
32
  public elementRef;
33
34
  // public funders:string[];
35
  // public selectedFunderId:string ="0";
36
  // selectedFunderName:string ="Select funder:";
37
  @Output() projectSelected = new EventEmitter();
38
  @Input() public properties:EnvProperties;
39
  @Input() public inlineClaim:boolean=false;
40
  @Input()  localStoragePrefix:string = "";
41
  @Input() basketLimit;
42
43
  public errorCodes:ErrorCodes = new ErrorCodes();
44
  public projects:string[];
45
  public warningMessage = "";
46
  openaireResults:ClaimEntity[] = [];
47
  openaireResultsNum: number ;
48
  openaireResultsPage : number = 1;
49
  openaireResultsStatus:number = this.errorCodes.NONE;
50
  page : number = 1;
51
  size:number = 5;
52
  keyword:string = '';
53
  showResults = false;
54
55
  // public openaireRefineFields: string[] = ["relfunder",  "relproject", "resultbestaccessright", "instancetypename", "resultlanguagename", "community"];
56
  // public openaireRefineFieldsQuery: string = "&refine=true&fields=funder&fields=projectstartyear&fields=projectendyear&fields=projectecsc39";
57
  public refineFields: string[] = ["funder"];
58
  public refineFieldsQuery: string = "&refine=true&fields=funder";
59
  filters = [];
60
  prevFilters = [];
61
  // startYear = "";
62
  // endYear = "";
63
  public rangeFilters: RangeFilter[] = [];
64
  public searchFields: SearchFields = new SearchFields();
65
  public rangeFields:string[][] = this.searchFields.PROJECT_RANGE_FIELDS;
66
  constructor(private _service: ProjectService, private _projectService: SearchProjectsService, myElement: ElementRef) {
67
      this.elementRef = myElement;
68
    this.rangeFilters = RangeFilter.parse(this.rangeFields,"project");
69
70
  }
71
  sub;
72
  ngOnDestroy() {
73
    if (this.sub  instanceof Subscriber) {
74
      this.sub.unsubscribe();
75
    }
76
  }
77
78
  search(page,size) {
79
    if(this.keyword.length == 0){
80
      this.showResults =false;
81
      return;
82
    }
83
    this.showResults =true;
84
    this.openaireResults = [];
85
    this.openaireResultsStatus = this.errorCodes.LOADING;
86
    this.prevFilters = this.filters;
87
88
    //searchProjects (params: string, refineParams:string, page: number, size: number, refineFields:string[] , properties:EnvProperties ):any {
89
    this.sub = this._projectService.searchProjects(this.createOpenaireQueryParams(),(page==1)? this.refineFieldsQuery:null, page, size, (page==1)?this.refineFields:[], this.properties).subscribe(
90
      data => {
91
          if(data != null) {
92
              this.openaireResultsPage=page;
93
              this.openaireResultsNum = data[0];
94
              this.openaireResults =ClaimProjectsSearchFormComponent.openaire2ClaimEntity(data[1], this.properties);
95
              if(data[2] && data[2].length > 0){
96
                this.filters =  this.checkSelectedFilters( data[2], this.prevFilters);
97
              }
98
99
              this.openaireResultsStatus = this.errorCodes.DONE;
100
              if(this.openaireResultsNum == 0){
101
                this.openaireResultsStatus = this.errorCodes.NONE;
102
              }
103
          }else {
104
            this.openaireResultsStatus = this.errorCodes.ERROR;
105
          }
106
       },
107
      err => {
108
        this.openaireResultsStatus = this.errorCodes.ERROR;
109
        //console.log(err.status);
110
        ClaimProjectsSearchFormComponent.handleError("Error getting projects by keyword: "+this.keyword, err);
111
      }
112
    );
113
  }
114
// select(entity){
115
//   if(this.selectedProjects.length > 50){
116
//     UIkit.notification({
117
//         message : 'Your basket exceeds the number of allowed projects (50)',
118
//         status  : 'warning',
119
//         timeout : 1500,
120
//         pos     : 'top-center'
121
//     });
122
//     return;
123
//   }
124
//     this.query = "";
125
//     // this.searchTermStream.next(this.query); //clear
126
//     entity = entity.value;
127
//     // var project: ClaimProject = new ClaimProject();
128
//     // project.funderId = entity.funderId;
129
//     // project.funderName = entity.funderName;
130
//     // project.id = entity.id;
131
//     // project.projectName = entity.projectName;
132
//     // project.projectAcronym = entity.projectAcronym;
133
//     // project.startDate = entity.startDate;
134
//     // project.endDate = entity.endDate;
135
//     // project.code = entity.code;
136
//     // project.jurisdiction = entity.jurisdiction;
137
//     // project.fundingLevel0 = entity.fundingLevel0;
138
//
139
//
140
//     var index:number =this.selectedProjects.indexOf(entity);
141
//     var found:boolean = false;
142
//     this.warningMessage = "";
143
//
144
//     for (var _i = 0; _i < this.selectedProjects.length; _i++) {
145
//         let project = this.selectedProjects[_i];
146
//         if(entity.id == project.id){
147
//               found=true;
148
//               this.warningMessage = "Project already in your basket";
149
//         }
150
//      }
151
//
152
//     if (!found) {
153
//       this.selectedProjects.push(entity);
154
//       if(this.selectedProjects != null){
155
//         localStorage.setItem(this.localStoragePrefix + "projects", JSON.stringify(this.selectedProjects));
156
//       }
157
//       this.projectSelected.emit({
158
//         value: true
159
//       });
160
//
161
//     }
162
// }
163
/*  static showItem(item):string{
164
    return ((item.field[1]['@value'])?item.field[1]['@value']+" - ":"" ) + item.field[3]['@value'];
165
  }*/
166
  remove(item){
167
    let index:number =this.selectedProjects.indexOf(item);
168
     if (index > -1) {
169
        this.selectedProjects.splice(index, 1);
170
    }
171
172
  }
173
/*  handleClick(event){
174
   var clickedComponent = event.target;
175
   var inside = false;
176
   do {
177
       if (clickedComponent === this.elementRef.nativeElement) {
178
           inside = true;
179
       }
180
      clickedComponent = clickedComponent.parentNode;
181
   } while (clickedComponent);
182
183
  }*/
184
  static openaire2ClaimEntity(items, properties:EnvProperties){
185
    const projects: ClaimEntity[] = [];
186
    for(const item of items){
187
      const entity: ClaimEntity = new ClaimEntity();
188
      entity.project = new ClaimProject();
189
      entity.project.funderId = item.funderId;
190
      entity.project.funderName = item.funderShortname;
191
      entity.id = item.id;
192
      entity.project.url = properties.searchLinkToProject + entity.id;
193
      entity.title = item.title.name;
194
      entity.project.acronym = item.acronym;
195
      entity.project.startDate = item.startYear;
196
      entity.project.endDate = item.endYear;
197
      entity.project.code = item.code;
198
      entity.project.jurisdiction = item.jurisdiction;
199
      entity.project.fundingLevel0 = item.fundingLevel0;
200
      entity.type="project";
201
      projects.push(entity);
202
    }
203
    return projects;
204
  }
205
  private openaireResultsPageChange($event) {
206
     this.openaireResultsPage=$event.value;
207
     this.openaireResults = [];
208
     this.search(this.openaireResultsPage,this.size);
209
  }
210
  private static handleError(message: string, error) {
211
      console.error("Claim project search form (component): "+message, error);
212
  }
213
214
215
  createOpenaireQueryParams():string {
216
    let query = "";
217
    if(this.keyword.length > 0){
218
      query += "q=" + StringUtils.quote(StringUtils.URIEncode(this.keyword));
219
    }
220
221
    /*if(this.startYear.length > 0 ){
222
      query+='&fq=projectstartyear exact \"'+this.startYear+'\"'
223
    }
224
    if(this.endYear.length > 0 ){
225
      query+='&fq=projectendyear exact \"'+this.endYear+'\"'
226
    }*/
227
    let allFqs = "";
228
    for (let filter of this.filters){
229
      if(filter.countSelectedValues > 0){
230
        let count_selected=0;
231
        let fq = "";
232
        for (let value of filter.values){
233
          if(value.selected == true){
234
            count_selected++;
235
            fq+=(fq.length > 0 ? " " + filter.filterOperator + " ":"" ) + filter.filterId + " exact " + (StringUtils.quote(value.id));
236
          }
237
        }
238
        if(count_selected > 0){
239
          fq="&fq="+StringUtils.URIEncode(fq);
240
          allFqs += fq;
241
        }
242
      }
243
    }
244
    for (let i=0; i<this.rangeFilters.length; i++){
245
      let filter = this.rangeFilters[i];
246
      //selectedFromValue, selectedToValue, equalityOp, equalityOpFrom, equalityOpTo, filterOp ){
247
      allFqs+= NewSearchPageComponent.createRangeFilterQuery(this.rangeFields[i],filter.selectedFromValue, filter.selectedToValue, " within ", ">=" ,"<=", "and" )
248
    }
249
    return query+allFqs;
250
251
  }
252
  public yearChanged() {
253
    this.search(this.page, this.size);
254
255
  }
256
257
  filterChanged($event) {
258
    this.search(this.page, this.size);
259
260
  }
261
  public checkSelectedFilters(filters:Filter[], prevFilters:Filter[]){
262
    for(let i=0; i< filters.length ; i++){
263
      let filter:Filter = filters[i];
264
      filter.countSelectedValues = 0;
265
      let prevFilterSelectedValues:string[] = [];
266
      for(let j=0; j< prevFilters.length ; j++){
267
        if(filters[i].filterId == prevFilters[j].filterId){
268
          if(prevFilters[j].countSelectedValues >0){
269
            for(let filterValue of prevFilters[j].values) {
270
              if(filterValue.selected){
271
                prevFilterSelectedValues.push(filterValue.id);
272
              }
273
            }
274
275
          }
276
          break;
277
        }
278
      }
279
      for(let filterValue of filter.values) {
280
        if(prevFilterSelectedValues.indexOf(filterValue.id) > -1) {
281
          filterValue.selected = true;
282
          filter.countSelectedValues++;
283
        }
284
285
      }
286
287
    }
288
    return filters;
289
  }
290
  totalPages(totalResults: number): number {
291
    let totalPages:any = totalResults/(this.size);
292
    if(!(Number.isInteger(totalPages))) {
293
      totalPages = (parseInt(totalPages, 10) + 1);
294
    }
295
    return totalPages;
296
  }
297
298
  getSelectedValues(filter): any {
299
    var selected = [];
300
    if (filter.countSelectedValues > 0) {
301
      for (var i = 0; i < filter.values.length; i++) {
302
        if (filter.values[i].selected) {
303
          selected.push(filter.values[i]);
304
        }
305
      }
306
    }
307
    return selected;
308
309
  }
310
  dateFilterChanged(filter:RangeFilter) {
311
    if (filter.selectedFromValue && filter.selectedToValue) {
312
      filter.selectedFromAndToValues = filter.selectedFromValue + "-" + filter.selectedToValue;
313
    } else if (filter.selectedFromValue) {
314
      filter.selectedFromAndToValues = "From " + filter.selectedFromValue;
315
    } else if (filter.selectedToValue) {
316
      filter.selectedFromAndToValues = "Until " + filter.selectedToValue;
317
    }
318
    this.filterChanged(null);
319
  }
320
321
  private removeFilter(value: Value, filter: Filter) {
322
    filter.countSelectedValues--;
323
    if (value.selected == true) {
324
      value.selected = false;
325
    }
326
    // this.search(false);
327
    this.filterChanged(null);
328
  }
329
330
  public countFilters(): number {
331
    let filters = 0;
332
    for (let filter of this.filters) {
333
      if (filter.countSelectedValues > 0) {
334
        filters += filter.countSelectedValues;
335
      }
336
    }
337
    for (let filter of this.rangeFilters) {
338
      if (filter.selectedFromValue || filter.selectedToValue) {
339
        filters += 1;
340
      }
341
    }
342
    return filters;
343
  }
344
345
  private clearFilters() {
346
    for (let i = 0; i < this.filters.length; i++) {
347
      for (let j = 0; j < this.filters[i].countSelectedValues; j++) {
348
        if (this.filters[i].values[j].selected) {
349
          this.filters[i].values[j].selected = false;
350
        }
351
        this.filters[i].countSelectedValues = 0;
352
      }
353
    }
354
    for(let filter of this.rangeFilters){
355
      this.removeRangeFilter(filter);
356
    }
357
    this.filterChanged(null);
358
  }
359
  public removeRangeFilter(filter: RangeFilter) {
360
    filter.selectedFromValue = null;
361
    filter.selectedToValue = null;
362
    filter.selectedFromAndToValues = null;
363
    this.filterChanged(null);
364
  }
365
}