|
@@ -1,6 +1,6 @@
|
|
|
import React from "react";
|
|
|
import { ReactZoomPanPinchRef, TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";
|
|
|
-import { Canvas, Edge, ElkRoot } from "reaflow";
|
|
|
+import { Canvas, Edge, ElkRoot, getParentsForNodeId } from "reaflow";
|
|
|
import { CustomNode } from "src/components/CustomNode";
|
|
|
import useGraph from "src/store/useGraph";
|
|
|
import useUser from "src/store/useUser";
|
|
@@ -11,8 +11,7 @@ import { PremiumView } from "./PremiumView";
|
|
|
|
|
|
interface GraphProps {
|
|
|
isWidget?: boolean;
|
|
|
- openModal: () => void;
|
|
|
- setSelectedNode: (node: [string, string][]) => void;
|
|
|
+ openNodeModal: () => void;
|
|
|
}
|
|
|
|
|
|
const StyledEditorWrapper = styled.div<{ widget: boolean }>`
|
|
@@ -48,11 +47,12 @@ const StyledEditorWrapper = styled.div<{ widget: boolean }>`
|
|
|
}
|
|
|
`;
|
|
|
|
|
|
-const GraphComponent = ({ isWidget = false, openModal, setSelectedNode }: GraphProps) => {
|
|
|
+const GraphComponent = ({ isWidget = false, openNodeModal }: GraphProps) => {
|
|
|
const isPremium = useUser(state => state.isPremium);
|
|
|
const setLoading = useGraph(state => state.setLoading);
|
|
|
const setZoomPanPinch = useGraph(state => state.setZoomPanPinch);
|
|
|
const centerView = useGraph(state => state.centerView);
|
|
|
+ const setSelectedNode = useGraph(state => state.setSelectedNode);
|
|
|
|
|
|
const loading = useGraph(state => state.loading);
|
|
|
const direction = useGraph(state => state.direction);
|
|
@@ -65,11 +65,57 @@ const GraphComponent = ({ isWidget = false, openModal, setSelectedNode }: GraphP
|
|
|
});
|
|
|
|
|
|
const handleNodeClick = React.useCallback(
|
|
|
- (e: React.MouseEvent<SVGElement>, data: NodeData) => {
|
|
|
- if (setSelectedNode) setSelectedNode(data.text);
|
|
|
- if (openModal) openModal();
|
|
|
+ (_: React.MouseEvent<SVGElement>, data: NodeData) => {
|
|
|
+ let resolvedPath = "";
|
|
|
+ const parentIds = getParentsForNodeId(nodes, edges, data.id).map(n => n.id);
|
|
|
+ const path = parentIds.reverse().concat(data.id);
|
|
|
+ const rootArrayElementIds = ["1"];
|
|
|
+ const edgesMap = new Map();
|
|
|
+
|
|
|
+ for (const edge of edges) {
|
|
|
+ if (!edgesMap.has(edge.from!)) {
|
|
|
+ edgesMap.set(edge.from!, []);
|
|
|
+ }
|
|
|
+ edgesMap.get(edge.from!).push(edge.to);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (let i = 1; i < edges.length; i++) {
|
|
|
+ const curNodeId = edges[i].from!;
|
|
|
+ if (rootArrayElementIds.includes(curNodeId)) continue;
|
|
|
+ if (!edgesMap.has(curNodeId)) {
|
|
|
+ rootArrayElementIds.push(curNodeId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rootArrayElementIds.length > 1) {
|
|
|
+ resolvedPath += `Root[${rootArrayElementIds.findIndex(id => id === path[0])}]`;
|
|
|
+ } else {
|
|
|
+ resolvedPath += "{Root}";
|
|
|
+ }
|
|
|
+
|
|
|
+ for (let i = 1; i < path.length; i++) {
|
|
|
+ const curId = path[i];
|
|
|
+ const curNode = nodes[+curId - 1];
|
|
|
+
|
|
|
+ if (!curNode) break;
|
|
|
+ if (curNode.data.parent === "array") {
|
|
|
+ resolvedPath += `.${curNode.text}`;
|
|
|
+ if (i !== path.length - 1) {
|
|
|
+ const toNodeId = path[i + 1];
|
|
|
+ const idx = edgesMap.get(curId).indexOf(toNodeId);
|
|
|
+ resolvedPath += `[${idx}]`;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (curNode.data.parent === "object") {
|
|
|
+ resolvedPath += `.${curNode.text}`;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (setSelectedNode) setSelectedNode({ node: data.text, path: resolvedPath });
|
|
|
+ if (openNodeModal) openNodeModal();
|
|
|
},
|
|
|
- [openModal, setSelectedNode]
|
|
|
+ [edges, nodes, openNodeModal, setSelectedNode]
|
|
|
);
|
|
|
|
|
|
const onInit = React.useCallback(
|