@powerhousedao/codegen 0.49.2-dev.1 → 0.49.2-dev.11
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/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.js +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.js +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/resolvers.esm.t +40 -8
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/schema.esm.t +14 -5
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/CreateDocument.esm.t +49 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/DriveExplorer.esm.t +214 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/EditorContainer.esm.t +127 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FileItemsGrid.esm.t +44 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderItemsGrid.esm.t +96 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderTree.esm.t +85 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/editor.esm.t +77 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/hooks/useSelectedFolderChildren.esm.t +35 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/hooks/useTransformedNodes.esm.t +35 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.esm.t +20 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/{generate-documents-subgraph → generate-drive-editor}/lib.inject_export.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/types/css.d.esm.t +8 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.js +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.esm.t +9 -23
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.esm.t +16 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-operational/index.js +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-operational/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js.map +1 -0
- package/dist/src/codegen/graphql.d.ts +13 -0
- package/dist/src/codegen/graphql.d.ts.map +1 -1
- package/dist/src/codegen/graphql.js +30 -26
- package/dist/src/codegen/graphql.js.map +1 -0
- package/dist/src/codegen/hygen.d.ts +3 -0
- package/dist/src/codegen/hygen.d.ts.map +1 -1
- package/dist/src/codegen/hygen.js +5 -27
- package/dist/src/codegen/hygen.js.map +1 -0
- package/dist/src/codegen/index.d.ts +1 -0
- package/dist/src/codegen/index.d.ts.map +1 -1
- package/dist/src/codegen/index.js +8 -1
- package/dist/src/codegen/index.js.map +1 -0
- package/dist/src/codegen/utils.js +1 -0
- package/dist/src/codegen/utils.js.map +1 -0
- package/dist/src/create-lib/create-project.js +9 -8
- package/dist/src/create-lib/create-project.js.map +1 -0
- package/dist/src/create-lib/index.js +1 -0
- package/dist/src/create-lib/index.js.map +1 -0
- package/dist/src/utils/cli.js +1 -0
- package/dist/src/utils/cli.js.map +1 -0
- package/dist/src/utils/index.js +1 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/mock.js +1 -0
- package/dist/src/utils/mock.js.map +1 -0
- package/dist/src/utils/package-manager.js +1 -0
- package/dist/src/utils/package-manager.js.map +1 -0
- package/dist/tsconfig.hygen.tsbuildinfo +1 -1
- package/dist/{tsconfig.tsbuildinfo → tsconfig.lib.tsbuildinfo} +1 -1
- package/package.json +7 -5
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-documents-subgraph/index.d.ts +0 -15
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-documents-subgraph/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-documents-subgraph/index.esm.t +0 -15
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-documents-subgraph/index.js +0 -11
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-documents-subgraph/resolvers.esm.t +0 -40
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-documents-subgraph/schema.esm.t +0 -12
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.inject_export.esm.t +0 -7
- /package/dist/src/codegen/.hygen/templates/powerhouse/{generate-documents-subgraph → generate-drive-editor}/lib.esm.t +0 -0
package/dist/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/codegen/.hygen/templates/powerhouse/generate-document-model/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.ts"],"names":[],"mappings":";;AAAA,6CAAwC;AAaxC,kBAAe;IACb,MAAM,EAAE,CAAC,EAAE,IAAI,EAAwB,EAAE,EAAE;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAuB,CAAC;QAC3E,MAAM,UAAU,GACd,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxE,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAC9B,CAAC;QAEF,MAAM,OAAO,GACX,eAAe,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI;gBAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC;gBACjD,uEAAuE;gBACvE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,QAAQ;gBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,gCAAgC;gBAC5E,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;YACL,CAAC,CAAC,EAAE,CAAC;QAET,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,aAAa,CAAC,IAAI;YAChC,MAAM,EAAE,IAAA,uBAAS,EAAC,IAAI,CAAC,MAAM,CAAC;YAC9B,OAAO;SACR,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.ts"],"names":[],"mappings":";;AAAA,6CAAwC;AASxC,MAAM,8BAA8B,GAAG;IACrC,MAAM,EAAE,CAAC,EACP,IAAI,GAGL,EAOC,EAAE;QACF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAuB,CAAC;QAC3E,MAAM,UAAU,GACd,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAExE,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,aAAa,CAAC,EAAE;YAChC,YAAY,EAAE,aAAa,CAAC,IAAI;YAChC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;YACtC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,GAAG,CAAC;gBACJ,IAAI,EAAE,IAAA,uBAAS,EAAC,CAAC,CAAC,IAAI,CAAC;aACxB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF,CAAC;AACF,kBAAe,8BAA8B,CAAC"}
|
|
@@ -16,6 +16,46 @@ export const getResolvers = (subgraph: Subgraph) => {
|
|
|
16
16
|
const reactor = subgraph.reactor;
|
|
17
17
|
|
|
18
18
|
return ({
|
|
19
|
+
Query: {
|
|
20
|
+
<%- h.changeCase.pascal(documentType) %>: async (_: any, args: any, ctx: any) => {
|
|
21
|
+
return {
|
|
22
|
+
getDocument: async (args: any) => {
|
|
23
|
+
const driveId: string = args.driveId || DEFAULT_DRIVE_ID;
|
|
24
|
+
const docId: string = args.docId || "";
|
|
25
|
+
const doc = await reactor.getDocument(driveId, docId);
|
|
26
|
+
return {
|
|
27
|
+
id: docId,
|
|
28
|
+
driveId: driveId,
|
|
29
|
+
...doc,
|
|
30
|
+
state: doc.state.global,
|
|
31
|
+
stateJSON: doc.state.global,
|
|
32
|
+
revision: doc.revision.global,
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
getDocuments: async (args: any) => {
|
|
36
|
+
const driveId: string = args.driveId || DEFAULT_DRIVE_ID;
|
|
37
|
+
const docsIds = await reactor.getDocuments(driveId);
|
|
38
|
+
const docs = await Promise.all(
|
|
39
|
+
docsIds.map(async (docId) => {
|
|
40
|
+
const doc = await reactor.getDocument(driveId, docId);
|
|
41
|
+
return {
|
|
42
|
+
id: docId,
|
|
43
|
+
driveId: driveId,
|
|
44
|
+
...doc,
|
|
45
|
+
state: doc.state.global,
|
|
46
|
+
stateJSON: doc.state.global,
|
|
47
|
+
revision: doc.revision.global,
|
|
48
|
+
};
|
|
49
|
+
}),
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
return docs.filter(
|
|
53
|
+
(doc) => doc.documentType === "<%- documentTypeId %>",
|
|
54
|
+
);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
},
|
|
19
59
|
Mutation: {
|
|
20
60
|
|
|
21
61
|
<%- h.changeCase.pascal(documentType) %>_createDocument: async (_: any, args: any) => {
|
|
@@ -62,13 +102,5 @@ export const getResolvers = (subgraph: Subgraph) => {
|
|
|
62
102
|
|
|
63
103
|
<%_ })}); %>
|
|
64
104
|
},
|
|
65
|
-
Query: {
|
|
66
|
-
<%- h.changeCase.pascal(documentType) %>: async (_: any, args: any) => {
|
|
67
|
-
const driveId: string = args.driveId || DEFAULT_DRIVE_ID;
|
|
68
|
-
const docId: string = args.docId || "";
|
|
69
|
-
const doc = await reactor.getDocument(driveId, docId);
|
|
70
|
-
return doc.state.global;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
105
|
});
|
|
74
106
|
};
|
package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/schema.esm.t
CHANGED
|
@@ -12,6 +12,19 @@ Subgraph definition for <%= h.changeCase.pascal(documentType) %> (<%- documentTy
|
|
|
12
12
|
"""
|
|
13
13
|
<%- schema %>
|
|
14
14
|
|
|
15
|
+
"""
|
|
16
|
+
Queries: <%= h.changeCase.pascal(documentType) %>
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
type <%- h.changeCase.pascal(documentType) %>Queries {
|
|
20
|
+
getDocument(driveId: String, docId: PHID): <%- h.changeCase.pascal(documentType) %>
|
|
21
|
+
getDocuments: [<%- h.changeCase.pascal(documentType) %>!]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type Query {
|
|
25
|
+
<%- h.changeCase.pascal(documentType) %>: <%- h.changeCase.pascal(documentType) %>Queries
|
|
26
|
+
}
|
|
27
|
+
|
|
15
28
|
"""
|
|
16
29
|
Mutations: <%= h.changeCase.pascal(documentType) %>
|
|
17
30
|
"""
|
|
@@ -31,10 +44,6 @@ type Mutation {
|
|
|
31
44
|
Module: <%= h.changeCase.pascal(module.name) %>
|
|
32
45
|
"""
|
|
33
46
|
<% module.operations.forEach(op => { _%>
|
|
34
|
-
<%- op.schema.replace('input ', 'input ' + h.changeCase.pascal(documentType) + '_') %>
|
|
47
|
+
<%- op.schema.replace('input ', 'input ' + h.changeCase.pascal(documentType) + '_').replace('type ', 'type ' + h.changeCase.pascal(documentType) + '_') %>
|
|
35
48
|
<%_ })}); %>
|
|
36
|
-
|
|
37
|
-
type Query {
|
|
38
|
-
<%- h.changeCase.pascal(documentType) %>(driveId:String, docId:PHID): <%- h.changeCase.pascal(documentType) %>State
|
|
39
|
-
}
|
|
40
49
|
`
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/CreateDocument.tsx"
|
|
3
|
+
unless_exists: true
|
|
4
|
+
---
|
|
5
|
+
import { Button } from "@powerhousedao/design-system";
|
|
6
|
+
import { type DocumentModelModule } from "document-model";
|
|
7
|
+
|
|
8
|
+
interface CreateDocumentProps {
|
|
9
|
+
documentModels?: DocumentModelModule[];
|
|
10
|
+
createDocument: (doc: DocumentModelModule) => void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function getDocumentSpec(doc: DocumentModelModule) {
|
|
14
|
+
if ("documentModelState" in doc) {
|
|
15
|
+
return doc.documentModelState as DocumentModelModule["documentModel"];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return doc.documentModel;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const CreateDocument: React.FC<CreateDocumentProps> = ({
|
|
22
|
+
documentModels,
|
|
23
|
+
createDocument,
|
|
24
|
+
}) => {
|
|
25
|
+
return (
|
|
26
|
+
<div className="px-6">
|
|
27
|
+
<h3 className="mb-3 mt-4 text-sm font-bold text-gray-600">
|
|
28
|
+
New document
|
|
29
|
+
</h3>
|
|
30
|
+
<div className="flex w-full flex-wrap gap-4">
|
|
31
|
+
{documentModels?.map((doc) => {
|
|
32
|
+
const spec = getDocumentSpec(doc);
|
|
33
|
+
return (
|
|
34
|
+
<Button
|
|
35
|
+
key={spec.id}
|
|
36
|
+
color="light"
|
|
37
|
+
size="small"
|
|
38
|
+
className="cursor-pointer"
|
|
39
|
+
aria-details={spec.description}
|
|
40
|
+
onClick={() => createDocument(doc)}
|
|
41
|
+
>
|
|
42
|
+
<span className="text-sm">{spec.name}</span>
|
|
43
|
+
</Button>
|
|
44
|
+
);
|
|
45
|
+
})}
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/DriveExplorer.tsx"
|
|
3
|
+
unless_exists: true
|
|
4
|
+
---
|
|
5
|
+
import {
|
|
6
|
+
type BaseUiFileNode,
|
|
7
|
+
type BaseUiFolderNode,
|
|
8
|
+
type BaseUiNode,
|
|
9
|
+
type UiFileNode,
|
|
10
|
+
type UiFolderNode,
|
|
11
|
+
type UiNode,
|
|
12
|
+
} from "@powerhousedao/design-system";
|
|
13
|
+
import { useCallback, useState, useRef, useEffect } from "react";
|
|
14
|
+
import type { FileNode, Node } from "document-drive";
|
|
15
|
+
import { FileItemsGrid } from "./FileItemsGrid.js";
|
|
16
|
+
import { FolderItemsGrid } from "./FolderItemsGrid.js";
|
|
17
|
+
import { FolderTree } from "./FolderTree.js";
|
|
18
|
+
import { useTransformedNodes } from "../hooks/useTransformedNodes.js";
|
|
19
|
+
import { useSelectedFolderChildren } from "../hooks/useSelectedFolderChildren.js";
|
|
20
|
+
import { EditorContainer } from "./EditorContainer.js";
|
|
21
|
+
import type { EditorContext, DocumentModelModule } from "document-model";
|
|
22
|
+
import { CreateDocumentModal } from "@powerhousedao/design-system";
|
|
23
|
+
import { CreateDocument } from "./CreateDocument.js";
|
|
24
|
+
import { useDriveContext } from "@powerhousedao/reactor-browser";
|
|
25
|
+
|
|
26
|
+
interface DriveExplorerProps {
|
|
27
|
+
driveId: string;
|
|
28
|
+
nodes: Node[];
|
|
29
|
+
onAddFolder: (name: string, parentFolder?: string) => void;
|
|
30
|
+
onDeleteNode: (nodeId: string) => void;
|
|
31
|
+
renameNode: (nodeId: string, name: string) => void;
|
|
32
|
+
onCopyNode: (nodeId: string, targetName: string, parentId?: string) => void;
|
|
33
|
+
context: EditorContext;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function DriveExplorer({
|
|
37
|
+
driveId,
|
|
38
|
+
nodes,
|
|
39
|
+
onDeleteNode,
|
|
40
|
+
renameNode,
|
|
41
|
+
onAddFolder,
|
|
42
|
+
onCopyNode,
|
|
43
|
+
context,
|
|
44
|
+
}: DriveExplorerProps) {
|
|
45
|
+
const [selectedNodeId, setSelectedNodeId] = useState<string | undefined>();
|
|
46
|
+
const [activeDocumentId, setActiveDocumentId] = useState<
|
|
47
|
+
string | undefined
|
|
48
|
+
>();
|
|
49
|
+
const [openModal, setOpenModal] = useState(false);
|
|
50
|
+
const selectedDocumentModel = useRef<DocumentModelModule | null>(null);
|
|
51
|
+
const { addDocument, documentModels } = useDriveContext();
|
|
52
|
+
|
|
53
|
+
// Dummy functions to satisfy component types
|
|
54
|
+
const dummyDuplicateNode = useCallback((node: BaseUiNode) => {
|
|
55
|
+
console.log("Duplicate node:", node);
|
|
56
|
+
}, []);
|
|
57
|
+
|
|
58
|
+
const dummyAddFile = useCallback(
|
|
59
|
+
async (file: File, parentNode: BaseUiNode | null) => {
|
|
60
|
+
console.log("Add file:", file, parentNode);
|
|
61
|
+
},
|
|
62
|
+
[]
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const dummyMoveNode = useCallback(
|
|
66
|
+
async (uiNode: BaseUiNode, targetNode: BaseUiNode) => {
|
|
67
|
+
console.log("Move node:", uiNode, targetNode);
|
|
68
|
+
},
|
|
69
|
+
[]
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const handleNodeSelect = useCallback((node: BaseUiFolderNode) => {
|
|
73
|
+
console.log("Selected node:", node);
|
|
74
|
+
setSelectedNodeId(node.id);
|
|
75
|
+
}, []);
|
|
76
|
+
|
|
77
|
+
const handleFileSelect = useCallback((node: BaseUiFileNode) => {
|
|
78
|
+
setActiveDocumentId(node.id);
|
|
79
|
+
}, []);
|
|
80
|
+
|
|
81
|
+
const handleEditorClose = useCallback(() => {
|
|
82
|
+
setActiveDocumentId(undefined);
|
|
83
|
+
}, []);
|
|
84
|
+
|
|
85
|
+
const onCreateDocument = useCallback(
|
|
86
|
+
async (fileName: string) => {
|
|
87
|
+
setOpenModal(false);
|
|
88
|
+
|
|
89
|
+
const documentModel = selectedDocumentModel.current;
|
|
90
|
+
if (!documentModel) return;
|
|
91
|
+
|
|
92
|
+
const node = await addDocument(
|
|
93
|
+
driveId,
|
|
94
|
+
fileName,
|
|
95
|
+
documentModel.documentModel.id
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
selectedDocumentModel.current = null;
|
|
99
|
+
setActiveDocumentId(node.id);
|
|
100
|
+
},
|
|
101
|
+
[addDocument, driveId]
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const onSelectDocumentModel = useCallback(
|
|
105
|
+
(documentModel: DocumentModelModule) => {
|
|
106
|
+
selectedDocumentModel.current = documentModel;
|
|
107
|
+
setOpenModal(true);
|
|
108
|
+
},
|
|
109
|
+
[]
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
const filteredDocumentModels = documentModels;
|
|
113
|
+
|
|
114
|
+
// Transform nodes using the custom hook
|
|
115
|
+
const transformedNodes = useTransformedNodes(nodes, driveId);
|
|
116
|
+
|
|
117
|
+
// Separate folders and files
|
|
118
|
+
const folders = transformedNodes.filter(
|
|
119
|
+
(node): node is UiFolderNode => node.kind === "FOLDER"
|
|
120
|
+
);
|
|
121
|
+
const files = transformedNodes.filter(
|
|
122
|
+
(node): node is UiFileNode => node.kind === "FILE"
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Get children of selected folder using the custom hook
|
|
126
|
+
const selectedFolderChildren = useSelectedFolderChildren(
|
|
127
|
+
selectedNodeId,
|
|
128
|
+
folders,
|
|
129
|
+
files
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
// Get the active document info from nodes
|
|
133
|
+
const activeDocument = activeDocumentId
|
|
134
|
+
? files.find((file) => file.id === activeDocumentId)
|
|
135
|
+
: undefined;
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
<div className="flex h-full">
|
|
139
|
+
{/* Sidebar */}
|
|
140
|
+
<div className="w-64 border-r border-gray-200 p-4 overflow-y-auto">
|
|
141
|
+
<h2 className="text-lg font-semibold mb-4">Folders</h2>
|
|
142
|
+
<FolderTree
|
|
143
|
+
folders={folders}
|
|
144
|
+
selectedNodeId={selectedNodeId}
|
|
145
|
+
onSelectNode={handleNodeSelect}
|
|
146
|
+
/>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
{/* Main Content */}
|
|
150
|
+
<div className="flex-1 p-4 overflow-y-auto">
|
|
151
|
+
{activeDocument ? (
|
|
152
|
+
<EditorContainer
|
|
153
|
+
context={context}
|
|
154
|
+
documentId={activeDocumentId!}
|
|
155
|
+
documentType={activeDocument.documentType}
|
|
156
|
+
driveId={driveId}
|
|
157
|
+
onClose={handleEditorClose}
|
|
158
|
+
title={activeDocument.name}
|
|
159
|
+
/>
|
|
160
|
+
) : (
|
|
161
|
+
<>
|
|
162
|
+
<h2 className="text-lg font-semibold mb-4">Contents</h2>
|
|
163
|
+
|
|
164
|
+
{/* Folders Section */}
|
|
165
|
+
<FolderItemsGrid
|
|
166
|
+
folders={selectedFolderChildren.folders}
|
|
167
|
+
onSelectNode={handleNodeSelect}
|
|
168
|
+
onRenameNode={renameNode}
|
|
169
|
+
onDuplicateNode={(uiNode) =>
|
|
170
|
+
onCopyNode(
|
|
171
|
+
uiNode.id,
|
|
172
|
+
"Copy of " + uiNode.name,
|
|
173
|
+
uiNode.parentFolder
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
onDeleteNode={onDeleteNode}
|
|
177
|
+
onAddFile={dummyAddFile}
|
|
178
|
+
onCopyNode={async (uiNode, targetNode) =>
|
|
179
|
+
onCopyNode(uiNode.id, "Copy of " + uiNode.name, targetNode.id)
|
|
180
|
+
}
|
|
181
|
+
onMoveNode={dummyMoveNode}
|
|
182
|
+
isAllowedToCreateDocuments={true}
|
|
183
|
+
onAddFolder={onAddFolder}
|
|
184
|
+
parentFolderId={selectedNodeId}
|
|
185
|
+
/>
|
|
186
|
+
|
|
187
|
+
{/* Files Section */}
|
|
188
|
+
<FileItemsGrid
|
|
189
|
+
files={selectedFolderChildren.files}
|
|
190
|
+
onSelectNode={handleFileSelect}
|
|
191
|
+
onRenameNode={renameNode}
|
|
192
|
+
onDuplicateNode={dummyDuplicateNode}
|
|
193
|
+
onDeleteNode={onDeleteNode}
|
|
194
|
+
isAllowedToCreateDocuments={true}
|
|
195
|
+
/>
|
|
196
|
+
|
|
197
|
+
{/* Create Document Section */}
|
|
198
|
+
<CreateDocument
|
|
199
|
+
createDocument={onSelectDocumentModel}
|
|
200
|
+
documentModels={filteredDocumentModels}
|
|
201
|
+
/>
|
|
202
|
+
</>
|
|
203
|
+
)}
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
{/* Create Document Modal */}
|
|
207
|
+
<CreateDocumentModal
|
|
208
|
+
onContinue={onCreateDocument}
|
|
209
|
+
onOpenChange={(open) => setOpenModal(open)}
|
|
210
|
+
open={openModal}
|
|
211
|
+
/>
|
|
212
|
+
</div>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/EditorContainer.tsx"
|
|
3
|
+
unless_exists: true
|
|
4
|
+
---
|
|
5
|
+
import {
|
|
6
|
+
useDriveContext,
|
|
7
|
+
exportDocument,
|
|
8
|
+
type User,
|
|
9
|
+
} from "@powerhousedao/reactor-browser";
|
|
10
|
+
import {
|
|
11
|
+
documentModelDocumentModelModule,
|
|
12
|
+
type DocumentModelModule,
|
|
13
|
+
type EditorContext,
|
|
14
|
+
type EditorProps,
|
|
15
|
+
type PHDocument,
|
|
16
|
+
} from "document-model";
|
|
17
|
+
import {
|
|
18
|
+
DocumentToolbar,
|
|
19
|
+
RevisionHistory,
|
|
20
|
+
DefaultEditorLoader,
|
|
21
|
+
} from "@powerhousedao/design-system";
|
|
22
|
+
import { useState, Suspense, type FC, useCallback, lazy } from "react";
|
|
23
|
+
|
|
24
|
+
export interface EditorContainerProps {
|
|
25
|
+
driveId: string;
|
|
26
|
+
documentId: string;
|
|
27
|
+
documentType: string;
|
|
28
|
+
onClose: () => void;
|
|
29
|
+
title: string;
|
|
30
|
+
context: EditorContext;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const documentModelsMap = {
|
|
34
|
+
[documentModelDocumentModelModule.documentModel.id]: documentModelDocumentModelModule,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const documentEditorMap = {
|
|
38
|
+
[documentModelDocumentModelModule.documentModel.id]: lazy(() =>
|
|
39
|
+
import('@powerhousedao/builder-tools/style.css').then(() =>
|
|
40
|
+
import("@powerhousedao/builder-tools/document-model-editor").then((m) => ({
|
|
41
|
+
default: m.documentModelEditorModule.Component,
|
|
42
|
+
}))
|
|
43
|
+
)
|
|
44
|
+
),
|
|
45
|
+
} as const;
|
|
46
|
+
|
|
47
|
+
function getDocumentModel(documentType: string) {
|
|
48
|
+
return documentModelsMap[documentType];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function getDocumentEditor(documentType: string) {
|
|
52
|
+
return documentEditorMap[documentType];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const EditorContainer: React.FC<EditorContainerProps> = (props) => {
|
|
56
|
+
const { driveId, documentId, documentType, onClose, title, context } = props;
|
|
57
|
+
|
|
58
|
+
const [showRevisionHistory, setShowRevisionHistory] = useState(false);
|
|
59
|
+
const { useDocumentEditorProps } = useDriveContext();
|
|
60
|
+
const user = context.user as User | undefined;
|
|
61
|
+
|
|
62
|
+
const documentModelModule = getDocumentModel(
|
|
63
|
+
documentType,
|
|
64
|
+
) as DocumentModelModule<PHDocument>;
|
|
65
|
+
|
|
66
|
+
const { dispatch, error, document } = useDocumentEditorProps({
|
|
67
|
+
documentId,
|
|
68
|
+
documentType,
|
|
69
|
+
driveId,
|
|
70
|
+
documentModelModule,
|
|
71
|
+
user,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const onExport = useCallback(async () => {
|
|
75
|
+
if (document) {
|
|
76
|
+
const ext = documentModelModule.documentModel.extension;
|
|
77
|
+
await exportDocument(document, title, ext);
|
|
78
|
+
}
|
|
79
|
+
}, [document?.revision.global, document?.revision.local]);
|
|
80
|
+
|
|
81
|
+
const loadingContent = (
|
|
82
|
+
<div className="flex-1 flex justify-center items-center h-full">
|
|
83
|
+
<DefaultEditorLoader />
|
|
84
|
+
</div>
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
if (!document) return loadingContent;
|
|
88
|
+
|
|
89
|
+
const Editor = getDocumentEditor(documentType);
|
|
90
|
+
|
|
91
|
+
if (!Editor) {
|
|
92
|
+
console.error("No editor found for document type:", documentType);
|
|
93
|
+
return (
|
|
94
|
+
<div className="flex-1">
|
|
95
|
+
No editor found for document type: {documentType}
|
|
96
|
+
</div>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
const EditorComponent = Editor as FC<EditorProps<PHDocument>>;
|
|
100
|
+
|
|
101
|
+
return showRevisionHistory ? (
|
|
102
|
+
<RevisionHistory
|
|
103
|
+
documentId={documentId}
|
|
104
|
+
documentTitle={title}
|
|
105
|
+
globalOperations={document.operations.global}
|
|
106
|
+
key={documentId}
|
|
107
|
+
localOperations={document.operations.local}
|
|
108
|
+
onClose={() => setShowRevisionHistory(false)}
|
|
109
|
+
/>
|
|
110
|
+
) : (
|
|
111
|
+
<Suspense fallback={loadingContent}>
|
|
112
|
+
<DocumentToolbar
|
|
113
|
+
onClose={onClose}
|
|
114
|
+
onExport={onExport}
|
|
115
|
+
onShowRevisionHistory={() => setShowRevisionHistory(true)}
|
|
116
|
+
onSwitchboardLinkClick={() => {}}
|
|
117
|
+
title={title}
|
|
118
|
+
/>
|
|
119
|
+
<EditorComponent
|
|
120
|
+
context={context}
|
|
121
|
+
dispatch={dispatch}
|
|
122
|
+
document={document}
|
|
123
|
+
error={error}
|
|
124
|
+
/>
|
|
125
|
+
</Suspense>
|
|
126
|
+
);
|
|
127
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/FileItemsGrid.tsx"
|
|
3
|
+
unless_exists: true
|
|
4
|
+
---
|
|
5
|
+
import { FileItem, type UiFileNode, type BaseUiFileNode } from "@powerhousedao/design-system";
|
|
6
|
+
|
|
7
|
+
interface FileItemsGridProps {
|
|
8
|
+
files: UiFileNode[];
|
|
9
|
+
onSelectNode: (node: BaseUiFileNode) => void;
|
|
10
|
+
onRenameNode: (nodeId: string, name: string) => void;
|
|
11
|
+
onDuplicateNode: (node: BaseUiFileNode) => void;
|
|
12
|
+
onDeleteNode: (nodeId: string) => void;
|
|
13
|
+
isAllowedToCreateDocuments: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function FileItemsGrid({
|
|
17
|
+
files,
|
|
18
|
+
onSelectNode,
|
|
19
|
+
onRenameNode,
|
|
20
|
+
onDuplicateNode,
|
|
21
|
+
onDeleteNode,
|
|
22
|
+
isAllowedToCreateDocuments,
|
|
23
|
+
}: FileItemsGridProps) {
|
|
24
|
+
if (files.length === 0) return null;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div>
|
|
28
|
+
<h3 className="text-sm font-medium text-gray-500 mb-2">Files</h3>
|
|
29
|
+
<div className="flex flex-wrap gap-2">
|
|
30
|
+
{files.map((file) => (
|
|
31
|
+
<FileItem
|
|
32
|
+
key={file.id}
|
|
33
|
+
uiNode={file}
|
|
34
|
+
onSelectNode={onSelectNode}
|
|
35
|
+
onRenameNode={(name) => onRenameNode(file.id, name)}
|
|
36
|
+
onDuplicateNode={onDuplicateNode}
|
|
37
|
+
onDeleteNode={() => onDeleteNode(file.id)}
|
|
38
|
+
isAllowedToCreateDocuments={isAllowedToCreateDocuments}
|
|
39
|
+
/>
|
|
40
|
+
))}
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/FolderItemsGrid.tsx"
|
|
3
|
+
unless_exists: true
|
|
4
|
+
---
|
|
5
|
+
import {
|
|
6
|
+
FolderItem,
|
|
7
|
+
type UiFolderNode,
|
|
8
|
+
type UiNode,
|
|
9
|
+
type BaseUiFolderNode,
|
|
10
|
+
type BaseUiNode,
|
|
11
|
+
} from "@powerhousedao/design-system";
|
|
12
|
+
import { useState } from "react";
|
|
13
|
+
|
|
14
|
+
interface FolderItemsGridProps {
|
|
15
|
+
folders: UiFolderNode[];
|
|
16
|
+
onSelectNode: (node: BaseUiFolderNode) => void;
|
|
17
|
+
onRenameNode: (nodeId: string, name: string) => void;
|
|
18
|
+
onDuplicateNode: (node: BaseUiFolderNode) => void;
|
|
19
|
+
onDeleteNode: (nodeId: string) => void;
|
|
20
|
+
onAddFile: (file: File, parentNode: BaseUiNode | null) => Promise<void>;
|
|
21
|
+
onCopyNode: (uiNode: BaseUiNode, targetNode: BaseUiNode) => Promise<void>;
|
|
22
|
+
onMoveNode: (uiNode: BaseUiNode, targetNode: BaseUiNode) => Promise<void>;
|
|
23
|
+
isAllowedToCreateDocuments: boolean;
|
|
24
|
+
onAddFolder: (name: string, parentFolder?: string) => void;
|
|
25
|
+
parentFolderId?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function FolderItemsGrid({
|
|
29
|
+
folders,
|
|
30
|
+
onSelectNode,
|
|
31
|
+
onRenameNode,
|
|
32
|
+
onDuplicateNode,
|
|
33
|
+
onDeleteNode,
|
|
34
|
+
onAddFile,
|
|
35
|
+
onCopyNode,
|
|
36
|
+
onMoveNode,
|
|
37
|
+
isAllowedToCreateDocuments,
|
|
38
|
+
onAddFolder,
|
|
39
|
+
parentFolderId,
|
|
40
|
+
}: FolderItemsGridProps) {
|
|
41
|
+
const [newFolderName, setNewFolderName] = useState("");
|
|
42
|
+
|
|
43
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
if (newFolderName.trim()) {
|
|
46
|
+
onAddFolder(newFolderName.trim(), parentFolderId);
|
|
47
|
+
setNewFolderName("");
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div className="mb-6">
|
|
53
|
+
<div className="flex items-center gap-4 mb-2">
|
|
54
|
+
<h3 className="text-sm font-medium text-gray-500">Folders</h3>
|
|
55
|
+
|
|
56
|
+
{/* New Folder Input */}
|
|
57
|
+
<form onSubmit={handleSubmit} className="w-48">
|
|
58
|
+
<div className="relative">
|
|
59
|
+
<input
|
|
60
|
+
type="text"
|
|
61
|
+
value={newFolderName}
|
|
62
|
+
onChange={(e) => setNewFolderName(e.target.value)}
|
|
63
|
+
placeholder="Create new folder..."
|
|
64
|
+
className="w-full px-3 py-1.5 pr-8 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
65
|
+
/>
|
|
66
|
+
<button
|
|
67
|
+
type="submit"
|
|
68
|
+
className="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 focus:outline-none text-sm"
|
|
69
|
+
>
|
|
70
|
+
+
|
|
71
|
+
</button>
|
|
72
|
+
</div>
|
|
73
|
+
</form>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
{folders.length > 0 && (
|
|
77
|
+
<div className="flex flex-wrap gap-2">
|
|
78
|
+
{folders.map((folder) => (
|
|
79
|
+
<FolderItem
|
|
80
|
+
key={folder.id}
|
|
81
|
+
uiNode={folder}
|
|
82
|
+
onSelectNode={onSelectNode}
|
|
83
|
+
onRenameNode={(name) => onRenameNode(folder.id, name)}
|
|
84
|
+
onDuplicateNode={onDuplicateNode}
|
|
85
|
+
onDeleteNode={() => onDeleteNode(folder.id)}
|
|
86
|
+
onAddFile={onAddFile}
|
|
87
|
+
onCopyNode={onCopyNode}
|
|
88
|
+
onMoveNode={onMoveNode}
|
|
89
|
+
isAllowedToCreateDocuments={isAllowedToCreateDocuments}
|
|
90
|
+
/>
|
|
91
|
+
))}
|
|
92
|
+
</div>
|
|
93
|
+
)}
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|