Project

General

Profile

1
import {Component, Input, ViewChild} from '@angular/core';
2
import {Observable}       from 'rxjs/Observable';
3
import { Router, ActivatedRoute} from '@angular/router';
4
import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class';
5
import {SearchProjectsService} from '../../services/searchProjects.service';
6
import {SearchResult}     from '../../utils/entities/searchResult';
7
import {ErrorCodes} from '../../utils/properties/errorCodes';
8
import {AdvancedSearchPageComponent} from '../searchUtils/advancedSearchPage.component';
9
import {SearchFields, FieldDetails} from '../../utils/properties/searchFields';
10
import {SearchUtilsClass } from '../searchUtils/searchUtils.class';
11
import{EnvProperties} from '../../utils/properties/env-properties';
12

    
13
@Component({
14
    selector: 'advanced-search-projects',
15
    template: `
16
    <advanced-search-page pageTitle="Advanced Search for Projects" entityType="project"
17
                 type = "projects"
18
                 [(results)] = "results"
19
                 [(searchUtils)] = "searchUtils"
20
                 [(fieldIds)]="fieldIds" [(fieldIdsMap)]="fieldIdsMap"   [(selectedFields)]="selectedFields"
21
                 (queryChange)="queryChanged($event)"
22
                 [csvParams]="csvParams" csvPath="projects" simpleSearchLink="/search/find/projects"
23
                 [disableForms]="disableForms"
24
                 [loadPaging]="loadPaging"
25
                 [oldTotalResults]="oldTotalResults"  [piwikSiteId]=piwikSiteId
26
                 searchFormClass="projectsSearchForm">
27
    </advanced-search-page>
28

    
29
    `
30
 })
