Skip to content

Commit 33ede30

Browse files
committed
fix copilot complaints
Signed-off-by: handreyrc <handrey.cunha@gmail.com>
1 parent 3f898d0 commit 33ede30

7 files changed

Lines changed: 80 additions & 27 deletions

File tree

packages/serverless-workflow-diagram-editor/src/react-flow/diagram/Diagram.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
React Flow renders .react-flow__edgelabel-renderer before NodeRenderer
2323
in the DOM, so without an explicit z-index it is painted behind nodes. */
2424
.dec-root .react-flow__edgelabel-renderer {
25-
z-index: 1000;
25+
z-index: var(--dec-zindex-edge-label-regular);
2626
}
2727

2828
.dec-root .diagram-background {

packages/serverless-workflow-diagram-editor/src/react-flow/diagram/Diagram.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { useDiagramEditorContext } from "../../store/DiagramEditorContext";
2525
import { buildDiagramElements } from "./diagramBuilder";
2626
import { applyAutoLayout } from "./autoLayout";
2727
import { SidePanelTrigger } from "@/side-panel/SidePanelTrigger";
28+
import { ZINDEX } from "../zIndexConstants";
2829

2930
const FIT_VIEW_OPTIONS: RF.FitViewOptions = {
3031
maxZoom: 1,
@@ -72,11 +73,11 @@ export const Diagram = ({ divRef, ref, colorMode = "light" }: DiagramProps) => {
7273
setEdges((edgesSnapshot) => {
7374
const updatedEdges = RF.applyEdgeChanges(changes, edgesSnapshot);
7475

75-
// Elevate selected edges above regular edges (z-index: 100)
76-
// but keep them below edge labels (z-index: 1000+)
76+
// Elevate selected edges above regular edges
77+
// but keep them below edge labels
7778
return updatedEdges.map((edge) => ({
7879
...edge,
79-
zIndex: edge.selected ? 100 : 0,
80+
zIndex: edge.selected ? ZINDEX.EDGE_SELECTED : ZINDEX.EDGE_REGULAR,
8081
}));
8182
});
8283
},
@@ -106,11 +107,11 @@ export const Diagram = ({ divRef, ref, colorMode = "light" }: DiagramProps) => {
106107
// Only update if this effect is still active (not cancelled by cleanup)
107108
if (isActive && !abortController?.signal.aborted) {
108109
setNodes(nodes);
109-
// Apply z-index to edges: selected edges (100) above regular edges (0)
110-
// but below edge labels (1000+)
110+
// Apply z-index to edges: selected edges above regular edges
111+
// but below edge labels
111112
const edgesWithZIndex = edges.map((edge) => ({
112113
...edge,
113-
zIndex: edge.selected ? 100 : 0,
114+
zIndex: edge.selected ? ZINDEX.EDGE_SELECTED : ZINDEX.EDGE_REGULAR,
114115
}));
115116
setEdges(edgesWithZIndex);
116117

packages/serverless-workflow-diagram-editor/src/react-flow/edges/Edges.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import * as RF from "@xyflow/react";
1818
import type { Point, WayPoints } from "../diagram/autoLayout";
19+
import { ZINDEX } from "../zIndexConstants";
1920

2021
export enum EdgeTypes {
2122
Default = "default",
@@ -138,7 +139,7 @@ export function EdgeLabel(props: EdgeLabelProps) {
138139
<div
139140
style={{
140141
transform: `translate(-50%, -50%) translate(${x}px,${y}px)`,
141-
zIndex: selected ? 1001 : 1000,
142+
zIndex: selected ? ZINDEX.EDGE_LABEL_SELECTED : ZINDEX.EDGE_LABEL_REGULAR,
142143
}}
143144
className={type ? `edge-label ${type}` : "edge-label"}
144145
>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2021-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
/**
18+
* Z-index layering constants for diagram edges and labels.
19+
*
20+
* Layering hierarchy (bottom to top):
21+
* 1. Regular edges (0)
22+
* 2. Selected edges (100)
23+
* 3. Edge labels - regular (1000)
24+
* 4. Edge labels - selected (1001)
25+
*
26+
* This ensures:
27+
* - Selected edges appear above regular edges
28+
* - All labels appear above all edges (preventing overlap)
29+
* - Selected edge labels appear above regular labels
30+
*/
31+
export const ZINDEX = {
32+
/** Regular (unselected) edges */
33+
EDGE_REGULAR: 0,
34+
35+
/** Selected edges - appear above regular edges but below all labels */
36+
EDGE_SELECTED: 100,
37+
38+
/** Regular (unselected) edge labels - appear above all edges */
39+
EDGE_LABEL_REGULAR: 1000,
40+
41+
/** Selected edge labels - appear above everything */
42+
EDGE_LABEL_SELECTED: 1001,
43+
} as const;

packages/serverless-workflow-diagram-editor/src/styles.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@
4545
.dec-root {
4646
@apply dec:h-full;
4747

48+
/* Z-index layering for edges and labels */
49+
--dec-zindex-edge-regular: 0;
50+
--dec-zindex-edge-selected: 100;
51+
--dec-zindex-edge-label-regular: 1000;
52+
--dec-zindex-edge-label-selected: 1001;
53+
4854
--dec-error-accent: #ef4444;
4955
--dec-error-glow: rgba(239, 68, 68, 0.35);
5056
--dec-edge-selected: #aea6a6;

packages/serverless-workflow-diagram-editor/tests/react-flow/diagram/Diagram.test.tsx

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { en } from "../../../src/i18n/locales/en";
2424
import { ReactFlowProvider, ReactFlow } from "@xyflow/react";
2525
import * as RF from "@xyflow/react";
2626
import * as autoLayoutModule from "../../../src/react-flow/diagram/autoLayout";
27+
import { ZINDEX } from "../../../src/react-flow/zIndexConstants";
2728

2829
// Mock ReactFlow to capture props
2930
vi.mock("@xyflow/react", async () => {
@@ -256,13 +257,13 @@ describe("Diagram Component", () => {
256257
await waitFor(() => {
257258
const edges = vi.mocked(ReactFlow).mock.calls.at(-1)![0].edges!;
258259

259-
// Selected edge should have zIndex: 100 (above regular edges, below labels at 1000+)
260-
expect(edges.find((e: RF.Edge) => e.id === "edge1")?.zIndex).toBe(100);
261-
expect(edges.find((e: RF.Edge) => e.id === "edge2")?.zIndex).toBe(100);
260+
// Selected edges should have elevated z-index (above regular edges, below labels)
261+
expect(edges.find((e: RF.Edge) => e.id === "edge1")?.zIndex).toBe(ZINDEX.EDGE_SELECTED);
262+
expect(edges.find((e: RF.Edge) => e.id === "edge2")?.zIndex).toBe(ZINDEX.EDGE_SELECTED);
262263
});
263264
});
264265

265-
it("should maintain z-index hierarchy: regular edges (0) < selected edges (100) < labels (1000+)", async () => {
266+
it("should maintain z-index hierarchy: regular < selected edges < labels", async () => {
266267
applyAutoLayoutSpy.mockResolvedValueOnce({
267268
nodes: [],
268269
edges: [
@@ -282,13 +283,13 @@ describe("Diagram Component", () => {
282283
const selectedEdge = edges.find((e: RF.Edge) => e.id === "edge1");
283284
const regularEdge = edges.find((e: RF.Edge) => e.id === "edge2");
284285

285-
expect(selectedEdge?.zIndex).toBe(100);
286-
expect(regularEdge?.zIndex).toBe(0);
286+
expect(selectedEdge?.zIndex).toBe(ZINDEX.EDGE_SELECTED);
287+
expect(regularEdge?.zIndex).toBe(ZINDEX.EDGE_REGULAR);
287288

288-
// Hierarchy in the test
289-
// Regular edges: 0
290-
// Selected edges: 100
291-
// Edge labels: 1000+ (tested in Edges.test.tsx)
289+
// Hierarchy uses centralized constants
290+
// Regular edges: ZINDEX.EDGE_REGULAR
291+
// Selected edges: ZINDEX.EDGE_SELECTED
292+
// Edge labels: ZINDEX.EDGE_LABEL_REGULAR/SELECTED (tested in Edges.test.tsx)
292293
});
293294
});
294295
});

packages/serverless-workflow-diagram-editor/tests/react-flow/edges/Edges.test.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
createPathFromWayPoints,
2828
getWayPointsMidpoint,
2929
} from "../../../src/react-flow/edges/Edges";
30+
import { ZINDEX } from "../../../src/react-flow/zIndexConstants";
3031
import * as RF from "@xyflow/react";
3132

3233
describe("React Flow custom edge types", () => {
@@ -503,18 +504,18 @@ describe("EdgeLabel z-index behavior", () => {
503504
it.each([
504505
{
505506
selected: false,
506-
expectedZIndex: 1000,
507-
description: "applies z-index 1000 when selected=false",
507+
expectedZIndex: ZINDEX.EDGE_LABEL_REGULAR,
508+
description: "applies regular label z-index when selected=false",
508509
},
509510
{
510511
selected: true,
511-
expectedZIndex: 1001,
512-
description: "applies z-index 1001 when selected=true",
512+
expectedZIndex: ZINDEX.EDGE_LABEL_SELECTED,
513+
description: "applies selected label z-index when selected=true",
513514
},
514515
{
515516
selected: undefined,
516-
expectedZIndex: 1000,
517-
description: "applies default z-index 1000 when selected=undefined",
517+
expectedZIndex: ZINDEX.EDGE_LABEL_REGULAR,
518+
description: "applies default regular label z-index when selected=undefined",
518519
},
519520
])("$description", ({ selected, expectedZIndex }) => {
520521
const result = EdgeLabel({
@@ -530,7 +531,7 @@ describe("EdgeLabel z-index behavior", () => {
530531
expect(resultString).toContain(`"zIndex":${expectedZIndex}`);
531532
});
532533

533-
it("applies default z-index 1000 when selected prop is not provided", () => {
534+
it("applies default regular label z-index when selected prop is not provided", () => {
534535
const result = EdgeLabel({
535536
sourceX: 0,
536537
sourceY: 0,
@@ -540,7 +541,7 @@ describe("EdgeLabel z-index behavior", () => {
540541
});
541542

542543
const resultString = JSON.stringify(result);
543-
expect(resultString).toContain('"zIndex":1000');
544+
expect(resultString).toContain(`"zIndex":${ZINDEX.EDGE_LABEL_REGULAR}`);
544545
});
545546

546547
describe("integration with edge components", () => {
@@ -552,7 +553,7 @@ describe("EdgeLabel z-index behavior", () => {
552553
{ component: ErrorEdge, edgeType: "error", edgeClass: "error", selected: false },
553554
{ component: ConditionEdge, edgeType: "condition", edgeClass: "condition", selected: false },
554555
])(
555-
"$edgeType edge passes selected=$selected to EdgeLabel",
556+
"$edgeType edge applies selected class when selected=$selected",
556557
({ component: Component, edgeClass, selected }) => {
557558
const { container } = render(
558559
<RF.ReactFlowProvider>

0 commit comments

Comments
 (0)