diff --git a/frontend/packages/shared/components/layout/clientSDK/ClientSDKLayout.test.js b/frontend/packages/shared/components/layout/clientSDK/ClientSDKLayout.test.js deleted file mode 100644 index 67b3fb0518..0000000000 --- a/frontend/packages/shared/components/layout/clientSDK/ClientSDKLayout.test.js +++ /dev/null @@ -1,34 +0,0 @@ -import { buildComponentInApp } from 'testUtils'; -import ClientSDKLayout from 'shared/components/layout/clientSDK/ClientSDKLayout'; - -describe('', () => { - it('Renders a progress bar while loading', async () => { - const { getByTestId } = buildComponentInApp(ClientSDKLayout) - .withProps({ id: 'test' }) - .withApolloLoading() - .render(); - expect(getByTestId('progress')).toBeInTheDocument(); - }); - - it('Renders client sdk layout', async () => { - const rendered = buildComponentInApp(ClientSDKLayout) - .withTheme() - .withProps({ id: 'test' }) - .withRouterEntries(['/client-sdks/test']) - .withApolloData({ - clientSdk: { - id: 'test', - componentType: 'client-sdk', - owner: { - id: 'test-squad', - name: 'test-squad', - type: 'squad', - }, - }, - }) - .render(); - - rendered.getByText('Client SDK'); - rendered.getByText('test-squad'); - }); -}); diff --git a/frontend/packages/shared/components/layout/clientSDK/ClientSDKLayout.tsx b/frontend/packages/shared/components/layout/clientSDK/ClientSDKLayout.tsx deleted file mode 100644 index 7747247687..0000000000 --- a/frontend/packages/shared/components/layout/clientSDK/ClientSDKLayout.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import gql from 'graphql-tag'; - -import { Content, Header, OwnerHeaderLabel, Page } from 'shared/components/layout'; -import { theme } from 'core/app/PageThemeProvider'; -import QueryLayout, { ComponentLayoutProps } from 'shared/components/layout/QueryLayout'; -import ClientSDKNavigation from './ClientSDKNavigation'; - -export default function ClientSDKLayout({ - id, - fragment, - children, - emptyHelperText, - ...otherProps -}: ComponentLayoutProps) { - const query = gql` - query($id: String!) { - clientSdk(id: $id) { - id - componentType - owner { - id - name - type - } - ${fragment ? `...${fragment.definitions[0].name.value}` : ''} - } - } - ${fragment || ''} - `; - - const emptyHelperTextWithDefault = emptyHelperText || `We couldn't find a client sdk named '${id}'`; - return ( - - {data => { - const clientSdk = data.clientSdk; - - return ( - -
- -
- - {typeof children === 'function' ? children(clientSdk) : children} -
- ); - }} -
- ); -} - -const defaultProps: Partial = { - handleEmptyCheck: data => !data.clientSdk, - emptyTitleText: 'Client SDK not found', - emptyLink: '/explore/client-sdks', - emptyLinkText: 'All Client SDKs', -}; - -ClientSDKLayout.defaultProps = defaultProps; diff --git a/frontend/packages/shared/components/layout/clientSDK/ClientSDKNavigation.js b/frontend/packages/shared/components/layout/clientSDK/ClientSDKNavigation.js deleted file mode 100644 index e185560e07..0000000000 --- a/frontend/packages/shared/components/layout/clientSDK/ClientSDKNavigation.js +++ /dev/null @@ -1,18 +0,0 @@ -import React, { Component } from 'react'; - -import { Navigation, NavItem } from 'shared/components/layout'; - -class ClientSDKNavigation extends Component { - render() { - const { id } = this.props; - const clientSDKUrl = `/client-sdks/${id}`; - - return ( - - - - ); - } -} - -export default ClientSDKNavigation; diff --git a/frontend/packages/shared/components/layout/clientSDK/ClientSDKNavigation.test.js b/frontend/packages/shared/components/layout/clientSDK/ClientSDKNavigation.test.js deleted file mode 100644 index f12b4fbaa5..0000000000 --- a/frontend/packages/shared/components/layout/clientSDK/ClientSDKNavigation.test.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import ClientSDKNavigation from 'shared/components/layout/clientSDK/ClientSDKNavigation'; -import { wrapInThemedTestApp } from 'testUtils'; - -describe('', () => { - it('renders without exploding', () => { - const rendered = render(wrapInThemedTestApp()); - expect(rendered.getByText('Overview')).toBeInTheDocument(); - }); - - it('renders nav items', () => { - const rendered = render(wrapInThemedTestApp()); - expect(rendered.getByText('Overview')).toBeInTheDocument(); - }); - - it('renders links', () => { - const rendered = render(wrapInThemedTestApp()); - const anchor = rendered.container.querySelector('a'); - expect(anchor.href).toContain('client-sdks/test'); - }); -}); diff --git a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointContentHeader.js b/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointContentHeader.js deleted file mode 100644 index 13207c2802..0000000000 --- a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointContentHeader.js +++ /dev/null @@ -1,34 +0,0 @@ -import React, { Component } from 'react'; -import { ContentHeader, Documentation, SupportButton } from 'shared/components/layout'; -import Link from 'shared/components/Link'; -import Button from '@material-ui/core/Button/Button'; -import { Typography } from '@material-ui/core'; - -class DataEndpointContentHeader extends Component { - render() { - return ( - - - - - - - - - All data endpoints that you and your squad(s) own - - Data Infra Overview - Data Endpoints - Batch Management Documentation - - - - ); - } -} - -export default DataEndpointContentHeader; diff --git a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointContentHeader.test.js b/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointContentHeader.test.js deleted file mode 100644 index 97f86f976b..0000000000 --- a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointContentHeader.test.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import { wrapInThemedTestApp } from 'testUtils'; -import DataEndpointContentHeader from './DataEndpointContentHeader'; - -describe('', () => { - it('renders without exploding', () => { - const data = { - id: 'my-id', - componentType: 'data-endpoint', - componentInfoLocationUri: 'ghe:/a/b/c.yaml', - owner: { - name: 'my-owner', - type: 'squad', - }, - lifecycle: 'my-lifecycle', - }; - const rendered = render(wrapInThemedTestApp()); - rendered.getByText('Data Endpoints'); - rendered.getByText('Create new data endpoints component'); - rendered.getByText('Support'); - }); -}); diff --git a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointLayout.js b/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointLayout.js deleted file mode 100644 index 0f0746c57e..0000000000 --- a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointLayout.js +++ /dev/null @@ -1,68 +0,0 @@ -import React, { Component } from 'react'; -import gql from 'graphql-tag'; -import { theme } from 'core/app/PageThemeProvider'; -import { Content, Header, Page, QueryLayout } from 'shared/components/layout'; -import DataEndpointNavigation from './DataEndpointNavigation'; -import HeaderLabel from 'shared/components/layout/HeaderLabel'; -import OwnerHeaderLabel from 'shared/components/layout/OwnerHeaderLabel'; -import ComponentWorkflowsEndpointsToolbar from 'shared/components/ComponentWorkflowsEndpointsToolbar'; - -export default class DataEndpointLayout extends Component { - static defaultProps = { - handleEmptyCheck: data => !data.dataEndpoint, - emptyTitleText: 'Data endpoint not found', - emptyLink: '/data', - emptyLinkText: 'Your data endpoints', - }; - - render() { - const { id, fragment, children, ...otherProps } = this.props; - - const query = gql` - query($id: String!) { - dataEndpoint(id: $id) { - id - owner { - id - name - contactEmail - type - slack - } - storageUriPattern - lifecycle - component { - id - owner { - id - name - } - ...ComponentWorkflowsEndpointsDropdownInfo - } - ${fragment ? `...${fragment.definitions[0].name.value}` : ''} - } - } - ${ComponentWorkflowsEndpointsToolbar.fragment} - ${fragment || ''} - `; - - const emptyHelperTextWithDefault = `We couldn't find a data endpoint named '${id}'`; - return ( - - {data => { - const dataendpoint = data.dataEndpoint; - return ( - -
- - -
- - {typeof children === 'function' ? children(dataendpoint) : children} -
- ); - }} -
- ); - } -} diff --git a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointLayout.test.js b/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointLayout.test.js deleted file mode 100644 index bba8b69121..0000000000 --- a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointLayout.test.js +++ /dev/null @@ -1,56 +0,0 @@ -import { buildComponentInApp } from 'testUtils'; -import DataEndpointLayout from './DataEndpointLayout'; -import gql from 'graphql-tag'; - -const dataEndpoint = { - id: 'my-id', - componentType: 'data-endpoint', - componentInfoLocationUri: 'ghe:/a/b/c.yaml', - storageUriPattern: 'bq://a/b/c', - owner: { - name: 'my-owner', - type: 'squad', - }, - lifecycle: 'lifecycle', -}; - -describe('', () => { - it('renders progress while loading', () => { - const rendered = buildComponentInApp(DataEndpointLayout) - .withApolloLoading() - .render({ id: 'my-id', system: 'system' }); - rendered.getByTestId('progress'); - }); - - it('renders data', () => { - const rendered = buildComponentInApp(DataEndpointLayout) - .withTheme() - .withApolloData({ dataEndpoint }) - .render({ id: 'my-id', system: 'system' }); - rendered.getByText('my-id'); - rendered.getByText('Overview'); - }); - - it('renders with fragment', () => { - let receivedData = null; - const rendered = buildComponentInApp(DataEndpointLayout) - .withTheme() - .withApolloData({ dataEndpoint }) - .render({ - id: 'my-id', - system: 'system', - fragment: gql` - fragment MoreData on Component { - id - } - `, - children: data => { - receivedData = data; - }, - }); - - expect(receivedData).toEqual(expect.objectContaining({ id: 'my-id' })); - rendered.getByText('my-id'); - rendered.getByText('Overview'); - }); -}); diff --git a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointNavigation.js b/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointNavigation.js deleted file mode 100644 index 64e93df1c0..0000000000 --- a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointNavigation.js +++ /dev/null @@ -1,26 +0,0 @@ -import React, { Component } from 'react'; -import { Navigation, NavItem } from 'shared/components/layout'; - -class DataEndpointNavigation extends Component { - render() { - const { id, uri } = this.props; - const dataEndpointBaseUrl = `/data-endpoints/${id}`; - - return ( - - - - - - - - - - {uri.startsWith('bq://') && } - - - ); - } -} - -export default DataEndpointNavigation; diff --git a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointNavigation.test.js b/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointNavigation.test.js deleted file mode 100644 index 07689a13a5..0000000000 --- a/frontend/packages/shared/components/layout/dataEndpoint/DataEndpointNavigation.test.js +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import { wrapInThemedTestApp } from 'testUtils'; -import DataEndpointNavigation from './DataEndpointNavigation'; - -describe('', () => { - it('renders without exploding', () => { - const rendered = render(wrapInThemedTestApp()); - rendered.getByText('Overview'); - expect(rendered.queryByText('BigQuery Stats')).not.toBeInTheDocument(); - }); - - it('renders bigquery link', () => { - const rendered = render(wrapInThemedTestApp()); - rendered.getByText('BigQuery Stats'); - }); -}); diff --git a/frontend/packages/shared/components/layout/explore/ExploreLayout.js b/frontend/packages/shared/components/layout/explore/ExploreLayout.js deleted file mode 100644 index 32b25a0b23..0000000000 --- a/frontend/packages/shared/components/layout/explore/ExploreLayout.js +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; - -import DataSciIcon from '@material-ui/icons/Timeline'; -import { AppIcon, PlatformIcon, ToolsIcon, SdkIcon } from 'shared/icons'; -import { Content, Header, Navigation, NavItem, Page } from 'shared/components/layout'; -import { theme } from 'core/app/PageThemeProvider'; - -const iconStyle = { fill: '#727272' }; - -export default class ExploreLayout extends React.Component { - render() { - const { children } = this.props; - return ( - -
- - } href="/explore" /> - } href="/explore/infra" /> - } href="/explore/client-sdks" /> - } href="/apps" isBeta /> - } href="/explore/tools" /> - } href="/data-science-tools" /> - - {children} - - ); - } -} diff --git a/frontend/packages/shared/components/layout/explore/ExploreLayout.test.js b/frontend/packages/shared/components/layout/explore/ExploreLayout.test.js deleted file mode 100644 index 555c79674b..0000000000 --- a/frontend/packages/shared/components/layout/explore/ExploreLayout.test.js +++ /dev/null @@ -1,12 +0,0 @@ -import { buildComponentInApp } from 'testUtils'; -import ExploreLayout from './ExploreLayout'; - -describe('', () => { - it('renders without exploding', () => { - const rendered = buildComponentInApp(ExploreLayout) - .withTheme() - .render({ children: 'my-child' }); - rendered.getByText('Explore the Spotify ecosystem'); - rendered.getByText('my-child'); - }); -}); diff --git a/frontend/packages/shared/components/layout/manage/ManageLayout.test.js b/frontend/packages/shared/components/layout/manage/ManageLayout.test.js deleted file mode 100644 index 89128fd144..0000000000 --- a/frontend/packages/shared/components/layout/manage/ManageLayout.test.js +++ /dev/null @@ -1,20 +0,0 @@ -import { buildComponentInApp } from 'testUtils'; -import ManageLayout from './ManageLayout'; - -const user = { - components: [], - workflows: [], - dataEndpoints: [], - googleCloudPlatformProjects: [], -}; - -describe('', () => { - it('renders without exploding', () => { - const rendered = buildComponentInApp(ManageLayout) - .withTheme() - .withApolloData({ user }) - .render(); - - rendered.getByText('Overview'); - }); -}); diff --git a/frontend/packages/shared/components/layout/manage/ManageLayout.tsx b/frontend/packages/shared/components/layout/manage/ManageLayout.tsx deleted file mode 100644 index d32e2fe68f..0000000000 --- a/frontend/packages/shared/components/layout/manage/ManageLayout.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React, { FC } from 'react'; -import { theme } from 'core/app/PageThemeProvider'; -import { useUser, useProfile } from 'shared/apis/user'; -import { Content, Header, Page } from 'shared/components/layout'; -import { getTimeBasedGreeting } from 'shared/apis/time/timeUtil'; -import HomePageTimer from 'plugins/homePage/components/HomePageTimer'; -import HomeDrawer from 'plugins/homePage/components/HomeDrawer'; -import { useThankYouMessage } from './hooks'; - -import ManageNavigation from './ManageNavigation'; - -const ManageLayout: FC<{}> = ({ children }) => { - const user = useUser(); - const profile = useProfile(); - const thankYouMessage = useThankYouMessage(user.id); - const greeting = getTimeBasedGreeting(); - - return ( - -
- -
- - {children} - -
- ); -}; - -export default ManageLayout; diff --git a/frontend/packages/shared/components/layout/manage/ManageNavigation.test.js b/frontend/packages/shared/components/layout/manage/ManageNavigation.test.js deleted file mode 100644 index 9fbfe1b7e2..0000000000 --- a/frontend/packages/shared/components/layout/manage/ManageNavigation.test.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import { wrapInThemedTestApp } from 'testUtils'; -import FeatureFlags from 'shared/apis/featureFlags/featureFlags'; -import ManageNavigation from './ManageNavigation'; - -describe('', () => { - it('renders without exploding', () => { - const rendered = render(wrapInThemedTestApp()); - rendered.getByText('Overview'); - expect(rendered.queryByText('Streaming Pipelines')).not.toBeInTheDocument(); - }); - - it('renders bigquery link', () => { - const mock = jest.spyOn(FeatureFlags, 'getItem').mockImplementation(flag => flag === 'galileo'); - const rendered = render(wrapInThemedTestApp()); - rendered.getByText('Streaming Pipelines'); - mock.mockRestore(); - }); -}); diff --git a/frontend/packages/shared/components/layout/manage/ManageNavigation.tsx b/frontend/packages/shared/components/layout/manage/ManageNavigation.tsx deleted file mode 100644 index f7606c9620..0000000000 --- a/frontend/packages/shared/components/layout/manage/ManageNavigation.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React, { FC } from 'react'; - -import { Navigation, NavItem } from 'shared/components/layout'; - -import StreamingIcon from 'shared/assets/icons/stream.svg'; -import { - AppFeatureIcon, - DataEndpointsIcon, - GcpProjectIcon, - LibraryIcon, - OtherIcon, - OverviewIcon, - ServiceIcon, - StorageIcon, - WebsiteIcon, - WorkflowIcon, -} from 'shared/icons'; -import FeatureFlags from 'shared/apis/featureFlags/featureFlags'; - -const style = { fill: '#727272' }; - -const ManageNavigation: FC<{}> = () => ( - - } href="/manage"> - - - } href={'/services-owned'} /> - } href={'/websites-owned'} /> - } href={'/libraries-owned'} isBeta /> - {FeatureFlags.getItem('foss') && ( - } href={'/foss-owned'} isAlpha /> - )} - } href={'/workflows-owned'} /> - } href={'/data'} /> - {FeatureFlags.getItem('galileo') && ( - - )} - } href={'/app-features-owned'} /> - } href={'/projects-owned'} /> - } href={'/managed-storage-owned'} /> - } href={'/other-owned'} /> - -); - -export default ManageNavigation; diff --git a/frontend/packages/shared/components/layout/manage/hooks.ts b/frontend/packages/shared/components/layout/manage/hooks.ts deleted file mode 100644 index 45d151f7c8..0000000000 --- a/frontend/packages/shared/components/layout/manage/hooks.ts +++ /dev/null @@ -1,72 +0,0 @@ -import gql from 'graphql-tag'; -import { useQuery } from '@apollo/react-hooks'; - -import { User, QueryUserArgs, Maybe } from 'generated/graphql/backstage'; - -export const THANK_YOU_MESSAGE_QUERY = gql` - query($username: String!) { - user(username: $username) { - components { - id - } - dataEndpoints { - id - } - workflows { - id - } - googleCloudPlatformProjects { - id - } - } - } -`; - -type QueryResponse = { - user?: Maybe; -}; - -const LOADING_MESSAGE = 'Thanks for ...'; -const FALLBACK_MESSAGE = 'Thanks for being awesome'; - -/** - * Formulates a personal "thank you" message based on a user's ownership of things. - * - * @param username An LDAP username - */ -export const useThankYouMessage = (username: string) => { - const { data, loading } = useQuery(THANK_YOU_MESSAGE_QUERY, { - variables: { username }, - }); - - if (loading) { - return LOADING_MESSAGE; - } else if (!data || !data.user) { - return FALLBACK_MESSAGE; - } - - const componentCount = - (data.user.components || []).length + (data.user.workflows || []).length + (data.user.dataEndpoints || []).length; - const projectCount = (data.user.googleCloudPlatformProjects || []).length; - - if (componentCount == 0 && projectCount == 0) { - return FALLBACK_MESSAGE; - } - - let counts = ''; - if (componentCount > 0) { - counts += `${componentCount} component`; - if (componentCount > 1) { - counts += 's'; - } - counts += projectCount > 0 ? ' and ' : ''; - } - if (projectCount > 0) { - counts += `${projectCount} project`; - if (projectCount > 1) { - counts += 's'; - } - } - - return `Thanks for taking care of ${counts}`; -}; diff --git a/frontend/packages/shared/components/layout/project/ProjectLayout.js b/frontend/packages/shared/components/layout/project/ProjectLayout.js deleted file mode 100644 index a559e28012..0000000000 --- a/frontend/packages/shared/components/layout/project/ProjectLayout.js +++ /dev/null @@ -1,56 +0,0 @@ -import React, { Component } from 'react'; -import gql from 'graphql-tag'; - -import { Content, Header, HeaderLabel, Page, QueryLayout } from 'shared/components/layout'; -import ProjectNavigation from 'shared/components/layout/project/ProjectNavigation'; -import { theme } from 'core/app/PageThemeProvider'; - -export default class ProjectLayout extends Component { - static defaultProps = { - handleEmptyCheck: data => !data.googleCloudPlatformProject, - emptyTitleText: 'Project not found', - emptyLink: '/projects-owned', - emptyLinkText: 'Your projects', - }; - - render() { - const { id, fragment, emptyHelperText, children, ...otherProps } = this.props; - - const query = gql` - query($id: String!) { - googleCloudPlatformProject(id: $id) { - id - owner { - id - name - } - ${fragment ? `...${fragment.definitions[0].name.value}` : ''} - } - } - ${fragment || ''} - `; - - const emptyHelperTextWithDefault = emptyHelperText || `We couldn't find a project named '${id}'`; - return ( - - {data => { - const project = data.googleCloudPlatformProject; - - return ( - -
- -
- - {typeof children === 'function' ? children(project) : children} -
- ); - }} -
- ); - } -} diff --git a/frontend/packages/shared/components/layout/project/ProjectLayout.test.js b/frontend/packages/shared/components/layout/project/ProjectLayout.test.js deleted file mode 100644 index 68b3d79bdf..0000000000 --- a/frontend/packages/shared/components/layout/project/ProjectLayout.test.js +++ /dev/null @@ -1,45 +0,0 @@ -import { buildComponentInApp } from 'testUtils'; -import ProjectLayout from './ProjectLayout'; -import gql from 'graphql-tag'; - -describe('', () => { - it('renders progress while loading', () => { - const rendered = buildComponentInApp(ProjectLayout) - .withApolloLoading() - .render({ id: 'my-project' }); - - rendered.getByTestId('progress'); - }); - - it('renders data', () => { - const rendered = buildComponentInApp(ProjectLayout) - .withTheme() - .withApolloData({ googleCloudPlatformProject: { id: 'my-project' } }) - .render({ id: 'my-project' }); - - rendered.getByText('my-project'); - rendered.getByText('Overview'); - rendered.getByText('Bigtable'); - }); - - it('renders with fragment', () => { - let receivedData = null; - const rendered = buildComponentInApp(ProjectLayout) - .withTheme() - .withApolloData({ googleCloudPlatformProject: { id: 'my-project' } }) - .render({ - id: 'my-project', - fragment: gql` - fragment MoreData on Component { - id - } - `, - children: data => { - receivedData = data; - }, - }); - - expect(receivedData).toEqual({ id: 'my-project' }); - rendered.getByText('Bigtable'); - }); -}); diff --git a/frontend/packages/shared/components/layout/project/ProjectNavigation.js b/frontend/packages/shared/components/layout/project/ProjectNavigation.js deleted file mode 100644 index f977ae16d0..0000000000 --- a/frontend/packages/shared/components/layout/project/ProjectNavigation.js +++ /dev/null @@ -1,19 +0,0 @@ -import React, { Component } from 'react'; - -import { Navigation, NavItem } from 'shared/components/layout'; - -class ProjectNavigation extends Component { - render() { - const { projectId } = this.props; - const projectBaseUrl = `/projects/${projectId}`; - - return ( - - - - - ); - } -} - -export default ProjectNavigation; diff --git a/frontend/packages/shared/components/layout/workflow/WorkflowLayout.js b/frontend/packages/shared/components/layout/workflow/WorkflowLayout.js deleted file mode 100644 index 59320bdd5f..0000000000 --- a/frontend/packages/shared/components/layout/workflow/WorkflowLayout.js +++ /dev/null @@ -1,70 +0,0 @@ -import React, { Component } from 'react'; -import gql from 'graphql-tag'; - -import { Content, Header, HeaderLabel, OwnerHeaderLabel, Page, QueryLayout } from 'shared/components/layout'; -import WorkflowNavigation from 'shared/components/layout/workflow/WorkflowNavigation'; -import { theme } from 'core/app/PageThemeProvider'; -import MissingComponent from 'plugins/workflows/components/MissingComponent'; -import ComponentWorkflowsEndpointsToolbar from 'shared/components/ComponentWorkflowsEndpointsToolbar'; - -export default class WorkflowLayout extends Component { - static defaultProps = { - handleEmptyCheck: data => !data.workflow, - emptyTitleText: 'Workflow not found', - emptyLink: '/workflows-owned', - emptyLinkText: 'Your workflows', - }; - - render() { - const { id, fragment, emptyHelperText, children, ...otherProps } = this.props; - - const query = gql` - query($id: String!) { - workflow(id: $id) { - id - component { - id - lifecycle - owner { - id - name - type - } - ...ComponentWorkflowsEndpointsDropdownInfo - } - ${fragment ? `...${fragment.definitions[0].name.value}` : ''} - } - } - ${ComponentWorkflowsEndpointsToolbar.fragment} - ${fragment || ''} - `; - - const emptyHelperTextWithDefault = emptyHelperText || `We couldn't find a workflow named '${id}'`; - return ( - - {data => { - const workflow = data.workflow; - if (!workflow.component) { - return ; - } - const { component } = workflow; - return ( - -
- - - -
- - {typeof children === 'function' ? children(workflow) : children} -
- ); - }} -
- ); - } -} diff --git a/frontend/packages/shared/components/layout/workflow/WorkflowLayout.test.js b/frontend/packages/shared/components/layout/workflow/WorkflowLayout.test.js deleted file mode 100644 index 15ae6a146a..0000000000 --- a/frontend/packages/shared/components/layout/workflow/WorkflowLayout.test.js +++ /dev/null @@ -1,69 +0,0 @@ -import { buildComponentInApp } from 'testUtils'; -import WorkflowLayout from './WorkflowLayout'; -import gql from 'graphql-tag'; -import FeatureFlags from 'shared/apis/featureFlags/featureFlags'; - -const workflow = { - id: 'my-workflow', - component: { - id: 'my-component', - owner: { name: 'me' }, - }, - componentType: 'workflow', - componentInfoLocationUri: 'ghe://a/b/c', -}; - -describe('', () => { - it('renders progress while loading', () => { - const rendered = buildComponentInApp(WorkflowLayout) - .withApolloLoading() - .render({ id: 'my-workflow' }); - - rendered.getByTestId('progress'); - }); - - it('renders data', () => { - const mock = jest.spyOn(FeatureFlags, 'getItem').mockImplementation(flag => flag === 'workflow-alerts'); - const rendered = buildComponentInApp(WorkflowLayout) - .withTheme() - .withApolloData({ workflow }) - .render({ id: 'my-workflow' }); - - rendered.getByText('my-workflow'); - rendered.getByText('Backfills'); - rendered.getByText('Dependencies'); - rendered.getByText('Alerting'); - mock.mockRestore(); - }); - - it('renders with fragment', () => { - let receivedData = null; - const rendered = buildComponentInApp(WorkflowLayout) - .withTheme() - .withApolloData({ - workflow: { - ...workflow, - factsJson: JSON.stringify({ - service_tier: 1, - }), - }, - }) - .render({ - id: 'my-workflow', - fragment: gql` - fragment MoreData on Component { - id - } - `, - children: data => { - receivedData = data; - }, - }); - - expect(receivedData).toEqual(expect.objectContaining({ id: 'my-workflow' })); - rendered.getByText('my-workflow'); - rendered.getByText('Backfills'); - rendered.getByText('Dependencies'); - expect(rendered.queryByText('Alerting')).toBeNull(); - }); -}); diff --git a/frontend/packages/shared/components/layout/workflow/WorkflowNavigation.js b/frontend/packages/shared/components/layout/workflow/WorkflowNavigation.js deleted file mode 100644 index b52f0a9a22..0000000000 --- a/frontend/packages/shared/components/layout/workflow/WorkflowNavigation.js +++ /dev/null @@ -1,23 +0,0 @@ -import React, { Component } from 'react'; - -import { Navigation, NavItem } from 'shared/components/layout'; -import FeatureFlags from 'shared/apis/featureFlags/featureFlags'; - -class WorkflowNavigation extends Component { - render() { - const { workflowId } = this.props; - const workflowBaseUrl = `/workflows/${workflowId}`; - - return ( - - - - - - {FeatureFlags.getItem('workflow-alerts') && } - - ); - } -} - -export default WorkflowNavigation; diff --git a/frontend/packages/shared/validators/ValidatorSysmodelComponent.js b/frontend/packages/shared/validators/ValidatorSysmodelComponent.js deleted file mode 100644 index 864905682d..0000000000 --- a/frontend/packages/shared/validators/ValidatorSysmodelComponent.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ValidatorBase } from 'shared/components/form/validators'; -import SysmodelClient from 'shared/apis/sysmodel/SysmodelClient'; - -export default class ValidatorSysmodelComponent extends ValidatorBase { - validate(value /* , element */) { - return new Promise(result => { - if (!/^[a-z][a-z0-9-]{2,253}[a-z0-9]$/i.test(value)) { - return result( - 'Must be 4 to 255 lowercase letters, digits, or hyphens. It must start with a letter. Trailing hyphens are prohibited.', - ); - } - - SysmodelClient.getComponent(value) - .then((/* response */) => { - result(`The component '${value}' already exists`); - }) - .catch(error => { - if (error.response.status === 404) { - return result(true); - } - result(`Error response (${error.response.status}) from sysmodel preventing validation`); - }); - }); - } -} diff --git a/frontend/packages/shared/validators/ValidatorSysmodelComponent.test.js b/frontend/packages/shared/validators/ValidatorSysmodelComponent.test.js deleted file mode 100644 index 2bfa2d8c92..0000000000 --- a/frontend/packages/shared/validators/ValidatorSysmodelComponent.test.js +++ /dev/null @@ -1,39 +0,0 @@ -import ValidatorSysmodelComponent from './ValidatorSysmodelComponent'; -import SysmodelClient from 'shared/apis/sysmodel/SysmodelClient'; - -describe('ValidatorSysmodelComponent', () => { - it('instantiates without error', () => { - expect(() => { - let validator = new ValidatorSysmodelComponent(); - expect(validator).toBeDefined(); - }).not.toThrow(); - }); - - describe('has a working validate() method', () => { - it('has sane defaults', async () => { - const result = await new ValidatorSysmodelComponent().validate(''); - expect(result).toContain('Must be 4 to 255 lowercase'); - }); - - it('Treats 200 as failure because component already exists', async () => { - const sysmodelResponse = { response: { status: 200 } }; - jest.spyOn(SysmodelClient, 'getComponent').mockImplementation(() => Promise.resolve(sysmodelResponse)); - const result = await new ValidatorSysmodelComponent().validate('uniq-component-name'); - expect(result).toContain("'uniq-component-name' already exists"); - }); - - it('Treats 404 as successful', async () => { - const sysmodelResponse = { response: { status: 404 } }; - jest.spyOn(SysmodelClient, 'getComponent').mockImplementation(() => Promise.reject(sysmodelResponse)); - const result = await new ValidatorSysmodelComponent().validate('uniq-component-name'); - expect(result).toBeTruthy(); - }); - - it('Catches 500 errors', async () => { - const sysmodelResponse = { response: { status: 500 } }; - jest.spyOn(SysmodelClient, 'getComponent').mockImplementation(() => Promise.reject(sysmodelResponse)); - const result = await new ValidatorSysmodelComponent().validate('uniq-component-name'); - expect(result).toContain('Error response (500) from sysmodel preventing validation'); - }); - }); -});