@visuallyjs/browser-ui-svelte 1.0.0
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/AreaChartComponent.svelte +37 -0
- package/BarChartComponent.svelte +37 -0
- package/BubbleChartComponent.svelte +38 -0
- package/ColorPickerComponent.svelte +94 -0
- package/ColumnChartComponent.svelte +38 -0
- package/ControlsComponent.svelte +66 -0
- package/DecoratorComponent.svelte +55 -0
- package/DefaultGroupComponent.svelte +5 -0
- package/DefaultNodeComponent.svelte +5 -0
- package/DiagramComponent.svelte +46 -0
- package/DiagramPaletteComponent.svelte +47 -0
- package/DiagramProvider.svelte +9 -0
- package/EdgeTypePickerComponent.svelte +47 -0
- package/ExportControlsComponent.svelte +94 -0
- package/GaugeChartComponent.svelte +31 -0
- package/InspectorComponent.svelte +79 -0
- package/LineChartComponent.svelte +38 -0
- package/MiniviewComponent.svelte +73 -0
- package/PaletteComponent.svelte +73 -0
- package/PieChartComponent.svelte +37 -0
- package/SankeyChartComponent.svelte +44 -0
- package/ScatterChartComponent.svelte +38 -0
- package/ShapeComponent.svelte +66 -0
- package/ShapePaletteComponent.svelte +82 -0
- package/SurfaceComponent.svelte +270 -0
- package/SurfaceProvider.svelte +9 -0
- package/WrapperComponent.svelte +27 -0
- package/XYChartComponent.svelte +32 -0
- package/components.d.ts +29 -0
- package/components.js +29 -0
- package/definitions.d.ts +841 -0
- package/definitions.js +1 -0
- package/diagram-store.d.ts +30 -0
- package/diagram-store.js +58 -0
- package/index.d.ts +27 -0
- package/index.js +33 -0
- package/inspector-store.d.ts +24 -0
- package/inspector-store.js +42 -0
- package/package.json +1 -0
- package/store-adapter.d.ts +15 -0
- package/store-adapter.js +47 -0
- package/surface-store.d.ts +41 -0
- package/surface-store.js +73 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount, type Snippet } from "svelte";
|
|
3
|
+
import {
|
|
4
|
+
BrowserUISvelteModel, internal_createDiagramContext,
|
|
5
|
+
newInstance,
|
|
6
|
+
type SurfaceComponentProps
|
|
7
|
+
} from "./index";
|
|
8
|
+
import {
|
|
9
|
+
isNode,
|
|
10
|
+
isGroup,
|
|
11
|
+
renderSurface,
|
|
12
|
+
uuid,
|
|
13
|
+
EVENT_RENDER_END,
|
|
14
|
+
CLASS_DEFAULT_GROUP,
|
|
15
|
+
CLASS_DEFAULT_NODE, Surface,
|
|
16
|
+
type BrowserElement,
|
|
17
|
+
type ObjectData,
|
|
18
|
+
Vertex,
|
|
19
|
+
partition,
|
|
20
|
+
type VertexUpdatedParams,
|
|
21
|
+
extend, EVENT_GRAPH_CLEARED, EVENT_NODE_UPDATED, EVENT_GROUP_UPDATED,
|
|
22
|
+
type NodeRemovedParams, EVENT_NODE_REMOVED,
|
|
23
|
+
type GroupRemovedParams, EVENT_GROUP_REMOVED,
|
|
24
|
+
type SurfaceOptions
|
|
25
|
+
} from "@visuallyjs/browser-ui";
|
|
26
|
+
import { internal_getSurfaceContext } from "./surface-store";
|
|
27
|
+
|
|
28
|
+
import DefaultNodeComponent from './DefaultNodeComponent.svelte'
|
|
29
|
+
import DefaultGroupComponent from './DefaultGroupComponent.svelte'
|
|
30
|
+
import WrapperComponent from "./WrapperComponent.svelte";
|
|
31
|
+
|
|
32
|
+
let container:HTMLElement;
|
|
33
|
+
|
|
34
|
+
let {
|
|
35
|
+
className,
|
|
36
|
+
renderOptions,
|
|
37
|
+
viewOptions,
|
|
38
|
+
modelOptions,
|
|
39
|
+
model,
|
|
40
|
+
data,
|
|
41
|
+
url,
|
|
42
|
+
shapeLibrary,
|
|
43
|
+
injector,
|
|
44
|
+
children
|
|
45
|
+
}:SurfaceComponentProps = $props();
|
|
46
|
+
|
|
47
|
+
const surfaceContext = internal_getSurfaceContext(false);
|
|
48
|
+
|
|
49
|
+
let surface:Surface;
|
|
50
|
+
|
|
51
|
+
export function getSurface() {
|
|
52
|
+
return surface
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function getModel() {
|
|
56
|
+
return surface?.model
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type ComponentHolder = {
|
|
60
|
+
component:any,
|
|
61
|
+
props:any,
|
|
62
|
+
vertex:Vertex,
|
|
63
|
+
def:any,
|
|
64
|
+
id:string
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const componentMap:Map<string, ComponentHolder> = new Map();
|
|
68
|
+
const id = uuid();
|
|
69
|
+
|
|
70
|
+
// list of vertices to render
|
|
71
|
+
let _vertices:Array<ComponentHolder> = []
|
|
72
|
+
|
|
73
|
+
// state wrapper around the vertex list
|
|
74
|
+
let vertexState = $state({
|
|
75
|
+
vertices:_vertices
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
// manages updating the vertex state cleanly.
|
|
79
|
+
function _updateVertexState() {
|
|
80
|
+
vertexState.vertices.length = 0
|
|
81
|
+
vertexState.vertices.push(..._vertices.slice())
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function render ( id:string, data:ObjectData, model:BrowserUISvelteModel, type:string,
|
|
85
|
+
surface:Surface, def:any, modelObject:Vertex, eventInfo:any) {
|
|
86
|
+
|
|
87
|
+
const hasComponent = def.component != null
|
|
88
|
+
let component;
|
|
89
|
+
if (!hasComponent) {
|
|
90
|
+
if (isNode(modelObject)) {
|
|
91
|
+
component = DefaultNodeComponent;
|
|
92
|
+
} else if (isGroup(modelObject)) {
|
|
93
|
+
component = DefaultGroupComponent;
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
component = def.component;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (component) {
|
|
100
|
+
let propsToSet:Record<string, any> = {
|
|
101
|
+
data: modelObject.data,
|
|
102
|
+
model,
|
|
103
|
+
surface,
|
|
104
|
+
componentId: modelObject.getFullId(),
|
|
105
|
+
vertex: modelObject,
|
|
106
|
+
eventInfo,
|
|
107
|
+
className:hasComponent ? null : (isGroup(modelObject) ? CLASS_DEFAULT_GROUP : CLASS_DEFAULT_NODE)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (injector != null) {
|
|
111
|
+
const injectedProps = injector(modelObject);
|
|
112
|
+
if (injectedProps != null) {
|
|
113
|
+
for (let key in injectedProps) {
|
|
114
|
+
propsToSet[key] = injectedProps[key];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const props = $state(propsToSet)
|
|
120
|
+
const componentHolder:ComponentHolder = {
|
|
121
|
+
component, props, vertex:modelObject, def, id:modelObject.id
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
_vertices.push(componentHolder)
|
|
125
|
+
_updateVertexState()
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function cleanupVertex(objId:string, el:BrowserElement) {
|
|
131
|
+
el.parentNode && el.parentNode.removeChild(el);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
onMount(async () => {
|
|
135
|
+
model = model || newInstance(modelOptions || {});
|
|
136
|
+
|
|
137
|
+
const templateRenderer = {
|
|
138
|
+
asynchronous: true,
|
|
139
|
+
reactive: true,
|
|
140
|
+
usesWrapperElement:true,
|
|
141
|
+
update: (el:BrowserElement, data:Object, vertex:Vertex) => {
|
|
142
|
+
const component = componentMap.get(vertex.id);
|
|
143
|
+
if (component) {
|
|
144
|
+
component.props.data = vertex.data
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
render,
|
|
148
|
+
cleanupVertex,
|
|
149
|
+
cleanupPort: (objId:string, el:BrowserElement) => {},
|
|
150
|
+
rerender: (
|
|
151
|
+
id:string,
|
|
152
|
+
data:ObjectData,
|
|
153
|
+
model:BrowserUISvelteModel,
|
|
154
|
+
type:string,
|
|
155
|
+
surface:Surface,
|
|
156
|
+
def:any,
|
|
157
|
+
modelObject:Vertex,
|
|
158
|
+
eventInfo:any,
|
|
159
|
+
originalElement:BrowserElement
|
|
160
|
+
) => {
|
|
161
|
+
|
|
162
|
+
// split into vertices we want to keep and the one we want to discard
|
|
163
|
+
const p = partition(_vertices, (v) => v.vertex !== modelObject)
|
|
164
|
+
// assign the ones we want to keep, update state
|
|
165
|
+
_vertices = p.left
|
|
166
|
+
_updateVertexState()
|
|
167
|
+
|
|
168
|
+
// remove the old DOM element
|
|
169
|
+
if (p.right.length > 0) {
|
|
170
|
+
cleanupVertex(modelObject.id, originalElement)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// on next tick, render again. it's important to wait for the next tick or the
|
|
174
|
+
// vertices state array gets messed up
|
|
175
|
+
setTimeout(() => {
|
|
176
|
+
render(id, data, model, type, surface, def, modelObject, eventInfo)
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const params = (renderOptions || {}) as SurfaceOptions;
|
|
182
|
+
params.view = viewOptions || {};
|
|
183
|
+
params.id = id;
|
|
184
|
+
|
|
185
|
+
if (shapeLibrary != null) {
|
|
186
|
+
params.shapes = {
|
|
187
|
+
library: shapeLibrary,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
surface = renderSurface(model, container, templateRenderer, params);
|
|
192
|
+
|
|
193
|
+
// with continuous anchors it's necessary to do this, for
|
|
194
|
+
// asynchronous-y reasons. $redrawEveryConnection only redraws
|
|
195
|
+
// edges and does not update element positions so it's
|
|
196
|
+
// reasonably quick.
|
|
197
|
+
surface.bind(EVENT_RENDER_END, () => setTimeout(() => surface.router.$redrawEveryConnection()))
|
|
198
|
+
|
|
199
|
+
if (surfaceContext != null) {
|
|
200
|
+
surfaceContext.set(surface);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const updateVertex = (vertexId: string, eventPayload: VertexUpdatedParams) => {
|
|
204
|
+
|
|
205
|
+
let mergeData = () => {
|
|
206
|
+
let data = {}
|
|
207
|
+
if (eventPayload.originalData || eventPayload.updates) {
|
|
208
|
+
data = extend(eventPayload.originalData, eventPayload.updates)
|
|
209
|
+
}
|
|
210
|
+
return data
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const entry = _vertices.find((v) => v.vertex.id === vertexId);
|
|
214
|
+
if (entry != null) {
|
|
215
|
+
entry.props.data = mergeData()
|
|
216
|
+
_updateVertexState()
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const removeVertex = (id: string) => {
|
|
221
|
+
_vertices = _vertices.filter(n => n.vertex.id !== id)
|
|
222
|
+
_updateVertexState()
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
model.bind<VertexUpdatedParams>(EVENT_NODE_UPDATED, (p: VertexUpdatedParams) => {
|
|
226
|
+
updateVertex(p.vertex.getFullId(), p)
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
model.bind<VertexUpdatedParams>(EVENT_GROUP_UPDATED, (p: VertexUpdatedParams) => {
|
|
230
|
+
updateVertex(p.vertex.getFullId(), p)
|
|
231
|
+
});
|
|
232
|
+
//
|
|
233
|
+
model.bind<NodeRemovedParams>(EVENT_NODE_REMOVED, (p: NodeRemovedParams) => {
|
|
234
|
+
removeVertex(p.node.id)
|
|
235
|
+
});
|
|
236
|
+
//
|
|
237
|
+
model.bind<GroupRemovedParams>(EVENT_GROUP_REMOVED, (p: GroupRemovedParams) => {
|
|
238
|
+
removeVertex(p.group.id)
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
model.bind(EVENT_GRAPH_CLEARED, () => {
|
|
243
|
+
_vertices = []
|
|
244
|
+
_updateVertexState()
|
|
245
|
+
// TODO svelte overlays
|
|
246
|
+
// _overlays = []
|
|
247
|
+
// _updateOverlayState()
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
if (url != null) {
|
|
251
|
+
model.load({ url });
|
|
252
|
+
} else if (data != null) {
|
|
253
|
+
model.load({ data });
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
</script>
|
|
258
|
+
|
|
259
|
+
<div class={className} bind:this={container}>
|
|
260
|
+
{#each vertexState.vertices as vertex (vertex.id)}
|
|
261
|
+
<WrapperComponent component={vertex.component}
|
|
262
|
+
data={vertex.props.data}
|
|
263
|
+
surface={surface}
|
|
264
|
+
def={vertex.def}
|
|
265
|
+
vertex={vertex.vertex}
|
|
266
|
+
className={vertex.props.className}/>
|
|
267
|
+
|
|
268
|
+
{/each}
|
|
269
|
+
{@render children?.()}
|
|
270
|
+
</div>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// This is a placeholder component that the surface uses to render each vertex.
|
|
5
|
+
|
|
6
|
+
import {onMount} from "svelte";
|
|
7
|
+
import {type BrowserElement} from "@visuallyjs/browser-ui";
|
|
8
|
+
|
|
9
|
+
let {component, vertex, surface, def, data, className} = $props()
|
|
10
|
+
let el:BrowserElement
|
|
11
|
+
|
|
12
|
+
// svelte wants uppercase here. So we just assign to an uppercase var, which we use in the
|
|
13
|
+
// template
|
|
14
|
+
const ComponentToRender = component
|
|
15
|
+
|
|
16
|
+
const _surface = $state.raw(surface)
|
|
17
|
+
|
|
18
|
+
onMount(async () => {
|
|
19
|
+
surface.$vertexRendered(vertex, el, def)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<div bind:this={el} class={className}>
|
|
26
|
+
<ComponentToRender this={component} data={data} surface={_surface} vertex={vertex} model={_surface.model}/>
|
|
27
|
+
</div>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
|
|
3
|
+
import { onMount } from "svelte";
|
|
4
|
+
|
|
5
|
+
import { CategoryValueChart } from "@visuallyjs/browser-ui"
|
|
6
|
+
import {type XYChartComponentProps} from "./definitions";
|
|
7
|
+
|
|
8
|
+
let container:HTMLElement;
|
|
9
|
+
|
|
10
|
+
// XYChartOptions
|
|
11
|
+
let {options, className = "", data, url }:XYChartComponentProps = $props()
|
|
12
|
+
|
|
13
|
+
let chart:CategoryValueChart<any>
|
|
14
|
+
|
|
15
|
+
export function getChart() {
|
|
16
|
+
return chart;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
onMount(async () => {
|
|
20
|
+
|
|
21
|
+
chart = new CategoryValueChart(container, options)
|
|
22
|
+
|
|
23
|
+
if (url != null) {
|
|
24
|
+
chart.load({url});
|
|
25
|
+
} else if (data != null) {
|
|
26
|
+
chart.load({data});
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<div class={className} bind:this={container}></div>
|
package/components.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list of exported Svelte components.
|
|
3
|
+
*/
|
|
4
|
+
export { default as SurfaceComponent } from "./SurfaceComponent.svelte";
|
|
5
|
+
export { default as DiagramComponent } from "./DiagramComponent.svelte";
|
|
6
|
+
export { default as ControlsComponent } from "./ControlsComponent.svelte";
|
|
7
|
+
export { default as ExportControlsComponent } from "./ExportControlsComponent.svelte";
|
|
8
|
+
export { default as MiniviewComponent } from "./MiniviewComponent.svelte";
|
|
9
|
+
export { default as PaletteComponent } from "./PaletteComponent.svelte";
|
|
10
|
+
export { default as DecoratorComponent } from "./DecoratorComponent.svelte";
|
|
11
|
+
export { default as InspectorComponent } from "./InspectorComponent.svelte";
|
|
12
|
+
export { default as ShapePaletteComponent } from "./ShapePaletteComponent.svelte";
|
|
13
|
+
export { default as DiagramPaletteComponent } from "./DiagramPaletteComponent.svelte";
|
|
14
|
+
export { default as ShapeComponent } from "./ShapeComponent.svelte";
|
|
15
|
+
export { default as EdgeTypePickerComponent } from "./EdgeTypePickerComponent.svelte";
|
|
16
|
+
export { default as ColorPickerComponent } from "./ColorPickerComponent.svelte";
|
|
17
|
+
export { default as ColumnChartComponent } from "./ColumnChartComponent.svelte";
|
|
18
|
+
export { default as BarChartComponent } from "./BarChartComponent.svelte";
|
|
19
|
+
export { default as XYChartComponent } from "./XYChartComponent.svelte";
|
|
20
|
+
export { default as LineChartComponent } from "./LineChartComponent.svelte";
|
|
21
|
+
export { default as AreaChartComponent } from "./AreaChartComponent.svelte";
|
|
22
|
+
export { default as PieChartComponent } from "./PieChartComponent.svelte";
|
|
23
|
+
export { default as ScatterChartComponent } from "./ScatterChartComponent.svelte";
|
|
24
|
+
export { default as BubbleChartComponent } from "./BubbleChartComponent.svelte";
|
|
25
|
+
export { default as GaugeChartComponent } from "./GaugeChartComponent.svelte";
|
|
26
|
+
export { default as SankeyChartComponent } from "./SankeyChartComponent.svelte";
|
|
27
|
+
export { default as WrapperComponent } from "./WrapperComponent.svelte";
|
|
28
|
+
export { default as DiagramProvider } from "./DiagramProvider.svelte";
|
|
29
|
+
export { default as SurfaceProvider } from "./SurfaceProvider.svelte";
|
package/components.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list of exported Svelte components.
|
|
3
|
+
*/
|
|
4
|
+
export { default as SurfaceComponent } from "./SurfaceComponent.svelte";
|
|
5
|
+
export { default as DiagramComponent } from "./DiagramComponent.svelte";
|
|
6
|
+
export { default as ControlsComponent } from "./ControlsComponent.svelte";
|
|
7
|
+
export { default as ExportControlsComponent } from "./ExportControlsComponent.svelte";
|
|
8
|
+
export { default as MiniviewComponent } from "./MiniviewComponent.svelte";
|
|
9
|
+
export { default as PaletteComponent } from "./PaletteComponent.svelte";
|
|
10
|
+
export { default as DecoratorComponent } from "./DecoratorComponent.svelte";
|
|
11
|
+
export { default as InspectorComponent } from "./InspectorComponent.svelte";
|
|
12
|
+
export { default as ShapePaletteComponent } from "./ShapePaletteComponent.svelte";
|
|
13
|
+
export { default as DiagramPaletteComponent } from "./DiagramPaletteComponent.svelte";
|
|
14
|
+
export { default as ShapeComponent } from "./ShapeComponent.svelte";
|
|
15
|
+
export { default as EdgeTypePickerComponent } from "./EdgeTypePickerComponent.svelte";
|
|
16
|
+
export { default as ColorPickerComponent } from "./ColorPickerComponent.svelte";
|
|
17
|
+
export { default as ColumnChartComponent } from "./ColumnChartComponent.svelte";
|
|
18
|
+
export { default as BarChartComponent } from "./BarChartComponent.svelte";
|
|
19
|
+
export { default as XYChartComponent } from "./XYChartComponent.svelte";
|
|
20
|
+
export { default as LineChartComponent } from "./LineChartComponent.svelte";
|
|
21
|
+
export { default as AreaChartComponent } from "./AreaChartComponent.svelte";
|
|
22
|
+
export { default as PieChartComponent } from "./PieChartComponent.svelte";
|
|
23
|
+
export { default as ScatterChartComponent } from "./ScatterChartComponent.svelte";
|
|
24
|
+
export { default as BubbleChartComponent } from "./BubbleChartComponent.svelte";
|
|
25
|
+
export { default as GaugeChartComponent } from "./GaugeChartComponent.svelte";
|
|
26
|
+
export { default as SankeyChartComponent } from "./SankeyChartComponent.svelte";
|
|
27
|
+
export { default as WrapperComponent } from "./WrapperComponent.svelte";
|
|
28
|
+
export { default as DiagramProvider } from "./DiagramProvider.svelte";
|
|
29
|
+
export { default as SurfaceProvider } from "./SurfaceProvider.svelte";
|