Skip to content

Commit 89dd298

Browse files
shivamG640lordrip
authored andcommitted
add placeholder constants
1 parent 4b56126 commit 89dd298

16 files changed

Lines changed: 61 additions & 26 deletions

packages/ui/src/components/IconResolver/node-icon-resolver.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ import questionIcon from '../../assets/question-mark.svg';
241241
import { DynamicCatalogRegistry } from '../../dynamic-catalog';
242242
import { EntityType } from '../../models/camel/entities';
243243
import { CatalogKind } from '../../models/catalog-kind';
244+
import { PlaceholderType } from '../../models/placeholder.constants';
244245

245246
export class NodeIconResolver {
246247
static async getIcon(elementName: string | undefined, type: CatalogKind): Promise<string> {
@@ -1047,7 +1048,7 @@ export class NodeIconResolver {
10471048
return icon_eip_route;
10481049
case EntityType.OnException:
10491050
return icon_eip_throwException;
1050-
case 'placeholder':
1051+
case PlaceholderType.Placeholder:
10511052
return expandIcon;
10521053
default:
10531054
return undefined;

packages/ui/src/components/Visualization/Custom/Node/CustomNodeUtils.test.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { waitFor } from '@testing-library/react';
22

3+
import { PlaceholderType } from '../../../../models/placeholder.constants';
34
import { AddStepMode, IVisualizationNode } from '../../../../models/visualization/base-visual-entity';
45
import { IOnCopyAddon } from '../../../registers/interactions/node-interaction-addon.model';
56
import { NoBendpointsEdge } from '../NoBendingEdge';
@@ -114,7 +115,7 @@ describe('CustomNodeUtils', () => {
114115
it('should return true for compatible nodes in case of placeholder node', () => {
115116
const mockValidate = jest.fn().mockReturnValue(true);
116117
vizNode1.data.name = 'log';
117-
placeholderNode.data.name = 'placeholder';
118+
placeholderNode.data.name = PlaceholderType.Placeholder;
118119
const result = checkNodeDropCompatibility(vizNode1, placeholderNode, mockValidate);
119120
expect(result).toBe(true);
120121
expect(mockValidate).toHaveBeenCalled();
@@ -229,7 +230,11 @@ describe('CustomNodeUtils', () => {
229230
const choiceNode = getMockVizNode('route.from.steps.0.choice');
230231
(choiceNode.getId as jest.Mock).mockReturnValue('same-choice');
231232
const whenBranchPlaceholder = getMockVizNode('route.from.steps.0.choice.when.0.steps.0.placeholder');
232-
whenBranchPlaceholder.data = { ...whenBranchPlaceholder.data, name: 'placeholder', isPlaceholder: true };
233+
whenBranchPlaceholder.data = {
234+
...whenBranchPlaceholder.data,
235+
name: PlaceholderType.Placeholder,
236+
isPlaceholder: true,
237+
};
233238
whenBranchPlaceholder.getPreviousNode = jest.fn().mockReturnValue(undefined);
234239
whenBranchPlaceholder.getId = jest.fn().mockReturnValue('same-choice');
235240

packages/ui/src/components/Visualization/Custom/Node/CustomNodeUtils.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { isDefined } from '@kaoto/forms';
22
import { ElementModel, GraphElement, Node } from '@patternfly/react-topology';
33

4+
import { PlaceholderType } from '../../../../models/placeholder.constants';
45
import { AddStepMode, IVisualizationNode } from '../../../../models/visualization/base-visual-entity';
56
import { IClipboardCopyObject } from '../../../../models/visualization/clipboard';
67
import { EntitiesContextResult } from '../../../../providers/entities.provider';
@@ -73,7 +74,7 @@ export const handleValidNodeDrop = (
7374
// Drop onto special placeholder
7475
const isSpecialChildPlaceholder =
7576
droppedVizNode.data?.isPlaceholder &&
76-
droppedVizNode.data?.name !== 'placeholder' &&
77+
droppedVizNode.data?.name !== PlaceholderType.Placeholder &&
7778
droppedVizNode.getParentNode()?.getNodeInteraction().canHaveSpecialChildren;
7879
if (isSpecialChildPlaceholder) {
7980
const parentVizNode = droppedVizNode.getParentNode();
@@ -124,7 +125,10 @@ export const checkNodeDropCompatibility = (
124125
return !(draggedParent?.id === droppedParent?.id && draggedParent?.getId() === droppedParent?.getId());
125126
}
126127

127-
if (droppedVizNode.data.name === 'placeholder' && droppedVizNode.getPreviousNode() !== draggedVizNode) {
128+
if (
129+
droppedVizNode.data.name === PlaceholderType.Placeholder &&
130+
droppedVizNode.getPreviousNode() !== draggedVizNode
131+
) {
128132
if (
129133
droppedVizNode.data.path?.includes(draggedVizNode.data.path ?? '') &&
130134
droppedVizNode.getId() === draggedVizNode.getId()

packages/ui/src/components/Visualization/Custom/Node/PlaceholderNode.test.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { act, fireEvent, render, screen } from '@testing-library/react';
33
import React from 'react';
44

55
import { CatalogKind, createVisualizationNode, IVisualizationNode, IVisualizationNodeData } from '../../../../models';
6+
import { PlaceholderType } from '../../../../models/placeholder.constants';
67
import { TestProvidersWrapper } from '../../../../stubs';
78
import { ControllerService } from '../../Canvas/controller.service';
89
import { PlaceholderNode, PlaceholderNodeObserver } from './PlaceholderNode';
@@ -95,11 +96,11 @@ describe('PlaceholderNode', () => {
9596
it('should render placeholder container with data-testid when vizNode is provided', () => {
9697
const vizNode = createVisualizationNode('route.from.steps.1.placeholder', {
9798
catalogKind: CatalogKind.Processor,
98-
name: 'placeholder',
99+
name: PlaceholderType.Placeholder,
99100
path: 'route.from.steps.1.placeholder',
100101
isPlaceholder: true,
101102
}) as IVisualizationNode;
102-
jest.spyOn(vizNode, 'getNodeLabel').mockReturnValue('placeholder');
103+
jest.spyOn(vizNode, 'getNodeLabel').mockReturnValue(PlaceholderType.Placeholder);
103104
jest.spyOn(vizNode, 'getId').mockReturnValue('route-1234');
104105

105106
const parentElement = new BaseGraph();
@@ -158,15 +159,15 @@ describe('PlaceholderNode', () => {
158159
};
159160

160161
it('should render PlusCircleIcon for special child placeholder', () => {
161-
const wrapper = setupWithVizNode({ name: 'placeholder-special-child' });
162+
const wrapper = setupWithVizNode({ name: PlaceholderType.PlaceholderSpecialChild });
162163

163164
const svgIcon = wrapper.container.querySelector('svg');
164165
expect(svgIcon).toBeInTheDocument();
165166
expect(wrapper.asFragment()).toMatchSnapshot();
166167
});
167168

168169
it('should render PlusCircleIcon for regular placeholder', () => {
169-
const wrapper = setupWithVizNode({ name: 'placeholder' });
170+
const wrapper = setupWithVizNode({ name: PlaceholderType.Placeholder });
170171

171172
const svgIcon = wrapper.container.querySelector('svg');
172173
expect(svgIcon).toBeInTheDocument();
@@ -182,7 +183,7 @@ describe('PlaceholderNode', () => {
182183
});
183184

184185
it('should call onInsertStep when clicking on special child placeholder', () => {
185-
setupWithVizNode({ name: 'placeholder-special-child' });
186+
setupWithVizNode({ name: PlaceholderType.PlaceholderSpecialChild });
186187

187188
const placeholderNode = screen.getByTestId('placeholder-node__test-placeholder');
188189
fireEvent.click(placeholderNode);
@@ -192,7 +193,7 @@ describe('PlaceholderNode', () => {
192193
});
193194

194195
it('should call onReplaceNode when clicking on regular placeholder', () => {
195-
setupWithVizNode({ name: 'placeholder' });
196+
setupWithVizNode({ name: PlaceholderType.Placeholder });
196197

197198
const placeholderNode = screen.getByTestId('placeholder-node__test-placeholder');
198199
fireEvent.click(placeholderNode);

packages/ui/src/components/Visualization/Custom/Node/PlaceholderNode.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { FunctionComponent, useContext, useMemo, useRef } from 'react';
2626
import { CatalogModalContext } from '../../../../dynamic-catalog/catalog-modal.provider';
2727
import { useEntityContext } from '../../../../hooks/useEntityContext/useEntityContext';
2828
import { AddStepMode, CatalogKind, IVisualizationNode } from '../../../../models';
29+
import { PlaceholderType } from '../../../../models/placeholder.constants';
2930
import { SettingsContext } from '../../../../providers/settings.provider';
3031
import { CanvasDefaults } from '../../Canvas/canvas.defaults';
3132
import { CanvasNode } from '../../Canvas/canvas.models';
@@ -112,7 +113,7 @@ const PlaceholderNodeInner: FunctionComponent<PlaceholderNodeInnerProps> = obser
112113
const entitiesContext = useEntityContext();
113114
const catalogModalContext = useContext(CatalogModalContext);
114115
const label = vizNode?.getNodeLabel(settingsAdapter.getSettings().nodeLabel);
115-
const updatedLabel = label === 'placeholder' ? 'Add step' : `Add ${label}`;
116+
const updatedLabel = label === PlaceholderType.Placeholder ? 'Add step' : `Add ${label}`;
116117
const boxRef = useRef<Rect | null>(null);
117118
const boxXRef = useRef<number | null>(null);
118119
const boxYRef = useRef<number | null>(null);
@@ -125,8 +126,10 @@ const PlaceholderNodeInner: FunctionComponent<PlaceholderNodeInnerProps> = obser
125126
return null;
126127
}
127128
const { onReplaceNode } = useReplaceStep(vizNode);
128-
const isSpecialPlaceholder = vizNode.data.name !== 'placeholder' && vizNode.data.name !== 'placeholder-special-child';
129-
const isSpecialChildPlaceholder = vizNode.data.name === 'placeholder-special-child';
129+
const isSpecialPlaceholder =
130+
vizNode.data.name !== PlaceholderType.Placeholder && vizNode.data.name !== PlaceholderType.PlaceholderSpecialChild;
131+
const isSpecialChildPlaceholder = vizNode.data.name === PlaceholderType.PlaceholderSpecialChild;
132+
130133
const parentVizNode = vizNode.getParentNode();
131134
const insertStepTargetNode = isSpecialPlaceholder ? (parentVizNode ?? vizNode) : vizNode;
132135
const insertStepOptions = isSpecialPlaceholder
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* Fixed placeholder node names used in visualization (viz node data.name).
3+
* Dynamic placeholder names (e.g. 'when', 'otherwise', 'to') are derived from path
4+
* in base-node-mapper and are not listed here.
5+
*/
6+
export enum PlaceholderType {
7+
/** Generic "add step" placeholder in the flow */
8+
Placeholder = 'placeholder',
9+
/** Special empty-state placeholder (e.g. empty REST DSL) */
10+
PlaceholderSpecialChild = 'placeholder-special-child',
11+
}

packages/ui/src/models/visualization/flows/abstract-camel-visual-entity.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { getFirstCatalogMap } from '../../../stubs/test-load-catalog';
88
import { SourceSchemaType } from '../../camel';
99
import { NonStringEIP } from '../../camel/types';
1010
import { CatalogKind } from '../../catalog-kind';
11+
import { PlaceholderType } from '../../placeholder.constants';
1112
import { NodeLabelType } from '../../settings';
1213
import { AddStepMode } from '../base-visual-entity';
1314
import { CamelCatalogService } from './camel-catalog.service';
@@ -315,7 +316,7 @@ describe('AbstractCamelVisualEntity', () => {
315316
mode: AddStepMode.ReplaceStep,
316317
data: {
317318
catalogKind: CatalogKind.Processor,
318-
name: 'placeholder',
319+
name: PlaceholderType.Placeholder,
319320
isPlaceholder: true,
320321
path: 'route.from.steps.1.multicast.steps.0.placeholder',
321322
},

packages/ui/src/models/visualization/flows/abstract-camel-visual-entity.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { SourceSchemaType } from '../../camel/source-schema-type';
77
import { DefinedComponent } from '../../camel-catalog-index';
88
import { CatalogKind } from '../../catalog-kind';
99
import { KaotoSchemaDefinition } from '../../kaoto-schema';
10+
import { PlaceholderType } from '../../placeholder.constants';
1011
import { NodeLabelType } from '../../settings/settings.model';
1112
import {
1213
AddStepMode,
@@ -281,7 +282,7 @@ export abstract class AbstractCamelVisualEntity<T extends object> implements Bas
281282

282283
if (!this.getRootUri()) {
283284
fromNode.data.catalogKind = CatalogKind.Entity;
284-
fromNode.data.name = 'placeholder';
285+
fromNode.data.name = PlaceholderType.Placeholder;
285286
}
286287
routeGroupNode.addChild(fromNode);
287288

packages/ui/src/models/visualization/flows/camel-rest-visual-entity.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { EntityType } from '../../camel/entities';
77
import { DefinedComponent } from '../../camel-catalog-index';
88
import { CatalogKind } from '../../catalog-kind';
99
import { KaotoSchemaDefinition } from '../../kaoto-schema';
10+
import { PlaceholderType } from '../../placeholder.constants';
1011
import { REST_ELEMENT_NAME } from '../../special-processors.constants';
1112
import { AddStepMode } from '../base-visual-entity';
1213
import { AbstractCamelVisualEntity } from './abstract-camel-visual-entity';
@@ -358,7 +359,7 @@ describe('CamelRestVisualEntity', () => {
358359
mode: AddStepMode.ReplaceStep,
359360
data: {
360361
catalogKind: CatalogKind.Pattern,
361-
name: 'placeholder',
362+
name: PlaceholderType.Placeholder,
362363
path: 'rest.get.0.to.placeholder',
363364
isPlaceholder: true,
364365
},
@@ -376,7 +377,7 @@ describe('CamelRestVisualEntity', () => {
376377
entity.addStep({
377378
definedComponent: { type: CatalogKind.Component, name: 'direct' } as DefinedComponent,
378379
mode: AddStepMode.ReplaceStep,
379-
data: { catalogKind: CatalogKind.Pattern, name: 'placeholder', path: undefined },
380+
data: { catalogKind: CatalogKind.Pattern, name: PlaceholderType.Placeholder, path: undefined },
380381
});
381382

382383
// Should not throw and rest should remain unchanged

packages/ui/src/models/visualization/flows/nodes/mappers/base-node-mapper.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { DoCatch, ProcessorDefinition, When1 } from '@kaoto/camel-catalog/types'
22

33
import { getValue } from '../../../../../utils';
44
import { CatalogKind } from '../../../../catalog-kind';
5+
import { PlaceholderType } from '../../../../placeholder.constants';
56
import { SPECIAL_PROCESSORS_PARENTS_MAP } from '../../../../special-processors.constants';
67
import { IVisualizationNode } from '../../../base-visual-entity';
78
import { createVisualizationNode } from '../../../visualization-node';
@@ -101,7 +102,7 @@ export class BaseNodeMapper implements INodeMapper {
101102
const previousNode = branchVizNodes[branchVizNodes.length - 1];
102103
const placeholderNode = createVisualizationNode(placeholderPath, {
103104
catalogKind: CatalogKind.Entity,
104-
name: 'placeholder',
105+
name: PlaceholderType.Placeholder,
105106
isPlaceholder: true,
106107
path: placeholderPath,
107108
});

0 commit comments

Comments
 (0)