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 {SearchSoftwareService} from '../../services/searchSoftware.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

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

    
31
    `
32
 })
33

    
34
export class AdvancedSearchSoftwareComponent {
35
  private errorCodes: ErrorCodes;
36
@Input() piwikSiteId = null;
37
@Input() connectCommunityId: string;
38
  public results =[];
39
  public filters =[];
40

    
41
  public searchUtils:SearchUtilsClass = new SearchUtilsClass();
42
  public searchFields:SearchFields = new SearchFields();
43

    
44
  public fieldIds:  string[] = this.searchFields.RESULT_ADVANCED_FIELDS;
45
  public fieldIdsMap= this.searchFields.RESULT_FIELDS;
46
  public selectedFields:AdvancedField[] =  [];
47

    
48
  @ViewChild (AdvancedSearchPageComponent) searchPage : AdvancedSearchPageComponent ;
49
  public resourcesQuery = "( (oaftype exact result) and (resulttypeid exact software)  )";
50
  public csvParams: string;
51
  public disableForms: boolean = false;
52
  public loadPaging: boolean = true;
53
  public oldTotalResults: number = 0;
54
  public pagingLimit: number = 0;
55
  public isPiwikEnabled;
56
  public sort: boolean = true;
57
  properties:EnvProperties;
58

    
59
  constructor (private route: ActivatedRoute, private _searchSoftwareService: SearchSoftwareService ) {
60
    this.results =[];
61
    this.errorCodes = new ErrorCodes();
62
    this.searchUtils.status = this.errorCodes.LOADING;
63

    
64

    
65

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

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

    
84
      let page = (params['page']=== undefined)?1:+params['page'];
85
      this.searchUtils.page = ( page <= 0 ) ? 1 : page;
86

    
87
      this.searchUtils.size = (params['size']=== undefined)?10:+params['size'];
88
      if(this.searchUtils.size != 5 && this.searchUtils.size != 10 && this.searchUtils.size != 20 && this.searchUtils.size != 50) {
89
        this.searchUtils.size = 10;
90
      }
91
      this.searchUtils.sortBy = (params['sortBy'])?params['sortBy']:'';
92
      if(this.searchUtils.sortBy && this.searchUtils.sortBy != "resultdateofacceptance,descending") {
93
        this.searchUtils.sortBy = "";
94
      }
95

    
96
      this.searchPage.fieldIds = this.fieldIds;
97
      this.selectedFields =[];
98
      this.searchPage.selectedFields = this.selectedFields;
99
      this.searchPage.fieldIdsMap = this.fieldIdsMap;
100
      this.searchPage.connectCommunityId = this.connectCommunityId;
101
      this.searchPage.getSelectedFiltersFromUrl(params);
102
      this.getResults(this.searchPage.createQueryParameters(),  this.searchUtils.page, this.searchUtils.size, this.searchUtils.sortBy);
103

    
104
    });
105
  }
106
  ngOnDestroy() {
107
    this.sub.unsubscribe();
108
  }
109
  sub: any;
110
  public getResults(parameters:string, page: number, size: number, sortBy: string){
111
    if(page >this.pagingLimit) {
112
      size=0;
113
    }
114
    if(page <= this.pagingLimit || this.searchUtils.status == this.errorCodes.LOADING) {
115
      if(parameters!= null && parameters != ''  ) {
116
        this.csvParams ="&fq=( "+this.resourcesQuery + "and (" + parameters + "))";
117
      }else{
118
        this.csvParams ="&fq="+this.resourcesQuery;
119
      }
120

    
121
      //var errorCodes:ErrorCodes = new ErrorCodes();
122
      this.searchUtils.status = this.errorCodes.LOADING;
123
      //this.searchPage.openLoading();
124
      this.disableForms = true;
125
      this.results = [];
126
      this.searchUtils.totalResults = 0;
127

    
128
      console.info("Advanced Search for Software: Execute search query "+parameters);
129
       this._searchSoftwareService.advancedSearchSoftware(parameters, page, size, sortBy, this.properties).subscribe(
130
          data => {
131
              this.searchUtils.totalResults = data[0];
132
              console.info("search Software total="+this.searchUtils.totalResults);
133
              this.results = data[1];
134
              this.searchPage.updateBaseUrlWithParameters();
135
              //var errorCodes:ErrorCodes = new ErrorCodes();
136
              this.searchUtils.status = this.errorCodes.DONE;
137
              if(this.searchUtils.totalResults == 0 ){
138
                this.searchUtils.status = this.errorCodes.NONE;
139
              }
140
              //this.searchPage.closeLoading();
141
              this.disableForms = false;
142

    
143
              if(this.searchUtils.status == this.errorCodes.DONE) {
144
                // Page out of limit!!!
145
                let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size);
146
                if(!(Number.isInteger(totalPages))) {
147
                    totalPages = (parseInt(totalPages, 10) + 1);
148
                }
149
                if(totalPages < page) {
150
                  this.searchUtils.totalResults = 0;
151
                  this.searchUtils.status = this.errorCodes.OUT_OF_BOUND;
152
                }
153
              }
154
          },
155
          err => {
156
              console.log(err);
157
              console.info("error");
158
              //TODO check erros (service not available, bad request)
159
              // if( ){
160
              //   this.searchUtils.status = errorCodes.ERROR;
161
              // }
162
              //var errorCodes:ErrorCodes = new ErrorCodes();
163
              //this.searchUtils.status = errorCodes.NOT_AVAILABLE;
164
              if(err.status == '404') {
165
                this.searchUtils.status = this.errorCodes.NOT_FOUND;
166
              } else if(err.status == '500') {
167
                this.searchUtils.status = this.errorCodes.ERROR;
168
              } else {
169
                this.searchUtils.status = this.errorCodes.NOT_AVAILABLE;
170
              }
171

    
172
              //this.searchPage.closeLoading();
173
              this.disableForms = false;
174
          }
175
      );
176
    }
177
  }
178
  private setFilters(){
179
    //TODO set filters from
180
  }
181

    
182
  public queryChanged($event) {
183
    this.loadPaging = true;
184

    
185
    var parameters = $event.value;
186
    this.getResults(parameters, this.searchUtils.page,this.searchUtils.size, this.searchUtils.sortBy);
187
    console.info("queryChanged: Execute search query "+parameters);
188

    
189
  }
190

    
191

    
192
}
(13-13/14)