2019-04-08 16:56:09 +02:00
import { Component , ElementRef , ViewChild } from "@angular/core" ;
2019-04-05 19:29:28 +02:00
import { SearchUtilsClass } from "../../openaireLibrary/searchPages/searchUtils/searchUtils.class" ;
import { ErrorMessagesComponent } from "../../openaireLibrary/utils/errorMessages.component" ;
import { ErrorCodes } from "../../openaireLibrary/utils/properties/errorCodes" ;
import { EnvProperties } from "../../openaireLibrary/utils/properties/env-properties" ;
import { SearchPageComponent } from "../../openaireLibrary/searchPages/searchUtils/searchPage.component" ;
import { ActivatedRoute } from "@angular/router" ;
import { Filter , Value } from "../../openaireLibrary/searchPages/searchUtils/searchHelperClasses.class" ;
import { SearchFields } from "../../openaireLibrary/utils/properties/searchFields" ;
import { CommunitiesService } from "../../openaireLibrary/connect/communities/communities.service" ;
import { Session } from "../../openaireLibrary/login/utils/helper.class" ;
import { CommunityInfo } from "../../openaireLibrary/connect/community/communityInfo" ;
import { SearchResult } from "../../openaireLibrary/utils/entities/searchResult" ;
import { SubscribeService } from "../../openaireLibrary/utils/subscribe/subscribe.service" ;
import { Observable } from "rxjs" ;
import { StringUtils } from "../../openaireLibrary/utils/string-utils.class" ;
@Component ( {
selector : 'search-communities' ,
template : `
< search - page pageTitle = "Research Communities and Initiatives"
formPlaceholderText = "Search for Research Communities and Initiatives"
type = "results" entityType = "community" [ filters ] = "filters"
[ results ] = "results" [ searchUtils ] = "searchUtils"
[ showResultCount ] = true [ baseUrl ] = "baseUrl"
( queryChange ) = "queryChanged($event)"
[ disableForms ] = "disableForms"
[ lastIndex ] = false [ sort ] = true
searchFormClass = "communitiesSearchForm" >
< / s e a r c h - p a g e >
`
} )
export class SearchCommunitiesComponent {
private errorCodes : ErrorCodes ;
private errorMessages : ErrorMessagesComponent ;
public results : SearchResult [ ] = [ ] ;
public sub : any ; public subResults : any ;
public filters = [ ] ;
public searchFields :SearchFields = new SearchFields ( ) ;
public searchUtils :SearchUtilsClass = new SearchUtilsClass ( ) ;
public disableForms : boolean = false ;
public baseUrl : string = null ;
public refineFields : string [ ] = this . searchFields . COMMUNITIES_SEARCH_FIELDS ;
properties :EnvProperties ;
@ViewChild ( SearchPageComponent ) searchPage : SearchPageComponent ;
2019-04-08 16:56:09 +02:00
constructor ( private route : ActivatedRoute ,
private _communitiesService : CommunitiesService ,
private _subscribeService : SubscribeService ,
private element : ElementRef ) {
2019-04-05 19:29:28 +02:00
this . errorCodes = new ErrorCodes ( ) ;
this . errorMessages = new ErrorMessagesComponent ( ) ;
this . searchUtils . status = this . errorCodes . LOADING ;
}
public ngOnInit() {
this . route . data
. subscribe ( ( data : { envSpecific : EnvProperties } ) = > {
this . properties = data . envSpecific ;
this . baseUrl = data . envSpecific . searchLinkToCommunities ;
} ) ;
this . sub = this . route . queryParams . subscribe ( params = > {
2019-04-07 18:08:10 +02:00
this . searchPage . resultsPerPage = 5 ;
2019-04-05 19:29:28 +02:00
this . searchUtils . keyword = ( params [ 'keyword' ] ? params [ 'keyword' ] : '' ) ;
this . searchUtils . page = ( params [ 'page' ] === undefined ) ? 1 : + params [ 'page' ] ;
2019-04-07 18:08:10 +02:00
this . searchUtils . sortBy = ( params [ 'sortBy' ] === undefined ) ? '' : params [ 'sortBy' ] ;
2019-04-05 19:29:28 +02:00
this . searchUtils . size = ( params [ 'size' ] === undefined ) ? this . searchPage . resultsPerPage : + params [ 'size' ] ;
2019-04-07 18:08:10 +02:00
if ( this . searchUtils . size != 5 && this . searchUtils . size != 10 && this . searchUtils . size != 20 && this . searchUtils . size != 50 ) {
this . searchUtils . size = this . searchPage . resultsPerPage ;
}
if ( this . searchUtils . sortBy && this . searchUtils . sortBy != "creationdate,descending" && this . searchUtils . sortBy != "creationdate,ascending" ) {
this . searchUtils . sortBy = "" ;
}
2019-04-05 19:29:28 +02:00
this . searchPage . refineFields = this . refineFields ;
let queryParams = this . searchPage . getQueryParamsFromUrl ( params ) ;
this . filters = this . createFilters ( ) ;
2019-04-07 18:08:10 +02:00
this . _getResults ( queryParams ) ;
2019-04-05 19:29:28 +02:00
} ) ;
}
public ngOnDestroy() {
if ( this . sub ) {
this . sub . unsubscribe ( ) ;
}
if ( this . subResults ) {
this . subResults . unsubscribe ( ) ;
}
}
2019-04-07 18:08:10 +02:00
/ * *
* Return the communities in which user has permission to view or manage .
* /
private showCommunities() {
2019-04-05 19:29:28 +02:00
let ret : SearchResult [ ] = [ ] ;
for ( let result of this . results ) {
if ( result . community . status == 'hidden' ) {
continue ;
} else if ( result . community . status == "manager" ) {
let mail = Session . getUserEmail ( ) ;
if ( mail == null ) { // no user
continue ;
} else if ( Session . isCommunityCurator ( ) || Session . isPortalAdministrator ( ) ) {
ret . push ( result ) ;
} else if ( result . community . managers . indexOf ( mail ) != - 1 ) {
ret . push ( result ) ;
}
continue ;
}
ret . push ( result ) ;
}
2019-04-07 18:08:10 +02:00
this . results = ret ;
2019-04-05 19:29:28 +02:00
}
2019-04-07 18:08:10 +02:00
/ * *
* Get all communities from Communities API and apply permission access validator ,
* if a keyword is included , filter , paging and sorting .
*
* @param params
* @private
* /
private _getResults ( params : Map < string , string > ) {
2019-04-05 19:29:28 +02:00
this . searchUtils . status = this . errorCodes . LOADING ;
this . disableForms = true ;
this . results = [ ] ;
this . searchUtils . totalResults = 0 ;
this . subResults = this . _communitiesService . getCommunities ( this . properties , this . properties . communitiesAPI ) . subscribe (
data = > {
let observables : Observable < boolean > [ ] = [ ] ;
for ( let i = 0 ; i < data . length ; i ++ ) {
this . results [ i ] = new SearchResult ( ) ;
this . results [ i ] . community = data [ i ] ;
2019-04-08 16:56:09 +02:00
// For Test do not delete them.
//this.results[i].community.description = "EGI is a federated e-Infrastructure set up to provide advanced computing services for research and innovation.EGI is a federated e-Infrastructure set up to provide advanced computing services for research and innovation.EGI is a federated e-Infrastructure set up to provide advanced computing services for research and innovation."
2019-04-07 18:08:10 +02:00
//this.results[i].community.date = new Date(new Date(2012, 0, 1).getTime() + Math.random() * (new Date().getTime() - new Date(2012, 0, 1).getTime()));
2019-04-05 19:29:28 +02:00
observables . push ( this . _subscribeService . isSubscribedToCommunity ( this . results [ i ] . community . communityId , Session . getUserEmail ( ) , this . properties [ "adminToolsAPIURL" ] ) ) ;
this . results [ i ] . isManager = this . isCommunityManager ( this . results [ i ] . community ) ;
}
Observable . forkJoin ( observables ) . subscribe (
res = > {
for ( let i = 0 ; i < res . length ; i ++ ) {
this . results [ i ] . isSubscribed = res [ i ] ;
}
2019-04-07 18:08:10 +02:00
this . showCommunities ( ) ;
if ( this . searchUtils . keyword && this . searchUtils . keyword != '' ) {
this . searchForKeywords ( ) ;
}
this . checkFilters ( params ) ;
this . sort ( ) ;
2019-04-05 19:29:28 +02:00
this . searchUtils . totalResults = this . results . length ;
this . searchPage . checkSelectedFilters ( this . filters ) ;
this . searchPage . updateBaseUrlWithParameters ( this . filters ) ;
2019-04-07 18:08:10 +02:00
this . results = this . results . slice ( ( this . searchUtils . page - 1 ) * this . searchUtils . size , ( this . searchUtils . page * this . searchUtils . size ) ) ;
2019-04-05 19:29:28 +02:00
this . searchUtils . status = this . errorCodes . DONE ;
if ( this . searchUtils . totalResults == 0 ) {
this . searchUtils . status = this . errorCodes . NONE ;
}
this . disableForms = false ;
2019-04-07 18:08:10 +02: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 < this . searchUtils . page ) {
this . searchUtils . totalResults = 0 ;
this . searchUtils . status = this . errorCodes . OUT_OF_BOUND ;
}
}
2019-04-08 16:56:09 +02:00
this . scroll ( ) ;
2019-04-05 19:29:28 +02:00
} ,
err = > {
this . handleError ( 'Error getting if user is subscribed' , err ) ;
this . searchUtils . status = this . errorMessages . getErrorCode ( err . status ) ;
this . disableForms = false ;
2019-04-08 16:56:09 +02:00
this . scroll ( ) ;
2019-04-05 19:29:28 +02:00
}
) ;
} ,
err = > {
//console.log(err);
this . handleError ( 'Error getting communities' , err ) ;
this . searchUtils . status = this . errorMessages . getErrorCode ( err . status ) ;
this . disableForms = false ;
2019-04-08 16:56:09 +02:00
this . scroll ( ) ;
2019-04-05 19:29:28 +02:00
}
) ;
}
2019-04-07 18:08:10 +02:00
/ * *
* Parse the given keywords into array and check if any of the requirements field of a community includes
* one of the given words .
* /
private searchForKeywords() {
let ret : SearchResult [ ] = [ ] ;
let keywords : string [ ] = this . searchUtils . keyword . split ( /,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/ , - 1 ) ;
for ( let i = 0 ; i < this . results . length ; i ++ ) {
for ( let keyword of keywords ) {
if ( keyword != '' && ( this . results [ i ] . community . title . includes ( keyword ) || this . results [ i ] . community . shortTitle . includes ( keyword ) ||
this . results [ i ] . community . communityId . includes ( keyword ) || this . results [ i ] . community . description . includes ( keyword ) ) ) {
ret . push ( this . results [ i ] ) ;
break ;
}
}
}
this . results = ret ;
}
/ * *
* Check the current results if they satisfy the values of each filter category and
* update the number of possible results in each value .
*
* @param params
* /
2019-04-05 19:29:28 +02:00
private checkFilters ( params : Map < string , string > ) {
2019-04-07 18:08:10 +02:00
let typeResults : SearchResult [ ] = [ ] ;
let statusResults : SearchResult [ ] = [ ] ;
2019-04-12 10:54:55 +02:00
let roleResults : SearchResult [ ] = [ ] ;
2019-04-05 19:29:28 +02:00
let types : string [ ] = [ ] ;
let statuses : string [ ] = [ ] ;
2019-04-12 10:54:55 +02:00
let roles : string [ ] = [ ] ;
2019-04-05 19:29:28 +02:00
if ( params . get ( 'type' ) != undefined ) {
types = ( StringUtils . URIDecode ( params . get ( 'type' ) ) ) . split ( /,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/ , - 1 ) ;
}
if ( params . get ( 'status' ) != undefined ) {
statuses = ( StringUtils . URIDecode ( params . get ( 'status' ) ) ) . split ( /,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/ , - 1 ) ;
}
2019-04-12 10:54:55 +02:00
if ( params . get ( 'role' ) != undefined ) {
roles = ( StringUtils . URIDecode ( params . get ( 'role' ) ) ) . split ( /,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/ , - 1 ) ;
}
2019-04-05 19:29:28 +02:00
for ( let i = 0 ; i < this . results . length ; i ++ ) {
if ( types . length == 0 ) {
2019-04-07 18:08:10 +02:00
typeResults . push ( this . results [ i ] ) ;
2019-04-05 19:29:28 +02:00
} else {
for ( let type of types ) {
if ( this . results [ i ] . community . type == type . replace ( /["']/g , "" ) ) {
2019-04-07 18:08:10 +02:00
typeResults . push ( this . results [ i ] ) ;
break ;
2019-04-05 19:29:28 +02:00
}
}
}
}
for ( let i = 0 ; i < this . results . length ; i ++ ) {
if ( statuses . length == 0 ) {
2019-04-07 18:08:10 +02:00
statusResults . push ( this . results [ i ] ) ;
2019-04-05 19:29:28 +02:00
} else {
for ( let status of statuses ) {
if ( status . replace ( /["']/g , "" ) == 'subscribed' ) {
if ( this . results [ i ] . isSubscribed ) {
2019-04-07 18:08:10 +02:00
statusResults . push ( this . results [ i ] ) ;
break ;
2019-04-05 19:29:28 +02:00
}
} else if ( status . replace ( /["']/g , "" ) == 'nonsubscribed' ) {
if ( ! this . results [ i ] . isSubscribed ) {
2019-04-07 18:08:10 +02:00
statusResults . push ( this . results [ i ] ) ;
break ;
2019-04-05 19:29:28 +02:00
}
} else if ( status . replace ( /["']/g , "" ) == 'managing' ) {
if ( this . results [ i ] . isManager ) {
2019-04-07 18:08:10 +02:00
statusResults . push ( this . results [ i ] ) ;
break ;
2019-04-05 19:29:28 +02:00
}
}
}
}
}
2019-04-12 10:54:55 +02:00
for ( let i = 0 ; i < this . results . length ; i ++ ) {
if ( roles . length == 0 ) {
roleResults . push ( this . results [ i ] ) ;
} else {
for ( let role of roles ) {
if ( role . replace ( /["']/g , "" ) == 'manager' ) {
if ( this . results [ i ] . isManager ) {
roleResults . push ( this . results [ i ] ) ;
break ;
}
}
}
}
}
this . resetFilterNumbers ( 'status' ) ;
this . updateFilterNumbers ( typeResults . filter ( value = > {
return roleResults . includes ( value ) ;
} ) , 'status' ) ;
2019-04-07 18:08:10 +02:00
this . resetFilterNumbers ( 'type' ) ;
2019-04-12 10:54:55 +02:00
this . updateFilterNumbers ( statusResults . filter ( value = > {
return roleResults . includes ( value ) ;
} ) , 'type' ) ;
this . resetFilterNumbers ( 'role' ) ;
this . updateFilterNumbers ( statusResults . filter ( value = > {
return typeResults . includes ( value ) ;
} ) , 'role' ) ;
2019-04-07 18:08:10 +02:00
this . results = statusResults . filter ( value = > {
return typeResults . includes ( value ) ;
2019-04-12 10:54:55 +02:00
} )
this . results = this . results . filter ( value = > {
return roleResults . includes ( value ) ;
2019-04-07 18:08:10 +02:00
} ) ;
2019-04-05 19:29:28 +02:00
}
2019-04-07 18:08:10 +02:00
/ * *
* Reset the values of filter with id filterId with zero .
*
* @param filterId
* /
private resetFilterNumbers ( filterId : string ) {
2019-04-05 19:29:28 +02:00
for ( let i = 0 ; i < this . filters . length ; i ++ ) {
2019-04-07 18:08:10 +02:00
if ( this . filters [ i ] . filterId == filterId ) {
for ( let j = 0 ; j < this . filters [ i ] . values . length ; j ++ ) {
this . filters [ i ] . values [ j ] . number = 0 ;
}
break ;
2019-04-05 19:29:28 +02:00
}
}
2019-04-07 18:08:10 +02:00
}
/ * *
* Update the values of filter with id filterId based on
* results .
*
* @param results
* @param filterId
* /
private updateFilterNumbers ( results : SearchResult [ ] , filterId : string ) {
2019-04-05 19:29:28 +02:00
for ( let k = 0 ; k < results . length ; k ++ ) {
for ( let i = 0 ; i < this . filters . length ; i ++ ) {
2019-04-07 18:08:10 +02:00
if ( this . filters [ i ] . filterId == filterId ) {
if ( this . filters [ i ] . filterId == 'type' ) {
for ( let j = 0 ; j < this . filters [ i ] . values . length ; j ++ ) {
if ( results [ k ] . community . type == this . filters [ i ] . values [ j ] . id ) {
this . filters [ i ] . values [ j ] . number ++ ;
}
}
2019-04-05 19:29:28 +02:00
}
2019-04-07 18:08:10 +02:00
if ( this . filters [ i ] . filterId == 'status' ) {
if ( results [ k ] . isSubscribed ) {
this . filters [ i ] . values [ 0 ] . number ++ ;
} else {
this . filters [ i ] . values [ 1 ] . number ++ ;
}
2019-04-12 10:54:55 +02:00
}
if ( this . filters [ i ] . filterId == 'role' ) {
2019-04-07 18:08:10 +02:00
if ( results [ k ] . isManager ) {
2019-04-12 10:54:55 +02:00
this . filters [ i ] . values [ 0 ] . number ++ ;
2019-04-07 18:08:10 +02:00
}
}
break ;
2019-04-05 19:29:28 +02:00
}
}
}
}
2019-04-07 18:08:10 +02:00
/ * *
* Sorting results based on sortBy .
* /
private sort() {
if ( this . searchUtils . sortBy == '' ) {
this . results . sort ( ( left , right ) : number = > {
if ( left . community . title > right . community . title ) {
return 1 ;
} else if ( left . community . title < right . community . title ) {
return - 1 ;
} else {
return 0 ;
}
} )
} else if ( this . searchUtils . sortBy == 'creationdate,descending' ) {
this . results . sort ( ( left , right ) : number = > {
if ( ! right . community . date || left . community . date > right . community . date ) {
return - 1 ;
} else if ( ! left . community . date || left . community . date < right . community . date ) {
return 1 ;
} else {
return 0 ;
}
} )
} else if ( this . searchUtils . sortBy == 'creationdate,ascending' ) {
this . results . sort ( ( left , right ) : number = > {
if ( ! right . community . date || left . community . date > right . community . date ) {
return 1 ;
} else if ( ! left . community . date || left . community . date < right . community . date ) {
return - 1 ;
} else {
return 0 ;
}
} )
}
}
2019-04-05 19:29:28 +02:00
private isCommunityManager ( community : CommunityInfo ) : boolean {
return Session . isCommunityCurator ( ) || community . managers . indexOf ( Session . getUserEmail ( ) ) != - 1 ;
}
public queryChanged ( $event ) {
2019-04-07 18:08:10 +02:00
this . _getResults ( $event . params ) ;
2019-04-05 19:29:28 +02:00
}
2019-04-07 18:08:10 +02:00
/ * *
* Create Search Communities filters .
*
* /
2019-04-05 19:29:28 +02:00
private createFilters ( ) : Filter [ ] {
let filter_names = [ "Type" ] ;
let filter_ids = [ "type" ] ;
let searchFields = new SearchFields ( ) ;
let filter_original_ids = searchFields . COMMUNITIES_SEARCH_FIELDS ;
let value_names = [
[ "Research Communities" , "Research Initiatives" ]
] ;
let value_original_ids = [
[ "community" , "ri" ]
] ;
if ( Session . isLoggedIn ( ) ) {
filter_names [ 1 ] = "Status" ;
filter_ids [ 1 ] = "status" ;
2019-04-12 10:54:55 +02:00
value_names [ 1 ] = [ "Subscribed" , "Non-subscribed" ] ;
value_original_ids [ 1 ] = [ "subscribed" , "nonsubscribed" ] ;
filter_names [ 2 ] = "Role" ;
filter_ids [ 2 ] = "role" ;
value_names [ 2 ] = [ "Manager" ] ;
value_original_ids [ 2 ] = [ "manager" ] ;
2019-04-05 19:29:28 +02:00
}
let filters : Filter [ ] = [ ] ;
for ( let i = 0 ; i < filter_names . length ; i ++ ) {
let values : Value [ ] = [ ] ;
for ( let j = 0 ; j < value_names [ i ] . length ; j ++ ) {
2019-04-07 18:08:10 +02:00
let value : Value = { name : value_names [ i ] [ j ] , id : value_original_ids [ i ] [ j ] , number : 0 , selected :false } ;
2019-04-05 19:29:28 +02:00
values . push ( value ) ;
}
let filter : Filter = { title : filter_names [ i ] , filterId : filter_ids [ i ] , originalFilterId : filter_original_ids [ i ] , values : values , countSelectedValues :0 , "filterOperator" : 'or' , valueIsExact : true } ;
filters . push ( filter ) ;
}
return filters ;
}
private handleError ( message : string , error ) {
console . error ( 'Communities Search Page: ' + message , error ) ;
}
2019-04-08 16:56:09 +02:00
public scroll() {
if ( typeof document !== 'undefined' ) {
this . element . nativeElement . scrollIntoView ( ) ;
}
}
2019-04-05 19:29:28 +02:00
}