@powerhousedao/codegen 4.1.0-dev.19 → 4.1.0-dev.20
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/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/customTest.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/CreateDocument.esm.t +10 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/DriveExplorer.esm.t +292 -131
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/EditorContainer.esm.t +20 -3
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderTree.esm.t +43 -25
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/editor.esm.t +37 -42
- package/dist/tsconfig.hygen.tsbuildinfo +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +5 -5
- 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
|
@@ -2,20 +2,32 @@
|
|
|
2
2
|
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/FolderTree.tsx"
|
|
3
3
|
unless_exists: true
|
|
4
4
|
---
|
|
5
|
-
import { useState } from
|
|
6
|
-
import type {
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
import type { FolderNode } from "document-drive";
|
|
7
7
|
|
|
8
8
|
interface FolderTreeProps {
|
|
9
|
-
folders:
|
|
9
|
+
folders: FolderNode[];
|
|
10
10
|
selectedNodeId?: string;
|
|
11
|
-
onSelectNode: (
|
|
11
|
+
onSelectNode: (nodeId: string | undefined) => void;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Hierarchical folder tree navigation component.
|
|
16
|
+
* Displays folders in a tree structure with expand/collapse functionality.
|
|
17
|
+
*/
|
|
18
|
+
export function FolderTree({
|
|
19
|
+
folders,
|
|
20
|
+
selectedNodeId,
|
|
21
|
+
onSelectNode,
|
|
22
|
+
}: FolderTreeProps) {
|
|
23
|
+
// Track which folders are expanded
|
|
24
|
+
const [expandedFolders, setExpandedFolders] = useState<Set<string>>(
|
|
25
|
+
new Set(),
|
|
26
|
+
);
|
|
16
27
|
|
|
28
|
+
// Toggle folder expansion state
|
|
17
29
|
const toggleFolder = (folderId: string) => {
|
|
18
|
-
setExpandedFolders(prev => {
|
|
30
|
+
setExpandedFolders((prev) => {
|
|
19
31
|
const next = new Set(prev);
|
|
20
32
|
if (next.has(folderId)) {
|
|
21
33
|
next.delete(folderId);
|
|
@@ -26,20 +38,22 @@ export function FolderTree({ folders, selectedNodeId, onSelectNode }: FolderTree
|
|
|
26
38
|
});
|
|
27
39
|
};
|
|
28
40
|
|
|
29
|
-
|
|
30
|
-
|
|
41
|
+
// Recursive function to render folder tree structure
|
|
42
|
+
const renderFolder = (folder: FolderNode, level: number = 0) => {
|
|
43
|
+
const hasChildren = folders.some((f) => f.parentFolder === folder.id);
|
|
31
44
|
const isExpanded = expandedFolders.has(folder.id);
|
|
32
45
|
const isSelected = selectedNodeId === folder.id;
|
|
33
46
|
|
|
34
47
|
return (
|
|
35
48
|
<div key={folder.id}>
|
|
36
49
|
<div
|
|
37
|
-
className={`flex items-center py-1 px-2 cursor-pointer hover:bg-gray-100 rounded ${
|
|
38
|
-
isSelected ?
|
|
50
|
+
className={`flex items-center py-1 px-2 cursor-pointer hover:bg-gray-100 rounded text-sm ${
|
|
51
|
+
isSelected ? "bg-blue-100 text-blue-800" : ""
|
|
39
52
|
}`}
|
|
40
|
-
style={{ paddingLeft: `${level * 16 + 8}px` }}
|
|
41
|
-
onClick={() => onSelectNode(folder)}
|
|
53
|
+
style={{ paddingLeft: `${level * 16 + 8}px` }} // Customize indentation here
|
|
54
|
+
onClick={() => onSelectNode(folder.id)}
|
|
42
55
|
>
|
|
56
|
+
{/* Expand/collapse button for folders with children */}
|
|
43
57
|
{hasChildren && (
|
|
44
58
|
<button
|
|
45
59
|
className="w-4 h-4 mr-1 flex items-center justify-center"
|
|
@@ -48,16 +62,19 @@ export function FolderTree({ folders, selectedNodeId, onSelectNode }: FolderTree
|
|
|
48
62
|
toggleFolder(folder.id);
|
|
49
63
|
}}
|
|
50
64
|
>
|
|
51
|
-
{isExpanded ?
|
|
65
|
+
{isExpanded ? "▼" : "▶"} {/* Customize expand icons here */}
|
|
52
66
|
</button>
|
|
53
67
|
)}
|
|
54
|
-
<
|
|
68
|
+
{!hasChildren && <div className="w-5 mr-1" />}
|
|
69
|
+
{/* Customize folder icon and styling here */}
|
|
70
|
+
<span>📁 {folder.name}</span>
|
|
55
71
|
</div>
|
|
72
|
+
{/* Recursively render child folders when expanded */}
|
|
56
73
|
{isExpanded && hasChildren && (
|
|
57
74
|
<div>
|
|
58
75
|
{folders
|
|
59
|
-
.filter(f => f.parentFolder === folder.id)
|
|
60
|
-
.map(child => renderFolder(child, level + 1))}
|
|
76
|
+
.filter((f) => f.parentFolder === folder.id)
|
|
77
|
+
.map((child) => renderFolder(child, level + 1))}
|
|
61
78
|
</div>
|
|
62
79
|
)}
|
|
63
80
|
</div>
|
|
@@ -67,19 +84,20 @@ export function FolderTree({ folders, selectedNodeId, onSelectNode }: FolderTree
|
|
|
67
84
|
return (
|
|
68
85
|
<div className="space-y-1">
|
|
69
86
|
{/* Root Directory Option */}
|
|
87
|
+
{/* Customize root folder appearance here */}
|
|
70
88
|
<div
|
|
71
|
-
className={`flex items-center py-1 px-2 cursor-pointer hover:bg-gray-100 rounded ${
|
|
72
|
-
!selectedNodeId ?
|
|
89
|
+
className={`flex items-center py-1 px-2 cursor-pointer hover:bg-gray-100 rounded text-sm ${
|
|
90
|
+
!selectedNodeId ? "bg-blue-100 text-blue-800" : ""
|
|
73
91
|
}`}
|
|
74
|
-
onClick={() => onSelectNode(
|
|
92
|
+
onClick={() => onSelectNode(undefined)}
|
|
75
93
|
>
|
|
76
|
-
<span
|
|
94
|
+
<span>🏠 Root</span>
|
|
77
95
|
</div>
|
|
78
96
|
|
|
79
|
-
{/*
|
|
97
|
+
{/* Render top-level folders (no parent) */}
|
|
80
98
|
{folders
|
|
81
|
-
.filter(folder => !folder.parentFolder)
|
|
82
|
-
.map(folder => renderFolder(folder))}
|
|
99
|
+
.filter((folder) => !folder.parentFolder)
|
|
100
|
+
.map((folder) => renderFolder(folder))}
|
|
83
101
|
</div>
|
|
84
102
|
);
|
|
85
|
-
}
|
|
103
|
+
}
|
|
@@ -3,71 +3,66 @@ to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/editor.tsx"
|
|
|
3
3
|
unless_exists: true
|
|
4
4
|
---
|
|
5
5
|
import { type DriveEditorProps } from "@powerhousedao/reactor-browser";
|
|
6
|
-
import { AnalyticsProvider } from
|
|
7
|
-
import { DriveContextProvider } from "@powerhousedao/reactor-browser/hooks/useDriveContext";
|
|
8
|
-
import {
|
|
6
|
+
import { AnalyticsProvider } from "@powerhousedao/reactor-browser/analytics/context";
|
|
7
|
+
import { DriveContextProvider, useDriveContext } from "@powerhousedao/reactor-browser/hooks/useDriveContext";
|
|
8
|
+
import { useInitializePHApp, useSetSelectedNode } from '@powerhousedao/state';
|
|
9
|
+
import { type DocumentDriveDocument, type FileNode } from "document-drive";
|
|
9
10
|
import { WagmiContext } from "@powerhousedao/design-system";
|
|
10
11
|
import { DriveExplorer } from "./components/DriveExplorer.js";
|
|
11
12
|
import { useCallback } from "react";
|
|
12
|
-
import { generateId } from "document-model";
|
|
13
13
|
|
|
14
14
|
export type IProps = DriveEditorProps<DocumentDriveDocument>;
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Base editor component that renders the drive explorer interface.
|
|
18
|
+
* Customize document opening behavior and drive-level actions here.
|
|
19
|
+
*/
|
|
16
20
|
export function BaseEditor(props: IProps) {
|
|
17
|
-
const {
|
|
18
|
-
|
|
19
|
-
const onAddFolder = useCallback((name: string, parentFolder?: string) => {
|
|
20
|
-
dispatch(addFolder({
|
|
21
|
-
id: generateId(),
|
|
22
|
-
name,
|
|
23
|
-
parentFolder,
|
|
24
|
-
}));
|
|
25
|
-
}, [dispatch]);
|
|
21
|
+
const { context, document } = props;
|
|
26
22
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
// Get drive operations from context
|
|
24
|
+
const {
|
|
25
|
+
onAddFolder,
|
|
26
|
+
onRenameNode,
|
|
27
|
+
onCopyNode,
|
|
28
|
+
showDeleteNodeModal,
|
|
29
|
+
} = useDriveContext();
|
|
30
30
|
|
|
31
|
-
const
|
|
32
|
-
dispatch(updateNode({ id: nodeId, name }));
|
|
33
|
-
}, [dispatch]);
|
|
31
|
+
const setSelectedNode = useSetSelectedNode();
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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]);
|
|
33
|
+
// Handle document opening - customize this to modify document open behavior
|
|
34
|
+
const onOpenDocument = useCallback(
|
|
35
|
+
(node: FileNode) => {
|
|
36
|
+
setSelectedNode(node.id);
|
|
37
|
+
},
|
|
38
|
+
[setSelectedNode],
|
|
39
|
+
);
|
|
50
40
|
|
|
51
41
|
return (
|
|
52
|
-
<div
|
|
53
|
-
className="new-drive-explorer"
|
|
54
|
-
style={{ height: "100%" }}
|
|
55
|
-
>
|
|
42
|
+
<div className="new-drive-explorer" style={{ height: "100%" }}>
|
|
56
43
|
<DriveExplorer
|
|
57
|
-
driveId={
|
|
58
|
-
nodes={props.document.state.global.nodes}
|
|
44
|
+
driveId={document.header.id}
|
|
59
45
|
onAddFolder={onAddFolder}
|
|
60
|
-
|
|
61
|
-
renameNode={renameNode}
|
|
46
|
+
onRenameNode={onRenameNode}
|
|
62
47
|
onCopyNode={onCopyNode}
|
|
48
|
+
onOpenDocument={onOpenDocument}
|
|
49
|
+
showDeleteNodeModal={showDeleteNodeModal}
|
|
63
50
|
context={context}
|
|
64
51
|
/>
|
|
65
52
|
</div>
|
|
66
53
|
);
|
|
67
54
|
}
|
|
68
55
|
|
|
56
|
+
/**
|
|
57
|
+
* Main editor entry point with required providers.
|
|
58
|
+
* useInitializePHApp() is required for state management to work properly.
|
|
59
|
+
*/
|
|
69
60
|
export default function Editor(props: IProps) {
|
|
61
|
+
// Required: Initialize Powerhouse app state
|
|
62
|
+
useInitializePHApp();
|
|
63
|
+
|
|
70
64
|
return (
|
|
65
|
+
// Required context providers for drive functionality
|
|
71
66
|
<DriveContextProvider value={props.context}>
|
|
72
67
|
<WagmiContext>
|
|
73
68
|
<AnalyticsProvider databaseName={props.context.analyticsDatabaseName}>
|