aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/util/Import & Export/ImageUtils.ts33
-rw-r--r--src/server/RouteStore.ts1
-rw-r--r--src/server/index.ts10
3 files changed, 42 insertions, 2 deletions
diff --git a/src/client/util/Import & Export/ImageUtils.ts b/src/client/util/Import & Export/ImageUtils.ts
index 33ca55aa9..bf482aea8 100644
--- a/src/client/util/Import & Export/ImageUtils.ts
+++ b/src/client/util/Import & Export/ImageUtils.ts
@@ -1,9 +1,11 @@
-import { Doc } from "../../../new_fields/Doc";
+import { Doc, DocListCast, DocListCastAsync, Opt } from "../../../new_fields/Doc";
import { ImageField } from "../../../new_fields/URLField";
-import { Cast } from "../../../new_fields/Types";
+import { Cast, StrCast } from "../../../new_fields/Types";
import { RouteStore } from "../../../server/RouteStore";
import { Docs } from "../../documents/Documents";
import { Identified } from "../../Network";
+import { Id } from "../../../new_fields/FieldSymbols";
+import { Utils } from "../../../Utils";
export namespace ImageUtils {
@@ -19,4 +21,31 @@ export namespace ImageUtils {
return data !== undefined;
};
+ export type Hierarchy = { [id: string]: string | Hierarchy };
+
+ export const ExportHierarchyToFileSystem = async (doc: Doc): Promise<void> => {
+ const hierarchy: Hierarchy = {};
+ await HierarchyTraverserRecursive(doc, hierarchy);
+ const a = document.createElement("a");
+ a.href = Utils.prepend(`${RouteStore.imageHierarchyExport}/${JSON.stringify(hierarchy)}`);
+ a.download = `Full Export of ${StrCast(doc.title)}`;
+ a.click();
+ };
+
+ const HierarchyTraverserRecursive = async (collection: Doc, hierarchy: Hierarchy) => {
+ const children = await DocListCastAsync(collection.data);
+ if (children) {
+ const local: Hierarchy = {};
+ hierarchy[collection[Id]] = local;
+ for (const child of children) {
+ let imageData: Opt<ImageField>;
+ if (imageData = Cast(child.data, ImageField)) {
+ local[child[Id]] = imageData.url.href;
+ } else {
+ await HierarchyTraverserRecursive(child, local);
+ }
+ }
+ }
+ };
+
} \ No newline at end of file
diff --git a/src/server/RouteStore.ts b/src/server/RouteStore.ts
index 1e1dd6300..8a9a6baae 100644
--- a/src/server/RouteStore.ts
+++ b/src/server/RouteStore.ts
@@ -14,6 +14,7 @@ export enum RouteStore {
dataUriToImage = "/uploadURI",
images = "/images",
inspectImage = "/inspectImage",
+ imageHierarchyExport = "/imageHierarchyExport",
// USER AND WORKSPACES
getCurrUser = "/getCurrentUser",
diff --git a/src/server/index.ts b/src/server/index.ts
index 1ca5d6e11..f9ca3de56 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -320,6 +320,16 @@ app.get("/serializeDoc/:docId", async (req, res) => {
res.send({ docs, files: Array.from(files) });
});
+app.get(`${RouteStore.imageHierarchyExport}/:hierarchy`, async (req, res) => {
+ const hierarchy = JSON.parse(req.params.hierarchy);
+ Object.keys(hierarchy).map(key => {
+ let value: any;
+ if (value = hierarchy[key]) {
+
+ }
+ });
+});
+
app.get("/downloadId/:docId", async (req, res) => {
res.set('Content-disposition', `attachment;`);
res.set('Content-Type', "application/zip");