darabos commited on
Commit
c1a1d02
·
1 Parent(s): 4237e78

Start adding graph viz.

Browse files
web/package-lock.json CHANGED
@@ -9,7 +9,9 @@
9
  "version": "0.0.0",
10
  "dependencies": {
11
  "@xyflow/svelte": "^0.0.40",
12
- "fuse.js": "^7.0.0"
 
 
13
  },
14
  "devDependencies": {
15
  "@sveltejs/vite-plugin-svelte": "^3.0.2",
@@ -1331,6 +1333,14 @@
1331
  "@types/estree": "^1.0.0"
1332
  }
1333
  },
 
 
 
 
 
 
 
 
1334
  "node_modules/fast-glob": {
1335
  "version": "3.3.2",
1336
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -1431,6 +1441,32 @@
1431
  "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1432
  "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
1433
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1434
  "node_modules/import-fresh": {
1435
  "version": "3.3.0",
1436
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -1643,6 +1679,11 @@
1643
  "node": ">=0.10.0"
1644
  }
1645
  },
 
 
 
 
 
1646
  "node_modules/once": {
1647
  "version": "1.4.0",
1648
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1869,6 +1910,15 @@
1869
  "rimraf": "^2.5.2"
1870
  }
1871
  },
 
 
 
 
 
 
 
 
 
1872
  "node_modules/sorcery": {
1873
  "version": "0.11.0",
1874
  "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
@@ -3014,6 +3064,11 @@
3014
  "@types/estree": "^1.0.0"
3015
  }
3016
  },
 
 
 
 
 
3017
  "fast-glob": {
3018
  "version": "3.3.2",
3019
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -3089,6 +3144,27 @@
3089
  "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
3090
  "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
3091
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3092
  "import-fresh": {
3093
  "version": "3.3.0",
3094
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -3241,6 +3317,11 @@
3241
  "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
3242
  "dev": true
3243
  },
 
 
 
 
 
3244
  "once": {
3245
  "version": "1.4.0",
3246
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -3385,6 +3466,15 @@
3385
  "rimraf": "^2.5.2"
3386
  }
3387
  },
 
 
 
 
 
 
 
 
 
3388
  "sorcery": {
3389
  "version": "0.11.0",
3390
  "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
 
9
  "version": "0.0.0",
10
  "dependencies": {
11
  "@xyflow/svelte": "^0.0.40",
12
+ "fuse.js": "^7.0.0",
13
+ "graphology": "^0.25.4",
14
+ "sigma": "^3.0.0-beta.17"
15
  },
16
  "devDependencies": {
17
  "@sveltejs/vite-plugin-svelte": "^3.0.2",
 
1333
  "@types/estree": "^1.0.0"
1334
  }
1335
  },
1336
+ "node_modules/events": {
1337
+ "version": "3.3.0",
1338
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
1339
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
1340
+ "engines": {
1341
+ "node": ">=0.8.x"
1342
+ }
1343
+ },
1344
  "node_modules/fast-glob": {
1345
  "version": "3.3.2",
1346
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
 
1441
  "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1442
  "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
1443
  },
1444
+ "node_modules/graphology": {
1445
+ "version": "0.25.4",
1446
+ "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz",
1447
+ "integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==",
1448
+ "dependencies": {
1449
+ "events": "^3.3.0",
1450
+ "obliterator": "^2.0.2"
1451
+ },
1452
+ "peerDependencies": {
1453
+ "graphology-types": ">=0.24.0"
1454
+ }
1455
+ },
1456
+ "node_modules/graphology-types": {
1457
+ "version": "0.24.7",
1458
+ "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.7.tgz",
1459
+ "integrity": "sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==",
1460
+ "peer": true
1461
+ },
1462
+ "node_modules/graphology-utils": {
1463
+ "version": "2.5.2",
1464
+ "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz",
1465
+ "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==",
1466
+ "peerDependencies": {
1467
+ "graphology-types": ">=0.23.0"
1468
+ }
1469
+ },
1470
  "node_modules/import-fresh": {
1471
  "version": "3.3.0",
1472
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
 
1679
  "node": ">=0.10.0"
1680
  }
1681
  },
1682
+ "node_modules/obliterator": {
1683
+ "version": "2.0.4",
1684
+ "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
1685
+ "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ=="
1686
+ },
1687
  "node_modules/once": {
1688
  "version": "1.4.0",
1689
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 
1910
  "rimraf": "^2.5.2"
1911
  }
1912
  },
1913
+ "node_modules/sigma": {
1914
+ "version": "3.0.0-beta.17",
1915
+ "resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.0-beta.17.tgz",
1916
+ "integrity": "sha512-1kwQnU+OQNc1bbgr10cpGRr8qV9qkqmHKn+ApNwdogM6uUXwPS8HSQzLEVsQzMScugC3k8aSAw1DszAsAHskaA==",
1917
+ "dependencies": {
1918
+ "events": "^3.3.0",
1919
+ "graphology-utils": "^2.5.2"
1920
+ }
1921
+ },
1922
  "node_modules/sorcery": {
1923
  "version": "0.11.0",
1924
  "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
 
3064
  "@types/estree": "^1.0.0"
3065
  }
