@vunk/graph 0.0.3 → 0.0.4

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.
@@ -1,6 +1,8 @@
1
1
  import VkGraph from './src/index.vue';
2
2
  export * as __VkGraph from './src/types';
3
+ export { useEdgeReducer } from './src/useEdgeReducer';
3
4
  export { useGraph } from './src/useGraph';
5
+ export { useNodeReducer } from './src/useNodeReducer';
4
6
  export { useSigma } from './src/useSigma';
5
7
  export { VkGraph, };
6
8
  export default VkGraph;
@@ -1,4 +1,4 @@
1
- import { provide, inject, defineComponent, ref, onMounted, onBeforeUnmount, createElementBlock, openBlock, createElementVNode, createVNode, unref, withCtx, createBlock, createCommentVNode, renderSlot } from 'vue';
1
+ import { shallowReactive, provide, inject, defineComponent, ref, onMounted, onBeforeUnmount, createElementBlock, openBlock, createElementVNode, createVNode, unref, withCtx, createBlock, createCommentVNode, renderSlot } from 'vue';
2
2
  import { VkLabelProvider } from '@vunk/graph/components/label';
3
3
  import { VkPopupProvider } from '@vunk/graph/components/popup';
4
4
  import Sigma from 'sigma';
@@ -17,20 +17,96 @@ const emits = {
17
17
  load: (e) => e
18
18
  };
19
19
 
20
- const key$1 = "vunk-graph";
20
+ const key$3 = "vunk-graph-edge_reducer";
21
+ function initEdgeReducer() {
22
+ const middlewares = shallowReactive([]);
23
+ function addMiddleware(middleware) {
24
+ middlewares.push(middleware);
25
+ }
26
+ function removeMiddleware(middleware) {
27
+ const index = middlewares.indexOf(middleware);
28
+ if (index > -1) {
29
+ middlewares.splice(index, 1);
30
+ }
31
+ }
32
+ function edgeReducer(edge, data) {
33
+ let currentData = { ...data };
34
+ for (const middleware of middlewares) {
35
+ const res = middleware(edge, currentData);
36
+ if (res) {
37
+ currentData = { ...currentData, ...res };
38
+ }
39
+ }
40
+ return currentData;
41
+ }
42
+ const context = {
43
+ edgeReducer,
44
+ addMiddleware,
45
+ removeMiddleware
46
+ };
47
+ provide(key$3, context);
48
+ return context;
49
+ }
50
+ function useEdgeReducer() {
51
+ const edgeReducerContext = inject(key$3);
52
+ if (!edgeReducerContext) {
53
+ throw new Error("EdgeReducer is not provided");
54
+ }
55
+ return edgeReducerContext;
56
+ }
57
+
58
+ const key$2 = "vunk-graph";
21
59
  function initGraph() {
22
60
  const graph = new Graph();
23
- provide(key$1, graph);
61
+ provide(key$2, graph);
24
62
  return graph;
25
63
  }
26
64
  function useGraph() {
27
- const graph = inject(key$1);
65
+ const graph = inject(key$2);
28
66
  if (!graph) {
29
67
  throw new Error("Graph is not provided");
30
68
  }
31
69
  return graph;
32
70
  }
33
71
 
72
+ const key$1 = "vunk-graph-node_reducer";
73
+ function initNodeReducer() {
74
+ const middlewares = shallowReactive([]);
75
+ function addMiddleware(middleware) {
76
+ middlewares.push(middleware);
77
+ }
78
+ function removeMiddleware(middleware) {
79
+ const index = middlewares.indexOf(middleware);
80
+ if (index > -1) {
81
+ middlewares.splice(index, 1);
82
+ }
83
+ }
84
+ function nodeReducer(node, data) {
85
+ let currentData = { ...data };
86
+ for (const middleware of middlewares) {
87
+ const res = middleware(node, currentData);
88
+ if (res) {
89
+ currentData = { ...currentData, ...res };
90
+ }
91
+ }
92
+ return currentData;
93
+ }
94
+ const context = {
95
+ nodeReducer,
96
+ addMiddleware,
97
+ removeMiddleware
98
+ };
99
+ provide(key$1, context);
100
+ return context;
101
+ }
102
+ function useNodeReducer() {
103
+ const nodeReducerContext = inject(key$1);
104
+ if (!nodeReducerContext) {
105
+ throw new Error("NodeReducer is not provided");
106
+ }
107
+ return nodeReducerContext;
108
+ }
109
+
34
110
  const key = "vunk-graph-sigma";
