diff --git a/changes/issue-25367-os-updates-page-permissions b/changes/issue-25367-os-updates-page-permissions new file mode 100644 index 0000000000..a4bc53bb30 --- /dev/null +++ b/changes/issue-25367-os-updates-page-permissions @@ -0,0 +1 @@ +- add permissions to os updates page so that only global admins and the team admin can see the page diff --git a/frontend/pages/ManageControlsPage/ManageControlsPage.tsx b/frontend/pages/ManageControlsPage/ManageControlsPage.tsx index 0afe0170e6..4ca17050d4 100644 --- a/frontend/pages/ManageControlsPage/ManageControlsPage.tsx +++ b/frontend/pages/ManageControlsPage/ManageControlsPage.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useContext } from "react"; +import React, { useCallback, useContext, useMemo } from "react"; import { Tab, Tabs, TabList } from "react-tabs"; import { InjectedRouter } from "react-router"; @@ -54,8 +54,11 @@ interface IManageControlsPageProps { router: InjectedRouter; // v3 } -const getTabIndex = (path: string): number => { - return controlsSubNav.findIndex((navItem) => { +const getTabIndex = ( + permittedControlsSubNav: IControlsSubNavItem[], + path: string +): number => { + return permittedControlsSubNav.findIndex((navItem) => { // tab stays highlighted for paths that start with same pathname return path.startsWith(navItem.pathname); }); @@ -73,7 +76,13 @@ const ManageControlsPage = ({ }: IManageControlsPageProps): JSX.Element => { const page = parseInt(location?.query?.page || "", 10) || 0; - const { config, isOnGlobalTeam, isPremiumTier } = useContext(AppContext); + const { + config, + isOnGlobalTeam, + isPremiumTier, + isGlobalAdmin, + isTeamAdmin, + } = useContext(AppContext); const { currentTeamId, @@ -93,9 +102,19 @@ const ManageControlsPage = ({ }, }); + const permittedControlsSubNav = useMemo(() => { + let renderedSubNav = controlsSubNav; + if (!isGlobalAdmin && !isTeamAdmin) { + renderedSubNav = controlsSubNav.filter((navItem) => { + return navItem.name !== "OS updates"; + }); + } + return renderedSubNav; + }, [isGlobalAdmin, isTeamAdmin]); + const navigateToNav = useCallback( (i: number): void => { - const navPath = controlsSubNav[i].pathname; + const navPath = permittedControlsSubNav[i].pathname; // remove query params related to the prior tab const newParams = new URLSearchParams(location?.search); subNavQueryParams.forEach((p) => newParams.delete(p)); @@ -107,7 +126,7 @@ const ManageControlsPage = ({ .concat(location?.hash || "") ); }, - [location, router] + [location, router, permittedControlsSubNav] ); const renderBody = () => { @@ -115,11 +134,14 @@ const ManageControlsPage = ({