Skip to content

Commit 9899943

Browse files
committed
2227 - Refactor/Code cleanup WorkflowNodesTabs to reduce duplication
1 parent 1b61844 commit 9899943

File tree

1 file changed

+101
-95
lines changed

1 file changed

+101
-95
lines changed

client/src/pages/platform/workflow-editor/components/WorkflowNodesTabs.tsx

Lines changed: 101 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,46 @@ interface WorkflowNodesTabsProps {
2828
triggerComponentDefinitions: Array<ComponentDefinitionBasic>;
2929
}
3030

31+
interface WorkflowNodesTabContentProps {
32+
emptyMessage: string;
33+
items: Array<ComponentDefinitionBasic | DefinitionType> | undefined;
34+
itemsDraggable: boolean;
35+
onItemClick?: (clickedItem: ClickedDefinitionType) => void;
36+
selectedComponentName?: string;
37+
tabValue: string;
38+
}
39+
40+
const WorkflowNodesTabContent = ({
41+
emptyMessage,
42+
items,
43+
itemsDraggable,
44+
onItemClick,
45+
selectedComponentName,
46+
tabValue,
47+
}: WorkflowNodesTabContentProps) => {
48+
return (
49+
<ScrollArea className="overflow-y-auto px-3">
50+
<TabsContent className="mt-0 w-full flex-1" value={tabValue}>
51+
<ul className="space-y-2" role="list">
52+
{(!items || items.length === 0) && (
53+
<span className="block px-3 py-2 text-xs text-content-neutral-secondary">{emptyMessage}</span>
54+
)}
55+
56+
{items?.map((item) => (
57+
<WorkflowNodesTabsItem
58+
draggable={itemsDraggable}
59+
handleClick={() => onItemClick && onItemClick(item as ClickedDefinitionType)}
60+
key={item.name}
61+
node={item as DefinitionType}
62+
selected={tabValue === 'components' ? selectedComponentName === item.name : undefined}
63+
/>
64+
))}
65+
</ul>
66+
</TabsContent>
67+
</ScrollArea>
68+
);
69+
};
70+
3171
const WorkflowNodesTabs = ({
3272
actionComponentDefinitions,
3373
clusterElementComponentDefinitions,
@@ -123,6 +163,35 @@ const WorkflowNodesTabs = ({
123163
setActiveView,
124164
]);
125165

166+
const tabContentConfigs = useMemo(
167+
() => ({
168+
clusterElements: {
169+
emptyMessage: 'No cluster element components found.',
170+
items: availableClusterElements,
171+
},
172+
components: {
173+
emptyMessage:
174+
filterState.activeView === 'all' ? 'No action components found.' : 'No filtered components found.',
175+
items: filteredComponents,
176+
},
177+
taskDispatchers: {
178+
emptyMessage: 'No flow controls found.',
179+
items: availableTaskDispatchers,
180+
},
181+
triggers: {
182+
emptyMessage: 'No trigger components found.',
183+
items: availableTriggers,
184+
},
185+
}),
186+
[
187+
availableTriggers,
188+
filteredComponents,
189+
availableTaskDispatchers,
190+
availableClusterElements,
191+
filterState.activeView,
192+
]
193+
);
194+
126195
return (
127196
<Tabs className="flex h-full flex-col" onValueChange={setActiveTab} value={activeTab}>
128197
<div className="px-2">
@@ -167,110 +236,47 @@ const WorkflowNodesTabs = ({
167236
)}
168237

169238
{!hideClusterElementComponents && (
170-
<ScrollArea className="overflow-y-auto px-3">
171-
<TabsContent className="mt-0 w-full flex-1" value="clusterElements">
172-
<ul className="space-y-2" role="list">
173-
{!clusterElementComponentDefinitions?.length && (
174-
<span className="block px-3 py-2 text-xs text-content-neutral-secondary">
175-
No cluster element components found.
176-
</span>
177-
)}
178-
179-
{availableClusterElements?.map((clusterElementDefinition, index) => (
180-
<WorkflowNodesTabsItem
181-
draggable={itemsDraggable}
182-
handleClick={() =>
183-
onItemClick && onItemClick(clusterElementDefinition as ClickedDefinitionType)
184-
}
185-
key={index}
186-
node={clusterElementDefinition}
187-
/>
188-
))}
189-
</ul>
190-
</TabsContent>
191-
</ScrollArea>
239+
<WorkflowNodesTabContent
240+
emptyMessage={tabContentConfigs.clusterElements.emptyMessage}
241+
items={tabContentConfigs.clusterElements.items}
242+
itemsDraggable={itemsDraggable}
243+
onItemClick={onItemClick}
244+
selectedComponentName={selectedComponentName}
245+
tabValue="clusterElements"
246+
/>
192247
)}
193248

194249
{!hideTriggerComponents && (
195-
<ScrollArea className="overflow-y-auto px-3">
196-
<TabsContent className="mt-0 w-full flex-1" value="triggers">
197-
<ul className="space-y-2" role="list">
198-
{!triggerComponentDefinitions.length && (
199-
<span className="block px-3 py-2 text-xs text-content-neutral-secondary">
200-
No trigger components found.
201-
</span>
202-
)}
203-
204-
{availableTriggers.map((triggerDefinition) => (
205-
<WorkflowNodesTabsItem
206-
draggable={itemsDraggable}
207-
handleClick={() =>
208-
onItemClick && onItemClick(triggerDefinition as ClickedDefinitionType)
209-
}
210-
key={triggerDefinition.name}
211-
node={triggerDefinition as DefinitionType}
212-
/>
213-
))}
214-
</ul>
215-
</TabsContent>
216-
</ScrollArea>
250+
<WorkflowNodesTabContent
251+
emptyMessage={tabContentConfigs.triggers.emptyMessage}
252+
items={tabContentConfigs.triggers.items}
253+
itemsDraggable={itemsDraggable}
254+
onItemClick={onItemClick}
255+
selectedComponentName={selectedComponentName}
256+
tabValue="triggers"
257+
/>
217258
)}
218259

219260
{!hideActionComponents && (
220-
<ScrollArea className="overflow-y-auto px-3">
221-
<TabsContent className="mt-0 w-full flex-1" value="components">
222-
<ul className="space-y-2" role="list">
223-
{actionComponentDefinitions.length === 0 && filterState.activeView === 'all' && (
224-
<span className="block px-3 py-2 text-xs text-content-neutral-secondary">
225-
No action components found.
226-
</span>
227-
)}
228-
229-
{filteredComponents?.length === 0 && filterState.activeView === 'filtered' && (
230-
<span className="block px-3 py-2 text-xs text-content-neutral-secondary">
231-
No filtered components found.
232-
</span>
233-
)}
234-
235-
{filteredComponents?.map((componentDefinition) => (
236-
<WorkflowNodesTabsItem
237-
draggable={itemsDraggable}
238-
handleClick={() =>
239-
onItemClick && onItemClick(componentDefinition as ClickedDefinitionType)
240-
}
241-
key={componentDefinition.name}
242-
node={componentDefinition as DefinitionType}
243-
selected={selectedComponentName === componentDefinition.name}
244-
/>
245-
))}
246-
</ul>
247-
</TabsContent>
248-
</ScrollArea>
261+
<WorkflowNodesTabContent
262+
emptyMessage={tabContentConfigs.components.emptyMessage}
263+
items={tabContentConfigs.components.items}
264+
itemsDraggable={itemsDraggable}
265+
onItemClick={onItemClick}
266+
selectedComponentName={selectedComponentName}
267+
tabValue="components"
268+
/>
249269
)}
250270

251271
{!hideTaskDispatchers && (
252-
<ScrollArea className="overflow-y-auto px-3">
253-
<TabsContent className="mt-0 w-full flex-1" value="taskDispatchers">
254-
<ul className="space-y-2" role="list">
255-
{!taskDispatcherDefinitions.length && (
256-
<span className="block px-3 py-2 text-xs text-content-neutral-secondary">
257-
No flow controls found.
258-
</span>
259-
)}
260-
261-
{availableTaskDispatchers.map((taskDispatcherDefinition) => (
262-
<WorkflowNodesTabsItem
263-
draggable={itemsDraggable}
264-
handleClick={() =>
265-
onItemClick && onItemClick(taskDispatcherDefinition as ClickedDefinitionType)
266-
}
267-
key={taskDispatcherDefinition.name}
268-
node={taskDispatcherDefinition as DefinitionType}
269-
/>
270-
))}
271-
</ul>
272-
</TabsContent>
273-
</ScrollArea>
272+
<WorkflowNodesTabContent
273+
emptyMessage={tabContentConfigs.taskDispatchers.emptyMessage}
274+
items={tabContentConfigs.taskDispatchers.items}
275+
itemsDraggable={itemsDraggable}
276+
onItemClick={onItemClick}
277+
selectedComponentName={selectedComponentName}
278+
tabValue="taskDispatchers"
279+
/>
274280
)}
275281
</Tabs>
276282
);

0 commit comments

Comments
 (0)