@powerhousedao/codegen 4.1.0-dev.9 → 4.1.0-dev.91
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 +10 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/resolvers.esm.t +17 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/schema.esm.t +16 -0
- 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 +8 -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 +93 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/reducer.esm.t +9 -4
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/rootIndex.esm.t +6 -7
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/types.esm.t +20 -8
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/utils.esm.t +19 -26
- 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/customTest.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/error.esm.t +6 -10
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js +52 -27
- 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 +64 -51
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/schema.esm.t +4 -10
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/CreateDocument.esm.t +39 -28
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/DriveExplorer.esm.t +138 -223
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderTree.esm.t +95 -72
- 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 -71
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.esm.t +5 -10
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js +12 -0
- 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 +5 -12
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js +28 -15
- 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 +5 -4
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.esm.t +5 -9
- 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 +8 -6
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.inject_call.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.inject_import.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/factory.esm.t +6 -5
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.esm.t +6 -13
- 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 +8 -9
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/lib.inject_call.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/lib.inject_import.esm.t +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/migrations.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/schema.esm.t +10 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.esm.t +5 -36
- 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 +18 -11
- package/dist/src/codegen/hygen.d.ts.map +1 -1
- package/dist/src/codegen/hygen.js +57 -21
- package/dist/src/codegen/hygen.js.map +1 -1
- package/dist/src/codegen/index.d.ts +6 -32
- package/dist/src/codegen/index.d.ts.map +1 -1
- package/dist/src/codegen/index.js +6 -182
- 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 +18 -8
- package/dist/src/ts-morph-generator/core/GenerationContext.d.ts.map +1 -1
- package/dist/src/ts-morph-generator/core/ReducerGenerator.d.ts +12 -0
- package/dist/src/ts-morph-generator/core/ReducerGenerator.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/core/ReducerGenerator.js +140 -0
- package/dist/src/ts-morph-generator/core/ReducerGenerator.js.map +1 -0
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts +4 -3
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts.map +1 -1
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js +11 -10
- 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 +25 -27
- 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 -23
- 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 -37
- 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 -124
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FileItemsGrid.esm.t +0 -44
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderItemsGrid.esm.t +0 -96
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/hooks/useSelectedFolderChildren.esm.t +0 -35
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/hooks/useTransformedNodes.esm.t +0 -35
- 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 -20
- 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 +0 -9
- package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.d.ts.map +0 -1
- package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.js +0 -69
- 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
|
@@ -3,236 +3,151 @@ to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/DriveExplorer.tsx
|
|
|
3
3
|
unless_exists: true
|
|
4
4
|
---
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
type UiFolderNode,
|
|
11
|
-
type UiNode,
|
|
6
|
+
Breadcrumbs,
|
|
7
|
+
Button,
|
|
8
|
+
FileItem,
|
|
9
|
+
FolderItem,
|
|
12
10
|
} from "@powerhousedao/design-system";
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
addFolder,
|
|
13
|
+
isFileNodeKind,
|
|
14
|
+
isFolderNodeKind,
|
|
15
|
+
useNodesInSelectedDriveOrFolder,
|
|
16
|
+
useSelectedDrive,
|
|
17
|
+
useSelectedFolder,
|
|
18
|
+
useUserPermissions,
|
|
19
|
+
} from "@powerhousedao/reactor-browser";
|
|
20
|
+
import type { EditorProps } from "document-model";
|
|
23
21
|
import { CreateDocument } from "./CreateDocument.js";
|
|
24
|
-
import {
|
|
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: DriveEditorContext;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function DriveExplorer({
|
|
37
|
-
driveId,
|
|
38
|
-
nodes,
|
|
39
|
-
onDeleteNode,
|
|
40
|
-
renameNode,
|
|
41
|
-
onAddFolder,
|
|
42
|
-
onCopyNode,
|
|
43
|
-
context,
|
|
44
|
-
}: DriveExplorerProps) {
|
|
45
|
-
const { getDocumentRevision } = context;
|
|
46
|
-
|
|
47
|
-
const [selectedNodeId, setSelectedNodeId] = useState<string | undefined>();
|
|
48
|
-
const [activeDocumentId, setActiveDocumentId] = useState<
|
|
49
|
-
string | undefined
|
|
50
|
-
>();
|
|
51
|
-
const [openModal, setOpenModal] = useState(false);
|
|
52
|
-
const selectedDocumentModel = useRef<DocumentModelModule | null>(null);
|
|
53
|
-
const { addDocument, documentModels } = useDriveContext();
|
|
54
|
-
|
|
55
|
-
// Dummy functions to satisfy component types
|
|
56
|
-
const dummyDuplicateNode = useCallback((node: BaseUiNode) => {
|
|
57
|
-
console.log("Duplicate node:", node);
|
|
58
|
-
}, []);
|
|
59
|
-
|
|
60
|
-
const dummyAddFile = useCallback(
|
|
61
|
-
async (file: File, parentNode: BaseUiNode | null) => {
|
|
62
|
-
console.log("Add file:", file, parentNode);
|
|
63
|
-
},
|
|
64
|
-
[]
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
const dummyMoveNode = useCallback(
|
|
68
|
-
async (uiNode: BaseUiNode, targetNode: BaseUiNode) => {
|
|
69
|
-
console.log("Move node:", uiNode, targetNode);
|
|
70
|
-
},
|
|
71
|
-
[]
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
const handleNodeSelect = useCallback((node: BaseUiFolderNode) => {
|
|
75
|
-
console.log("Selected node:", node);
|
|
76
|
-
setSelectedNodeId(node.id);
|
|
77
|
-
}, []);
|
|
78
|
-
|
|
79
|
-
const handleFileSelect = useCallback((node: BaseUiFileNode) => {
|
|
80
|
-
setActiveDocumentId(node.id);
|
|
81
|
-
}, []);
|
|
82
|
-
|
|
83
|
-
const handleEditorClose = useCallback(() => {
|
|
84
|
-
setActiveDocumentId(undefined);
|
|
85
|
-
}, []);
|
|
86
|
-
|
|
87
|
-
const onCreateDocument = useCallback(
|
|
88
|
-
async (fileName: string) => {
|
|
89
|
-
setOpenModal(false);
|
|
90
|
-
|
|
91
|
-
const documentModel = selectedDocumentModel.current;
|
|
92
|
-
if (!documentModel) return;
|
|
93
|
-
|
|
94
|
-
const node = await addDocument(
|
|
95
|
-
driveId,
|
|
96
|
-
fileName,
|
|
97
|
-
documentModel.documentModel.id,
|
|
98
|
-
selectedNodeId,
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
selectedDocumentModel.current = null;
|
|
102
|
-
setActiveDocumentId(node.id);
|
|
103
|
-
},
|
|
104
|
-
[addDocument, driveId, selectedNodeId]
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
const onSelectDocumentModel = useCallback(
|
|
108
|
-
(documentModel: DocumentModelModule) => {
|
|
109
|
-
selectedDocumentModel.current = documentModel;
|
|
110
|
-
setOpenModal(true);
|
|
111
|
-
},
|
|
112
|
-
[]
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
const onGetDocumentRevision = useCallback(
|
|
116
|
-
(options?: GetDocumentOptions) => {
|
|
117
|
-
if (!activeDocumentId) return;
|
|
118
|
-
return getDocumentRevision?.(activeDocumentId, options);
|
|
119
|
-
},
|
|
120
|
-
[getDocumentRevision, activeDocumentId],
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
const filteredDocumentModels = documentModels;
|
|
124
|
-
|
|
125
|
-
// Transform nodes using the custom hook
|
|
126
|
-
const transformedNodes = useTransformedNodes(nodes, driveId);
|
|
127
|
-
|
|
128
|
-
// Separate folders and files
|
|
129
|
-
const folders = transformedNodes.filter(
|
|
130
|
-
(node): node is UiFolderNode => node.kind === "FOLDER"
|
|
131
|
-
);
|
|
132
|
-
const files = transformedNodes.filter(
|
|
133
|
-
(node): node is UiFileNode => node.kind === "FILE"
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
// Get children of selected folder using the custom hook
|
|
137
|
-
const selectedFolderChildren = useSelectedFolderChildren(
|
|
138
|
-
selectedNodeId,
|
|
139
|
-
folders,
|
|
140
|
-
files
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
// Get the active document info from nodes
|
|
144
|
-
const activeDocument = activeDocumentId
|
|
145
|
-
? files.find((file) => file.id === activeDocumentId)
|
|
146
|
-
: undefined;
|
|
147
|
-
|
|
148
|
-
const documentModelModule = activeDocument
|
|
149
|
-
? context.getDocumentModelModule(activeDocument.documentType)
|
|
150
|
-
: null;
|
|
151
|
-
|
|
152
|
-
const editorModule = activeDocument
|
|
153
|
-
? context.getEditor(activeDocument.documentType)
|
|
154
|
-
: null;
|
|
22
|
+
import { FolderTree } from "./FolderTree.js";
|
|
155
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Main drive explorer component with sidebar navigation and content area.
|
|
26
|
+
* Layout: Left sidebar (folder tree) + Right content area (files/folders + document editor)
|
|
27
|
+
*/
|
|
28
|
+
export function DriveExplorer(props: EditorProps) {
|
|
29
|
+
const { children } = props;
|
|
30
|
+
const { isAllowedToCreateDocuments } = useUserPermissions();
|
|
31
|
+
const [selectedDrive] = useSelectedDrive(); // Currently selected drive
|
|
32
|
+
const selectedFolder = useSelectedFolder(); // Currently selected folder
|
|
33
|
+
|
|
34
|
+
const nodes = useNodesInSelectedDriveOrFolder();
|
|
35
|
+
const folderNodes = nodes.filter((n) => isFolderNodeKind(n));
|
|
36
|
+
const fileNodes = nodes.filter((n) => isFileNodeKind(n));
|
|
37
|
+
|
|
38
|
+
// Handle folder creation with optional name parameter
|
|
39
|
+
const handleCreateFolder = async (folderName?: string) => {
|
|
40
|
+
let name: string | undefined = folderName;
|
|
41
|
+
|
|
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
|
+
}
|
|
47
|
+
|
|
48
|
+
if (name?.trim()) {
|
|
49
|
+
try {
|
|
50
|
+
await addFolder(
|
|
51
|
+
selectedDrive.header.id,
|
|
52
|
+
name.trim(),
|
|
53
|
+
selectedFolder?.id,
|
|
54
|
+
);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.error("Failed to create folder:", error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// if a document is selected then it's editor will be passed as children
|
|
62
|
+
const showDocumentEditor = !!children;
|
|
63
|
+
|
|
64
|
+
// === RENDER ===
|
|
156
65
|
return (
|
|
157
66
|
<div className="flex h-full">
|
|
158
|
-
{/*
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
{/* Main Content */}
|
|
169
|
-
<div className="flex-1 p-4 overflow-y-auto">
|
|
170
|
-
{activeDocument && documentModelModule && editorModule ? (
|
|
171
|
-
<EditorContainer
|
|
172
|
-
context={{
|
|
173
|
-
...context,
|
|
174
|
-
getDocumentRevision: onGetDocumentRevision,
|
|
175
|
-
}}
|
|
176
|
-
documentId={activeDocumentId!}
|
|
177
|
-
documentType={activeDocument.documentType}
|
|
178
|
-
driveId={driveId}
|
|
179
|
-
onClose={handleEditorClose}
|
|
180
|
-
title={activeDocument.name}
|
|
181
|
-
documentModelModule={documentModelModule}
|
|
182
|
-
editorModule={editorModule}
|
|
183
|
-
/>
|
|
67
|
+
{/* === LEFT SIDEBAR: Folder and File Navigation === */}
|
|
68
|
+
{/* Sidebar component manages its own width, styling, and overflow */}
|
|
69
|
+
<FolderTree />
|
|
70
|
+
|
|
71
|
+
{/* === RIGHT CONTENT AREA: Files/Folders or Document Editor === */}
|
|
72
|
+
<div className="flex-1 overflow-y-auto p-4">
|
|
73
|
+
{/* Conditional rendering: Document editor or folder contents */}
|
|
74
|
+
{showDocumentEditor ? (
|
|
75
|
+
// Document editor view
|
|
76
|
+
children
|
|
184
77
|
) : (
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
78
|
+
/* Folder contents view */
|
|
79
|
+
<div className="space-y-6 px-6">
|
|
80
|
+
{/* === HEADER SECTION === */}
|
|
81
|
+
<div className="space-y-3">
|
|
82
|
+
<div className="flex items-center justify-between">
|
|
83
|
+
{/* Folder title */}
|
|
84
|
+
<h2 className="text-lg font-semibold">
|
|
85
|
+
{selectedFolder
|
|
86
|
+
? `Contents of "${selectedFolder.name}"`
|
|
87
|
+
: "Root Contents"}
|
|
88
|
+
</h2>
|
|
89
|
+
{/* Customize: Add more action buttons here */}
|
|
90
|
+
{isAllowedToCreateDocuments && (
|
|
91
|
+
<Button
|
|
92
|
+
onClick={() => handleCreateFolder()}
|
|
93
|
+
className="bg-gray-200 p-2 hover:bg-gray-300"
|
|
94
|
+
>
|
|
95
|
+
New Folder
|
|
96
|
+
</Button>
|
|
97
|
+
)}
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
{/* Navigation breadcrumbs */}
|
|
101
|
+
<div className="border-b border-gray-200 pb-3">
|
|
102
|
+
<Breadcrumbs />
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
{/* === FOLDERS SECTION === */}
|
|
107
|
+
{folderNodes.length > 0 && (
|
|
108
|
+
<div>
|
|
109
|
+
<h3 className="mb-2 text-sm font-bold text-gray-600">
|
|
110
|
+
Folders
|
|
111
|
+
</h3>
|
|
112
|
+
<div className="flex flex-wrap gap-4">
|
|
113
|
+
{folderNodes.map((folderNode) => (
|
|
114
|
+
<FolderItem key={folderNode.id} folderNode={folderNode} />
|
|
115
|
+
))}
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
)}
|
|
119
|
+
|
|
120
|
+
{/* === FILES/DOCUMENTS SECTION === */}
|
|
121
|
+
{fileNodes.length > 0 && (
|
|
122
|
+
<div>
|
|
123
|
+
<h3 className="mb-2 text-sm font-semibold text-gray-600">
|
|
124
|
+
Documents
|
|
125
|
+
</h3>
|
|
126
|
+
<div className="flex flex-wrap gap-4">
|
|
127
|
+
{fileNodes.map((fileNode) => (
|
|
128
|
+
<FileItem key={fileNode.id} fileNode={fileNode} />
|
|
129
|
+
))}
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
)}
|
|
133
|
+
|
|
134
|
+
{/* === EMPTY STATE === */}
|
|
135
|
+
{/* Customize empty state message and styling here */}
|
|
136
|
+
{folderNodes.length === 0 && fileNodes.length === 0 && (
|
|
137
|
+
<div className="py-12 text-center text-gray-500">
|
|
138
|
+
<p className="text-lg">This folder is empty</p>
|
|
139
|
+
<p className="mt-2 text-sm">
|
|
140
|
+
Create your first document or folder below
|
|
141
|
+
</p>
|
|
142
|
+
</div>
|
|
143
|
+
)}
|
|
144
|
+
|
|
145
|
+
{/* === DOCUMENT CREATION SECTION === */}
|
|
146
|
+
{/* Component for creating new documents */}
|
|
147
|
+
<CreateDocument />
|
|
148
|
+
</div>
|
|
227
149
|
)}
|
|
228
150
|
</div>
|
|
229
|
-
|
|
230
|
-
{/* Create Document Modal */}
|
|
231
|
-
<CreateDocumentModal
|
|
232
|
-
onContinue={onCreateDocument}
|
|
233
|
-
onOpenChange={(open) => setOpenModal(open)}
|
|
234
|
-
open={openModal}
|
|
235
|
-
/>
|
|
236
151
|
</div>
|
|
237
152
|
);
|
|
238
|
-
}
|
|
153
|
+
}
|
|
@@ -2,84 +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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const toggleFolder = (folderId: string) => {
|
|
18
|
-
setExpandedFolders(prev => {
|
|
19
|
-
const next = new Set(prev);
|
|
20
|
-
if (next.has(folderId)) {
|
|
21
|
-
next.delete(folderId);
|
|
22
|
-
} else {
|
|
23
|
-
next.add(folderId);
|
|
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;
|
|
24
27
|
}
|
|
25
|
-
return
|
|
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
|
+
};
|
|
26
45
|
});
|
|
27
|
-
|
|
46
|
+
}
|
|
28
47
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
+
];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
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.
|
|
65
|
+
*/
|
|
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],
|
|
75
|
+
);
|
|
33
76
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
onClick={() => onSelectNode(folder)}
|
|
42
|
-
>
|
|
43
|
-
{hasChildren && (
|
|
44
|
-
<button
|
|
45
|
-
className="w-4 h-4 mr-1 flex items-center justify-center"
|
|
46
|
-
onClick={(e) => {
|
|
47
|
-
e.stopPropagation();
|
|
48
|
-
toggleFolder(folder.id);
|
|
49
|
-
}}
|
|
50
|
-
>
|
|
51
|
-
{isExpanded ? '▼' : '▶'}
|
|
52
|
-
</button>
|
|
53
|
-
)}
|
|
54
|
-
<span className="text-sm">{folder.name}</span>
|
|
55
|
-
</div>
|
|
56
|
-
{isExpanded && hasChildren && (
|
|
57
|
-
<div>
|
|
58
|
-
{folders
|
|
59
|
-
.filter(f => f.parentFolder === folder.id)
|
|
60
|
-
.map(child => renderFolder(child, level + 1))}
|
|
61
|
-
</div>
|
|
62
|
-
)}
|
|
63
|
-
</div>
|
|
64
|
-
);
|
|
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
|
+
}
|
|
65
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;
|
|
66
90
|
|
|
67
91
|
return (
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
</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>
|
|
84
107
|
);
|
|
85
|
-
}
|
|
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
|
+
};
|
|
@@ -2,78 +2,14 @@
|
|
|
2
2
|
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/editor.tsx"
|
|
3
3
|
unless_exists: true
|
|
4
4
|
---
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { DriveContextProvider } from "@powerhousedao/reactor-browser/hooks/useDriveContext";
|
|
8
|
-
import { type DocumentDriveDocument, addFolder, deleteNode, updateNode, generateNodesCopy, copyNode } from "document-drive";
|
|
9
|
-
import { WagmiContext } from "@powerhousedao/design-system";
|
|
5
|
+
import { useSetPHDriveEditorConfig } from "@powerhousedao/reactor-browser";
|
|
6
|
+
import type { EditorProps } from "document-model";
|
|
10
7
|
import { DriveExplorer } from "./components/DriveExplorer.js";
|
|
11
|
-
import {
|
|
12
|
-
import { generateId } from "document-model";
|
|
8
|
+
import { editorConfig } from "./config.js";
|
|
13
9
|
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
export function BaseEditor(props: IProps) {
|
|
17
|
-
const { dispatch, context } = props;
|
|
18
|
-
|
|
19
|
-
const onAddFolder = useCallback((name: string, parentFolder?: string) => {
|
|
20
|
-
dispatch(addFolder({
|
|
21
|
-
id: generateId(),
|
|
22
|
-
name,
|
|
23
|
-
parentFolder,
|
|
24
|
-
}));
|
|
25
|
-
}, [dispatch]);
|
|
26
|
-
|
|
27
|
-
const onDeleteNode = useCallback((nodeId: string) => {
|
|
28
|
-
dispatch(deleteNode({ id: nodeId }));
|
|
29
|
-
}, [dispatch]);
|
|
30
|
-
|
|
31
|
-
const renameNode = useCallback((nodeId: string, name: string) => {
|
|
32
|
-
dispatch(updateNode({ id: nodeId, name }));
|
|
33
|
-
}, [dispatch]);
|
|
34
|
-
|
|
35
|
-
const onCopyNode = useCallback((nodeId: string, targetName: string, parentId?: string) => {
|
|
36
|
-
const copyNodesInput = generateNodesCopy({
|
|
37
|
-
srcId: nodeId,
|
|
38
|
-
targetParentFolder: parentId,
|
|
39
|
-
targetName,
|
|
40
|
-
}, () => generateId(), props.document.state.global.nodes);
|
|
41
|
-
|
|
42
|
-
const copyNodesAction = copyNodesInput.map(input => {
|
|
43
|
-
return copyNode(input);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
for (const copyNodeAction of copyNodesAction) {
|
|
47
|
-
dispatch(copyNodeAction);
|
|
48
|
-
}
|
|
49
|
-
}, [dispatch, props.document.state.global.nodes]);
|
|
50
|
-
|
|
51
|
-
return (
|
|
52
|
-
<div
|
|
53
|
-
className="new-drive-explorer"
|
|
54
|
-
style={{ height: "100%" }}
|
|
55
|
-
>
|
|
56
|
-
<DriveExplorer
|
|
57
|
-
driveId={props.document.header.id}
|
|
58
|
-
nodes={props.document.state.global.nodes}
|
|
59
|
-
onAddFolder={onAddFolder}
|
|
60
|
-
onDeleteNode={onDeleteNode}
|
|
61
|
-
renameNode={renameNode}
|
|
62
|
-
onCopyNode={onCopyNode}
|
|
63
|
-
context={context}
|
|
64
|
-
/>
|
|
65
|
-
</div>
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export default function Editor(props: IProps) {
|
|
10
|
+
export function Editor(props: EditorProps) {
|
|
11
|
+
useSetPHDriveEditorConfig(editorConfig);
|
|
70
12
|
return (
|
|
71
|
-
<
|
|
72
|
-
<WagmiContext>
|
|
73
|
-
<AnalyticsProvider databaseName={props.context.analyticsDatabaseName}>
|
|
74
|
-
<BaseEditor {...props} />
|
|
75
|
-
</AnalyticsProvider>
|
|
76
|
-
</WagmiContext>
|
|
77
|
-
</DriveContextProvider>
|
|
13
|
+
<DriveExplorer {...props} />
|
|
78
14
|
);
|
|
79
|
-
}
|
|
15
|
+
}
|
|
@@ -2,19 +2,14 @@
|
|
|
2
2
|
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/index.ts"
|
|
3
3
|
force: true
|
|
4
4
|
---
|
|
5
|
-
import { type
|
|
6
|
-
import {
|
|
7
|
-
import Editor from "./editor.js";
|
|
5
|
+
import { type EditorModule } from "document-model";
|
|
6
|
+
import { Editor } from "./editor.js";
|
|
8
7
|
|
|
9
|
-
export const module:
|
|
8
|
+
export const module: EditorModule = {
|
|
10
9
|
Component: Editor,
|
|
11
10
|
documentTypes: ["powerhouse/document-drive"],
|
|
12
11
|
config: {
|
|
13
|
-
id: "<%=
|
|
14
|
-
|
|
15
|
-
documentToolbarEnabled: true,
|
|
16
|
-
showSwitchboardLink: true,
|
|
12
|
+
id: "<%= appId %>",
|
|
13
|
+
name: "<%= name %>",
|
|
17
14
|
},
|
|
18
15
|
};
|
|
19
|
-
|
|
20
|
-
export default module;
|