Skip to content

Commit 448469d

Browse files
Consolidate Workflow Page Tabs, Content and Error configs into single file (#944)
- Create combined config for Workflow Page Tabs, Content, and Error, to make it easier to update and add extra tabs behind feature flags - Memoize the tab list in Domain Page Tabs as well
1 parent 67defa0 commit 448469d

14 files changed

+158
-132
lines changed

src/views/domain-page/domain-page-tabs/domain-page-tabs.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
'use client';
2-
import React from 'react';
2+
import React, { useMemo } from 'react';
33

44
import { useRouter, useParams } from 'next/navigation';
55

@@ -17,17 +17,21 @@ export default function DomainPageTabs() {
1717
const params = useParams<DomainPageTabsParams>();
1818
const decodedParams = decodeUrlParams(params) as DomainPageTabsParams;
1919

20+
const tabList = useMemo(
21+
() =>
22+
Object.entries(domainPageTabsConfig).map(([key, tabConfig]) => ({
23+
key,
24+
title: tabConfig.title,
25+
artwork: tabConfig.artwork,
26+
})),
27+
[]
28+
);
29+
2030
return (
2131
<styled.PageTabsContainer>
2232
<PageTabs
2333
selectedTab={decodedParams.domainTab}
24-
tabList={Object.entries(domainPageTabsConfig).map(
25-
([key, tabConfig]) => ({
26-
key,
27-
title: tabConfig.title,
28-
artwork: tabConfig.artwork,
29-
})
30-
)}
34+
tabList={tabList}
3135
setSelectedTab={(newTab) => {
3236
router.push(
3337
`${encodeURIComponent(newTab.toString())}${window.location.search}`
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { createElement } from 'react';
2+
3+
import type { WorkflowPageTabContentProps } from '../workflow-page-tab-content/workflow-page-tab-content.types';
4+
import { type WorkflowPageTabsConfig } from '../workflow-page-tabs/workflow-page-tabs.types';
5+
6+
export const mockWorkflowPageTabsConfig: WorkflowPageTabsConfig<
7+
'summary' | 'history' | 'queries' | 'stack-trace'
8+
> = {
9+
summary: {
10+
title: 'Summary',
11+
artwork: () => createElement('div', { 'data-testid': 'summary-artwork' }),
12+
content: ({ params }: WorkflowPageTabContentProps) =>
13+
createElement('div', {}, JSON.stringify(params)),
14+
getErrorConfig: () => ({ message: 'summary error' }),
15+
},
16+
history: {
17+
title: 'History',
18+
artwork: () => createElement('div', { 'data-testid': 'history-artwork' }),
19+
endEnhancer: () =>
20+
createElement('div', { 'data-testid': 'history-end-enhancer' }),
21+
content: ({ params }: WorkflowPageTabContentProps) =>
22+
createElement('div', {}, JSON.stringify(params)),
23+
getErrorConfig: () => ({ message: 'history error' }),
24+
},
25+
queries: {
26+
title: 'Queries',
27+
artwork: () => createElement('div', { 'data-testid': 'queries-artwork' }),
28+
content: ({ params }: WorkflowPageTabContentProps) =>
29+
createElement('div', {}, JSON.stringify(params)),
30+
getErrorConfig: () => ({ message: 'queries error' }),
31+
},
32+
'stack-trace': {
33+
title: 'Stack Trace',
34+
artwork: () =>
35+
createElement('div', { 'data-testid': 'stack-trace-artwork' }),
36+
content: ({ params }: WorkflowPageTabContentProps) =>
37+
createElement('div', {}, JSON.stringify(params)),
38+
getErrorConfig: () => ({ message: 'stack trace error' }),
39+
},
40+
} as const;

src/views/workflow-page/config/workflow-page-tabs-contents-map.config.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/views/workflow-page/config/workflow-page-tabs-error.config.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/views/workflow-page/config/workflow-page-tabs.config.ts

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,63 @@ import {
55
MdOutlineTerminal,
66
} from 'react-icons/md';
77

8+
import WorkflowHistory from '@/views/workflow-history/workflow-history';
9+
import WorkflowQueries from '@/views/workflow-queries/workflow-queries';
10+
import WorkflowStackTrace from '@/views/workflow-stack-trace/workflow-stack-trace';
11+
import WorkflowSummaryTab from '@/views/workflow-summary-tab/workflow-summary-tab';
12+
13+
import getWorkflowPageErrorConfig from '../helpers/get-workflow-page-error-config';
814
import WorkflowPagePendingEventsBadge from '../workflow-page-pending-events-badge/workflow-page-pending-events-badge';
9-
import type { WorkflowPageTabs } from '../workflow-page-tabs/workflow-page-tabs.types';
15+
import type { WorkflowPageTabsConfig } from '../workflow-page-tabs/workflow-page-tabs.types';
1016

11-
const workflowPageTabsConfig = [
12-
{
13-
key: 'summary',
17+
const workflowPageTabsConfig: WorkflowPageTabsConfig<
18+
'summary' | 'history' | 'queries' | 'stack-trace'
19+
> = {
20+
summary: {
1421
title: 'Summary',
1522
artwork: MdListAlt,
23+
content: WorkflowSummaryTab,
24+
getErrorConfig: (err) =>
25+
getWorkflowPageErrorConfig(
26+
err,
27+
'Failed to load workflow summary',
28+
'summary'
29+
),
1630
},
17-
{
18-
key: 'history',
31+
history: {
1932
title: 'History',
2033
endEnhancer: WorkflowPagePendingEventsBadge,
2134
artwork: MdOutlineHistory,
35+
content: WorkflowHistory,
36+
getErrorConfig: (err) =>
37+
getWorkflowPageErrorConfig(
38+
err,
39+
'Failed to load workflow history',
40+
'history'
41+
),
2242
},
23-
{
24-
key: 'queries',
43+
queries: {
2544
title: 'Queries',
2645
artwork: MdOutlineManageSearch,
46+
content: WorkflowQueries,
47+
getErrorConfig: (err) =>
48+
getWorkflowPageErrorConfig(
49+
err,
50+
'Failed to load workflow queries',
51+
'queries'
52+
),
2753
},
28-
{
29-
key: 'stack-trace',
54+
'stack-trace': {
3055
title: 'Stack Trace',
3156
artwork: MdOutlineTerminal,
57+
content: WorkflowStackTrace,
58+
getErrorConfig: (err) =>
59+
getWorkflowPageErrorConfig(
60+
err,
61+
'Failed to load workflow stack trace',
62+
'stack trace'
63+
),
3264
},
33-
] as const satisfies WorkflowPageTabs;
65+
} as const;
3466

3567
export default workflowPageTabsConfig;

src/views/workflow-page/workflow-page-tab-content/__tests__/workflow-page-tab-content.test.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import React from 'react';
22

33
import { render } from '@/test-utils/rtl';
44

5+
import { mockWorkflowPageTabsConfig } from '../../__fixtures__/workflow-page-tabs-config';
56
import WorkflowPageTabContent from '../workflow-page-tab-content';
67
import type { WorkflowPageTabContentProps } from '../workflow-page-tab-content.types';
78

8-
jest.mock('../../config/workflow-page-tabs-contents-map.config', () => ({
9-
summary: ({ params }: WorkflowPageTabContentProps) => (
10-
<div>{JSON.stringify(params)}</div>
11-
),
12-
}));
9+
jest.mock(
10+
'../../config/workflow-page-tabs.config',
11+
() => mockWorkflowPageTabsConfig
12+
);
1313

1414
const params: WorkflowPageTabContentProps['params'] = {
1515
cluster: 'example-cluster',
@@ -20,15 +20,15 @@ const params: WorkflowPageTabContentProps['params'] = {
2020
};
2121

2222
describe('WorkflowPageTabContent', () => {
23-
it('renders tab content with correct params when workflowTab exists in contentsMap', () => {
23+
it('renders tab content with correct params when workflowTab exists in config', () => {
2424
const { getByText } = render(<WorkflowPageTabContent params={params} />);
2525
expect(getByText(JSON.stringify(params))).toBeInTheDocument();
2626
});
2727

28-
it('does not return any tab cotent if workflowTab is not present in the contentsMap', () => {
29-
const paramsWithoutTabContent = { ...params, workflowTab: 'unkown-tab' };
28+
it('does not return any tab content if workflowTab is not present in the config', () => {
29+
const paramsWithoutTabContent = { ...params, workflowTab: 'unknown-tab' };
3030
const { container } = render(
31-
//@ts-expect-error allow passing unknown workflowtab to test recieving wrong value as a param
31+
// @ts-expect-error allow passing unknown workflowtab to test receiving wrong value as a param
3232
<WorkflowPageTabContent params={paramsWithoutTabContent} />
3333
);
3434
expect(container.firstChild?.textContent).toBe('');

src/views/workflow-page/workflow-page-tab-content/workflow-page-tab-content.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ import React from 'react';
33

44
import useStyletronClasses from '@/hooks/use-styletron-classes';
55

6-
import workflowPageTabsContentsMapConfig from '../config/workflow-page-tabs-contents-map.config';
6+
import workflowPageTabsConfig from '../config/workflow-page-tabs.config';
77

88
import { cssStyles } from './workflow-page-tab-content.styles';
99
import type { Props } from './workflow-page-tab-content.types';
1010

1111
export default function WorkflowPageTabContent({ params }: Props) {
1212
const { cls } = useStyletronClasses(cssStyles);
1313
const selectedWorkflowTabName = params.workflowTab;
14-
const TabContent = workflowPageTabsContentsMapConfig[selectedWorkflowTabName];
14+
const TabContent = workflowPageTabsConfig[selectedWorkflowTabName]?.content;
15+
1516
if (TabContent)
1617
return (
1718
<div className={cls.tabContentContainer}>

src/views/workflow-page/workflow-page-tab-content/workflow-page-tab-content.types.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import type workflowPageTabsConfig from '../config/workflow-page-tabs.config';
2-
import type { WorkflowPageTabsParams } from '../workflow-page-tabs/workflow-page-tabs.types';
1+
import type {
2+
WorkflowPageTabName,
3+
WorkflowPageTabsParams,
4+
} from '../workflow-page-tabs/workflow-page-tabs.types';
35

4-
export type WorkflowPageTabName =
5-
(typeof workflowPageTabsConfig)[number]['key'];
6-
7-
export type WorkflowPageTabsContentsMap = {
8-
[k in (typeof workflowPageTabsConfig)[number]['key']]:
9-
| React.ComponentType<WorkflowPageTabContentProps>
10-
| ((props: WorkflowPageTabContentProps) => React.ReactNode);
11-
};
6+
export type WorkflowPageTabContent =
7+
| React.ComponentType<WorkflowPageTabContentProps>
8+
| ((props: WorkflowPageTabContentProps) => React.ReactNode);
129

1310
export type WorkflowPageTabContentParams = {
1411
domain: string;

src/views/workflow-page/workflow-page-tabs-error/__tests__/workflow-page-tabs-error.test.tsx

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import * as navigationModule from 'next/navigation';
44

55
import { render, screen } from '@/test-utils/rtl';
66

7+
import { mockWorkflowPageTabsConfig } from '../../__fixtures__/workflow-page-tabs-config';
78
import WorkflowPageTabsError from '../workflow-page-tabs-error';
8-
import type { WorkflowPageTabsErrorConfig } from '../workflow-page-tabs-error.types';
99

1010
jest.mock('@/components/error-panel/error-panel', () =>
1111
jest.fn(({ message }: { message: string }) => <div>{message}</div>)
@@ -21,22 +21,8 @@ jest.mock('next/navigation', () => ({
2121
}));
2222

2323
jest.mock(
24-
'../../config/workflow-page-tabs-error.config',
25-
() =>
26-
({
27-
summary: () => ({
28-
message: 'summary error',
29-
}),
30-
history: () => ({
31-
message: 'history error',
32-
}),
33-
queries: () => ({
34-
message: 'queries error',
35-
}),
36-
'stack-trace': () => ({
37-
message: 'stack trace error',
38-
}),
39-
}) as const satisfies WorkflowPageTabsErrorConfig
24+
'../../config/workflow-page-tabs.config',
25+
() => mockWorkflowPageTabsConfig
4026
);
4127

4228
describe('WorkflowPageTabsError', () => {

src/views/workflow-page/workflow-page-tabs-error/workflow-page-tabs-error.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import { useParams } from 'next/navigation';
33
import ErrorPanel from '@/components/error-panel/error-panel';
44
import PanelSection from '@/components/panel-section/panel-section';
55

6-
import workflowPageTabsErrorConfig from '../config/workflow-page-tabs-error.config';
7-
import { type WorkflowPageTabName } from '../workflow-page-tab-content/workflow-page-tab-content.types';
6+
import workflowPageTabsConfig from '../config/workflow-page-tabs.config';
7+
import { type WorkflowPageTabName } from '../workflow-page-tabs/workflow-page-tabs.types';
88

99
import { type Props } from './workflow-page-tabs-error.types';
1010

1111
export default function WorkflowPageTabsError({ error, reset }: Props) {
1212
const { workflowTab } = useParams();
1313
const getConfig =
14-
workflowPageTabsErrorConfig[workflowTab as WorkflowPageTabName];
14+
workflowPageTabsConfig[workflowTab as WorkflowPageTabName]?.getErrorConfig;
1515

1616
if (typeof getConfig !== 'function') {
1717
return (

0 commit comments

Comments
 (0)