3066
  },
3067
+ "events": {
3068
+ "version": "3.3.0",
3069
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
3070
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
3071
+ },
3072
  "fast-glob": {
3073
  "version": "3.3.2",
3074
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
 
3144
  "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
3145
  "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
3146
  },
3147
+ "graphology": {
3148
+ "version": "0.25.4",
3149
+ "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz",
3150
+ "integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==",
3151
+ "requires": {
3152
+ "events": "^3.3.0",
3153
+ "obliterator": "^2.0.2"
3154
+ }
3155
+ },
3156
+ "graphology-types": {
3157
+ "version": "0.24.7",
3158
+ "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.7.tgz",
3159
+ "integrity": "sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==",
3160
+ "peer": true
3161
+ },
3162
+ "graphology-utils": {
3163
+ "version": "2.5.2",
3164
+ "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz",
3165
+ "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==",
3166
+ "requires": {}
3167
+ },
3168
  "import-fresh": {
3169
  "version": "3.3.0",
3170
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
 
3317
  "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
3318
  "dev": true
3319
  },
3320
+ "obliterator": {
3321
+ "version": "2.0.4",
3322
+ "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
3323
+ "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ=="
3324
+ },
3325
  "once": {
3326
  "version": "1.4.0",
3327
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 
3466
  "rimraf": "^2.5.2"
3467
  }
3468
  },
3469
+ "sigma": {
3470
+ "version": "3.0.0-beta.17",
3471
+ "resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.0-beta.17.tgz",
3472
+ "integrity": "sha512-1kwQnU+OQNc1bbgr10cpGRr8qV9qkqmHKn+ApNwdogM6uUXwPS8HSQzLEVsQzMScugC3k8aSAw1DszAsAHskaA==",
3473
+ "requires": {
3474
+ "events": "^3.3.0",
3475
+ "graphology-utils": "^2.5.2"
3476
+ }
3477
+ },
3478
  "sorcery": {
3479
  "version": "0.11.0",
3480
  "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
web/package.json CHANGED
@@ -20,6 +20,8 @@
20
  },
21
  "dependencies": {
22
  "@xyflow/svelte": "^0.0.40",
23
- "fuse.js": "^7.0.0"
 
 
24
  }
25
  }
 
20
  },
21
  "dependencies": {
22
  "@xyflow/svelte": "^0.0.40",
23
+ "fuse.js": "^7.0.0",
24
+ "graphology": "^0.25.4",
25
+ "sigma": "^3.0.0-beta.17"
26
  }
27
  }
web/src/LynxKiteFlow.svelte CHANGED
@@ -12,13 +12,15 @@
12
  type Node,
13
  type Edge,
14
  } from '@xyflow/svelte';
15
- import LynxKiteNode from './LynxKiteNode.svelte';
 
16
  import NodeSearch from './NodeSearch.svelte';
17
  import '@xyflow/svelte/dist/style.css';
18
 
19
  const { screenToFlowPosition } = useSvelteFlow();
20
  const nodeTypes: NodeTypes = {
21
- basic: LynxKiteNode,
 
22
  };
23
 
24
  const nodes = writable<Node[]>([
@@ -37,6 +39,13 @@
37
  position: { x: -300, y: 0 },
38
  sourcePosition: Position.Right,
39
  },
 
 
 
 
 
 
 
40
  ]);
41
 
42
  const edges = writable<Edge[]>([
@@ -48,6 +57,14 @@
48
  type: MarkerType.ArrowClosed,
49
  },
50
  },
 
 
 
 
 
 
 
 
51
  ]);
52
 
53
  function closeNodeSearch() {
@@ -97,12 +114,12 @@
97
  {
98
  type: 'basic',
99
  data: { title: 'Export Parquet', params: { filename: '/tmp/x.parquet' } },
100
- sourcePosition: Position.Right,
101
  },
102
  {
103
- type: 'basic',
104
- data: { title: 'Export CSV', params: { filename: '/tmp/x.csv' } },
105
- sourcePosition: Position.Right,
106
  },
107
  {
108
  type: 'basic',
 
12
  type Node,
13
  type Edge,
14
  } from '@xyflow/svelte';
15
+ import NodeWithParams from './NodeWithParams.svelte';
16
+ import NodeWithGraphVisualization from './NodeWithGraphVisualization.svelte';
17
  import NodeSearch from './NodeSearch.svelte';
18
  import '@xyflow/svelte/dist/style.css';
19
 
20
  const { screenToFlowPosition } = useSvelteFlow();
21
  const nodeTypes: NodeTypes = {
22
+ basic: NodeWithParams,
23
+ graphviz: NodeWithGraphVisualization,
24
  };
25
 
26
  const nodes = writable<Node[]>([
 
39
  position: { x: -300, y: 0 },
40
  sourcePosition: Position.Right,
41
  },
42
+ {
43
+ id: '4',
44
+ type: 'graphviz',
45
+ data: { title: 'Visualize graph', params: {} },
46
+ position: { x: 300, y: 0 },
47
+ targetPosition: Position.Left,
48
+ },
49
  ]);
