diff --git a/awx/ui_next/src/components/Breadcrumbs/Breadcrumbs.jsx b/awx/ui_next/src/components/Breadcrumbs/Breadcrumbs.jsx
deleted file mode 100644
index 93a9b3d7f4..0000000000
--- a/awx/ui_next/src/components/Breadcrumbs/Breadcrumbs.jsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import React, { Fragment } from 'react';
-import PropTypes from 'prop-types';
-import {
- PageSection as PFPageSection,
- PageSectionVariants,
- Breadcrumb,
- BreadcrumbItem,
- BreadcrumbHeading,
-} from '@patternfly/react-core';
-import { Link, Route, useRouteMatch } from 'react-router-dom';
-
-import styled from 'styled-components';
-
-const PageSection = styled(PFPageSection)`
- padding-top: 10px;
- padding-bottom: 10px;
-`;
-
-const Breadcrumbs = ({ breadcrumbConfig }) => {
- const { light } = PageSectionVariants;
-
- return (
-
-
-
-
-
-
-
- );
-};
-
-const Crumb = ({ breadcrumbConfig, showDivider }) => {
- const match = useRouteMatch();
- const crumb = breadcrumbConfig[match.url];
-
- let crumbElement = (
-
- {crumb}
-
- );
-
- if (match.isExact) {
- crumbElement = (
-
- {crumb}
-
- );
- }
-
- if (!crumb) {
- crumbElement = null;
- }
-
- return (
-
- {crumbElement}
-
-
-
-
- );
-};
-
-Breadcrumbs.propTypes = {
- breadcrumbConfig: PropTypes.objectOf(PropTypes.string).isRequired,
-};
-
-Crumb.propTypes = {
- breadcrumbConfig: PropTypes.objectOf(PropTypes.string).isRequired,
-};
-
-export default Breadcrumbs;
diff --git a/awx/ui_next/src/components/Breadcrumbs/index.js b/awx/ui_next/src/components/Breadcrumbs/index.js
deleted file mode 100644
index 3ff68ca589..0000000000
--- a/awx/ui_next/src/components/Breadcrumbs/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './Breadcrumbs';
diff --git a/awx/ui_next/src/components/ScreenHeader/ScreenHeader.jsx b/awx/ui_next/src/components/ScreenHeader/ScreenHeader.jsx
new file mode 100644
index 0000000000..791e72b78e
--- /dev/null
+++ b/awx/ui_next/src/components/ScreenHeader/ScreenHeader.jsx
@@ -0,0 +1,129 @@
+import React, { Fragment } from 'react';
+import PropTypes from 'prop-types';
+import { withI18n } from '@lingui/react';
+import { t } from '@lingui/macro';
+import {
+ Button,
+ PageSection,
+ PageSectionVariants,
+ Breadcrumb,
+ BreadcrumbItem,
+ Title,
+ Tooltip,
+} from '@patternfly/react-core';
+import { HistoryIcon } from '@patternfly/react-icons';
+import { Link, Route, useRouteMatch } from 'react-router-dom';
+
+const ScreenHeader = ({ breadcrumbConfig, i18n, streamType }) => {
+ const { light } = PageSectionVariants;
+ const oneCrumbMatch = useRouteMatch({
+ path: Object.keys(breadcrumbConfig)[0],
+ strict: true,
+ });
+ const isOnlyOneCrumb = oneCrumbMatch && oneCrumbMatch.isExact;
+
+ return (
+
+
+
+ {!isOnlyOneCrumb && (
+
+
+
+
+
+ )}
+
+
+
+
+ {streamType !== 'none' && (
+
+
+
+
+
+ )}
+
+
+ );
+};
+
+const ActualTitle = ({ breadcrumbConfig }) => {
+ const match = useRouteMatch();
+ const title = breadcrumbConfig[match.url];
+ let titleElement;
+
+ if (match.isExact) {
+ titleElement = (
+
+ {title}
+
+ );
+ }
+
+ if (!title) {
+ titleElement = null;
+ }
+
+ return (
+
+ {titleElement}
+
+
+
+
+ );
+};
+
+const Crumb = ({ breadcrumbConfig, showDivider }) => {
+ const match = useRouteMatch();
+ const crumb = breadcrumbConfig[match.url];
+
+ let crumbElement = (
+
+ {crumb}
+
+ );
+
+ if (match.isExact) {
+ crumbElement = null;
+ }
+
+ if (!crumb) {
+ crumbElement = null;
+ }
+ return (
+
+ {crumbElement}
+
+
+
+
+ );
+};
+
+ScreenHeader.propTypes = {
+ breadcrumbConfig: PropTypes.objectOf(PropTypes.string).isRequired,
+};
+
+Crumb.propTypes = {
+ breadcrumbConfig: PropTypes.objectOf(PropTypes.string).isRequired,
+};
+
+export default withI18n()(ScreenHeader);
diff --git a/awx/ui_next/src/components/Breadcrumbs/Breadcrumbs.test.jsx b/awx/ui_next/src/components/ScreenHeader/ScreenHeader.test.jsx
similarity index 70%
rename from awx/ui_next/src/components/Breadcrumbs/Breadcrumbs.test.jsx
rename to awx/ui_next/src/components/ScreenHeader/ScreenHeader.test.jsx
index 83e5e8c3fe..64f3a92c53 100644
--- a/awx/ui_next/src/components/Breadcrumbs/Breadcrumbs.test.jsx
+++ b/awx/ui_next/src/components/ScreenHeader/ScreenHeader.test.jsx
@@ -1,9 +1,15 @@
import React from 'react';
-import { mount } from 'enzyme';
import { MemoryRouter } from 'react-router-dom';
-import Breadcrumbs from './Breadcrumbs';
-describe('', () => {
+import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
+
+import ScreenHeader from './ScreenHeader';
+
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
+describe('', () => {
let breadcrumbWrapper;
let breadcrumb;
let breadcrumbItem;
@@ -17,15 +23,15 @@ describe('', () => {
};
const findChildren = () => {
- breadcrumb = breadcrumbWrapper.find('Breadcrumb');
+ breadcrumb = breadcrumbWrapper.find('ScreenHeader');
breadcrumbItem = breadcrumbWrapper.find('BreadcrumbItem');
- breadcrumbHeading = breadcrumbWrapper.find('BreadcrumbHeading');
+ breadcrumbHeading = breadcrumbWrapper.find('Title');
};
test('initially renders succesfully', () => {
- breadcrumbWrapper = mount(
+ breadcrumbWrapper = mountWithContexts(
-
+
);
@@ -51,9 +57,9 @@ describe('', () => {
];
routes.forEach(([location, crumbLength]) => {
- breadcrumbWrapper = mount(
+ breadcrumbWrapper = mountWithContexts(
-
+
);
diff --git a/awx/ui_next/src/components/ScreenHeader/index.js b/awx/ui_next/src/components/ScreenHeader/index.js
new file mode 100644
index 0000000000..7f5ab32733
--- /dev/null
+++ b/awx/ui_next/src/components/ScreenHeader/index.js
@@ -0,0 +1 @@
+export { default } from './ScreenHeader';
diff --git a/awx/ui_next/src/screens/Application/Applications.jsx b/awx/ui_next/src/screens/Application/Applications.jsx
index 85995c8512..ae6fa94af1 100644
--- a/awx/ui_next/src/screens/Application/Applications.jsx
+++ b/awx/ui_next/src/screens/Application/Applications.jsx
@@ -12,7 +12,7 @@ import {
import ApplicationsList from './ApplicationsList';
import ApplicationAdd from './ApplicationAdd';
import Application from './Application';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
import { Detail, DetailList } from '../../components/DetailList';
const ApplicationAlert = styled(Alert)`
@@ -45,7 +45,10 @@ function Applications({ i18n }) {
return (
<>
-
+
({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let wrapper;
diff --git a/awx/ui_next/src/screens/Credential/Credentials.jsx b/awx/ui_next/src/screens/Credential/Credentials.jsx
index beca652fd5..d883aa0dca 100644
--- a/awx/ui_next/src/screens/Credential/Credentials.jsx
+++ b/awx/ui_next/src/screens/Credential/Credentials.jsx
@@ -3,7 +3,7 @@ import { Route, Switch } from 'react-router-dom';
import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
import { Config } from '../../contexts/Config';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
import Credential from './Credential';
import CredentialAdd from './CredentialAdd';
import { CredentialList } from './CredentialList';
@@ -34,7 +34,10 @@ function Credentials({ i18n }) {
return (
<>
-
+
{({ me }) => }
diff --git a/awx/ui_next/src/screens/Credential/Credentials.test.jsx b/awx/ui_next/src/screens/Credential/Credentials.test.jsx
index f63c9d9b65..e5cb618fb2 100644
--- a/awx/ui_next/src/screens/Credential/Credentials.test.jsx
+++ b/awx/ui_next/src/screens/Credential/Credentials.test.jsx
@@ -3,6 +3,10 @@ import { createMemoryHistory } from 'history';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Credentials from './Credentials';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let wrapper;
@@ -30,8 +34,8 @@ describe('', () => {
},
});
- expect(wrapper.find('Crumb').length).toBe(1);
- expect(wrapper.find('BreadcrumbHeading').text()).toBe('Credentials');
+ expect(wrapper.find('Crumb').length).toBe(0);
+ expect(wrapper.find('Title').text()).toBe('Credentials');
});
test('should display create new credential breadcrumb heading', () => {
@@ -51,8 +55,6 @@ describe('', () => {
});
expect(wrapper.find('Crumb').length).toBe(2);
- expect(wrapper.find('BreadcrumbHeading').text()).toBe(
- 'Create New Credential'
- );
+ expect(wrapper.find('Title').text()).toBe('Create New Credential');
});
});
diff --git a/awx/ui_next/src/screens/CredentialType/CredentialTypes.jsx b/awx/ui_next/src/screens/CredentialType/CredentialTypes.jsx
index 7cdbbccb00..4eb47c1892 100644
--- a/awx/ui_next/src/screens/CredentialType/CredentialTypes.jsx
+++ b/awx/ui_next/src/screens/CredentialType/CredentialTypes.jsx
@@ -6,7 +6,7 @@ import { Route, Switch } from 'react-router-dom';
import CredentialTypeAdd from './CredentialTypeAdd';
import CredentialTypeList from './CredentialTypeList';
import CredentialType from './CredentialType';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
function CredentialTypes({ i18n }) {
const [breadcrumbConfig, setBreadcrumbConfig] = useState({
@@ -33,7 +33,10 @@ function CredentialTypes({ i18n }) {
);
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/CredentialType/CredentialTypes.test.jsx b/awx/ui_next/src/screens/CredentialType/CredentialTypes.test.jsx
index 468a55ac7a..bd8eff8e21 100644
--- a/awx/ui_next/src/screens/CredentialType/CredentialTypes.test.jsx
+++ b/awx/ui_next/src/screens/CredentialType/CredentialTypes.test.jsx
@@ -4,6 +4,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import CredentialTypes from './CredentialTypes';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let pageWrapper;
let pageSections;
diff --git a/awx/ui_next/src/screens/Dashboard/Dashboard.jsx b/awx/ui_next/src/screens/Dashboard/Dashboard.jsx
index f60e049631..714e6cf152 100644
--- a/awx/ui_next/src/screens/Dashboard/Dashboard.jsx
+++ b/awx/ui_next/src/screens/Dashboard/Dashboard.jsx
@@ -18,7 +18,7 @@ import {
import useRequest from '../../util/useRequest';
import { DashboardAPI } from '../../api';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
import JobList from '../../components/JobList';
import ContentLoading from '../../components/ContentLoading';
import LineChart from './shared/LineChart';
@@ -117,7 +117,10 @@ function Dashboard({ i18n }) {
}
return (
-
+
({
+ ...jest.requireActual('react-router-dom'),
+}));
describe('', () => {
let pageWrapper;
diff --git a/awx/ui_next/src/screens/Host/Hosts.jsx b/awx/ui_next/src/screens/Host/Hosts.jsx
index f66a28aa94..4c128bc202 100644
--- a/awx/ui_next/src/screens/Host/Hosts.jsx
+++ b/awx/ui_next/src/screens/Host/Hosts.jsx
@@ -4,7 +4,7 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
import { Config } from '../../contexts/Config';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
import HostList from './HostList';
import HostAdd from './HostAdd';
@@ -37,7 +37,7 @@ function Hosts({ i18n }) {
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/Host/Hosts.test.jsx b/awx/ui_next/src/screens/Host/Hosts.test.jsx
index ba199f842f..1c0b9821c0 100644
--- a/awx/ui_next/src/screens/Host/Hosts.test.jsx
+++ b/awx/ui_next/src/screens/Host/Hosts.test.jsx
@@ -5,6 +5,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Hosts from './Hosts';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
test('initially renders succesfully', () => {
mountWithContexts();
@@ -27,7 +31,7 @@ describe('', () => {
},
},
});
- expect(wrapper.find('BreadcrumbHeading').length).toBe(1);
+ expect(wrapper.find('Title').length).toBe(1);
wrapper.unmount();
});
diff --git a/awx/ui_next/src/screens/InstanceGroup/InstanceGroups.jsx b/awx/ui_next/src/screens/InstanceGroup/InstanceGroups.jsx
index 4fbdd5d9b2..a133bd91f2 100644
--- a/awx/ui_next/src/screens/InstanceGroup/InstanceGroups.jsx
+++ b/awx/ui_next/src/screens/InstanceGroup/InstanceGroups.jsx
@@ -9,7 +9,7 @@ import InstanceGroup from './InstanceGroup';
import ContainerGroupAdd from './ContainerGroupAdd';
import ContainerGroup from './ContainerGroup';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
function InstanceGroups({ i18n }) {
const [breadcrumbConfig, setBreadcrumbConfig] = useState({
@@ -54,7 +54,10 @@ function InstanceGroups({ i18n }) {
);
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/InstanceGroup/InstanceGroups.test.jsx b/awx/ui_next/src/screens/InstanceGroup/InstanceGroups.test.jsx
index 321b6ca71b..db32e7e4eb 100644
--- a/awx/ui_next/src/screens/InstanceGroup/InstanceGroups.test.jsx
+++ b/awx/ui_next/src/screens/InstanceGroup/InstanceGroups.test.jsx
@@ -4,6 +4,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import InstanceGroups from './InstanceGroups';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let pageWrapper;
let pageSections;
diff --git a/awx/ui_next/src/screens/Inventory/Inventories.jsx b/awx/ui_next/src/screens/Inventory/Inventories.jsx
index cf286c05eb..947a9be42a 100644
--- a/awx/ui_next/src/screens/Inventory/Inventories.jsx
+++ b/awx/ui_next/src/screens/Inventory/Inventories.jsx
@@ -4,7 +4,7 @@ import { t } from '@lingui/macro';
import { Route, Switch } from 'react-router-dom';
import { Config } from '../../contexts/Config';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
import { InventoryList } from './InventoryList';
import Inventory from './Inventory';
import SmartInventory from './SmartInventory';
@@ -95,7 +95,10 @@ function Inventories({ i18n }) {
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/Inventory/Inventories.test.jsx b/awx/ui_next/src/screens/Inventory/Inventories.test.jsx
index ca452f877a..35e1ee5da0 100644
--- a/awx/ui_next/src/screens/Inventory/Inventories.test.jsx
+++ b/awx/ui_next/src/screens/Inventory/Inventories.test.jsx
@@ -4,6 +4,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Inventories from './Inventories';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let pageWrapper;
diff --git a/awx/ui_next/src/screens/Job/Job.test.jsx b/awx/ui_next/src/screens/Job/Job.test.jsx
index 7b902984f0..afb1f6e148 100644
--- a/awx/ui_next/src/screens/Job/Job.test.jsx
+++ b/awx/ui_next/src/screens/Job/Job.test.jsx
@@ -4,6 +4,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Job from './Jobs';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
test('initially renders succesfully', () => {
mountWithContexts();
diff --git a/awx/ui_next/src/screens/Job/Jobs.jsx b/awx/ui_next/src/screens/Job/Jobs.jsx
index 83c8d0d11f..318729407a 100644
--- a/awx/ui_next/src/screens/Job/Jobs.jsx
+++ b/awx/ui_next/src/screens/Job/Jobs.jsx
@@ -3,7 +3,7 @@ import { Route, Switch, useParams, useRouteMatch } from 'react-router-dom';
import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
import { PageSection } from '@patternfly/react-core';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
import Job from './Job';
import JobTypeRedirect from './JobTypeRedirect';
import JobList from '../../components/JobList';
@@ -40,7 +40,7 @@ function Jobs({ i18n }) {
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/Job/Jobs.test.jsx b/awx/ui_next/src/screens/Job/Jobs.test.jsx
index 5782335404..e866a6d20d 100644
--- a/awx/ui_next/src/screens/Job/Jobs.test.jsx
+++ b/awx/ui_next/src/screens/Job/Jobs.test.jsx
@@ -5,6 +5,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Jobs from './Jobs';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
test('initially renders succesfully', () => {
mountWithContexts();
@@ -27,7 +31,7 @@ describe('', () => {
},
},
});
- expect(wrapper.find('BreadcrumbHeading').length).toBe(1);
+ expect(wrapper.find('Title').length).toBe(1);
wrapper.unmount();
});
});
diff --git a/awx/ui_next/src/screens/ManagementJob/ManagementJobs.jsx b/awx/ui_next/src/screens/ManagementJob/ManagementJobs.jsx
index 774eb3e235..94f5a077c5 100644
--- a/awx/ui_next/src/screens/ManagementJob/ManagementJobs.jsx
+++ b/awx/ui_next/src/screens/ManagementJob/ManagementJobs.jsx
@@ -2,12 +2,13 @@ import React, { Fragment } from 'react';
import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
function ManagementJobs({ i18n }) {
return (
-
diff --git a/awx/ui_next/src/screens/ManagementJob/ManagementJobs.test.jsx b/awx/ui_next/src/screens/ManagementJob/ManagementJobs.test.jsx
index a667a47690..df422fe8ec 100644
--- a/awx/ui_next/src/screens/ManagementJob/ManagementJobs.test.jsx
+++ b/awx/ui_next/src/screens/ManagementJob/ManagementJobs.test.jsx
@@ -4,6 +4,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import ManagementJobs from './ManagementJobs';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let pageWrapper;
@@ -17,6 +21,6 @@ describe('', () => {
test('initially renders without crashing', () => {
expect(pageWrapper.length).toBe(1);
- expect(pageWrapper.find('Breadcrumbs').length).toBe(1);
+ expect(pageWrapper.find('ScreenHeader').length).toBe(1);
});
});
diff --git a/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplates.jsx b/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplates.jsx
index 2ae913202f..9d41166d1d 100644
--- a/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplates.jsx
+++ b/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplates.jsx
@@ -5,7 +5,7 @@ import { t } from '@lingui/macro';
import NotificationTemplateList from './NotificationTemplateList';
import NotificationTemplateAdd from './NotificationTemplateAdd';
import NotificationTemplate from './NotificationTemplate';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
function NotificationTemplates({ i18n }) {
const match = useRouteMatch();
@@ -32,7 +32,10 @@ function NotificationTemplates({ i18n }) {
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplates.test.jsx b/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplates.test.jsx
index 9333850cf9..f8b02d4735 100644
--- a/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplates.test.jsx
+++ b/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplates.test.jsx
@@ -2,6 +2,10 @@ import React from 'react';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import NotificationTemplates from './NotificationTemplates';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let pageWrapper;
let pageSections;
diff --git a/awx/ui_next/src/screens/Organization/Organizations.jsx b/awx/ui_next/src/screens/Organization/Organizations.jsx
index 5942d75147..6c7b17dc69 100644
--- a/awx/ui_next/src/screens/Organization/Organizations.jsx
+++ b/awx/ui_next/src/screens/Organization/Organizations.jsx
@@ -4,7 +4,7 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
import { Config } from '../../contexts/Config';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
import OrganizationsList from './OrganizationList/OrganizationList';
import OrganizationAdd from './OrganizationAdd/OrganizationAdd';
@@ -42,7 +42,10 @@ function Organizations({ i18n }) {
return (
-
+
diff --git a/awx/ui_next/src/screens/Organization/Organizations.test.jsx b/awx/ui_next/src/screens/Organization/Organizations.test.jsx
index 4f510463a4..819b86d88d 100644
--- a/awx/ui_next/src/screens/Organization/Organizations.test.jsx
+++ b/awx/ui_next/src/screens/Organization/Organizations.test.jsx
@@ -5,6 +5,9 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Organizations from './Organizations';
jest.mock('../../api');
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
describe('', () => {
test('initially renders succesfully', async () => {
diff --git a/awx/ui_next/src/screens/Project/Projects.jsx b/awx/ui_next/src/screens/Project/Projects.jsx
index a45dd1890b..8063d4c1e6 100644
--- a/awx/ui_next/src/screens/Project/Projects.jsx
+++ b/awx/ui_next/src/screens/Project/Projects.jsx
@@ -3,7 +3,7 @@ import { Route, withRouter, Switch } from 'react-router-dom';
import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
import ProjectsList from './ProjectList/ProjectList';
import ProjectAdd from './ProjectAdd/ProjectAdd';
@@ -45,7 +45,7 @@ function Projects({ i18n }) {
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/Project/Projects.test.jsx b/awx/ui_next/src/screens/Project/Projects.test.jsx
index b46f37ae23..4d522a3d14 100644
--- a/awx/ui_next/src/screens/Project/Projects.test.jsx
+++ b/awx/ui_next/src/screens/Project/Projects.test.jsx
@@ -5,6 +5,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Projects from './Projects';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
test('initially renders succesfully', () => {
mountWithContexts();
@@ -27,7 +31,7 @@ describe('', () => {
},
},
});
- expect(wrapper.find('BreadcrumbHeading').length).toBe(1);
+ expect(wrapper.find('Title').length).toBe(1);
wrapper.unmount();
});
});
diff --git a/awx/ui_next/src/screens/Schedule/AllSchedules.jsx b/awx/ui_next/src/screens/Schedule/AllSchedules.jsx
index a55e9df3bb..4e778e9623 100644
--- a/awx/ui_next/src/screens/Schedule/AllSchedules.jsx
+++ b/awx/ui_next/src/screens/Schedule/AllSchedules.jsx
@@ -4,7 +4,7 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
import { PageSection, Card } from '@patternfly/react-core';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
import { ScheduleList } from '../../components/Schedule';
import { SchedulesAPI } from '../../api';
@@ -19,7 +19,8 @@ function AllSchedules({ i18n }) {
return (
<>
- ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let wrapper;
@@ -30,7 +34,6 @@ describe('', () => {
},
});
- expect(wrapper.find('Crumb').length).toBe(1);
- expect(wrapper.find('BreadcrumbHeading').text()).toBe('Schedules');
+ expect(wrapper.find('Title').text()).toBe('Schedules');
});
});
diff --git a/awx/ui_next/src/screens/Setting/Settings.jsx b/awx/ui_next/src/screens/Setting/Settings.jsx
index ae3356f950..a535384afa 100644
--- a/awx/ui_next/src/screens/Setting/Settings.jsx
+++ b/awx/ui_next/src/screens/Setting/Settings.jsx
@@ -5,7 +5,7 @@ import { t } from '@lingui/macro';
import { PageSection, Card } from '@patternfly/react-core';
import ContentError from '../../components/ContentError';
import ContentLoading from '../../components/ContentLoading';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
import ActivityStream from './ActivityStream';
import AzureAD from './AzureAD';
import GitHub from './GitHub';
@@ -129,7 +129,7 @@ function Settings({ i18n }) {
return (
-
+
diff --git a/awx/ui_next/src/screens/Setting/Settings.test.jsx b/awx/ui_next/src/screens/Setting/Settings.test.jsx
index 24a82986f8..3c63750e71 100644
--- a/awx/ui_next/src/screens/Setting/Settings.test.jsx
+++ b/awx/ui_next/src/screens/Setting/Settings.test.jsx
@@ -13,6 +13,9 @@ jest.mock('../../api/models/Settings');
SettingsAPI.readAllOptions.mockResolvedValue({
data: mockAllOptions,
});
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
describe('', () => {
let wrapper;
diff --git a/awx/ui_next/src/screens/Team/Teams.jsx b/awx/ui_next/src/screens/Team/Teams.jsx
index 3022ca98c7..f71098752a 100644
--- a/awx/ui_next/src/screens/Team/Teams.jsx
+++ b/awx/ui_next/src/screens/Team/Teams.jsx
@@ -4,7 +4,7 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
import { Config } from '../../contexts/Config';
-import Breadcrumbs from '../../components/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader';
import TeamList from './TeamList';
import TeamAdd from './TeamAdd';
import Team from './Team';
@@ -36,7 +36,7 @@ function Teams({ i18n }) {
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/Team/Teams.test.jsx b/awx/ui_next/src/screens/Team/Teams.test.jsx
index db73b4d7d4..181b814077 100644
--- a/awx/ui_next/src/screens/Team/Teams.test.jsx
+++ b/awx/ui_next/src/screens/Team/Teams.test.jsx
@@ -3,6 +3,9 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Teams from './Teams';
jest.mock('../../api');
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
describe('', () => {
test('initially renders succesfully', () => {
diff --git a/awx/ui_next/src/screens/Template/Templates.jsx b/awx/ui_next/src/screens/Template/Templates.jsx
index 167d458141..5f471baaa5 100644
--- a/awx/ui_next/src/screens/Template/Templates.jsx
+++ b/awx/ui_next/src/screens/Template/Templates.jsx
@@ -4,7 +4,7 @@ import { t } from '@lingui/macro';
import { Route, withRouter, Switch } from 'react-router-dom';
import { PageSection } from '@patternfly/react-core';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
import { TemplateList } from './TemplateList';
import Template from './Template';
import WorkflowJobTemplate from './WorkflowJobTemplate';
@@ -12,22 +12,24 @@ import JobTemplateAdd from './JobTemplateAdd';
import WorkflowJobTemplateAdd from './WorkflowJobTemplateAdd';
function Templates({ i18n }) {
- const initBreadcrumbs = useRef({
+ const initScreenHeader = useRef({
'/templates': i18n._(t`Templates`),
'/templates/job_template/add': i18n._(t`Create New Job Template`),
'/templates/workflow_job_template/add': i18n._(
t`Create New Workflow Template`
),
});
- const [breadcrumbConfig, setBreadcrumbs] = useState(initBreadcrumbs.current);
+ const [breadcrumbConfig, setScreenHeader] = useState(
+ initScreenHeader.current
+ );
const setBreadcrumbConfig = useCallback(
(template, schedule) => {
if (!template) return;
const templatePath = `/templates/${template.type}/${template.id}`;
const schedulesPath = `${templatePath}/schedules`;
const surveyPath = `${templatePath}/survey`;
- setBreadcrumbs({
- ...initBreadcrumbs.current,
+ setScreenHeader({
+ ...initScreenHeader.current,
[templatePath]: `${template.name}`,
[`${templatePath}/details`]: i18n._(t`Details`),
[`${templatePath}/edit`]: i18n._(t`Edit Details`),
@@ -49,7 +51,10 @@ function Templates({ i18n }) {
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/Template/Templates.test.jsx b/awx/ui_next/src/screens/Template/Templates.test.jsx
index f39643053d..1b126cda31 100644
--- a/awx/ui_next/src/screens/Template/Templates.test.jsx
+++ b/awx/ui_next/src/screens/Template/Templates.test.jsx
@@ -3,6 +3,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Templates from './Templates';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
let pageWrapper;
diff --git a/awx/ui_next/src/screens/User/Users.jsx b/awx/ui_next/src/screens/User/Users.jsx
index 35e4c4517b..323e8e37a4 100644
--- a/awx/ui_next/src/screens/User/Users.jsx
+++ b/awx/ui_next/src/screens/User/Users.jsx
@@ -3,7 +3,7 @@ import { Route, useRouteMatch, Switch } from 'react-router-dom';
import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
import { Config } from '../../contexts/Config';
import UsersList from './UserList/UserList';
@@ -46,7 +46,7 @@ function Users({ i18n }) {
);
return (
-
+
diff --git a/awx/ui_next/src/screens/User/Users.test.jsx b/awx/ui_next/src/screens/User/Users.test.jsx
index 7193234f8f..862934e99b 100644
--- a/awx/ui_next/src/screens/User/Users.test.jsx
+++ b/awx/ui_next/src/screens/User/Users.test.jsx
@@ -5,6 +5,10 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Users from './Users';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
test('initially renders successfully', () => {
mountWithContexts();
@@ -27,7 +31,7 @@ describe('', () => {
},
},
});
- expect(wrapper.find('BreadcrumbHeading').length).toBe(1);
+ expect(wrapper.find('Title').length).toBe(1);
wrapper.unmount();
});
});
diff --git a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.jsx b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.jsx
index a8d66ccdba..84654810fa 100644
--- a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.jsx
+++ b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.jsx
@@ -4,7 +4,7 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
import WorkflowApprovalList from './WorkflowApprovalList';
import WorkflowApproval from './WorkflowApproval';
-import Breadcrumbs from '../../components/Breadcrumbs/Breadcrumbs';
+import ScreenHeader from '../../components/ScreenHeader/ScreenHeader';
function WorkflowApprovals({ i18n }) {
const match = useRouteMatch();
@@ -26,7 +26,10 @@ function WorkflowApprovals({ i18n }) {
return (
<>
-
+
diff --git a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.test.jsx b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.test.jsx
index b5bfdcf2a0..45aaffa7bf 100644
--- a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.test.jsx
+++ b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.test.jsx
@@ -3,6 +3,10 @@ import { createMemoryHistory } from 'history';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import WorkflowApprovals from './WorkflowApprovals';
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+}));
+
describe('', () => {
test('initially renders succesfully', () => {
mountWithContexts();
@@ -29,7 +33,8 @@ describe('', () => {
},
},
});
- expect(wrapper.find('BreadcrumbHeading').length).toBe(1);
+
+ expect(wrapper.find('Title').length).toBe(1);
wrapper.unmount();
});
});