|
@@ -5,6 +5,7 @@ import { getChildrenEdges } from "src/utils/getChildrenEdges";
|
|
|
import { getOutgoers } from "src/utils/getOutgoers";
|
|
|
import { parser } from "src/utils/jsonParser";
|
|
|
import create from "zustand";
|
|
|
+import useJson from "./useJson";
|
|
|
|
|
|
const initialStates = {
|
|
|
zoomPanPinch: undefined as ReactZoomPanPinchRef | undefined,
|
|
@@ -85,18 +86,12 @@ const useGraph = create<Graph & GraphActions>((set, get) => ({
|
|
|
const matchingNodesConnectedToParent = matchingNodes.filter(node =>
|
|
|
nodesConnectedToParent.includes(node)
|
|
|
);
|
|
|
- const nodeIds = childrenNodes
|
|
|
- .map(node => node.id)
|
|
|
- .concat(matchingNodesConnectedToParent);
|
|
|
+ const nodeIds = childrenNodes.map(node => node.id).concat(matchingNodesConnectedToParent);
|
|
|
const edgeIds = childrenEdges.map(edge => edge.id);
|
|
|
|
|
|
const collapsedParents = get().collapsedParents.filter(cp => cp !== nodeId);
|
|
|
- const collapsedNodes = get().collapsedNodes.filter(
|
|
|
- nodeId => !nodeIds.includes(nodeId)
|
|
|
- );
|
|
|
- const collapsedEdges = get().collapsedEdges.filter(
|
|
|
- edgeId => !edgeIds.includes(edgeId)
|
|
|
- );
|
|
|
+ const collapsedNodes = get().collapsedNodes.filter(nodeId => !nodeIds.includes(nodeId));
|
|
|
+ const collapsedEdges = get().collapsedEdges.filter(edgeId => !edgeIds.includes(edgeId));
|
|
|
|
|
|
set({
|
|
|
collapsedParents,
|
|
@@ -128,19 +123,19 @@ const useGraph = create<Graph & GraphActions>((set, get) => ({
|
|
|
.filter(edge => parentNodesIds.includes(edge.from))
|
|
|
.map(edge => edge.to);
|
|
|
|
|
|
+ const collapsedParents = get()
|
|
|
+ .nodes.filter(node => !parentNodesIds.includes(node.id) && node.data.parent)
|
|
|
+ .map(node => node.id);
|
|
|
+
|
|
|
+ const collapsedNodes = get()
|
|
|
+ .nodes.filter(
|
|
|
+ node => !parentNodesIds.includes(node.id) && !secondDegreeNodesIds.includes(node.id)
|
|
|
+ )
|
|
|
+ .map(node => node.id);
|
|
|
+
|
|
|
set({
|
|
|
- collapsedParents: get()
|
|
|
- .nodes.filter(
|
|
|
- node => !parentNodesIds.includes(node.id) && node.data.isParent
|
|
|
- )
|
|
|
- .map(node => node.id),
|
|
|
- collapsedNodes: get()
|
|
|
- .nodes.filter(
|
|
|
- node =>
|
|
|
- !parentNodesIds.includes(node.id) &&
|
|
|
- !secondDegreeNodesIds.includes(node.id)
|
|
|
- )
|
|
|
- .map(node => node.id),
|
|
|
+ collapsedParents,
|
|
|
+ collapsedNodes,
|
|
|
collapsedEdges: get()
|
|
|
.edges.filter(edge => !parentNodesIds.includes(edge.from))
|
|
|
.map(edge => edge.id),
|
|
@@ -181,7 +176,12 @@ const useGraph = create<Graph & GraphActions>((set, get) => ({
|
|
|
const canvas = document.querySelector(".jsoncrack-canvas") as HTMLElement;
|
|
|
if (zoomPanPinch && canvas) zoomPanPinch.zoomToElement(canvas);
|
|
|
},
|
|
|
- toggleFold: foldNodes => set({ foldNodes }),
|
|
|
+ toggleFold: foldNodes => {
|
|
|
+ const { json } = useJson.getState();
|
|
|
+ const { nodes, edges } = parser(json, foldNodes);
|
|
|
+
|
|
|
+ set({ nodes, edges, foldNodes });
|
|
|
+ },
|
|
|
togglePerfMode: performanceMode => set({ performanceMode }),
|
|
|
toggleFullscreen: fullscreen => set({ fullscreen }),
|
|
|
setZoomPanPinch: zoomPanPinch => set({ zoomPanPinch }),
|