50
 
51
  const edges = writable<Edge[]>([
 
57
  type: MarkerType.ArrowClosed,
58
  },
59
  },
60
+ {
61
+ id: '3-4',
62
+ source: '1',
63
+ target: '4',
64
+ markerEnd: {
65
+ type: MarkerType.ArrowClosed,
66
+ },
67
+ },
68
  ]);
69
 
70
  function closeNodeSearch() {
 
114
  {
115
  type: 'basic',
116
  data: { title: 'Export Parquet', params: { filename: '/tmp/x.parquet' } },
117
+ targetPosition: Position.Left,
118
  },
119
  {
120
+ type: 'graphviz',
121
+ data: { title: 'Visualize graph', params: {} },
122
+ targetPosition: Position.Left,
123
  },
124
  {
125
  type: 'basic',
web/src/LynxKiteNode.svelte CHANGED
@@ -32,17 +32,7 @@
32
  {data.title}
33
  </div>
34
  {#if expanded}
35
- {#each Object.entries(data.params) as [name, value]}
36
- <div class="param">
37
- <label>
38
- {name}<br>
39
- <input
40
- value={value}
41
- on:input={(evt) => updateNodeData(id, { params: { ...data.params, [name]: evt.currentTarget.value } })}
42
- />
43
- </label>
44
- </div>
45
- {/each}
46
  {/if}
47
  {#if sourcePosition}
48
  <Handle type="source" position={sourcePosition} />
@@ -54,16 +44,6 @@
54
  </div>
55
 
56
  <style>
57
- .param {
58
- padding: 8px;
59
- }
60
- .param label {
61
- font-size: 12px;
62
- display: block;
63
- }
64
- .param input {
65
- width: calc(100% - 8px);
66
- }
67
  .node-container {
68
  padding: 8px;
69
  }
 
32
  {data.title}
33
  </div>
34
  {#if expanded}
35
+ <slot />
 
 
 
 
 
 
 
 
 
 
36
  {/if}
37
  {#if sourcePosition}
38
  <Handle type="source" position={sourcePosition} />
 
44
  </div>
45
 
46
  <style>
 
 
 
 
 
 
 
 
 
 
47
  .node-container {
48
  padding: 8px;
49
  }
web/src/NodeWithGraphVisualization.svelte ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts">
2
+ import type { ComponentProps } from 'svelte';
3
+ import { Handle, type NodeProps, useSvelteFlow } from '@xyflow/svelte';
4
+ import LynxKiteNode from './LynxKiteNode.svelte';
5
+ type $$Props = NodeProps;
6
+ export let id: $$Props['id'];
7
+ export let data: $$Props['data'];
8
+ const { updateNodeData } = useSvelteFlow();
9
+ </script>
10
+
11
+ <LynxKiteNode id={id} data={data} {...$$restProps}>
12
+ Graph here.
13
+ </LynxKiteNode>
14
+ <style>
15
+ .param {
16
+ padding: 8px;
17
+ }
18
+ .param label {
19
+ font-size: 12px;
20
+ display: block;
21
+ }
22
+ .param input {
23
+ width: calc(100% - 8px);
24
+ }
25
+ </style>
web/src/NodeWithParams.svelte ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts">
2
+ import type { ComponentProps } from 'svelte';
3
+ import { Handle, type NodeProps, useSvelteFlow } from '@xyflow/svelte';
4
+ import LynxKiteNode from './LynxKiteNode.svelte';
5
+ type $$Props = NodeProps;
6
+ export let id: $$Props['id'];
7
+ export let data: $$Props['data'];
8
+ const { updateNodeData } = useSvelteFlow();
9
+ </script>
10
+
11
+ <LynxKiteNode id={id} data={data} {...$$restProps}>
12
+ {#each Object.entries(data.params) as [name, value]}
13
+ <div class="param">
14
+ <label>
15
+ {name}<br>
16
+ <input
17
+ value={value}
18
+ on:input={(evt) => updateNodeData(id, { params: { ...data.params, [name]: evt.currentTarget.value } })}
19
+ />
20
+ </label>
21
+ </div>
22
+ {/each}
23
+ </LynxKiteNode>
24
+ <style>
25
+ .param {
26
+ padding: 8px;
27
+ }
28
+ .param label {
29
+ font-size: 12px;
30
+ display: block;
31
+ }
32
+ .param input {
33
+ width: calc(100% - 8px);
34
+ }
35
+ </style>