Fix a style bug in notification-user. Add manager authorization in admin login guard(optional). Add resources service for Resource menu item build. Move methodology in library. Fix sub-submenu items with _self target in navigation bar.

This commit is contained in:
Konstantinos Triantafyllou 2022-07-29 12:15:54 +03:00
parent e04d825c03
commit d7b394520f
9 changed files with 660 additions and 27 deletions

View File

@ -256,9 +256,14 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
NotificationHandler.rise('Group has been <b> successfully created</b>');
this.updateLists();
}, error => {
NotificationHandler.rise('An error has occurred. Please try again later', 'danger');
this.loadActive = false;
this.loadPending = false;
if(error.status === 409) {
NotificationHandler.rise('Group already exists. You can try to invite a ' + this.role + ' instead.', 'warning');
this.updateLists();
} else {
NotificationHandler.rise('An error has occurred. Please try again later', 'danger');
this.loadActive = false;
this.loadPending = false;
}
});
}

View File

@ -28,7 +28,9 @@ export class AdminLoginGuard implements CanActivate, CanActivateChild {
}
return Session.isPortalAdministrator(user) ||
(data.monitorCurator && Session.isMonitorCurator(user)) ||
(data.communityCurator && Session.isCommunityCurator(user))
(data.communityCurator && Session.isCommunityCurator(user)) ||
(data.monitorManager && Session.isKindOfMonitorManager(user)) ||
(data.communityManager && Session.isKindOfCommunityManager(user))
}),tap(isAdmin => {
if(!isAdmin) {
this.router.navigate(['/user-info'], {

View File

@ -3,8 +3,9 @@ import {Subscriber} from "rxjs";
import {properties} from "../../../../environments/environment";
import {ActivatedRoute, Router} from "@angular/router";
import {HelperService} from "../../utils/helper/helper.service";
import {StakeholderService} from "../services/stakeholder.service";
import {ConfigurationService} from "../../utils/configuration/configuration.service";
import {Meta, Title} from "@angular/platform-browser";
import {SEOService} from "../../sharedComponents/SEO/SEO.service";
import {ResourcesService} from "../services/resources.service";
@Component({
selector: 'indicators-page',
@ -12,28 +13,43 @@ import {ConfigurationService} from "../../utils/configuration/configuration.serv
})
export class IndicatorsComponent implements OnInit, OnDestroy {
private subscriptions: any[] = [];
public types = ResourcesService.types;
public properties = properties;
public pageContents;
constructor(private helper: HelperService,
private configurationService: ConfigurationService,
private resourcesService: ResourcesService,
private router: Router,
private stakeholderService: StakeholderService,
private meta: Meta,
private title: Title,
private seoService: SEOService,
private route: ActivatedRoute) {
}
ngOnInit() {
this.subscriptions.push(this.route.params.subscribe(params => {
if(params['stakeholder']) {
this.subscriptions.push(this.stakeholderService.getStakeholderAsObservable().subscribe(stakeholder => {
this.getPageContents(stakeholder.type);
}));
} else if(params['type']){
this.getPageContents(params['type']);
if(params['type']){
let type = this.types.find(type => type.value === params['type']);
if(type) {
this.getPageContents(type.value);
const description = "Monitor | Indicators " + type.label;
const title = "Monitor | Indicators " + type.label;
this.metaTags(title, description);
}
}
}))
}
metaTags(title, description) {
const url = properties.domain + properties.baseLink + this.router.url;
this.seoService.createLinkForCanonicalURL(url, false);
this.meta.updateTag({content: url}, "property='og:url'");
this.meta.updateTag({content: description}, "name='description'");
this.meta.updateTag({content: description}, "property='og:description'");
this.meta.updateTag({content: title}, "property='og:title'");
this.title.setTitle(title);
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => {
if (subscription instanceof Subscriber) {
@ -43,8 +59,8 @@ export class IndicatorsComponent implements OnInit, OnDestroy {
}
public getPageContents(type: string) {
this.subscriptions.push(this.configurationService.isPageEnabled('monitor', '/indicators/' + type, 'monitor').subscribe(isEnabled => {
if(isEnabled) {
this.subscriptions.push(this.resourcesService.isPagesEnabled().subscribe(status => {
if(status[0]) {
this.subscriptions.push(this.helper.getPageHelpContents(this.properties, 'monitor', '/indicators/' + type, 'monitor').subscribe(contents => {
this.pageContents = contents;
}));

View File

@ -0,0 +1,465 @@
import {Component, OnDestroy, OnInit} from "@angular/core";
import {Subscription} from "rxjs";
import {Meta, Title} from "@angular/platform-browser";
import {ActivatedRoute, Router} from "@angular/router";
import {Stakeholder} from "../entities/stakeholder";
import {OpenaireEntities} from "../../utils/properties/searchFields";
import {StakeholderService} from "../services/stakeholder.service";
import {SEOService} from "../../sharedComponents/SEO/SEO.service";
import {properties} from "../../../../environments/environment";
@Component({
selector: 'methodology',
template: `
<div class="uk-section">
<div class="uk-container uk-container-large">
<h1>Terminology and <br> construction<span class="uk-text-primary">.</span></h1>
</div>
<div class="uk-section uk-container uk-container-large">
<ul class="uk-tab" uk-tab>
<li>
<a>Entities</a>
</li>
<li>
<a>Inherited and Inferred Attributes</a>
</li>
<li>
<a>Constructed Attributes</a>
</li>
</ul>
<ul class="uk-switcher">
<li>
<dl class="uk-description-list uk-description-list-divider">
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1 uk-text-primary">{{openaireEntities.RESULTS}}</dt>
<dd class="uk-width-expand">
<div>There are currently four different types of {{openaireEntities.RESULTS | lowercase}} in the OpenAIRE Research <br> Graph:</div>
<ul class="uk-list uk-list-bullet uk-list-primary">
<li>{{openaireEntities.PUBLICATIONS}}</li>
<li>{{openaireEntities.DATASETS}}</li>
<li>{{openaireEntities.SOFTWARE}}</li>
<li>{{openaireEntities.OTHER}}.</li>
</ul>
<div class="uk-margin-small-top">
OpenAIRE deduplicates (merges) different records of {{openaireEntities.RESULTS | lowercase}} and keeps the <br> metadata of all instances.
</div>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">{{openaireEntities.PUBLICATION}}</dt>
<dd class="uk-width-expand">
{{openaireEntities.RESULTS}} intended for human reading (published articles, pre-prints, conference <br> papers, presentations, technical reports, etc.)
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">{{openaireEntities.DATASET}}</dt>
<dd class="uk-width-expand">
<!-- <div>{{openaireEntities.DATASET}}</div>-->
<div>Granularity is not defined by OpenAIRE, it reflects the granularity supported by
the sources <br> from which the description of the {{openaireEntities.DATASET | lowercase}} has been collected.</div>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">{{openaireEntities.SOFTWARE_SINGULAR}}</dt>
<dd class="uk-width-expand">
Source code or software package developed and/or used in a research context
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">{{openaireEntities.OTHER_SINGULAR}}</dt>
<dd class="uk-width-expand">
Anything that does not fall in the previous categories (e.g. workflow, methods, protocols)
</dd>
</div>
</dl>
</li>
<li>
<div class="uk-text-center uk-padding">
The attributes of entities listed below are either inherited via entries in the harvested metadata records or automatically generated by our inference (text and data mining) algorithms.
</div>
<hr>
<dl class="uk-description-list uk-description-list-divider">
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">{{openaireEntities.ORGANIZATION}}</dt>
<dd class="uk-width-expand">
<p><span class="uk-text-bold">For {{openaireEntities.RESULTS | lowercase}},</span> this refers to the affiliated organizations of its authors</p>
<p><span class="uk-text-bold">For {{openaireEntities.PROJECTS | lowercase}}:</span> the {{openaireEntities.ORGANIZATIONS | lowercase}} participating in the {{openaireEntities.PROJECT | lowercase}}
(i.e. beneficiaries of the grant)</p>
<p>The OpenAIRE research graph is in the process of improving the {{openaireEntities.ORGANIZATION | lowercase}} database (disambiguation) with the newly developed <a href="https://www.openaire.eu/blogs/openorgs-bridging-registries-of-research-organisations" target="_blank">OpenOrgs</a> tool.</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Country</dt>
<dd class="uk-width-expand">
<p>The country of the {{openaireEntities.ORGANIZATION | lowercase}}. </p>
<p>
<span class="uk-text-bold">Country code mapping: </span>
<a href="https://api.openaire.eu/vocabularies/dnet:countries" target="_blank">
https://api.openaire.eu/vocabularies/dnet:countries</a>
</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Funder</dt>
<dd class="uk-width-expand">
<p>Funders that have joined OpenAIRE, i.e. their {{openaireEntities.PROJECT | lowercase}} data have gone through a validation process.</p>
<p>You can visit <a class="https://explore.openaire.eu/search/find" target="_blank">https://explore.openaire.eu/search/find</a> if you would like to explore the {{openaireEntities.RESULTS | lowercase}} and {{openaireEntities.PROJECTS | lowercase}} of all funders in OpenAIRE (the list of funders can be seen under the "Funder" Filter shown on the left side of the page).</p>
<p><span class="uk-text-bold">To join: </span><a href="https://www.openaire.eu/funders-how-to-join-guide" target="_blank">https://www.openaire.eu/funders-how-to-join-guide</a></p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Type</dt>
<dd class="uk-width-expand">
<p>The sub-type of a {{openaireEntities.RESULT | lowercase}} (e.g., a {{openaireEntities.PUBLICATION | lowercase}} can be a pre-print, conference proceeding,
article,
etc.)</p>
<p><span class="uk-text-bold">Resource type mapping: </span>
<a href="https://api.openaire.eu/vocabularies/dnet:result_typologies" target="_blank">https://api.openaire.eu/vocabularies/dnet:result_typologies</a>
(click on the code to see the specific types for each result type)
</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Access mode or access rights</dt>
<dd class="uk-width-expand">
<p>The best available (across all instances) access rights of a {{openaireEntities.RESULT | lowercase}}</p>
<p>Types: open, restricted, closed, embargo (= closed for a specific period of time, then open)</p>
<p><span class="uk-text-bold">Note:</span> definition of <span class="uk-text-bold">restricted</span>
may vary by data source, it may refer to access rights being given to registered users, potentially behind a paywall.</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">CC license</dt>
<dd class="uk-width-expand">
<p>A Creative Commons copyright license <a href="(https://creativecommons.org/)" target="_blank">(https://creativecommons.org/)</a></p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">PID (persistent identifier)</dt>
<dd class="uk-width-expand">
<p>A long-lasting reference to a resource</p>
<p><span class="uk-text-bold">Types: </span> <a
href="http://api.openaire.eu/vocabularies/dnet:pid_types" target="_blank">http://api.openaire.eu/vocabularies/dnet:pid_types</a>
</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Context</dt>
<dd class="uk-width-expand">
Related {{openaireEntities.COMMUNITY | lowercase}}, initiative or infrastructure.
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Journal</dt>
<dd class="uk-width-expand">
The scientific journal an article is published in.
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Publisher</dt>
<dd class="uk-width-expand">
The publisher of the venue (journal, book, etc.) of a {{openaireEntities.RESULT | lowercase}}.
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1 uk-text-primary">{{openaireEntities.DATASOURCES}}</dt>
<dd class="uk-width-expand">
<p>The different data sources ingested in the OpenAIRE Research Graph.</p>
<div class="uk-text-bold">Data Source Types:</div>
<ul class="uk-list uk-list-disc">
<li>Repositories</li>
<li>Open Access Publishers & Journals</li>
<li>Aggregators</li>
<li>Entity Registries</li>
<li>Journal Aggregators</li>
<li>CRIS (Current Research Information System)</li>
</ul>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Repositories</dt>
<dd class="uk-width-expand">
Information systems where scientists upload the bibliographic metadata and payloads of their
{{openaireEntities.RESULTS | lowercase}} (e.g. PDFs of their scientific articles, CSVs of their data, archive with their
software), due to obligations from their {{openaireEntities.ORGANIZATIONS | lowercase}}, their funders, or due to community practices
(e.g. ArXiv, Europe PMC, Zenodo).
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Open Access Publishers & Journals</dt>
<dd class="uk-width-expand">
Information systems of open access publishers or relative journals, which offer bibliographic
metadata and PDFs of their published articles.
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Aggregators</dt>
<dd class="uk-width-expand">
Information systems that collect descriptive metadata about {{openaireEntities.RESULTS | lowercase}} from multiple sources
in order to enable cross-data source discovery of given {{openaireEntities.RESULTS | lowercase}} (e,g, DataCite,
BASE, DOAJ).
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Entity Registries</dt>
<dd class="uk-width-expand">
Information systems created with the intent of maintaining authoritative registries of given
entities in the scholarly communication, such as OpenDOAR for the institutional repositories, re3data
for the data repositories, CORDA and other funder databases for {{openaireEntities.PROJECTS | lowercase}} and funding information.
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">CRIS (Current Research Information System)</dt>
<dd class="uk-width-expand">
Information systems adopted by research and academic {{openaireEntities.ORGANIZATIONS | lowercase}} to keep track of their research
administration records and relative results; examples of CRIS content are articles or {{openaireEntities.DATASETS | lowercase}} funded
by {{openaireEntities.PROJECTS | lowercase}}, their principal investigators, facilities acquired thanks to funding, etc.
</dd>
</div>
</dl>
</li>
<li>
<div class="uk-text-center uk-padding">
The attributes of entities under this tab are constructed following the methodology described below.
</div>
<hr>
<dl class="uk-description-list uk-description-list-divider">
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Attribute</dt>
<dd class="uk-width-1-3@m uk-width-1-1 uk-text-bold">Definition</dd>
<dd class="uk-width-1-3@m uk-width-1-1 uk-text-bold">Construction</dd>
</div>
<hr>
<div class="uk-padding-small uk-text-bold uk-text-primary">
Journal Business Models
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Fully Open Access (OA)</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>A journal that publishes only in open access.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>We construct the list of fully OA journals using Unpaywall data. </p>
<p>In brief, a journal is fully OA if </p>
<ol>
<li>It is in the Directory of Open Access Journals (DOAJ) </li>
<li>It has a known (curated list) fully OA Publisher. </li>
<li>It only publishes OA articles. </li>
</ol>
<p><a href="https://support.unpaywall.org/support/solutions/articles/44001792752-how-do-we-decide-if-a-given-journal-is-fully-oa-" target="_blank">More information</a></p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Subscription</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>A journal that charges for access to its articles.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>Journals without any open access articles.</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Hybrid</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>A subscription journal where some of its articles are open access.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>Journals with open access articles that are not fully OA journals are hybrid.</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Transformative</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>"A Transformative Journal is a subscription/hybrid journal that is actively committed to transitioning to a fully Open Access journal.</p>
<p>In addition, a Transformative Journal must:</p>
<ul>
<li>gradually increase the share of Open Access content; and</li>
<li>offset subscription income from payments for publishing services (to avoid double payments)."</li>
</ul>
<p>Source:</p>
<p><a href="https://www.coalition-s.org/transformative-journals-faq/" target="_blank">https://www.coalition-s.org/transformative-journals-faq/</a></p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>Transformative Journals are identified by ISSN matching with the publicly available Transformative Journals data (<a href="https://journalcheckertool.org/transformative-journals/" target="_blank">https://journalcheckertool.org/transformative-journals/</a>)</p>
</dd>
</div>
<hr>
<div class="uk-padding-small uk-text-bold uk-text-primary">
Journal APC Business Models
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Diamond OA</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>A fully OA journal that does not charge article processing charges (APCs).</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>APC information is obtained from DOAJ using DOAJs exportable version of the journal metadata (<a href="https://doaj.org/docs/public-data-dump/" target="_blank">https://doaj.org/docs/public-data-dump/</a>). We used it to determine whether a particular fully OA journal charges APCs. </p>
</dd>
</div>
<hr>
<div class="uk-padding-small uk-text-bold uk-text-primary">
Routes to Open Access (OA)
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Green OA</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>An open access scientific publication deposited in a repository</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>As in definition</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Gold OA</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>A scientific publication published in a fully OA journal.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>Fully OA journals are defined above.</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Hybrid OA</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>An open access scientific publication published in a hybrid journal with an open license.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>Hybrid journals are defined above.</p>
<p>At this point we consider only CC licenses open, we are currently working on cleaning non-CC licenses as well to identify other open ones.</p>
<p>In principle, this means that we may be underestimating the number of hybrid OA articles and overestimating the number of bronze.</p>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Bronze OA</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>An open access scientific publication published in a hybrid journal without an open license.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
</dd>
</div>
<hr>
<div class="uk-padding-small uk-text-bold uk-text-primary">
Miscellaneous
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-3@m uk-width-1-1">Downloads</dt>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>The number of downloads of a publications full text in a specific time frame, from a given set of data sources.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>Data for downloads is taken from OpenAIREs Usage Counts service that harvests it from a set of repositories. The time range of available downloads varies for each repository.</p>
<p>
<a href="https://www.openaire.eu/guides-usage-counts" target="_blank">More information</a>
</p>
</dd>
</div>
<hr>
</dl>
</li>
</ul>
<div class="uk-margin-medium-top">
<icon name="graph" customClass="text-graph"></icon>
<span class="uk-margin-small-left uk-text-meta">More information for </span>
<a href="https://graph.openaire.eu" class="text-graph">OpenAIRE Research Graph</a>
<span class="uk-text-meta">.</span>
</div>
</div>
<div id="how" class="uk-container uk-container-large uk-section uk-section-small uk-margin-large-top">
<h2 class="uk-h1">
Inclusion, transparency, <br> quality, state of the art <br> technology<span class="uk-text-primary">.</span>
</h2>
<div class="uk-margin-large-top uk-card uk-card-default uk-card-body">
<p class="uk-margin-top">Our methodological approach is based on the following operational quality criteria:</p>
<ul>
<li><span class="uk-text-bold">Openness and transparency:</span> Methodological assumptions are openly and clearly presented.</li>
<li><span class="uk-text-bold">Coverage and accuracy:</span> As detailed in <a href="https://graph.openaire.eu/" target="_blank">graph.openaire.eu</a>
multiple data sources are ingested in the OpenAIRE research graph for coverage to the fullest extent possible, in order to provide meaningful indicators.</li>
<li><span class="uk-text-bold">Clarity and replicability:</span> We describe our construction methodology in detail, so that
it can be verified and used by the scholarly communication community to create ongoing updates to our proposed statistics and indicators.</li>
<li><span class="uk-text-bold">Readiness and timeliness:</span> The methodology is built around well-established open databases
and already tested knowledge extraction technologies - natural language processing (NLP)/machine-learning (ML) - using operational
workflows in OpenAIRE to warrant timely results.</li>
<li><span class="uk-text-bold">Trust and robustness:</span> Our methodology also strives to be reliable, robust, and aligned
to other assessment methods so that it can be operationalized, used and reused, in conjunction with other assessment methods.</li>
</ul>
<div class="uk-text-small uk-text-italic uk-text-right">The text above is modified from <a href="https://op.europa.eu/en/publication-detail/-/publication/56cc104f-0ebb-11ec-b771-01aa75ed71a1"
target="_blank">this report</a> (DOI: 10.2777/268348).</div>
</div>
<div class="uk-margin-large-top uk-padding-small">
<h3 class="uk-h4">Step-by-step</h3>
<how></how>
</div>
</div>
</div>
`
})
export class MethodologyComponent implements OnInit, OnDestroy {
public stakeholder: Stakeholder;
public tab: 'entities' | 'attributes' = 'entities';
private subscriptions: any[] = [];
public openaireEntities = OpenaireEntities;
constructor(private stakeholderService: StakeholderService,
private seoService: SEOService,
private _meta: Meta,
private _router: Router,
private route: ActivatedRoute,
private _title: Title) {
}
ngOnInit() {
this.subscriptions.push(this.stakeholderService.getStakeholderAsObservable().subscribe(stakeholder => {
this.stakeholder = stakeholder;
if (this.stakeholder) {
/* Metadata */
const url = properties.domain + properties.baseLink + this._router.url;
this.seoService.createLinkForCanonicalURL(url, false);
this._meta.updateTag({content: url}, "property='og:url'");
const description = "Methodology | " + this.stakeholder.name;
const title = "Methodology | " + this.stakeholder.name;
this._meta.updateTag({content: description}, "name='description'");
this._meta.updateTag({content: description}, "property='og:description'");
this._meta.updateTag({content: title}, "property='og:title'");
this._title.setTitle(title);
}
}));
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => {
if (subscription instanceof Subscription) {
subscription.unsubscribe();
}
});
}
}

View File

@ -0,0 +1,28 @@
import {NgModule} from "@angular/core";
import {CommonModule} from "@angular/common";
import {MethodologyComponent} from "./methodology.component";
import {RouterModule} from "@angular/router";
import {PreviousRouteRecorder} from "../../utils/piwik/previousRouteRecorder.guard";
import {PageContentModule} from "../../dashboard/sharedComponents/page-content/page-content.module";
import {HowModule} from "../../monitor/how/how.module";
import {TabsModule} from "../../utils/tabs/tabs.module";
import {IconsModule} from "../../utils/icons/icons.module";
import {IconsService} from "../../utils/icons/icons.service";
import {graph} from "../../utils/icons/icons";
@NgModule({
declarations: [MethodologyComponent],
imports: [CommonModule, RouterModule.forChild([
{
path: '',
component: MethodologyComponent,
canDeactivate: [PreviousRouteRecorder]
},
]), PageContentModule, HowModule, TabsModule, IconsModule],
exports: [MethodologyComponent]
})
export class MethodologyModule {
constructor(private iconsService: IconsService) {
this.iconsService.registerIcons([graph]);
}
}

View File

@ -0,0 +1,117 @@
import {Injectable} from "@angular/core";
import {MenuItem, RootMenuItem} from "../../sharedComponents/menu";
import {Option} from "../../sharedComponents/input/input.component";
import {StakeholderEntities} from "../entities/stakeholder";
import {from, Subscription} from "rxjs";
import {HttpClient} from "@angular/common/http";
import {properties} from "../../../../environments/environment";
import {Page} from "../../utils/entities/adminTool/page";
import {map} from "rxjs/operators";
@Injectable({
providedIn: 'root'
})
export class ResourcesService {
private subscription: Subscription;
private routes = ResourcesService.types.map(type => '/indicators/' + type.value);
public static readonly types: Option[] = [
{value: 'funder', label: StakeholderEntities.FUNDERS},
{value: 'ri', label: StakeholderEntities.RIS},
{value: 'project', label: StakeholderEntities.PROJECTS},
{value: 'organization', label: StakeholderEntities.ORGANIZATIONS}
];
constructor(private http: HttpClient) {
}
private async getResourcesItemsAsync(prefix = '', portal: string = null): Promise<MenuItem[]> {
let items = [];
let methodology = ResourcesService.setLink(new MenuItem("methodology", "Methodology", "", "", false, [],
null, {}, null, null, null, null, '_self'),
prefix + "/methodology", portal);
methodology.items = [ResourcesService.setLink(new MenuItem("methodology", "Terminology and construction",
"", "", false, [], null, {}, null, null, null, null, '_self'),
prefix + "/methodology", portal),
ResourcesService.setLink(new MenuItem("methodology", "See how it works",
"", "", false, [], null, {}, null, "how", null, null, '_self'),
prefix + "/methodology", portal)];
items.push(methodology);
let indicators = new MenuItem("indicators-page", "Indicators",
"", "", false, [], null, {}, null, null, null, null, '_self');
let promise = new Promise(resolve => {
this.isPagesEnabled().subscribe(status => {
ResourcesService.types.forEach((type, index) => {
if(status[index]) {
indicators.items.push(ResourcesService.setLink(
new MenuItem("indicators-" + type.value, type.label,
"", "", false, [], null, {}, null, null, null, null, '_self'),
prefix + "/indicators/" + type.value, portal)
);
}
});
resolve();
}, error => {
console.error(error);
resolve();
});
})
await promise;
if(indicators.items.length > 0) {
indicators.url = indicators.items[0].url;
indicators.route = indicators.items[0].route;
items.push(indicators);
}
return items;
}
/**
* @deprecated
* */
setResourcesDeprecated(items: RootMenuItem[], prefix = '', portal: string = null) {
if(this.subscription) {
this.subscription.unsubscribe();
}
let resources = new MenuItem('resources', 'Resources', "", "", false, [], null, {});
let index = items.push({rootItem: resources, items: []}) - 1;
this.subscription = from(this.getResourcesItemsAsync(prefix, portal)).subscribe(resourcesItems => {
items[index].items = resourcesItems;
});
}
setResources(items: MenuItem[], prefix = '', portal: string = null) {
if(this.subscription) {
this.subscription.unsubscribe();
}
let resources = new MenuItem('resources', 'Resources', "", "", false, [], null, {});
let index = items.push(resources) - 1;
this.subscription = from(this.getResourcesItemsAsync(prefix, portal)).subscribe(resourcesItems => {
items[index].items = resourcesItems;
});
}
public isPagesEnabled() {
let url = properties.adminToolsAPIURL + "/monitor/monitor/pages";
return this.http.get<Page[]>((properties.useLongCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url)
.pipe(map(pages => {
let result = this.routes.map(() => false);
pages.forEach(page => {
let index = this.routes.findIndex(route => route === page.route && page.isEnabled);
if(index !== -1) {
result[index] = true;
}
});
return result;
}));
}
private static setLink(item: MenuItem, route: string, portal: string = null) {
if(portal) {
item.url = portal + route + (item.fragment?'#' + item.fragment:'');
} else {
item.route = route;
}
return item;
}
}

View File

@ -15,7 +15,7 @@ svg {
&.outlined {
circle {
ill: white;
fill: white;
stroke: currentColor;
}

View File

@ -64,13 +64,13 @@
target="{{submenu.target}}">{{submenu.title}}</a>
<ul *ngIf="submenu.items && submenu.items.length > 0" class="uk-nav-sub">
<ng-container *ngFor="let subsubmenu of submenu.items">
<li>
<li [class.uk-active]="isTheActiveMenu(subsubmenu)">
<a *ngIf="subsubmenu.route.length > 0"
routerLink="{{subsubmenu.route}}" [queryParams]="subsubmenu.params"
[fragment]="subsubmenu.fragment" (click)="closeCanvas(canvas)">{{subsubmenu.title}}</a>
<a *ngIf="subsubmenu.route.length == 0 && subsubmenu.url.length > 0"
href="{{subsubmenu.url}}" (click)="closeCanvas(canvas)" class="custom-external"
target="_blank">{{subsubmenu.title}}</a>
href="{{subsubmenu.url}}" (click)="closeCanvas(canvas)" [class.custom-external]="subsubmenu.target != '_self'"
target="{{subsubmenu.target}}">{{subsubmenu.title}}</a>
</li>
</ng-container>
</ul>
@ -160,12 +160,12 @@
target="{{submenu.target}}">{{submenu.title}}</a>
<ul *ngIf="submenu.items && submenu.items.length > 0" class="uk-nav-sub">
<ng-container *ngFor="let subsubmenu of submenu.items">
<li>
<li [class.uk-active]="isTheActiveMenu(subsubmenu)">
<a *ngIf="subsubmenu.route.length > 0"
routerLink="{{subsubmenu.route}}" [queryParams]="subsubmenu.params"
[fragment]="subsubmenu.fragment">{{subsubmenu.title}}</a>
<a *ngIf="subsubmenu.route.length == 0 && subsubmenu.url.length > 0"
href="{{subsubmenu.url}}" class="custom-external" target="_blank">{{subsubmenu.title}}</a>
href="{{subsubmenu.url}}" [class.custom-external]="subsubmenu.target != '_self'" target="{{subsubmenu.target}}">{{subsubmenu.title}}</a>
</li>
</ng-container>
</ul>

View File

@ -532,12 +532,12 @@
</div>
<div>
<a href="#" class="uk-icon uk-slidenav-previous uk-slidenav">
<button href="#" class="uk-icon uk-slidenav-previous uk-slidenav">
<icon name="chevron_left" [flex]="true" ratio="1.5"></icon>
</a>
<a href="#" class="uk-icon uk-slidenav-next uk-slidenav">
</button>
<button href="#" class="uk-icon uk-slidenav-next uk-slidenav">
<icon name="chevron_right" [flex]="true" ratio="1.5"></icon>
</a>
</button>
</div>
<!--<div>
@ -742,7 +742,7 @@
<div class="uk-modal-dialog">
<div class="uk-modal-header uk-flex uk-flex-middle uk-flex-between uk-background-primary-opacity">
<h5 class="uk-modal-title uk-margin-remove">Headline</h5>
<button class="uk-modal-close-default uk-icon uk-close uk-margin-left" type="button">
<button class="uk-icon uk-close uk-margin-left" type="button">
<icon ratio="1.5" name="close"></icon>
</button>
</div>