From c84ef31ed9be011691ba12cec659d638aeb00bd6 Mon Sep 17 00:00:00 2001 From: RachelElysia <71795832+RachelElysia@users.noreply.github.com> Date: Wed, 18 Oct 2023 11:03:55 -0400 Subject: [PATCH] Fleet UI: [bug fix for release] Team admin and team maintainer can edit query (#14603) --- frontend/context/app.tsx | 2 +- .../QueryDetailsPage/QueryDetailsPage.tsx | 15 ++++++++++++- frontend/pages/queries/edit/EditQueryPage.tsx | 21 ++++++++++++++++--- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/frontend/context/app.tsx b/frontend/context/app.tsx index 8423c1439f..5784534c4e 100644 --- a/frontend/context/app.tsx +++ b/frontend/context/app.tsx @@ -376,7 +376,7 @@ const AppProvider = ({ children }: Props): JSX.Element => { isTeamObserver: state.isTeamObserver, isTeamMaintainer: state.isTeamMaintainer, isTeamAdmin: state.isTeamAdmin, - isTeamMaintainerOrTeamAdmin: state.isTeamMaintainer, + isTeamMaintainerOrTeamAdmin: state.isTeamMaintainerOrTeamAdmin, isAnyTeamAdmin: state.isAnyTeamAdmin, isOnlyObserver: state.isOnlyObserver, isObserverPlus: state.isObserverPlus, diff --git a/frontend/pages/queries/details/QueryDetailsPage/QueryDetailsPage.tsx b/frontend/pages/queries/details/QueryDetailsPage/QueryDetailsPage.tsx index f634d648d9..197a081ba1 100644 --- a/frontend/pages/queries/details/QueryDetailsPage/QueryDetailsPage.tsx +++ b/frontend/pages/queries/details/QueryDetailsPage/QueryDetailsPage.tsx @@ -49,11 +49,12 @@ const baseClass = "query-details-page"; const QueryDetailsPage = ({ router, - params: { id: paramsQueryId }, + params: { id: paramsQueryId, team_id: paramsTeamId }, location, }: IQueryDetailsPageProps): JSX.Element => { const queryId = parseInt(paramsQueryId, 10); const queryParams = location.query; + const teamId = parseInt(paramsTeamId, 10); // Functions to avoid race conditions const serverSortBy: ISortOption[] = (() => { @@ -74,6 +75,8 @@ const QueryDetailsPage = ({ isAnyTeamObserverPlus, config, filteredQueriesPath, + availableTeams, + setCurrentTeam, } = useContext(AppContext); const { lastEditedQueryName, @@ -151,6 +154,16 @@ const QueryDetailsPage = ({ } ); + // Used to set host's team in AppContext for RBAC action buttons + useEffect(() => { + if (storedQuery?.team_id) { + const querysTeam = availableTeams?.find( + (team) => team.id === storedQuery.team_id + ); + setCurrentTeam(querysTeam); + } + }, [storedQuery]); + const isLoading = isStoredQueryLoading || isQueryReportLoading; const isApiError = storedQueryError || queryReportError; const isClipped = diff --git a/frontend/pages/queries/edit/EditQueryPage.tsx b/frontend/pages/queries/edit/EditQueryPage.tsx index c3d98395b9..d05f6dc3ea 100644 --- a/frontend/pages/queries/edit/EditQueryPage.tsx +++ b/frontend/pages/queries/edit/EditQueryPage.tsx @@ -92,7 +92,7 @@ const EditQueryPage = ({ setLastEditedQueryPlatforms, setLastEditedQueryDiscardData, } = useContext(QueryContext); - const { setConfig } = useContext(AppContext); + const { setConfig, availableTeams, setCurrentTeam } = useContext(AppContext); const { renderFlash } = useContext(NotificationContext); const [isLiveQueryRunnable, setIsLiveQueryRunnable] = useState(true); @@ -145,6 +145,16 @@ const EditQueryPage = ({ } ); + // Used to set host's team in AppContext for RBAC actions + useEffect(() => { + if (storedQuery?.team_id) { + const querysTeam = availableTeams?.find( + (team) => team.id === storedQuery.team_id + ); + setCurrentTeam(querysTeam); + } + }, [storedQuery]); + const detectIsFleetQueryRunnable = () => { statusAPI.live_query().catch(() => { setIsLiveQueryRunnable(false); @@ -157,10 +167,15 @@ const EditQueryPage = ({ const canEditExistingQuery = isGlobalAdmin || isGlobalMaintainer || isTeamMaintainerOrTeamAdmin; - if (queryId && queryId > 0 && !canEditExistingQuery) { + if ( + !isStoredQueryLoading && // Confirms teamId for storedQuery before RBAC reroute + queryId && + queryId > 0 && + !canEditExistingQuery + ) { router.push(PATHS.QUERY(queryId)); } - }, [queryId, isTeamMaintainerOrTeamAdmin]); + }, [queryId, isTeamMaintainerOrTeamAdmin, isStoredQueryLoading]); useEffect(() => { detectIsFleetQueryRunnable();