From 33afa15533d1c20e94f95222bd3004a91f6fc6d6 Mon Sep 17 00:00:00 2001 From: nsemets Date: Fri, 26 Sep 2025 18:38:17 +0300 Subject: [PATCH] fix(permissions): fixed permissions bug --- .../components/nav-menu/nav-menu.component.ts | 1 + src/app/core/helpers/nav-menu.helper.ts | 38 +++++++++++++------ src/app/core/models/route-context.model.ts | 3 ++ .../shared/models/current-resource.model.ts | 3 ++ .../models/guid-response-json-api.model.ts | 3 ++ src/app/shared/services/resource.service.ts | 1 + .../current-resource.state.ts | 2 +- 7 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/app/core/components/nav-menu/nav-menu.component.ts b/src/app/core/components/nav-menu/nav-menu.component.ts index 10b03bd4c..e167f5f43 100644 --- a/src/app/core/components/nav-menu/nav-menu.component.ts +++ b/src/app/core/components/nav-menu/nav-menu.component.ts @@ -65,6 +65,7 @@ export class NavMenuComponent { isCollections: this.isCollectionsRoute() || false, currentUrl: this.router.url, isViewOnly: !!getViewOnlyParam(this.router), + permissions: this.currentResource()?.permissions, }; const items = updateMenuItems(filtered, routeContext); diff --git a/src/app/core/helpers/nav-menu.helper.ts b/src/app/core/helpers/nav-menu.helper.ts index b20d4c222..563ca77ba 100644 --- a/src/app/core/helpers/nav-menu.helper.ts +++ b/src/app/core/helpers/nav-menu.helper.ts @@ -94,14 +94,21 @@ function updateProjectMenuItem(item: MenuItem, ctx: RouteContext): MenuItem { } menuItems = menuItems.map((menuItem) => { - if (menuItem.id !== 'project-wiki') { - return menuItem; + if (menuItem.id === 'project-wiki') { + return { + ...menuItem, + visible: ctx.wikiPageVisible, + }; } - return { - ...menuItem, - visible: ctx.wikiPageVisible, - }; + if (menuItem.id === 'project-contributors' || menuItem.id === 'project-settings') { + return { + ...menuItem, + visible: !!ctx.permissions?.length, + }; + } + + return menuItem; }); return { @@ -139,11 +146,20 @@ function updateRegistryMenuItem(item: MenuItem, ctx: RouteContext): MenuItem { ...subItem, visible: true, expanded: true, - items: menuItems.map((menuItem) => ({ - ...menuItem, - routerLink: [ctx.resourceId as string, menuItem.routerLink], - queryParams: ctx.isViewOnly ? { view_only: getViewOnlyParamFromUrl(ctx.currentUrl) } : undefined, - })), + items: menuItems.map((menuItem) => { + if (menuItem.id === 'registration-contributors') { + return { + ...menuItem, + visible: !!ctx.permissions?.length, + }; + } + + return { + ...menuItem, + routerLink: [ctx.resourceId as string, menuItem.routerLink], + queryParams: ctx.isViewOnly ? { view_only: getViewOnlyParamFromUrl(ctx.currentUrl) } : undefined, + }; + }), }; } return { ...subItem, visible: false, expanded: false }; diff --git a/src/app/core/models/route-context.model.ts b/src/app/core/models/route-context.model.ts index b69899cd0..456173ee2 100644 --- a/src/app/core/models/route-context.model.ts +++ b/src/app/core/models/route-context.model.ts @@ -1,3 +1,5 @@ +import { UserPermissions } from '@osf/shared/enums'; + export interface RouteContext { resourceId: string | undefined; providerId?: string; @@ -11,4 +13,5 @@ export interface RouteContext { isCollections: boolean; currentUrl?: string; isViewOnly?: boolean; + permissions?: UserPermissions[]; } diff --git a/src/app/shared/models/current-resource.model.ts b/src/app/shared/models/current-resource.model.ts index 5b4a64c83..c222a7a21 100644 --- a/src/app/shared/models/current-resource.model.ts +++ b/src/app/shared/models/current-resource.model.ts @@ -1,7 +1,10 @@ +import { UserPermissions } from '../enums'; + export interface CurrentResource { id: string; type: string; parentId?: string; parentType?: string; wikiEnabled?: boolean; + permissions: UserPermissions[]; } diff --git a/src/app/shared/models/guid-response-json-api.model.ts b/src/app/shared/models/guid-response-json-api.model.ts index b1b84ef85..b7acd9fda 100644 --- a/src/app/shared/models/guid-response-json-api.model.ts +++ b/src/app/shared/models/guid-response-json-api.model.ts @@ -1,3 +1,5 @@ +import { UserPermissions } from '../enums'; + import { JsonApiResponse } from './common'; export type GuidedResponseJsonApi = JsonApiResponse; @@ -8,6 +10,7 @@ interface GuidDataJsonApi { attributes: { guid: string; wiki_enabled: boolean; + permissions: UserPermissions[]; }; relationships: { target?: { diff --git a/src/app/shared/services/resource.service.ts b/src/app/shared/services/resource.service.ts index bd80bf436..b8685244a 100644 --- a/src/app/shared/services/resource.service.ts +++ b/src/app/shared/services/resource.service.ts @@ -56,6 +56,7 @@ export class ResourceGuidService { ? res.data.relationships.provider?.data.type : res.data.relationships.target?.data.type, wikiEnabled: res.data.attributes.wiki_enabled, + permissions: res.data.attributes.permissions, }) as CurrentResource ), finalize(() => this.loaderService.hide()) diff --git a/src/app/shared/stores/current-resource/current-resource.state.ts b/src/app/shared/stores/current-resource/current-resource.state.ts index 609d8fa89..598d77b6c 100644 --- a/src/app/shared/stores/current-resource/current-resource.state.ts +++ b/src/app/shared/stores/current-resource/current-resource.state.ts @@ -19,7 +19,7 @@ export class CurrentResourceState { private resourceService = inject(ResourceGuidService); @Action(GetResource) - getResourceType(ctx: StateContext, action: GetResource) { + getResource(ctx: StateContext, action: GetResource) { const state = ctx.getState(); if (state.currentResource.data?.id === action.resourceId && !action.refresh) {