diff --git a/changes/28532-fix-query-edit-permissinos b/changes/28532-fix-query-edit-permissinos new file mode 100644 index 0000000000..c3d189819b --- /dev/null +++ b/changes/28532-fix-query-edit-permissinos @@ -0,0 +1 @@ +- Fix a bug where global observers could access the "delete query" UX on the queries table diff --git a/frontend/pages/queries/ManageQueriesPage/components/QueriesTable/QueriesTableConfig.tsx b/frontend/pages/queries/ManageQueriesPage/components/QueriesTable/QueriesTableConfig.tsx index 161213231b..fbaa07d7ca 100644 --- a/frontend/pages/queries/ManageQueriesPage/components/QueriesTable/QueriesTableConfig.tsx +++ b/frontend/pages/queries/ManageQueriesPage/components/QueriesTable/QueriesTableConfig.tsx @@ -8,7 +8,14 @@ import PATHS from "router/paths"; import { Tooltip as ReactTooltip5 } from "react-tooltip-5"; import { secondsToDhms } from "utilities/helpers"; -import permissionsUtils from "utilities/permissions"; +import { + isGlobalAdmin, + isGlobalMaintainer, + isTeamAdmin, + isTeamMaintainer, + isTeamObserver, + isOnlyObserver, +} from "utilities/permissions/permissions"; import { getPathWithQueryParams } from "utilities/url"; import { @@ -123,8 +130,8 @@ const generateColumnConfigs = ({ omitSelectionColumn = false, }: IGenerateColumnConfigs): IDataColumn[] => { const isCurrentTeamObserverOrGlobalObserver = currentTeamId - ? permissionsUtils.isTeamObserver(currentUser, currentTeamId) - : permissionsUtils.isOnlyObserver(currentUser); + ? isTeamObserver(currentUser, currentTeamId) + : isOnlyObserver(currentUser); const viewingTeamScope = currentTeamId !== API_ALL_TEAMS_ID; const tableHeaders: IDataColumn[] = [ @@ -282,7 +289,15 @@ const generateColumnConfigs = ({ ), }, ]; - if (!isCurrentTeamObserverOrGlobalObserver && !omitSelectionColumn) { + + const canEditQueries = + isGlobalAdmin(currentUser) || + isGlobalMaintainer(currentUser) || + (currentTeamId && + (isTeamAdmin(currentUser, currentTeamId) || + isTeamMaintainer(currentUser, currentTeamId))); + + if (canEditQueries && !omitSelectionColumn) { tableHeaders.unshift({ id: "selection", // TODO - improve typing of IHeaderProps instead of using any diff --git a/frontend/utilities/permissions/permissions.ts b/frontend/utilities/permissions/permissions.ts index 5b62422d80..e48bbbd7b3 100644 --- a/frontend/utilities/permissions/permissions.ts +++ b/frontend/utilities/permissions/permissions.ts @@ -111,7 +111,7 @@ const isAnyTeamMaintainerOrTeamAdmin = (user: IUser): boolean => { return false; }; -const isOnlyObserver = (user: IUser): boolean => { +export const isOnlyObserver = (user: IUser): boolean => { if (isGlobalObserver(user)) { return true; }