|
1 | 1 | import {Selectors} from 'src/core/roam/selectors' |
2 | 2 | import {Mouse} from 'src/core/common/mouse' |
3 | 3 | import {assumeExists} from 'src/core/common/assert' |
4 | | -import {delay} from 'src/core/common/async' |
5 | 4 |
|
6 | 5 | import {GraphVisualization} from './graph-visualization' |
| 6 | +import {waitForSelectionToExist} from 'src/core/common/mutation-observer' |
| 7 | +import {RoamPanel} from 'src/core/roam/panel/roam-panel' |
7 | 8 |
|
8 | 9 | export const saveWorkspace = (graph: GraphVisualization) => { |
9 | 10 | const graphData = graph.save() |
10 | 11 | if (graphData.nodes.some(({id}) => id.includes('Mentions of') || id.includes('block-input-'))) { |
11 | 12 | window.alert("Saving block outline and mention panels isn't supported yet") |
12 | 13 | } |
13 | | - const bulletsForPages = graphData.nodes.map(({id}) => `- [[${id}]]`).join('\n') |
14 | | - const graphJsonCodeBlock = '```' + JSON.stringify(graphData) + '```' |
15 | | - navigator.clipboard.writeText(bulletsForPages + '\n' + graphJsonCodeBlock) |
| 14 | + const bulletsForPages = graphData.nodes.map(({id}) => ` - [[${id}]]`).join('\n') |
| 15 | + const graphJsonCodeBlock = ' - ```' + JSON.stringify(graphData) + '```' |
| 16 | + navigator.clipboard.writeText('#[[Roam Toolkit Workspace]]' + '\n' + bulletsForPages + '\n' + graphJsonCodeBlock) |
16 | 17 | } |
17 | 18 |
|
18 | 19 | export const restoreWorkspace = async (graph: GraphVisualization) => { |
19 | | - // first, open all blocks in the page so the dom nodes exist |
20 | | - const links = Array.from(document.querySelectorAll(`${Selectors.mainContent} ${Selectors.block} ${Selectors.link}`)) |
21 | | - // ignore the links inside complex pages |
22 | | - const outerLinks = links.filter(link => !link.parentElement?.closest(Selectors.link)) as HTMLElement[] |
23 | | - // Open sidebar pages |
24 | | - outerLinks.forEach(link => Mouse.leftClick(link, true)) |
25 | | - // Open main page |
26 | | - Mouse.leftClick(outerLinks[0]) |
27 | | - |
28 | 20 | /** assume the format of the page is: |
29 | | - * - [[main page]] |
30 | | - * - [[side page 1]] |
31 | | - * - [[side page 2]] |
32 | | - * ```$JSON``` |
| 21 | + * - #[[Roam Toolkit Workspace]] |
| 22 | + * - [[main page]] |
| 23 | + * - [[side page 1]] |
| 24 | + * - [[side page 2]] |
| 25 | + * - ```$JSON``` |
33 | 26 | */ |
| 27 | + const savedWorkspaceBlocks = document |
| 28 | + .querySelector('[data-tag="Roam Toolkit Workspace"]') |
| 29 | + ?.closest(Selectors.blockContainer) |
| 30 | + if (!savedWorkspaceBlocks) { |
| 31 | + return |
| 32 | + } |
34 | 33 | const firstCodeBlockLine = assumeExists( |
35 | | - document.querySelector(`${Selectors.mainContent} .CodeMirror-line`) |
| 34 | + savedWorkspaceBlocks.querySelector(`${Selectors.mainContent} .CodeMirror-line`) |
36 | 35 | ) as HTMLElement |
37 | 36 | const graphData = JSON.parse(firstCodeBlockLine.innerText) |
38 | 37 |
|
| 38 | + if (graphData.nodes) { |
| 39 | + await openAllLinksInBlocks(savedWorkspaceBlocks) |
| 40 | + await graph.load(graphData) |
| 41 | + } |
| 42 | +} |
| 43 | + |
| 44 | +const openAllLinksInBlocks = async (blockContainer: Element) => { |
| 45 | + // first, open all blocks in the page so the dom nodes exist |
| 46 | + const [, ...links] = Array.from(blockContainer.querySelectorAll(Selectors.link)) |
| 47 | + // ignore the links inside complex pages |
| 48 | + const outerLinks = links.filter(link => !link.parentElement?.closest(Selectors.link)) as HTMLElement[] |
| 49 | + const [mainLink, ...sidebarLinks] = outerLinks |
| 50 | + // Open sidebar pages |
| 51 | + sidebarLinks.forEach(link => Mouse.leftClick(link, true)) |
| 52 | + // Open main page |
| 53 | + Mouse.leftClick(mainLink) |
| 54 | + |
39 | 55 | // Wait for all pages to finish opening |
40 | | - await delay(500 + outerLinks.length * 200) |
| 56 | + await Promise.all(outerLinks.map(assertLinkWasOpened)) |
| 57 | +} |
41 | 58 |
|
42 | | - graph.load(graphData) |
| 59 | +const assertLinkWasOpened = async (linkElement: HTMLElement) => { |
| 60 | + const panelId = assumeExists((linkElement.closest('[data-link-title]') as HTMLElement)?.dataset?.linkTitle) |
| 61 | + // Wait for all pages to finish opening |
| 62 | + await waitForSelectionToExist(() => RoamPanel.getPanel(panelId)) |
43 | 63 | } |
0 commit comments