[Library & Monitor Dashboard | new-theme]: Sidebar & Navbar checks updated to use the same method | "activeMenuItem" in route data (optional) to set which menu item is active when url does not match | Bug fix in <my-tabs>.

1. layout.service.ts: Added "activeMenuItemSubject" to keep value of data['activeMenuItem'].
2. menu.ts: Removed "markAsActive" (not used) | Set RootMenuItem as deprecated (should use only MenuItem) | Added "isTheActiveMenuItem()" method to check if a MenuItem (root or not / sidebar or navbar) is active.
3. navigationBar.component.ts: Updated "isTheActiveMenu()" method to call MenuItem.isTheActiveMenu() | Removed method "isTheActiveMenuItem()".
4. navigationBar.component.html: Always call "isTheActiveMenu()" method.
5. sideBar.component.ts: Added "get currentRoute()" and updated method "isTheActiveMenuItem()".
6. tabs.component.ts: [Bug fix] Removed [class.uk-active] from <li> of tabs (since small-tabs are not currently used it is ok to remove this) - caused by version update of Uikit.
7. monitor-routing.module.ts: Set activeMenuItem: "dashboard" for any path under a stakeholder that has nothing or anything under a topic. | Set activeMenuItem: "search" in paths under search.
8. app-routing.module.ts: Set activeMenuItem: "manage" for paths under admin/:stakeholder.
9. app.component.ts: Updated menu in Admin Dashboard (all items visible and logo of monitor used) | Set value for MenuItem.routeActive when adding menu items of topics and users.
This commit is contained in:
Konstantina Galouni 2022-03-28 11:40:21 +03:00
parent dc0544d0d8
commit 99ed7ea6ba
6 changed files with 65 additions and 49 deletions

View File

@ -39,7 +39,12 @@ export class LayoutService {
* Add isDashboard: false on data of route config, if page is for a stakeholder but not for dashboard. * Add isDashboard: false on data of route config, if page is for a stakeholder but not for dashboard.
*/ */
private isDashboardSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true); private isDashboardSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
/**
* Add activeMenuItem: string on data of route config, if page should activate a specific MenuItem and route url does not match.
*/
private activeMenuItemSubject: BehaviorSubject<string> = new BehaviorSubject<string>("");
sub: any; sub: any;
ngOnDestroy() { ngOnDestroy() {
@ -92,6 +97,12 @@ export class LayoutService {
} else { } else {
this.setDashboard(true); this.setDashboard(true);
} }
if (data['activeMenuItem'] !== undefined &&
data['activeMenuItem'] !== null) {
this.setActiveMenuItem(data['activeMenuItem']);
} else {
this.setActiveMenuItem('');
}
} }
}); });
} }
@ -152,4 +163,12 @@ export class LayoutService {
setSmallScreen(value: boolean) { setSmallScreen(value: boolean) {
this.isSmallScreenSubject.next(value); this.isSmallScreenSubject.next(value);
} }
get activeMenuItem(): string {
return this.activeMenuItemSubject.getValue();
}
setActiveMenuItem(value: string) {
this.activeMenuItemSubject.next(value);
}
} }

View File

