@powerhousedao/codegen 5.0.0-staging.9 → 5.0.1-staging.3
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/README.md +0 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.js +8 -10
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/resolvers.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/schema.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/documentModel.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.esm.t +0 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.js +69 -54
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/ph-factories.esm.t +14 -17
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/reducer.esm.t +3 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/rootIndex.esm.t +5 -4
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/types.esm.t +16 -6
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/utils.esm.t +37 -51
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/creators.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js +52 -39
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.js +21 -20
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/resolvers.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/schema.esm.t +1 -7
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/CreateDocument.esm.t +20 -23
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/DriveExplorer.esm.t +53 -201
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderTree.esm.t +92 -87
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/config.esm.t +10 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/editor.esm.t +7 -35
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.esm.t +5 -9
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js +11 -11
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/editor.esm.t +103 -18
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/hooks.esm.t +16 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.esm.t +3 -7
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js +28 -16
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.js +8 -10
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/factory.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.esm.t +3 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js +11 -15
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.root.inject.esm.t +12 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/factory.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.esm.t +3 -4
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.js +11 -15
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.root.inject.esm.t +12 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/lib.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/migrations.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.esm.t +3 -3
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js +9 -11
- package/dist/src/codegen/generate.d.ts +33 -0
- package/dist/src/codegen/generate.d.ts.map +1 -0
- package/dist/src/codegen/generate.js +202 -0
- package/dist/src/codegen/generate.js.map +1 -0
- package/dist/src/codegen/graphql.d.ts +2 -2
- package/dist/src/codegen/graphql.d.ts.map +1 -1
- package/dist/src/codegen/graphql.js +1 -1
- package/dist/src/codegen/graphql.js.map +1 -1
- package/dist/src/codegen/hygen.d.ts +15 -10
- package/dist/src/codegen/hygen.d.ts.map +1 -1
- package/dist/src/codegen/hygen.js +28 -19
- package/dist/src/codegen/hygen.js.map +1 -1
- package/dist/src/codegen/index.d.ts +6 -34
- package/dist/src/codegen/index.d.ts.map +1 -1
- package/dist/src/codegen/index.js +6 -249
- package/dist/src/codegen/index.js.map +1 -1
- package/dist/src/codegen/types.d.ts +9 -0
- package/dist/src/codegen/types.d.ts.map +1 -0
- package/dist/src/codegen/types.js +2 -0
- package/dist/src/codegen/types.js.map +1 -0
- package/dist/src/codegen/utils.d.ts +5 -2
- package/dist/src/codegen/utils.d.ts.map +1 -1
- package/dist/src/codegen/utils.js +42 -4
- package/dist/src/codegen/utils.js.map +1 -1
- package/dist/src/create-lib/create-project.d.ts.map +1 -1
- package/dist/src/create-lib/create-project.js +17 -2
- package/dist/src/create-lib/create-project.js.map +1 -1
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ts-morph-generator/core/FileGenerator.d.ts +2 -3
- package/dist/src/ts-morph-generator/core/FileGenerator.d.ts.map +1 -1
- package/dist/src/ts-morph-generator/core/FileGenerator.js.map +1 -1
- package/dist/src/ts-morph-generator/core/GenerationContext.d.ts +17 -9
- package/dist/src/ts-morph-generator/core/GenerationContext.d.ts.map +1 -1
- package/dist/src/ts-morph-generator/{file-generators → core}/ReducerGenerator.d.ts +2 -2
- package/dist/src/ts-morph-generator/core/ReducerGenerator.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/{file-generators → core}/ReducerGenerator.js +3 -3
- package/dist/src/ts-morph-generator/core/ReducerGenerator.js.map +1 -0
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts +3 -3
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts.map +1 -1
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js +2 -3
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js.map +1 -1
- package/dist/src/ts-morph-generator/index.d.ts +2 -2
- package/dist/src/ts-morph-generator/index.d.ts.map +1 -1
- package/dist/src/ts-morph-generator/index.js +2 -2
- package/dist/src/ts-morph-generator/index.js.map +1 -1
- package/dist/src/ts-morph-generator/utilities/DirectoryManager.d.ts +2 -2
- package/dist/src/ts-morph-generator/utilities/DirectoryManager.d.ts.map +1 -1
- package/dist/src/ts-morph-generator/utilities/ImportManager.d.ts +1 -1
- package/dist/src/ts-morph-generator/utilities/ImportManager.d.ts.map +1 -1
- package/dist/src/utils/index.d.ts +0 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +0 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/validation.d.ts +6 -6
- package/dist/src/utils/validation.d.ts.map +1 -1
- package/dist/src/utils/validation.js +2 -2
- package/dist/src/utils/validation.js.map +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +24 -33
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.d.ts +0 -14
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.d.ts +0 -25
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/object.esm.t +0 -49
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts +0 -27
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/object.esm.t +0 -32
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.d.ts +0 -22
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/EditorContainer.esm.t +0 -103
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.d.ts +0 -16
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/types/css.d.esm.t +0 -8
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts +0 -22
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.d.ts +0 -14
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.d.ts +0 -20
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.d.ts +0 -20
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.js.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.d.ts +0 -16
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.d.ts.map +0 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js.map +0 -1
- package/dist/src/ts-morph-generator/core/index.d.ts +0 -4
- package/dist/src/ts-morph-generator/core/index.d.ts.map +0 -1
- package/dist/src/ts-morph-generator/core/index.js +0 -4
- package/dist/src/ts-morph-generator/core/index.js.map +0 -1
- package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.d.ts.map +0 -1
- package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.js.map +0 -1
- package/dist/src/ts-morph-generator/file-generators/index.d.ts +0 -2
- package/dist/src/ts-morph-generator/file-generators/index.d.ts.map +0 -1
- package/dist/src/ts-morph-generator/file-generators/index.js +0 -2
- package/dist/src/ts-morph-generator/file-generators/index.js.map +0 -1
- package/dist/src/utils/package-manager.d.ts +0 -5
- package/dist/src/utils/package-manager.d.ts.map +0 -1
- package/dist/src/utils/package-manager.js +0 -17
- package/dist/src/utils/package-manager.js.map +0 -1
- package/dist/tsconfig.hygen.tsbuildinfo +0 -1
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
to: "<%= rootDir %>/<%= h.changeCase.param(subgraph) %>/resolvers.ts"
|
|
3
3
|
force: true
|
|
4
4
|
---
|
|
5
|
-
import {
|
|
5
|
+
import type { BaseSubgraph } from "@powerhousedao/reactor-api";
|
|
6
6
|
import { addFile } from "document-drive";
|
|
7
7
|
import { actions <% modules.forEach(module => { %><% module.operations.forEach(op => { %>, type <%- h.changeCase.pascal(op.name) %>Input<%_ })}); %>, type <%- h.changeCase.pascal(documentType) %>Document } from "../../document-models/<%- h.changeCase.param(documentType) %>/index.js";
|
|
8
8
|
import { setName } from "document-model";
|
|
9
9
|
|
|
10
|
-
export const getResolvers = (subgraph:
|
|
10
|
+
export const getResolvers = (subgraph: BaseSubgraph): Record<string, unknown> => {
|
|
11
11
|
const reactor = subgraph.reactor;
|
|
12
12
|
|
|
13
13
|
return ({
|
package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/schema.esm.t
CHANGED
|
@@ -7,13 +7,7 @@ import type { DocumentNode } from "graphql";
|
|
|
7
7
|
|
|
8
8
|
export const schema: DocumentNode = gql`
|
|
9
9
|
"""
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"""
|
|
13
|
-
<%- schema %>
|
|
14
|
-
|
|
15
|
-
"""
|
|
16
|
-
Queries: <%= h.changeCase.pascal(documentType) %>
|
|
10
|
+
Queries: <%= h.changeCase.pascal(documentType) %> Document
|
|
17
11
|
"""
|
|
18
12
|
|
|
19
13
|
type <%- h.changeCase.pascal(documentType) %>Queries {
|
|
@@ -2,58 +2,55 @@
|
|
|
2
2
|
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/CreateDocument.tsx"
|
|
3
3
|
unless_exists: true
|
|
4
4
|
---
|
|
5
|
+
import { Button } from "@powerhousedao/design-system";
|
|
5
6
|
import {
|
|
6
|
-
|
|
7
|
+
showCreateDocumentModal,
|
|
8
|
+
useAllowedDocumentModelModules,
|
|
7
9
|
useDocumentModelModules,
|
|
8
10
|
useSelectedDriveId,
|
|
9
|
-
useSelectedFolder,
|
|
10
11
|
type VetraDocumentModelModule,
|
|
11
12
|
} from "@powerhousedao/reactor-browser";
|
|
12
|
-
import { Button } from "@powerhousedao/design-system";
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Document creation UI component.
|
|
16
16
|
* Displays available document types as clickable buttons.
|
|
17
17
|
*/
|
|
18
|
-
export
|
|
18
|
+
export function CreateDocument() {
|
|
19
19
|
const selectedDriveId = useSelectedDriveId();
|
|
20
|
-
const
|
|
21
|
-
const documentModelModules = useDocumentModelModules();
|
|
20
|
+
const allowedDocumentModelModules = useAllowedDocumentModelModules();
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
function handleAddDocument(module: VetraDocumentModelModule) {
|
|
24
23
|
if (!selectedDriveId) {
|
|
25
24
|
return;
|
|
26
25
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
module.documentModel.id,
|
|
31
|
-
selectedFolder?.id,
|
|
32
|
-
);
|
|
26
|
+
|
|
27
|
+
// Display the Create Document modal on the host app
|
|
28
|
+
showCreateDocumentModal(module.documentModel.global.id);
|
|
33
29
|
}
|
|
34
30
|
|
|
35
31
|
return (
|
|
36
|
-
<div
|
|
32
|
+
<div>
|
|
37
33
|
{/* Customize section title here */}
|
|
38
34
|
<h3 className="mb-3 mt-4 text-sm font-bold text-gray-600">
|
|
39
|
-
|
|
35
|
+
Create document
|
|
40
36
|
</h3>
|
|
41
37
|
{/* Customize layout by changing flex-wrap, gap, or grid layout */}
|
|
42
38
|
<div className="flex w-full flex-wrap gap-4">
|
|
43
|
-
{
|
|
39
|
+
{allowedDocumentModelModules?.map((documentModelModule) => {
|
|
44
40
|
return (
|
|
45
41
|
<Button
|
|
46
|
-
key={documentModelModule.documentModel.id}
|
|
42
|
+
key={documentModelModule.documentModel.global.id}
|
|
47
43
|
color="light" // Customize button appearance
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
className="cursor-pointer bg-gray-200 p-2 hover:bg-gray-300"
|
|
45
|
+
title={documentModelModule.documentModel.global.name}
|
|
46
|
+
aria-description={
|
|
47
|
+
documentModelModule.documentModel.global.description
|
|
48
|
+
}
|
|
52
49
|
onClick={() => handleAddDocument(documentModelModule)}
|
|
53
50
|
>
|
|
54
51
|
{/* Customize document type display format */}
|
|
55
52
|
<span className="text-sm">
|
|
56
|
-
{documentModelModule.documentModel.name}
|
|
53
|
+
{documentModelModule.documentModel.global.name}
|
|
57
54
|
</span>
|
|
58
55
|
</Button>
|
|
59
56
|
);
|
|
@@ -61,4 +58,4 @@ export const CreateDocument = () => {
|
|
|
61
58
|
</div>
|
|
62
59
|
</div>
|
|
63
60
|
);
|
|
64
|
-
}
|
|
61
|
+
}
|
|
@@ -4,180 +4,79 @@ unless_exists: true
|
|
|
4
4
|
---
|
|
5
5
|
import {
|
|
6
6
|
Breadcrumbs,
|
|
7
|
-
|
|
7
|
+
Button,
|
|
8
8
|
FileItem,
|
|
9
9
|
FolderItem,
|
|
10
|
-
useBreadcrumbs,
|
|
11
10
|
} from "@powerhousedao/design-system";
|
|
12
11
|
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
useAllFolderNodes,
|
|
18
|
-
useDocumentModelModules,
|
|
19
|
-
useDriveContext,
|
|
20
|
-
useDriveSharingType,
|
|
21
|
-
useEditorModules,
|
|
22
|
-
useFileChildNodes,
|
|
23
|
-
useFolderChildNodes,
|
|
12
|
+
addFolder,
|
|
13
|
+
isFileNodeKind,
|
|
14
|
+
isFolderNodeKind,
|
|
15
|
+
useNodesInSelectedDriveOrFolder,
|
|
24
16
|
useSelectedDrive,
|
|
25
17
|
useSelectedFolder,
|
|
26
|
-
useSelectedNodePath,
|
|
27
18
|
useUserPermissions,
|
|
28
19
|
} from "@powerhousedao/reactor-browser";
|
|
29
|
-
import type {
|
|
30
|
-
import { useCallback, useRef, useState } from "react";
|
|
20
|
+
import type { EditorProps } from "document-model";
|
|
31
21
|
import { CreateDocument } from "./CreateDocument.js";
|
|
32
|
-
import { EditorContainer } from "./EditorContainer.js";
|
|
33
22
|
import { FolderTree } from "./FolderTree.js";
|
|
34
23
|
|
|
35
24
|
/**
|
|
36
25
|
* Main drive explorer component with sidebar navigation and content area.
|
|
37
26
|
* Layout: Left sidebar (folder tree) + Right content area (files/folders + document editor)
|
|
38
27
|
*/
|
|
39
|
-
export function DriveExplorer(props:
|
|
40
|
-
|
|
41
|
-
// Customize document opening/closing behavior here
|
|
42
|
-
const [activeDocumentId, setActiveDocumentId] = useState<
|
|
43
|
-
string | undefined
|
|
44
|
-
>();
|
|
45
|
-
const [openModal, setOpenModal] = useState(false);
|
|
46
|
-
const selectedDocumentModel = useRef<DocumentModelModule | null>(null);
|
|
47
|
-
const editorModules = useEditorModules();
|
|
48
|
-
// === DRIVE CONTEXT HOOKS ===
|
|
49
|
-
// Core drive operations and document models
|
|
50
|
-
const {
|
|
51
|
-
onAddFile,
|
|
52
|
-
onAddFolder,
|
|
53
|
-
onCopyNode,
|
|
54
|
-
onDuplicateNode,
|
|
55
|
-
onMoveNode,
|
|
56
|
-
onRenameNode,
|
|
57
|
-
showDeleteNodeModal,
|
|
58
|
-
} = useDriveContext();
|
|
59
|
-
|
|
28
|
+
export function DriveExplorer(props: EditorProps) {
|
|
29
|
+
const { children } = props;
|
|
60
30
|
const { isAllowedToCreateDocuments } = useUserPermissions();
|
|
61
|
-
// === STATE MANAGEMENT HOOKS ===
|
|
62
|
-
// Core state hooks for drive navigation
|
|
63
31
|
const [selectedDrive] = useSelectedDrive(); // Currently selected drive
|
|
64
32
|
const selectedFolder = useSelectedFolder(); // Currently selected folder
|
|
65
|
-
const selectedNodePath = useSelectedNodePath();
|
|
66
|
-
const sharingType = useDriveSharingType(selectedDrive?.header.id);
|
|
67
|
-
|
|
68
|
-
// === NAVIGATION SETUP ===
|
|
69
|
-
// Breadcrumbs for folder navigation
|
|
70
|
-
const { breadcrumbs, onBreadcrumbSelected } = useBreadcrumbs({
|
|
71
|
-
selectedNodePath,
|
|
72
|
-
setSelectedNode,
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
const folderChildren = useFolderChildNodes();
|
|
76
|
-
const fileChildren = useFileChildNodes();
|
|
77
33
|
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
// === EVENT HANDLERS ===
|
|
34
|
+
const nodes = useNodesInSelectedDriveOrFolder();
|
|
35
|
+
const folderNodes = nodes.filter((n) => isFolderNodeKind(n));
|
|
36
|
+
const fileNodes = nodes.filter((n) => isFileNodeKind(n));
|
|
82
37
|
|
|
83
38
|
// Handle folder creation with optional name parameter
|
|
84
|
-
const handleCreateFolder =
|
|
85
|
-
|
|
86
|
-
let name: string | undefined = folderName;
|
|
39
|
+
const handleCreateFolder = async (folderName?: string) => {
|
|
40
|
+
let name: string | undefined = folderName;
|
|
87
41
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (name?.trim()) {
|
|
95
|
-
try {
|
|
96
|
-
await onAddFolder(name.trim(), selectedFolder);
|
|
97
|
-
} catch (error) {
|
|
98
|
-
console.error("Failed to create folder:", error);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
[onAddFolder, selectedFolder],
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
// Handle document creation from modal
|
|
106
|
-
const onCreateDocument = useCallback(
|
|
107
|
-
async (fileName: string) => {
|
|
108
|
-
setOpenModal(false);
|
|
109
|
-
|
|
110
|
-
const documentModel = selectedDocumentModel.current;
|
|
111
|
-
if (!documentModel || !selectedDrive?.header.id) return;
|
|
42
|
+
// If no name provided, prompt for it (for manual folder creation)
|
|
43
|
+
if (!name) {
|
|
44
|
+
const promptResult = prompt("Enter folder name:");
|
|
45
|
+
name = promptResult || undefined;
|
|
46
|
+
}
|
|
112
47
|
|
|
48
|
+
if (name?.trim()) {
|
|
113
49
|
try {
|
|
114
|
-
|
|
50
|
+
await addFolder(
|
|
115
51
|
selectedDrive.header.id,
|
|
116
|
-
|
|
117
|
-
documentModel.documentModel.id,
|
|
52
|
+
name.trim(),
|
|
118
53
|
selectedFolder?.id,
|
|
119
54
|
);
|
|
120
|
-
|
|
121
|
-
selectedDocumentModel.current = null;
|
|
122
|
-
|
|
123
|
-
if (node) {
|
|
124
|
-
// Customize: Auto-open created document by uncommenting below
|
|
125
|
-
// setActiveDocumentId(node.id);
|
|
126
|
-
}
|
|
127
55
|
} catch (error) {
|
|
128
|
-
console.error("Failed to create
|
|
56
|
+
console.error("Failed to create folder:", error);
|
|
129
57
|
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
// === DOCUMENT EDITOR DATA ===
|
|
135
|
-
// Filter available document types here if needed
|
|
136
|
-
const documentModelModules = useDocumentModelModules();
|
|
137
|
-
|
|
138
|
-
// Get active document and its editor components
|
|
139
|
-
const activeDocument = activeDocumentId
|
|
140
|
-
? fileChildren.find((file) => file.id === activeDocumentId)
|
|
141
|
-
: undefined;
|
|
142
|
-
|
|
143
|
-
const documentModelModule = activeDocument
|
|
144
|
-
? documentModelModules?.find(
|
|
145
|
-
(m) => m.documentModel.id === activeDocument.documentType,
|
|
146
|
-
)
|
|
147
|
-
: null;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
148
60
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
e.documentTypes.includes(activeDocument.documentType),
|
|
152
|
-
)
|
|
153
|
-
: null;
|
|
61
|
+
// if a document is selected then it's editor will be passed as children
|
|
62
|
+
const showDocumentEditor = !!children;
|
|
154
63
|
|
|
155
64
|
// === RENDER ===
|
|
156
65
|
return (
|
|
157
66
|
<div className="flex h-full">
|
|
158
|
-
{/* === LEFT SIDEBAR: Folder Navigation === */}
|
|
159
|
-
{/*
|
|
160
|
-
<
|
|
161
|
-
<div className="p-4">
|
|
162
|
-
{/* Customize sidebar title here */}
|
|
163
|
-
<h2 className="mb-4 text-lg font-semibold text-gray-700">
|
|
164
|
-
Drive Explorer
|
|
165
|
-
</h2>
|
|
166
|
-
|
|
167
|
-
{/* Folder tree navigation component */}
|
|
168
|
-
<FolderTree folders={allFolders} onSelectNode={setSelectedNode} />
|
|
169
|
-
</div>
|
|
170
|
-
</div>
|
|
67
|
+
{/* === LEFT SIDEBAR: Folder and File Navigation === */}
|
|
68
|
+
{/* Sidebar component manages its own width, styling, and overflow */}
|
|
69
|
+
<FolderTree />
|
|
171
70
|
|
|
172
71
|
{/* === RIGHT CONTENT AREA: Files/Folders or Document Editor === */}
|
|
173
72
|
<div className="flex-1 overflow-y-auto p-4">
|
|
174
73
|
{/* Conditional rendering: Document editor or folder contents */}
|
|
175
|
-
{
|
|
74
|
+
{showDocumentEditor ? (
|
|
176
75
|
// Document editor view
|
|
177
|
-
|
|
76
|
+
children
|
|
178
77
|
) : (
|
|
179
78
|
/* Folder contents view */
|
|
180
|
-
<div className="space-y-6">
|
|
79
|
+
<div className="space-y-6 px-6">
|
|
181
80
|
{/* === HEADER SECTION === */}
|
|
182
81
|
<div className="space-y-3">
|
|
183
82
|
<div className="flex items-center justify-between">
|
|
@@ -189,83 +88,44 @@ export function DriveExplorer(props: DriveEditorProps) {
|
|
|
189
88
|
</h2>
|
|
190
89
|
{/* Customize: Add more action buttons here */}
|
|
191
90
|
{isAllowedToCreateDocuments && (
|
|
192
|
-
<
|
|
91
|
+
<Button
|
|
193
92
|
onClick={() => handleCreateFolder()}
|
|
194
|
-
className="
|
|
93
|
+
className="bg-gray-200 p-2 hover:bg-gray-300"
|
|
195
94
|
>
|
|
196
|
-
|
|
197
|
-
</
|
|
95
|
+
New Folder
|
|
96
|
+
</Button>
|
|
198
97
|
)}
|
|
199
98
|
</div>
|
|
200
99
|
|
|
201
100
|
{/* Navigation breadcrumbs */}
|
|
202
|
-
|
|
203
|
-
<
|
|
204
|
-
|
|
205
|
-
breadcrumbs={breadcrumbs}
|
|
206
|
-
createEnabled={isAllowedToCreateDocuments}
|
|
207
|
-
onCreate={handleCreateFolder}
|
|
208
|
-
onBreadcrumbSelected={onBreadcrumbSelected}
|
|
209
|
-
/>
|
|
210
|
-
</div>
|
|
211
|
-
)}
|
|
101
|
+
<div className="border-b border-gray-200 pb-3">
|
|
102
|
+
<Breadcrumbs />
|
|
103
|
+
</div>
|
|
212
104
|
</div>
|
|
213
105
|
|
|
214
106
|
{/* === FOLDERS SECTION === */}
|
|
215
|
-
{
|
|
216
|
-
{folderChildren.length > 0 && (
|
|
107
|
+
{folderNodes.length > 0 && (
|
|
217
108
|
<div>
|
|
218
|
-
<h3 className="mb-2 text-sm font-
|
|
219
|
-
|
|
109
|
+
<h3 className="mb-2 text-sm font-bold text-gray-600">
|
|
110
|
+
Folders
|
|
220
111
|
</h3>
|
|
221
|
-
<div className="
|
|
222
|
-
{
|
|
223
|
-
<FolderItem
|
|
224
|
-
key={folderNode.id}
|
|
225
|
-
folderNode={folderNode}
|
|
226
|
-
isAllowedToCreateDocuments={isAllowedToCreateDocuments}
|
|
227
|
-
sharingType={sharingType || "LOCAL"}
|
|
228
|
-
getSyncStatusSync={getSyncStatusSync}
|
|
229
|
-
setSelectedNode={setSelectedNode}
|
|
230
|
-
onAddFile={onAddFile}
|
|
231
|
-
onCopyNode={onCopyNode}
|
|
232
|
-
onMoveNode={onMoveNode}
|
|
233
|
-
onRenameNode={onRenameNode}
|
|
234
|
-
onDuplicateNode={onDuplicateNode}
|
|
235
|
-
onAddFolder={onAddFolder}
|
|
236
|
-
onAddAndSelectNewFolder={handleCreateFolder}
|
|
237
|
-
showDeleteNodeModal={showDeleteNodeModal}
|
|
238
|
-
/>
|
|
112
|
+
<div className="flex flex-wrap gap-4">
|
|
113
|
+
{folderNodes.map((folderNode) => (
|
|
114
|
+
<FolderItem key={folderNode.id} folderNode={folderNode} />
|
|
239
115
|
))}
|
|
240
116
|
</div>
|
|
241
117
|
</div>
|
|
242
118
|
)}
|
|
243
119
|
|
|
244
120
|
{/* === FILES/DOCUMENTS SECTION === */}
|
|
245
|
-
{
|
|
246
|
-
{fileChildren.length > 0 && (
|
|
121
|
+
{fileNodes.length > 0 && (
|
|
247
122
|
<div>
|
|
248
|
-
<h3 className="mb-2 text-sm font-
|
|
249
|
-
|
|
123
|
+
<h3 className="mb-2 text-sm font-semibold text-gray-600">
|
|
124
|
+
Documents
|
|
250
125
|
</h3>
|
|
251
|
-
<div className="
|
|
252
|
-
{
|
|
253
|
-
<FileItem
|
|
254
|
-
key={fileNode.id}
|
|
255
|
-
fileNode={fileNode}
|
|
256
|
-
isAllowedToCreateDocuments={isAllowedToCreateDocuments}
|
|
257
|
-
sharingType={sharingType || "LOCAL"}
|
|
258
|
-
getSyncStatusSync={getSyncStatusSync}
|
|
259
|
-
setSelectedNode={setSelectedNode}
|
|
260
|
-
showDeleteNodeModal={showDeleteNodeModal}
|
|
261
|
-
onRenameNode={onRenameNode}
|
|
262
|
-
onDuplicateNode={onDuplicateNode}
|
|
263
|
-
onAddFile={onAddFile}
|
|
264
|
-
onCopyNode={onCopyNode}
|
|
265
|
-
onMoveNode={onMoveNode}
|
|
266
|
-
onAddFolder={onAddFolder}
|
|
267
|
-
onAddAndSelectNewFolder={handleCreateFolder}
|
|
268
|
-
/>
|
|
126
|
+
<div className="flex flex-wrap gap-4">
|
|
127
|
+
{fileNodes.map((fileNode) => (
|
|
128
|
+
<FileItem key={fileNode.id} fileNode={fileNode} />
|
|
269
129
|
))}
|
|
270
130
|
</div>
|
|
271
131
|
</div>
|
|
@@ -273,9 +133,9 @@ export function DriveExplorer(props: DriveEditorProps) {
|
|
|
273
133
|
|
|
274
134
|
{/* === EMPTY STATE === */}
|
|
275
135
|
{/* Customize empty state message and styling here */}
|
|
276
|
-
{
|
|
136
|
+
{folderNodes.length === 0 && fileNodes.length === 0 && (
|
|
277
137
|
<div className="py-12 text-center text-gray-500">
|
|
278
|
-
<p className="text-lg"
|
|
138
|
+
<p className="text-lg">This folder is empty</p>
|
|
279
139
|
<p className="mt-2 text-sm">
|
|
280
140
|
Create your first document or folder below
|
|
281
141
|
</p>
|
|
@@ -288,14 +148,6 @@ export function DriveExplorer(props: DriveEditorProps) {
|
|
|
288
148
|
</div>
|
|
289
149
|
)}
|
|
290
150
|
</div>
|
|
291
|
-
|
|
292
|
-
{/* === DOCUMENT CREATION MODAL === */}
|
|
293
|
-
{/* Modal for entering document name after selecting type */}
|
|
294
|
-
<CreateDocumentModal
|
|
295
|
-
onContinue={onCreateDocument}
|
|
296
|
-
onOpenChange={(open) => setOpenModal(open)}
|
|
297
|
-
open={openModal}
|
|
298
|
-
/>
|
|
299
151
|
</div>
|
|
300
152
|
);
|
|
301
153
|
}
|
|
@@ -2,102 +2,107 @@
|
|
|
2
2
|
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/FolderTree.tsx"
|
|
3
3
|
unless_exists: true
|
|
4
4
|
---
|
|
5
|
-
import
|
|
6
|
-
|
|
5
|
+
import {
|
|
6
|
+
Sidebar,
|
|
7
|
+
SidebarProvider,
|
|
8
|
+
type SidebarNode,
|
|
9
|
+
} from "@powerhousedao/document-engineering";
|
|
10
|
+
import {
|
|
11
|
+
setSelectedNode,
|
|
12
|
+
useNodesInSelectedDrive,
|
|
13
|
+
useSelectedDrive,
|
|
14
|
+
useSelectedNode,
|
|
15
|
+
} from "@powerhousedao/reactor-browser";
|
|
16
|
+
import type { Node } from "document-drive";
|
|
17
|
+
import { useMemo } from "react";
|
|
7
18
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
19
|
+
function buildSidebarNodes(
|
|
20
|
+
nodes: Node[],
|
|
21
|
+
parentId: string | null | undefined,
|
|
22
|
+
): SidebarNode[] {
|
|
23
|
+
return nodes
|
|
24
|
+
.filter((n) => {
|
|
25
|
+
if (parentId == null) {
|
|
26
|
+
return n.parentFolder == null;
|
|
27
|
+
}
|
|
28
|
+
return n.parentFolder === parentId;
|
|
29
|
+
})
|
|
30
|
+
.map((node): SidebarNode => {
|
|
31
|
+
if (node.kind === "folder") {
|
|
32
|
+
return {
|
|
33
|
+
id: node.id,
|
|
34
|
+
title: node.name,
|
|
35
|
+
icon: "FolderClose" as const,
|
|
36
|
+
expandedIcon: "FolderOpen" as const,
|
|
37
|
+
children: buildSidebarNodes(nodes, node.id),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
id: node.id,
|
|
42
|
+
title: node.name,
|
|
43
|
+
icon: "File" as const,
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function transformNodesToSidebarNodes(
|
|
49
|
+
nodes: Node[],
|
|
50
|
+
driveName: string,
|
|
51
|
+
): SidebarNode[] {
|
|
52
|
+
return [
|
|
53
|
+
{
|
|
54
|
+
id: "root",
|
|
55
|
+
title: driveName,
|
|
56
|
+
icon: "Drive" as const,
|
|
57
|
+
children: buildSidebarNodes(nodes, null),
|
|
58
|
+
},
|
|
59
|
+
];
|
|
12
60
|
}
|
|
13
61
|
|
|
14
62
|
/**
|
|
15
|
-
* Hierarchical folder tree navigation component.
|
|
16
|
-
* Displays folders in a tree structure with expand/collapse functionality.
|
|
63
|
+
* Hierarchical folder tree navigation component using Sidebar from document-engineering.
|
|
64
|
+
* Displays folders and files in a tree structure with expand/collapse functionality, search, and resize support.
|
|
17
65
|
*/
|
|
18
|
-
export function FolderTree({
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
const
|
|
25
|
-
|
|
66
|
+
export function FolderTree() {
|
|
67
|
+
const [selectedDrive] = useSelectedDrive();
|
|
68
|
+
const nodes = useNodesInSelectedDrive();
|
|
69
|
+
const selectedNode = useSelectedNode();
|
|
70
|
+
const driveName = selectedDrive.header.name;
|
|
71
|
+
// Transform Node[] to hierarchical SidebarNode structure
|
|
72
|
+
const sidebarNodes = useMemo(
|
|
73
|
+
() => transformNodesToSidebarNodes(nodes || [], driveName),
|
|
74
|
+
[nodes, driveName],
|
|
26
75
|
);
|
|
27
76
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
next.add(folderId);
|
|
36
|
-
}
|
|
37
|
-
return next;
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// Recursive function to render folder tree structure
|
|
42
|
-
const renderFolder = (folder: FolderNode, level = 0) => {
|
|
43
|
-
const hasChildren = folders.some((f) => f.parentFolder === folder.id);
|
|
44
|
-
const isExpanded = expandedFolders.has(folder.id);
|
|
45
|
-
const isSelected = selectedNodeId === folder.id;
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<div key={folder.id}>
|
|
49
|
-
<div
|
|
50
|
-
className={`flex cursor-pointer items-center rounded px-2 py-1 text-sm hover:bg-gray-100 ${
|
|
51
|
-
isSelected ? "bg-blue-100 text-blue-800" : ""
|
|
52
|
-
}`}
|
|
53
|
-
style={{ paddingLeft: `${level * 16 + 8}px` }} // Customize indentation here
|
|
54
|
-
onClick={() => onSelectNode(folder.id)}
|
|
55
|
-
>
|
|
56
|
-
{/* Expand/collapse button for folders with children */}
|
|
57
|
-
{hasChildren && (
|
|
58
|
-
<button
|
|
59
|
-
className="mr-1 flex h-4 w-4 items-center justify-center"
|
|
60
|
-
onClick={(e) => {
|
|
61
|
-
e.stopPropagation();
|
|
62
|
-
toggleFolder(folder.id);
|
|
63
|
-
}}
|
|
64
|
-
>
|
|
65
|
-
{isExpanded ? "▼" : "▶"} {/* Customize expand icons here */}
|
|
66
|
-
</button>
|
|
67
|
-
)}
|
|
68
|
-
{!hasChildren && <div className="mr-1 w-5" />}
|
|
69
|
-
{/* Customize folder icon and styling here */}
|
|
70
|
-
<span>📁 {folder.name}</span>
|
|
71
|
-
</div>
|
|
72
|
-
{/* Recursively render child folders when expanded */}
|
|
73
|
-
{isExpanded && hasChildren && (
|
|
74
|
-
<div>
|
|
75
|
-
{folders
|
|
76
|
-
.filter((f) => f.parentFolder === folder.id)
|
|
77
|
-
.map((child) => renderFolder(child, level + 1))}
|
|
78
|
-
</div>
|
|
79
|
-
)}
|
|
80
|
-
</div>
|
|
81
|
-
);
|
|
77
|
+
const handleActiveNodeChange = (node: SidebarNode) => {
|
|
78
|
+
// If root node is selected, pass undefined to match existing behavior
|
|
79
|
+
if (node.id === "root") {
|
|
80
|
+
setSelectedNode(undefined);
|
|
81
|
+
} else {
|
|
82
|
+
setSelectedNode(node.id);
|
|
83
|
+
}
|
|
82
84
|
};
|
|
85
|
+
// Map selectedNodeId to activeNodeId (use "root" when undefined)
|
|
86
|
+
const activeNodeId =
|
|
87
|
+
!selectedNode || selectedNode.id === selectedDrive.header.id
|
|
88
|
+
? "root"
|
|
89
|
+
: selectedNode.id;
|
|
83
90
|
|
|
84
91
|
return (
|
|
85
|
-
<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
.map((folder) => renderFolder(folder))}
|
|
101
|
-
</div>
|
|
92
|
+
<SidebarProvider nodes={sidebarNodes}>
|
|
93
|
+
<Sidebar
|
|
94
|
+
className="pt-1"
|
|
95
|
+
nodes={sidebarNodes}
|
|
96
|
+
activeNodeId={activeNodeId}
|
|
97
|
+
onActiveNodeChange={handleActiveNodeChange}
|
|
98
|
+
sidebarTitle="Drive Explorer"
|
|
99
|
+
showSearchBar={true}
|
|
100
|
+
resizable={true}
|
|
101
|
+
allowPinning={false}
|
|
102
|
+
showStatusFilter={false}
|
|
103
|
+
initialWidth={256}
|
|
104
|
+
defaultLevel={2}
|
|
105
|
+
/>
|
|
106
|
+
</SidebarProvider>
|
|
102
107
|
);
|
|
103
108
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/config.ts"
|
|
3
|
+
unless_exists: true
|
|
4
|
+
---
|
|
5
|
+
import type { PHDriveEditorConfig } from "@powerhousedao/reactor-browser";
|
|
6
|
+
|
|
7
|
+
export const editorConfig: PHDriveEditorConfig = {
|
|
8
|
+
isDragAndDropEnabled: <%- isDragAndDropEnabled %>,
|
|
9
|
+
allowedDocumentTypes: <%- allowedDocumentTypes %>
|
|
10
|
+
};
|