35
111
  function provideSigma(sigma) {
36
112
  provide(key, sigma);
@@ -54,6 +130,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
54
130
  setup(__props, { emit: __emit }) {
55
131
  const props = __props;
56
132
  const emit = __emit;
133
+ const { nodeReducer } = initNodeReducer();
134
+ const { edgeReducer } = initEdgeReducer();
57
135
  const elRef = ref();
58
136
  const graph = initGraph();
59
137
  const ready = ref(false);
@@ -61,6 +139,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
61
139
  const sigma = new Sigma(graph, elRef.value, {
62
140
  renderEdgeLabels: true,
63
141
  enableEdgeEvents: true,
142
+ nodeReducer,
143
+ edgeReducer,
64
144
  ...props.defaultOptions
65
145
  });
66
146
  provideSigma(sigma);
@@ -109,4 +189,4 @@ _sfc_main.install = (app) => {
109
189
  app.component(_sfc_main.name || "VkGraph", _sfc_main);
110
190
  };
111
191
 
112
- export { _sfc_main as VkGraph, types as __VkGraph, _sfc_main as default, useGraph, useSigma };
192
+ export { _sfc_main as VkGraph, types as __VkGraph, _sfc_main as default, useEdgeReducer, useGraph, useNodeReducer, useSigma };
@@ -14,6 +14,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
14
14
  onLoad?: ((e: import("./types").LoadEvent) => any) | undefined;
15
15
  }> & {}>;
16
16
  emit: (event: "load", e: import("./types").LoadEvent) => void;
17
+ nodeReducer: (node: string, data: any) => Partial<import("sigma/types").NodeDisplayData>;
18
+ edgeReducer: (edge: string, data: any) => Partial<import("sigma/types").EdgeDisplayData>;
17
19
  elRef: Ref<HTMLDivElement, HTMLDivElement>;
18
20
  graph: import("graphology").default<import("graphology-types").Attributes, import("graphology-types").Attributes, import("graphology-types").Attributes>;
19
21
  ready: Ref<boolean, boolean>;
@@ -0,0 +1,13 @@
1
+ import type { EdgeDisplayData } from 'sigma/types';
2
+ type Middleware = (edge: string, data: any) => Partial<EdgeDisplayData> | null;
3
+ export declare function initEdgeReducer(): {
4
+ edgeReducer: (edge: string, data: any) => Partial<EdgeDisplayData>;
5
+ addMiddleware: (middleware: Middleware) => void;
6
+ removeMiddleware: (middleware: Middleware) => void;
7
+ };
8
+ export declare function useEdgeReducer(): {
9
+ edgeReducer: (edge: string, data: any) => Partial<EdgeDisplayData> | null;
10
+ addMiddleware: (middleware: Middleware) => void;
11
+ removeMiddleware: (middleware: Middleware) => void;
12
+ };
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { NodeDisplayData } from 'sigma/types';
2
+ type Middleware = (node: string, data: any) => Partial<NodeDisplayData> | null;
3
+ export declare function initNodeReducer(): {
4
+ nodeReducer: (node: string, data: any) => Partial<NodeDisplayData>;
5
+ addMiddleware: (middleware: Middleware) => void;
6
+ removeMiddleware: (middleware: Middleware) => void;
7
+ };
8
+ export declare function useNodeReducer(): {
9
+ nodeReducer: (node: string, data: any) => Partial<NodeDisplayData> | null;
10
+ addMiddleware: (middleware: Middleware) => void;
11
+ removeMiddleware: (middleware: Middleware) => void;
12
+ };
13
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, reactive, watch, onMounted, onBeforeUnmount, createBlock, createCommentVNode, openBlock, unref, withCtx, renderSlot } from 'vue';
2
2
  import { ContextMenu } from '@vunk/graph/components/context-menu';
3
- import { useSigma, useGraph } from '@vunk/graph/components/graph';
3
+ import { useSigma, useGraph, useEdgeReducer } from '@vunk/graph/components/graph';
4
4
 
