diff --git a/client/src/core/client/admin/App/Main.tsx b/client/src/core/client/admin/App/Main.tsx index 1108c0af89..f4114d2fa0 100644 --- a/client/src/core/client/admin/App/Main.tsx +++ b/client/src/core/client/admin/App/Main.tsx @@ -18,17 +18,18 @@ import styles from "./Main.css"; interface Props { viewer: PropTypesOf["viewer"] & PropTypesOf["viewer"]; + settings: PropTypesOf["settings"]; children: React.ReactNode; } -const Main: FunctionComponent = ({ children, viewer }) => ( +const Main: FunctionComponent = ({ children, viewer, settings }) => (
- +
diff --git a/client/src/core/client/admin/App/MainRoute.tsx b/client/src/core/client/admin/App/MainRoute.tsx index a4a3002e5a..f9c255f3e4 100644 --- a/client/src/core/client/admin/App/MainRoute.tsx +++ b/client/src/core/client/admin/App/MainRoute.tsx @@ -20,7 +20,12 @@ const MainRoute: React.FunctionComponent = (props) => { return ( <> {ErrorReporterSetUser} -
{props.children}
+
+ {props.children} +
); }; @@ -33,6 +38,9 @@ const enhanced = withRouteConfig({ ...UserMenuContainer_viewer ...NavigationContainer_viewer } + settings { + ...NavigationContainer_settings + } } `, })(MainRoute); diff --git a/client/src/core/client/admin/App/Navigation/Navigation.tsx b/client/src/core/client/admin/App/Navigation/Navigation.tsx index ae36ac3928..852cd9878c 100644 --- a/client/src/core/client/admin/App/Navigation/Navigation.tsx +++ b/client/src/core/client/admin/App/Navigation/Navigation.tsx @@ -32,7 +32,6 @@ const Navigation: FunctionComponent = (props) => ( Dashboard )} - {/* TODO: Any other permissions needed? */} {props.showReports && ( DSA Reports diff --git a/client/src/core/client/admin/App/Navigation/NavigationContainer.tsx b/client/src/core/client/admin/App/Navigation/NavigationContainer.tsx index 3efcdd26c8..8141bb8621 100644 --- a/client/src/core/client/admin/App/Navigation/NavigationContainer.tsx +++ b/client/src/core/client/admin/App/Navigation/NavigationContainer.tsx @@ -2,12 +2,14 @@ import React, { FunctionComponent } from "react"; import { graphql } from "react-relay"; import { Ability, can } from "coral-admin/permissions/tenant"; +import { GQLUSER_ROLE } from "coral-common/client/src/core/client/framework/schema/__generated__/types"; import { useLocal, withFragmentContainer } from "coral-framework/lib/relay"; import { SignOutMutation, withSignOutMutation, } from "coral-framework/mutations"; +import { NavigationContainer_settings as SettingsData } from "coral-admin/__generated__/NavigationContainer_settings.graphql"; import { NavigationContainer_viewer as ViewerData } from "coral-admin/__generated__/NavigationContainer_viewer.graphql"; import { NavigationContainerLocal } from "coral-admin/__generated__/NavigationContainerLocal.graphql"; @@ -16,9 +18,13 @@ import Navigation from "./Navigation"; interface Props { signOut: SignOutMutation; viewer: ViewerData | null; + settings: SettingsData | null; } -const NavigationContainer: FunctionComponent = ({ viewer }) => { +const NavigationContainer: FunctionComponent = ({ + viewer, + settings, +}) => { const [{ dsaFeaturesEnabled }] = useLocal( graphql` fragment NavigationContainerLocal on Local { @@ -30,7 +36,19 @@ const NavigationContainer: FunctionComponent = ({ viewer }) => { ); }; @@ -40,6 +58,16 @@ const enhanced = withSignOutMutation( viewer: graphql` fragment NavigationContainer_viewer on User { role + moderationScopes { + sites { + id + } + } + } + `, + settings: graphql` + fragment NavigationContainer_settings on Settings { + multisite } `, })(NavigationContainer) diff --git a/client/src/core/client/admin/permissions/tenant.ts b/client/src/core/client/admin/permissions/tenant.ts index a8a1d2a0d4..9be5b10d83 100644 --- a/client/src/core/client/admin/permissions/tenant.ts +++ b/client/src/core/client/admin/permissions/tenant.ts @@ -5,7 +5,8 @@ import { PermissionMap } from "./types"; export type AbilityType = | "CHANGE_CONFIGURATION" | "INVITE_USERS" - | "VIEW_STATISTICS"; + | "VIEW_STATISTICS" + | "MODERATE_DSA_REPORTS"; interface PermissionContext { TODO: never; } @@ -21,6 +22,10 @@ const permissionMap: PermissionMap = { [GQLUSER_ROLE.ADMIN]: () => true, [GQLUSER_ROLE.MODERATOR]: () => true, }, + MODERATE_DSA_REPORTS: { + [GQLUSER_ROLE.ADMIN]: () => true, + [GQLUSER_ROLE.MODERATOR]: () => true, + }, }; export const Ability = mapValues(permissionMap, (_, key) => key) as {