@ -1,6 +1,6 @@
import {Component, Input, OnInit} from '@angular/core'; import {Component, Input, OnInit} from '@angular/core';
import {MenuItem} from "../../../sharedComponents/menu"; import {MenuItem} from "../../../sharedComponents/menu";
import {QueryParamsHandling, Router} from "@angular/router"; import {ActivatedRoute, QueryParamsHandling, Router} from "@angular/router";
import {DomSanitizer} from "@angular/platform-browser"; import {DomSanitizer} from "@angular/platform-browser";
import {properties} from "../../../../../environments/environment"; import {properties} from "../../../../../environments/environment";
import {LayoutService} from "./layout.service"; import {LayoutService} from "./layout.service";
@ -17,13 +17,19 @@ export class SideBarComponent implements OnInit {
@Input() queryParamsHandling; @Input() queryParamsHandling;
properties; properties;
constructor(private router: Router, private sanitizer: DomSanitizer, private layoutService: LayoutService) { constructor(private route: ActivatedRoute, private router: Router, private sanitizer: DomSanitizer, private layoutService: LayoutService) {
this.properties = properties; this.properties = properties;
} }
ngOnInit(): void { ngOnInit(): void {
} }
get currentRoute() {
return {
route: this.router.url.split('?')[0].split('#')[0],
fragment: this.route.snapshot.fragment
}
}
get activeIndex(): number { get activeIndex(): number {
return this.items?this.items.findIndex(item => this.isTheActiveMenuItem(item)):0; return this.items?this.items.findIndex(item => this.isTheActiveMenuItem(item)):0;
@ -35,9 +41,9 @@ export class SideBarComponent implements OnInit {
(subItem && this.activeItem === item._id && this.activeSubItem === subItem._id); (subItem && this.activeItem === item._id && this.activeSubItem === subItem._id);
} else { } else {
if (subItem) { if (subItem) {
return MenuItem.isTheActiveMenu(subItem, this.router.url.split('?')[0]) || MenuItem.isTheActiveMenu(subItem, this.router.url.split('#')[0]); return MenuItem.isTheActiveMenu(subItem, this.currentRoute);
} }
return MenuItem.isTheActiveMenu(item,this.router.url.split('?')[0]) || MenuItem.isTheActiveMenu(item,this.router.url.split('#')[0]); return MenuItem.isTheActiveMenu(item,this.currentRoute);
} }
} }

View File

