2020-02-19 16:35:48 +01:00
import { Component , EventEmitter , Input , Output , ViewChild } from '@angular/core' ;
2020-02-11 15:56:20 +01:00
import { ActivatedRoute } from '@angular/router' ;
import { AdvancedField } from './searchUtils/searchHelperClasses.class' ;
import { SearchDataprovidersService } from '../services/searchDataproviders.service' ;
import { ErrorCodes } from '../utils/properties/errorCodes' ;
import { ErrorMessagesComponent } from '../utils/errorMessages.component' ;
import { SearchFields } from '../utils/properties/searchFields' ;
import { SearchCustomFilter , SearchUtilsClass } from './searchUtils/searchUtils.class' ;
import { EnvProperties } from '../utils/properties/env-properties' ;
import { NewSearchPageComponent } from "./searchUtils/newSearchPage.component" ;
2020-02-25 16:40:56 +01:00
import { DatasourcesHelperClass } from "./searchUtils/datasourcesHelper.class" ;
2020-02-11 15:56:20 +01:00
@Component ( {
selector : 'search-dataproviders' ,
template : `
< new - search - page
2020-02-25 16:40:56 +01:00
pageTitle = "{{(simpleView?'':'Advanced ')}} Search for {{ pageTitle }}"
2020-02-24 14:45:22 +01:00
entityType = "dataprovider"
2020-02-11 15:56:20 +01:00
type = "content providers"
2020-02-19 16:35:48 +01:00
[ results ] = "results"
[ searchUtils ] = "searchUtils"
[ fieldIds ] = "fieldIds" [ fieldIdsMap ] = "fieldIdsMap" [ selectedFields ] = "selectedFields"
2020-02-24 14:45:22 +01:00
[ csvParams ] = "csvParams" csvPath = "datasources"
2020-02-11 15:56:20 +01:00
[ simpleSearchLink ] = "simpleSearchLink" [ advancedSearchLink ] = "advancedSearchLink"
[ disableForms ] = "disableForms"
[ loadPaging ] = "loadPaging"
[ oldTotalResults ] = "oldTotalResults"
2020-02-19 16:35:48 +01:00
[ openaireLink ] = openaireLink
[ includeOnlyResultsAndFilter ] = "includeOnlyResultsAndFilter"
2020-02-11 15:56:20 +01:00
[ piwikSiteId ] = piwikSiteId [ hasPrefix ] = "hasPrefix"
2020-03-12 18:03:35 +01:00
[ searchFormClass ] = "type!='deposit'?'datasourcesSearchForm':''"
2020-06-29 13:10:32 +02:00
[ entitiesSelection ] = "type=='all'" [ showAdvancedSearchLink ] = "showAdvancedSearchLink"
2020-02-19 16:35:48 +01:00
[ filters ] = "filters"
2020-03-26 13:18:18 +01:00
[ simpleView ] = "simpleView" formPlaceholderText = "Search by name, description, subject..."
2020-03-12 18:03:35 +01:00
[ showResultCount ] = "(type=='all' || type == 'deposit')" [ showLastIndex ] = "type!='deposit'"
2020-05-05 10:46:10 +02:00
[ tableViewLink ] = "tableViewLink"
[ sort ] = "false" >
2020-03-12 18:03:35 +01:00
2020-02-11 15:56:20 +01:00
< / n e w - s e a r c h - p a g e >
2020-06-10 13:05:59 +02:00
<!-- [ filters ] = "filters" -- >
2020-02-11 15:56:20 +01:00
`
} )
export class SearchDataProvidersComponent {
private errorCodes : ErrorCodes ;
private errorMessages : ErrorMessagesComponent ;
@Input ( ) piwikSiteId = null ;
@Input ( ) customFilter :SearchCustomFilter = null ;
2020-03-12 18:03:35 +01:00
@Input ( ) tableViewLink ;
2020-02-11 15:56:20 +01:00
public results = [ ] ;
public filters = [ ] ;
public searchUtils :SearchUtilsClass = new SearchUtilsClass ( ) ;
public searchFields :SearchFields = new SearchFields ( ) ;
public fieldIds : string [ ] = this . searchFields . DATASOURCE_ADVANCED_FIELDS ;
public fieldIdsMap = this . searchFields . DATASOURCE_FIELDS ;
public selectedFields :AdvancedField [ ] = [ ] ;
public resourcesQuery = "(oaftype exact datasource)" ;
public csvParams : string ;
public disableForms : boolean = false ;
public loadPaging : boolean = true ;
public oldTotalResults : number = 0 ;
public pagingLimit : number = 0 ;
public isPiwikEnabled ;
properties :EnvProperties ;
2020-03-12 18:03:35 +01:00
@Input ( ) type : "all" | "registries" | "journals" | "compatible" | "deposit" = "all" ;
public refineFields : string [ ] ;
pageTitle ;
2020-02-11 15:56:20 +01:00
@ViewChild ( NewSearchPageComponent ) searchPage : NewSearchPageComponent ;
@Input ( ) simpleView : boolean = true ;
2020-02-19 16:35:48 +01:00
@Input ( ) simpleSearchLink : string = "" ;
2020-02-11 15:56:20 +01:00
advancedSearchLink : string = "" ;
@Input ( ) hasPrefix : boolean = true ;
@Input ( ) openaireLink : string ;
2020-02-19 16:35:48 +01:00
@Input ( ) includeOnlyResultsAndFilter : boolean = false ;
@Output ( ) searchPageUpdates = new EventEmitter ( ) ;
2020-06-29 13:10:32 +02:00
@Input ( ) showAdvancedSearchLink :boolean ;
2020-02-11 15:56:20 +01:00
constructor ( private route : ActivatedRoute , private _searchDataProvidersService : SearchDataprovidersService ) {
this . results = [ ] ;
this . errorCodes = new ErrorCodes ( ) ;
this . errorMessages = new ErrorMessagesComponent ( ) ;
this . searchUtils . status = this . errorCodes . LOADING ;
}
ngOnInit() {
2020-03-12 18:03:35 +01:00
this . refineFields = DatasourcesHelperClass . getrefineFields ( this . type ) ;
this . pageTitle = DatasourcesHelperClass . getTitle ( this . type ) ;
2020-06-29 13:10:32 +02:00
if ( this . showAdvancedSearchLink == null ) {
this . showAdvancedSearchLink = ( this . type == "all" ) ;
}
2020-02-11 15:56:20 +01:00
this . route . data
. subscribe ( ( data : { envSpecific : EnvProperties } ) = > {
this . properties = data . envSpecific ;
2020-02-19 16:35:48 +01:00
if ( ! this . simpleSearchLink ) {
2020-02-25 16:40:56 +01:00
this . simpleSearchLink = this . properties . searchLinkToDataProviders ;
2020-02-19 16:35:48 +01:00
} this . advancedSearchLink = this . properties . searchLinkToAdvancedDataProviders ;
2020-02-11 15:56:20 +01:00
this . searchUtils . baseUrl = ( this . simpleView ) ? this . simpleSearchLink :this.advancedSearchLink ;
this . pagingLimit = data . envSpecific . pagingLimit ;
this . isPiwikEnabled = data . envSpecific . enablePiwikTrack ;
} ) ;
2020-02-25 16:40:56 +01:00
let firstLoad = true ;
this . filters = DatasourcesHelperClass . createFilters ( this . type ) ;
this . sub = this . route . queryParams . subscribe ( params = > {
2020-02-11 15:56:20 +01:00
this . loadPaging = true ;
if ( params [ 'page' ] && this . searchUtils . page != params [ 'page' ] ) {
this . loadPaging = false ;
this . oldTotalResults = this . searchUtils . totalResults ;
}
var refine = true ;
if ( this . searchUtils . page != ( ( params [ 'page' ] === undefined ) ? 1 : + params [ 'page' ] ) && this . filters && ! firstLoad ) {
refine = false ;
}
let page = ( params [ 'page' ] === undefined ) ? 0 : + params [ 'page' ] ;
this . searchUtils . page = ( page < 1 ) ? 1 : page ;
this . searchUtils . size = ( params [ 'size' ] === undefined ) ? 10 : + params [ 'size' ] ;
if ( this . searchUtils . size != 5 && this . searchUtils . size != 10 && this . searchUtils . size != 20 && this . searchUtils . size != 50 ) {
this . searchUtils . size = 10 ;
}
this . searchPage . fieldIds = this . fieldIds ;
this . selectedFields = [ ] ;
2020-03-12 18:03:35 +01:00
if ( this . type == "deposit" ) {
this . searchPage . keywordFields = this . searchFields . DEPOSIT_DATASOURCE_KEYWORD_FIELDS ;
this . searchPage . usedBy = "deposit" ;
}
2020-03-27 13:39:18 +01:00
// console.log(this.refineFields)
2020-02-24 14:45:22 +01:00
this . searchPage . prepareSearchPage ( this . fieldIds , this . selectedFields , this . refineFields , [ ] , this . fieldIdsMap , this . customFilter , params , "dataprovider" ) ;
2020-02-11 15:56:20 +01:00
this . getResults ( this . searchPage . getSearchAPIQueryForAdvancedSearhFields ( ) , this . searchUtils . page , this . searchUtils . size , refine , this . searchPage . getSearchAPIQueryForRefineFields ( params , firstLoad ) ) ;
2020-06-10 13:05:59 +02:00
firstLoad = false ;
2020-02-11 15:56:20 +01:00
} ) ;
}
ngOnDestroy() {
this . sub . unsubscribe ( ) ;
}
sub : any ;
public getResults ( parameters :string , page : number , size : number , refine : boolean , refineFieldsFilterQuery = null ) {
if ( page > this . pagingLimit ) {
size = 0 ;
}
if ( page <= this . pagingLimit || this . searchUtils . status == this . errorCodes . LOADING ) {
2020-02-24 14:45:22 +01:00
// if(parameters!= null && parameters != '' ) {
// this.csvParams ="&fq=( "+this.resourcesQuery + "and (" + parameters + "))";
// }else{
// this.csvParams ="&fq="+this.resourcesQuery;
// }
// this.csvParams += (refineFieldsFilterQuery?refineFieldsFilterQuery:'');
this . csvParams = ( parameters ? ( "&fq=(" + parameters ) : "" ) + ( parameters ? ")" : "" ) ;
this . csvParams += ( refineFieldsFilterQuery ? refineFieldsFilterQuery : "" ) ;
2020-02-11 15:56:20 +01:00
//var errorCodes:ErrorCodes = new ErrorCodes();
this . searchUtils . status = this . errorCodes . LOADING ;
//this.searchPage.openLoading();
this . disableForms = true ;
2020-02-19 16:35:48 +01:00
this . searchPageUpdates . emit ( { disableForms : this.disableForms , searchUtils : this.searchUtils } ) ;
2020-02-11 15:56:20 +01:00
this . results = [ ] ;
this . searchUtils . totalResults = 0 ;
//console.info("Advanced Search for Content Providers: Execute search query "+parameters);
2020-02-25 16:40:56 +01:00
let datasourceQueryPrefix = DatasourcesHelperClass . getQueryPrefix ( this . type ) ;
2020-03-12 18:03:35 +01:00
this . _searchDataProvidersService . advancedSearchDataproviders ( datasourceQueryPrefix + ( datasourceQueryPrefix . length > 0 && parameters . length > 0 ? ' and (' : '' ) + parameters + ( datasourceQueryPrefix . length > 0 && parameters . length > 0 ? ' ) ' : '' ) , page , size , this . properties , ( refine && ( this . type == "all" || this . type == "deposit" ) ) ? this . searchPage . getRefineFieldsQuery ( ) : null , this . searchPage . getFields ( ) , refineFieldsFilterQuery , ( this . type == "deposit" ) ) . subscribe (
2020-02-11 15:56:20 +01:00
data = > {
this . searchUtils . totalResults = data [ 0 ] ;
this . results = data [ 1 ] ;
2020-03-27 13:39:18 +01:00
//console.log(this.results);
2020-02-11 15:56:20 +01:00
if ( refine ) {
2020-06-10 13:05:59 +02:00
this . filters =
this . searchPage . prepareFiltersToShow ( ( this . type == "all" || this . type == "deposit" ) ? data [ 2 ] : this . filters , this . searchUtils . totalResults ) ;
2020-02-11 15:56:20 +01:00
} else {
2020-02-17 15:19:14 +01:00
this . searchPage . buildPageURLParameters ( this . filters , [ ] , false ) ;
2020-02-11 15:56:20 +01:00
}
// this.searchPage.updateBaseUrlWithParameters();
//var errorCodes:ErrorCodes = new ErrorCodes();
this . searchUtils . status = this . errorCodes . DONE ;
if ( this . searchUtils . totalResults == 0 ) {
this . searchUtils . status = this . errorCodes . NONE ;
}
//this.searchPage.closeLoading();
this . disableForms = false ;
2020-02-19 16:35:48 +01:00
this . searchPageUpdates . emit ( { disableForms : this.disableForms , searchUtils : this.searchUtils } ) ;
2020-02-11 15:56:20 +01:00
if ( this . searchUtils . status == this . errorCodes . DONE ) {
// Page out of limit
let totalPages :any = this . searchUtils . totalResults / ( this . searchUtils . size ) ;
if ( ! ( Number . isInteger ( totalPages ) ) ) {
totalPages = ( parseInt ( totalPages , 10 ) + 1 ) ;
}
if ( totalPages < page ) {
this . searchUtils . totalResults = 0 ;
this . searchUtils . status = this . errorCodes . OUT_OF_BOUND ;
}
}
} ,
err = > {
//console.log(err);
this . handleError ( "Error getting content providers" , err ) ;
this . searchUtils . status = this . errorMessages . getErrorCode ( err . status ) ;
//TODO check erros (service not available, bad request)
// if( ){
// this.searchUtils.status = errorCodes.ERROR;
// }
//var errorCodes:ErrorCodes = new ErrorCodes();
//this.searchUtils.status = errorCodes.NOT_AVAILABLE;
/ * i f ( e r r . s t a t u s = = ' 4 0 4 ' ) {
this . searchUtils . status = this . errorCodes . NOT_FOUND ;
} else if ( err . status == '500' ) {
this . searchUtils . status = this . errorCodes . ERROR ;
} else {
this . searchUtils . status = this . errorCodes . NOT_AVAILABLE ;
} * /
//this.searchPage.closeLoading();
this . disableForms = false ;
2020-02-19 16:35:48 +01:00
this . searchPageUpdates . emit ( { disableForms : this.disableForms , searchUtils : this.searchUtils } ) ;
2020-02-11 15:56:20 +01:00
}
) ;
}
}
private handleError ( message : string , error ) {
console . error ( "Content Providers advanced Search Page: " + message , error ) ;
}
}