diff --git a/awx/ui_next/src/components/AppContainer/AppContainer.jsx b/awx/ui_next/src/components/AppContainer/AppContainer.jsx index bf366b2edb..0abd198c07 100644 --- a/awx/ui_next/src/components/AppContainer/AppContainer.jsx +++ b/awx/ui_next/src/components/AppContainer/AppContainer.jsx @@ -12,7 +12,7 @@ import { t } from '@lingui/macro'; import { withI18n } from '@lingui/react'; import styled from 'styled-components'; -import { ConfigAPI, MeAPI, OrganizationsAPI, RootAPI } from '../../api'; +import { ConfigAPI, MeAPI, RootAPI } from '../../api'; import { ConfigProvider } from '../../contexts/Config'; import { SESSION_TIMEOUT_KEY } from '../../constants'; import { isAuthenticated } from '../../util/auth'; @@ -148,22 +148,8 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { results: [me], }, }, - { - data: { results: notificationAdminResults }, - }, - ] = await Promise.all([ - ConfigAPI.read(), - MeAPI.read(), - OrganizationsAPI.read({ - page_size: 1, - role_level: 'notification_admin_role', - }), - ]); - setConfig({ - ...data, - me, - isNotificationAdmin: Boolean(notificationAdminResults?.length), - }); + ] = await Promise.all([ConfigAPI.read(), MeAPI.read()]); + setConfig({ ...data, me }); setIsReady(true); } catch (err) { if (err.response.status === 401) { diff --git a/awx/ui_next/src/screens/ManagementJob/ManagementJob.jsx b/awx/ui_next/src/screens/ManagementJob/ManagementJob.jsx index 3beab58084..99d3ddac3e 100644 --- a/awx/ui_next/src/screens/ManagementJob/ManagementJob.jsx +++ b/awx/ui_next/src/screens/ManagementJob/ManagementJob.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { Link, Redirect, @@ -13,7 +13,7 @@ import { t } from '@lingui/macro'; import { CaretLeftIcon } from '@patternfly/react-icons'; import { Card, PageSection } from '@patternfly/react-core'; -import { SystemJobTemplatesAPI } from '../../api'; +import { SystemJobTemplatesAPI, OrganizationsAPI } from '../../api'; import ContentError from '../../components/ContentError'; import ContentLoading from '../../components/ContentLoading'; import NotificationList from '../../components/NotificationList'; @@ -28,18 +28,39 @@ function ManagementJob({ i18n, setBreadcrumb }) { const match = useRouteMatch(); const { id } = useParams(); const { pathname } = useLocation(); - const { me, isNotificationAdmin } = useConfig(); + const { me } = useConfig(); - const canReadNotifications = isNotificationAdmin || me?.is_system_auditor; + const [isNotificationAdmin, setIsNotificationAdmin] = useState(false); const { isLoading, error, request, result } = useRequest( - useCallback(async () => SystemJobTemplatesAPI.readDetail(id), [id]) + useCallback( + () => + Promise.all([ + SystemJobTemplatesAPI.readDetail(id), + OrganizationsAPI.read({ + page_size: 1, + role_level: 'notification_admin_role', + }), + ]).then(([systemJobTemplate, notificationRoles]) => ({ + systemJobTemplate, + notificationRoles, + })), + [id] + ) ); useEffect(() => { request(); }, [request, pathname]); + useEffect(() => { + if (!result) return; + setIsNotificationAdmin( + Boolean(result?.notificationRoles?.data?.results?.length) + ); + setBreadcrumb(result); + }, [result, setBreadcrumb, setIsNotificationAdmin]); + useEffect(() => { if (!result) return; @@ -47,18 +68,26 @@ function ManagementJob({ i18n, setBreadcrumb }) { }, [result, setBreadcrumb]); const createSchedule = useCallback( - data => SystemJobTemplatesAPI.createSchedule(result.id, data), + data => + SystemJobTemplatesAPI.createSchedule(result?.systemJobTemplate.id, data), [result] ); const loadSchedules = useCallback( - params => SystemJobTemplatesAPI.readSchedules(result.id, params), + params => + SystemJobTemplatesAPI.readSchedules(result?.systemJobTemplate.id, params), [result] ); const loadScheduleOptions = useCallback( - () => SystemJobTemplatesAPI.readScheduleOptions(result.id), + () => + SystemJobTemplatesAPI.readScheduleOptions(result?.systemJobTemplate.id), [result] ); + const shouldShowNotifications = + result?.systemJobTemplate?.id && + (isNotificationAdmin || me?.is_system_auditor); + const shouldShowSchedules = !!result?.systemJobTemplate?.id; + const tabsArray = [ { id: 99, @@ -70,14 +99,17 @@ function ManagementJob({ i18n, setBreadcrumb }) { ), }, - { + ]; + + if (shouldShowSchedules) { + tabsArray.push({ id: 0, name: i18n._(t`Schedules`), link: `${match.url}/schedules`, - }, - ]; + }); + } - if (canReadNotifications) { + if (shouldShowNotifications) { tabsArray.push({ id: 1, name: i18n._(t`Notifications`), @@ -129,27 +161,29 @@ function ManagementJob({ i18n, setBreadcrumb }) { from={`${basePath}/:id`} to={`${basePath}/:id/schedules`} /> - {canReadNotifications ? ( + {shouldShowNotifications ? ( ) : null} - - - + {shouldShowSchedules ? ( + + + + ) : null}