@ -10,7 +10,6 @@ export class MenuItem {
routeRequired: string[] = []; // the routes that if aren't enable the menu item doesn't make sense routeRequired: string[] = []; // the routes that if aren't enable the menu item doesn't make sense
params: any = {}; params: any = {};
fragment: string; fragment: string;
markAsActive: boolean;
items: MenuItem[] = []; items: MenuItem[] = [];
icon: string; icon: string;
open: boolean; open: boolean;
@ -27,44 +26,46 @@ export class MenuItem {
this.entitiesRequired = entitiesRequired; this.entitiesRequired = entitiesRequired;
this.routeRequired = routeRequired; this.routeRequired = routeRequired;
this.params = params; this.params = params;
this.markAsActive = true;
this.items = []; this.items = [];
this.icon = icon; this.icon = icon;
this.fragment = fragment; this.fragment = fragment;
this.customClass = customClass; this.customClass = customClass;
} }
public setMarkAsActive(showActive: boolean) { public static isTheActiveMenu(menu: MenuItem, currentRoute: any, activeMenuItem: string=""): boolean {
this.markAsActive = showActive; if(menu.route && menu.route.length > 0 && MenuItem.isTheActiveMenuItem(menu, currentRoute, activeMenuItem)) {
}
public static isTheActiveMenu(menu: MenuItem, currentRoute: string): boolean {
if (!menu.markAsActive) {
return false;
}
if (menu.route.length > 0 && ((menu.routeActive && currentRoute.includes(menu.routeActive)) || currentRoute == menu.route)) {
return true; return true;
} else if (menu.items.length > 0) { } else if(menu.items.length > 0) {
for (let menuItem of menu.items) { for(let menuItem of menu.items) {
if (menuItem.route == currentRoute || currentRoute.indexOf(menuItem.route) != -1) { if(MenuItem.isTheActiveMenuItem(menuItem, currentRoute, activeMenuItem)) {
return true; return true;
} }
} }
} }
return false; return false;
}
private static isTheActiveMenuItem(menu: MenuItem, currentRoute: any, activeMenuItem: string) {
return (
((menu.route == currentRoute.route || menu.route == (currentRoute.route + "/")) && currentRoute.fragment == menu.fragment))
|| (menu.routeActive && (
currentRoute.route.includes(menu.routeActive)))
|| (menu._id && menu._id === activeMenuItem);
} }
} }
/**
* @deprecated
* */
export class RootMenuItem { export class RootMenuItem {
rootItem: MenuItem; rootItem: MenuItem;
items: MenuItem[] = []; items: MenuItem[] = [];
public static isTheActiveRootMenu(menu: RootMenuItem, currentRoute: string): boolean { public static isTheActiveRootMenu(menu: RootMenuItem, currentRoute: string): boolean {
if (!menu.rootItem.markAsActive) {
return false;
}
if (currentRoute == menu.rootItem.route) { if (currentRoute == menu.rootItem.route) {
return true; return true;
} else if (menu.items.length > 0) { } else if (menu.items.length > 0) {

View File

@ -52,7 +52,7 @@
(click)="closeCanvas(canvas)">{{menu.rootItem.title}}</a> (click)="closeCanvas(canvas)">{{menu.rootItem.title}}</a>
<ul class="uk-nav-sub"> <ul class="uk-nav-sub">
<ng-container *ngFor="let submenu of menu.items"> <ng-container *ngFor="let submenu of menu.items">
<li [class.uk-active]="isTheActiveMenuItem(submenu)" <li [class.uk-active]="isTheActiveMenu(submenu)"
*ngIf="isEnabled(submenu.entitiesRequired,showEntity) && isEnabled(submenu.routeRequired, showPage) && (submenu.route.length > 0 || submenu.url.length > 0)" *ngIf="isEnabled(submenu.entitiesRequired,showEntity) && isEnabled(submenu.routeRequired, showPage) && (submenu.route.length > 0 || submenu.url.length > 0)"
[class.uk-parent]="submenu.items && submenu.items.length > 0"> [class.uk-parent]="submenu.items && submenu.items.length > 0">
<a *ngIf="submenu.route.length > 0" (click)="closeCanvas(canvas)" <a *ngIf="submenu.route.length > 0" (click)="closeCanvas(canvas)"
@ -150,7 +150,7 @@
<ng-container *ngFor="let submenu of menu.items"> <ng-container *ngFor="let submenu of menu.items">
<li *ngIf="isEnabled(submenu.entitiesRequired,showEntity) && <li *ngIf="isEnabled(submenu.entitiesRequired,showEntity) &&
isEnabled(submenu.routeRequired, showPage) && (submenu.route.length > 0 || isEnabled(submenu.routeRequired, showPage) && (submenu.route.length > 0 ||
submenu.url.length > 0)" [class.uk-active]="isTheActiveMenuItem(submenu)" submenu.url.length > 0)" [class.uk-active]="isTheActiveMenu(submenu)"
[class.uk-parent]="submenu.items && submenu.items.length > 0"> [class.uk-parent]="submenu.items && submenu.items.length > 0">
<a *ngIf="submenu.route.length > 0" <a *ngIf="submenu.route.length > 0"
routerLink="{{submenu.route}}" [queryParams]="submenu.params" routerLink="{{submenu.route}}" [queryParams]="submenu.params"
@ -212,7 +212,7 @@
routerLink="{{submenu.route}}" routerLink="{{submenu.route}}"
[queryParams]="submenu.params" [queryParams]="submenu.params"
[fragment]="submenu.fragment" [fragment]="submenu.fragment"
[class.uk-active]="isTheActiveMenuItem(submenu)"> [class.uk-active]="isTheActiveMenu(submenu)">
{{submenu.title}} {{submenu.title}}
</a> </a>
<!-- EXTERNAL CHILD --> <!-- EXTERNAL CHILD -->
@ -247,7 +247,7 @@
routerLink="{{item.route}}" routerLink="{{item.route}}"
[queryParams]="item.params" [queryParams]="item.params"
[fragment]="item.fragment" [fragment]="item.fragment"
[class.uk-active]="isTheActiveMenuItem(item)"> [class.uk-active]="isTheActiveMenu(item)">
{{item.title}} {{item.title}}
</a> </a>
<!-- EXTERNAL --> <!-- EXTERNAL -->

View File

@ -7,6 +7,7 @@ import {EnvProperties} from '../utils/properties/env-properties';
import {Subscription} from 'rxjs'; import {Subscription} from 'rxjs';
import {HelpContentService} from '../services/help-content.service'; import {HelpContentService} from '../services/help-content.service';
import {properties} from "../../../environments/environment"; import {properties} from "../../../environments/environment";
import {LayoutService} from "../dashboard/sharedComponents/sidebar/layout.service";
declare var UIkit; declare var UIkit;
@ -59,8 +60,8 @@ export class NavigationBarComponent implements OnInit, OnDestroy {
constructor(private router: Router, constructor(private router: Router,
private route: ActivatedRoute, private route: ActivatedRoute,
private config: ConfigurationService, private config: ConfigurationService,
private _helpContentService: HelpContentService) { private _helpContentService: HelpContentService,
} private layoutService: LayoutService) {}
ngOnInit() { ngOnInit() {
this.initialize(); this.initialize();
@ -176,25 +177,13 @@ export class NavigationBarComponent implements OnInit, OnDestroy {
} }
} }
isTheActiveMenu(menu: RootMenuItem): boolean { isTheActiveMenu(menu: MenuItem | RootMenuItem): boolean {
if (!menu.rootItem.markAsActive) { if(menu instanceof MenuItem) {
return false; return MenuItem.isTheActiveMenu(menu, this.currentRoute, this.layoutService.activeMenuItem);
} else {
let item: MenuItem = menu.rootItem;
item.items = menu.items;
return MenuItem.isTheActiveMenu(item, this.currentRoute, this.layoutService.activeMenuItem);
} }
if (this.isTheActiveMenuItem(menu.rootItem)) {
return true;
} else if (menu.items.length > 0) {
for (let menuItem of menu.items) {
if (this.isTheActiveMenuItem(menuItem)) {
return true;
}
}
}
return false;
}
isTheActiveMenuItem(menuItem: MenuItem): boolean {
let currentRoute = this.currentRoute;
return (menuItem.route == currentRoute.route || menuItem.route == (currentRoute.route + "/")) &&
currentRoute.fragment == menuItem.fragment;
} }
} }

View File

@ -9,7 +9,8 @@ import {TabComponent} from './tab.component';
selector: 'my-tabs', selector: 'my-tabs',
template: ` template: `
<ul class="uk-tab" [ngClass]="customClass" uk-tab="connect: .tabs-content"> <ul class="uk-tab" [ngClass]="customClass" uk-tab="connect: .tabs-content">
<li *ngFor="let tab of tabs.toArray(); let i=index" [ngClass]="tab.customClass" [class.uk-active]="selected === tab.tabId" (click)="selectTab(tab)"> <!-- [class.uk-active]="selected === tab.tabId"-->
<li *ngFor="let tab of tabs.toArray(); let i=index" [ngClass]="tab.customClass" (click)="selectTab(tab)">
<a class="uk-width-1-1 uk-height-1-1 uk-flex uk-flex-center" [ngClass]="tab.tabIcon ? 'uk-flex-column' : ''"> <a class="uk-width-1-1 uk-height-1-1 uk-flex uk-flex-center" [ngClass]="tab.tabIcon ? 'uk-flex-column' : ''">
<icon *ngIf="tab.tabIcon" [svg]="tab.tabIcon.svg" [ratio]="tab.tabIcon.ratio?tab.tabIcon.ratio:1" class="uk-margin-small-bottom" <icon *ngIf="tab.tabIcon" [svg]="tab.tabIcon.svg" [ratio]="tab.tabIcon.ratio?tab.tabIcon.ratio:1" class="uk-margin-small-bottom"
[ngClass]="(selected === tab.tabId)?tab.tabIcon.active:null"></icon> [ngClass]="(selected === tab.tabId)?tab.tabIcon.active:null"></icon>