From c194f8ae577a245ee896d79bef47de20cd602439 Mon Sep 17 00:00:00 2001 From: RachelElysia <71795832+RachelElysia@users.noreply.github.com> Date: Tue, 26 Oct 2021 16:55:53 -0400 Subject: [PATCH] Team Admin: Give team admin all team maintainer's permissions for query experience (#2689) --- frontend/components/App/App.tsx | 6 +++--- frontend/context/app.tsx | 7 +++++++ .../ManagePoliciesPage/ManagePoliciesPage.tsx | 6 +++--- .../QueriesListWrapper/QueriesTableConfig.tsx | 11 +++++++---- frontend/pages/queries/QueryPage/QueryPage.tsx | 10 ++++++---- .../QueryPage/components/QueryForm/QueryForm.tsx | 16 ++++++++++------ frontend/utilities/permissions/permissions.ts | 15 ++++++++++++++- 7 files changed, 50 insertions(+), 21 deletions(-) diff --git a/frontend/components/App/App.tsx b/frontend/components/App/App.tsx index e7aa7ac812..bd7cfa72b5 100644 --- a/frontend/components/App/App.tsx +++ b/frontend/components/App/App.tsx @@ -43,7 +43,7 @@ const App = ({ children }: IAppProps) => { currentUser, isGlobalObserver, isOnlyObserver, - isAnyTeamMaintainer, + isAnyTeamMaintainerOrTeamAdmin, enrollSecret, } = useContext(AppContext); @@ -68,8 +68,8 @@ const App = ({ children }: IAppProps) => { !isGlobalObserver && typeof isOnlyObserver !== "undefined" && !isOnlyObserver && - typeof isAnyTeamMaintainer !== "undefined" && - !isAnyTeamMaintainer; + typeof isAnyTeamMaintainerOrTeamAdmin !== "undefined" && + !isAnyTeamMaintainerOrTeamAdmin; if (canGetEnrollSecret) { dispatch(getEnrollSecret()) diff --git a/frontend/context/app.tsx b/frontend/context/app.tsx index 4576dc4aa0..7e0ea80324 100644 --- a/frontend/context/app.tsx +++ b/frontend/context/app.tsx @@ -23,6 +23,7 @@ type InitialStateType = { isGlobalObserver: boolean | undefined; isOnGlobalTeam: boolean | undefined; isAnyTeamMaintainer: boolean | undefined; + isAnyTeamMaintainerOrTeamAdmin: boolean | undefined; isTeamMaintainer: boolean | undefined; isAnyTeamAdmin: boolean | undefined; isTeamAdmin: boolean | undefined; @@ -46,6 +47,7 @@ const initialState = { isGlobalObserver: undefined, isOnGlobalTeam: undefined, isAnyTeamMaintainer: undefined, + isAnyTeamMaintainerOrTeamAdmin: undefined, isTeamMaintainer: undefined, isAnyTeamAdmin: undefined, isTeamAdmin: undefined, @@ -82,6 +84,10 @@ const setPermissions = (user: IUser, config: IConfig, teamId = 0) => { isGlobalObserver: permissions.isGlobalObserver(user), isOnGlobalTeam: permissions.isOnGlobalTeam(user), isAnyTeamMaintainer: permissions.isAnyTeamMaintainer(user), + isAnyTeamMaintainerOrTeamAdmin: permissions.isAnyTeamMaintainerOrTeamAdmin( + user + ), + isAnyTeamAdmin: permissions.isAnyTeamAdmin(user), isTeamMaintainer: permissions.isTeamMaintainer(user, teamId), isOnlyObserver: permissions.isOnlyObserver(user), }; @@ -139,6 +145,7 @@ const AppProvider = ({ children }: Props) => { isGlobalObserver: state.isGlobalObserver, isOnGlobalTeam: state.isOnGlobalTeam, isAnyTeamMaintainer: state.isAnyTeamMaintainer, + isAnyTeamMaintainerOrTeamAdmin: state.isAnyTeamMaintainerOrTeamAdmin, isTeamMaintainer: state.isTeamMaintainer, isTeamAdmin: state.isTeamAdmin, isAnyTeamAdmin: state.isAnyTeamAdmin, diff --git a/frontend/pages/policies/ManagePoliciesPage/ManagePoliciesPage.tsx b/frontend/pages/policies/ManagePoliciesPage/ManagePoliciesPage.tsx index f8425bd78c..40d2b65afa 100644 --- a/frontend/pages/policies/ManagePoliciesPage/ManagePoliciesPage.tsx +++ b/frontend/pages/policies/ManagePoliciesPage/ManagePoliciesPage.tsx @@ -59,7 +59,7 @@ const ManagePolicyPage = (managePoliciesPageProps: { const { config, currentUser, - isAnyTeamMaintainer, + isAnyTeamMaintainerOrTeamAdmin, isGlobalAdmin, isGlobalMaintainer, isOnGlobalTeam, @@ -287,7 +287,7 @@ const ManagePolicyPage = (managePoliciesPageProps: { // Null case must be distinguished from 0 (which is used as the id for the "All teams" option) // so a falsiness check cannot be used here. Null case here allows us to skip API call. if (selectedTeamId !== null) { - if (isOnGlobalTeam || isAnyTeamMaintainer) { + if (isOnGlobalTeam || isAnyTeamMaintainerOrTeamAdmin) { getGlobalPolicies(); } if (selectedTeamId) { @@ -297,7 +297,7 @@ const ManagePolicyPage = (managePoliciesPageProps: { }, [ getGlobalPolicies, getTeamPolicies, - isAnyTeamMaintainer, + isAnyTeamMaintainerOrTeamAdmin, isOnGlobalTeam, selectedTeamId, ]); diff --git a/frontend/pages/queries/ManageQueriesPage/components/QueriesListWrapper/QueriesTableConfig.tsx b/frontend/pages/queries/ManageQueriesPage/components/QueriesListWrapper/QueriesTableConfig.tsx index 1402f726d4..71d02f1efe 100644 --- a/frontend/pages/queries/ManageQueriesPage/components/QueriesListWrapper/QueriesTableConfig.tsx +++ b/frontend/pages/queries/ManageQueriesPage/components/QueriesListWrapper/QueriesTableConfig.tsx @@ -63,7 +63,9 @@ interface IDataColumn { // more info here https://react-table.tanstack.com/docs/api/useTable#cell-properties const generateTableHeaders = (currentUser: IUser): IDataColumn[] => { const isOnlyObserver = permissionsUtils.isOnlyObserver(currentUser); - const isAnyTeamMaintainer = permissionsUtils.isAnyTeamMaintainer(currentUser); + const isAnyTeamMaintainerOrTeamAdmin = permissionsUtils.isAnyTeamMaintainerOrTeamAdmin( + currentUser + ); const tableHeaders: IDataColumn[] = [ { @@ -145,7 +147,7 @@ const generateTableHeaders = (currentUser: IUser): IDataColumn[] => { value: checked, indeterminate, onChange: () => { - if (!isAnyTeamMaintainer) { + if (!isAnyTeamMaintainerOrTeamAdmin) { toggleAllRowsSelected(); } else { // Team maintainers may only delete the queries that they have authored @@ -181,7 +183,8 @@ const generateTableHeaders = (currentUser: IUser): IDataColumn[] => { value: checked, onChange: () => row.toggleRowSelected(), disabled: - isAnyTeamMaintainer && row.original.author_id !== currentUser.id, + isAnyTeamMaintainerOrTeamAdmin && + row.original.author_id !== currentUser.id, }; // If the user is a team maintainer, we only enable checkboxes for queries // that they authored and we include a tooltip to explain disabled checkboxes @@ -191,7 +194,7 @@ const generateTableHeaders = (currentUser: IUser): IDataColumn[] => { data-tip data-for={`${"select-checkbox"}__${row.original.id}`} data-tip-disable={ - !isAnyTeamMaintainer || + !isAnyTeamMaintainerOrTeamAdmin || row.original.author_id === currentUser.id } > diff --git a/frontend/pages/queries/QueryPage/QueryPage.tsx b/frontend/pages/queries/QueryPage/QueryPage.tsx index 59538f742e..3a93d0b91f 100644 --- a/frontend/pages/queries/QueryPage/QueryPage.tsx +++ b/frontend/pages/queries/QueryPage/QueryPage.tsx @@ -41,9 +41,11 @@ const QueryPage = ({ location: { query: URLQuerySearch }, }: IQueryPageProps): JSX.Element => { const queryIdForEdit = paramsQueryId ? parseInt(paramsQueryId, 10) : null; - const { isGlobalAdmin, isGlobalMaintainer, isAnyTeamMaintainer } = useContext( - AppContext - ); + const { + isGlobalAdmin, + isGlobalMaintainer, + isAnyTeamMaintainerOrTeamAdmin, + } = useContext(AppContext); const { selectedOsqueryTable, setSelectedOsqueryTable, @@ -212,7 +214,7 @@ const QueryPage = ({ const showSidebar = isFirstStep && isSidebarOpen && - (isGlobalAdmin || isGlobalMaintainer || isAnyTeamMaintainer); + (isGlobalAdmin || isGlobalMaintainer || isAnyTeamMaintainerOrTeamAdmin); return (