@powerhousedao/reactor-browser 6.0.0-dev.65 → 6.0.0-dev.67
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/dist/bundle.d.ts +2 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/src/analytics/context.d.ts.map +1 -1
- package/dist/src/analytics.js +82425 -3
- package/dist/src/connect.js +54019 -2
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +66007 -15
- package/dist/src/re-exports.d.ts +3 -0
- package/dist/src/re-exports.d.ts.map +1 -0
- package/dist/src/relational/hooks/useRelationalDb.d.ts +2 -1
- package/dist/src/relational/hooks/useRelationalDb.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -22
- package/dist/src/actions/dispatch.js +0 -51
- package/dist/src/actions/dispatch.js.map +0 -1
- package/dist/src/actions/document.js +0 -497
- package/dist/src/actions/document.js.map +0 -1
- package/dist/src/actions/drive.js +0 -120
- package/dist/src/actions/drive.js.map +0 -1
- package/dist/src/actions/index.js +0 -4
- package/dist/src/actions/index.js.map +0 -1
- package/dist/src/actions/queue.js +0 -131
- package/dist/src/actions/queue.js.map +0 -1
- package/dist/src/actions/sign.js +0 -66
- package/dist/src/actions/sign.js.map +0 -1
- package/dist/src/analytics/context.js +0 -148
- package/dist/src/analytics/context.js.map +0 -1
- package/dist/src/analytics/hooks/analytics-query.js +0 -157
- package/dist/src/analytics/hooks/analytics-query.js.map +0 -1
- package/dist/src/analytics/hooks/document-timeline.js +0 -10
- package/dist/src/analytics/hooks/document-timeline.js.map +0 -1
- package/dist/src/analytics/hooks/index.js +0 -4
- package/dist/src/analytics/hooks/index.js.map +0 -1
- package/dist/src/analytics/hooks/timeline-items.js +0 -104
- package/dist/src/analytics/hooks/timeline-items.js.map +0 -1
- package/dist/src/analytics/index.js +0 -3
- package/dist/src/analytics/index.js.map +0 -1
- package/dist/src/analytics/store/browser.js +0 -2
- package/dist/src/analytics/store/browser.js.map +0 -1
- package/dist/src/analytics/store/memory.js +0 -2
- package/dist/src/analytics/store/memory.js.map +0 -1
- package/dist/src/analytics/types.js +0 -2
- package/dist/src/analytics/types.js.map +0 -1
- package/dist/src/analytics.js.map +0 -1
- package/dist/src/connect.js.map +0 -1
- package/dist/src/constants.js +0 -3
- package/dist/src/constants.js.map +0 -1
- package/dist/src/context/index.js +0 -2
- package/dist/src/context/index.js.map +0 -1
- package/dist/src/context/read-mode.js +0 -177
- package/dist/src/context/read-mode.js.map +0 -1
- package/dist/src/document-cache.js +0 -143
- package/dist/src/document-cache.js.map +0 -1
- package/dist/src/document-model.js +0 -6
- package/dist/src/document-model.js.map +0 -1
- package/dist/src/errors.js +0 -30
- package/dist/src/errors.js.map +0 -1
- package/dist/src/global/core.js +0 -22
- package/dist/src/global/core.js.map +0 -1
- package/dist/src/global/index.js +0 -2
- package/dist/src/global/index.js.map +0 -1
- package/dist/src/global/types.js +0 -2
- package/dist/src/global/types.js.map +0 -1
- package/dist/src/hooks/add-ph-event-handlers.js +0 -103
- package/dist/src/hooks/add-ph-event-handlers.js.map +0 -1
- package/dist/src/hooks/allowed-document-model-modules.js +0 -10
- package/dist/src/hooks/allowed-document-model-modules.js.map +0 -1
- package/dist/src/hooks/child-nodes.js +0 -15
- package/dist/src/hooks/child-nodes.js.map +0 -1
- package/dist/src/hooks/config/connect.js +0 -210
- package/dist/src/hooks/config/connect.js.map +0 -1
- package/dist/src/hooks/config/editor.js +0 -43
- package/dist/src/hooks/config/editor.js.map +0 -1
- package/dist/src/hooks/config/set-config-by-key.js +0 -15
- package/dist/src/hooks/config/set-config-by-key.js.map +0 -1
- package/dist/src/hooks/config/set-config-by-object.js +0 -84
- package/dist/src/hooks/config/set-config-by-object.js.map +0 -1
- package/dist/src/hooks/config/use-value-by-key.js +0 -23
- package/dist/src/hooks/config/use-value-by-key.js.map +0 -1
- package/dist/src/hooks/config/utils.js +0 -6
- package/dist/src/hooks/config/utils.js.map +0 -1
- package/dist/src/hooks/connect.js +0 -16
- package/dist/src/hooks/connect.js.map +0 -1
- package/dist/src/hooks/crypto.js +0 -13
- package/dist/src/hooks/crypto.js.map +0 -1
- package/dist/src/hooks/did.js +0 -3
- package/dist/src/hooks/did.js.map +0 -1
- package/dist/src/hooks/dispatch.js +0 -20
- package/dist/src/hooks/dispatch.js.map +0 -1
- package/dist/src/hooks/document-by-id.js +0 -13
- package/dist/src/hooks/document-by-id.js.map +0 -1
- package/dist/src/hooks/document-cache.js +0 -124
- package/dist/src/hooks/document-cache.js.map +0 -1
- package/dist/src/hooks/document-model-modules.js +0 -10
- package/dist/src/hooks/document-model-modules.js.map +0 -1
- package/dist/src/hooks/document-of-type.js +0 -22
- package/dist/src/hooks/document-of-type.js.map +0 -1
- package/dist/src/hooks/document-operations.js +0 -92
- package/dist/src/hooks/document-operations.js.map +0 -1
- package/dist/src/hooks/document-types.js +0 -13
- package/dist/src/hooks/document-types.js.map +0 -1
- package/dist/src/hooks/drive-by-id.js +0 -12
- package/dist/src/hooks/drive-by-id.js.map +0 -1
- package/dist/src/hooks/drives.js +0 -9
- package/dist/src/hooks/drives.js.map +0 -1
- package/dist/src/hooks/editor-modules.js +0 -43
- package/dist/src/hooks/editor-modules.js.map +0 -1
- package/dist/src/hooks/features.js +0 -6
- package/dist/src/hooks/features.js.map +0 -1
- package/dist/src/hooks/folder-by-id.js +0 -6
- package/dist/src/hooks/folder-by-id.js.map +0 -1
- package/dist/src/hooks/import-script-modules.js +0 -6
- package/dist/src/hooks/import-script-modules.js.map +0 -1
- package/dist/src/hooks/index.js +0 -41
- package/dist/src/hooks/index.js.map +0 -1
- package/dist/src/hooks/items-in-selected-drive.js +0 -35
- package/dist/src/hooks/items-in-selected-drive.js.map +0 -1
- package/dist/src/hooks/items-in-selected-folder.js +0 -33
- package/dist/src/hooks/items-in-selected-folder.js.map +0 -1
- package/dist/src/hooks/loading.js +0 -3
- package/dist/src/hooks/loading.js.map +0 -1
- package/dist/src/hooks/login-status.js +0 -3
- package/dist/src/hooks/login-status.js.map +0 -1
- package/dist/src/hooks/make-ph-event-functions.js +0 -46
- package/dist/src/hooks/make-ph-event-functions.js.map +0 -1
- package/dist/src/hooks/modals.js +0 -26
- package/dist/src/hooks/modals.js.map +0 -1
- package/dist/src/hooks/node-actions.js +0 -108
- package/dist/src/hooks/node-actions.js.map +0 -1
- package/dist/src/hooks/node-by-id.js +0 -7
- package/dist/src/hooks/node-by-id.js.map +0 -1
- package/dist/src/hooks/node-path.js +0 -23
- package/dist/src/hooks/node-path.js.map +0 -1
- package/dist/src/hooks/parent-folder.js +0 -13
- package/dist/src/hooks/parent-folder.js.map +0 -1
- package/dist/src/hooks/reactor.js +0 -25
- package/dist/src/hooks/reactor.js.map +0 -1
- package/dist/src/hooks/renown.js +0 -9
- package/dist/src/hooks/renown.js.map +0 -1
- package/dist/src/hooks/revision-history.js +0 -17
- package/dist/src/hooks/revision-history.js.map +0 -1
- package/dist/src/hooks/selected-document.js +0 -35
- package/dist/src/hooks/selected-document.js.map +0 -1
- package/dist/src/hooks/selected-drive.js +0 -63
- package/dist/src/hooks/selected-drive.js.map +0 -1
- package/dist/src/hooks/selected-folder.js +0 -10
- package/dist/src/hooks/selected-folder.js.map +0 -1
- package/dist/src/hooks/selected-node.js +0 -54
- package/dist/src/hooks/selected-node.js.map +0 -1
- package/dist/src/hooks/selected-timeline-item.js +0 -9
- package/dist/src/hooks/selected-timeline-item.js.map +0 -1
- package/dist/src/hooks/subgraph-modules.js +0 -6
- package/dist/src/hooks/subgraph-modules.js.map +0 -1
- package/dist/src/hooks/supported-document-types.js +0 -7
- package/dist/src/hooks/supported-document-types.js.map +0 -1
- package/dist/src/hooks/timeline-revision.js +0 -9
- package/dist/src/hooks/timeline-revision.js.map +0 -1
- package/dist/src/hooks/toast.js +0 -9
- package/dist/src/hooks/toast.js.map +0 -1
- package/dist/src/hooks/use-feature-flags.js +0 -19
- package/dist/src/hooks/use-feature-flags.js.map +0 -1
- package/dist/src/hooks/use-get-switchboard-link.js +0 -49
- package/dist/src/hooks/use-get-switchboard-link.js.map +0 -1
- package/dist/src/hooks/use-on-drop-file.js +0 -21
- package/dist/src/hooks/use-on-drop-file.js.map +0 -1
- package/dist/src/hooks/user-permissions.js +0 -17
- package/dist/src/hooks/user-permissions.js.map +0 -1
- package/dist/src/hooks/user.js +0 -9
- package/dist/src/hooks/user.js.map +0 -1
- package/dist/src/hooks/vetra-packages.js +0 -27
- package/dist/src/hooks/vetra-packages.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/pglite/drop.js +0 -27
- package/dist/src/pglite/drop.js.map +0 -1
- package/dist/src/pglite/hooks/index.js +0 -2
- package/dist/src/pglite/hooks/index.js.map +0 -1
- package/dist/src/pglite/hooks/usePGlite.js +0 -37
- package/dist/src/pglite/hooks/usePGlite.js.map +0 -1
- package/dist/src/pglite/index.js +0 -3
- package/dist/src/pglite/index.js.map +0 -1
- package/dist/src/reactor-client-document-cache.js +0 -138
- package/dist/src/reactor-client-document-cache.js.map +0 -1
- package/dist/src/reactor.js +0 -145
- package/dist/src/reactor.js.map +0 -1
- package/dist/src/relational/hooks/index.js +0 -3
- package/dist/src/relational/hooks/index.js.map +0 -1
- package/dist/src/relational/hooks/useRelationalDb.js +0 -36
- package/dist/src/relational/hooks/useRelationalDb.js.map +0 -1
- package/dist/src/relational/hooks/useRelationalQuery.js +0 -76
- package/dist/src/relational/hooks/useRelationalQuery.js.map +0 -1
- package/dist/src/relational/index.js +0 -3
- package/dist/src/relational/index.js.map +0 -1
- package/dist/src/relational/utils/createProcessorQuery.js +0 -24
- package/dist/src/relational/utils/createProcessorQuery.js.map +0 -1
- package/dist/src/relational/utils/index.js +0 -2
- package/dist/src/relational/utils/index.js.map +0 -1
- package/dist/src/renown/constants.js +0 -40
- package/dist/src/renown/constants.js.map +0 -1
- package/dist/src/renown/index.js +0 -3
- package/dist/src/renown/index.js.map +0 -1
- package/dist/src/renown/utils.js +0 -52
- package/dist/src/renown/utils.js.map +0 -1
- package/dist/src/storage/index.js +0 -2
- package/dist/src/storage/index.js.map +0 -1
- package/dist/src/storage/types.js +0 -2
- package/dist/src/storage/types.js.map +0 -1
- package/dist/src/types/config.js +0 -2
- package/dist/src/types/config.js.map +0 -1
- package/dist/src/types/documents.js +0 -2
- package/dist/src/types/documents.js.map +0 -1
- package/dist/src/types/global.js +0 -2
- package/dist/src/types/global.js.map +0 -1
- package/dist/src/types/index.js +0 -2
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/modals.js +0 -2
- package/dist/src/types/modals.js.map +0 -1
- package/dist/src/types/reactor.js +0 -2
- package/dist/src/types/reactor.js.map +0 -1
- package/dist/src/types/timeline.js +0 -2
- package/dist/src/types/timeline.js.map +0 -1
- package/dist/src/types/toast.js +0 -2
- package/dist/src/types/toast.js.map +0 -1
- package/dist/src/types/upload.js +0 -2
- package/dist/src/types/upload.js.map +0 -1
- package/dist/src/types/vetra.js +0 -2
- package/dist/src/types/vetra.js.map +0 -1
- package/dist/src/utils/documents.js +0 -20
- package/dist/src/utils/documents.js.map +0 -1
- package/dist/src/utils/drive-url.js +0 -3
- package/dist/src/utils/drive-url.js.map +0 -1
- package/dist/src/utils/drives.js +0 -29
- package/dist/src/utils/drives.js.map +0 -1
- package/dist/src/utils/export-document.js +0 -18
- package/dist/src/utils/export-document.js.map +0 -1
- package/dist/src/utils/get-revision-from-date.js +0 -10
- package/dist/src/utils/get-revision-from-date.js.map +0 -1
- package/dist/src/utils/index.js +0 -12
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/nodes.js +0 -17
- package/dist/src/utils/nodes.js.map +0 -1
- package/dist/src/utils/switchboard.js +0 -76
- package/dist/src/utils/switchboard.js.map +0 -1
- package/dist/src/utils/url.js +0 -77
- package/dist/src/utils/url.js.map +0 -1
- package/dist/src/utils/user.js +0 -15
- package/dist/src/utils/user.js.map +0 -1
- package/dist/src/utils/validate-document.js +0 -38
- package/dist/src/utils/validate-document.js.map +0 -1
- package/dist/src/utils/vetra.js +0 -87
- package/dist/src/utils/vetra.js.map +0 -1
- package/dist/test/analytics.test.js +0 -263
- package/dist/test/analytics.test.js.map +0 -1
- package/dist/test/document-cache.test.js +0 -457
- package/dist/test/document-cache.test.js.map +0 -1
- package/dist/test/drop.test.js +0 -83
- package/dist/test/drop.test.js.map +0 -1
- package/dist/test/getSwitchboardUrl.test.js +0 -107
- package/dist/test/getSwitchboardUrl.test.js.map +0 -1
- package/dist/test/hooks/document-cache.test.js +0 -642
- package/dist/test/hooks/document-cache.test.js.map +0 -1
- package/dist/test/reactor.test.js +0 -26
- package/dist/test/reactor.test.js.map +0 -1
- package/dist/test/switchboard.test.js +0 -27
- package/dist/test/switchboard.test.js.map +0 -1
- package/dist/vitest.config.js +0 -24
- package/dist/vitest.config.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/reactor-browser",
|
|
3
|
-
"version": "6.0.0-dev.
|
|
3
|
+
"version": "6.0.0-dev.67",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -15,20 +15,16 @@
|
|
|
15
15
|
],
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
18
|
+
"types": "./dist/src/index.d.ts",
|
|
19
|
+
"import": "./dist/src/index.js"
|
|
20
20
|
},
|
|
21
21
|
"./connect": {
|
|
22
22
|
"types": "./dist/src/connect.d.ts",
|
|
23
|
-
"
|
|
23
|
+
"import": "./dist/src/connect.js"
|
|
24
24
|
},
|
|
25
25
|
"./analytics": {
|
|
26
26
|
"types": "./dist/src/analytics.d.ts",
|
|
27
|
-
"
|
|
28
|
-
},
|
|
29
|
-
"./analytics/hooks": {
|
|
30
|
-
"types": "./dist/src/analytics/hooks/index.d.ts",
|
|
31
|
-
"default": "./dist/src/analytics/hooks/index.js"
|
|
27
|
+
"import": "./dist/src/analytics.js"
|
|
32
28
|
}
|
|
33
29
|
},
|
|
34
30
|
"sideEffects": false,
|
|
@@ -38,6 +34,7 @@
|
|
|
38
34
|
"@types/react": "19.2.14",
|
|
39
35
|
"@types/react-dom": "19.2.3",
|
|
40
36
|
"@types/slug": "^5.0.9",
|
|
37
|
+
"@types/bun": "1.3.10",
|
|
41
38
|
"@types/wicg-file-system-access": "^2020.9.8",
|
|
42
39
|
"@vitejs/plugin-react": "5.1.4",
|
|
43
40
|
"@vitest/browser": "^3.2.4",
|
|
@@ -46,13 +43,7 @@
|
|
|
46
43
|
"react": "19.2.4",
|
|
47
44
|
"react-dom": "19.2.4",
|
|
48
45
|
"vitest": "3.2.4",
|
|
49
|
-
"vitest-browser-react": "^1.0.1"
|
|
50
|
-
},
|
|
51
|
-
"peerDependencies": {
|
|
52
|
-
"react": ">=19.0.0",
|
|
53
|
-
"react-dom": ">=19.0.0"
|
|
54
|
-
},
|
|
55
|
-
"dependencies": {
|
|
46
|
+
"vitest-browser-react": "^1.0.1",
|
|
56
47
|
"fast-deep-equal": "3.1.3",
|
|
57
48
|
"@electric-sql/pglite": "0.3.15",
|
|
58
49
|
"@tanstack/react-query": "^5.49.2",
|
|
@@ -63,16 +54,22 @@
|
|
|
63
54
|
"luxon": "^3.6.1",
|
|
64
55
|
"lz-string": "^1.5.0",
|
|
65
56
|
"slug": "^11.0.0",
|
|
66
|
-
"@powerhousedao/analytics-engine-
|
|
67
|
-
"@
|
|
68
|
-
"@powerhousedao/analytics-engine-
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"document-model": "6.0.0-dev.
|
|
57
|
+
"@powerhousedao/analytics-engine-core": "6.0.0-dev.67",
|
|
58
|
+
"@powerhousedao/reactor": "6.0.0-dev.67",
|
|
59
|
+
"@powerhousedao/analytics-engine-browser": "6.0.0-dev.67",
|
|
60
|
+
"@renown/sdk": "6.0.0-dev.67",
|
|
61
|
+
"document-drive": "6.0.0-dev.67",
|
|
62
|
+
"document-model": "6.0.0-dev.67"
|
|
63
|
+
},
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"react": ">=19.0.0",
|
|
66
|
+
"react-dom": ">=19.0.0",
|
|
67
|
+
"@electric-sql/pglite": ">=0.3.0"
|
|
72
68
|
},
|
|
73
69
|
"scripts": {
|
|
74
70
|
"tsc": "tsc",
|
|
75
71
|
"lint": "eslint",
|
|
72
|
+
"build:bundle": "bun run ./bundle.ts",
|
|
76
73
|
"test:browser": "vitest --run",
|
|
77
74
|
"install:playwright": "playwright install"
|
|
78
75
|
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { logger } from "document-drive";
|
|
2
|
-
import { queueActions } from "./queue.js";
|
|
3
|
-
import { makeSignedActionsWithContext } from "./sign.js";
|
|
4
|
-
async function getDocument(documentId) {
|
|
5
|
-
try {
|
|
6
|
-
return await window.ph?.reactorClient?.get(documentId);
|
|
7
|
-
}
|
|
8
|
-
catch (error) {
|
|
9
|
-
logger.debug(`Failed to get document with id ${documentId}:`, error);
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
function getActionErrors(result, actions) {
|
|
14
|
-
return actions.reduce((errors, a) => {
|
|
15
|
-
const scopeOperations = result.operations[a.scope];
|
|
16
|
-
if (!scopeOperations) {
|
|
17
|
-
return errors;
|
|
18
|
-
}
|
|
19
|
-
const op = scopeOperations.findLast((op) => op.action.id === a.id);
|
|
20
|
-
if (op?.error) {
|
|
21
|
-
errors.push(new Error(op.error));
|
|
22
|
-
}
|
|
23
|
-
return errors;
|
|
24
|
-
}, new Array());
|
|
25
|
-
}
|
|
26
|
-
export async function dispatchActions(actionOrActions, documentOrDocumentId, onErrors, onSuccess) {
|
|
27
|
-
const document = typeof documentOrDocumentId === "string"
|
|
28
|
-
? await getDocument(documentOrDocumentId)
|
|
29
|
-
: documentOrDocumentId;
|
|
30
|
-
if (!document) {
|
|
31
|
-
logger.error(`Document with id ${JSON.stringify(documentOrDocumentId)} not found`);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const signedActionsWithContext = await makeSignedActionsWithContext(actionOrActions, document);
|
|
35
|
-
if (!signedActionsWithContext) {
|
|
36
|
-
logger.error("No signed actions with context found");
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const result = await queueActions(document, signedActionsWithContext);
|
|
40
|
-
if (onErrors && result) {
|
|
41
|
-
const errors = getActionErrors(result, signedActionsWithContext);
|
|
42
|
-
if (errors.length) {
|
|
43
|
-
onErrors(errors);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (onSuccess && result) {
|
|
47
|
-
onSuccess(result);
|
|
48
|
-
}
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=dispatch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../src/actions/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AAEzD,KAAK,UAAU,WAAW,CACxB,UAAkB;IAElB,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kCAAkC,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,OAAiB;IAC5D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAEnE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,IAAI,KAAK,EAAS,CAAC,CAAC;AACzB,CAAC;AA4BD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,eAA8C,EAC9C,oBAAqD,EACrD,QAAoC,EACpC,SAAwC;IAExC,MAAM,QAAQ,GACZ,OAAO,oBAAoB,KAAK,QAAQ;QACtC,CAAC,CAAC,MAAM,WAAW,CAAC,oBAAoB,CAAC;QACzC,CAAC,CAAC,oBAAoB,CAAC;IAE3B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CACV,oBAAoB,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,YAAY,CACrE,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,wBAAwB,GAAG,MAAM,4BAA4B,CACjE,eAAe,EACf,QAAQ,CACT,CAAC;IACF,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAEtE,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACxB,SAAS,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,497 +0,0 @@
|
|
|
1
|
-
import { addFolder as baseAddFolder, copyNode as baseCopyNode, deleteNode as baseDeleteNode, updateFile as baseUpdateFile, generateNodesCopy, handleTargetNameCollisions, isFileNode, isFolderNode, logger, updateNode, } from "document-drive";
|
|
2
|
-
import { documentModelDocumentType } from "document-model";
|
|
3
|
-
import { baseLoadFromInput, baseSaveToFileHandle, createPresignedHeader, createZip, generateId, replayDocument, } from "document-model/core";
|
|
4
|
-
import { UnsupportedDocumentTypeError } from "../errors.js";
|
|
5
|
-
import { isDocumentTypeSupported } from "../utils/documents.js";
|
|
6
|
-
import { getUserPermissions } from "../utils/user.js";
|
|
7
|
-
import { queueActions, queueOperations, uploadOperations } from "./queue.js";
|
|
8
|
-
async function isDocumentInLocation(document, driveId, parentFolder) {
|
|
9
|
-
const reactorClient = window.ph?.reactorClient;
|
|
10
|
-
if (!reactorClient) {
|
|
11
|
-
return { isDuplicate: false };
|
|
12
|
-
}
|
|
13
|
-
// Get the drive and check its nodes
|
|
14
|
-
let drive;
|
|
15
|
-
try {
|
|
16
|
-
drive = await reactorClient.get(driveId);
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return { isDuplicate: false };
|
|
20
|
-
}
|
|
21
|
-
// Case 1: Check for duplicate by ID
|
|
22
|
-
const nodeById = drive.state.global.nodes.find((node) => node.id === document.header.id);
|
|
23
|
-
if (nodeById && nodeById.parentFolder === (parentFolder ?? null)) {
|
|
24
|
-
return {
|
|
25
|
-
isDuplicate: true,
|
|
26
|
-
duplicateType: "id",
|
|
27
|
-
nodeId: nodeById.id,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
// Case 2: Check for duplicate by name + type in same parent folder
|
|
31
|
-
const nodeByNameAndType = drive.state.global.nodes.find((node) => isFileNode(node) &&
|
|
32
|
-
node.name === document.header.name &&
|
|
33
|
-
node.documentType === document.header.documentType &&
|
|
34
|
-
node.parentFolder === (parentFolder ?? null));
|
|
35
|
-
if (nodeByNameAndType) {
|
|
36
|
-
return {
|
|
37
|
-
isDuplicate: true,
|
|
38
|
-
duplicateType: "name",
|
|
39
|
-
nodeId: nodeByNameAndType.id,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
return { isDuplicate: false };
|
|
43
|
-
}
|
|
44
|
-
function getDocumentTypeIcon(document) {
|
|
45
|
-
const documentType = document.header.documentType;
|
|
46
|
-
switch (documentType) {
|
|
47
|
-
case "powerhouse/document-model":
|
|
48
|
-
return "document-model";
|
|
49
|
-
case "powerhouse/app":
|
|
50
|
-
return "app";
|
|
51
|
-
case "powerhouse/document-editor":
|
|
52
|
-
return "editor";
|
|
53
|
-
case "powerhouse/subgraph":
|
|
54
|
-
return "subgraph";
|
|
55
|
-
case "powerhouse/package":
|
|
56
|
-
return "package";
|
|
57
|
-
case "powerhouse/processor": {
|
|
58
|
-
// Check the processor type from global state (safely)
|
|
59
|
-
const globalState = document.state
|
|
60
|
-
.global;
|
|
61
|
-
const processorType = globalState?.type;
|
|
62
|
-
if (processorType === "analytics")
|
|
63
|
-
return "analytics-processor";
|
|
64
|
-
if (processorType === "relational")
|
|
65
|
-
return "relational-processor";
|
|
66
|
-
if (processorType === "codegen")
|
|
67
|
-
return "codegen-processor";
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
default:
|
|
71
|
-
return undefined;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
export function downloadFile(document, fileName) {
|
|
75
|
-
const zip = createZip(document);
|
|
76
|
-
zip
|
|
77
|
-
.generateAsync({ type: "blob" })
|
|
78
|
-
.then((blob) => {
|
|
79
|
-
const link = window.document.createElement("a");
|
|
80
|
-
link.style.display = "none";
|
|
81
|
-
link.href = URL.createObjectURL(blob);
|
|
82
|
-
link.download = fileName;
|
|
83
|
-
window.document.body.appendChild(link);
|
|
84
|
-
link.click();
|
|
85
|
-
window.document.body.removeChild(link);
|
|
86
|
-
})
|
|
87
|
-
.catch(logger.error);
|
|
88
|
-
}
|
|
89
|
-
async function getDocumentExtension(document) {
|
|
90
|
-
const documentType = document.header.documentType;
|
|
91
|
-
// DocumentModel definitions always use "phdm"
|
|
92
|
-
if (documentType === documentModelDocumentType) {
|
|
93
|
-
return "phdm";
|
|
94
|
-
}
|
|
95
|
-
let rawExtension;
|
|
96
|
-
const reactorClient = window.ph?.reactorClient;
|
|
97
|
-
if (reactorClient) {
|
|
98
|
-
const { results: documentModelModules } = await reactorClient.getDocumentModelModules();
|
|
99
|
-
const module = documentModelModules.find((m) => m.documentModel.global.id === documentType);
|
|
100
|
-
rawExtension = module?.utils.fileExtension;
|
|
101
|
-
}
|
|
102
|
-
// Clean the extension (remove leading/trailing dots) and fallback to "phdm"
|
|
103
|
-
const cleanExtension = (rawExtension ?? "phdm").replace(/^\.+|\.+$/g, "");
|
|
104
|
-
return cleanExtension || "phdm";
|
|
105
|
-
}
|
|
106
|
-
export async function exportFile(document, suggestedName) {
|
|
107
|
-
if (!window.ph?.reactorClient) {
|
|
108
|
-
throw new Error("ReactorClient not initialized");
|
|
109
|
-
}
|
|
110
|
-
// Get the extension from the document model module
|
|
111
|
-
const extension = await getDocumentExtension(document);
|
|
112
|
-
const name = `${suggestedName || document.header.name || "Untitled"}.${extension}.phd`;
|
|
113
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
114
|
-
if (!window.showSaveFilePicker) {
|
|
115
|
-
return downloadFile(document, name);
|
|
116
|
-
}
|
|
117
|
-
try {
|
|
118
|
-
const fileHandle = await window.showSaveFilePicker({
|
|
119
|
-
suggestedName: name,
|
|
120
|
-
});
|
|
121
|
-
await baseSaveToFileHandle(document, fileHandle);
|
|
122
|
-
return fileHandle;
|
|
123
|
-
}
|
|
124
|
-
catch (e) {
|
|
125
|
-
// ignores error if user cancelled the file picker
|
|
126
|
-
if (!(e instanceof DOMException && e.name === "AbortError")) {
|
|
127
|
-
throw e;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
export async function loadFile(path) {
|
|
132
|
-
const baseDocument = await baseLoadFromInput(path, (state) => state, { checkHashes: true });
|
|
133
|
-
const reactorClient = window.ph?.reactorClient;
|
|
134
|
-
if (!reactorClient) {
|
|
135
|
-
throw new Error("ReactorClient not initialized");
|
|
136
|
-
}
|
|
137
|
-
const { results: documentModelModules } = await reactorClient.getDocumentModelModules();
|
|
138
|
-
const documentModelModule = documentModelModules.find((module) => module.documentModel.global.id === baseDocument.header.documentType);
|
|
139
|
-
if (!documentModelModule) {
|
|
140
|
-
throw new Error(`Document "${baseDocument.header.documentType}" is not supported`);
|
|
141
|
-
}
|
|
142
|
-
return documentModelModule.utils.loadFromInput(path);
|
|
143
|
-
}
|
|
144
|
-
export async function addDocument(driveId, name, documentType, parentFolder, document, id, preferredEditor) {
|
|
145
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
146
|
-
if (!isAllowedToCreateDocuments) {
|
|
147
|
-
throw new Error("User is not allowed to create documents");
|
|
148
|
-
}
|
|
149
|
-
const reactorClient = window.ph?.reactorClient;
|
|
150
|
-
if (!reactorClient) {
|
|
151
|
-
throw new Error("ReactorClient not initialized");
|
|
152
|
-
}
|
|
153
|
-
// get the module
|
|
154
|
-
const documentModelModule = await reactorClient.getDocumentModelModule(documentType);
|
|
155
|
-
// create - use passed document's state if available
|
|
156
|
-
const newDocument = documentModelModule.utils.createDocument({
|
|
157
|
-
...document?.state,
|
|
158
|
-
});
|
|
159
|
-
newDocument.header.name = name;
|
|
160
|
-
// Create document using ReactorClient
|
|
161
|
-
let newDoc;
|
|
162
|
-
try {
|
|
163
|
-
newDoc = await reactorClient.createDocumentInDrive(driveId, newDocument, parentFolder);
|
|
164
|
-
}
|
|
165
|
-
catch (e) {
|
|
166
|
-
logger.error("Error adding document", e);
|
|
167
|
-
throw new Error("There was an error adding document");
|
|
168
|
-
}
|
|
169
|
-
// Return a file node structure for compatibility
|
|
170
|
-
return {
|
|
171
|
-
id: newDoc.header.id,
|
|
172
|
-
name: newDoc.header.name,
|
|
173
|
-
documentType,
|
|
174
|
-
parentFolder: parentFolder ?? null,
|
|
175
|
-
kind: "file",
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
export async function addFile(file, driveId, name, parentFolder) {
|
|
179
|
-
logger.verbose(`addFile(drive: ${driveId}, name: ${name}, folder: ${parentFolder})`);
|
|
180
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
181
|
-
if (!isAllowedToCreateDocuments) {
|
|
182
|
-
throw new Error("User is not allowed to create files");
|
|
183
|
-
}
|
|
184
|
-
const document = await loadFile(file);
|
|
185
|
-
let duplicateId = false;
|
|
186
|
-
const reactorClient = window.ph?.reactorClient;
|
|
187
|
-
if (!reactorClient) {
|
|
188
|
-
throw new Error("ReactorClient not initialized");
|
|
189
|
-
}
|
|
190
|
-
try {
|
|
191
|
-
await reactorClient.get(document.header.id);
|
|
192
|
-
duplicateId = true;
|
|
193
|
-
}
|
|
194
|
-
catch {
|
|
195
|
-
// document id not found
|
|
196
|
-
}
|
|
197
|
-
const documentId = duplicateId ? generateId() : document.header.id;
|
|
198
|
-
const header = createPresignedHeader(documentId, document.header.documentType);
|
|
199
|
-
header.lastModifiedAtUtcIso = document.header.createdAtUtcIso;
|
|
200
|
-
header.meta = document.header.meta;
|
|
201
|
-
header.name = name || document.header.name;
|
|
202
|
-
// copy the document at it's initial state
|
|
203
|
-
const initialDocument = {
|
|
204
|
-
...document,
|
|
205
|
-
header,
|
|
206
|
-
state: document.initialState,
|
|
207
|
-
operations: Object.keys(document.operations).reduce((acc, key) => {
|
|
208
|
-
acc[key] = [];
|
|
209
|
-
return acc;
|
|
210
|
-
}, {}),
|
|
211
|
-
};
|
|
212
|
-
await addDocument(driveId, name || document.header.name, document.header.documentType, parentFolder, initialDocument, documentId, document.header.meta?.preferredEditor);
|
|
213
|
-
// then add all the operations in chunks
|
|
214
|
-
uploadOperations(documentId, document.operations, queueOperations).catch((error) => {
|
|
215
|
-
throw error;
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
export async function addFileWithProgress(file, driveId, name, parentFolder, onProgress, documentTypes, resolveConflict) {
|
|
219
|
-
logger.verbose(`addFileWithProgress(drive: ${driveId}, name: ${name}, folder: ${parentFolder})`);
|
|
220
|
-
const reactor = window.ph?.reactorClient;
|
|
221
|
-
if (!reactor) {
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
225
|
-
if (!isAllowedToCreateDocuments) {
|
|
226
|
-
throw new Error("User is not allowed to create files");
|
|
227
|
-
}
|
|
228
|
-
// Loading stage (0-10%)
|
|
229
|
-
try {
|
|
230
|
-
onProgress?.({ stage: "loading", progress: 0 });
|
|
231
|
-
const document = await loadFile(file);
|
|
232
|
-
// Check for duplicate in same location
|
|
233
|
-
const duplicateCheck = await isDocumentInLocation(document, driveId, parentFolder);
|
|
234
|
-
if (duplicateCheck.isDuplicate && !resolveConflict) {
|
|
235
|
-
// Report conflict and return early
|
|
236
|
-
onProgress?.({
|
|
237
|
-
stage: "conflict",
|
|
238
|
-
progress: 0,
|
|
239
|
-
duplicateType: duplicateCheck.duplicateType,
|
|
240
|
-
});
|
|
241
|
-
return undefined;
|
|
242
|
-
}
|
|
243
|
-
// Handle replace resolution by deleting the existing document
|
|
244
|
-
if (duplicateCheck.isDuplicate &&
|
|
245
|
-
resolveConflict === "replace" &&
|
|
246
|
-
duplicateCheck.nodeId) {
|
|
247
|
-
await deleteNode(driveId, duplicateCheck.nodeId);
|
|
248
|
-
}
|
|
249
|
-
// For "duplicate" resolution, we continue normally which creates a new document
|
|
250
|
-
// with a different ID (the default behavior)
|
|
251
|
-
// Send documentType info immediately after loading
|
|
252
|
-
const documentType = getDocumentTypeIcon(document);
|
|
253
|
-
if (documentType) {
|
|
254
|
-
onProgress?.({ stage: "loading", progress: 10, documentType });
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
onProgress?.({ stage: "loading", progress: 10 });
|
|
258
|
-
}
|
|
259
|
-
if (!isDocumentTypeSupported(document.header.documentType, documentTypes)) {
|
|
260
|
-
onProgress?.({
|
|
261
|
-
stage: "unsupported-document-type",
|
|
262
|
-
progress: 100,
|
|
263
|
-
error: `Document type ${document.header.documentType} is not supported`,
|
|
264
|
-
});
|
|
265
|
-
throw new UnsupportedDocumentTypeError(document.header.documentType);
|
|
266
|
-
}
|
|
267
|
-
// ensure we have the module + can load it (throws if not found)
|
|
268
|
-
await reactor.getDocumentModelModule(document.header.documentType);
|
|
269
|
-
// Initializing stage (10-20%)
|
|
270
|
-
onProgress?.({ stage: "initializing", progress: 10 });
|
|
271
|
-
let duplicateId = false;
|
|
272
|
-
try {
|
|
273
|
-
await reactor.get(document.header.id);
|
|
274
|
-
duplicateId = true;
|
|
275
|
-
}
|
|
276
|
-
catch {
|
|
277
|
-
// document id not found
|
|
278
|
-
}
|
|
279
|
-
const documentId = duplicateId ? generateId() : document.header.id;
|
|
280
|
-
const header = createPresignedHeader(documentId, document.header.documentType);
|
|
281
|
-
header.lastModifiedAtUtcIso = document.header.createdAtUtcIso;
|
|
282
|
-
header.meta = document.header.meta;
|
|
283
|
-
header.name = name || document.header.name;
|
|
284
|
-
// copy the document at it's initial state
|
|
285
|
-
const initialDocument = {
|
|
286
|
-
...document,
|
|
287
|
-
header,
|
|
288
|
-
state: document.initialState,
|
|
289
|
-
operations: Object.keys(document.operations).reduce((acc, key) => {
|
|
290
|
-
acc[key] = [];
|
|
291
|
-
return acc;
|
|
292
|
-
}, {}),
|
|
293
|
-
};
|
|
294
|
-
const fileNode = await addDocument(driveId, name || document.header.name, document.header.documentType, parentFolder, initialDocument, documentId, document.header.meta?.preferredEditor);
|
|
295
|
-
if (!fileNode) {
|
|
296
|
-
throw new Error("There was an error adding file");
|
|
297
|
-
}
|
|
298
|
-
onProgress?.({ stage: "initializing", progress: 20 });
|
|
299
|
-
// Uploading stage (20-100%)
|
|
300
|
-
await uploadOperations(documentId, document.operations, queueOperations, {
|
|
301
|
-
onProgress: (uploadProgress) => {
|
|
302
|
-
if (uploadProgress.totalOperations &&
|
|
303
|
-
uploadProgress.uploadedOperations !== undefined) {
|
|
304
|
-
const uploadPercent = uploadProgress.totalOperations > 0
|
|
305
|
-
? uploadProgress.uploadedOperations /
|
|
306
|
-
uploadProgress.totalOperations
|
|
307
|
-
: 0;
|
|
308
|
-
const overallProgress = 20 + Math.round(uploadPercent * 80);
|
|
309
|
-
onProgress?.({
|
|
310
|
-
stage: "uploading",
|
|
311
|
-
progress: overallProgress,
|
|
312
|
-
totalOperations: uploadProgress.totalOperations,
|
|
313
|
-
uploadedOperations: uploadProgress.uploadedOperations,
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
},
|
|
317
|
-
});
|
|
318
|
-
onProgress?.({ stage: "complete", progress: 100 });
|
|
319
|
-
return fileNode;
|
|
320
|
-
}
|
|
321
|
-
catch (error) {
|
|
322
|
-
// Don't override unsupported-document-type status
|
|
323
|
-
if (!UnsupportedDocumentTypeError.isError(error)) {
|
|
324
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
325
|
-
onProgress?.({
|
|
326
|
-
stage: "failed",
|
|
327
|
-
progress: 100,
|
|
328
|
-
error: errorMessage,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
throw error;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
export async function updateFile(driveId, nodeId, documentType, name, parentFolder) {
|
|
335
|
-
const reactor = window.ph?.reactorClient;
|
|
336
|
-
if (!reactor) {
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
340
|
-
if (!isAllowedToCreateDocuments) {
|
|
341
|
-
throw new Error("User is not allowed to update files");
|
|
342
|
-
}
|
|
343
|
-
const drive = await reactor.get(driveId);
|
|
344
|
-
const unsafeCastAsDrive = (await queueActions(drive, baseUpdateFile({
|
|
345
|
-
id: nodeId,
|
|
346
|
-
name: name ?? undefined,
|
|
347
|
-
parentFolder,
|
|
348
|
-
documentType,
|
|
349
|
-
})));
|
|
350
|
-
const node = unsafeCastAsDrive.state.global.nodes.find((node) => node.id === nodeId);
|
|
351
|
-
if (!node || !isFileNode(node)) {
|
|
352
|
-
throw new Error("There was an error updating document");
|
|
353
|
-
}
|
|
354
|
-
return node;
|
|
355
|
-
}
|
|
356
|
-
export async function addFolder(driveId, name, parentFolder) {
|
|
357
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
358
|
-
if (!isAllowedToCreateDocuments) {
|
|
359
|
-
throw new Error("User is not allowed to create folders");
|
|
360
|
-
}
|
|
361
|
-
const reactorClient = window.ph?.reactorClient;
|
|
362
|
-
if (!reactorClient) {
|
|
363
|
-
throw new Error("ReactorClient not initialized");
|
|
364
|
-
}
|
|
365
|
-
// Get the drive document and add folder action
|
|
366
|
-
const drive = await reactorClient.get(driveId);
|
|
367
|
-
const folderId = generateId();
|
|
368
|
-
const updatedDrive = await reactorClient.execute(driveId, "main", [
|
|
369
|
-
baseAddFolder({
|
|
370
|
-
id: folderId,
|
|
371
|
-
name,
|
|
372
|
-
parentFolder,
|
|
373
|
-
}),
|
|
374
|
-
]);
|
|
375
|
-
const node = updatedDrive.state.global.nodes.find((node) => node.id === folderId);
|
|
376
|
-
if (!node || !isFolderNode(node)) {
|
|
377
|
-
throw new Error("There was an error adding folder");
|
|
378
|
-
}
|
|
379
|
-
return node;
|
|
380
|
-
}
|
|
381
|
-
export async function deleteNode(driveId, nodeId) {
|
|
382
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
383
|
-
if (!isAllowedToCreateDocuments) {
|
|
384
|
-
throw new Error("User is not allowed to delete documents");
|
|
385
|
-
}
|
|
386
|
-
const reactorClient = window.ph?.reactorClient;
|
|
387
|
-
if (!reactorClient) {
|
|
388
|
-
throw new Error("ReactorClient not initialized");
|
|
389
|
-
}
|
|
390
|
-
// delete the node in the drive document
|
|
391
|
-
await reactorClient.execute(driveId, "main", [
|
|
392
|
-
baseDeleteNode({ id: nodeId }),
|
|
393
|
-
]);
|
|
394
|
-
// now delete the document
|
|
395
|
-
await reactorClient.deleteDocument(nodeId);
|
|
396
|
-
}
|
|
397
|
-
export async function renameNode(driveId, nodeId, name) {
|
|
398
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
399
|
-
if (!isAllowedToCreateDocuments) {
|
|
400
|
-
throw new Error("User is not allowed to rename documents");
|
|
401
|
-
}
|
|
402
|
-
const reactorClient = window.ph?.reactorClient;
|
|
403
|
-
if (!reactorClient) {
|
|
404
|
-
throw new Error("ReactorClient not initialized");
|
|
405
|
-
}
|
|
406
|
-
// Rename the node in the drive document using updateNode action
|
|
407
|
-
const drive = await reactorClient.execute(driveId, "main", [updateNode({ id: nodeId, name })]);
|
|
408
|
-
const node = drive.state.global.nodes.find((n) => n.id === nodeId);
|
|
409
|
-
if (!node) {
|
|
410
|
-
throw new Error("There was an error renaming node");
|
|
411
|
-
}
|
|
412
|
-
return node;
|
|
413
|
-
}
|
|
414
|
-
export async function renameDriveNode(driveId, nodeId, name) {
|
|
415
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
416
|
-
if (!isAllowedToCreateDocuments) {
|
|
417
|
-
throw new Error("User is not allowed to rename documents");
|
|
418
|
-
}
|
|
419
|
-
const reactorClient = window.ph?.reactorClient;
|
|
420
|
-
if (!reactorClient) {
|
|
421
|
-
throw new Error("ReactorClient not initialized");
|
|
422
|
-
}
|
|
423
|
-
await reactorClient.execute(driveId, "main", [
|
|
424
|
-
updateNode({ id: nodeId, name }),
|
|
425
|
-
]);
|
|
426
|
-
const drive = await reactorClient.get(driveId);
|
|
427
|
-
return drive.state.global.nodes.find((n) => n.id === nodeId);
|
|
428
|
-
}
|
|
429
|
-
export async function moveNode(driveId, src, target) {
|
|
430
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
431
|
-
if (!isAllowedToCreateDocuments) {
|
|
432
|
-
throw new Error("User is not allowed to move documents");
|
|
433
|
-
}
|
|
434
|
-
const reactorClient = window.ph?.reactorClient;
|
|
435
|
-
if (!reactorClient) {
|
|
436
|
-
throw new Error("ReactorClient not initialized");
|
|
437
|
-
}
|
|
438
|
-
// Get current parent folder from source node
|
|
439
|
-
const sourceParent = src.parentFolder ?? driveId;
|
|
440
|
-
const targetParent = target?.id ?? driveId;
|
|
441
|
-
return await reactorClient.moveChildren(sourceParent, targetParent, [src.id]);
|
|
442
|
-
}
|
|
443
|
-
async function _duplicateDocument(reactor, document, newId = generateId()) {
|
|
444
|
-
const documentModule = await reactor.getDocumentModelModule(document.header.documentType);
|
|
445
|
-
return replayDocument(document.initialState, document.operations, documentModule.reducer, createPresignedHeader(newId, document.header.documentType));
|
|
446
|
-
}
|
|
447
|
-
export async function copyNode(driveId, src, target) {
|
|
448
|
-
const reactor = window.ph?.reactorClient;
|
|
449
|
-
if (!reactor) {
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
const { isAllowedToCreateDocuments } = getUserPermissions();
|
|
453
|
-
if (!isAllowedToCreateDocuments) {
|
|
454
|
-
throw new Error("User is not allowed to copy documents");
|
|
455
|
-
}
|
|
456
|
-
const drive = await reactor.get(driveId);
|
|
457
|
-
const copyNodesInput = generateNodesCopy({
|
|
458
|
-
srcId: src.id,
|
|
459
|
-
targetParentFolder: target?.id,
|
|
460
|
-
targetName: src.name,
|
|
461
|
-
}, () => generateId(), drive.state.global.nodes);
|
|
462
|
-
// Pre-calculate collision-resolved names for all nodes to be copied
|
|
463
|
-
const resolvedNamesMap = new Map();
|
|
464
|
-
for (const copyNodeInput of copyNodesInput) {
|
|
465
|
-
const node = drive.state.global.nodes.find((n) => n.id === copyNodeInput.srcId);
|
|
466
|
-
if (node) {
|
|
467
|
-
const resolvedName = handleTargetNameCollisions({
|
|
468
|
-
nodes: drive.state.global.nodes,
|
|
469
|
-
srcName: copyNodeInput.targetName || node.name,
|
|
470
|
-
targetParentFolder: copyNodeInput.targetParentFolder || null,
|
|
471
|
-
});
|
|
472
|
-
resolvedNamesMap.set(copyNodeInput.targetId, resolvedName);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
const fileNodesToCopy = copyNodesInput.filter((copyNodeInput) => {
|
|
476
|
-
const node = drive.state.global.nodes.find((node) => node.id === copyNodeInput.srcId);
|
|
477
|
-
return node !== undefined && isFileNode(node);
|
|
478
|
-
});
|
|
479
|
-
for (const fileNodeToCopy of fileNodesToCopy) {
|
|
480
|
-
try {
|
|
481
|
-
const document = await reactor.get(fileNodeToCopy.srcId);
|
|
482
|
-
const duplicatedDocument = await _duplicateDocument(reactor, document, fileNodeToCopy.targetId);
|
|
483
|
-
// Set the header name to match the collision-resolved node name
|
|
484
|
-
const resolvedName = resolvedNamesMap.get(fileNodeToCopy.targetId);
|
|
485
|
-
if (resolvedName) {
|
|
486
|
-
duplicatedDocument.header.name = resolvedName;
|
|
487
|
-
}
|
|
488
|
-
await reactor.createDocumentInDrive(driveId, duplicatedDocument, target?.id);
|
|
489
|
-
}
|
|
490
|
-
catch (e) {
|
|
491
|
-
logger.error(`Error copying document ${fileNodeToCopy.srcId}: ${String(e)}`);
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
const copyActions = copyNodesInput.map((copyNodeInput) => baseCopyNode(copyNodeInput));
|
|
495
|
-
return await queueActions(drive, copyActions);
|
|
496
|
-
}
|
|
497
|
-
//# sourceMappingURL=document.js.map
|