[Monitor Dashboard | Trunk]: Create terminology page. Add notifications on beta

git-svn-id: https://svn.driver.research-infrastructures.eu/driver/dnet40/modules/uoa-monitor-portal/trunk/monitor_dashboard@60754 d315682c-612b-4755-9ff5-7f18f6832af3
This commit is contained in:
Konstantinos Triantafyllou 2021-03-31 09:35:26 +00:00
parent 3dc53e06d9
commit 13cf0e0054
12 changed files with 314 additions and 30 deletions

View File

@ -25,7 +25,7 @@
[centered]="true" [properties]="properties" [showMenuItems]="true"></bottom>
<role-verification *ngIf="stakeholder"
[id]="stakeholder.alias" [name]="stakeholder.name" [type]="stakeholder.type"></role-verification>
<notification-sidebar *ngIf="properties.environment === 'development' && user && notificationGroupsInitialized"
<notification-sidebar *ngIf="properties.environment !== 'production' && user && notificationGroupsInitialized"
[user]="user" [availableGroups]="notificationGroups" service="monitor"></notification-sidebar>
</div>
</div>

View File

@ -174,7 +174,7 @@ export class AppComponent implements OnInit, OnDestroy {
this.user = user;
if (user) {
this.buildMenu();
if(!this.notificationGroupsInitialized && this.properties.environment === 'development') {
if(!this.notificationGroupsInitialized && this.properties.environment !== 'production') {
this.setNotificationGroups();
}
}
@ -274,6 +274,10 @@ export class AppComponent implements OnInit, OnDestroy {
rootItem: new MenuItem("dashboard", "Dashboard",
"", "/" + this.stakeholder.alias, false, [], null, {}), items: []
});
this.menuItems.push({
rootItem: new MenuItem("terminology", "Terminology",
"", "/" + this.stakeholder.alias + "/terminology", false, [], null, {}), items: []
});
if(this.stakeholder.type === "funder") {
this.menuItems.push({
rootItem: new MenuItem("develop", "Develop",
@ -298,6 +302,10 @@ export class AppComponent implements OnInit, OnDestroy {
badge: false,
stickyAnimation: false
};
this.menuItems.push({
rootItem: new MenuItem("terminology", "Terminology",
"", "/" + this.stakeholder.alias + "/terminology", false, [], null, {}), items: []
});
if(this.stakeholder.type === "funder") {
this.menuItems.push({
rootItem: new MenuItem("develop", "Develop",
@ -310,7 +318,6 @@ export class AppComponent implements OnInit, OnDestroy {
"", "/admin", false, [], null, {}), items: []
});
}
if (this.isPublicOrIsMember(this.stakeholder.visibility)) {
this.specialSideBarMenuItem = new MenuItem("search", "Search research outcomes", "", this.properties.searchLinkToResults, false, [], null, {});
this.specialSideBarMenuItem.icon = '<span uk-icon="search"></span>';
@ -385,21 +392,6 @@ export class AppComponent implements OnInit, OnDestroy {
this.adminMenuItems = [];
this.specialSideBarMenuItem = null;
this.adminMenuItems.push(new MenuItem("stakeholders", "Manage profiles", "", "/admin", false, [], [], {}, "<i uk-icon=\"cog\"></i>"));
// if(Session.isPortalAdministrator(this.user) ) {
// let adminOptions = new MenuItem("adminOptions", "Admin Options","", "/admin-tools/admin-pages", false, [], [], {});
// /* adminOptions.items.push(new MenuItem("pages", "Pages", "", "/admin-tools/pages", false, [], [], {}));
// adminOptions.items.push(new MenuItem("portals", "Portals", "", "/admin-tools/portals", false, [], [], {}));
// adminOptions.items.push(new MenuItem("entities", "Entities", "", "/admin-tools/entities", false, [], [], {}));
// // adminOptions.items.push(new MenuItem("classes", "Class help texts", "", "/admin-tools/classes", false, [], [], {}));*/
// this.adminMenuItems.push(adminOptions);
// let monitorOptions = new MenuItem("monitorOptions", "Monitor Options","", "/admin-tools/admin-pages", false, [], [], {communityId: 'monitor'});
// /* monitorOptions.items.push(new MenuItem("pages", "Pages", "", "/admin-tools/pages", false, [], [], {communityId: 'monitor'}));
// monitorOptions.items.push(new MenuItem("entities", "Entities", "", "/admin-tools/entities", false, [], [], {communityId: 'monitor'}));
// // monitorOptions.items.push(new MenuItem("classes", "Class help texts", "", "/admin-tools/classContents", false, [], [], {communityId: 'monitor'}));
// monitorOptions.items.push(new MenuItem("helptexts", "Help texts", "", "/admin-tools/helptexts", false, [], [], {communityId: 'monitor'}));*/
// this.adminMenuItems.push(monitorOptions);
// }
}
}

View File

@ -14,9 +14,9 @@ import {StakeholderUtils} from "../utils/indicator-utils";
<div page-content>
<div inner>
<div *ngIf="stakeholder" class="uk-container uk-container-large uk-section-small">
<h2 class="uk-text-center">
<h1 class="uk-text-center uk-h2">
Develop
</h2>
</h1>
<div class="uk-margin-medium-top uk-card uk-card-body uk-card-default">
<h3 class="uk-text-center">Help developers with <span
class="portal-color uk-text-bold">OpenAIRE APIs</span>

View File

@ -99,7 +99,7 @@ declare var UIkit;
</div>
</div>
</form>
<div #notify notify-form [class.uk-hidden]="properties.environment !== 'development'" class="uk-width-1-1 uk-margin-medium-top uk-margin-medium-bottom"></div>
<div #notify notify-form [class.uk-hidden]="properties.environment === 'production'" class="uk-width-1-1 uk-margin-medium-top uk-margin-medium-bottom"></div>
</div>`,
styleUrls: ['edit-stakeholder.component.css']
})

View File

@ -16,7 +16,16 @@ import {EnvironmentSpecificResolver} from "../openaireLibrary/utils/properties/e
{
path: ':stakeholder/develop',
loadChildren: '../develop/develop.module#DevelopModule',
resolve: {envSpecific: EnvironmentSpecificResolver},
canDeactivate: [PreviousRouteRecorder],
data: {
hasSidebar: false,
isDashboard: false
}
},
{
path: ':stakeholder/terminology',
loadChildren: '../terminology/terminology.module#TerminologyModule',
canDeactivate: [PreviousRouteRecorder],
data: {
hasSidebar: false,
isDashboard: false
@ -25,7 +34,7 @@ import {EnvironmentSpecificResolver} from "../openaireLibrary/utils/properties/e
{
path: ':stakeholder/search',
loadChildren: '../search/search.module#SearchModule',
resolve: {envSpecific: EnvironmentSpecificResolver}
canDeactivate: [PreviousRouteRecorder]
},
{
path: ':stakeholder/:topic',

View File

@ -132,7 +132,7 @@
[class.uk-disabled]="indicator.indicatorPaths[0].filtersApplied < countSelectedFilters()"
[class.semiFiltered]="indicator.indicatorPaths[0].filtersApplied < countSelectedFilters()">
<div class="uk-card-body uk-text-center">
<div *ngIf="properties.environment == 'development'">Filtered:
<div *ngIf="properties.environment === 'development'">Filtered:
{{indicator.indicatorPaths[0].filtersApplied}}
out of
{{countSelectedFilters()}}</div>
@ -172,7 +172,7 @@
{{indicatorPath.type}}
</button>
</div>
<div *ngIf="properties.environment == 'development'">
<div *ngIf="properties.environment === 'development'">
Filtered: {{chartsActiveType.get(i + '-' + j).filtersApplied}} out of
{{countSelectedFilters()}}</div>
<iframe *ngIf=" !properties.disableFrameLoad && chartsActiveType.get(i + '-' + j).source !==

View File

@ -0,0 +1,38 @@
table {
font-size: 14px;
background-color: #FFFFFF;
}
table th, table td {
border: 1px solid #DEDEDE;
padding: 25px 40px;
vertical-align: top;
text-align: start;
}
ul.portal-circle {
list-style: none;
padding-left: 40px;
font-family: "Open Sans", sans-serif;
}
ul.portal-circle li {
margin: 0 0 2px 0;
position: relative;
}
ul.portal-circle li:before {
content: "";
border: 5px var(--portal-main-color) solid !important;
border-radius: 50px;
line-height: 21px;
margin-left: -20px;
position: absolute;
top: 7px;
}
@media only screen and (max-width: 959px) {
ul.portal-circle {
padding-left: 20px;
}
}

View File

@ -0,0 +1,224 @@
import {Component, OnDestroy, OnInit} from "@angular/core";
import {StakeholderService} from "../openaireLibrary/monitor/services/stakeholder.service";
import {Stakeholder} from "../openaireLibrary/monitor/entities/stakeholder";
import {Subscription} from "rxjs";
import {Meta, Title} from "@angular/platform-browser";
import {SEOService} from "../openaireLibrary/sharedComponents/SEO/SEO.service";
import {properties} from "../../environments/environment";
import {ActivatedRoute, Router} from "@angular/router";
@Component({
selector: 'terminology',
template: `
<div page-content>
<div inner>
<div *ngIf="stakeholder" class="uk-container uk-container-large uk-section-small">
<h1 class="uk-text-center uk-h2">
Terminology and construction
</h1>
<div class="uk-margin-large-top">
<ul class="uk-tab admin customTabs uk-margin-medium-bottom" uk-tab>
<li [class.uk-active]="tab === 'entities'"><a (click)="tab = 'entities'"><span
class="title">Entities</span></a></li>
<li [class.uk-active]="tab === 'attributes'"><a (click)="tab = 'attributes'"><span class="title">Attributes of Research Results</span></a>
</li>
</ul>
<table *ngIf="tab === 'entities'">
<tr>
<th>Research Outputs</th>
<td>
<div>There are currently four different types of research outputs types in the OpenAIRE Research
Graph:
</div>
<ul class="portal-circle">
<li>Publication</li>
<li>Dataset</li>
<li>Software</li>
<li>Other Research Products</li>
</ul>
<div class="uk-margin-small-top">
OpenAIRE deduplicates (merges) different records or research outputs and keeps the metadata of all
instances.
</div>
</td>
</tr>
<tr>
<th>Publication</th>
<td>Research outputs intended for human reading (published articles, pre-prints, conference papers,
presentations, technical reports, etc.)
</td>
</tr>
<tr>
<th>Dataset</th>
<td>Research data (granularity is not defined by OpenAIRE, which reflects the granularity supported by
the sources from which the description of the dataset has been collected)
</td>
</tr>
<tr>
<th>Software</th>
<td>Source code or software package developed and/or used in a research context.</td>
</tr>
<tr>
<th>Other Research Product</th>
<td>Anything that does not fall in the previous categories (e.g. workflow, methods, protocols).</td>
</tr>
</table>
<table *ngIf="tab === 'attributes'">
<tr>
<th>Organization & Country</th>
<td>
<p>For research output: The affiliated organizations of its authors (and their country).</p>
<p>For projects: The organizations participating in the project (i.e. beneficiaries of the grant), and
their countries (when available).
</p>
<p>
Country code mapping:
<a href="https://api.openaire.eu/vocabularies/dnet:countries" target="_blank">
https://api.openaire.eu/vocabularies/dnet:countries</a>
</p>
</td>
</tr>
<tr>
<th>Type</th>
<td>
<p>The type of research output (e.g. a publication can be a pre-print, conference proceeding, article,
etc.)</p>
<p>Resource type mapping:
<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>
</td>
</tr>
<tr>
<th>Access mode</th>
<td>
<p>The best available (across all instances) access rights of a research output.</p>
<p>Types: open, restricted, closed, embargo (= closed for a specific period of time, then open)</p>
</td>
</tr>
<tr>
<th>PID (persistent identifier)</th>
<td>
<p>A long-lasting reference to a resource</p>
<p>Types: <a href="http://api.openaire.eu/vocabularies/dnet:pid_types" target="_blank">http://api.openaire.eu/vocabularies/dnet:pid_types</a>
</p>
</td>
</tr>
<tr>
<th>Context</th>
<td>Related research community/initiative/infrastructure</td>
</tr>
<tr>
<th>Journal</th>
<td>The scientific journal an article is published in.</td>
</tr>
<tr>
<th>Publisher</th>
<td>The publisher of the venue (journal, book, etc.) of a research output</td>
</tr>
<tr>
<th>Content Provider (Datasources)</th>
<td>
<p>The different data sources ingested in the OpenAIRE Research Graph.</p>
<div>Content Provider Types: </div>
<ul class="portal-circle">
<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>
</td>
</tr>
<tr>
<th>Repository</th>
<td>Information systems where scientists upload the bibliographic metadata and payloads of their
research outputs (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).
</td>
</tr>
<tr>
<th>Open Access Publishers & Journals</th>
<td>Information systems of open access publishers or relative journals, which offer bibliographic
metadata and PDFs of their published articles.
</td>
</tr>
<tr>
<th>Aggregators</th>
<td>Information systems that collect descriptive metadata about research products from multiple sources
in order to enable cross-data source discovery of given research products. Examples are DataCite,
BASE, DOAJ.
</td>
</tr>
<tr>
<th>Entity Registries</th>
<td>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.
</td>
</tr>
<tr>
<th>CRIS (Current Research Information System)</th>
<td>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 datasets funded
by projects, their principal investigators, facilities acquired thanks to funding, etc.
</td>
</tr>
</table>
<div class="uk-text-small uk-margin-small-top">More information at <a href="https://graph.openaire.eu">https://graph.openaire.eu</a></div>
</div>
</div>
</div>
</div>
`,
styleUrls: ['terminology.component.css']
})
export class TerminologyComponent implements OnInit, OnDestroy {
public stakeholder: Stakeholder;
public tab: 'entities' | 'attributes' = 'entities';
private subscriptions: any[] = [];
constructor(private stakeholderService: StakeholderService,
private seoService: SEOService,
private _meta: Meta,
private _router: Router,
private route: ActivatedRoute,
private _title: Title) {
}
ngOnInit() {
this.subscriptions.push(this.route.fragment.subscribe(tab => {
if (tab === 'attributes') {
this.tab = tab;
} else {
this.tab = 'entities';
}
}));
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 = "Terminology | " + this.stakeholder.name;
const title = "Terminology | " + 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,21 @@
import {NgModule} from "@angular/core";
import {CommonModule} from "@angular/common";
import {TerminologyComponent} from "./terminology.component";
import {RouterModule} from "@angular/router";
import {PreviousRouteRecorder} from "../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {PageContentModule} from "../openaireLibrary/dashboard/sharedComponents/page-content/page-content.module";
@NgModule({
declarations: [TerminologyComponent],
imports: [CommonModule, RouterModule.forChild([
{
path: '',
component: TerminologyComponent,
canDeactivate: [PreviousRouteRecorder]
},
]), PageContentModule],
exports: [TerminologyComponent]
})
export class TerminologyModule {
}

View File

@ -353,7 +353,7 @@
</div>
</div>
<div #editNumberNotify notify-form class="uk-width-1-1 uk-margin-medium-top"
[class.uk-hidden]="properties.environment !== 'development'"></div>
[class.uk-hidden]="properties.environment === 'production'"></div>
</div>
</modal-alert>
<modal-alert #editChartModal
@ -484,7 +484,7 @@
</div>
</div>
<div #editChartNotify notify-form class="uk-width-1-1 uk-margin-medium-top"
[class.uk-hidden]="properties.environment !== 'development'"></div>
[class.uk-hidden]="properties.environment === 'production'"></div>
</div>
</modal-alert>
<modal-alert #deleteModal (alertOutput)="deleteIndicator()">
@ -498,7 +498,7 @@
<!-- </span>-->
Are you sure you want to proceed?
<div #deleteNotify notify-form class="uk-width-1-1 uk-margin-medium-top"
[class.uk-hidden]="properties.environment !== 'development'"></div>
[class.uk-hidden]="properties.environment === 'production'"></div>
</modal-alert>
<!--<modal-alert #deleteAllModal (alertOutput)="deleteIndicator('delete')">
You are about to delete <span class="uk-text-bold" *ngIf="indicator && index !== -1">

View File

@ -10,7 +10,7 @@
</ul>
</ng-template>
<role-users *ngIf="!loading && alias" [id]="alias" [type]="type" [name]="name" [link]="link" [role]="tab" [message]="messages.get(tab)"
[emailComposer]="emailComposer" [notificationFn]="(properties.environment === 'development')?notificationFn:null">
[emailComposer]="emailComposer" [notificationFn]="(properties.environment !== 'production')?notificationFn:null">
<ng-container [ngTemplateOutlet]="tabs"></ng-container>
</role-users>

View File

@ -63,7 +63,7 @@ export let properties: EnvProperties = {
// monitorServiceAPIURL: "https://services.openaire.eu/uoa-monitor-service",
monitorServiceAPIURL: "http://duffy.di.uoa.gr:8080/uoa-monitor-service",
adminToolsAPIURL: "http://duffy.di.uoa.gr:8080/uoa-monitor-service/",
notificationsAPIURL: "http://mpagasas.di.uoa.gr:8080/uoa-admin-tools/notification/",
notificationsAPIURL: "http://duffy.di.uoa.gr:8080/uoa-monitor-service/notification/",
adminToolsCommunity: "monitor",
useHelpTexts: false,
datasourcesAPI: "https://beta.services.openaire.eu/openaire/ds/search/",