@@ -28,6 +28,46 @@ interface WorkflowNodesTabsProps {
28
28
triggerComponentDefinitions : Array < ComponentDefinitionBasic > ;
29
29
}
30
30
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
+
31
71
const WorkflowNodesTabs = ( {
32
72
actionComponentDefinitions,
33
73
clusterElementComponentDefinitions,
@@ -123,6 +163,35 @@ const WorkflowNodesTabs = ({
123
163
setActiveView ,
124
164
] ) ;
125
165
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
+
126
195
return (
127
196
< Tabs className = "flex h-full flex-col" onValueChange = { setActiveTab } value = { activeTab } >
128
197
< div className = "px-2" >
@@ -167,110 +236,47 @@ const WorkflowNodesTabs = ({
167
236
) }
168
237
169
238
{ ! 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
+ />
192
247
) }
193
248
194
249
{ ! 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
+ />
217
258
) }
218
259
219
260
{ ! 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
+ />
249
269
) }
250
270
251
271
{ ! 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
+ />
274
280
) }
275
281
</ Tabs >
276
282
) ;
0 commit comments