From 5c9575ab7a24d949bd13420d3631b7d88d8c8671 Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Sun, 12 Jul 2020 22:19:30 +0000 Subject: [PATCH] [Trunk | Library]: 1. configuration.service.ts: Use "useLongCache" property for communityFull | Add BehaviorSubject for communityFull | Add filtering methods to check if route is enabled from communityFull info. 2. isRouteEnabled.guard.ts: Get properties from environment (no service needed) | Foreach route do not query API but check if enabled by communityFull info (BehaviorSubject). 3. search.component.ts & searchAll.component.ts & entitiesSelection.component.ts & quick-selections.component.ts & navigationBar.component.ts & bottom.component.ts: Get communityFull info from state (call configurationService.communityInformationState) | Add subscriptions in array to unsubscribe in ngOnDestroy. quick-selections.component.ts: Add "uk-disabled" class when needed in
elements. 4. resultLanding.module.ts & navigationBar.module.ts & bottom.module.ts & entitiesSelection.module.ts & quick-selections.module.ts: Remove ConfigurationService from providers (singleton service, providedIn: 'root'). git-svn-id: https://svn.driver.research-infrastructures.eu/driver/dnet40/modules/uoa-services-library/trunk/ng-openaire-library/src/app@59074 d315682c-612b-4755-9ff5-7f18f6832af3 --- error/isRouteEnabled.guard.ts | 81 +++++++++---- landingPages/result/resultLanding.module.ts | 3 +- searchPages/find/search.component.ts | 110 ++++++----------- searchPages/find/searchAll.component.ts | 111 ++++++------------ .../entitiesSelection.component.ts | 93 ++++++++------- .../searchUtils/entitiesSelection.module.ts | 3 +- .../searchUtils/quick-selections.component.ts | 44 ++++--- .../searchUtils/quick-selections.module.ts | 3 +- sharedComponents/bottom.component.ts | 27 +++-- sharedComponents/bottom.module.ts | 3 +- sharedComponents/navigationBar.component.ts | 22 ++-- sharedComponents/navigationBar.module.ts | 3 +- utils/configuration/configuration.service.ts | 79 ++++++++++++- 13 files changed, 326 insertions(+), 256 deletions(-) diff --git a/error/isRouteEnabled.guard.ts b/error/isRouteEnabled.guard.ts index 797f92ba..9f665105 100644 --- a/error/isRouteEnabled.guard.ts +++ b/error/isRouteEnabled.guard.ts @@ -1,7 +1,7 @@ -import {of as observableOf, Observable} from 'rxjs'; +import {of as observableOf, Observable, Subject} from 'rxjs'; -import {map, filter, mergeMap} from 'rxjs/operators'; +import {map, filter, mergeMap, tap} from 'rxjs/operators'; import { Injectable } from '@angular/core'; import { Router, @@ -15,6 +15,10 @@ import { import { ConfigurationService } from '../utils/configuration/configuration.service'; import { EnvironmentSpecificService} from '../utils/properties/environment-specific.service'; import {ConnectHelper} from '../connect/connectHelper'; +import {properties} from "../../../environments/environment"; +import {LoginErrorCodes} from "../login/utils/guardHelper.class"; +import {of} from 'rxjs'; +import {Page} from "../utils/entities/adminTool/page"; @Injectable() export class IsRouteEnabled implements CanActivate { @@ -23,30 +27,61 @@ export class IsRouteEnabled implements CanActivate { private config: ConfigurationService, private propertiesService: EnvironmentSpecificService) {} + // check(data: Data, community: string, path: string): Observable | boolean { + // const customRedirect = data['redirect']; + // + // const redirect = customRedirect ? customRedirect : '/error'; + // const obs = this.propertiesService.subscribeEnvironment().pipe(map(res => { + // let communityDomain = null; + // //if (!community) { + // communityDomain = ConnectHelper.getCommunityFromDomain(res.domain); + // //} + // if(communityDomain) { + // community = communityDomain; + // } else if (!community && data['community']) { // for openaire or connect + // community = data['community']; + // } + // return res; + // }),mergeMap(prop => { + // if (!community) { + // community = prop.adminToolsCommunity; + // } + // return this.config.isPageEnabled(prop, community, '/' + path); + // }),); + // console.log("check isRouteEnabled.guard : call isPageEnabled"); + // + // obs.pipe(filter(enabled => !enabled)) + // .subscribe(() => this.router.navigate([redirect], {queryParams: {'page': path}})); + // return obs; + // } + check(data: Data, community: string, path: string): Observable | boolean { const customRedirect = data['redirect']; - const redirect = customRedirect ? customRedirect : '/error'; - const obs = this.propertiesService.subscribeEnvironment().pipe(map(res => { - let communityDomain = null; - //if (!community) { - communityDomain = ConnectHelper.getCommunityFromDomain(res.domain); - //} - if(communityDomain) { - community = communityDomain; - } else if (!community && data['community']) { // for openaire or connect - community = data['community']; - } - return res; - }),mergeMap(prop => { - if (!community) { - community = prop.adminToolsCommunity; - } - return this.config.isPageEnabled(prop, community, '/' + path); - }),); - obs.pipe(filter(enabled => !enabled)) - .subscribe(() => this.router.navigate([redirect], {queryParams: {'page': path}})); - return obs; + const redirect = customRedirect ? customRedirect : '/error'; + let communityDomain = ConnectHelper.getCommunityFromDomain(properties.domain); + + if(communityDomain) { + community = communityDomain; + } else if (!community && data['community']) { // for openaire or connect + community = data['community']; + } + + if (!community) { + community = properties.adminToolsCommunity; + } + + const obs = + //this.config.isPageEnabled(properties, community, '/' + path); + this.config.isPageEnabledByState(properties, community, '/'+path); + obs + .pipe(tap((enabled) => console.log("aaa: "+enabled))) + .pipe(filter(enabled => !enabled)) + .subscribe(() => { + this.router.navigate([redirect], {queryParams: {'page': path}}); + }); + + return obs; } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | boolean { diff --git a/landingPages/result/resultLanding.module.ts b/landingPages/result/resultLanding.module.ts index 97f8cc67..2b646693 100644 --- a/landingPages/result/resultLanding.module.ts +++ b/landingPages/result/resultLanding.module.ts @@ -10,7 +10,6 @@ import {CiteThisModule} from '../landing-utils/citeThis/citeThis.m import {IFrameModule} from '../../utils/iframe.module'; import {AltMetricsModule} from '../../utils/altmetrics.module'; import {PagingModule} from '../../utils/paging.module'; -import {ConfigurationServiceModule} from '../../utils/configuration/configurationService.module'; import {FreeGuard} from '../../login/freeGuard.guard'; import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; @@ -36,7 +35,7 @@ import {LoadingModule} from "../../utils/loading/loading.module"; imports: [ CommonModule, FormsModule, LandingModule, SharedModule, RouterModule, CiteThisModule, PagingModule, IFrameModule, - MetricsModule, AltMetricsModule, ConfigurationServiceModule, Schema2jsonldModule, SEOServiceModule, + MetricsModule, AltMetricsModule, Schema2jsonldModule, SEOServiceModule, DeletedByInferenceModule, ShowAuthorsModule, HelperModule, ResultLandingUtilsModule, AlertModalModule, AnnotationModule, LandingHeaderModule, NoLoadPaging, ResultPreviewModule, FeedbackModule, TabsModule, LoadingModule ], declarations: [ diff --git a/searchPages/find/search.component.ts b/searchPages/find/search.component.ts index d1f8ab61..18aa3df9 100644 --- a/searchPages/find/search.component.ts +++ b/searchPages/find/search.component.ts @@ -34,8 +34,8 @@ import {Observable, Subscription} from "rxjs"; templateUrl: 'search.component.html' }) export class SearchComponent { - public sub: any; - piwiksub: any; + subs: Subscription[] = []; + public reloadPublications: boolean; public reloadDatasets: boolean; public reloadSoftware: boolean; @@ -98,15 +98,6 @@ export class SearchComponent { @Input() piwikSiteId = null; @Input() formPlaceholderText = "Search for research outcomes, projects, content providers & organizations in OpenAIRE"; - - public subPub; - public subData; - public subSoftware; - public subOrps; - public subProjects; - public subOrg; - public subDataPr; - constructor(private route: ActivatedRoute, private _router: Router, private _searchResearchResultsService: SearchResearchResultsService, @@ -131,7 +122,7 @@ export class SearchComponent { } public ngOnInit() { - this.route.data + this.subs.push(this.route.data .subscribe((data: { envSpecific: EnvProperties }) => { var description = "open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "; @@ -145,33 +136,35 @@ export class SearchComponent { this._meta.updateTag({content: url}, "property='og:url'"); this.seoService.createLinkForCanonicalURL(this.properties.baseLink + this._router.url, false); if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) { - this.piwiksub = this._piwikService.trackView(this.properties, "OpenAIRE |Search publications, research data, projects...", this.piwikSiteId).subscribe(); + this.subs.push(this._piwikService.trackView(this.properties, "OpenAIRE |Search publications, research data, projects...", this.piwikSiteId).subscribe()); } if ((this.customFilter && this.customFilter.queryFieldName == "communityId") || this.properties.adminToolsCommunity) { - this.config.getCommunityInformation(this.properties, (this.customFilter && this.customFilter.queryFieldName == "communityId") ? this.customFilter.valueId : this.properties.adminToolsCommunity).subscribe(data => { - var showEntity = {}; - for (var i = 0; i < data['entities'].length; i++) { + //this.subs.push(this.config.getCommunityInformation(this.properties, (this.customFilter && this.customFilter.queryFieldName == "communityId") ? this.customFilter.valueId : this.properties.adminToolsCommunity).subscribe(data => { + this.subs.push(this.config.communityInformationState.subscribe(data => { + if(data) { + var showEntity = {}; + for (var i = 0; i < data['entities'].length; i++) { - showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; + showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; + } + this.showPublications = showEntity["publication"]; + this.showDatasets = showEntity["dataset"]; + this.showProjects = showEntity["project"]; + this.showOrganizations = showEntity["organization"]; + this.showDataProviders = showEntity["datasource"]; + this.showSoftware = showEntity["software"]; + this.showOrps = showEntity["orp"]; + if (this.customFilter && this.customFilter.queryFieldName == "communityId") { + this.showProjects = false; + this.showOrganizations = false; + this.showDataProviders = false; + } + this.loadAll(); } - this.showPublications = showEntity["publication"]; - this.showDatasets = showEntity["dataset"]; - this.showProjects = showEntity["project"]; - this.showOrganizations = showEntity["organization"]; - this.showDataProviders = showEntity["datasource"]; - this.showSoftware = showEntity["software"]; - this.showOrps = showEntity["orp"]; - if (this.customFilter && this.customFilter.queryFieldName == "communityId") { - this.showProjects = false; - this.showOrganizations = false; - this.showDataProviders = false; - } - this.loadAll(); - - }); + })); } else { if ((this.customFilter && this.customFilter.queryFieldName == "country")) { this.showPublications =true; @@ -185,11 +178,11 @@ export class SearchComponent { } } this.loadAll(); - }); + })); } loadAll() { - this.sub = this.route.queryParams.subscribe(params => { + this.subs.push(this.route.queryParams.subscribe(params => { this.reloadTabs(); this.keyword = (params['keyword']) ? params['keyword'] : ""; @@ -219,40 +212,13 @@ export class SearchComponent { } this.count(); } - }); + })); } public ngOnDestroy() { - if (this.sub) { - this.sub.unsubscribe(); - } - if (this.piwiksub) { - this.piwiksub.unsubscribe(); - } - if (this.keyword != null && this.keyword.length > 0) { - if (this.subPub) { - this.subPub.unsubscribe(); - } - if (this.subData) { - this.subData.unsubscribe(); - } - if (this.subSoftware) { - this.subSoftware.unsubscribe(); - } - if (this.subOrps) { - this.subOrps.unsubscribe(); - } - if (this.subProjects) { - this.subProjects.unsubscribe(); - } - if (this.subOrg) { - this.subOrg.unsubscribe(); - } - if (this.subDataPr) { - this.subDataPr.unsubscribe(); - } - + for (let sub of this.subs) { + sub.unsubscribe(); } } @@ -390,27 +356,27 @@ export class SearchComponent { this.fetchPublications.searchUtils.status = this.errorCodes.LOADING; this.fetchPublications.results = []; - this.subPub = this.numOfSearchResults("publication", this.fetchPublications, refineParams); + this.subs.push(this.numOfSearchResults("publication", this.fetchPublications, refineParams)); } if (this.activeTab != "research data" && this.showDatasets) { this.fetchDatasets.searchUtils.status = this.errorCodes.LOADING; this.fetchDatasets.results = []; - this.subData = this.numOfSearchResults("dataset", this.fetchDatasets, refineParams); + this.subs.push(this.numOfSearchResults("dataset", this.fetchDatasets, refineParams)); } if (this.activeTab != "software" && this.showSoftware) { this.fetchSoftware.searchUtils.status = this.errorCodes.LOADING; this.fetchSoftware.results = []; - this.subSoftware = this.numOfSearchResults("software", this.fetchSoftware, refineParams); + this.subs.push(this.numOfSearchResults("software", this.fetchSoftware, refineParams)); } if (this.activeTab != "other research products" && this.showOrps) { this.fetchOrps.searchUtils.status = this.errorCodes.LOADING; this.fetchOrps.results = []; - this.subOrps = this.numOfSearchResults("other", this.fetchOrps, refineParams); + this.subs.push(this.numOfSearchResults("other", this.fetchOrps, refineParams)); } if (this.activeTab != "projects" && this.showProjects) { this.fetchProjects.searchUtils.status = this.errorCodes.LOADING; this.fetchProjects.results = []; - this.subProjects = this._searchProjectsService.numOfSearchProjects(this.keyword, this.properties, refineParams).subscribe( + this.subs.push(this._searchProjectsService.numOfSearchProjects(this.keyword, this.properties, refineParams).subscribe( data => { this.fetchProjects.searchUtils.totalResults = data; this.fetchProjects.searchUtils.status = this.errorCodes.DONE; @@ -423,7 +389,7 @@ export class SearchComponent { this.handleError("Error getting number of Projects", err); this.fetchProjects.searchUtils.status = this.errorCodes.ERROR; } - ); + )); } if (this.activeTab != "content providers" && this.showDataProviders) { this.fetchDataproviders.results = []; @@ -432,7 +398,7 @@ export class SearchComponent { if (this.activeTab != "organizations" && this.showOrganizations) { this.fetchOrganizations.searchUtils.status = this.errorCodes.LOADING; this.fetchOrganizations.results = []; - this.subOrg = this._searchOrganizationsService.numOfSearchOrganizations(this.keyword, this.properties, refineParams).subscribe( + this.subs.push(this._searchOrganizationsService.numOfSearchOrganizations(this.keyword, this.properties, refineParams).subscribe( data => { this.fetchOrganizations.searchUtils.totalResults = data; this.fetchOrganizations.searchUtils.status = this.errorCodes.DONE; @@ -446,7 +412,7 @@ export class SearchComponent { this.fetchOrganizations.searchUtils.status = this.errorCodes.ERROR; } - ); + )); } diff --git a/searchPages/find/searchAll.component.ts b/searchPages/find/searchAll.component.ts index 18846c65..798b6020 100644 --- a/searchPages/find/searchAll.component.ts +++ b/searchPages/find/searchAll.component.ts @@ -25,7 +25,7 @@ import {EnvProperties} from '../../utils/properties/env-properties'; import {SEOService} from '../../sharedComponents/SEO/SEO.service'; import {StringUtils} from '../../utils/string-utils.class'; import {SearchCustomFilter} from "../searchUtils/searchUtils.class"; -import {Observable} from "rxjs"; +import {Observable, Subscription} from "rxjs"; import {AdvancedField, Filter} from "../searchUtils/searchHelperClasses.class"; import {SearchResearchResultsComponent} from "../searchResearchResults.component"; import {SearchProjectsComponent} from "../searchProjects.component"; @@ -40,8 +40,6 @@ import {NewSearchPageComponent} from "../searchUtils/newSearchPage.component"; templateUrl: 'searchAll.component.html' }) export class SearchAllComponent { - public sub: any; - piwiksub: any; // public reloadResults: boolean; // public reloadPublications: boolean; // public reloadDatasets: boolean; @@ -95,15 +93,7 @@ export class SearchAllComponent { @Input() piwikSiteId = null; @Input() formPlaceholderText = "Search for research outcomes, projects, content providers & organizations in OpenAIRE"; - - public subPub; - public subData; - public subSoftware; - public subOrps; - public subProjects; - public subOrg; - public subDataPr; - + subs: Subscription[] = []; quickFilter: { filter: Filter, selected: boolean, filterId: string, value: string } = { filter: null, @@ -151,7 +141,7 @@ export class SearchAllComponent { } public ngOnInit() { - this.route.data + this.subs.push(this.route.data .subscribe((data: { envSpecific: EnvProperties }) => { var description = "open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "; @@ -165,33 +155,35 @@ export class SearchAllComponent { this._meta.updateTag({content: url}, "property='og:url'"); this.seoService.createLinkForCanonicalURL(this.properties.baseLink + this._router.url, false); if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) { - this.piwiksub = this._piwikService.trackView(this.properties, "OpenAIRE |Search publications, research data, projects...", this.piwikSiteId).subscribe(); + this.subs.push(this._piwikService.trackView(this.properties, "OpenAIRE |Search publications, research data, projects...", this.piwikSiteId).subscribe()); } if ((this.customFilter && this.customFilter.queryFieldName == "communityId") || this.properties.adminToolsCommunity) { - this.config.getCommunityInformation(this.properties, (this.customFilter && this.customFilter.queryFieldName == "communityId") ? this.customFilter.valueId : this.properties.adminToolsCommunity).subscribe(data => { - var showEntity = {}; - for (var i = 0; i < data['entities'].length; i++) { + //this.config.getCommunityInformation(this.properties, (this.customFilter && this.customFilter.queryFieldName == "communityId") ? this.customFilter.valueId : this.properties.adminToolsCommunity).subscribe(data => { + this.subs.push(this.config.communityInformationState.subscribe(data => { + if(data) { + var showEntity = {}; + for (var i = 0; i < data['entities'].length; i++) { - showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; + showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; + } + this.showPublications = showEntity["publication"]; + this.showDatasets = showEntity["dataset"]; + this.showProjects = showEntity["project"]; + this.showOrganizations = showEntity["organization"]; + this.showDataProviders = showEntity["datasource"]; + this.showSoftware = showEntity["software"]; + this.showOrps = showEntity["orp"]; + if (this.customFilter && this.customFilter.queryFieldName == "communityId") { + this.showProjects = false; + this.showOrganizations = false; + this.showDataProviders = false; + } + this.loadAll(); } - this.showPublications = showEntity["publication"]; - this.showDatasets = showEntity["dataset"]; - this.showProjects = showEntity["project"]; - this.showOrganizations = showEntity["organization"]; - this.showDataProviders = showEntity["datasource"]; - this.showSoftware = showEntity["software"]; - this.showOrps = showEntity["orp"]; - if (this.customFilter && this.customFilter.queryFieldName == "communityId") { - this.showProjects = false; - this.showOrganizations = false; - this.showDataProviders = false; - } - this.loadAll(); - - }); + })); } else { if ((this.customFilter && this.customFilter.queryFieldName == "country")) { this.showPublications = true; @@ -205,12 +197,12 @@ export class SearchAllComponent { } } this.loadAll(); - }); + })); } loadAll() { this.reloadTabs(); - this.sub = this.route.queryParams.subscribe(params => { + this.subs.push(this.route.queryParams.subscribe(params => { this.parameters = Object.assign({}, params); this.keyword = (params['keyword']) ? params['keyword'] : (params["q"] ? params["q"] : (params["f0"] && params["f0"] == "q" && params["fv0"]?params["fv0"]:"")); this.selectedFields[0].value = StringUtils.URIDecode(this.keyword); @@ -241,7 +233,7 @@ export class SearchAllComponent { this.searchOrganizations(); } this.count(); - }); + })); } getDefaultEntityToShow(){ @@ -257,35 +249,8 @@ export class SearchAllComponent { } public ngOnDestroy() { - if (this.sub) { - this.sub.unsubscribe(); - } - if (this.piwiksub) { - this.piwiksub.unsubscribe(); - } - if (this.keyword != null && this.keyword.length > 0) { - if (this.subPub) { - this.subPub.unsubscribe(); - } - if (this.subData) { - this.subData.unsubscribe(); - } - if (this.subSoftware) { - this.subSoftware.unsubscribe(); - } - if (this.subOrps) { - this.subOrps.unsubscribe(); - } - if (this.subProjects) { - this.subProjects.unsubscribe(); - } - if (this.subOrg) { - this.subOrg.unsubscribe(); - } - if (this.subDataPr) { - this.subDataPr.unsubscribe(); - } - + for (let sub of this.subs) { + sub.unsubscribe(); } } @@ -390,14 +355,14 @@ export class SearchAllComponent { this.reload["result"] = false; this.fetchPublications.results = []; //Add Open Access Filter - this.subPub = this.numOfSearchResults(this.fetchPublications, (refineParams ? (refineParams + '&') : '') + "&fq=resultbestaccessright%20exact%20%22Open%20Access%22"); + this.subs.push(this.numOfSearchResults(this.fetchPublications, (refineParams ? (refineParams + '&') : '') + "&fq=resultbestaccessright%20exact%20%22Open%20Access%22")); } if (this.activeEntity != "projects" && this.reload["projects"] && this.showProjects) { this.fetchProjects.searchUtils.status = this.errorCodes.LOADING; this.fetchProjects.results = []; this.reload["projects"] = false; - this.subProjects = this._searchProjectsService.numOfSearchProjects2(this.keyword.length>0?NewSearchPageComponent.createKeywordQuery("project",this.keyword,"q","="):"", this.properties, refineParams).subscribe( + this.subs.push(this._searchProjectsService.numOfSearchProjects2(this.keyword.length>0?NewSearchPageComponent.createKeywordQuery("project",this.keyword,"q","="):"", this.properties, refineParams).subscribe( data => { this.fetchProjects.searchUtils.totalResults = data; this.fetchProjects.searchUtils.status = this.errorCodes.DONE; @@ -411,13 +376,13 @@ export class SearchAllComponent { this.fetchProjects.searchUtils.status = this.errorCodes.ERROR; this.fetchProjects.searchUtils.totalResults = null; } - ); + )); } if (this.activeEntity != "datasources" && this.reload["datasources"] && this.showDataProviders) { this.fetchDataproviders.results = []; this.reload["datasources"] = false; // this.fetchDataproviders.getNumForSearch(this.keyword, this.properties, refineParams); - this.subDataPr = this._searchDataprovidersService.numOfSearchDataproviders2(this.keyword.length>0?NewSearchPageComponent.createKeywordQuery("datasources",this.keyword,"q","="):"", this.properties, refineParams).subscribe( + this.subs.push(this._searchDataprovidersService.numOfSearchDataproviders2(this.keyword.length>0?NewSearchPageComponent.createKeywordQuery("datasources",this.keyword,"q","="):"", this.properties, refineParams).subscribe( data => { this.fetchDataproviders.searchUtils.totalResults = data; this.fetchDataproviders.searchUtils.status = this.errorCodes.DONE; @@ -431,13 +396,13 @@ export class SearchAllComponent { this.fetchDataproviders.searchUtils.status = this.errorCodes.ERROR; this.fetchDataproviders.searchUtils.totalResults = null; } - ); + )); } if (this.activeEntity != "organizations" && this.reload["organizations"] && this.showOrganizations) { this.fetchOrganizations.searchUtils.status = this.errorCodes.LOADING; this.fetchOrganizations.results = []; this.reload["organizations"] = false; - this.subOrg = this._searchOrganizationsService.numOfSearchOrganizations2(this.keyword.length>0?NewSearchPageComponent.createKeywordQuery("organizations",this.keyword,"q","="):"", this.properties, refineParams).subscribe( + this.subs.push(this._searchOrganizationsService.numOfSearchOrganizations2(this.keyword.length>0?NewSearchPageComponent.createKeywordQuery("organizations",this.keyword,"q","="):"", this.properties, refineParams).subscribe( data => { this.fetchOrganizations.searchUtils.totalResults = data; this.fetchOrganizations.searchUtils.status = this.errorCodes.DONE; @@ -452,13 +417,13 @@ export class SearchAllComponent { this.fetchOrganizations.searchUtils.totalResults = null; } - ); + )); } } - private numOfSearchResults(fetchClass: FetchResearchResults, refineParams): Observable { + private numOfSearchResults(fetchClass: FetchResearchResults, refineParams): Subscription { return this._searchResearchResultsService.numOfResearchOutcomes(this.keyword.length>0?NewSearchPageComponent.createKeywordQuery("result",this.keyword,"q","="):"", this.properties, refineParams).subscribe( data => { fetchClass.searchUtils.totalResults = data; diff --git a/searchPages/searchUtils/entitiesSelection.component.ts b/searchPages/searchUtils/entitiesSelection.component.ts index d378b753..53901eff 100644 --- a/searchPages/searchUtils/entitiesSelection.component.ts +++ b/searchPages/searchUtils/entitiesSelection.component.ts @@ -7,6 +7,7 @@ import {Router} from "@angular/router"; import {LoginErrorCodes} from "../../login/utils/guardHelper.class"; import {MatSelect} from "@angular/material"; import {properties} from "../../../../environments/environment"; +import {Subscription} from "rxjs"; @Component({ selector: 'entities-selection', @@ -92,7 +93,9 @@ export class EntitiesSelectionComponent { @Input() disableSelect: boolean = false; show = 0; @ViewChild(MatSelect) matSelect: MatSelect; - + + subs: Subscription[] = []; + constructor(private _fb: FormBuilder, private config: ConfigurationService, private router: Router) { @@ -103,47 +106,50 @@ export class EntitiesSelectionComponent { this.show = 0; if (this.properties) { if((this.customFilter && this.customFilter.queryFieldName == "communityId") || this.properties.adminToolsCommunity !== "monitor") { - this.config.getCommunityInformation(this.properties, (this.customFilter && this.customFilter.queryFieldName == "communityId") ? this.customFilter.valueId : this.properties.adminToolsCommunity).subscribe(data => { - let showEntity = {}; - let showPage = {}; - for (let i = 0; i < data['entities'].length; i++) { - - showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; - } - for (let i = 0; i < data['pages'].length; i++) { - showPage["" + data['pages'][i]["route"] + ""] = data['pages'][i]["isEnabled"]; - } - this.showResearchOutcomes = showPage[this.properties.searchLinkToResults] && (showEntity["publication"] || showEntity["dataset"] || showEntity["software"] || showEntity["orp"]); - this.showPublications = showPage[this.properties.searchLinkToResults] && showEntity["publication"]; - this.showDatasets = showPage[this.properties.searchLinkToResults] && showEntity["dataset"]; - this.showSoftware = showPage[this.properties.searchLinkToResults] && showEntity["software"]; - this.showOther = showPage[this.properties.searchLinkToResults] && showEntity["orp"]; - this.showProjects = showPage[this.properties.searchLinkToProjects] && showEntity["project"]; - this.showOrganizations = showPage[this.properties.searchLinkToOrganizations] && showEntity["organization"]; - this.showDataProviders = showPage[this.properties.searchLinkToDataProviders] && showEntity["datasource"]; - if (this.customFilter && this.customFilter.queryFieldName == "communityId") { - this.showOrganizations = false; - if (!this.simpleView) { - this.showProjects = false; - this.showDataProviders = false; + //this.config.getCommunityInformation(this.properties, (this.customFilter && this.customFilter.queryFieldName == "communityId") ? this.customFilter.valueId : this.properties.adminToolsCommunity).subscribe(data => { + this.subs.push(this.config.communityInformationState.subscribe(data => { + if(data) { + let showEntity = {}; + let showPage = {}; + for (let i = 0; i < data['entities'].length; i++) { + + showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; + } + for (let i = 0; i < data['pages'].length; i++) { + showPage["" + data['pages'][i]["route"] + ""] = data['pages'][i]["isEnabled"]; + } + this.showResearchOutcomes = showPage[this.properties.searchLinkToResults] && (showEntity["publication"] || showEntity["dataset"] || showEntity["software"] || showEntity["orp"]); + this.showPublications = showPage[this.properties.searchLinkToResults] && showEntity["publication"]; + this.showDatasets = showPage[this.properties.searchLinkToResults] && showEntity["dataset"]; + this.showSoftware = showPage[this.properties.searchLinkToResults] && showEntity["software"]; + this.showOther = showPage[this.properties.searchLinkToResults] && showEntity["orp"]; + this.showProjects = showPage[this.properties.searchLinkToProjects] && showEntity["project"]; + this.showOrganizations = showPage[this.properties.searchLinkToOrganizations] && showEntity["organization"]; + this.showDataProviders = showPage[this.properties.searchLinkToDataProviders] && showEntity["datasource"]; + if (this.customFilter && this.customFilter.queryFieldName == "communityId") { + this.showOrganizations = false; + if (!this.simpleView) { + this.showProjects = false; + this.showDataProviders = false; + } + } + if (this.showResearchOutcomes) { + this.show++; + } + if (this.showDataProviders) { + this.show++; + } + if (this.showOrganizations) { + this.show++; + } + if (this.showProjects) { + this.show++; + } + if (this.show == 1) { + this.disableSelect = true; } } - if (this.showResearchOutcomes) { - this.show++; - } - if (this.showDataProviders) { - this.show++; - } - if (this.showOrganizations) { - this.show++; - } - if (this.showProjects) { - this.show++; - } - if (this.show == 1) { - this.disableSelect = true; - } - }); + })); } else if((this.customFilter && this.customFilter.queryFieldName == "communityId") && this.properties.adminToolsCommunity === "monitor") { this.show = 1; this.disableSelect = true; @@ -190,7 +196,12 @@ export class EntitiesSelectionComponent { advancedUrl: this.getUrl(false) }); } - + + public ngOnDestroy() { + for (let sub of this.subs) { + sub.unsubscribe(); + } + } entityChanged() { if (!this.simpleView || this.onChangeNavigate) { diff --git a/searchPages/searchUtils/entitiesSelection.module.ts b/searchPages/searchUtils/entitiesSelection.module.ts index d2bde8c8..93fb44f4 100644 --- a/searchPages/searchUtils/entitiesSelection.module.ts +++ b/searchPages/searchUtils/entitiesSelection.module.ts @@ -3,13 +3,12 @@ import {CommonModule} from '@angular/common'; import {FormsModule, ReactiveFormsModule} from '@angular/forms'; import {RouterModule} from '@angular/router'; import {EntitiesSelectionComponent} from "./entitiesSelection.component"; -import {ConfigurationServiceModule} from "../../utils/configuration/configurationService.module"; import {MatSelectModule} from "@angular/material"; @NgModule({ imports: [ CommonModule, FormsModule, - RouterModule, ReactiveFormsModule, ConfigurationServiceModule, MatSelectModule + RouterModule, ReactiveFormsModule, MatSelectModule ], declarations: [ EntitiesSelectionComponent, diff --git a/searchPages/searchUtils/quick-selections.component.ts b/searchPages/searchUtils/quick-selections.component.ts index 86c29247..b9c2dda9 100644 --- a/searchPages/searchUtils/quick-selections.component.ts +++ b/searchPages/searchUtils/quick-selections.component.ts @@ -9,7 +9,8 @@ import {debounceTime} from "rxjs/operators"; @Component({ selector: 'quick-selections', template: ` - +
{{quickFilter.value}}
-
+ +
  • Research Type ({{(this.showPublications + this.showDatasets + this.showSoftware + this.showOrp)}})
    @@ -86,10 +89,12 @@ export class QuickSelectionsComponent implements OnChanges { showSoftware: boolean = false; showOrp: boolean = false; showEntities = false; - resultTypesObs: Subscription ; selectedTypesNum = 0; @Input() delayTime = 0; private clicks = new Subject(); + + subs: Subscription[] = []; + constructor(private _fb: FormBuilder, private config: ConfigurationService) { this.control = this._fb.group({ @@ -156,23 +161,26 @@ export class QuickSelectionsComponent implements OnChanges { } if(this.properties) { if(this.properties.adminToolsCommunity !== "monitor") { - this.config.getCommunityInformation(this.properties, this.properties.adminToolsCommunity).subscribe(data => { - var showEntity = {}; - for (var i = 0; i < data['entities'].length; i++) { - showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; + //this.subs.push(this.config.getCommunityInformation(this.properties, this.properties.adminToolsCommunity).subscribe(data => { + this.subs.push(this.config.communityInformationState.subscribe(data => { + if(data) { + var showEntity = {}; + for (var i = 0; i < data['entities'].length; i++) { + showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; + } + this.showPublications = showEntity["publication"]; + this.showDatasets = showEntity["dataset"]; + this.showSoftware = showEntity["software"]; + this.showOrp = showEntity["orp"]; + this.showEntities = this.showPublications || this.showDatasets || this.showSoftware || this.showOrp; } - this.showPublications = showEntity["publication"]; - this.showDatasets = showEntity["dataset"]; - this.showSoftware = showEntity["software"]; - this.showOrp = showEntity["orp"]; - this.showEntities = this.showPublications || this.showDatasets || this.showSoftware || this.showOrp; }, error => { this.showPublications = true; this.showDatasets = true; this.showSoftware = true; this.showOrp = true; this.showEntities = true; - }); + })); } else { this.showPublications = true; this.showDatasets = true; @@ -181,12 +189,18 @@ export class QuickSelectionsComponent implements OnChanges { this.showEntities = true; } } - this.resultTypesObs = this.clicks.pipe( + this.subs.push(this.clicks.pipe( debounceTime(this.delayTime) - ).subscribe(e =>{this.actuallyChanged()} ); + ).subscribe(e =>{this.actuallyChanged()} )); } + public ngOnDestroy() { + for (let sub of this.subs) { + sub.unsubscribe(); + } + } + ngOnChanges(changes: SimpleChanges): void { if (changes.isDisabled) { if (changes.isDisabled.currentValue == true) { diff --git a/searchPages/searchUtils/quick-selections.module.ts b/searchPages/searchUtils/quick-selections.module.ts index e218e8de..f2cb5f3c 100644 --- a/searchPages/searchUtils/quick-selections.module.ts +++ b/searchPages/searchUtils/quick-selections.module.ts @@ -4,12 +4,11 @@ import {FormsModule, ReactiveFormsModule} from '@angular/forms'; import {RouterModule} from '@angular/router'; import {QuickSelectionsComponent} from "./quick-selections.component"; import {MatCheckboxModule, MatSlideToggleModule} from "@angular/material"; -import {ConfigurationServiceModule} from "../../utils/configuration/configurationService.module"; @NgModule({ imports: [ CommonModule, FormsModule, - RouterModule, MatCheckboxModule, ReactiveFormsModule, MatSlideToggleModule, ConfigurationServiceModule + RouterModule, MatCheckboxModule, ReactiveFormsModule, MatSlideToggleModule ], declarations: [ QuickSelectionsComponent, diff --git a/sharedComponents/bottom.component.ts b/sharedComponents/bottom.component.ts index 42ccc667..25ec88ae 100644 --- a/sharedComponents/bottom.component.ts +++ b/sharedComponents/bottom.component.ts @@ -4,6 +4,7 @@ import 'rxjs'; import{MenuItem} from './menu'; import { ConfigurationService } from '../utils/configuration/configuration.service'; import {EnvProperties} from "../utils/properties/env-properties"; +import {Subscription} from "rxjs"; @Component({ selector: 'bottom', @@ -29,6 +30,8 @@ grantConenctText = "OpenAIRE-Connect receives funding from the European Union's @Input() centered:boolean=false; sectionClass= "uk-section-primary"; +subs: Subscription[] = []; + constructor(private config: ConfigurationService, private route: ActivatedRoute,) { } @@ -36,20 +39,28 @@ constructor(private config: ConfigurationService, private route: ActivatedRoute if(!this.darkBackground){ this.sectionClass= " footer-light-background"; } - this.route.queryParams.subscribe(params => { + this.subs.push(this.route.queryParams.subscribe(params => { if(this.showMenuItems){ if( this.properties.adminToolsAPIURL && this.communityId ){ - this.config.getCommunityInformation(this.properties, this.communityId ).subscribe(data => { - for(var i=0; i< data['pages'].length; i++){ - this.showPage[data['pages'][i]["route"]] = data['pages'][i]["isEnabled"]; + //this.subs.push(this.config.getCommunityInformation(this.properties, this.communityId ).subscribe(data => { + this.subs.push(this.config.communityInformationState.subscribe(data => { + if(data) { + for (var i = 0; i < data['pages'].length; i++) { + this.showPage[data['pages'][i]["route"]] = data['pages'][i]["isEnabled"]; + } + // console.log(this.showPage) } - // console.log(this.showPage) - - }); + })); } } - }); + })); + } + + public ngOnDestroy() { + for (let sub of this.subs) { + sub.unsubscribe(); + } } isEnabled(required, enabled){ diff --git a/sharedComponents/bottom.module.ts b/sharedComponents/bottom.module.ts index 3b526f51..2a615ce9 100644 --- a/sharedComponents/bottom.module.ts +++ b/sharedComponents/bottom.module.ts @@ -4,11 +4,10 @@ import { FormsModule } from '@angular/forms'; import { RouterModule } from "@angular/router"; import {BottomComponent} from './bottom.component'; -import { ConfigurationServiceModule } from '../utils/configuration/configurationService.module'; @NgModule({ imports: [ - CommonModule, FormsModule, RouterModule, ConfigurationServiceModule + CommonModule, FormsModule, RouterModule ], declarations: [ diff --git a/sharedComponents/navigationBar.component.ts b/sharedComponents/navigationBar.component.ts index e840d030..1534a1eb 100644 --- a/sharedComponents/navigationBar.component.ts +++ b/sharedComponents/navigationBar.component.ts @@ -5,6 +5,7 @@ import {ConfigurationService} from '../utils/configuration/configuration.service import {MenuItem, RootMenuItem} from './menu'; import {EnvProperties} from '../utils/properties/env-properties'; import {Stakeholder} from "../monitor/entities/stakeholder"; +import {Subscription} from "rxjs"; @Component({ selector: 'navbar', @@ -39,7 +40,8 @@ export class NavigationBarComponent { public isAuthorized: boolean = false; - sub: any; + subs: Subscription[] = []; + showEntity = {}; showPage = {}; specialAnnouncementContent: string = null; @@ -60,8 +62,8 @@ export class NavigationBarComponent { } ngOnDestroy() { - if(this.sub) { - this.sub.unsubscribe(); + for (let sub of this.subs) { + sub.unsubscribe(); } } @@ -69,7 +71,9 @@ export class NavigationBarComponent { this.activeRouteEnabled = false; this.isAuthorized = Session.isClaimsCurator(this.user) || Session.isPortalAdministrator(this.user); if (this.properties.adminToolsAPIURL && this.communityId) { - this.config.getCommunityInformation(this.properties, this.communityId).subscribe(data => { + //this.config.getCommunityInformation(this.properties, this.communityId).subscribe(data => { + this.subs.push(this.config.communityInformationState.subscribe(data => { + if(data) { for (var i = 0; i < data['entities'].length; i++) { this.showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"]; @@ -78,11 +82,11 @@ export class NavigationBarComponent { this.showPage[data['pages'][i]["route"]] = data['pages'][i]["isEnabled"]; } - - }, - error => { - this.handleError("Error getting community information (e.g. pages,entities) for community with id: " + this.communityId, error); - }); + } + }, + error => { + this.handleError("Error getting community information (e.g. pages,entities) for community with id: " + this.communityId, error); + })); } if(!this.community){ this.logosrc = this.logoPath + "logo-large-"+this.portal+".png"; diff --git a/sharedComponents/navigationBar.module.ts b/sharedComponents/navigationBar.module.ts index 0f8df7ec..c44c6ee4 100644 --- a/sharedComponents/navigationBar.module.ts +++ b/sharedComponents/navigationBar.module.ts @@ -7,13 +7,12 @@ import { RouterModule } from "@angular/router"; import { NavigationBarComponent} from './navigationBar.component'; import { UserMiniModule} from '../login/userMiniModule.module'; -import { ConfigurationServiceModule } from '../utils/configuration/configurationService.module'; import {SearchBarModule} from "./searchBar/searchBar.module"; @NgModule({ imports: [ CommonModule, FormsModule, - RouterModule, ConfigurationServiceModule, + RouterModule, UserMiniModule, SearchBarModule ], declarations: [ diff --git a/utils/configuration/configuration.service.ts b/utils/configuration/configuration.service.ts index d6c8fd69..dec7dd76 100644 --- a/utils/configuration/configuration.service.ts +++ b/utils/configuration/configuration.service.ts @@ -1,25 +1,59 @@ import {Injectable} from '@angular/core'; import {Http, Response, Headers} from '@angular/http'; import {HttpClient} from "@angular/common/http"; -import {Observable} from 'rxjs'; +import {BehaviorSubject, from, Observable, Subscription} from 'rxjs'; // import 'rxjs/add/operator/do'; // import 'rxjs/add/operator/share'; import {map, mapTo} from 'rxjs/operators'; import {EnvProperties} from "../properties/env-properties"; +import {Community} from "../entities/adminTool/community"; +import {Page} from "../entities/adminTool/page"; -@Injectable() +@Injectable({ providedIn: 'root' }) export class ConfigurationService { - + private communityInformation: BehaviorSubject = new BehaviorSubject(null); + private sub: Subscription = null; + private source: Observable = null; + private promise: Promise = null; constructor(private http: HttpClient ) {} + + ngOnDestroy() { + if(this.sub) { + this.sub.unsubscribe(); + } + } + + /** + * @deprecated + */ getCommunityInformation(properties:EnvProperties, community:string){ let url = properties.adminToolsAPIURL +"/communityFull/" + community; - return this.http.get((properties.useCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url); + return this.http.get((properties.useLongCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url); //.map(res => res.json()); } + public initCommunityInformation(properties:EnvProperties, community:string) { + let url = properties.adminToolsAPIURL +"/communityFull/" + community; + this.promise = new Promise((resolve => { + this.source = this.http.get((properties.useLongCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url); + + this.sub = this.source + .subscribe( + (communityInformation: Community) => { + this.communityInformation.next(communityInformation); + resolve(); + }); + })); + + } + + public get communityInformationState(): Observable { + return this.communityInformation.asObservable(); + } + /** * @deprecated */ @@ -35,10 +69,14 @@ export class ConfigurationService { .pipe(map(res => true)); } + /** + * @deprecated + */ isPageEnabled(properties:EnvProperties, community:string,router: string){ let page_route: string = router.split('?')[0].substring(1); + let url = properties.adminToolsAPIURL + "/community/" + community+"/pages?page_route="+page_route; - return this.http.get((properties.useCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url) + return this.http.get((properties.useLongCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url) //.map(res => res.json()) .pipe(map(res => { let result = false; @@ -50,6 +88,37 @@ export class ConfigurationService { }));//.do(res => {console.log("Route "+page_route +" is "+res)}); } + async isPageEnabledByStateAsync(properties: EnvProperties, community:string, page_route: string) { + if(!this.promise) { + this.initCommunityInformation(properties, community); + } + + await this.promise; + return this.filtering(page_route); + } + + isPageEnabledByState(properties: EnvProperties, community:string, router: string): Observable { + let page_route: string = router.split('?')[0].substring(1); + return from(this.isPageEnabledByStateAsync(properties, community, page_route)); + } + + filtering(page_route: string) { + let community: Community = this.communityInformation.getValue(); + + let pages: Page[] = community.pages; + pages = pages.filter(function (page: Page) { + return page.route == page_route; + }); + + if (pages) { + let result = false; + if (pages['length'] > 0 && pages[0].route == page_route) { + result = pages[0].isEnabled; + } + return result; + } + } + /** * @deprecated */