Merge remote-tracking branch 'origin/master' into angular-14

This commit is contained in:
Konstantina Galouni 2022-10-20 17:27:35 +03:00
commit cea34c6bba
10 changed files with 564 additions and 539 deletions

View File

@ -1,9 +1,10 @@
<div>
<div class="uk-width-large">
<div class="uk-width-xlarge@l uk-width-large">
<advanced-search-input>
<div input type="select" [(value)]="showOptions.show" placeholder="Type" hint="Select..."
[options]="showOptions.selectOptions"></div>
<div input type="text" [(value)]="keyword" [searchable]="true" placeholder="Entities to link" [hint]="'Search for ' + openaireEntities.COMMUNITIES + '...'"></div>
[options]="showOptions.selectOptions" class="uk-width-2-5"></div>
<div class="uk-width-expand" input type="text" [(value)]="keyword" [searchable]="true" placeholder="Entities to link"
[hint]="'Search for ' + openaireEntities.COMMUNITIES + '...'" tooltip="true"></div>
</advanced-search-input>
</div>
<div *ngIf="communities"class="uk-padding">

View File

@ -1,8 +1,9 @@
<div class="uk-width-large">
<div class="uk-width-xlarge@l uk-width-large">
<advanced-search-input (searchEmitter)="search(page,size)">
<div input type="select" [(value)]="showOptions.show" placeholder="Type" hint="Select..."
[options]="showOptions.selectOptions"></div>
<div input type="text" [(value)]="keyword" [searchable]="true" placeholder="Entities to link" [hint]="'Search for ' + openaireEntities.PROJECTS + '...'"></div>
[options]="showOptions.selectOptions" class="uk-width-2-5"></div>
<div class="uk-width-expand" input type="text" [(value)]="keyword" [searchable]="true" placeholder="Entities to link"
[hint]="'Search for ' + openaireEntities.PROJECTS + '...'" tooltip="true"></div>
</advanced-search-input>
</div>
<div *ngIf="!showResults">

View File

@ -1,11 +1,12 @@
<div *ngIf="showOptions && showOptions.linkToEntities.length > 0" class="uk-width-large">
<div *ngIf="showOptions && showOptions.linkToEntities.length > 0" class="uk-width-xlarge@l uk-width-large">
<advanced-search-input (searchEmitter)="search(true)">
<div input type="select" [(value)]="showOptions.show" placeholder="Type" hint="Select..."
[options]="showOptions.selectOptions"></div>
<div input type="text" [(value)]="keyword" [searchable]="true" placeholder="Entities to link" [hint]="'Search for ' + openaireEntities.RESULTS.toLowerCase() + '...'"></div>
[options]="showOptions.selectOptions" class="uk-width-2-5"></div>
<div class="uk-width-expand" input type="text" [(value)]="keyword" [searchable]="true" placeholder="Entities to link"
[hint]="'Search for ' + openaireEntities.RESULTS.toLowerCase() + '...'" tooltip="true"></div>
</advanced-search-input>
</div>
<div *ngIf="!showOptions" class="uk-width-large">
<div *ngIf="!showOptions" class="uk-width-xlarge@l uk-width-large">
<div search-input [(value)]="keyword" [placeholder]="'Search for ' + openaireEntities.RESULTS.toLowerCase() + '...'"
(searchEmitter)="search(true)"></div>
</div>

View File

