@xyo-network/react-node-renderer 2.77.0 → 2.77.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/components/relational/graph/Graph.d.cts +0 -1
- package/dist/browser/components/relational/graph/Graph.d.cts.map +1 -1
- package/dist/browser/components/relational/graph/Graph.d.mts +0 -1
- package/dist/browser/components/relational/graph/Graph.d.mts.map +1 -1
- package/dist/browser/components/relational/graph/Graph.d.ts +0 -1
- package/dist/browser/components/relational/graph/Graph.d.ts.map +1 -1
- package/dist/browser/index.cjs +1 -840
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +1 -815
- package/dist/browser/index.js.map +1 -1
- package/dist/neutral/components/relational/graph/Graph.d.cts +0 -1
- package/dist/neutral/components/relational/graph/Graph.d.cts.map +1 -1
- package/dist/neutral/components/relational/graph/Graph.d.mts +0 -1
- package/dist/neutral/components/relational/graph/Graph.d.mts.map +1 -1
- package/dist/neutral/components/relational/graph/Graph.d.ts +0 -1
- package/dist/neutral/components/relational/graph/Graph.d.ts.map +1 -1
- package/dist/neutral/index.cjs +1 -840
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.js +1 -815
- package/dist/neutral/index.js.map +1 -1
- package/dist/node/components/relational/graph/Graph.d.cts +0 -1
- package/dist/node/components/relational/graph/Graph.d.cts.map +1 -1
- package/dist/node/components/relational/graph/Graph.d.mts +0 -1
- package/dist/node/components/relational/graph/Graph.d.mts.map +1 -1
- package/dist/node/components/relational/graph/Graph.d.ts +0 -1
- package/dist/node/components/relational/graph/Graph.d.ts.map +1 -1
- package/dist/node/index.cjs +1 -880
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +1 -827
- package/dist/node/index.js.map +1 -1
- package/package.json +10 -9
package/dist/browser/index.js
CHANGED
|
@@ -1,816 +1,2 @@
|
|
|
1
|
-
// src/components/module/CardParser.tsx
|
|
2
|
-
import { asArchivistInstance, isArchivistInstance } from "@xyo-network/archivist-model";
|
|
3
|
-
import { asDivinerInstance, isDivinerInstance } from "@xyo-network/diviner-model";
|
|
4
|
-
import { ArchivistCard } from "@xyo-network/react-archivist";
|
|
5
|
-
import { DivinerCard, ModuleCard } from "@xyo-network/react-module";
|
|
6
|
-
import { jsx } from "react/jsx-runtime";
|
|
7
|
-
var ModuleCardParser = ({ mod }) => {
|
|
8
|
-
switch (true) {
|
|
9
|
-
case isArchivistInstance(mod): {
|
|
10
|
-
return /* @__PURE__ */ jsx(ArchivistCard, { mod: asArchivistInstance(mod) });
|
|
11
|
-
}
|
|
12
|
-
case isDivinerInstance(mod): {
|
|
13
|
-
return /* @__PURE__ */ jsx(DivinerCard, { mod: asDivinerInstance(mod) });
|
|
14
|
-
}
|
|
15
|
-
default: {
|
|
16
|
-
return /* @__PURE__ */ jsx(ModuleCard, { mod });
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
// src/components/module/graph/GraphFlexBox.tsx
|
|
22
|
-
import { Button as Button3 } from "@mui/material";
|
|
23
|
-
import { useRef as useRef3 } from "react";
|
|
24
|
-
|
|
25
|
-
// src/contexts/CytoscapeInstance/Context.ts
|
|
26
|
-
import { createContextEx } from "@xyo-network/react-shared";
|
|
27
|
-
var CytoscapeInstanceContext = createContextEx();
|
|
28
|
-
|
|
29
|
-
// src/contexts/CytoscapeInstance/Provider.tsx
|
|
30
|
-
import { useEffect, useState } from "react";
|
|
31
|
-
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
32
|
-
var CytoscapeInstanceProvider = ({ children, defaultInstance }) => {
|
|
33
|
-
const [cy, setCy] = useState(defaultInstance);
|
|
34
|
-
useEffect(() => {
|
|
35
|
-
setCy(defaultInstance);
|
|
36
|
-
}, [defaultInstance]);
|
|
37
|
-
return /* @__PURE__ */ jsx2(CytoscapeInstanceContext.Provider, { value: { cy, provided: true, setCy }, children });
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
// src/contexts/CytoscapeInstance/use.ts
|
|
41
|
-
import { useContextEx } from "@xyo-network/react-shared";
|
|
42
|
-
var useCytoscapeInstance = (required = false) => useContextEx(CytoscapeInstanceContext, "CytoscapeInstance", required);
|
|
43
|
-
|
|
44
|
-
// src/hooks/cytoscape/elements/useCytoscapeElements.ts
|
|
45
|
-
import { useAsyncEffect } from "@xylabs/react-async-effect";
|
|
46
|
-
import { isNodeInstance as isNodeInstance2 } from "@xyo-network/node-model";
|
|
47
|
-
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
48
|
-
|
|
49
|
-
// src/Cytoscape/CytoscapeElements.ts
|
|
50
|
-
import { exists } from "@xylabs/exists";
|
|
51
|
-
|
|
52
|
-
// src/Cytoscape/lib/encodeSvg.ts
|
|
53
|
-
import { renderToStaticMarkup } from "react-dom/server";
|
|
54
|
-
var dataUri = "data:image/svg+xml,";
|
|
55
|
-
var encodeSvg = (reactElement, color) => {
|
|
56
|
-
const svgString = renderToStaticMarkup(reactElement);
|
|
57
|
-
const doc = new DOMParser().parseFromString(svgString, "text/html");
|
|
58
|
-
const svgElement = doc.querySelectorAll("svg")[0];
|
|
59
|
-
if (svgElement) {
|
|
60
|
-
svgElement.setAttribute("xmlns", "http://www.w3.org/2000/svg");
|
|
61
|
-
svgElement.setAttribute("height", "100");
|
|
62
|
-
svgElement.style.fill = color ?? "black";
|
|
63
|
-
}
|
|
64
|
-
return `${dataUri}${window.encodeURIComponent(svgElement.outerHTML)}`;
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
// src/Cytoscape/lib/iconMap.ts
|
|
68
|
-
var generateIconMap = () => ({
|
|
69
|
-
archivist: "",
|
|
70
|
-
bridge: "",
|
|
71
|
-
diviner: "",
|
|
72
|
-
// eslint-disable-next-line id-denylist
|
|
73
|
-
module: "",
|
|
74
|
-
node: "",
|
|
75
|
-
sentinel: "",
|
|
76
|
-
witness: ""
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// src/Cytoscape/lib/layout/ColaLayout.ts
|
|
80
|
-
var ColaLayout = {
|
|
81
|
-
centerGraph: false,
|
|
82
|
-
convergenceThreshold: 0.01,
|
|
83
|
-
name: "cola"
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// src/Cytoscape/lib/layout/ConcentricLayout.ts
|
|
87
|
-
var ConcentricLayout = {
|
|
88
|
-
concentric: function(node) {
|
|
89
|
-
return node.degree(false);
|
|
90
|
-
},
|
|
91
|
-
levelWidth: function() {
|
|
92
|
-
return 2;
|
|
93
|
-
},
|
|
94
|
-
minNodeSpacing: 75,
|
|
95
|
-
name: "concentric"
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// src/Cytoscape/lib/parseModuleType.ts
|
|
99
|
-
import { isArchivistInstance as isArchivistInstance2 } from "@xyo-network/archivist-model";
|
|
100
|
-
import { isBridgeInstance } from "@xyo-network/bridge-model";
|
|
101
|
-
import { isDivinerInstance as isDivinerInstance2 } from "@xyo-network/diviner-model";
|
|
102
|
-
import { isNodeInstance } from "@xyo-network/node-model";
|
|
103
|
-
import { isSentinelInstance } from "@xyo-network/sentinel-model";
|
|
104
|
-
import { isWitnessModule } from "@xyo-network/witness-model";
|
|
105
|
-
var parseModuleType = (mod) => {
|
|
106
|
-
let type = "module";
|
|
107
|
-
if (mod) {
|
|
108
|
-
if (isArchivistInstance2(mod)) {
|
|
109
|
-
type = "archivist";
|
|
110
|
-
} else if (isBridgeInstance(mod)) {
|
|
111
|
-
type = "bridge";
|
|
112
|
-
} else if (isDivinerInstance2(mod)) {
|
|
113
|
-
type = "diviner";
|
|
114
|
-
} else if (isNodeInstance(mod)) {
|
|
115
|
-
type = "node";
|
|
116
|
-
} else if (isSentinelInstance(mod)) {
|
|
117
|
-
type = "sentinel";
|
|
118
|
-
} else if (isWitnessModule(mod)) {
|
|
119
|
-
type = "witness";
|
|
120
|
-
} else {
|
|
121
|
-
type = "module";
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return type;
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
// src/Cytoscape/CytoscapeElements.ts
|
|
128
|
-
var CytoscapeElements = {
|
|
129
|
-
MaxNameLength: 20,
|
|
130
|
-
buildEdge(rootNode, newNode, properties) {
|
|
131
|
-
return {
|
|
132
|
-
data: {
|
|
133
|
-
id: `${rootNode.data.id}/${newNode.data.id}`,
|
|
134
|
-
source: rootNode.data.id,
|
|
135
|
-
target: newNode.data.id,
|
|
136
|
-
...properties
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
},
|
|
140
|
-
async buildElements(mod) {
|
|
141
|
-
const info = await CytoscapeElements.recurseNodes(mod);
|
|
142
|
-
const newElements = await this.buildElementsFromInfo(info, void 0, ["activeNode"]);
|
|
143
|
-
return newElements;
|
|
144
|
-
},
|
|
145
|
-
async buildElementsFromInfo(info, root, classes = []) {
|
|
146
|
-
const newNode = CytoscapeElements.buildNode(info.mod, { childCount: info.children.length, depth: info.depth }, classes);
|
|
147
|
-
const newEdge = root ? CytoscapeElements.buildEdge(root, newNode, { depth: info.depth, siblingCount: info.children.length }) : void 0;
|
|
148
|
-
const newElements = [newNode];
|
|
149
|
-
if (newEdge) {
|
|
150
|
-
newElements.push(newEdge);
|
|
151
|
-
}
|
|
152
|
-
for (const childInfo of info.children) {
|
|
153
|
-
newElements.push(...await this.buildElementsFromInfo(childInfo, newNode));
|
|
154
|
-
}
|
|
155
|
-
return newElements;
|
|
156
|
-
},
|
|
157
|
-
buildNode(mod, properties, classes) {
|
|
158
|
-
const { address, id } = mod;
|
|
159
|
-
return {
|
|
160
|
-
classes,
|
|
161
|
-
data: {
|
|
162
|
-
address,
|
|
163
|
-
id: address,
|
|
164
|
-
name: id,
|
|
165
|
-
type: parseModuleType(mod),
|
|
166
|
-
...properties
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
},
|
|
170
|
-
buildRootNode: (mod) => {
|
|
171
|
-
return CytoscapeElements.buildNode(mod, {}, ["activeNode"]);
|
|
172
|
-
},
|
|
173
|
-
normalizeName(name) {
|
|
174
|
-
if (!name)
|
|
175
|
-
return;
|
|
176
|
-
if (name.length > this.MaxNameLength)
|
|
177
|
-
return `${name.slice(0, 20)}...`;
|
|
178
|
-
return name;
|
|
179
|
-
},
|
|
180
|
-
async recurseNodes(root, maxDepth = 10, depth = 1) {
|
|
181
|
-
const info = { children: [], depth, mod: root };
|
|
182
|
-
if (maxDepth > 0) {
|
|
183
|
-
const children = await root.resolve("*", { direction: "down", maxDepth: 1 });
|
|
184
|
-
info.children = (await Promise.all(
|
|
185
|
-
children.map(async (child) => {
|
|
186
|
-
if (child.address !== root.address) {
|
|
187
|
-
return await this.recurseNodes(child, maxDepth - 1, depth + 1);
|
|
188
|
-
}
|
|
189
|
-
})
|
|
190
|
-
)).filter(exists);
|
|
191
|
-
}
|
|
192
|
-
return info;
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
// src/Cytoscape/CytoscapeIcons.tsx
|
|
197
|
-
import {
|
|
198
|
-
BubbleChartRounded as BubbleChartRoundedIcon,
|
|
199
|
-
Hub as HubIcon,
|
|
200
|
-
InsertLinkRounded as InsertLinkRoundedIcon,
|
|
201
|
-
Inventory2Rounded as Inventory2RoundedIcon,
|
|
202
|
-
QuestionMarkRounded as QuestionMarkRoundedIcon,
|
|
203
|
-
TimerRounded as TimerRoundedIcon,
|
|
204
|
-
VisibilityRounded as VisibilityRoundedIcon
|
|
205
|
-
} from "@mui/icons-material";
|
|
206
|
-
var CyIconSet = {
|
|
207
|
-
archivist: Inventory2RoundedIcon,
|
|
208
|
-
bridge: InsertLinkRoundedIcon,
|
|
209
|
-
diviner: BubbleChartRoundedIcon,
|
|
210
|
-
// eslint-disable-next-line id-denylist
|
|
211
|
-
module: QuestionMarkRoundedIcon,
|
|
212
|
-
node: HubIcon,
|
|
213
|
-
sentinel: TimerRoundedIcon,
|
|
214
|
-
witness: VisibilityRoundedIcon
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
// src/Cytoscape/CytoscapeStyles.ts
|
|
218
|
-
var NodeWithName = (color, outlineColor) => ({
|
|
219
|
-
selector: "node[name]",
|
|
220
|
-
style: {
|
|
221
|
-
color,
|
|
222
|
-
"font-family": "Lexend Deca, Helvetica, sans-serif",
|
|
223
|
-
"font-size": 12,
|
|
224
|
-
"overlay-padding": "6px",
|
|
225
|
-
"text-halign": "center",
|
|
226
|
-
"text-outline-color": outlineColor,
|
|
227
|
-
"text-outline-width": "1px",
|
|
228
|
-
"text-valign": "top"
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
var Node = (icons, bgColor, hideLabels = false) => ({
|
|
232
|
-
selector: "node",
|
|
233
|
-
style: {
|
|
234
|
-
"background-color": bgColor,
|
|
235
|
-
"background-height": "75%",
|
|
236
|
-
"background-image": (elem) => icons[elem.data("type")],
|
|
237
|
-
"background-width": "24",
|
|
238
|
-
label: hideLabels ? void 0 : "data(name)",
|
|
239
|
-
shape: "round-rectangle"
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
var NodeAsRoot = (bgColor) => ({
|
|
243
|
-
selector: ".activeNode",
|
|
244
|
-
style: {
|
|
245
|
-
"background-color": bgColor
|
|
246
|
-
}
|
|
247
|
-
});
|
|
248
|
-
var EdgeStyled = (lineColor, targetArrowColor) => ({
|
|
249
|
-
selector: "edge",
|
|
250
|
-
style: {
|
|
251
|
-
"curve-style": "bezier",
|
|
252
|
-
"line-color": lineColor,
|
|
253
|
-
"line-opacity": 0.1,
|
|
254
|
-
"target-arrow-color": targetArrowColor,
|
|
255
|
-
"target-arrow-shape": "triangle",
|
|
256
|
-
width: 3
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
// src/hooks/cytoscape/elements/useCytoscapeElements.ts
|
|
261
|
-
var useCytoscapeElements = (mod) => {
|
|
262
|
-
const [elements, setElements] = useState2([]);
|
|
263
|
-
useAsyncEffect(
|
|
264
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
265
|
-
async () => {
|
|
266
|
-
const moduleInstance = mod?.deref();
|
|
267
|
-
if (moduleInstance) {
|
|
268
|
-
const newElements = await CytoscapeElements.buildElements(moduleInstance) ?? [];
|
|
269
|
-
setElements(newElements);
|
|
270
|
-
}
|
|
271
|
-
},
|
|
272
|
-
[mod]
|
|
273
|
-
);
|
|
274
|
-
useEffect2(() => {
|
|
275
|
-
let attachedListener;
|
|
276
|
-
let detachedListener;
|
|
277
|
-
if (mod && isNodeInstance2(mod)) {
|
|
278
|
-
attachedListener = mod.on("moduleAttached", async () => {
|
|
279
|
-
const newElements = await CytoscapeElements.buildElements(mod) ?? [];
|
|
280
|
-
setElements(newElements);
|
|
281
|
-
});
|
|
282
|
-
detachedListener = mod.on("moduleDetached", async () => {
|
|
283
|
-
const newElements = await CytoscapeElements.buildElements(mod) ?? [];
|
|
284
|
-
setElements(newElements);
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
return () => {
|
|
288
|
-
attachedListener?.();
|
|
289
|
-
detachedListener?.();
|
|
290
|
-
};
|
|
291
|
-
}, [mod]);
|
|
292
|
-
return elements;
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
// src/hooks/cytoscape/elements/useHoveredNode.tsx
|
|
296
|
-
import { useCallback, useEffect as useEffect3, useState as useState3 } from "react";
|
|
297
|
-
var useHoveredNode = (renderedElements) => {
|
|
298
|
-
const { cy } = useCytoscapeInstance(true);
|
|
299
|
-
const [hoveredNode, setHoveredNode] = useState3();
|
|
300
|
-
const nodeListener = useCallback((node) => {
|
|
301
|
-
node.on("mouseover tap", () => {
|
|
302
|
-
setHoveredNode(node);
|
|
303
|
-
});
|
|
304
|
-
}, []);
|
|
305
|
-
useEffect3(() => {
|
|
306
|
-
if (renderedElements) {
|
|
307
|
-
renderedElements.nodes().forEach(nodeListener);
|
|
308
|
-
}
|
|
309
|
-
}, [nodeListener, renderedElements]);
|
|
310
|
-
useEffect3(() => {
|
|
311
|
-
cy?.deref()?.ready(() => {
|
|
312
|
-
cy?.deref()?.nodes().forEach(nodeListener);
|
|
313
|
-
});
|
|
314
|
-
}, [cy, nodeListener]);
|
|
315
|
-
return [hoveredNode, setHoveredNode];
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
// src/hooks/cytoscape/elements/useNewElements.tsx
|
|
319
|
-
import { useWeakModuleFromNode } from "@xyo-network/react-node";
|
|
320
|
-
import { useMemo } from "react";
|
|
321
|
-
var useNewElements = (selectedElement) => {
|
|
322
|
-
const selectedAddress = useMemo(() => {
|
|
323
|
-
const { address: selectedAddress2 } = selectedElement?.data() ?? {};
|
|
324
|
-
return selectedAddress2;
|
|
325
|
-
}, [selectedElement]);
|
|
326
|
-
const [mod] = useWeakModuleFromNode(selectedAddress);
|
|
327
|
-
const newElements = useCytoscapeElements(mod);
|
|
328
|
-
return newElements;
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
// src/hooks/cytoscape/elements/useRenderNewElements.tsx
|
|
332
|
-
import { useEffect as useEffect4, useState as useState4 } from "react";
|
|
333
|
-
var useRenderNewElements = (newElements = [], hideLabels) => {
|
|
334
|
-
const { cy } = useCytoscapeInstance(true);
|
|
335
|
-
const [renderedElements, setRenderedElements] = useState4();
|
|
336
|
-
useEffect4(() => {
|
|
337
|
-
if (newElements.length > 1) {
|
|
338
|
-
const renderedElements2 = cy?.deref()?.add(newElements);
|
|
339
|
-
setRenderedElements(renderedElements2);
|
|
340
|
-
cy?.deref()?.layout(ColaLayout).run();
|
|
341
|
-
}
|
|
342
|
-
}, [cy, hideLabels, newElements]);
|
|
343
|
-
return renderedElements;
|
|
344
|
-
};
|
|
345
|
-
|
|
346
|
-
// src/hooks/cytoscape/elements/useSelectedElement.tsx
|
|
347
|
-
import { useState as useState5 } from "react";
|
|
348
|
-
var useSelectedElement = () => {
|
|
349
|
-
const [selectedElement, setSelectedElement] = useState5();
|
|
350
|
-
const { cy } = useCytoscapeInstance(true);
|
|
351
|
-
const updateStyles = (element) => {
|
|
352
|
-
const nodes = cy?.deref()?.nodes();
|
|
353
|
-
nodes?.toggleClass("activeNode", false);
|
|
354
|
-
element.toggleClass("activeNode", true);
|
|
355
|
-
};
|
|
356
|
-
const toggleSelectedElement = (address) => {
|
|
357
|
-
const selectedNode = cy?.deref()?.nodes(`[id="${address}"]`)?.[0];
|
|
358
|
-
if (selectedNode) {
|
|
359
|
-
setSelectedElement(selectedNode);
|
|
360
|
-
updateStyles(selectedNode);
|
|
361
|
-
}
|
|
362
|
-
};
|
|
363
|
-
return { selectedElement, toggleSelectedElement };
|
|
364
|
-
};
|
|
365
|
-
|
|
366
|
-
// src/hooks/cytoscape/elements/useElements.tsx
|
|
367
|
-
var useElements = (hideLabels) => {
|
|
368
|
-
const { selectedElement, toggleSelectedElement } = useSelectedElement();
|
|
369
|
-
const newElements = useNewElements(selectedElement);
|
|
370
|
-
const renderedElements = useRenderNewElements(newElements, hideLabels);
|
|
371
|
-
const [hoveredNode, setHoveredNode] = useHoveredNode(renderedElements);
|
|
372
|
-
return { hoveredNode, setHoveredNode, toggleSelectedElement };
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
// src/hooks/cytoscape/useCytoscapeOptions.ts
|
|
376
|
-
import { useMemo as useMemo4 } from "react";
|
|
377
|
-
|
|
378
|
-
// src/hooks/cytoscape/useCytoscapeStyle.tsx
|
|
379
|
-
import { useTheme as useTheme2 } from "@mui/material";
|
|
380
|
-
import { useMemo as useMemo3 } from "react";
|
|
381
|
-
|
|
382
|
-
// src/hooks/cytoscape/useIcons.tsx
|
|
383
|
-
import { useTheme } from "@mui/material";
|
|
384
|
-
import { useMemo as useMemo2 } from "react";
|
|
385
|
-
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
386
|
-
var useIcons = () => {
|
|
387
|
-
const theme = useTheme();
|
|
388
|
-
const icons = useMemo2(() => {
|
|
389
|
-
const iconMap = generateIconMap();
|
|
390
|
-
return Object.entries(CyIconSet).reduce((acc, [name, IconComponent]) => {
|
|
391
|
-
const icon = /* @__PURE__ */ jsx3(IconComponent, { fontSize: "small" });
|
|
392
|
-
acc[name] = encodeSvg(icon, theme.palette.getContrastText(theme.palette.text.primary));
|
|
393
|
-
return acc;
|
|
394
|
-
}, iconMap);
|
|
395
|
-
}, [theme.palette]);
|
|
396
|
-
return icons;
|
|
397
|
-
};
|
|
398
|
-
|
|
399
|
-
// src/hooks/cytoscape/useCytoscapeStyle.tsx
|
|
400
|
-
var useCytoscapeStyle = (hideLabels = false) => {
|
|
401
|
-
const theme = useTheme2();
|
|
402
|
-
const icons = useIcons();
|
|
403
|
-
const style = useMemo3(
|
|
404
|
-
() => [
|
|
405
|
-
Node(icons, theme.palette.primary.main, hideLabels),
|
|
406
|
-
NodeWithName(theme.palette.text.primary, theme.palette.getContrastText(theme.palette.text.primary)),
|
|
407
|
-
NodeAsRoot(theme.palette.secondary.main),
|
|
408
|
-
EdgeStyled(theme.palette.divider, theme.palette.divider)
|
|
409
|
-
],
|
|
410
|
-
[icons, hideLabels, theme]
|
|
411
|
-
);
|
|
412
|
-
return style;
|
|
413
|
-
};
|
|
414
|
-
|
|
415
|
-
// src/hooks/cytoscape/useCytoscapeOptions.ts
|
|
416
|
-
var useCytoscapeOptions = (elements, style, layout) => {
|
|
417
|
-
const defaultStyle = useCytoscapeStyle();
|
|
418
|
-
const resolvedLayout = layout ?? ConcentricLayout;
|
|
419
|
-
const resolvedStyle = style ?? defaultStyle;
|
|
420
|
-
const options = useMemo4(() => {
|
|
421
|
-
if (elements && resolvedLayout && resolvedStyle) {
|
|
422
|
-
return {
|
|
423
|
-
elements,
|
|
424
|
-
layout: resolvedLayout,
|
|
425
|
-
style: resolvedStyle
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
}, [elements, layout, style]);
|
|
429
|
-
return options;
|
|
430
|
-
};
|
|
431
|
-
|
|
432
|
-
// src/hooks/cytoscape/useModuleDetails.tsx
|
|
433
|
-
import { usePromise } from "@xylabs/react-promise";
|
|
434
|
-
import { useEffect as useEffect5, useState as useState6 } from "react";
|
|
435
|
-
var useModuleDetails = (rootModule, onFoundModule) => {
|
|
436
|
-
const { cy } = useCytoscapeInstance();
|
|
437
|
-
const [moduleAddress, setModuleAddress] = useState6();
|
|
438
|
-
const [foundModule] = usePromise(async () => {
|
|
439
|
-
if (moduleAddress === null)
|
|
440
|
-
return null;
|
|
441
|
-
const rootModuleInstance = rootModule?.deref();
|
|
442
|
-
if (moduleAddress && rootModuleInstance) {
|
|
443
|
-
const foundModule2 = await rootModuleInstance.resolve(moduleAddress);
|
|
444
|
-
return foundModule2 ?? null;
|
|
445
|
-
}
|
|
446
|
-
}, [moduleAddress, rootModule]);
|
|
447
|
-
useEffect5(() => {
|
|
448
|
-
const resizeObserver = new ResizeObserver(() => {
|
|
449
|
-
if (moduleAddress === null) {
|
|
450
|
-
setTimeout(() => {
|
|
451
|
-
cy?.deref()?.center();
|
|
452
|
-
}, 100);
|
|
453
|
-
} else if (foundModule && cy) {
|
|
454
|
-
const node = cy?.deref()?.nodes(`[id="${moduleAddress}"]`)?.[0];
|
|
455
|
-
setTimeout(() => {
|
|
456
|
-
cy?.deref()?.center(node);
|
|
457
|
-
}, 100);
|
|
458
|
-
}
|
|
459
|
-
});
|
|
460
|
-
const container = cy?.deref()?.container();
|
|
461
|
-
if (container) {
|
|
462
|
-
resizeObserver.observe(container);
|
|
463
|
-
}
|
|
464
|
-
return () => {
|
|
465
|
-
if (container)
|
|
466
|
-
resizeObserver.unobserve(container);
|
|
467
|
-
};
|
|
468
|
-
}, [cy, moduleAddress, foundModule, rootModule]);
|
|
469
|
-
useEffect5(() => {
|
|
470
|
-
if (foundModule) {
|
|
471
|
-
onFoundModule?.();
|
|
472
|
-
}
|
|
473
|
-
}, [cy, moduleAddress, foundModule, onFoundModule]);
|
|
474
|
-
const onModuleDetails = (address) => {
|
|
475
|
-
const moduleNode = cy?.deref()?.nodes(`[id="${address}"]`);
|
|
476
|
-
const rootModuleNode = cy?.deref()?.nodes(`[id="${rootModule?.deref()?.address}"]`);
|
|
477
|
-
const foundModuleNode = cy?.deref()?.nodes(`[id="${foundModule?.address}"]`);
|
|
478
|
-
const notModuleNode = cy?.deref()?.nodes(`[id != "${address}"]`);
|
|
479
|
-
if (address) {
|
|
480
|
-
moduleNode?.toggleClass("activeNode", true);
|
|
481
|
-
notModuleNode?.toggleClass("activeNode", false);
|
|
482
|
-
} else {
|
|
483
|
-
notModuleNode?.toggleClass("activeNode", false);
|
|
484
|
-
const activeNode = foundModuleNode?.length ? foundModuleNode : rootModuleNode;
|
|
485
|
-
activeNode?.toggleClass("activeNode", true);
|
|
486
|
-
}
|
|
487
|
-
setModuleAddress(address);
|
|
488
|
-
};
|
|
489
|
-
return { mod: foundModule, onModuleDetails };
|
|
490
|
-
};
|
|
491
|
-
|
|
492
|
-
// src/hooks/cytoscape/useRelationalGraphOptions.tsx
|
|
493
|
-
import { useState as useState7 } from "react";
|
|
494
|
-
var useRelationalGraphOptions = (mod) => {
|
|
495
|
-
const [hideLabels, setHideLabels] = useState7(true);
|
|
496
|
-
const handleToggleLabels = () => {
|
|
497
|
-
setHideLabels((oldValue) => !oldValue);
|
|
498
|
-
};
|
|
499
|
-
const elements = useCytoscapeElements(mod);
|
|
500
|
-
const style = useCytoscapeStyle(hideLabels);
|
|
501
|
-
const options = useCytoscapeOptions(elements, style, ConcentricLayout);
|
|
502
|
-
return { handleToggleLabels, hideLabels, options };
|
|
503
|
-
};
|
|
504
|
-
|
|
505
|
-
// src/components/cytoscape-extensions/WithExtensions.tsx
|
|
506
|
-
import cytoscape from "cytoscape";
|
|
507
|
-
import cola from "cytoscape-cola";
|
|
508
|
-
import coseBilkent from "cytoscape-cose-bilkent";
|
|
509
|
-
import dagre from "cytoscape-dagre";
|
|
510
|
-
import euler from "cytoscape-euler";
|
|
511
|
-
import { useEffect as useEffect6, useState as useState8 } from "react";
|
|
512
|
-
import { Fragment, jsx as jsx4 } from "react/jsx-runtime";
|
|
513
|
-
var WithExtensions = ({ children }) => {
|
|
514
|
-
const [initialized, setInitialized] = useState8(false);
|
|
515
|
-
useEffect6(() => {
|
|
516
|
-
cytoscape.use(cola);
|
|
517
|
-
cytoscape.use(dagre);
|
|
518
|
-
cytoscape.use(coseBilkent);
|
|
519
|
-
cytoscape.use(euler);
|
|
520
|
-
setInitialized(true);
|
|
521
|
-
}, []);
|
|
522
|
-
return /* @__PURE__ */ jsx4(Fragment, { children: initialized ? children : void 0 });
|
|
523
|
-
};
|
|
524
|
-
|
|
525
|
-
// src/components/relational/graph/Graph.tsx
|
|
526
|
-
import { Box, Button, ButtonGroup, Card, CardHeader, Paper, useTheme as useTheme3 } from "@mui/material";
|
|
527
|
-
import { asAddress } from "@xylabs/hex";
|
|
528
|
-
import { FlexCol, FlexGrowRow, FlexRow } from "@xylabs/react-flexbox";
|
|
529
|
-
import { Identicon } from "@xylabs/react-identicon";
|
|
530
|
-
import { useWeakModuleFromNode as useWeakModuleFromNode2 } from "@xyo-network/react-node";
|
|
531
|
-
import cytoscape2 from "cytoscape";
|
|
532
|
-
import cola2 from "cytoscape-cola";
|
|
533
|
-
import coseBilkentLayout from "cytoscape-cose-bilkent";
|
|
534
|
-
import dagre2 from "cytoscape-dagre";
|
|
535
|
-
import eulerLayout from "cytoscape-euler";
|
|
536
|
-
import { forwardRef, useEffect as useEffect7, useRef, useState as useState9 } from "react";
|
|
537
|
-
import { jsx as jsx5, jsxs } from "react/jsx-runtime";
|
|
538
|
-
var applyLayout = (cy, name = "cola", options) => {
|
|
539
|
-
cy?.layout({ name, ...options }).run();
|
|
540
|
-
};
|
|
541
|
-
var loadLayout = (layout = "cola") => {
|
|
542
|
-
switch (layout) {
|
|
543
|
-
case "dagre": {
|
|
544
|
-
cytoscape2.use(dagre2);
|
|
545
|
-
break;
|
|
546
|
-
}
|
|
547
|
-
case "euler": {
|
|
548
|
-
cytoscape2.use(eulerLayout);
|
|
549
|
-
break;
|
|
550
|
-
}
|
|
551
|
-
case "cose-bilkent": {
|
|
552
|
-
cytoscape2.use(coseBilkentLayout);
|
|
553
|
-
break;
|
|
554
|
-
}
|
|
555
|
-
case "cola": {
|
|
556
|
-
cytoscape2.use(cola2);
|
|
557
|
-
break;
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
};
|
|
561
|
-
var ModuleHoverDetails = ({ name, address, ...props }) => {
|
|
562
|
-
return /* @__PURE__ */ jsx5(Card, { elevation: 3, ...props, children: /* @__PURE__ */ jsx5(
|
|
563
|
-
CardHeader,
|
|
564
|
-
{
|
|
565
|
-
avatar: /* @__PURE__ */ jsx5(Paper, { elevation: 6, sx: { bgcolor: "#fff", p: 1 }, children: /* @__PURE__ */ jsx5(Identicon, { value: address, size: 24 }) }),
|
|
566
|
-
title: name,
|
|
567
|
-
subheader: address
|
|
568
|
-
}
|
|
569
|
-
) });
|
|
570
|
-
};
|
|
571
|
-
var NodeRelationalGraphFlexBox = forwardRef(
|
|
572
|
-
({ actions, children, node, layout, layoutOptions, showDetails, detail, options, onHover, ...props }, ref) => {
|
|
573
|
-
const theme = useTheme3();
|
|
574
|
-
const [cy, setCy] = useState9();
|
|
575
|
-
const cytoscapeRef = useRef();
|
|
576
|
-
const [hoverPosition, setHoverBoundingBox] = useState9();
|
|
577
|
-
const [hoverAddress, setHoverAddress] = useState9();
|
|
578
|
-
const [moduleInstance] = useWeakModuleFromNode2(hoverAddress, { node });
|
|
579
|
-
useEffect7(() => {
|
|
580
|
-
cy?.on("mouseover tap", ({ target }) => {
|
|
581
|
-
const cyNode = target;
|
|
582
|
-
const bb = cyNode?.renderedBoundingBox?.();
|
|
583
|
-
setHoverBoundingBox(bb);
|
|
584
|
-
const id = cyNode.id?.();
|
|
585
|
-
if (id) {
|
|
586
|
-
if (id.includes("/")) {
|
|
587
|
-
setHoverAddress(void 0);
|
|
588
|
-
onHover?.();
|
|
589
|
-
} else {
|
|
590
|
-
setHoverAddress(asAddress(id));
|
|
591
|
-
onHover?.(asAddress(id));
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
});
|
|
595
|
-
}, [onHover, cy]);
|
|
596
|
-
const handleReset = () => {
|
|
597
|
-
cy?.reset();
|
|
598
|
-
applyLayout(cy, layout ?? "euler", layoutOptions);
|
|
599
|
-
};
|
|
600
|
-
useEffect7(() => {
|
|
601
|
-
let newCy;
|
|
602
|
-
const container = cytoscapeRef.current;
|
|
603
|
-
if (container) {
|
|
604
|
-
newCy = cytoscape2({
|
|
605
|
-
container,
|
|
606
|
-
...options
|
|
607
|
-
});
|
|
608
|
-
setCy(newCy);
|
|
609
|
-
}
|
|
610
|
-
return () => {
|
|
611
|
-
newCy?.destroy();
|
|
612
|
-
setCy(void 0);
|
|
613
|
-
};
|
|
614
|
-
}, [options, cytoscapeRef, layoutOptions]);
|
|
615
|
-
useEffect7(() => {
|
|
616
|
-
if (cy) {
|
|
617
|
-
loadLayout(layout);
|
|
618
|
-
applyLayout(cy, layout ?? "euler", layoutOptions);
|
|
619
|
-
}
|
|
620
|
-
}, [cy, layoutOptions, layout]);
|
|
621
|
-
return /* @__PURE__ */ jsxs(FlexCol, { id: "relational-graph-wrapper", ref, ...props, children: [
|
|
622
|
-
hoverAddress && hoverPosition ? /* @__PURE__ */ jsx5(Box, { position: "absolute", top: hoverPosition.y1, left: hoverPosition.x1, zIndex: 100, children: /* @__PURE__ */ jsx5(ModuleHoverDetails, { address: hoverAddress, name: moduleInstance?.deref()?.id ?? "Unknown" }) }) : null,
|
|
623
|
-
/* @__PURE__ */ jsx5(FlexRow, { justifyContent: "start", width: "100%", children: actions === null ? null : actions ? /* @__PURE__ */ jsxs(ButtonGroup, { children: [
|
|
624
|
-
actions,
|
|
625
|
-
/* @__PURE__ */ jsx5(Button, { size: "small", variant: "contained", onClick: handleReset, children: "Reset View" })
|
|
626
|
-
] }) : /* @__PURE__ */ jsx5(Button, { size: "small", variant: "contained", onClick: handleReset, children: "Reset" }) }),
|
|
627
|
-
/* @__PURE__ */ jsxs(FlexGrowRow, { width: "100%", alignItems: "start", children: [
|
|
628
|
-
showDetails ? /* @__PURE__ */ jsx5(FlexCol, { height: "100%", width: "85%", children: detail }) : null,
|
|
629
|
-
/* @__PURE__ */ jsxs(
|
|
630
|
-
FlexCol,
|
|
631
|
-
{
|
|
632
|
-
justifyContent: "start",
|
|
633
|
-
classes: "cytoscape-wrap",
|
|
634
|
-
width: showDetails ? "15%" : "100%",
|
|
635
|
-
height: showDetails ? "50%" : "100%",
|
|
636
|
-
border: showDetails ? `1px solid ${theme.palette.divider}` : void 0,
|
|
637
|
-
children: [
|
|
638
|
-
/* @__PURE__ */ jsx5(FlexCol, { alignItems: "stretch", position: "absolute", width: "100%", height: "100%", ref: cytoscapeRef }),
|
|
639
|
-
children
|
|
640
|
-
]
|
|
641
|
-
}
|
|
642
|
-
)
|
|
643
|
-
] })
|
|
644
|
-
] });
|
|
645
|
-
}
|
|
646
|
-
);
|
|
647
|
-
NodeRelationalGraphFlexBox.displayName = "NodeRelationalGraph";
|
|
648
|
-
var NodeRelationalGraph = NodeRelationalGraphFlexBox;
|
|
649
|
-
|
|
650
|
-
// src/components/relational/graph/ProvidedNodeRenderer.tsx
|
|
651
|
-
import { useWeakProvidedNode } from "@xyo-network/react-node";
|
|
652
|
-
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
653
|
-
var ProvidedNodeRenderer = ({ node, ...props }) => {
|
|
654
|
-
const [providedNode] = useWeakProvidedNode();
|
|
655
|
-
const elements = useCytoscapeElements(node ?? providedNode);
|
|
656
|
-
const options = useCytoscapeOptions(elements);
|
|
657
|
-
return /* @__PURE__ */ jsx6(NodeRelationalGraphFlexBox, { alignItems: "stretch", flexGrow: 1, height: "100%", options, ...props });
|
|
658
|
-
};
|
|
659
|
-
|
|
660
|
-
// src/components/module/graph/DetailsFlexbox.tsx
|
|
661
|
-
import { CancelRounded } from "@mui/icons-material";
|
|
662
|
-
import { IconButton } from "@mui/material";
|
|
663
|
-
import { FlexGrowCol, FlexRow as FlexRow2 } from "@xylabs/react-flexbox";
|
|
664
|
-
import { jsx as jsx7, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
665
|
-
var DetailsFlexbox = ({ children, onClose }) => {
|
|
666
|
-
return /* @__PURE__ */ jsxs2(FlexGrowCol, { alignItems: "end", justifyContent: "start", id: "module-detail", width: "100%", p: 2, gap: 2, children: [
|
|
667
|
-
/* @__PURE__ */ jsx7(FlexRow2, { justifyContent: "end", children: /* @__PURE__ */ jsx7(IconButton, { onClick: onClose, size: "small", children: /* @__PURE__ */ jsx7(CancelRounded, {}) }) }),
|
|
668
|
-
children
|
|
669
|
-
] });
|
|
670
|
-
};
|
|
671
|
-
|
|
672
|
-
// src/components/module/graph/node/Hover.tsx
|
|
673
|
-
import { styled } from "@mui/material";
|
|
674
|
-
import { FlexCol as FlexCol2 } from "@xylabs/react-flexbox";
|
|
675
|
-
|
|
676
|
-
// src/components/module/graph/node/hooks/useNodeElement.tsx
|
|
677
|
-
import { useEffect as useEffect8, useRef as useRef2, useState as useState10 } from "react";
|
|
678
|
-
var useNodeElement = (node) => {
|
|
679
|
-
const ref = useRef2(null);
|
|
680
|
-
const [currentElement, setCurrentElement] = useState10(null);
|
|
681
|
-
const [boundingBox, setBoundingBox] = useState10(node?.renderedBoundingBox());
|
|
682
|
-
useEffect8(() => {
|
|
683
|
-
setCurrentElement(null);
|
|
684
|
-
}, [node]);
|
|
685
|
-
useEffect8(() => {
|
|
686
|
-
if (node) {
|
|
687
|
-
setBoundingBox(node.renderedBoundingBox());
|
|
688
|
-
}
|
|
689
|
-
const listener = () => {
|
|
690
|
-
setBoundingBox(node?.renderedBoundingBox());
|
|
691
|
-
};
|
|
692
|
-
node?.on("position", listener);
|
|
693
|
-
return () => {
|
|
694
|
-
node?.off("position", void 0, listener);
|
|
695
|
-
};
|
|
696
|
-
}, [node]);
|
|
697
|
-
useEffect8(() => {
|
|
698
|
-
setCurrentElement(ref.current);
|
|
699
|
-
}, [boundingBox]);
|
|
700
|
-
return { boundingBox, currentElement, ref };
|
|
701
|
-
};
|
|
702
|
-
|
|
703
|
-
// src/components/module/graph/node/Hover.tsx
|
|
704
|
-
import { Fragment as Fragment2, jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
705
|
-
var ModuleGraphNodeHover = ({ children, node }) => {
|
|
706
|
-
const { boundingBox, ref, currentElement } = useNodeElement(node);
|
|
707
|
-
return /* @__PURE__ */ jsxs3(Fragment2, { children: [
|
|
708
|
-
/* @__PURE__ */ jsx8(StyledNodeGhostElementFlexCol, { ref, left: boundingBox?.x1, height: boundingBox?.h, top: boundingBox?.y1, width: boundingBox?.w }),
|
|
709
|
-
node ? /* @__PURE__ */ jsx8(Fragment2, { children: children?.(currentElement) }) : null
|
|
710
|
-
] });
|
|
711
|
-
};
|
|
712
|
-
var StyledNodeGhostElementFlexCol = styled(FlexCol2, { name: "StyledNodeGhostElementFlexCol" })(() => ({
|
|
713
|
-
// For easier debugging of the 'ghost' element that matches the hovered cytoscape node
|
|
714
|
-
// backgroundColor: '#fff',
|
|
715
|
-
// opacity: 0.25,
|
|
716
|
-
// eslint-disable-next-line sort-keys-fix/sort-keys-fix
|
|
717
|
-
cursor: "pointer",
|
|
718
|
-
pointerEvents: "none",
|
|
719
|
-
position: "absolute"
|
|
720
|
-
}));
|
|
721
|
-
|
|
722
|
-
// src/components/module/graph/Popper.tsx
|
|
723
|
-
import { CancelRounded as CancelRounded2 } from "@mui/icons-material";
|
|
724
|
-
import { Button as Button2, Card as Card2, CardActions, CardHeader as CardHeader2, IconButton as IconButton2, Paper as Paper2, Popper, styled as styled2 } from "@mui/material";
|
|
725
|
-
import { Identicon as Identicon2 } from "@xylabs/react-identicon";
|
|
726
|
-
import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
727
|
-
var ModuleHoverPopper = ({ anchorEl, onClose, onModuleDetails, onModuleExplore, node, ...props }) => {
|
|
728
|
-
const { address, name } = node?.data() ?? {};
|
|
729
|
-
return /* @__PURE__ */ jsx9(Fragment3, { children: anchorEl ? /* @__PURE__ */ jsx9(Popper, { anchorEl, ...props, children: /* @__PURE__ */ jsxs4(Card2, { elevation: 3, children: [
|
|
730
|
-
/* @__PURE__ */ jsx9(
|
|
731
|
-
CardHeader2,
|
|
732
|
-
{
|
|
733
|
-
action: onClose ? /* @__PURE__ */ jsx9(IconButton2, { size: "small", onClick: onClose, children: /* @__PURE__ */ jsx9(CancelRounded2, {}) }) : null,
|
|
734
|
-
avatar: /* @__PURE__ */ jsx9(Paper2, { elevation: 6, sx: { bgcolor: "#fff", p: 1 }, children: /* @__PURE__ */ jsx9(Identicon2, { value: address, size: 24 }) }),
|
|
735
|
-
title: name,
|
|
736
|
-
subheader: address
|
|
737
|
-
}
|
|
738
|
-
),
|
|
739
|
-
/* @__PURE__ */ jsxs4(StyledCardActions, { children: [
|
|
740
|
-
onModuleDetails ? /* @__PURE__ */ jsx9(Button2, { onClick: () => onModuleDetails?.(address), size: "small", variant: "contained", children: "Details" }) : null,
|
|
741
|
-
onModuleExplore ? /* @__PURE__ */ jsx9(Button2, { onClick: () => onModuleExplore?.(address), size: "small", variant: "contained", children: "Explore" }) : null
|
|
742
|
-
] })
|
|
743
|
-
] }) }) : null });
|
|
744
|
-
};
|
|
745
|
-
var StyledModuleHoverPopper = styled2(ModuleHoverPopper, { name: "StyledComponents" })(() => ({
|
|
746
|
-
zIndex: 2
|
|
747
|
-
}));
|
|
748
|
-
var StyledCardActions = styled2(CardActions, { name: "StyledCardActions" })(() => ({
|
|
749
|
-
display: "flex",
|
|
750
|
-
justifyContent: "center"
|
|
751
|
-
}));
|
|
752
|
-
|
|
753
|
-
// src/components/module/graph/GraphFlexBox.tsx
|
|
754
|
-
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
755
|
-
var ModuleGraphFlexBox = ({ hideActions, rootModule, disableModuleDetails, ...props }) => {
|
|
756
|
-
const cytoscapeRef = useRef3(null);
|
|
757
|
-
const { handleToggleLabels, hideLabels, options } = useRelationalGraphOptions(rootModule ?? void 0);
|
|
758
|
-
const { hoveredNode, setHoveredNode, toggleSelectedElement } = useElements(hideLabels);
|
|
759
|
-
const { mod, onModuleDetails } = useModuleDetails(rootModule, () => setHoveredNode(void 0));
|
|
760
|
-
return /* @__PURE__ */ jsx10(WithExtensions, { children: /* @__PURE__ */ jsx10(
|
|
761
|
-
NodeRelationalGraphFlexBox,
|
|
762
|
-
{
|
|
763
|
-
actions: mod ? null : hideActions ? null : /* @__PURE__ */ jsx10(Button3, { size: "small", onClick: handleToggleLabels, variant: "contained", children: "Toggle Labels" }),
|
|
764
|
-
showDetails: !!mod,
|
|
765
|
-
detail: /* @__PURE__ */ jsx10(DetailsFlexbox, { onClose: () => onModuleDetails(null) }),
|
|
766
|
-
options,
|
|
767
|
-
ref: cytoscapeRef,
|
|
768
|
-
width: "100%",
|
|
769
|
-
...props,
|
|
770
|
-
children: /* @__PURE__ */ jsx10(ModuleGraphNodeHover, { node: hoveredNode, children: (element) => /* @__PURE__ */ jsx10(
|
|
771
|
-
StyledModuleHoverPopper,
|
|
772
|
-
{
|
|
773
|
-
anchorEl: element,
|
|
774
|
-
container: cytoscapeRef.current,
|
|
775
|
-
node: hoveredNode,
|
|
776
|
-
onClose: () => setHoveredNode(void 0),
|
|
777
|
-
onModuleExplore: toggleSelectedElement,
|
|
778
|
-
onModuleDetails: disableModuleDetails ? void 0 : onModuleDetails,
|
|
779
|
-
placement: "top",
|
|
780
|
-
open: true
|
|
781
|
-
}
|
|
782
|
-
) })
|
|
783
|
-
}
|
|
784
|
-
) });
|
|
785
|
-
};
|
|
786
|
-
var ModuleGraphFlexBoxWithProvider = (props) => {
|
|
787
|
-
return /* @__PURE__ */ jsx10(CytoscapeInstanceProvider, { children: /* @__PURE__ */ jsx10(ModuleGraphFlexBox, { ...props }) });
|
|
788
|
-
};
|
|
789
|
-
export {
|
|
790
|
-
ColaLayout,
|
|
791
|
-
ConcentricLayout,
|
|
792
|
-
CyIconSet,
|
|
793
|
-
CytoscapeElements,
|
|
794
|
-
CytoscapeInstanceContext,
|
|
795
|
-
CytoscapeInstanceProvider,
|
|
796
|
-
EdgeStyled,
|
|
797
|
-
ModuleCardParser,
|
|
798
|
-
ModuleGraphFlexBox,
|
|
799
|
-
ModuleGraphFlexBoxWithProvider,
|
|
800
|
-
Node,
|
|
801
|
-
NodeAsRoot,
|
|
802
|
-
NodeRelationalGraph,
|
|
803
|
-
NodeRelationalGraphFlexBox,
|
|
804
|
-
NodeWithName,
|
|
805
|
-
ProvidedNodeRenderer,
|
|
806
|
-
encodeSvg,
|
|
807
|
-
generateIconMap,
|
|
808
|
-
parseModuleType,
|
|
809
|
-
useCytoscapeElements,
|
|
810
|
-
useCytoscapeInstance,
|
|
811
|
-
useCytoscapeOptions,
|
|
812
|
-
useElements,
|
|
813
|
-
useModuleDetails,
|
|
814
|
-
useRelationalGraphOptions
|
|
815
|
-
};
|
|
1
|
+
import{asArchivistInstance as be,isArchivistInstance as Re}from"@xyo-network/archivist-model";import{asDivinerInstance as Pe,isDivinerInstance as Se}from"@xyo-network/diviner-model";import{ArchivistCard as we}from"@xyo-network/react-archivist";import{DivinerCard as Fe,ModuleCard as Be}from"@xyo-network/react-module";import{jsx as A}from"react/jsx-runtime";var Et=({mod:e})=>{switch(!0){case Re(e):return A(we,{mod:be(e)});case Se(e):return A(Fe,{mod:Pe(e)});default:return A(Be,{mod:e})}};import{Button as yt}from"@mui/material";import{useRef as Ct}from"react";import{createContextEx as ke}from"@xyo-network/react-shared";var b=ke();import{useEffect as De,useState as Te}from"react";import{jsx as Ae}from"react/jsx-runtime";var $=({children:e,defaultInstance:o})=>{let[t,n]=Te(o);return De(()=>{n(o)},[o]),Ae(b.Provider,{value:{cy:t,provided:!0,setCy:n},children:e})};import{useContextEx as Ge}from"@xyo-network/react-shared";var m=(e=!1)=>Ge(b,"CytoscapeInstance",e);import{useAsyncEffect as je}from"@xylabs/react-async-effect";import{isNodeInstance as eo}from"@xyo-network/node-model";import{useEffect as oo,useState as to}from"react";import{exists as Qe}from"@xylabs/exists";import{renderToStaticMarkup as Le}from"react-dom/server";var He="data:image/svg+xml,",U=(e,o)=>{let t=Le(e),r=new DOMParser().parseFromString(t,"text/html").querySelectorAll("svg")[0];return r&&(r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.setAttribute("height","100"),r.style.fill=o??"black"),`${He}${window.encodeURIComponent(r.outerHTML)}`};var V=()=>({archivist:"",bridge:"",diviner:"",module:"",node:"",sentinel:"",witness:""});var Q={centerGraph:!1,convergenceThreshold:.01,name:"cola"};var R={concentric:function(e){return e.degree(!1)},levelWidth:function(){return 2},minNodeSpacing:75,name:"concentric"};import{isArchivistInstance as We}from"@xyo-network/archivist-model";import{isBridgeInstance as ze}from"@xyo-network/bridge-model";import{isDivinerInstance as Oe}from"@xyo-network/diviner-model";import{isNodeInstance as $e}from"@xyo-network/node-model";import{isSentinelInstance as Ue}from"@xyo-network/sentinel-model";import{isWitnessModule as Ve}from"@xyo-network/witness-model";var q=e=>{let o="module";return e&&(We(e)?o="archivist":ze(e)?o="bridge":Oe(e)?o="diviner":$e(e)?o="node":Ue(e)?o="sentinel":Ve(e)?o="witness":o="module"),o};var f={MaxNameLength:20,buildEdge(e,o,t){return{data:{id:`${e.data.id}/${o.data.id}`,source:e.data.id,target:o.data.id,...t}}},async buildElements(e){let o=await f.recurseNodes(e);return await this.buildElementsFromInfo(o,void 0,["activeNode"])},async buildElementsFromInfo(e,o,t=[]){let n=f.buildNode(e.mod,{childCount:e.children.length,depth:e.depth},t),r=o?f.buildEdge(o,n,{depth:e.depth,siblingCount:e.children.length}):void 0,s=[n];r&&s.push(r);for(let i of e.children)s.push(...await this.buildElementsFromInfo(i,n));return s},buildNode(e,o,t){let{address:n,id:r}=e;return{classes:t,data:{address:n,id:n,name:r,type:q(e),...o}}},buildRootNode:e=>f.buildNode(e,{},["activeNode"]),normalizeName(e){if(e)return e.length>this.MaxNameLength?`${e.slice(0,20)}...`:e},async recurseNodes(e,o=10,t=1){let n={children:[],depth:t,mod:e};if(o>0){let r=await e.resolve("*",{direction:"down",maxDepth:1});n.children=(await Promise.all(r.map(async s=>{if(s.address!==e.address)return await this.recurseNodes(s,o-1,t+1)}))).filter(Qe)}return n}};import{BubbleChartRounded as qe,Hub as Je,InsertLinkRounded as Ke,Inventory2Rounded as Xe,QuestionMarkRounded as Ye,TimerRounded as Ze,VisibilityRounded as _e}from"@mui/icons-material";var J={archivist:Xe,bridge:Ke,diviner:qe,module:Ye,node:Je,sentinel:Ze,witness:_e};var K=(e,o)=>({selector:"node[name]",style:{color:e,"font-family":"Lexend Deca, Helvetica, sans-serif","font-size":12,"overlay-padding":"6px","text-halign":"center","text-outline-color":o,"text-outline-width":"1px","text-valign":"top"}}),X=(e,o,t=!1)=>({selector:"node",style:{"background-color":o,"background-height":"75%","background-image":n=>e[n.data("type")],"background-width":"24",label:t?void 0:"data(name)",shape:"round-rectangle"}}),Y=e=>({selector:".activeNode",style:{"background-color":e}}),Z=(e,o)=>({selector:"edge",style:{"curve-style":"bezier","line-color":e,"line-opacity":.1,"target-arrow-color":o,"target-arrow-shape":"triangle",width:3}});var g=e=>{let[o,t]=to([]);return je(async()=>{let n=e?.deref();if(n){let r=await f.buildElements(n)??[];t(r)}},[e]),oo(()=>{let n,r;return e&&eo(e)&&(n=e.on("moduleAttached",async()=>{let s=await f.buildElements(e)??[];t(s)}),r=e.on("moduleDetached",async()=>{let s=await f.buildElements(e)??[];t(s)})),()=>{n?.(),r?.()}},[e]),o};import{useCallback as no,useEffect as _,useState as ro}from"react";var j=e=>{let{cy:o}=m(!0),[t,n]=ro(),r=no(s=>{s.on("mouseover tap",()=>{n(s)})},[]);return _(()=>{e&&e.nodes().forEach(r)},[r,e]),_(()=>{o?.deref()?.ready(()=>{o?.deref()?.nodes().forEach(r)})},[o,r]),[t,n]};import{useWeakModuleFromNode as so}from"@xyo-network/react-node";import{useMemo as io}from"react";var ee=e=>{let o=io(()=>{let{address:r}=e?.data()??{};return r},[e]),[t]=so(o);return g(t)};import{useEffect as lo,useState as ao}from"react";var oe=(e=[],o)=>{let{cy:t}=m(!0),[n,r]=ao();return lo(()=>{if(e.length>1){let s=t?.deref()?.add(e);r(s),t?.deref()?.layout(Q).run()}},[t,o,e]),n};import{useState as co}from"react";var te=()=>{let[e,o]=co(),{cy:t}=m(!0),n=s=>{t?.deref()?.nodes()?.toggleClass("activeNode",!1),s.toggleClass("activeNode",!0)};return{selectedElement:e,toggleSelectedElement:s=>{let i=t?.deref()?.nodes(`[id="${s}"]`)?.[0];i&&(o(i),n(i))}}};var ne=e=>{let{selectedElement:o,toggleSelectedElement:t}=te(),n=ee(o),r=oe(n,e),[s,i]=j(r);return{hoveredNode:s,setHoveredNode:i,toggleSelectedElement:t}};import{useMemo as Co}from"react";import{useTheme as fo}from"@mui/material";import{useMemo as yo}from"react";import{useTheme as po}from"@mui/material";import{useMemo as uo}from"react";import{jsx as mo}from"react/jsx-runtime";var re=()=>{let e=po();return uo(()=>{let t=V();return Object.entries(J).reduce((n,[r,s])=>{let i=mo(s,{fontSize:"small"});return n[r]=U(i,e.palette.getContrastText(e.palette.text.primary)),n},t)},[e.palette])};var P=(e=!1)=>{let o=fo(),t=re();return yo(()=>[X(t,o.palette.primary.main,e),K(o.palette.text.primary,o.palette.getContrastText(o.palette.text.primary)),Y(o.palette.secondary.main),Z(o.palette.divider,o.palette.divider)],[t,e,o])};var S=(e,o,t)=>{let n=P(),r=t??R,s=o??n;return Co(()=>{if(e&&r&&s)return{elements:e,layout:r,style:s}},[e,t,o])};import{usePromise as xo}from"@xylabs/react-promise";import{useEffect as se,useState as go}from"react";var ie=(e,o)=>{let{cy:t}=m(),[n,r]=go(),[s]=xo(async()=>{if(n===null)return null;let l=e?.deref();if(n&&l)return await l.resolve(n)??null},[n,e]);return se(()=>{let l=new ResizeObserver(()=>{if(n===null)setTimeout(()=>{t?.deref()?.center()},100);else if(s&&t){let u=t?.deref()?.nodes(`[id="${n}"]`)?.[0];setTimeout(()=>{t?.deref()?.center(u)},100)}}),d=t?.deref()?.container();return d&&l.observe(d),()=>{d&&l.unobserve(d)}},[t,n,s,e]),se(()=>{s&&o?.()},[t,n,s,o]),{mod:s,onModuleDetails:l=>{let d=t?.deref()?.nodes(`[id="${l}"]`),u=t?.deref()?.nodes(`[id="${e?.deref()?.address}"]`),x=t?.deref()?.nodes(`[id="${s?.address}"]`),C=t?.deref()?.nodes(`[id != "${l}"]`);l?(d?.toggleClass("activeNode",!0),C?.toggleClass("activeNode",!1)):(C?.toggleClass("activeNode",!1),(x?.length?x:u)?.toggleClass("activeNode",!0)),r(l)}}};import{useState as ho}from"react";var le=e=>{let[o,t]=ho(!0),n=()=>{t(l=>!l)},r=g(e),s=P(o),i=S(r,s,R);return{handleToggleLabels:n,hideLabels:o,options:i}};import w from"cytoscape";import vo from"cytoscape-cola";import No from"cytoscape-cose-bilkent";import Eo from"cytoscape-dagre";import Mo from"cytoscape-euler";import{useEffect as Io,useState as bo}from"react";import{Fragment as Ro,jsx as Po}from"react/jsx-runtime";var de=({children:e})=>{let[o,t]=bo(!1);return Io(()=>{w.use(vo),w.use(Eo),w.use(No),w.use(Mo),t(!0)},[]),Po(Ro,{children:o?e:void 0})};import{Box as So,Button as ae,ButtonGroup as wo,Card as Fo,CardHeader as Bo,Paper as ko,useTheme as Do}from"@mui/material";import{asAddress as ce}from"@xylabs/hex";import{FlexCol as F,FlexGrowRow as To,FlexRow as Ao}from"@xylabs/react-flexbox";import{Identicon as Go}from"@xylabs/react-identicon";import{useWeakModuleFromNode as Lo}from"@xyo-network/react-node";import E from"cytoscape";import Ho from"cytoscape-cola";import Wo from"cytoscape-cose-bilkent";import zo from"cytoscape-dagre";import Oo from"cytoscape-euler";import{forwardRef as $o,useEffect as G,useRef as Uo,useState as L}from"react";import{jsx as c,jsxs as B}from"react/jsx-runtime";var pe=(e,o="cola",t)=>{e?.layout({name:o,...t}).run()},Vo=(e="cola")=>{switch(e){case"dagre":{E.use(zo);break}case"euler":{E.use(Oo);break}case"cose-bilkent":{E.use(Wo);break}case"cola":{E.use(Ho);break}}},Qo=({name:e,address:o,...t})=>c(Fo,{elevation:3,...t,children:c(Bo,{avatar:c(ko,{elevation:6,sx:{bgcolor:"#fff",p:1},children:c(Go,{value:o,size:24})}),title:e,subheader:o})}),h=$o(({actions:e,children:o,node:t,layout:n,layoutOptions:r,showDetails:s,detail:i,options:l,onHover:d,...u},x)=>{let C=Do(),[a,M]=L(),k=Uo(),[D,Ee]=L(),[T,z]=L(),[Me]=Lo(T,{node:t});G(()=>{a?.on("mouseover tap",({target:v})=>{let N=v,Ie=N?.renderedBoundingBox?.();Ee(Ie);let I=N.id?.();I&&(I.includes("/")?(z(void 0),d?.()):(z(ce(I)),d?.(ce(I))))})},[d,a]);let O=()=>{a?.reset(),pe(a,n??"euler",r)};return G(()=>{let v,N=k.current;return N&&(v=E({container:N,...l}),M(v)),()=>{v?.destroy(),M(void 0)}},[l,k,r]),G(()=>{a&&(Vo(n),pe(a,n??"euler",r))},[a,r,n]),B(F,{id:"relational-graph-wrapper",ref:x,...u,children:[T&&D?c(So,{position:"absolute",top:D.y1,left:D.x1,zIndex:100,children:c(Qo,{address:T,name:Me?.deref()?.id??"Unknown"})}):null,c(Ao,{justifyContent:"start",width:"100%",children:e===null?null:e?B(wo,{children:[e,c(ae,{size:"small",variant:"contained",onClick:O,children:"Reset View"})]}):c(ae,{size:"small",variant:"contained",onClick:O,children:"Reset"})}),B(To,{width:"100%",alignItems:"start",children:[s?c(F,{height:"100%",width:"85%",children:i}):null,B(F,{justifyContent:"start",classes:"cytoscape-wrap",width:s?"15%":"100%",height:s?"50%":"100%",border:s?`1px solid ${C.palette.divider}`:void 0,children:[c(F,{alignItems:"stretch",position:"absolute",width:"100%",height:"100%",ref:k}),o]})]})]})});h.displayName="NodeRelationalGraph";var vr=h;import{useWeakProvidedNode as qo}from"@xyo-network/react-node";import{jsx as Jo}from"react/jsx-runtime";var Rr=({node:e,...o})=>{let[t]=qo(),n=g(e??t),r=S(n);return Jo(h,{alignItems:"stretch",flexGrow:1,height:"100%",options:r,...o})};import{CancelRounded as Ko}from"@mui/icons-material";import{IconButton as Xo}from"@mui/material";import{FlexGrowCol as Yo,FlexRow as Zo}from"@xylabs/react-flexbox";import{jsx as H,jsxs as _o}from"react/jsx-runtime";var ue=({children:e,onClose:o})=>_o(Yo,{alignItems:"end",justifyContent:"start",id:"module-detail",width:"100%",p:2,gap:2,children:[H(Zo,{justifyContent:"end",children:H(Xo,{onClick:o,size:"small",children:H(Ko,{})})}),e]});import{styled as et}from"@mui/material";import{FlexCol as ot}from"@xylabs/react-flexbox";import{useEffect as W,useRef as jo,useState as me}from"react";var fe=e=>{let o=jo(null),[t,n]=me(null),[r,s]=me(e?.renderedBoundingBox());return W(()=>{n(null)},[e]),W(()=>{e&&s(e.renderedBoundingBox());let i=()=>{s(e?.renderedBoundingBox())};return e?.on("position",i),()=>{e?.off("position",void 0,i)}},[e]),W(()=>{n(o.current)},[r]),{boundingBox:r,currentElement:t,ref:o}};import{Fragment as Ce,jsx as ye,jsxs as nt}from"react/jsx-runtime";var xe=({children:e,node:o})=>{let{boundingBox:t,ref:n,currentElement:r}=fe(o);return nt(Ce,{children:[ye(tt,{ref:n,left:t?.x1,height:t?.h,top:t?.y1,width:t?.w}),o?ye(Ce,{children:e?.(r)}):null]})},tt=et(ot,{name:"StyledNodeGhostElementFlexCol"})(()=>({cursor:"pointer",pointerEvents:"none",position:"absolute"}));import{CancelRounded as rt}from"@mui/icons-material";import{Button as ge,Card as st,CardActions as it,CardHeader as lt,IconButton as dt,Paper as at,Popper as ct,styled as ve}from"@mui/material";import{Identicon as pt}from"@xylabs/react-identicon";import{Fragment as ft,jsx as p,jsxs as he}from"react/jsx-runtime";var ut=({anchorEl:e,onClose:o,onModuleDetails:t,onModuleExplore:n,node:r,...s})=>{let{address:i,name:l}=r?.data()??{};return p(ft,{children:e?p(ct,{anchorEl:e,...s,children:he(st,{elevation:3,children:[p(lt,{action:o?p(dt,{size:"small",onClick:o,children:p(rt,{})}):null,avatar:p(at,{elevation:6,sx:{bgcolor:"#fff",p:1},children:p(pt,{value:i,size:24})}),title:l,subheader:i}),he(mt,{children:[t?p(ge,{onClick:()=>t?.(i),size:"small",variant:"contained",children:"Details"}):null,n?p(ge,{onClick:()=>n?.(i),size:"small",variant:"contained",children:"Explore"}):null]})]})}):null})},Ne=ve(ut,{name:"StyledComponents"})(()=>({zIndex:2})),mt=ve(it,{name:"StyledCardActions"})(()=>({display:"flex",justifyContent:"center"}));import{jsx as y}from"react/jsx-runtime";var xt=({hideActions:e,rootModule:o,disableModuleDetails:t,...n})=>{let r=Ct(null),{handleToggleLabels:s,hideLabels:i,options:l}=le(o??void 0),{hoveredNode:d,setHoveredNode:u,toggleSelectedElement:x}=ne(i),{mod:C,onModuleDetails:a}=ie(o,()=>u(void 0));return y(de,{children:y(h,{actions:C||e?null:y(yt,{size:"small",onClick:s,variant:"contained",children:"Toggle Labels"}),showDetails:!!C,detail:y(ue,{onClose:()=>a(null)}),options:l,ref:r,width:"100%",...n,children:y(xe,{node:d,children:M=>y(Ne,{anchorEl:M,container:r.current,node:d,onClose:()=>u(void 0),onModuleExplore:x,onModuleDetails:t?void 0:a,placement:"top",open:!0})})})})},rs=e=>y($,{children:y(xt,{...e})});export{Q as ColaLayout,R as ConcentricLayout,J as CyIconSet,f as CytoscapeElements,b as CytoscapeInstanceContext,$ as CytoscapeInstanceProvider,Z as EdgeStyled,Et as ModuleCardParser,xt as ModuleGraphFlexBox,rs as ModuleGraphFlexBoxWithProvider,X as Node,Y as NodeAsRoot,vr as NodeRelationalGraph,h as NodeRelationalGraphFlexBox,K as NodeWithName,Rr as ProvidedNodeRenderer,U as encodeSvg,V as generateIconMap,q as parseModuleType,g as useCytoscapeElements,m as useCytoscapeInstance,S as useCytoscapeOptions,ne as useElements,ie as useModuleDetails,le as useRelationalGraphOptions};
|
|
816
2
|
//# sourceMappingURL=index.js.map
|