Merge pull request 'Update for production April Release' (#2) from develop into master

Reviewed-on: #2
This commit is contained in:
Konstantinos Triantafyllou 2023-04-19 15:20:09 +02:00
commit cacf062447
18 changed files with 237 additions and 267 deletions

View File

@ -43,7 +43,7 @@
"rxjs": "^6.5.1", "rxjs": "^6.5.1",
"ts-md5": "^1.2.0", "ts-md5": "^1.2.0",
"tslib": "^2.0.0", "tslib": "^2.0.0",
"uikit": "3.12.0", "uikit": "3.12.2",
"zone.js": "~0.11.4" "zone.js": "~0.11.4"
}, },
"devDependencies": { "devDependencies": {

View File

@ -6,7 +6,8 @@
[class.sidebar_mini]="!open && (hasSidebar || hasAdminMenu || hasInternalSidebar)" [class.sidebar_hover]="hover"> [class.sidebar_mini]="!open && (hasSidebar || hasAdminMenu || hasInternalSidebar)" [class.sidebar_hover]="hover">
<div id="modal-container"></div> <div id="modal-container"></div>
<ng-container *ngIf="!isHidden"> <ng-container *ngIf="!isHidden">
<navbar *ngIf="hasHeader" portal="monitor_dashboard" [header]="menuHeader" [userMenuItems]=userMenuItems [menuItems]="menuItems" [user]="user"></navbar> <navbar *ngIf="hasHeader" portal="monitor_dashboard" [header]="menuHeader" [userMenuItems]=userMenuItems [menuItems]="menuItems" [user]="user"
[notificationConfiguration]="isMobile && user && notificationGroupsInitialized?notificationConfiguration:null"></navbar>
<div> <div>
<dashboard-sidebar *ngIf="stakeholder && isFrontPage && hasSidebar && !hasInternalSidebar" queryParamsHandling="merge" [items]="sideBarItems" <dashboard-sidebar *ngIf="stakeholder && isFrontPage && hasSidebar && !hasInternalSidebar" queryParamsHandling="merge" [items]="sideBarItems"
[activeItem]="activeTopic?activeTopic.alias:null" [activeSubItem]="activeCategory?activeCategory.alias:null"></dashboard-sidebar> [activeItem]="activeTopic?activeTopic.alias:null" [activeSubItem]="activeCategory?activeCategory.alias:null"></dashboard-sidebar>
@ -15,8 +16,7 @@
<router-outlet></router-outlet> <router-outlet></router-outlet>
</main> </main>
<bottom id="bottom" *ngIf="isFrontPage" [centered]="true" [properties]="properties" [showMenuItems]="true"></bottom> <bottom id="bottom" *ngIf="isFrontPage" [centered]="true" [properties]="properties" [showMenuItems]="true"></bottom>
<notification-sidebar *ngIf="user && notificationGroupsInitialized" [entities]="entities" <notification-sidebar *ngIf="!isMobile && user && notificationGroupsInitialized" [configuration]="notificationConfiguration" [user]="user"></notification-sidebar>
[user]="user" [availableGroups]="notificationGroups" service="monitor"></notification-sidebar>
</div> </div>
<div *ngIf="view" class="preview uk-text-small uk-flex uk-flex-middle"> <div *ngIf="view" class="preview uk-text-small uk-flex uk-flex-middle">
<span>You are currently in a <span class="uk-text-bold">"Preview"</span> mode. <span class="uk-visible@m"><a (click)="removeView()">The current view</a> of this dashboard may differ.</span></span> <span>You are currently in a <span class="uk-text-bold">"Preview"</span> mode. <span class="uk-visible@m"><a (click)="removeView()">The current view</a> of this dashboard may differ.</span></span>

View File

@ -24,6 +24,9 @@ import {SmoothScroll} from "./openaireLibrary/utils/smooth-scroll";
import {ConnectHelper} from "./openaireLibrary/connect/connectHelper"; import {ConnectHelper} from "./openaireLibrary/connect/connectHelper";
import {ResourcesService} from "./openaireLibrary/monitor/services/resources.service"; import {ResourcesService} from "./openaireLibrary/monitor/services/resources.service";
import {StringUtils} from "./openaireLibrary/utils/string-utils.class"; import {StringUtils} from "./openaireLibrary/utils/string-utils.class";
import {
NotificationConfiguration
} from "./openaireLibrary/notifications/notifications-sidebar/notifications-sidebar.component";
@Component({ @Component({
@ -41,13 +44,13 @@ export class AppComponent implements OnInit, OnDestroy {
hasAdminMenu: boolean = false; hasAdminMenu: boolean = false;
hasInternalSidebar: boolean = false; hasInternalSidebar: boolean = false;
isFrontPage: boolean = false; isFrontPage: boolean = false;
isMobile: boolean = false;
view: Visibility; view: Visibility;
sideBarItems: MenuItem[] = []; sideBarItems: MenuItem[] = [];
backItem: MenuItem = null; backItem: MenuItem = null;
menuItems: MenuItem[] = []; menuItems: MenuItem[] = [];
notificationGroups: Option[] = [];
entities: string[];
notificationGroupsInitialized: boolean = false; notificationGroupsInitialized: boolean = false;
notificationConfiguration: NotificationConfiguration = new NotificationConfiguration();
stakeholderUtils: StakeholderUtils = new StakeholderUtils(); stakeholderUtils: StakeholderUtils = new StakeholderUtils();
public stakeholderEntities = StakeholderEntities; public stakeholderEntities = StakeholderEntities;
menuHeader: Header = { menuHeader: Header = {
@ -118,6 +121,10 @@ export class AppComponent implements OnInit, OnDestroy {
this.isFrontPage = isFrontPage; this.isFrontPage = isFrontPage;
this.cdr.detectChanges(); this.cdr.detectChanges();
})); }));
this.subscriptions.push(this.layoutService.isMobile.subscribe(isMobile => {
this.isMobile = isMobile;
this.cdr.detectChanges();
}));
this.route.queryParams.subscribe(params => { this.route.queryParams.subscribe(params => {
this.view = params['view']; this.view = params['view'];
if(this.stakeholder) { if(this.stakeholder) {
@ -132,16 +139,16 @@ export class AppComponent implements OnInit, OnDestroy {
} }
})); }));
this.subscriptions.push(this.userManagementService.getUserInfo().subscribe(user => { this.subscriptions.push(this.userManagementService.getUserInfo().subscribe(user => {
this.updateStakeholder = true; this.updateStakeholder = !this.router.url.includes('user-info');
if (user) { if (user) {
this.user = user; this.user = user;
if (!this.notificationGroupsInitialized) { if (!this.notificationGroupsInitialized) {
this.setNotificationGroups(); this.setNotificationConfiguration();
} }
} else if(this.user) { } else if(this.user) {
this.user = user; this.user = user;
this.notificationGroupsInitialized = false; this.notificationGroupsInitialized = false;
this.notificationGroups = []; this.notificationConfiguration.availableGroups = [];
} }
if(this.paramsSubscription) { if(this.paramsSubscription) {
this.paramsSubscription.unsubscribe(); this.paramsSubscription.unsubscribe();
@ -201,26 +208,27 @@ export class AppComponent implements OnInit, OnDestroy {
} }
} }
public setNotificationGroups() { public setNotificationConfiguration() {
this.entities = this.stakeholderUtils.types.map(option => option.value); this.notificationConfiguration.entities = this.stakeholderUtils.types.map(option => option.value);
this.notificationGroups = []; this.notificationConfiguration.service = 'monitor';
this.notificationConfiguration.availableGroups = [];
if (Session.isPortalAdministrator(this.user)) { if (Session.isPortalAdministrator(this.user)) {
this.notificationGroups.push({value: Role.PORTAL_ADMIN, label: 'Portal Administrators'}); this.notificationConfiguration.availableGroups.push({value: Role.PORTAL_ADMIN, label: 'Portal Administrators'});
} }
for (let type of this.stakeholderUtils.types) { for (let type of this.stakeholderUtils.types) {
if (Session.isCurator(type.value, this.user) || Session.isPortalAdministrator(this.user)) { if (Session.isCurator(type.value, this.user) || Session.isPortalAdministrator(this.user)) {
this.notificationGroups.push({value: Role.curator(type.value), label: type.label + ' Curators'}); this.notificationConfiguration.availableGroups.push({value: Role.curator(type.value), label: type.label + ' Curators'});
this.notificationGroups.push({value: Role.typeManager(type.value), label: type.label + ' Managers'}); this.notificationConfiguration.availableGroups.push({value: Role.typeManager(type.value), label: type.label + ' Managers'});
this.notificationGroups.push({value: Role.typeMember(type.value), label: type.label + ' Members'}); this.notificationConfiguration.availableGroups.push({value: Role.typeMember(type.value), label: type.label + ' Members'});
} }
} }
this.subscriptions.push(this.stakeholderService.getMyStakeholders(this.properties.monitorServiceAPIURL).subscribe(stakeholders => { this.subscriptions.push(this.stakeholderService.getMyStakeholders(this.properties.monitorServiceAPIURL).subscribe(stakeholders => {
stakeholders.forEach(stakeholder => { stakeholders.forEach(stakeholder => {
this.notificationGroups.push({ this.notificationConfiguration.availableGroups.push({
value: Role.manager(stakeholder.type, stakeholder.alias), value: Role.manager(stakeholder.type, stakeholder.alias),
label: stakeholder.name + ' Managers' label: stakeholder.name + ' Managers'
}); });
this.notificationGroups.push({ this.notificationConfiguration.availableGroups.push({
value: Role.member(stakeholder.type, stakeholder.alias), value: Role.member(stakeholder.type, stakeholder.alias),
label: stakeholder.name + ' Members' label: stakeholder.name + ' Members'
}); });
@ -295,11 +303,11 @@ export class AppComponent implements OnInit, OnDestroy {
} }
this.adminMenuItems = []; this.adminMenuItems = [];
this.adminMenuItems.push(new MenuItem("general", "General", "", "/admin/" + this.stakeholder.alias, false, [], [], {}, {name: 'badge'})); this.adminMenuItems.push(new MenuItem("general", "General", "", "/admin/" + this.stakeholder.alias, false, [], [], {}, {name: 'badge'}));
this.adminMenuItems.push(new MenuItem("indicators", "Indicators", "", "/admin/" + this.stakeholder.alias + '/indicators', false, [], [], {}, {name: 'bar_chart'})); this.adminMenuItems.push(new MenuItem("indicators", "Indicators", "", "/admin/" + this.stakeholder.alias + '/indicators', false, [], [], {}, {name: 'bar_chart'}, null, "uk-visible@m"));
if (this.stakeholder.defaultId) { if (this.stakeholder.defaultId) {
this.adminMenuItems.push(new MenuItem("users", "Users", "", "/admin/" + this.stakeholder.alias + "/users", false, [], [], {}, {name: 'group'}, null, null, "/admin/" + this.stakeholder.alias + "/users")); this.adminMenuItems.push(new MenuItem("users", "Users", "", "/admin/" + this.stakeholder.alias + "/users", false, [], [], {}, {name: 'group'}, null, "uk-visible@m", "/admin/" + this.stakeholder.alias + "/users"));
if (this.isCurator()) { if (this.isCurator()) {
this.adminMenuItems.push(new MenuItem("admin-tools", "Pages & Entities", "", "/admin/" + this.stakeholder.alias + "/admin-tools/pages", false, [], [], {}, {name: 'description'}, null, null, "/admin/" + this.stakeholder.alias + "/admin-tools")); this.adminMenuItems.push(new MenuItem("admin-tools", "Pages & Entities", "", "/admin/" + this.stakeholder.alias + "/admin-tools/pages", false, [], [], {}, {name: 'description'}, null, "uk-visible@m", "/admin/" + this.stakeholder.alias + "/admin-tools"));
} }
} }
this.backItem = new MenuItem("back", "Manage profiles", "", "/admin", false, [], null, {}, {name: 'west'}); this.backItem = new MenuItem("back", "Manage profiles", "", "/admin", false, [], null, {}, {name: 'west'});
@ -316,10 +324,10 @@ export class AppComponent implements OnInit, OnDestroy {
"", "/admin", false, [], [], {})); "", "/admin", false, [], [], {}));
} }
if (Session.isPortalAdministrator(this.user)) { if (Session.isPortalAdministrator(this.user)) {
this.userMenuItems.push(new MenuItem("adminOptions", "Super Admin options", "", "/admin/admin-tools/portals", false, [], [], {})); this.userMenuItems.push(new MenuItem("adminOptions", "Super Admin options", "", "/admin/admin-tools/portals", false, [], [], {},null, null, "uk-visible@m"));
} }
if (this.isCurator()) { if (this.isCurator()) {
this.userMenuItems.push(new MenuItem("monitorOptions", "Monitor options", "", "/admin/monitor/admin-tools/pages", false, [], [], {})); this.userMenuItems.push(new MenuItem("monitorOptions", "Monitor options", "", "/admin/monitor/admin-tools/pages", false, [], [], {},null, null, "uk-visible@m"));
} }
} }
if (this.stakeholder) { if (this.stakeholder) {
@ -347,7 +355,7 @@ export class AppComponent implements OnInit, OnDestroy {
this.menuItems.push( this.menuItems.push(
new MenuItem("manage", "Manage", new MenuItem("manage", "Manage",
"", "/admin/" + this.stakeholder.alias, false, [], null, {} "", "/admin/" + this.stakeholder.alias, false, [], null, {}
, null, null, null, null) , null, null, "uk-visible@m", null)
); );
} }
if (!this.hasAdminMenu && this.isFrontPage) { if (!this.hasAdminMenu && this.isFrontPage) {
@ -405,10 +413,10 @@ export class AppComponent implements OnInit, OnDestroy {
this.backItem = null; this.backItem = null;
this.adminMenuItems.push(new MenuItem("stakeholders", "Manage profiles", "", "/admin", false, [], [], {}, {name: 'settings'})); this.adminMenuItems.push(new MenuItem("stakeholders", "Manage profiles", "", "/admin", false, [], [], {}, {name: 'settings'}));
if (Session.isPortalAdministrator(this.user)) { if (Session.isPortalAdministrator(this.user)) {
this.adminMenuItems.push(new MenuItem("super_admin", "Super Admin options", "", "/admin/admin-tools/portals", false, [], [], {}, {name: 'settings'}, null, null, '/admin/admin-tools')); this.adminMenuItems.push(new MenuItem("adminOptions", "Super Admin options", "", "/admin/admin-tools/portals", false, [], [], {}, {name: 'settings'}, null, "uk-visible@m", '/admin/admin-tools'));
} }
if (Session.isPortalAdministrator(this.user) || Session.isMonitorCurator(this.user)) { if (Session.isPortalAdministrator(this.user) || Session.isMonitorCurator(this.user)) {
this.adminMenuItems.push(new MenuItem("monitor", "Monitor options", "", "/admin/monitor/admin-tools/pages", false, [], [], {}, {name: 'settings'}, null, null, '/admin/monitor/admin-tools')); this.adminMenuItems.push(new MenuItem("monitorOptions", "Monitor options", "", "/admin/monitor/admin-tools/pages", false, [], [], {}, {name: 'settings'}, null, "uk-visible@m", '/admin/monitor/admin-tools'));
} }
this.hasAdminMenu = this.hasAdminMenu && this.adminMenuItems.length > 1; this.hasAdminMenu = this.hasAdminMenu && this.adminMenuItems.length > 1;
} }

View File

@ -1,14 +1,7 @@
<div page-content> <div page-content>
<div header *ngIf="stakeholder">
<div class="uk-flex uk-flex-middle uk-margin-medium-top info">
<div>
<div class="uk-text-background uk-text-bold uk-text-small">Manage Profile</div>
<h1 class="uk-h6 uk-margin-remove">{{stakeholder.name}}<span *ngIf="editStakeholderComponent && editStakeholderComponent.dirty && !loading" class="uk-text-large"> (unsaved changes)</span></h1>
</div>
</div>
</div>
<div actions> <div actions>
<div class="uk-section-xsmall uk-container"> <sidebar-mobile-toggle class="uk-margin-top uk-hidden@m uk-display-block"></sidebar-mobile-toggle>
<div class="uk-section-xsmall uk-container uk-margin-top">
<div class="uk-flex uk-flex-center uk-flex-right@m"> <div class="uk-flex uk-flex-center uk-flex-right@m">
<button class="uk-button uk-button-default uk-margin-right" <button class="uk-button uk-button-default uk-margin-right"
(click)="reset()" [class.uk-disabled]="loading || !editStakeholderComponent.dirty" (click)="reset()" [class.uk-disabled]="loading || !editStakeholderComponent.dirty"

View File

@ -1,4 +1,4 @@
import {Component, OnDestroy, OnInit, ViewChild} from "@angular/core"; import {ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild} from "@angular/core";
import {StakeholderService} from "../openaireLibrary/monitor/services/stakeholder.service"; import {StakeholderService} from "../openaireLibrary/monitor/services/stakeholder.service";
import {EnvProperties} from "../openaireLibrary/utils/properties/env-properties"; import {EnvProperties} from "../openaireLibrary/utils/properties/env-properties";
import {Stakeholder} from "../openaireLibrary/monitor/entities/stakeholder"; import {Stakeholder} from "../openaireLibrary/monitor/entities/stakeholder";
@ -22,6 +22,7 @@ export class GeneralComponent implements OnInit, OnDestroy {
@ViewChild('editStakeholderComponent') editStakeholderComponent: EditStakeholderComponent; @ViewChild('editStakeholderComponent') editStakeholderComponent: EditStakeholderComponent;
constructor(private stakeholderService: StakeholderService, constructor(private stakeholderService: StakeholderService,
private cdr: ChangeDetectorRef,
private title: Title) { private title: Title) {
} }
@ -29,6 +30,7 @@ export class GeneralComponent implements OnInit, OnDestroy {
this.loading = true; this.loading = true;
this.subscriptions.push(this.stakeholderService.getStakeholderAsObservable().subscribe(stakeholder => { this.subscriptions.push(this.stakeholderService.getStakeholderAsObservable().subscribe(stakeholder => {
this.stakeholder = stakeholder; this.stakeholder = stakeholder;
this.cdr.detectChanges();
if(this.stakeholder) { if(this.stakeholder) {
this.title.setTitle(this.stakeholder.name + " | General"); this.title.setTitle(this.stakeholder.name + " | General");
let data = zip( let data = zip(

View File

@ -11,6 +11,9 @@ import {ReactiveFormsModule} from "@angular/forms";
import {EditStakeholderModule} from "./edit-stakeholder/edit-stakeholder.module"; import {EditStakeholderModule} from "./edit-stakeholder/edit-stakeholder.module";
import {PageContentModule} from "../openaireLibrary/dashboard/sharedComponents/page-content/page-content.module"; import {PageContentModule} from "../openaireLibrary/dashboard/sharedComponents/page-content/page-content.module";
import {LogoUrlPipeModule} from "../openaireLibrary/utils/pipes/logoUrlPipe.module"; import {LogoUrlPipeModule} from "../openaireLibrary/utils/pipes/logoUrlPipe.module";
import {
SidebarMobileToggleModule
} from "../openaireLibrary/dashboard/sharedComponents/sidebar/sidebar-mobile-toggle/sidebar-mobile-toggle.module";
@NgModule({ @NgModule({
declarations: [GeneralComponent], declarations: [GeneralComponent],
@ -24,7 +27,8 @@ import {LogoUrlPipeModule} from "../openaireLibrary/utils/pipes/logoUrlPipe.modu
ReactiveFormsModule, ReactiveFormsModule,
EditStakeholderModule, EditStakeholderModule,
PageContentModule, PageContentModule,
LogoUrlPipeModule LogoUrlPipeModule,
SidebarMobileToggleModule
], ],
providers: [ providers: [
PreviousRouteRecorder, PreviousRouteRecorder,

View File

@ -1,16 +1,13 @@
<div page-content> <div page-content>
<div header> <div header>
<div class="uk-flex uk-flex-middle uk-margin-medium-top info"> <sidebar-mobile-toggle class="uk-margin-top uk-hidden@m uk-display-block"></sidebar-mobile-toggle>
<div> <div *ngIf="isCurator()" class="uk-margin-remove-bottom uk-margin-medium-top">
<div class="uk-text-background uk-text-bold uk-text-small">Manage profiles</div> <slider-tabs [type]="'dynamic'" (activeEmitter)="tab = $event">
<h1 class="uk-h6 uk-margin-remove">Profile Templates & Profiles</h1> <slider-tab tabTitle="All" [tabId]="'all'" [active]="tab === 'all'"></slider-tab>
</div> <slider-tab tabTitle="Profile templates" [tabId]="'templates'" [active]="tab === 'templates'"></slider-tab>
<slider-tab tabTitle="Profiles" [tabId]="'profiles'" [active]="tab === 'profiles'"></slider-tab>
</slider-tabs>
</div> </div>
<ul *ngIf="isCurator()" class="uk-tab uk-margin-remove-bottom uk-margin-medium-top" uk-tab>
<li [class.uk-active]="tab === 'all'"><a (click)="tab = 'all'">All</a></li>
<li [class.uk-active]="tab === 'templates'"><a (click)="tab = 'templates'">Profile templates</a></li>
<li [class.uk-active]="tab === 'profiles'"><a (click)="tab = 'profiles'">Profiles</a></li>
</ul>
</div> </div>
<div actions> <div actions>
<div class="uk-section-xsmall"> <div class="uk-section-xsmall">
@ -118,9 +115,8 @@
</div> </div>
</ng-container> </ng-container>
</ng-template> </ng-template>
<modal-alert #editStakeholderModal <modal-alert #editStakeholderModal [large]="true" classTitle="uk-background-primary uk-light"
id="edit_modal" [large]="true" classTitle="uk-background-primary uk-light" (alertOutput)="editStakeholderComponent.save(callback)" (cancelOutput)="editStakeholderComponent.removePhoto()"
(alertOutput)="editStakeholderComponent.save(callback)"
[okDisabled]="editStakeholderComponent.disabled"> [okDisabled]="editStakeholderComponent.disabled">
<div class="uk-height-large uk-position-relative" *ngIf="editStakeholderComponent.loading"> <div class="uk-height-large uk-position-relative" *ngIf="editStakeholderComponent.loading">
<loading class="uk-position-center"></loading> <loading class="uk-position-center"></loading>

View File

@ -90,10 +90,6 @@ export class ManageStakeholdersComponent implements OnInit, OnDestroy {
}, error => { }, error => {
this.loading = false; this.loading = false;
})); }));
this.subscriptions.push(UIkit.util.on(document, 'hidden', '#edit_modal', (): void => {
this.editStakeholderComponent.removePhoto();
}));
} }
ngOnDestroy(): void { ngOnDestroy(): void {

View File

@ -15,6 +15,10 @@ import {earth, incognito, restricted} from "../openaireLibrary/utils/icons/icons
import {PageContentModule} from "../openaireLibrary/dashboard/sharedComponents/page-content/page-content.module"; import {PageContentModule} from "../openaireLibrary/dashboard/sharedComponents/page-content/page-content.module";
import {LogoUrlPipeModule} from "../openaireLibrary/utils/pipes/logoUrlPipe.module"; import {LogoUrlPipeModule} from "../openaireLibrary/utils/pipes/logoUrlPipe.module";
import {SearchInputModule} from "../openaireLibrary/sharedComponents/search-input/search-input.module"; import {SearchInputModule} from "../openaireLibrary/sharedComponents/search-input/search-input.module";
import {
SidebarMobileToggleModule
} from "../openaireLibrary/dashboard/sharedComponents/sidebar/sidebar-mobile-toggle/sidebar-mobile-toggle.module";
import {SliderTabsModule} from "../openaireLibrary/sharedComponents/tabs/slider-tabs.module";
@NgModule({ @NgModule({
declarations: [ManageStakeholdersComponent], declarations: [ManageStakeholdersComponent],
@ -30,7 +34,9 @@ import {SearchInputModule} from "../openaireLibrary/sharedComponents/search-inpu
IconsModule, IconsModule,
PageContentModule, PageContentModule,
LogoUrlPipeModule, LogoUrlPipeModule,
SearchInputModule SearchInputModule,
SidebarMobileToggleModule,
SliderTabsModule
], ],
providers: [ providers: [
PreviousRouteRecorder, PreviousRouteRecorder,

View File

@ -37,7 +37,7 @@
</div> </div>
</div> </div>
</ng-template> </ng-template>
<div page-content [border]="false"> <div page-content [border]="isMobile">
<div header> <div header>
<div *ngIf="stakeholder" class="uk-hidden"> <div *ngIf="stakeholder" class="uk-hidden">
<h1 class="uk-h6 uk-margin-remove">{{stakeholder.name}}</h1> <h1 class="uk-h6 uk-margin-remove">{{stakeholder.name}}</h1>
@ -103,7 +103,7 @@
<div *ngIf="hasPermission(indicator.visibility)" [ngClass]="getNumberClassBySize(indicator.width)"> <div *ngIf="hasPermission(indicator.visibility)" [ngClass]="getNumberClassBySize(indicator.width)">
<div class="uk-card uk-card-default uk-padding-small number-card uk-position-relative" <div class="uk-card uk-card-default uk-padding-small number-card uk-position-relative"
[class.semiFiltered]="indicator.indicatorPaths[0].filtersApplied < countSelectedFilters()"> [class.semiFiltered]="indicator.indicatorPaths[0].filtersApplied < countSelectedFilters()">
<div *ngIf="!showDescriptionOverlay[j]"> <div *ngIf="!indicator.descriptionOverlay">
<div <div
class="uk-text-small uk-text-truncate uk-margin-xsmall-bottom uk-margin-right">{{indicator.name}}</div> class="uk-text-small uk-text-truncate uk-margin-xsmall-bottom uk-margin-right">{{indicator.name}}</div>
<div class="number uk-text-small uk-text-bold"> <div class="number uk-text-small uk-text-bold">
@ -112,22 +112,22 @@
<span *ngIf="!numberResults.get(i + '-' + j)">--</span> <span *ngIf="!numberResults.get(i + '-' + j)">--</span>
</div> </div>
<div *ngIf="indicator.description || indicator.additionalDescription" <div *ngIf="indicator.description || indicator.additionalDescription"
class="uk-position-top-right uk-text-center uk-margin-small-top uk-margin-small-right"> class="uk-position-top-right uk-text-center uk-margin-small-top uk-margin-small-right uk-visible@m">
<a class="uk-display-inline-block uk-button uk-button-link" uk-tooltip="Note" <a class="uk-display-inline-block uk-button uk-button-link" uk-tooltip="Note"
(click)="toggleDescriptionOverlay($event, j)"> (click)="toggleDescriptionOverlay($event, indicator)">
<span class="uk-flex uk-flex-middle"> <span class="uk-flex uk-flex-middle">
<icon name="analytics" type="outlined" [flex]="true"></icon> <icon name="analytics" type="outlined" [flex]="true"></icon>
</span> </span>
</a> </a>
</div> </div>
</div> </div>
<div <div
*ngIf="showDescriptionOverlay[j] && (indicator.description || indicator.additionalDescription)" *ngIf="indicator.descriptionOverlay && (indicator.description || indicator.additionalDescription)"
click-outside-or-esc class="uk-overflow-auto" click-outside-or-esc class="uk-overflow-auto"
(clickOutside)="closeDescriptionOverlay($event, j)"> (clickOutside)="closeDescriptionOverlay($event, indicator)">
<div class="uk-position-top-right uk-text-center uk-margin-small-top uk-margin-small-right"> <div class="uk-position-top-right uk-text-center uk-margin-small-top uk-margin-small-right">
<a class="uk-display-inline-block uk-button uk-button-link" <a class="uk-display-inline-block uk-button uk-button-link"
(click)="toggleDescriptionOverlay($event, j)"> (click)="toggleDescriptionOverlay($event, indicator)">
<span class="uk-flex uk-flex-middle"> <span class="uk-flex uk-flex-middle">
<icon name="close" type="outlined" [flex]="true"></icon> <icon name="close" type="outlined" [flex]="true"></icon>
</span> </span>
@ -154,7 +154,7 @@
<ng-template ngFor [ngForOf]="number.indicators" let-indicator let-j="index"> <ng-template ngFor [ngForOf]="number.indicators" let-indicator let-j="index">
<div *ngIf="hasPermission(indicator.visibility)" [ngClass]="getNumberClassBySize(indicator.width)"> <div *ngIf="hasPermission(indicator.visibility)" [ngClass]="getNumberClassBySize(indicator.width)">
<div [class.semiFiltered]="indicator.indicatorPaths[0].filtersApplied < countSelectedFilters()"> <div [class.semiFiltered]="indicator.indicatorPaths[0].filtersApplied < countSelectedFilters()">
<div *ngIf="!showDescriptionOverlay[j]"> <div *ngIf="!indicator.descriptionOverlay">
<div <div
class="uk-text-xsmall uk-text-truncate uk-margin-xsmall-bottom uk-margin-right">{{indicator.name}}</div> class="uk-text-xsmall uk-text-truncate uk-margin-xsmall-bottom uk-margin-right">{{indicator.name}}</div>
<div class="number uk-text-small uk-text-bold"> <div class="number uk-text-small uk-text-bold">
@ -213,22 +213,22 @@
[ngClass]="'uk-height-' + (indicator.height?indicator.height.toLowerCase():'medium')"> [ngClass]="'uk-height-' + (indicator.height?indicator.height.toLowerCase():'medium')">
</div> </div>
<div *ngIf="indicator.description || indicator.additionalDescription" <div *ngIf="indicator.description || indicator.additionalDescription"
class="uk-position-bottom-left uk-margin-left uk-margin-small-bottom"> class="uk-position-bottom-left uk-margin-left uk-margin-small-bottom uk-visible@m">
<a class="uk-display-inline-block uk-button uk-button-text" <a class="uk-display-inline-block uk-button uk-button-text"
(click)="toggleDescriptionOverlay($event, j)"> (click)="toggleDescriptionOverlay($event, indicator)">
<span class="uk-flex uk-flex-middle"> <span class="uk-flex uk-flex-middle">
<icon name="analytics" type="outlined" [flex]="true"></icon> <icon name="analytics" type="outlined" [flex]="true"></icon>
<span class="uk-margin-small-left">Note</span> <span class="uk-margin-small-left">Note</span>
</span> </span>
</a> </a>
</div> </div>
<div *ngIf="showDescriptionOverlay[j] && (indicator.description || indicator.additionalDescription)" <div *ngIf="indicator.descriptionOverlay && (indicator.description || indicator.additionalDescription)"
class="indicator-description uk-card uk-card-default uk-flex uk-flex-middle uk-flex-center"> class="indicator-description uk-card uk-card-default uk-flex uk-flex-middle uk-flex-center">
<div class="inner" click-outside-or-esc <div class="inner" click-outside-or-esc
(clickOutside)="closeDescriptionOverlay($event, j)"> (clickOutside)="closeDescriptionOverlay($event, indicator)">
<div class="uk-padding-small"> <div class="uk-padding-small">
<div class="uk-flex uk-flex-right"> <div class="uk-flex uk-flex-right">
<button class="uk-close uk-icon" (click)="toggleDescriptionOverlay($event, j)"> <button class="uk-close uk-icon" (click)="toggleDescriptionOverlay($event, indicator)">
<icon name="close" ratio="1"></icon> <icon name="close" ratio="1"></icon>
</button> </button>
</div> </div>

View File

@ -11,15 +11,18 @@ import {HelperService} from "../openaireLibrary/utils/helper/helper.service";
import {SEOService} from "../openaireLibrary/sharedComponents/SEO/SEO.service"; import {SEOService} from "../openaireLibrary/sharedComponents/SEO/SEO.service";
import {StakeholderService} from "../openaireLibrary/monitor/services/stakeholder.service"; import {StakeholderService} from "../openaireLibrary/monitor/services/stakeholder.service";
import { import {
Category, Indicator, Category,
IndicatorPath, IndicatorSize, Section, Indicator,
IndicatorPath,
IndicatorSize,
Section,
Stakeholder, Stakeholder,
SubCategory, SubCategory,
Topic, Topic,
Visibility Visibility
} from "../openaireLibrary/monitor/entities/stakeholder"; } from "../openaireLibrary/monitor/entities/stakeholder";
import {StatisticsService} from "../utils/services/statistics.service"; import {StatisticsService} from "../utils/services/statistics.service";
import {IndicatorUtils, StakeholderUtils} from "../utils/indicator-utils"; import {IndicatorUtils} from "../utils/indicator-utils";
import {LayoutService} from "../openaireLibrary/dashboard/sharedComponents/sidebar/layout.service"; import {LayoutService} from "../openaireLibrary/dashboard/sharedComponents/sidebar/layout.service";
import {UntypedFormBuilder, UntypedFormControl} from "@angular/forms"; import {UntypedFormBuilder, UntypedFormControl} from "@angular/forms";
import {Subscriber, Subscription} from "rxjs"; import {Subscriber, Subscription} from "rxjs";
@ -51,7 +54,6 @@ export class MonitorComponent implements OnInit, OnDestroy {
public loading: boolean = true; public loading: boolean = true;
public view: Visibility; public view: Visibility;
public indicatorUtils: IndicatorUtils = new IndicatorUtils(); public indicatorUtils: IndicatorUtils = new IndicatorUtils();
public stakeholderUtils: StakeholderUtils = new StakeholderUtils();
public activeTopic: Topic = null; public activeTopic: Topic = null;
public activeCategory: Category = null; public activeCategory: Category = null;
public activeSubCategory: SubCategory = null; public activeSubCategory: SubCategory = null;
@ -78,7 +80,6 @@ export class MonitorComponent implements OnInit, OnDestroy {
privateStakeholder = false; privateStakeholder = false;
public keyword: UntypedFormControl; public keyword: UntypedFormControl;
public statsUpdateDate: Date; public statsUpdateDate: Date;
public showDescriptionOverlay: boolean[] = [];
public isFullscreen: boolean = false; public isFullscreen: boolean = false;
public isMobile: boolean = false; public isMobile: boolean = false;
@ -487,21 +488,23 @@ export class MonitorComponent implements OnInit, OnDestroy {
this.subscriptions.push(this.statisticsService.getNumbers(this.statisticsService.getSourceType(pair[0]), pair[1]).subscribe(response => { this.subscriptions.push(this.statisticsService.getNumbers(this.statisticsService.getSourceType(pair[0]), pair[1]).subscribe(response => {
if(activeSubcategory === this.activeSubCategory._id) { if(activeSubcategory === this.activeSubCategory._id) {
indexes.forEach(([i, j]) => { indexes.forEach(([i, j]) => {
let result = JSON.parse(JSON.stringify(response)); if( this.activeSubCategory?.numbers[i]?.indicators[j]) {
this.activeSubCategory.numbers[i].indicators[j].indicatorPaths[0].jsonPath.forEach(jsonPath => { let result = JSON.parse(JSON.stringify(response));
if (result) { this.activeSubCategory.numbers[i].indicators[j].indicatorPaths[0].jsonPath.forEach(jsonPath => {
result = result[jsonPath]; if (result) {
} result = result[jsonPath];
}); }
if (typeof result === 'string' || typeof result === 'number') { });
result = Number(result); if (typeof result === 'string' || typeof result === 'number') {
if (result === Number.NaN) { result = Number(result);
if (result === Number.NaN) {
result = 0;
}
} else {
result = 0; result = 0;
} }
} else { this.numberResults.set(i + '-' + j, result);
result = 0;
} }
this.numberResults.set(i + '-' + j, result);
}); });
} }
})); }));
@ -609,14 +612,14 @@ export class MonitorComponent implements OnInit, OnDestroy {
this.userManagementService.login(); this.userManagementService.login();
} }
toggleDescriptionOverlay(event, j) { toggleDescriptionOverlay(event, indicator: Indicator) {
event.stopPropagation(); event.stopPropagation();
this.showDescriptionOverlay[j] = !this.showDescriptionOverlay[j]; indicator.descriptionOverlay = !indicator.descriptionOverlay;
} }
closeDescriptionOverlay(event: ClickEvent,j) { closeDescriptionOverlay(event: ClickEvent, indicator: Indicator) {
if(event.clicked && this.showDescriptionOverlay[j]) { if(event.clicked && indicator.descriptionOverlay) {
this.showDescriptionOverlay[j] = false; indicator.descriptionOverlay = false;
} }
} }
} }

@ -1 +1 @@
Subproject commit 4c19e65edb3db3b546eda029ea90a58298a1f0ad Subproject commit f49149c99e7bf08179d95b56a1aac9848a850344

View File

@ -189,174 +189,131 @@
</div> </div>
</aside> </aside>
<div #pageContent *ngIf="stakeholder && filters" page-content> <div #pageContent *ngIf="stakeholder && filters" page-content>
<div header> <div actions>
<div *ngIf="stakeholder.topics.length > 0 && stakeholder.topics[topicIndex]"> <div *ngIf="stakeholder.topics.length > 0" class="uk-flex uk-flex-center uk-margin-medium-top uk-flex-right@m uk-width-1-1">
<div class="uk-margin-medium-top uk-margin-bottom uk-flex uk-flex-middle info"> <button class="uk-button uk-button-primary uk-flex uk-flex-middle">
<div class="uk-width-expand"> <icon name="visibility" [flex]="true"></icon>
<div class="uk-text-background uk-text-bold uk-text-small">Manage Indicators</div> <span class="uk-margin-small-left uk-margin-small-right">Preview</span>
<h1 class="uk-h6 uk-margin-remove">{{stakeholder.name}}</h1> <icon name="expand_more" [flex]="true"></icon>
</button>
<div #element uk-dropdown="mode: click; pos: bottom-left; offset: 5; delay-hide: 0; flip: false">
<ul class="uk-nav uk-dropdown-nav">
<li><a target="_blank"
[routerLink]="'/' + stakeholder.alias + '/' + stakeholder.topics[topicIndex].alias"
[queryParams]="{view: 'PUBLIC'}"
(click)="hide(element)">Public view</a>
</li>
<li><a target="_blank" [routerLink]="'/' + stakeholder.alias + '/' +
stakeholder.topics[topicIndex].alias"
[queryParams]="{view: 'RESTRICTED'}"
(click)="hide(element)">Restricted view</a>
</li>
<!--<li class="disabled"><a class="uk-disabled uk-text-muted"
uk-tooltip="Note: available only in administration dashboard"
(click)="hide(element)">Private view</a>
</li>-->
</ul>
</div> </div>
<div *ngIf="stakeholder.topics.length > 0 && !pageContent.isStickyActive" class="uk-width-auto"> </div>
<div class="uk-flex uk-flex-center"> <ul *ngIf="stakeholder.topics.length > 0 && stakeholder.topics[topicIndex].categories.length > 0 && stakeholder.topics[topicIndex].categories[categoryIndex]"
<button class="uk-button uk-button-primary uk-flex uk-flex-middle"> transition-group class="uk-tab uk-margin-xsmall-top" [id]="'subCategories'">
<icon name="visibility" [flex]="true"></icon> <ng-template ngFor [ngForOf]=" stakeholder.topics[topicIndex].categories[categoryIndex].subCategories"
<span class="uk-margin-small-left uk-margin-small-right">Preview</span> let-subCategory let-i="index">
<icon name="expand_more" [flex]="true"></icon> <li class="uk-visible-toggle uk-flex" [class.uk-active]="subCategoryIndex === i" transition-group-item>
</button> <a (click)="chooseSubcategory(i)">
<div #preview uk-dropdown="mode: click; pos: bottom-left; offset: 5; delay-hide: 0; flip: false"> <span class="uk-text-uppercase">{{subCategory.name}}</span>
</a>
<span class="uk-flex uk-flex-column uk-flex-center uk-margin-small-left"
[class.uk-invisible-hover]="subCategoryIndex !== i"
(click)="$event.stopPropagation();$event.preventDefault()">
<a class="uk-link-reset uk-flex uk-flex-middle">
<icon [flex]="true" [name]="stakeholderUtils.visibilityIcon.get(subCategory.visibility)"
ratio="0.6"></icon>
<icon [flex]="true" name="more_vert"></icon>
</a>
<div #element uk-dropdown="mode: click; pos: bottom-left; offset: 5; delay-hide: 0; container: body">
<ul class="uk-nav uk-dropdown-nav"> <ul class="uk-nav uk-dropdown-nav">
<li><a target="_blank" <ng-container *ngIf="isCurator">
[routerLink]="'/' + stakeholder.alias" <li>
[queryParams]="{view: 'PUBLIC'}" <a (click)="editSubCategoryOpen(i); hide(element)">
(click)="hide(preview)">Public view</a> <div class="uk-flex uk-flex-middle">
</li> <icon [flex]="true" name="edit" ratio="0.6"></icon>
<li><a target="_blank" [routerLink]="'/' + stakeholder.alias" <span class="uk-margin-small-left uk-width-expand">Edit</span>
[queryParams]="{view: 'RESTRICTED'}" </div>
(click)="hide(preview)">Restricted view</a> </a>
</li> </li>
<!--<li class="disabled"><a class="uk-disabled uk-text-muted" <li *ngIf="i > 0 || i < stakeholder.topics[topicIndex].categories[categoryIndex].subCategories.length - 1"
uk-tooltip="Note: available only in administration dashboard" class="uk-nav-divider"></li>
(click)="hide(element)">Private view</a> <li *ngIf="i > 0">
</li>--> <a (click)="hide(element);moveSubCategory(i)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="west" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Move Left</span>
</div>
</a>
</li>
<li *ngIf="i < stakeholder.topics[topicIndex].categories[categoryIndex].subCategories.length - 1">
<a (click)="hide(element);moveSubCategory(i, i + 1)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="east" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Move Right</span>
</div>
</a>
</li>
<li class="uk-nav-divider"></li>
<li *ngIf="indicators">
<a (click)=" indicators.exportIndicators(i);hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="download" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Export indicators</span>
</div>
</a>
</li>
<li *ngIf="indicators">
<a (click)="file.value = ''; this.index=i; file.click(); hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="upload" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Import indicators</span>
</div>
</a>
</li>
<li class="uk-nav-divider"></li>
</ng-container>
<ng-template ngFor [ngForOf]="stakeholderUtils.visibility" let-v>
<li [class.uk-active]="subCategory.visibility === v.value">
<a (click)="openVisibilityModal(i, v.value, 'subcategory'); hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" [name]="v.icon" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">{{v.label}}</span>
<icon *ngIf="subCategory.visibility === v.value" [flex]="true" name="done"
class="uk-text-secondary" ratio="0.8"></icon>
</div>
</a>
</li>
</ng-template>
<ng-container *ngIf="!subCategory.defaultId && isCurator">
<li class="uk-nav-divider">
<li>
<a (click)="deleteSubcategoryOpen(i, 'delete'); hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="delete" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Delete</span>
</div>
</a>
</li>
</ng-container>
</ul> </ul>
</div> </div>
</div> </span>
</div> </li>
</div> </ng-template>
</div> <li *ngIf="isCurator">
</div> <a (click)="editSubCategoryOpen(); $event.preventDefault()" class="uk-flex uk-flex-middle">
<div actions> <icon name="add" [flex]="true"></icon>
<div class="uk-grid uk-flex-middle" uk-grid> <span class="uk-text-uppercase">Create new subcategory</span>
<div *ngIf="stakeholder.topics.length > 0 && pageContent.isStickyActive" </a>
class="uk-width-auto@m uk-margin-small-bottom uk-flex-last@m uk-width-1-1"> </li>
<div class="uk-flex uk-flex-center"> </ul>
<button class="uk-button uk-button-primary uk-flex uk-flex-middle">
<icon name="visibility" [flex]="true"></icon>
<span class="uk-margin-small-left uk-margin-small-right">Preview</span>
<icon name="expand_more" [flex]="true"></icon>
</button>
<div #element uk-dropdown="mode: click; pos: bottom-left; offset: 5; delay-hide: 0; flip: false">
<ul class="uk-nav uk-dropdown-nav">
<li><a target="_blank"
[routerLink]="'/' + stakeholder.alias + '/' + stakeholder.topics[topicIndex].alias"
[queryParams]="{view: 'PUBLIC'}"
(click)="hide(element)">Public view</a>
</li>
<li><a target="_blank" [routerLink]="'/' + stakeholder.alias + '/' +
stakeholder.topics[topicIndex].alias"
[queryParams]="{view: 'RESTRICTED'}"
(click)="hide(element)">Restricted view</a>
</li>
<!--<li class="disabled"><a class="uk-disabled uk-text-muted"
uk-tooltip="Note: available only in administration dashboard"
(click)="hide(element)">Private view</a>
</li>-->
</ul>
</div>
</div>
</div>
<div class="uk-margin-medium-top uk-width-expand">
<ul *ngIf="stakeholder.topics.length > 0 && stakeholder.topics[topicIndex].categories.length > 0 && stakeholder.topics[topicIndex].categories[categoryIndex]"
transition-group class="uk-tab" [id]="'subCategories'">
<ng-template ngFor [ngForOf]=" stakeholder.topics[topicIndex].categories[categoryIndex].subCategories"
let-subCategory let-i="index">
<li class="uk-visible-toggle uk-flex" [class.uk-active]="subCategoryIndex === i" transition-group-item>
<a (click)="chooseSubcategory(i)">
<span class="uk-text-uppercase">{{subCategory.name}}</span>
</a>
<span class="uk-flex uk-flex-column uk-flex-center uk-margin-small-left"
[class.uk-invisible-hover]="subCategoryIndex !== i"
(click)="$event.stopPropagation();$event.preventDefault()">
<a class="uk-link-reset uk-flex uk-flex-middle">
<icon [flex]="true" [name]="stakeholderUtils.visibilityIcon.get(subCategory.visibility)"
ratio="0.6"></icon>
<icon [flex]="true" name="more_vert"></icon>
</a>
<div #element uk-dropdown="mode: click; pos: bottom-left; offset: 5; delay-hide: 0; container: body">
<ul class="uk-nav uk-dropdown-nav">
<ng-container *ngIf="isCurator">
<li>
<a (click)="editSubCategoryOpen(i); hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="edit" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Edit</span>
</div>
</a>
</li>
<li *ngIf="i > 0 || i < stakeholder.topics[topicIndex].categories[categoryIndex].subCategories.length - 1"
class="uk-nav-divider"></li>
<li *ngIf="i > 0">
<a (click)="hide(element);moveSubCategory(i)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="west" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Move Left</span>
</div>
</a>
</li>
<li *ngIf="i < stakeholder.topics[topicIndex].categories[categoryIndex].subCategories.length - 1">
<a (click)="hide(element);moveSubCategory(i, i + 1)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="east" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Move Right</span>
</div>
</a>
</li>
<li class="uk-nav-divider"></li>
<li *ngIf="indicators">
<a (click)=" indicators.exportIndicators(i);hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="download" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Export indicators</span>
</div>
</a>
</li>
<li *ngIf="indicators">
<a (click)="file.value = ''; this.index=i; file.click(); hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="upload" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Import indicators</span>
</div>
</a>
</li>
<li class="uk-nav-divider"></li>
</ng-container>
<ng-template ngFor [ngForOf]="stakeholderUtils.visibility" let-v>
<li [class.uk-active]="subCategory.visibility === v.value">
<a (click)="openVisibilityModal(i, v.value, 'subcategory'); hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" [name]="v.icon" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">{{v.label}}</span>
<icon *ngIf="subCategory.visibility === v.value" [flex]="true" name="done"
class="uk-text-secondary" ratio="0.8"></icon>
</div>
</a>
</li>
</ng-template>
<ng-container *ngIf="!subCategory.defaultId && isCurator">
<li class="uk-nav-divider">
<li>
<a (click)="deleteSubcategoryOpen(i, 'delete'); hide(element)">
<div class="uk-flex uk-flex-middle">
<icon [flex]="true" name="delete" ratio="0.6"></icon>
<span class="uk-margin-small-left uk-width-expand">Delete</span>
</div>
</a>
</li>
</ng-container>
</ul>
</div>
</span>
</li>
</ng-template>
<li *ngIf="isCurator">
<a (click)="editSubCategoryOpen(); $event.preventDefault()" class="uk-flex uk-flex-middle">
<icon name="add" [flex]="true"></icon>
<span class="uk-text-uppercase">Create new subcategory</span>
</a>
</li>
</ul>
</div>
</div>
</div> </div>
<div inner> <div inner>
<input #file id="import-file" type="file" class="uk-hidden" <input #file id="import-file" type="file" class="uk-hidden"

View File

@ -22,11 +22,14 @@ import {LogoUrlPipeModule} from "../openaireLibrary/utils/pipes/logoUrlPipe.modu
import {TransitionGroupModule} from "../openaireLibrary/utils/transition-group/transition-group.module"; import {TransitionGroupModule} from "../openaireLibrary/utils/transition-group/transition-group.module";
import {NumberRoundModule} from "../openaireLibrary/utils/pipes/number-round.module"; import {NumberRoundModule} from "../openaireLibrary/utils/pipes/number-round.module";
import {SideBarModule} from "../openaireLibrary/dashboard/sharedComponents/sidebar/sideBar.module"; import {SideBarModule} from "../openaireLibrary/dashboard/sharedComponents/sidebar/sideBar.module";
import {
SidebarMobileToggleModule
} from "../openaireLibrary/dashboard/sharedComponents/sidebar/sidebar-mobile-toggle/sidebar-mobile-toggle.module";
@NgModule({ @NgModule({
imports: [ imports: [
CommonModule, TopicRoutingModule, ClickModule, RouterModule, FormsModule, AlertModalModule, CommonModule, TopicRoutingModule, ClickModule, RouterModule, FormsModule, AlertModalModule,
ReactiveFormsModule, InputModule, IconsModule, PageContentModule, LoadingModule, NotifyFormModule, LogoUrlPipeModule, TransitionGroupModule, NumberRoundModule, SideBarModule ReactiveFormsModule, InputModule, IconsModule, PageContentModule, LoadingModule, NotifyFormModule, LogoUrlPipeModule, TransitionGroupModule, NumberRoundModule, SideBarModule, SidebarMobileToggleModule
], ],
declarations: [ declarations: [
TopicComponent, IndicatorsComponent TopicComponent, IndicatorsComponent

View File

@ -5,12 +5,6 @@
</div> </div>
<role-users *ngIf="!loading && stakeholder" [id]="stakeholder.alias" [type]="stakeholder.type" [name]="stakeholder.name" [link]="link" [role]="tab" [message]="messages.get(tab)" <role-users *ngIf="!loading && stakeholder" [id]="stakeholder.alias" [type]="stakeholder.type" [name]="stakeholder.name" [link]="link" [role]="tab" [message]="messages.get(tab)"
[emailComposer]="emailComposer" [notificationFn]="notificationFn"> [emailComposer]="emailComposer" [notificationFn]="notificationFn">
<div class="uk-flex uk-flex-middle uk-margin-medium-top info">
<div>
<div class="uk-text-background uk-text-bold uk-text-small">Manage Users</div>
<h1 class="uk-h6 uk-margin-remove">{{stakeholder.name}}</h1>
</div>
</div>
<ul class="uk-tab uk-margin-remove-bottom uk-margin-medium-top"> <ul class="uk-tab uk-margin-remove-bottom uk-margin-medium-top">
<li [class.uk-active]="tab === 'manager'"><a routerLink="../manager">Managers</a></li> <li [class.uk-active]="tab === 'manager'"><a routerLink="../manager">Managers</a></li>
<li [class.uk-active]="tab === 'member'"><a routerLink="../member">Members</a></li> <li [class.uk-active]="tab === 'member'"><a routerLink="../member">Members</a></li>

@ -1 +1 @@
Subproject commit 95c2b50a57696a80dd3dd376880f26cb21d65817 Subproject commit ca209a54baaa2d9e0004613a68088fdcf4bee43a

View File

@ -56,6 +56,7 @@
/* Dashboard */ /* Dashboard */
@dashboard-page-content-background: @monitor-dashboard-background; @dashboard-page-content-background: @monitor-dashboard-background;
@dashboard-primary-background: @monitor-color; @dashboard-primary-background: @monitor-color;
@dashboard-menu-section-sublist-border: fade(@monitor-color, 30%);
& #filters_icon .start { & #filters_icon .start {
stop-color: @monitor-light-color; stop-color: @monitor-light-color;
@ -94,6 +95,13 @@
top: 400px !important; top: 400px !important;
} }
@media (max-width: @breakpoint-small-max) {
#filters_switcher_toggle {
top: unset !important;
bottom: 10vh;
}
}
/* Quick fix for svgs with a class that makes their opacity: 0.5*/ /* Quick fix for svgs with a class that makes their opacity: 0.5*/
svg .a { svg .a {
opacity: 1 !important; opacity: 1 !important;

@ -1 +1 @@
Subproject commit c4e2781acc42f281265a70d6cd75616cdd6fa762 Subproject commit aa1e6c9df390a4ba0919b5f8591374f7eec75089