31

    
32
export class AdvancedSearchProjectsComponent {
33
  private errorCodes: ErrorCodes;
34
@Input() piwikSiteId = null;
35
  public results =[];
36
  public filters =[];
37

    
38
  public searchUtils:SearchUtilsClass = new SearchUtilsClass();
39
  public searchFields:SearchFields = new SearchFields();
40

    
41
  public fieldIds:  string[] = this.searchFields.PROJECT_ADVANCED_FIELDS;
42
  public fieldIdsMap = this.searchFields.PROJECT_FIELDS;
43
  public selectedFields:AdvancedField[] =  [];
44
  properties:EnvProperties;
45

    
46
  @ViewChild (AdvancedSearchPageComponent) searchPage : AdvancedSearchPageComponent ;
47
  public resourcesQuery = "(oaftype exact project)";
48
  public csvParams: string;
49
  public disableForms: boolean = false;
50
  public loadPaging: boolean = true;
51
  public oldTotalResults: number = 0;
52
  public pagingLimit: number = 0;
53
  public isPiwikEnabled;
54

    
55
  constructor (private route: ActivatedRoute, private _searchProjectsService: SearchProjectsService ) {
56

    
57
    this.results =[];
58
    this.errorCodes = new ErrorCodes();
59
    this.searchUtils.status = this.errorCodes.LOADING;
60

    
61

    
62

    
63

    
64
  }
65
  ngOnInit() {
66
    this.route.data
67
      .subscribe((data: { envSpecific: EnvProperties }) => {
68
        this.properties= data.envSpecific;
69
        this.searchUtils.baseUrl = data.envSpecific.searchLinkToAdvancedProjects;
70
         this.pagingLimit = data.envSpecific.pagingLimit;
71
         this.isPiwikEnabled = data.envSpecific.enablePiwikTrack;
72

    
73
      });
74
    //var errorCodes:ErrorCodes = new ErrorCodes();
75
    this.searchUtils.status = this.errorCodes.LOADING;
76
    this.sub =  this.route.queryParams.subscribe(params => {
77
      if(params['page'] && this.searchUtils.page != params['page']) {
78
        this.loadPaging = false;
79
        this.oldTotalResults = this.searchUtils.totalResults;
80
      }
81

    
82
      let page = (params['page']=== undefined)?1:+params['page'];
83
      this.searchUtils.page = ( page <= 0 ) ? 1 : page;
84
      this.searchPage.fieldIds = this.fieldIds;
85
      this.selectedFields =[];
86
      this.searchPage.selectedFields = this.selectedFields;
87
      this.searchPage.fieldIdsMap = this.fieldIdsMap;
88
      this.searchPage.getSelectedFiltersFromUrl(params);
89
      this.getResults(this.searchPage.createQueryParameters(),  this.searchUtils.page, this.searchUtils.size);
90

    
91
    });
92
  }
93
  ngOnDestroy() {
94
    this.sub.unsubscribe();
95
  }
96
  sub: any;
97
  public getResults(parameters:string, page: number, size: number){
98
    if(page > this.pagingLimit) {
99
      size=0;
100
    }
101
    if(page <= this.pagingLimit || this.searchUtils.status == this.errorCodes.LOADING) {
102
      if(parameters!= null && parameters != ''  ) {
103
        this.csvParams ="&fq=( "+this.resourcesQuery + "and (" + parameters + "))";
104
      }else{
105
        this.csvParams ="&fq="+this.resourcesQuery;
106
      }
107

    
108
      //var errorCodes:ErrorCodes = new ErrorCodes();
109
      this.searchUtils.status = this.errorCodes.LOADING;
110
      //this.searchPage.openLoading();
111
      this.disableForms = true;
112
      this.results = [];
113
      this.searchUtils.totalResults = 0;
114

    
115
      console.info("Advanced Search for Publications: Execute search query "+parameters);
116
       this._searchProjectsService.advancedSearchProjects(parameters,  page, size, this.properties).subscribe(
117
          data => {
118
              this.searchUtils.totalResults = data[0];
119
              console.info("Advanced Search for Projects total="+this.searchUtils.totalResults);
120
              this.results = data[1];
121
              this.searchPage.updateBaseUrlWithParameters();
122
              //var errorCodes:ErrorCodes = new ErrorCodes();
123
              this.searchUtils.status = this.errorCodes.DONE;
124
              if(this.searchUtils.totalResults == 0 ){
125
                this.searchUtils.status = this.errorCodes.NONE;
126
              }
127
              //this.searchPage.closeLoading();
128
              this.disableForms = false;
129

    
130
              if(this.searchUtils.status == this.errorCodes.DONE) {
131
                // Page out of limit!!!
132
                let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size);
133
                if(!(Number.isInteger(totalPages))) {
134
                    totalPages = (parseInt(totalPages, 10) + 1);
135
                }
136
                if(totalPages < page) {
137
                  this.searchUtils.totalResults = 0;
138
                  this.searchUtils.status = this.errorCodes.OUT_OF_BOUND;
139
                }
140
              }
141
          },
142
          err => {
143
              console.log(err);
144
              console.info("error");
145
              //TODO check erros (service not available, bad request)
146
              // if( ){
147
              //   this.searchUtils.status = errorCodes.ERROR;
148
              // }
149
              //var errorCodes:ErrorCodes = new ErrorCodes();
150
              //this.searchUtils.status = errorCodes.NOT_AVAILABLE;
151
              if(err.status == '404') {
152
                this.searchUtils.status = this.errorCodes.NOT_FOUND;
153
              } else if(err.status == '500') {
154
                this.searchUtils.status = this.errorCodes.ERROR;
155
              } else {
156
                this.searchUtils.status = this.errorCodes.NOT_AVAILABLE;
157
              }
158

    
159
              //this.searchPage.closeLoading();
160
              this.disableForms = false;
161

    
162
          }
163
      );
164
    }
165
  }
166
  private setFilters(){
167
    //TODO set filters from
168
  }
169

    
170
  public queryChanged($event) {
171
    this.loadPaging = true;
172

    
173
    var parameters = $event.value;
174
    this.getResults(parameters, this.searchUtils.page,this.searchUtils.size);
175
    console.info("queryChanged: Execute search query "+parameters);
176

    
177
  }
178

    
179

    
180
}
(9-9/14)