diff --git a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts index 49a0868967..2548cfece6 100644 --- a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts @@ -1,9 +1,10 @@ -import { Component, Injector, OnDestroy, Type, Optional, SkipSelf } from '@angular/core'; +import { Component, Injector, OnDestroy, Optional, SkipSelf, Type } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { eLayoutType } from '../enums/common'; import { ABP } from '../models'; import { ReplaceableComponents } from '../models/replaceable-components'; +import { LocalizationService } from '../services/localization.service'; import { RoutesService } from '../services/routes.service'; import { ReplaceableComponentsState } from '../states/replaceable-components.state'; import { findRoute, getRoutePath } from '../utils/route-utils'; @@ -16,15 +17,18 @@ import { TreeNode } from '../utils/tree-utils'; `, }) export class DynamicLayoutComponent implements OnDestroy { layout: Type; + isLayoutVisible = true; + constructor( injector: Injector, + private localizationService: LocalizationService, private store: Store, @Optional() @SkipSelf() dynamicLayoutComponent: DynamicLayoutComponent, ) { @@ -61,6 +65,15 @@ export class DynamicLayoutComponent implements OnDestroy { this.layout = layouts[expectedLayout].component; } }); + + this.listenToLanguageChange(); + } + + private listenToLanguageChange() { + this.localizationService.languageChange.pipe(takeUntilDestroy(this)).subscribe(() => { + this.isLayoutVisible = false; + setTimeout(() => (this.isLayoutVisible = true), 0); + }); } private getComponent(key: string): ReplaceableComponents.ReplaceableComponent { diff --git a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts index c4b70d0b7b..6ba6bd18b5 100644 --- a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts @@ -1,34 +1,33 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { Observable, of } from 'rxjs'; import { tap } from 'rxjs/operators'; import snq from 'snq'; -import { RestOccurError } from '../actions'; -import { ConfigState } from '../states'; +import { RestOccurError } from '../actions/rest.actions'; +import { ConfigState } from '../states/config.state'; +import { RoutesService } from '../services/routes.service'; +import { findRoute, getRoutePath } from '../utils/route-utils'; @Injectable({ providedIn: 'root', }) export class PermissionGuard implements CanActivate { - constructor(private store: Store) {} + constructor(private router: Router, private routes: RoutesService, private store: Store) {} - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - let resource = - snq(() => route.data.routes.requiredPolicy) || snq(() => route.data.requiredPolicy as string); - if (!resource) { - resource = snq( - () => - route.routeConfig.children.find(child => state.url.indexOf(child.path) > -1).data - .requiredPolicy, - ); + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + ): Observable | boolean { + let { requiredPolicy } = route.data || {}; - if (!resource) { - return of(true); - } + if (!requiredPolicy) { + requiredPolicy = findRoute(this.routes, getRoutePath(this.router, state.url))?.requiredPolicy; + + if (!requiredPolicy) return true; } - return this.store.select(ConfigState.getGrantedPolicy(resource)).pipe( + return this.store.select(ConfigState.getGrantedPolicy(requiredPolicy)).pipe( tap(access => { if (!access) { this.store.dispatch(new RestOccurError({ status: 403 })); diff --git a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts index 57ffdd5285..a749090695 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts @@ -17,9 +17,9 @@ export function findRoute(routes: RoutesService, path: string): TreeNode path).join('/'); }