Skip to content

Commit 39c487e

Browse files
hover on edges detected and display the label
1 parent 233706e commit 39c487e

3 files changed

Lines changed: 25 additions & 4 deletions

File tree

packages/app-builder/src/components/Graph/CustomerGraphContext.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ export type CustomerGraphContextValue = {
104104
hoveredNodeId: string | null;
105105
setHoveredNodeId: (id: string | null) => void;
106106

107+
hoveredEdgeId: string | null;
108+
setHoveredEdgeId: (id: string | null) => void;
109+
107110
// Manually hidden nodes (node ids). Orphans cascade out via the reachability sweep.
108111
hiddenNodeIds: Set<string>;
109112
hideNodes: (ids: string[]) => void;
@@ -196,6 +199,7 @@ export function CustomerGraphProvider({
196199
const [selectionMode, setSelectionMode] = useState(false);
197200
const [checkedNodeIds, setCheckedNodeIds] = useState<Set<string>>(() => new Set());
198201
const [hoveredNodeId, setHoveredNodeId] = useState<string | null>(null);
202+
const [hoveredEdgeId, setHoveredEdgeId] = useState<string | null>(null);
199203
const [hiddenNodeIds, setHiddenNodeIds] = useState<Set<string>>(() => new Set());
200204
const [expandedRootIds, setExpandedRootIds] = useState<Set<string>>(() => new Set());
201205
const [addedNodeTagIds, setAddedNodeTagIds] = useState<Map<string, string[]>>(() => new Map());
@@ -309,6 +313,8 @@ export function CustomerGraphProvider({
309313
clearCheckedNodes,
310314
hoveredNodeId,
311315
setHoveredNodeId,
316+
hoveredEdgeId,
317+
setHoveredEdgeId,
312318
hiddenNodeIds,
313319
hideNodes,
314320
restoreHiddenNodes,
@@ -348,6 +354,7 @@ export function CustomerGraphProvider({
348354
isNodeChecked,
349355
clearCheckedNodes,
350356
hoveredNodeId,
357+
hoveredEdgeId,
351358
hiddenNodeIds,
352359
hideNodes,
353360
restoreHiddenNodes,

packages/app-builder/src/components/Graph/GraphComponents.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ function GraphEdge({
418418
label,
419419
data,
420420
}: EdgeProps<GraphRfEdge>) {
421-
const { showEdgeLabels } = useCustomerGraph();
421+
const { showEdgeLabels, hoveredEdgeId } = useCustomerGraph();
422422
const highlighted = useEdgeHighlighted(source, target);
423423
const appearance = EDGE_APPEARANCE[type ?? 'link'];
424424

@@ -436,7 +436,7 @@ function GraphEdge({
436436
// structural rather than a label.
437437
const mergedCount = data?.mergedCount;
438438
const isMerged = mergedCount != null;
439-
const labelContent = isMerged ? mergedCount : showEdgeLabels ? label : null;
439+
const labelContent = isMerged ? mergedCount : showEdgeLabels || hoveredEdgeId === id ? label : null;
440440

441441
return (
442442
<>

packages/app-builder/src/components/Graph/GraphImpl.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { AutoLayoutControlButton } from '@app-builder/components/ReactFlow';
22
import { useTheme } from '@app-builder/contexts/ThemeContext';
33
import { type DataModel } from '@app-builder/models/data-model';
44
import { type GraphData } from '@app-builder/models/graph';
5-
import { ControlButton, Controls, type NodeMouseHandler, ReactFlow } from '@xyflow/react';
5+
import { ControlButton, Controls, EdgeMouseHandler, type NodeMouseHandler, ReactFlow } from '@xyflow/react';
66
import { useCallback, useEffect, useMemo } from 'react';
77
import { useTranslation } from 'react-i18next';
88
import { Icon } from 'ui-icons';
99
import { useCustomerGraph } from './CustomerGraphContext';
1010
import { graphEdgeTypes, graphNodeTypes } from './GraphComponents';
1111
import { graphI18n } from './graph-i18n';
1212
import { type GraphObjectRef, nodeKey, parseNodeKey } from './graph-keys';
13-
import { type GraphRfNode } from './graph-rf-types';
13+
import { GraphRfEdge, type GraphRfNode } from './graph-rf-types';
1414
import {
1515
applyVisibilityFilters,
1616
GraphMeasuredLayout,
@@ -40,6 +40,7 @@ export function GraphImpl({ data, dataModel }: GraphImplProps) {
4040
setSelectedObject,
4141
selectionMode,
4242
setHoveredNodeId,
43+
setHoveredEdgeId,
4344
hiddenNodeIds,
4445
checkedNodeIds,
4546
setGraphStats,
@@ -158,6 +159,17 @@ export function GraphImpl({ data, dataModel }: GraphImplProps) {
158159
setHoveredNodeId(null);
159160
}, [setHoveredNodeId]);
160161

162+
const onEdgeMouseEnter = useCallback<EdgeMouseHandler<GraphRfEdge>>(
163+
(_event, edge) => {
164+
setHoveredEdgeId(edge.id);
165+
},
166+
[setHoveredEdgeId],
167+
);
168+
169+
const onEdgeMouseLeave = useCallback<EdgeMouseHandler<GraphRfEdge>>(() => {
170+
setHoveredEdgeId(null);
171+
}, [setHoveredEdgeId]);
172+
161173
return (
162174
<ReactFlow
163175
className="h-full min-h-0"
@@ -170,6 +182,8 @@ export function GraphImpl({ data, dataModel }: GraphImplProps) {
170182
onNodeClick={onNodeClick}
171183
onNodeMouseEnter={onNodeMouseEnter}
172184
onNodeMouseLeave={onNodeMouseLeave}
185+
onEdgeMouseEnter={onEdgeMouseEnter}
186+
onEdgeMouseLeave={onEdgeMouseLeave}
173187
fitView
174188
fitViewOptions={graphFitViewOptions}
175189
maxZoom={5}

0 commit comments

Comments
 (0)