5
5
  const props = {
6
6
  /**
@@ -61,6 +61,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
61
61
  const emit = __emit;
62
62
  const sigma = useSigma();
63
63
  const graph = useGraph();
64
+ const { addMiddleware, removeMiddleware } = useEdgeReducer();
64
65
  const contextmenuState = reactive({
65
66
  edge: "",
66
67
  show: false,
@@ -69,34 +70,25 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
69
70
  y: 0
70
71
  }
71
72
  });
72
- let oldNodeReducer = null;
73
- let oldEdgeReducer = null;
74
- let isApplied = false;
75
- watch(() => props.modelValue, (edgeId) => {
76
- if (edgeId && graph.hasEdge(edgeId)) {
77
- if (!isApplied) {
78
- oldNodeReducer = sigma.getSetting("nodeReducer");
79
- oldEdgeReducer = sigma.getSetting("edgeReducer");
80
- isApplied = true;
81
- }
82
- sigma.setSetting("edgeReducer", (edge, data) => {
83
- const baseData = oldEdgeReducer ? oldEdgeReducer(edge, data) : data;
84
- if (edge === edgeId) {
85
- const res = { ...baseData, zIndex: 10, forceLabel: true };
86
- if (props.activeColor) {
87
- res.color = props.activeColor;
88
- }
89
- return res;
90
- }
91
- return baseData;
92
- });
93
- } else {
94
- if (isApplied) {
95
- sigma.setSetting("nodeReducer", oldNodeReducer);
96
- sigma.setSetting("edgeReducer", oldEdgeReducer);
97
- isApplied = false;
73
+ function edgeMiddleware(edge) {
74
+ const edgeId = props.modelValue;
75
+ if (edgeId && graph.hasEdge(edgeId) && edge === edgeId) {
76
+ const res = { zIndex: 10, forceLabel: true };
77
+ if (props.activeColor) {
78
+ res.color = props.activeColor;
98
79
  }
80
+ return res;
99
81
  }
82
+ return null;
83
+ }
84
+ watch(() => props.modelValue, () => {
85
+ sigma.refresh();
86
+ });
87
+ onMounted(() => {
88
+ addMiddleware(edgeMiddleware);
89
+ });
90
+ onBeforeUnmount(() => {
91
+ removeMiddleware(edgeMiddleware);
100
92
  });
101
93
  let enterTimer = null;
102
94
  let leaveTimer = null;
@@ -128,10 +120,6 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
128
120
  clearTimeout(leaveTimer);
129
121
  sigma.off("enterEdge", enterHandler);
130
122
  sigma.off("leaveEdge", leaveHandler);
131
- if (isApplied) {
132
- sigma.setSetting("nodeReducer", oldNodeReducer);
133
- sigma.setSetting("edgeReducer", oldEdgeReducer);
134
- }
135
123
  });
136
124
  onMounted(() => {
137
125
  sigma.on("rightClickEdge", rightClickHandler);
@@ -56,6 +56,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
56
56
  emit: ((event: "rightClick", e: import("./types").RightClickEvent) => void) & ((event: "update:modelValue", ...args: any[]) => void);
57
57
  sigma: import("sigma").default<import("graphology-types").Attributes, import("graphology-types").Attributes, import("graphology-types").Attributes>;
58
58
  graph: import("graphology").default<import("graphology-types").Attributes, import("graphology-types").Attributes, import("graphology-types").Attributes>;
59
+ addMiddleware: (middleware: (edge: string, data: any) => Partial<import("sigma/types").EdgeDisplayData> | null) => void;
60
+ removeMiddleware: (middleware: (edge: string, data: any) => Partial<import("sigma/types").EdgeDisplayData> | null) => void;
59
61
  contextmenuState: {
60
62
  edge: string;
61
63
  show: boolean;
@@ -64,9 +66,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
64
66
  y: number;
65
67
  };
66
68
  };
67
- oldNodeReducer: any;
68
- oldEdgeReducer: any;
69
- isApplied: boolean;
69
+ edgeMiddleware: (edge: string) => any;
70
70
  enterTimer: any;
71
71
  leaveTimer: any;
72
72
  enterHandler: ({ edge }: {
@@ -1,4 +1,4 @@
1
- import { useSigma } from '@vunk/graph/composables';
1
+ import { useSigma, useNodeReducer, useEdgeReducer } from '@vunk/graph/composables';
2
2
  import { defineComponent, watch, onMounted, onUnmounted, renderSlot } from 'vue';
3
3
  import { _ as _export_sfc } from '../_plugin-vue_export-helper.mjs';
4
4
 
@@ -43,52 +43,49 @@ var _sfc_main = defineComponent({
43
43
  setup(props2, { emit }) {
44
44
  const sigma = useSigma();
45
45
  const graph = sigma.getGraph();
46
- let oldNodeReducer = null;
47
- let oldEdgeReducer = null;
48
- let isApplied = false;
49
- watch(() => props2.modelValue, (nodeId) => {
50
- if (nodeId) {
51
- if (!isApplied) {
52
- oldNodeReducer = sigma.getSetting("nodeReducer");
53
- oldEdgeReducer = sigma.getSetting("edgeReducer");
54
- isApplied = true;
55
- }
56
- const hoveredColor = sigma.getNodeDisplayData(nodeId)?.color || "";
57
- sigma.setSetting("nodeReducer", (node, data) => {
58
- const baseData = oldNodeReducer ? oldNodeReducer(node, data) : data;
59
- if (node === nodeId) {
60
- return { ...baseData, zIndex: 3 };
61
- }
62
- if (graph.hasEdge(node, nodeId) || graph.hasEdge(nodeId, node)) {
63
- return { ...baseData, zIndex: 2 };
64
- }
65
- return {
66
- ...baseData,
67
- zIndex: 0,
68
- label: "",
69
- color: props2.nodeFadeColor,
70
- highlighted: false
71
- };
72
- });
73
- sigma.setSetting("edgeReducer", (edge, data) => {
74
- const baseData = oldEdgeReducer ? oldEdgeReducer(edge, data) : data;
75
- if (graph.hasExtremity(edge, nodeId)) {
76
- return { ...baseData, color: hoveredColor, zIndex: 10 };
77
- }
78
- return {
79
- ...baseData,
80
- color: props2.edgeFadeColor,
81
- label: "",
82
- zIndex: 0
83
- };
84
- });
85
- } else {
86
- if (isApplied) {
87
- sigma.setSetting("nodeReducer", oldNodeReducer);
88
- sigma.setSetting("edgeReducer", oldEdgeReducer);
89
- isApplied = false;
90
- }
46
+ const { addMiddleware: addNodeMiddleware, removeMiddleware: removeNodeMiddleware } = useNodeReducer();
47
+ const { addMiddleware: addEdgeMiddleware, removeMiddleware: removeEdgeMiddleware } = useEdgeReducer();
48
+ const nodeMiddleware = (node) => {
49
+ const nodeId = props2.modelValue;
50
+ if (!nodeId)
51
+ return null;
52
+ if (node === nodeId) {
53
+ return { zIndex: 3 };
91
54
  }
55
+ if (graph.hasEdge(node, nodeId) || graph.hasEdge(nodeId, node)) {
56
+ return { zIndex: 2 };
57
+ }
58
+ return {
59
+ zIndex: 0,
60
+ label: "",
61
+ color: props2.nodeFadeColor,
62
+ highlighted: false
63
+ };
64
+ };
65
+ const edgeMiddleware = (edge) => {
66
+ const nodeId = props2.modelValue;
67
+ if (!nodeId)
68
+ return null;
69
+ const hoveredColor = sigma.getNodeDisplayData(nodeId)?.color || "";
70
+ if (graph.hasExtremity(edge, nodeId)) {
71
+ return { color: hoveredColor, zIndex: 10 };
72
+ }
73
+ return {
74
+ color: props2.edgeFadeColor,
75
+ label: "",
76
+ zIndex: 0
77
+ };
78
+ };
79
+ watch(() => props2.modelValue, () => {
80
+ sigma.refresh();
81
+ });
82
+ onMounted(() => {
83
+ addNodeMiddleware(nodeMiddleware);
84
+ addEdgeMiddleware(edgeMiddleware);
85
+ });
86
+ onUnmounted(() => {
87
+ removeNodeMiddleware(nodeMiddleware);
88
+ removeEdgeMiddleware(edgeMiddleware);
92
89
  });
93
90
  let timer = null;
94
91
  const enterHandler = ({ node }) => {
@@ -108,10 +105,8 @@ var _sfc_main = defineComponent({
108
105
  clearTimeout(timer);
109
106
  sigma.off("enterNode", enterHandler);
110
107
  sigma.off("leaveNode", leaveHandler);
111
- if (isApplied) {
112
- sigma.setSetting("nodeReducer", oldNodeReducer);
113
- sigma.setSetting("edgeReducer", oldEdgeReducer);
114
- }
108
+ removeNodeMiddleware(nodeMiddleware);
109
+ removeEdgeMiddleware(edgeMiddleware);
115
110
  });
116
111
  return {};
117
112
  }
@@ -1 +1 @@
1
- export { useGraph, useSigma } from '@vunk/graph/components/graph';
1
+ export { useEdgeReducer, useGraph, useNodeReducer, useSigma } from '@vunk/graph/components/graph';
@@ -1 +1 @@
1
- export { useGraph, useSigma } from '@vunk/graph/components/graph';
1
+ export { useEdgeReducer, useGraph, useNodeReducer, useSigma } from '@vunk/graph/components/graph';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vunk/graph",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "",
5
5
  "author": "",
6
6
  "license": "ISC",