feat(menu-guard): enhance menu guard logic to support nested menus
This commit is contained in:
@@ -1,6 +1,13 @@
|
|||||||
import { inject } from '@angular/core';
|
import { inject } from '@angular/core';
|
||||||
import { CanActivateFn, Router } from '@angular/router';
|
import { CanActivateFn, Router } from '@angular/router';
|
||||||
import { TenantService } from '../services/tenant.service';
|
import { TenantService } from '../services/tenant.service';
|
||||||
|
import { Menu } from '../services/tenant.interface';
|
||||||
|
|
||||||
|
function containsMenu(menues: Menu[], menuCode: string): boolean {
|
||||||
|
return menues.some(
|
||||||
|
menu => menu.code === menuCode || containsMenu(menu.submenues ?? [], menuCode)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export const hasMenuGuard = (menuCode: string): CanActivateFn => {
|
export const hasMenuGuard = (menuCode: string): CanActivateFn => {
|
||||||
return () => {
|
return () => {
|
||||||
@@ -13,7 +20,7 @@ export const hasMenuGuard = (menuCode: string): CanActivateFn => {
|
|||||||
return router.createUrlTree(['/']);
|
return router.createUrlTree(['/']);
|
||||||
}
|
}
|
||||||
|
|
||||||
const hasMenu = tenant.menues?.some(menu => menu.code === menuCode) ?? false;
|
const hasMenu = containsMenu(tenant.menues ?? [], menuCode);
|
||||||
|
|
||||||
if (hasMenu) {
|
if (hasMenu) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -26,7 +26,11 @@ export interface EventConfig {
|
|||||||
export interface Menu {
|
export interface Menu {
|
||||||
id: number;
|
id: number;
|
||||||
code: string;
|
code: string;
|
||||||
|
parent_menu_code: string | null;
|
||||||
|
content_type: 'static' | 'dynamic';
|
||||||
route: string;
|
route: string;
|
||||||
|
static_content?: unknown;
|
||||||
|
submenues: Menu[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SocialMedia {
|
export interface SocialMedia {
|
||||||
|
|||||||
Reference in New Issue
Block a user