@ -214,59 +214,58 @@ export class IndicatorPath {
}
export type FilterType = "fundingL0"|"start_year" | "end_year" | "co-funded";
export class IndicatorFilterUtils{
static getFilter(field: string, filterType:FilterType) {
if(["publication", "software", "dataset", "other", "result"].indexOf(field)!=-1){
return this.getResultFilter(field,filterType);
}else if (field == "project"){
static getFilter(fieldPath: string, filterType:FilterType) {
if((filterType == "start_year" || filterType == "end_year") && (fieldPath.indexOf(".year") != -1 || fieldPath.indexOf(".start year") != -1)
&& fieldPath.indexOf("indi_pub_downloads_year.year") == -1){
// make it work for any table with field year or start year no matter the type or the table name
//exclude indi_pub_downloads_year.year because it throws errors. when there is a solution remove the exclusion
if (filterType == "start_year") {
return '{"groupFilters":[{"field":"' + fieldPath + '","type":">=","values":["' + ChartHelper.prefix + 'start_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
} else if (filterType == "end_year") {
return '{"groupFilters":[{"field":"' + fieldPath + '","type":"<=","values":["' + ChartHelper.prefix + 'end_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
}
}
let table = fieldPath&&fieldPath.length > 0? fieldPath.split(".")[0]:"";
if(["publication", "software", "dataset", "other", "result"].indexOf(table)!=-1){
return this.getResultFilter(table,filterType);
}else if (table == "project"){
return this.getProjectFilter(filterType);
}
else if (field == "country"){
else if (table == "country"){
return this.getCountryFilter(filterType);
}else if (field == "organization"){
}else if (table == "organization"){
return this.getOrganizationFilter(filterType);
}
}
static getResultFilter(dbType: string = null, filterType:FilterType) {
static getResultFilter(table: string = null, filterType:FilterType) {
//works for tables ["publication", "software", "dataset", "other", "result"]
if (filterType == "fundingL0") {
if(properties.useOldStatisticsSchema) {
return '{"groupFilters":[{"field":"' + dbType + '.project.funding level 0","type":"=","values":["' + ChartHelper.prefix + 'fundingL0' + ChartHelper.suffix + '"]}],"op":"AND"}';
return '{"groupFilters":[{"field":"' + table + '.project.funding level 0","type":"=","values":["' + ChartHelper.prefix + 'fundingL0' + ChartHelper.suffix + '"]}],"op":"AND"}';
}else{//new statistcs schema
return '{"groupFilters":[{"field":"' + dbType + '.project funding level 0","type":"=","values":["' + ChartHelper.prefix + 'fundingL0' + ChartHelper.suffix + '"]}],"op":"AND"}';
return '{"groupFilters":[{"field":"' + table + '.project funding level 0","type":"=","values":["' + ChartHelper.prefix + 'fundingL0' + ChartHelper.suffix + '"]}],"op":"AND"}';
}
} else if (filterType == "start_year") {
return '{"groupFilters":[{"field":"' + dbType + '.year","type":">=","values":["' + ChartHelper.prefix + 'start_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
} else if (filterType == "end_year") {
return '{"groupFilters":[{"field":"' + dbType + '.year","type":"<=","values":["' + ChartHelper.prefix + 'end_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
}else if (filterType == "co-funded") {
return '{"groupFilters":[{"field":"' + dbType + '.No of funders","type":">","values":["1"]}],"op":"AND"}';
return '{"groupFilters":[{"field":"' + table + '.No of funders","type":">","values":["1"]}],"op":"AND"}';
}
}
static getProjectFilter( filterType:FilterType) {
//works for table "project"
if (filterType == "fundingL0") {
return '{"groupFilters":[{"field":"project.funding level 0","type":"=","values":["' + ChartHelper.prefix + 'fundingL0' + ChartHelper.suffix + '"]}],"op":"AND"}';
} else if (filterType == "start_year") {
return '{"groupFilters":[{"field":"project.start year","type":">=","values":["' + ChartHelper.prefix + 'start_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
} else if (filterType == "end_year") {
return '{"groupFilters":[{"field":"project.start year","type":"<=","values":["' + ChartHelper.prefix + 'end_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
}
}
static getOrganizationFilter( filterType:FilterType) {
//works for table "organization"
if (filterType == "fundingL0") {
return '{"groupFilters":[{"field":"organization.project.funding level 0","type":"=","values":["' + ChartHelper.prefix + 'fundingL0' + ChartHelper.suffix + '"]}],"op":"AND"}';
} else if (filterType == "start_year") {
return '{"groupFilters":[{"field":"organization.project.start year","type":">=","values":["' + ChartHelper.prefix + 'start_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
} else if (filterType == "end_year") {
return '{"groupFilters":[{"field":"organization.project.start year","type":"<=","values":["' + ChartHelper.prefix + 'end_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
}
}
static getCountryFilter( filterType:FilterType) {
//works for table "country"
if (filterType == "fundingL0") {
return '{"groupFilters":[{"field":"country.organization.project.funding level 0","type":"=","values":["' + ChartHelper.prefix + 'fundingL0' + ChartHelper.suffix + '"]}],"op":"AND"}';
} else if (filterType == "start_year") {
return '{"groupFilters":[{"field":"country.organization.project.start year","type":">=","values":["' + ChartHelper.prefix + 'start_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
} else if (filterType == "end_year") {
return '{"groupFilters":[{"field":"country.organization.project.start year","type":"<=","values":["' + ChartHelper.prefix + 'end_year' + ChartHelper.suffix + '"]}],"op":"AND"}';
}
}

View File

@ -6,6 +6,7 @@ import {OpenaireEntities} from "../../utils/properties/searchFields";
import {SEOService} from "../../sharedComponents/SEO/SEO.service";
import {properties} from "../../../../environments/environment";
import {Breadcrumb} from "../../utils/breadcrumbs/breadcrumbs.component";
import Timeout = NodeJS.Timeout;
declare var ResizeObserver;
@ -20,426 +21,384 @@ declare var ResizeObserver;
<span class="uk-text-meta">.</span>
</div>
</div>
<div class="uk-container uk-container-large uk-section uk-section-small uk-padding-remove-bottom">
<div class="uk-padding-small uk-padding-remove-horizontal">
<breadcrumbs [breadcrumbs]="breadcrumbs"></breadcrumbs>
</div>
</div>
<div class="uk-background-muted">
<div class="uk-container uk-container-large uk-section uk-section-small">
<div class="uk-padding-small uk-padding-remove-horizontal">
<breadcrumbs [breadcrumbs]="breadcrumbs"></breadcrumbs>
</div>
<div class="uk-text-center" uk-scrollspy-class>
<h1 class="uk-margin-medium-top uk-margin-medium-bottom">Terminology and <br> construction<span class="uk-text-primary">.</span></h1>
</div>
</div>
</div>
<div class="uk-section" uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-fade; delay: 250">
<div class="uk-container uk-container-large" uk-scrollspy-class>
<h1>Terminology and <br> construction<span class="uk-text-primary">.</span></h1>
</div>
<div class="uk-section uk-container uk-container-large" uk-scrollspy-class>
<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">Research Products</dt>
<dd class="uk-width-expand">
<div>There are four different types of research products in the
OpenAIRE Research Graph:
</div>
<ul class="uk-list uk-list-bullet uk-list-primary">
<li>Publications</li>
<li>Research data</li>
<li>Research software</li>
<li>Other research products.</li>
</ul>
<div class="uk-margin-small-top">
We deduplicate (merge) different records of research products and keep the 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">Publication</dt>
<dd class="uk-width-expand">
Research products intended for human reading (published articles, pre-prints, conference
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">Research data</dt>
<dd class="uk-width-expand">
<div>
The sources from which the description of the research data has been collected reflect and support their own granularity, we do not define it.
</div>
</dd>
</div>
<hr>
<div class="uk-grid uk-padding-small" uk-grid>
<dt class="uk-width-1-5@m uk-width-1-1">Research software</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">Other research product</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">
We either inherit the attributes of entities via entries in the harvested metadata records or automatically generate them using our inference system (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">Organization</dt>
<dd class="uk-width-expand">
<p><span class="uk-text-bold">For research products,</span> this refers to the
affiliated organizations of its authors</p>
<p><span class="uk-text-bold">For projects:</span>
the organizations participating in
the project
(i.e. beneficiaries of the grant)</p>
<p>
<div id="parentContainer" class="uk-grid uk-grid-large" uk-grid>
<div class="uk-width-1-4@m uk-visible@m">
<div class="uk-sticky" uk-sticky="bottom: !#parentContainer; offset: 100;">
<ul class="uk-tab uk-tab-left">
<li class="uk-margin-small-bottom" [class.uk-active]="activeSection === 'entities'">
<a routerLink="./" fragment="entities">1. Entities</a>
</li>
<li class="uk-margin-small-bottom" [class.uk-active]="activeSection === 'inherited-and-inferred-attributes'">
<a routerLink="./" fragment="inherited-and-inferred-attributes">2. Inherited and Inferred Attributes</a>
</li>
<li class="uk-margin-small-bottom" [class.uk-active]="activeSection === 'constructed-attributes'">
<a routerLink="./" fragment="constructed-attributes">3. Constructed Attributes</a>
</li>
</ul>
</div>
</div>
<div class="uk-width-1-1 uk-hidden@m">
<div class="uk-sticky uk-background-default" uk-sticky>
<ul class="uk-tab">
<li [class.uk-active]="activeSection === 'entities'">
<a routerLink="./" fragment="entities">1. Entities</a>
</li>
<li [class.uk-active]="activeSection === 'inherited-and-inferred-attributes'">
<a routerLink="./" fragment="inherited-and-inferred-attributes">2. Inherited and Inferred Attributes</a>
</li>
<li [class.uk-active]="activeSection === 'constructed-attributes'">
<a routerLink="./" fragment="constructed-attributes">3. Constructed Attributes</a>
</li>
</ul>
</div>
</div>
<div class="uk-width-expand@m uk-margin-left">
<div id="entities" class="uk-margin-large-bottom">
<!-- Helptext below here -->
<div>
<h4>1. Entities</h4>
<h6 class="uk-text-primary">Research Products</h6>
<div>
There are four different types of research products in the
OpenAIRE Research Graph:
</div>
<ul class="uk-list uk-list-bullet uk-list-primary">
<li>Publications</li>
<li>Research data</li>
<li>Research software</li>
<li>Other research products.</li>
</ul>
<div class="uk-margin-small-top">
We deduplicate (merge) different records of research products and keep the metadata of all instances.
</div>
<h6>Publication</h6>
<div>
Research products intended for human reading (published articles, pre-prints, conference
papers, presentations, technical reports, etc.)
</div>
<h6>Research data</h6>
<div>
The sources from which the description of the research data has been collected reflect and support their own granularity, we do not define it.
</div>
<h6>Research software</h6>
<div>
Source code or software package developed and/or used in a research context
</div>
<h6>Other research product</h6>
<div>
Anything that does not fall in the previous categories (e.g. workflow, methods, protocols)
</div>
</div>
</div>
<div id="inherited-and-inferred-attributes" class="uk-margin-large-bottom">
<!-- Helptext below here -->
<div>
<h4>2. Inherited and Inferred Attributes</h4>
<div class="uk-margin-medium-top">
We either inherit the attributes of entities via entries in the harvested metadata records or automatically generate them using our inference system (text and data mining algorithms).
</div>
<h6>Organization</h6>
<div>
<p><span class="uk-text-bold">For research products,</span> this refers to the
affiliated organizations of its authors</p>
<p><span class="uk-text-bold">For projects:</span>
the organizations participating in
the project
(i.e. beneficiaries of the grant)</p>
<p>
We are improving the organization database with the use of our <a href="https://orgs.openaire.eu/" target="_blank">OpenOrgs</a> tool. It allows curators to disambiguate organizations (merge different names of the same organization) and identify parent-child relationships (schools, departments, etc.).
</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 organization. </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 project 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 research products
and projects 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">For funder who want to join OpenAIRE: </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 research outcome (e.g.,
a publication 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 research product</p>
<p>Types (by best available):</p>
</div>
<h6>Country</h6>
<div>
<p>The country of the organization.</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>
</div>
<h6>Funder</h6>
<div>
<p>Funders that have joined OpenAIRE, i.e. their project 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 research products
and projects 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">For funder who want to join OpenAIRE: </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>
</div>
<h6>Type</h6>
<div>
<p>The sub-type of a research outcome (e.g.,
a publication 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>
</div>
<h6>Access mode or access rights</h6>
<div>
<p>The best available (across all instances) access rights of
a research product</p>
<p>Types (by best available):</p>
<p><span class="uk-text-bold">Open:</span> Open Access</p>
<p><span class="uk-text-bold">Embargo:</span> Closed for a specific period of time, then open.</p>
<p><span class="uk-text-bold">Restricted:</span> Definition of restricted may vary by data source, it may refer to access rights being given to registered users, potentially behind a paywall.</p>
<p><span class="uk-text-bold">Closed:</span> Closed access</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 research community, 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 research product.
</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">Data sources (content providers)</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
research products (e.g. PDFs of their scientific articles, CSVs of their data,
archive with their
software), due to obligations from their organizations, 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 research products
from multiple sources
in order to enable cross-data source discovery of given research products (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 projects 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 organizations to
keep track of their research
administration records and relative results; examples of CRIS content are articles
or research data funded
by projects, their principal investigators, facilities acquired
thanks to funding, etc.
</dd>
</div>
</dl>
</li>
<li>
<div class="uk-text-center uk-padding">
All attributes in this tab are constructed by us, with the methodology presented 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">How we build it</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 follow <a target="_blank" href="https://support.unpaywall.org/support/solutions/articles/44001792752-how-do-we-decide-if-a-given-journal-is-fully-oa-">Unpaywalls approach</a> on defining fully Open Access journals and publishers and we construct the lists of the latter using Unpaywall data.</p>
<p>In brief, a journal is fully Open Access if one or more of the following occur: </p>
<ol>
<li>It is in the Directory of Open Access Journals (DOAJ)</li>
<li>It has a known fully OA Publisher (curated list).</li>
<li>It only publishes OA articles.</li>
</ol>
</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.</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: <a href="https://www.coalition-s.org/transformative-journals-faq/" target="_blank">Plan S initiative</a></p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>
We identify Transformative Journals by ISSN matching with the publicly available <a href="https://journalcheckertool.org/transformative-journals/" target="_blank">Transformative Journals data</a> from Plan S initiative.
</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>
<p>In other words, fully OA journals are either diamond, or charge APCs.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>
We obtain APC data from DOAJ using <a href="https://doaj.org/docs/public-data-dump/" target="_blank">DOAJs Public Data Dump</a> (an exportable version of the journal metadata). We used it to determine whether a particular fully OA journal charges APCs.
</div>
<h6>CC license</h6>
<div>
<p>A Creative Commons copyright license <a href="(https://creativecommons.org/)" target="_blank">(https://creativecommons.org/)</a>
</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>We define fully OA journals 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>We define hybrid journals 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>We utilize the usage data for the downloads from <a href="https://www.openaire.eu/guides-usage-counts" target="_blank">OpenAIREs Usage Counts service</a> that harvests it from a set of
datasources. The time range of available downloads varies for each datasource.</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>
<h6>PID (persistent identifier)</h6>
<div>
<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>
</div>
<h6>Context</h6>
<div>
<p>Related research community, initiative or infrastructure.</p>
</div>
<h6>Journal</h6>
<div>
<p>The scientific journal an article is published in.</p>
</div>
<h6>Publisher</h6>
<div>
<p>The publisher of the venue (journal, book, etc.) of a research product.</p>
</div>
<h6>Data sources (content providers)</h6>
<div>
<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>
</div>
<h6>Repositories</h6>
<div>
<p>Information systems where scientists upload the bibliographic metadata and payloads of their
research products (e.g. PDFs of their scientific articles, CSVs of their data,
archive with their
software), due to obligations from their organizations, their
funders, or due to community practices
(e.g. ArXiv, Europe PMC, Zenodo).</p>
</div>
<h6>Open Access Publishers & Journals</h6>
<div>
<p>Information systems of open access publishers or relative journals, which offer bibliographic
metadata and PDFs of their published articles.</p>
</div>
<h6>Aggregators</h6>
<div>
<p>Information systems that collect descriptive metadata about research products
from multiple sources
in order to enable cross-data source discovery of given research products (e,g,
DataCite,
BASE, DOAJ).</p>
</div>
<h6>Entity Registries</h6>
<div>
<p>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 projects and funding information.</p>
</div>
<h6>CRIS (Current Research Information System)</h6>
<div>
<p>Information systems adopted by research and academic organizations to
keep track of their research
administration records and relative results; examples of CRIS content are articles
or research data funded
by projects, their principal investigators, facilities acquired
thanks to funding, etc.</p>
</div>
</div>
</div>
<div id="constructed-attributes" class="uk-margin-large-bottom">
<!-- Helptext below here -->
<div>
<h4>3. Constructed Attributes</h4>
<div class="uk-margin-medium-top">
All attributes in this tab are constructed by us, with the methodology presented below.
</div>
<dl class="uk-description-list uk-description-list-divider uk-margin-medium-top">
<div class="uk-grid" 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">How we build it</dd>
</div>
<hr>
<div class=" uk-text-bold uk-text-primary">
Journal Business Models
</div>
<hr>
<div class="uk-grid " 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 follow <a target="_blank" href="https://support.unpaywall.org/support/solutions/articles/44001792752-how-do-we-decide-if-a-given-journal-is-fully-oa-">Unpaywalls approach</a> on defining fully Open Access journals and publishers and we construct the lists of the latter using Unpaywall data.</p>
<p>In brief, a journal is fully Open Access if one or more of the following occur: </p>
<ol>
<li>It is in the Directory of Open Access Journals (DOAJ)</li>
<li>It has a known fully OA Publisher (curated list).</li>
<li>It only publishes OA articles.</li>
</ol>
</dd>
</div>
<hr>
<div class="uk-grid " 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-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.</p>
</dd>
</div>
<hr>
<div class="uk-grid " 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: <a href="https://www.coalition-s.org/transformative-journals-faq/" target="_blank">Plan S initiative</a></p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>
We identify Transformative Journals by ISSN matching with the publicly available <a href="https://journalcheckertool.org/transformative-journals/" target="_blank">Transformative Journals data</a> from Plan S initiative.
</p>
</dd>
</div>
<hr>
<div class=" uk-text-bold uk-text-primary">
Journal APC Business Models
</div>
<hr>
<div class="uk-grid " 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>
<p>In other words, fully OA journals are either diamond, or charge APCs.</p>
</dd>
<dd class="uk-width-1-3@m uk-width-1-1">
<p>
We obtain APC data from DOAJ using <a href="https://doaj.org/docs/public-data-dump/" target="_blank">DOAJs Public Data Dump</a> (an exportable version of the journal metadata). We used it to determine whether a particular fully OA journal charges APCs.
</p>
</dd>
</div>
<hr>
<div class=" uk-text-bold uk-text-primary">
Routes to Open Access (OA)
</div>
<hr>
<div class="uk-grid " 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-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>We define fully OA journals above.</p>
</dd>
</div>
<hr>
<div class="uk-grid " 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>We define hybrid journals 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-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-text-bold uk-text-primary">
Miscellaneous
</div>
<hr>
<div class="uk-grid " 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>We utilize the usage data for the downloads from <a href="https://www.openaire.eu/guides-usage-counts" target="_blank">OpenAIREs Usage Counts service</a> that harvests it from a set of
datasources. The time range of available downloads varies for each datasource.</p>
</dd>
</div>
</dl>
</div>
</div>
</div>
</div>
</div>
</div>
`
@ -452,6 +411,10 @@ export class TerminologyComponent implements OnInit, OnDestroy {
public graph_offset: number = 0;
public graph_height: number = 0;
@ViewChild("graph_element") graph_element;
public contentSections: string[] = ['entities', 'inherited-and-inferred-attributes', 'constructed-attributes'];
public activeSection: string;
private observer: IntersectionObserver;
private timeout: Timeout;
constructor(private seoService: SEOService,
private meta: Meta,
@ -469,6 +432,13 @@ export class TerminologyComponent implements OnInit, OnDestroy {
this.breadcrumbs[0].route = '/' + (params['stakeholder']?params['stakeholder']:'');
this.breadcrumbs[0].name = (params['stakeholder']?'dashboard':'home');
}));
this.subscriptions.push(this.route.fragment.subscribe(fragment => {
if(fragment) {
this.activeSection = fragment;
} else {
this.activeSection = 'entities';
}
}));
}
ngAfterViewInit() {
@ -476,6 +446,9 @@ export class TerminologyComponent implements OnInit, OnDestroy {
if(this.graph_element) {
this.observeGraphElement();
}
setTimeout(() => {
this.setObserver();
});
}
}
@ -491,8 +464,35 @@ export class TerminologyComponent implements OnInit, OnDestroy {
subscription.unsubscribe();
}
});
if(this.observer) {
this.observer.disconnect();
}
}
private setObserver() {
if(this.observer) {
this.observer.disconnect();
}
this.observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if(entry.isIntersecting) {
if(this.timeout) {
clearTimeout(this.timeout);
}
this.timeout = setTimeout(() => {
this.router.navigate(['./'], {fragment: entry.target.id, relativeTo: this.route, state: {disableScroll: true}});
}, 200);
}
});
}, {threshold: 0.25});
this.contentSections.forEach(section => {
let element = document.getElementById(section);
if(element) {
this.observer.observe(element);
}
});
}
public observeGraphElement() {
let resizeObs = new ResizeObserver(entries => {
entries.forEach(entry => {

View File

@ -219,7 +219,7 @@ export class SearchAllComponent {
this.activeEntity = ((["result","projects","organizations","datasources","services"]).indexOf(params["active"])!= -1)?params["active"]:this.getDefaultEntityToShow();
}else if (this.activeEntity !=null && (!params["active"] || params["active"].length ==0)){
this.parameters["active"]=this.activeEntity;
if(location.search && location.search.indexOf("active=") == -1){
if((typeof document !== 'undefined') && location.search && location.search.indexOf("active=") == -1){
this.location.go(location.pathname, ((location.search)?(location.search+"&"):("?")) +"active=" + this.activeEntity);
}
}

View File

@ -157,8 +157,9 @@
<advanced-search-input [class.uk-hidden]="disableSelect" [dark]="dark" [disabled]="isDisabled" (searchEmitter)="simpleKeywordChanged()">
<entities-selection [simpleView]="true" [currentEntity]="entityType"
(selectionChange)="simpleEntityChanged($event)" (disableSelectEmitter)="disableSelectChange($event)"
[onChangeNavigate]="true" [customFilter]="customFilter"></entities-selection>
<div input placeholder="Scholary works" [searchable]="true" [hint]="formPlaceholderText" [(value)]="selectedFields[0].value"></div>
[onChangeNavigate]="true" [customFilter]="customFilter" class="uk-width-2-5"></entities-selection>
<div class="uk-width-expand" input placeholder="Scholary works" [searchable]="true" [hint]="formPlaceholderText"
[(value)]="selectedFields[0].value" tooltip="true"></div>
</advanced-search-input>
<div *ngIf="selectedFields[0] && disableSelect" search-input [disabled]="isDisabled" [(value)]="selectedFields[0].value"
[placeholder]="formPlaceholderText" (searchEmitter)="simpleKeywordChanged()"></div>

View File

@ -60,7 +60,7 @@ declare var UIkit;
<label>{{placeholderInfo.label}} <sup *ngIf="required">*</sup></label>
</div>
<div class="uk-flex" [class.uk-flex-middle]="type !== 'textarea'"
[attr.uk-tooltip]="(tooltip && formControl.value && !focused && type !== 'chips' && type !== 'textarea')?('title: ' + getTooltip(formControl.value) + '; delay: 500; pos: bottom-left'):null">
[attr.uk-tooltip]="(tooltip && !focused && type !== 'chips' && type !== 'textarea')?('title: ' + getTooltip(formControl.value ? (formControl.value) : (placeholderInfo?.static?placeholderInfo.label:hint)) + '; delay: 500; pos: bottom-left'):null">
<ng-template [ngIf]="type === 'text' || type === 'URL' || type === 'logoURL'">
<input #input class="input" [attr.placeholder]="placeholderInfo?.static?placeholderInfo.label:hint"
[formControl]="formAsControl" [class.uk-text-truncate]="!focused">

View File

@ -1,23 +1,33 @@
<a (click)="open()"
[title]="'Send data to cloud storage [demo]'"
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'"
> <span icon="cloud-upload"></span>
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
<span uk-icon="cloud-upload"></span>
</span>
</a>
<a (click)="open()"
[title]="'Send data to cloud storage [demo]'"
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'"
> <span icon="cloud-upload"></span>
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
<span uk-icon="cloud-upload"></span>
</span>
</a>
<!-- This is the modal -->
<modal-alert #egiTransferModal large="true" >
<div *ngIf="selectedSourceUrl" class="">
<modal-alert #egiTransferModal large="true" [okDisabled]="destinationPath.length == 0 || status == 'success'
||status == 'loading' || !validatePath() || (!this.downloadElements || this.downloadElements.length == 0)"
(alertOutput)="transfer()" >
<div *ngIf="!accessToken" class="">
<div class="uk-width-1-1 uk-margin-top uk-margin-bottom uk-text-center">
In order to send data to a Cloud Storage, you would need to be authenticated, please login via EGI check-in.
</div>
<div class="uk-text-center">
<button *ngIf="!accessToken" class="uk-button uk-button-default" (click)="checkin()">Login
</button>
</div>
</div>
<div *ngIf="accessToken" class="">
<div class="uk-width-1-1 uk-margin-top uk-margin-bottom uk-text-center">
You have requested to send the data corresponding to the DOI <a [href]="selectedSourceUrl" target="_blank">{{selectedSourceUrl.split(doiPrefix)[1]}}</a> to a cloud storage using the EOSC Data Transfer service
</div>
<div class="uk-grid uk-child-width-1-2 uk-grid-divider">
<!-- Source -->
<div class="uk-first-column">
<div class="uk-first-column source">
<p class="uk-text-meta uk-text-xsmall uk-margin-remove-bottom uk-margin-top">Available Zenodo DOI URLs:</p>
<div input type="select" [(value)]="selectedSourceUrl" placeholder="Zenodo DOI URL" hint="Select..."
[options]="sourceUrls" (valueChange)="this.parse()"></div>
@ -33,41 +43,28 @@
</div>
</div>
<!-- Destination -->
<div>
<div class="destination">
<p class="uk-text-meta uk-text-xsmall uk-margin-remove-bottom uk-margin-top">Please select the Destination Storage type:</p>
<div input type="select" [(value)]="selectedDestination" placeholder="Destination Storage" hint="Select..."
[options]="destinationOptions"></div>
<div *ngIf=" selectedDestination.id == 'dcache' && !accessToken[selectedDestination.id] else showDestinationOptions" class="">
<div class="uk-width-1-1 uk-margin-top uk-margin-bottom uk-text-center">
In order to send data to a Cloud Storage, you would need to be authenticated, please login via EGI check-in.
</div>
<div class="uk-text-center">
<button *ngIf="!accessToken[selectedDestination.id]" class="uk-button uk-button-default" (click)="checkin()">Login
</button>
</div>
</div>
<ng-template #showDestinationOptions>
<ng-container *ngIf="selectedDestination.id == 'dcache'">
<p class="uk-text-meta uk-text-xsmall uk-margin-remove-bottom uk-margin-top">Provide the corresponding storage destination path:</p>
<div input [(value)]="destinationPath" placeholder="Give a destination path..."
[validators]="validators" class=""></div>
<div *ngIf="selectedDestination.hasBrowse">
<p class="uk-text-meta uk-text-xsmall uk-margin-remove-bottom uk-margin-top"> or <a class="uk-text-primary" (click)="browseFolder(selectedDestination.defaultFolder)">browse</a> and select the folder</p>
<div *ngIf="folders[selectedDestination.defaultFolder]" class="uk-height-max-large uk-panel-scrollable">
<ng-container *ngTemplateOutlet="folderListTmpl; context: { folder : folders[selectedDestination.defaultFolder], folderPath: selectedDestination.defaultFolder}"></ng-container>
</div>
[options]="destinationOptions"></div>
<ng-container *ngIf="selectedDestination.id == 'dcache'">
<p class="uk-text-meta uk-text-xsmall uk-margin-remove-bottom uk-margin-top">Provide the corresponding storage destination path:</p>
<div input [(value)]="destinationPath" placeholder="Give a destination path..."
[validators]="validators" class=""></div>
<div *ngIf="selectedDestination.hasBrowse">
<p class="uk-text-meta uk-text-xsmall uk-margin-remove-bottom"> or <a
class="uk-text-primary" (click)="browseFolder(selectedDestination.defaultFolder)">browse</a> to
select a folder.</p>
<div *ngIf="folders[selectedDestination.defaultFolder]" class="uk-height-small uk-overflow-auto">
<ng-container *ngTemplateOutlet="folderListTmpl; context: { folder : folders[selectedDestination.defaultFolder], folderPath: selectedDestination.defaultFolder}"></ng-container>
</div>
</ng-container>
<ng-container *ngIf="selectedDestination.id == 'ftp'">
<p>Comming soon!</p>
</ng-container>
</ng-template>
<button (click)="transfer()"
class="uk-button uk-button-primary uk-margin-top"
[class.uk-disabled]="destinationPath.length == 0 || status == 'success' ||status == 'loading' || !validatePath() || (!this.downloadElements || this.downloadElements.length == 0)">
>> Transfer
</button>
</div>
</ng-container>
<ng-container *ngIf="selectedDestination.id == 'ftp'">
<p>Comming soon!</p>
</ng-container>
</div>
</div>
<div *ngIf="status == 'loading'" class="uk-flex uk-flex-center uk-text-muted">
@ -131,24 +128,28 @@
<ng-template #fileTmpl let-file="file">
<div class="uk-grid uk-grid-small uk-flex uk-flex-middle">
<span uk-icon="file"></span>
<!-- <span uk-icon="file"></span>-->
<span class="uk-width-expand uk-text-truncate">{{file['name']}}</span>
<span class="uk-width-auto uk-text-truncate">{{(file.createdAt?file.createdAt:file.modifiedAt) |date : 'medium'}}</span>
<span
class="uk-width-auto uk-text-truncate uk-text-small uk-text-italic">{{(file.createdAt?file.createdAt:file.modifiedAt) |date : 'medium'}}</span>
</div>
</ng-template>
<ng-template #folderTmpl let-folder="folder" let-folderPath="folderPath">
<div *ngIf="folder" [class.uk-background-muted]="destinationPath == folderPath">
<div class="uk-grid uk-grid-small uk-flex uk-flex-middle">
<a (click)="browseFolder(folderPath)">
<a >
<div class="uk-grid uk-grid-small">
<span uk-icon="triangle-down"></span> <span uk-icon="folder"></span>
<span
class="uk-width-expand uk-text-truncate">{{folder.name?folder.name:folder.accessUrl.split(selectedDestination.url)[1]}}</span>
<span class="uk-width-auto uk-text-truncate">{{(folder.createdAt?folder.createdAt:folder.modifiedAt) |date : 'medium'}}</span>
<span (click)="browseFolder(folderPath)" uk-icon="icon:triangle-down; ratio:1.1"
title="Expand/ Collapse"></span>
<span (click)="destinationPath = folderPath" title="Select folder">
<span uk-icon="folder"></span> <span
class="uk-width-expand uk-text-truncate uk-margin-small-left">{{folder.name?folder.name:folder.accessUrl.split(selectedDestination.url)[1]}}</span>
<!--<span class="uk-width-auto uk-text-truncate">{{(folder.createdAt?folder.createdAt:folder.modifiedAt) |date : 'medium'}}</span>-->
</span>
</div>
</a>
<a *ngIf="destinationPath != folderPath" (click)="destinationPath = folderPath" class="uk-button uk-button-default uk-button-small">select</a>
<!-- <a *ngIf="destinationPath != folderPath" (click)="destinationPath = folderPath" class="uk-button uk-button-default uk-button-small">select</a>-->
</div>
</div>
</ng-template>

View File

@ -11,11 +11,29 @@ declare var UIkit;
@Component({
selector: 'egi-transfer-data',
templateUrl:'./transferData.component.html'
templateUrl:'./transferData.component.html' ,
styles:[`
/*Arrow*/
/*.source:first-child::after {
content: "";
font-size: 20px;
font-weight: 600;
text-align: center;
padding-bottom: 5%;
position: absolute;
background-image: url('/assets/arrow.svg');
right: -16%;
top: 33%;
width: 20%;
background-size: contain;
background-repeat: no-repeat;
background-position: bottom;
}*/
`]
})
export class EGIDataTransferComponent {
subscriptions = [];
accessToken = {};
accessToken = null;
@Input() dois;
loginURL = properties.environment == "development"? "http://rudie.di.uoa.gr:8580/openid_connect_login":"https://explore.eosc-portal.eu/egi-login-service/openid_connect_login"
sourceUrls = [];
@ -56,36 +74,38 @@ export class EGIDataTransferComponent {
}
open(){
if(this.selectedDestinationId){
for( let option of this.destinationOptions){
if(this.selectedDestinationId == option.value.id){
this.selectedDestination = option.value;
this.accessToken = COOKIE.getCookie("EGIAccessToken");
if(this.accessToken) {
if (this.selectedDestinationId) {
for (let option of this.destinationOptions) {
if (this.selectedDestinationId == option.value.id) {
this.selectedDestination = option.value;
}
}
} else {
this.selectedDestination = this.destinationOptions[0].value;
}
for (let doi of this.dois) {
if (doi.indexOf("zenodo.") != -1) {
this.sourceUrls.push(this.doiPrefix + doi);
}
}
}else{
this.selectedDestination = this.destinationOptions[0].value;
}
if(this.selectedDestination.cookieName && COOKIE.getCookie(this.selectedDestination.cookieName)) {
this.accessToken[this.selectedDestination.id] = COOKIE.getCookie(this.selectedDestination.cookieName);
}
for (let doi of this.dois) {
if (doi.indexOf("zenodo.") != -1) {
this.sourceUrls.push(this.doiPrefix + doi);
try {
this.sourceUrls.sort(function (a, b) {
return Number(b.split("zenodo.")[1]) - Number(a.split("zenodo.")[1]);
});
} catch (e) {
}
this.selectedSourceUrl = this.sourceUrls[0];
this.parse();
}
try {
this.sourceUrls.sort(function (a, b) {
return Number(b.split("zenodo.")[1]) - Number(a.split("zenodo.")[1]);
});
}catch (e){}
this.selectedSourceUrl = this.sourceUrls[0];
this.parse();
this.isOpen = true;
this.egiTransferModal.cancelButton = false;
this.egiTransferModal.okButton = false;
this.egiTransferModal.okButton = true;
this.egiTransferModal.okButtonText = ">> Transfer";
this.egiTransferModal.alertTitle = "EOSC data transfer service [demo]";
this.init();
this.egiTransferModal.open();
@ -141,7 +161,7 @@ export class EGIDataTransferComponent {
transfer() {
// console.log(this.selectedDestination)
this.status = "loading";
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
this.subscriptions.push(this.http.get(this.APIURL + "/user/info?dest="+this.selectedDestination.id, {headers: headers}).subscribe(
res => {
// console.log(res)
@ -167,7 +187,7 @@ export class EGIDataTransferComponent {
body.files.push(file);
}
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
this.subscriptions.push(this.http.post(this.APIURL + "/transfers" ,body, {headers: headers}).subscribe(
res => {
// console.log(res)
@ -227,7 +247,7 @@ export class EGIDataTransferComponent {
if(this.jobId){
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
let source = this.http.get(this.APIURL + "/transfer/" +this.jobId , {headers: headers}).pipe(delay(5000));
this.subscriptions.push(source.pipe(repeat(3)).subscribe(
res => {
@ -278,7 +298,7 @@ export class EGIDataTransferComponent {
cancel(){
if(this.jobId){
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
this.subscriptions.push(this.http.delete(this.APIURL + "/transfer/" +this.jobId , {headers: headers}).subscribe(
res => {
console.log(res);
@ -291,7 +311,7 @@ export class EGIDataTransferComponent {
}
}
hasBrowse(){
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
this.subscriptions.push(this.http.get(this.APIURL + "/storage/info?dest="+this.selectedDestination.id+"&seUrl="+encodeURIComponent(this.selectedDestination.url + this.destinationPath) , {headers: headers}).subscribe(
res => {
console.log(res);
@ -300,7 +320,8 @@ export class EGIDataTransferComponent {
}
getFolder(folderPath){
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
//TODO is this necessary?
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
this.subscriptions.push(this.http.get(this.APIURL + "/storage/folder?dest="+this.selectedDestination.id+"&seUrl="+encodeURIComponent(this.selectedDestination.url + folderPath) , {headers: headers}).subscribe(
res => {
this.folders[folderPath]= res;
@ -315,7 +336,7 @@ export class EGIDataTransferComponent {
return;
}
this.getFolder(folderPath);
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
this.subscriptions.push(this.http.get(this.APIURL + "/storage/folder/list?dest="+this.selectedDestination.id+"&folderUrl="+encodeURIComponent(this.selectedDestination.url + folderPath) , {headers: headers}).subscribe(
res => {
this.files[folderPath]= res['elements'];
@ -324,7 +345,7 @@ export class EGIDataTransferComponent {
}
createFolder(){
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
this.subscriptions.push(this.http.post(this.APIURL + "/storage/folder?dest="+this.selectedDestination.id+"&seUrl="+
encodeURIComponent(this.selectedDestination.url + this.destinationPath + "test1/") , {headers: headers}).subscribe(
res => {
@ -335,7 +356,7 @@ export class EGIDataTransferComponent {
}
deleteFolder(){
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken[this.selectedDestination.id]});
let headers = new HttpHeaders({'Authorization': 'Bearer '+this.accessToken});
this.subscriptions.push(this.http.delete(this.APIURL + "/storage/folder?dest="+this.selectedDestination.id+"&seUrl="+encodeURIComponent(this.selectedDestination.url + this.destinationPath + "test1/") , {headers: headers}).subscribe(
res => {
console.log(res);