-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExampleCommon.tsx
More file actions
87 lines (84 loc) · 3.13 KB
/
ExampleCommon.tsx
File metadata and controls
87 lines (84 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import * as React from 'react';
import { HashMap } from '@reactodia/hashmap';
import * as Reactodia from '@reactodia/workspace';
export function ExampleToolbarMenu() {
const {model, editor, overlay} = Reactodia.useWorkspace();
return (
<>
<Reactodia.ToolbarActionOpen
hotkey='Mod+O'
fileAccept='.json'
onSelect={async file => {
const preloadedElements = new Map<Reactodia.ElementIri, Reactodia.ElementModel>();
for (const element of model.elements) {
for (const entity of Reactodia.iterateEntitiesOf(element)) {
preloadedElements.set(entity.id, entity);
}
}
const preloadedLinks = new HashMap<Reactodia.LinkKey, Reactodia.LinkModel>(
Reactodia.hashLink,
Reactodia.equalLinks
);
for (const link of model.links) {
for (const relation of Reactodia.iterateRelationsOf(link)) {
preloadedLinks.set(relation, relation);
}
}
const task = overlay.startTask({title: 'Importing a layout from file'});
try {
const json = await file.text();
const diagramLayout = JSON.parse(json);
await model.importLayout({
dataProvider: model.dataProvider,
diagram: diagramLayout,
preloadedElements,
preloadedLinks,
validateLinks: true,
});
} catch (err) {
task.setError(new Error(
'Failed to load specified file with a diagram layout.',
{cause: err}
));
} finally {
task.end();
}
}}>
Open diagram from file
</Reactodia.ToolbarActionOpen>
<Reactodia.ToolbarActionSave mode='layout'
hotkey='Mod+S'
onSelect={() => {
const diagramLayout = model.exportLayout();
const layoutString = JSON.stringify(diagramLayout);
const blob = new Blob([layoutString], {type: 'application/json'});
const blobUrl = URL.createObjectURL(blob);
const timestamp = new Date().toISOString().replaceAll(/[Z\s:-]/g, '');
try {
const downloadLink = document.createElement('a');
downloadLink.href = blobUrl;
downloadLink.download = `reactodia-diagram-${timestamp}.json`;
downloadLink.click();
} finally {
URL.revokeObjectURL(blobUrl);
}
}}>
Save diagram to file
</Reactodia.ToolbarActionSave>
{editor.inAuthoringMode ? (
<Reactodia.ToolbarActionSave mode='authoring'
onSelect={() => {
const state = editor.authoringState;
console.log('Authoring state:', state);
alert('Please check browser console for result');
}}>
Persist changes to data
</Reactodia.ToolbarActionSave>
) : null}
<Reactodia.ToolbarActionClearAll />
<Reactodia.ToolbarActionExport kind='exportRaster' />
<Reactodia.ToolbarActionExport kind='exportSvg' />
<Reactodia.ToolbarActionExport kind='print' hotkey='Mod+P' />
</>
);
}