浏览代码

fix node path not working

AykutSarac 2 年之前
父节点
当前提交
3061ee05a7
共有 4 个文件被更改,包括 64 次插入50 次删除
  1. 7 1
      src/components/FileInput/index.tsx
  2. 4 48
      src/components/Graph/index.tsx
  3. 1 1
      src/store/useGraph.tsx
  4. 52 0
      src/utils/getNodePath.ts

+ 7 - 1
src/components/FileInput/index.tsx

@@ -53,7 +53,13 @@ export interface InputProps {
   onChange?: React.ChangeEventHandler<HTMLInputElement>;
   setExtension: (value: number) => void;
 }
-export const FileInput: React.FC<InputProps> = ({ setExtension, activeExtension, onChange, extensions, value }) => {
+export const FileInput: React.FC<InputProps> = ({
+  setExtension,
+  activeExtension,
+  onChange,
+  extensions,
+  value,
+}) => {
   return (
     <StyledInputWrapper>
       <StyledForm>

+ 4 - 48
src/components/Graph/index.tsx

@@ -1,9 +1,10 @@
 import React from "react";
 import { ReactZoomPanPinchRef, TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";
-import { Canvas, Edge, ElkRoot, getParentsForNodeId } from "reaflow";
+import { Canvas, Edge, ElkRoot } from "reaflow";
 import { CustomNode } from "src/components/CustomNode";
 import useGraph from "src/store/useGraph";
 import useUser from "src/store/useUser";
+import { getNodePath } from "src/utils/getNodePath";
 import styled from "styled-components";
 import { Loading } from "../Loading";
 import { ErrorView } from "./ErrorView";
@@ -66,53 +67,8 @@ const GraphComponent = ({ isWidget = false, openNodeModal }: GraphProps) => {
 
   const handleNodeClick = React.useCallback(
     (_: 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 (setSelectedNode)
+        setSelectedNode({ node: data.text, path: getNodePath(nodes, edges, data.id) });
       if (openNodeModal) openNodeModal();
     },
     [edges, nodes, openNodeModal, setSelectedNode]

+ 1 - 1
src/store/useGraph.tsx

@@ -38,7 +38,7 @@ interface GraphActions {
   zoomIn: () => void;
   zoomOut: () => void;
   centerView: () => void;
-  setSelectedNode: ({ node, path }: { node?: string | string[]; path?: string }) => void;
+  setSelectedNode: ({ node, path }: { node: string | string[]; path: string }) => void;
 }
 
 const useGraph = create<Graph & GraphActions>((set, get) => ({

+ 52 - 0
src/utils/getNodePath.ts

@@ -0,0 +1,52 @@
+export function getNodePath(nodes: NodeData[], edges: EdgeData[], nodeId: string) {
+  const { getParentsForNodeId } = require("reaflow");
+
+  let resolvedPath = "";
+  const parentIds = getParentsForNodeId(nodes, edges, nodeId).map(n => n.id);
+  const path = parentIds.reverse().concat(nodeId);
+  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.type === "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.type === "object") {
+      resolvedPath += `.${curNode.text}`;
+    }
+  }
+
+  return resolvedPath;
+}