diff --git a/web/app/[workspaceSlug]/(pages)/pages/layout.tsx b/web/app/[workspaceSlug]/(pages)/pages/layout.tsx index 552709d7c4..e17e00686f 100644 --- a/web/app/[workspaceSlug]/(pages)/pages/layout.tsx +++ b/web/app/[workspaceSlug]/(pages)/pages/layout.tsx @@ -3,8 +3,10 @@ // layouts import { useParams } from "next/navigation"; // components +import { EUserPermissions } from "@plane/constants"; import { StickyActionBar } from "@/components/stickies"; // wrappers +import WorkspaceAccessWrapper from "@/layouts/access/workspace-wrapper"; import { AuthenticationWrapper } from "@/lib/wrappers"; // plane web components import { PagesAppCommandPalette } from "@/plane-web/components/command-palette"; @@ -29,7 +31,10 @@ export default function WorkspacePagesLayout({ children }: { children: React.Rea flag="WORKSPACE_PAGES" fallback={} > - <> +
@@ -41,7 +46,7 @@ export default function WorkspacePagesLayout({ children }: { children: React.Rea
- +
diff --git a/web/core/layouts/access/workspace-wrapper.tsx b/web/core/layouts/access/workspace-wrapper.tsx index d2c8869b77..32ddd6e9fa 100644 --- a/web/core/layouts/access/workspace-wrapper.tsx +++ b/web/core/layouts/access/workspace-wrapper.tsx @@ -1,20 +1,23 @@ import { useParams } from "next/navigation"; +import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { NotAuthorizedView } from "@/components/auth-screens"; import { useUserPermissions } from "@/hooks/store"; - interface IWorkspaceAuthWrapper { children: React.ReactNode; pageKey: string; + allowedPermissions?: EUserPermissions[]; } const WorkspaceAccessWrapper = ({ children, ...props }: IWorkspaceAuthWrapper) => { - const { pageKey } = props; + const { pageKey, allowedPermissions } = props; // router const { workspaceSlug } = useParams(); // store - const { hasPageAccess } = useUserPermissions(); + const { hasPageAccess, allowPermissions } = useUserPermissions(); // derived values - const isAuthorized = hasPageAccess(workspaceSlug?.toString() ?? "", pageKey); + const isAuthorized = allowedPermissions + ? allowPermissions(allowedPermissions, EUserPermissionsLevel.WORKSPACE, workspaceSlug?.toString()) + : hasPageAccess(workspaceSlug?.toString() ?? "", pageKey); // render if (!isAuthorized) return ; return <>{children}; diff --git a/web/ee/components/workspace/sidebar/teams-sidebar-list.tsx b/web/ee/components/workspace/sidebar/teams-sidebar-list.tsx index 9f5e75aa2d..179ad42031 100644 --- a/web/ee/components/workspace/sidebar/teams-sidebar-list.tsx +++ b/web/ee/components/workspace/sidebar/teams-sidebar-list.tsx @@ -32,12 +32,14 @@ export const SidebarTeamsList = observer(() => { const { toggleSidebar, sidebarCollapsed } = useAppTheme(); const { allowPermissions } = useUserPermissions(); const { toggleCreateTeamspaceModal } = useCommandPalette(); + const { hasPageAccess } = useUserPermissions(); const { joinedTeamSpaceIds, isTeamspacesFeatureEnabled, getTeamspaceById } = useTeamspaces(); // local storage const { setValue: toggleTeamMenu, storedValue } = useLocalStorage("is_teams_list_open", true); // derived values const isTeamspaceListItemOpen = !!storedValue; const isAdmin = allowPermissions([EUserWorkspaceRoles.ADMIN], EUserPermissionsLevel.WORKSPACE); + const isAuthorized = hasPageAccess(workspaceSlug?.toString() ?? "", "team_spaces"); const handleLinkClick = () => { if (window.innerWidth < 768) { @@ -52,6 +54,8 @@ export const SidebarTeamsList = observer(() => { // Return if teamspaces are not enabled or available if (!isTeamspacesFeatureEnabled || joinedTeamSpaceIds.length === 0) return null; + if (!isAuthorized) return null; + return ( <>