@powerhousedao/codegen 4.1.0-dev.3 → 4.1.0-dev.30
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-custom-subgraph/index.d.ts +14 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.d.ts.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.js +12 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.js.map +1 -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/object.esm.t +3 -3
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/reducer.esm.t +3 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/types.esm.t +2 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/utils.esm.t +2 -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.d.ts +4 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts.map +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js +13 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js.map +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/resolvers.esm.t +59 -50
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/schema.esm.t +3 -3
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/CreateDocument.esm.t +45 -24
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/DriveExplorer.esm.t +248 -181
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/EditorContainer.esm.t +53 -72
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderTree.esm.t +44 -26
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/editor.esm.t +22 -58
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.d.ts +16 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.d.ts.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.esm.t +2 -3
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js +12 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js.map +1 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts +2 -0
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts.map +1 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.esm.t +1 -1
- 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 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/factory.esm.t +2 -1
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.esm.t +7 -5
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/factory.esm.t +3 -2
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/lib.esm.t +6 -5
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.esm.t +0 -32
- package/dist/src/codegen/graphql.d.ts +5 -1
- package/dist/src/codegen/graphql.d.ts.map +1 -1
- package/dist/src/codegen/graphql.js +28 -5
- package/dist/src/codegen/graphql.js.map +1 -1
- package/dist/src/codegen/hygen.d.ts +7 -4
- package/dist/src/codegen/hygen.d.ts.map +1 -1
- package/dist/src/codegen/hygen.js +50 -7
- package/dist/src/codegen/hygen.js.map +1 -1
- package/dist/src/codegen/index.d.ts +7 -6
- package/dist/src/codegen/index.d.ts.map +1 -1
- package/dist/src/codegen/index.js +82 -5
- package/dist/src/codegen/index.js.map +1 -1
- package/dist/src/ts-morph-generator/core/FileGenerator.d.ts +10 -0
- package/dist/src/ts-morph-generator/core/FileGenerator.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/core/FileGenerator.js +9 -0
- package/dist/src/ts-morph-generator/core/FileGenerator.js.map +1 -0
- package/dist/src/ts-morph-generator/core/GenerationContext.d.ts +30 -0
- package/dist/src/ts-morph-generator/core/GenerationContext.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/core/GenerationContext.js +2 -0
- package/dist/src/ts-morph-generator/core/GenerationContext.js.map +1 -0
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts +19 -0
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js +114 -0
- package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js.map +1 -0
- package/dist/src/ts-morph-generator/core/index.d.ts +4 -0
- package/dist/src/ts-morph-generator/core/index.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/core/index.js +4 -0
- package/dist/src/ts-morph-generator/core/index.js.map +1 -0
- package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.d.ts +12 -0
- package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.js +140 -0
- package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.js.map +1 -0
- package/dist/src/ts-morph-generator/file-generators/index.d.ts +2 -0
- package/dist/src/ts-morph-generator/file-generators/index.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/file-generators/index.js +2 -0
- package/dist/src/ts-morph-generator/file-generators/index.js.map +1 -0
- package/dist/src/ts-morph-generator/index.d.ts +4 -0
- package/dist/src/ts-morph-generator/index.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/index.js +4 -0
- package/dist/src/ts-morph-generator/index.js.map +1 -0
- package/dist/src/ts-morph-generator/utilities/DirectoryManager.d.ts +13 -0
- package/dist/src/ts-morph-generator/utilities/DirectoryManager.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/utilities/DirectoryManager.js +45 -0
- package/dist/src/ts-morph-generator/utilities/DirectoryManager.js.map +1 -0
- package/dist/src/ts-morph-generator/utilities/ImportManager.d.ts +14 -0
- package/dist/src/ts-morph-generator/utilities/ImportManager.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/utilities/ImportManager.js +40 -0
- package/dist/src/ts-morph-generator/utilities/ImportManager.js.map +1 -0
- package/dist/src/ts-morph-generator/utilities/index.d.ts +3 -0
- package/dist/src/ts-morph-generator/utilities/index.d.ts.map +1 -0
- package/dist/src/ts-morph-generator/utilities/index.js +3 -0
- package/dist/src/ts-morph-generator/utilities/index.js.map +1 -0
- package/dist/tsconfig.hygen.tsbuildinfo +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +14 -6
- package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/customReducers.esm.t +0 -20
- 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
|
@@ -3,231 +3,298 @@ to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/DriveExplorer.tsx
|
|
|
3
3
|
unless_exists: true
|
|
4
4
|
---
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
type UiNode,
|
|
6
|
+
Breadcrumbs,
|
|
7
|
+
CreateDocumentModal,
|
|
8
|
+
FileItem,
|
|
9
|
+
FolderItem,
|
|
10
|
+
useBreadcrumbs,
|
|
12
11
|
} from "@powerhousedao/design-system";
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
import {
|
|
13
|
+
addDocument,
|
|
14
|
+
type DriveEditorProps,
|
|
15
|
+
getSyncStatusSync,
|
|
16
|
+
setSelectedNode,
|
|
17
|
+
useAllFolderNodes,
|
|
18
|
+
useDocumentModelModules,
|
|
19
|
+
useDriveContext,
|
|
20
|
+
useDriveSharingType,
|
|
21
|
+
useEditorModules,
|
|
22
|
+
useFileChildNodes,
|
|
23
|
+
useFolderChildNodes,
|
|
24
|
+
useSelectedDrive,
|
|
25
|
+
useSelectedFolder,
|
|
26
|
+
useSelectedNodePath,
|
|
27
|
+
useUserPermissions,
|
|
28
|
+
} from "@powerhousedao/reactor-browser";
|
|
21
29
|
import type { DocumentModelModule } from "document-model";
|
|
22
|
-
import {
|
|
23
|
-
import { CreateDocument } from "./CreateDocument.
|
|
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
|
-
}
|
|
30
|
+
import { useCallback, useRef, useState } from "react";
|
|
31
|
+
import { CreateDocument } from "./CreateDocument.jsx";
|
|
32
|
+
import { EditorContainer } from "./EditorContainer.jsx";
|
|
33
|
+
import { FolderTree } from "./FolderTree.jsx";
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
context,
|
|
44
|
-
}: DriveExplorerProps) {
|
|
45
|
-
const { getDocumentRevision } = context;
|
|
46
|
-
|
|
47
|
-
const [selectedNodeId, setSelectedNodeId] = useState<string | undefined>();
|
|
35
|
+
/**
|
|
36
|
+
* Main drive explorer component with sidebar navigation and content area.
|
|
37
|
+
* Layout: Left sidebar (folder tree) + Right content area (files/folders + document editor)
|
|
38
|
+
*/
|
|
39
|
+
export function DriveExplorer(props: DriveEditorProps) {
|
|
40
|
+
// === DOCUMENT EDITOR STATE ===
|
|
41
|
+
// Customize document opening/closing behavior here
|
|
48
42
|
const [activeDocumentId, setActiveDocumentId] = useState<
|
|
49
43
|
string | undefined
|
|
50
44
|
>();
|
|
51
45
|
const [openModal, setOpenModal] = useState(false);
|
|
52
46
|
const selectedDocumentModel = useRef<DocumentModelModule | null>(null);
|
|
53
|
-
const
|
|
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();
|
|
54
59
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
const { isAllowedToCreateDocuments } = useUserPermissions();
|
|
61
|
+
// === STATE MANAGEMENT HOOKS ===
|
|
62
|
+
// Core state hooks for drive navigation
|
|
63
|
+
const [selectedDrive] = useSelectedDrive(); // Currently selected drive
|
|
64
|
+
const selectedFolder = useSelectedFolder(); // Currently selected folder
|
|
65
|
+
const selectedNodePath = useSelectedNodePath();
|
|
66
|
+
const sharingType = useDriveSharingType(selectedDrive?.header.id);
|
|
59
67
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
);
|
|
68
|
+
// === NAVIGATION SETUP ===
|
|
69
|
+
// Breadcrumbs for folder navigation
|
|
70
|
+
const { breadcrumbs, onBreadcrumbSelected } = useBreadcrumbs({
|
|
71
|
+
selectedNodePath,
|
|
72
|
+
setSelectedNode,
|
|
73
|
+
});
|
|
66
74
|
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
);
|
|
75
|
+
const folderChildren = useFolderChildNodes();
|
|
76
|
+
const fileChildren = useFileChildNodes();
|
|
77
|
+
|
|
78
|
+
// All folders for the sidebar tree view
|
|
79
|
+
const allFolders = useAllFolderNodes();
|
|
73
80
|
|
|
74
|
-
|
|
75
|
-
console.log("Selected node:", node);
|
|
76
|
-
setSelectedNodeId(node.id);
|
|
77
|
-
}, []);
|
|
81
|
+
// === EVENT HANDLERS ===
|
|
78
82
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
// Handle folder creation with optional name parameter
|
|
84
|
+
const handleCreateFolder = useCallback(
|
|
85
|
+
async (folderName?: string) => {
|
|
86
|
+
let name: string | undefined = folderName;
|
|
82
87
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
88
|
+
// If no name provided, prompt for it (for manual folder creation)
|
|
89
|
+
if (!name) {
|
|
90
|
+
const promptResult = prompt("Enter folder name:");
|
|
91
|
+
name = promptResult || undefined;
|
|
92
|
+
}
|
|
86
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
|
|
87
106
|
const onCreateDocument = useCallback(
|
|
88
107
|
async (fileName: string) => {
|
|
89
108
|
setOpenModal(false);
|
|
90
109
|
|
|
91
110
|
const documentModel = selectedDocumentModel.current;
|
|
92
|
-
if (!documentModel) return;
|
|
111
|
+
if (!documentModel || !selectedDrive?.header.id) return;
|
|
93
112
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
113
|
+
try {
|
|
114
|
+
const node = await addDocument(
|
|
115
|
+
selectedDrive.header.id,
|
|
116
|
+
fileName,
|
|
117
|
+
documentModel.documentModel.id,
|
|
118
|
+
selectedFolder?.id,
|
|
119
|
+
undefined,
|
|
120
|
+
editorModules?.find((e) =>
|
|
121
|
+
e.documentTypes.includes(documentModel.documentModel.id),
|
|
122
|
+
)?.id,
|
|
123
|
+
);
|
|
100
124
|
|
|
101
|
-
|
|
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
|
-
);
|
|
125
|
+
selectedDocumentModel.current = null;
|
|
114
126
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
127
|
+
if (node) {
|
|
128
|
+
// Customize: Auto-open created document by uncommenting below
|
|
129
|
+
// setActiveDocumentId(node.id);
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error("Failed to create document:", error);
|
|
133
|
+
}
|
|
119
134
|
},
|
|
120
|
-
[
|
|
135
|
+
[addDocument, editorModules, selectedDrive?.header.id, selectedFolder?.id],
|
|
121
136
|
);
|
|
122
137
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
);
|
|
138
|
+
// === DOCUMENT EDITOR DATA ===
|
|
139
|
+
// Filter available document types here if needed
|
|
140
|
+
const documentModelModules = useDocumentModelModules();
|
|
142
141
|
|
|
143
|
-
// Get
|
|
142
|
+
// Get active document and its editor components
|
|
144
143
|
const activeDocument = activeDocumentId
|
|
145
|
-
?
|
|
144
|
+
? fileChildren.find((file) => file.id === activeDocumentId)
|
|
146
145
|
: undefined;
|
|
147
146
|
|
|
148
147
|
const documentModelModule = activeDocument
|
|
149
|
-
?
|
|
148
|
+
? documentModelModules?.find(
|
|
149
|
+
(m) => m.documentModel.id === activeDocument.documentType,
|
|
150
|
+
)
|
|
150
151
|
: null;
|
|
151
152
|
|
|
152
153
|
const editorModule = activeDocument
|
|
153
|
-
?
|
|
154
|
+
? editorModules?.find((e) =>
|
|
155
|
+
e.documentTypes.includes(activeDocument.documentType),
|
|
156
|
+
)
|
|
154
157
|
: null;
|
|
155
158
|
|
|
159
|
+
// === RENDER ===
|
|
156
160
|
return (
|
|
157
161
|
<div className="flex h-full">
|
|
158
|
-
{/*
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
<
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
162
|
+
{/* === LEFT SIDEBAR: Folder Navigation === */}
|
|
163
|
+
{/* Customize sidebar width by changing w-64 */}
|
|
164
|
+
<div className="w-64 overflow-y-auto border-r border-gray-200 bg-white">
|
|
165
|
+
<div className="p-4">
|
|
166
|
+
{/* Customize sidebar title here */}
|
|
167
|
+
<h2 className="mb-4 text-lg font-semibold text-gray-700">
|
|
168
|
+
Drive Explorer
|
|
169
|
+
</h2>
|
|
170
|
+
|
|
171
|
+
{/* Folder tree navigation component */}
|
|
172
|
+
<FolderTree folders={allFolders} onSelectNode={setSelectedNode} />
|
|
173
|
+
</div>
|
|
166
174
|
</div>
|
|
167
175
|
|
|
168
|
-
{/*
|
|
169
|
-
<div className="flex-1
|
|
176
|
+
{/* === RIGHT CONTENT AREA: Files/Folders or Document Editor === */}
|
|
177
|
+
<div className="flex-1 overflow-y-auto p-4">
|
|
178
|
+
{/* Conditional rendering: Document editor or folder contents */}
|
|
170
179
|
{activeDocument && documentModelModule && editorModule ? (
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
/>
|
|
180
|
+
// Document editor view
|
|
181
|
+
<EditorContainer handleClose={() => setActiveDocumentId(undefined)} />
|
|
184
182
|
) : (
|
|
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
|
-
|
|
183
|
+
/* Folder contents view */
|
|
184
|
+
<div className="space-y-6">
|
|
185
|
+
{/* === HEADER SECTION === */}
|
|
186
|
+
<div className="space-y-3">
|
|
187
|
+
<div className="flex items-center justify-between">
|
|
188
|
+
{/* Folder title */}
|
|
189
|
+
<h2 className="text-lg font-semibold">
|
|
190
|
+
{selectedFolder
|
|
191
|
+
? `Contents of "${selectedFolder.name}"`
|
|
192
|
+
: "Root Contents"}
|
|
193
|
+
</h2>
|
|
194
|
+
{/* Customize: Add more action buttons here */}
|
|
195
|
+
{isAllowedToCreateDocuments && (
|
|
196
|
+
<button
|
|
197
|
+
onClick={() => handleCreateFolder()}
|
|
198
|
+
className="rounded bg-blue-500 px-3 py-1 text-sm text-white hover:bg-blue-600"
|
|
199
|
+
>
|
|
200
|
+
+ New Folder
|
|
201
|
+
</button>
|
|
202
|
+
)}
|
|
203
|
+
</div>
|
|
204
|
+
|
|
205
|
+
{/* Navigation breadcrumbs */}
|
|
206
|
+
{breadcrumbs.length > 1 && (
|
|
207
|
+
<div className="border-b border-gray-200 pb-3">
|
|
208
|
+
<Breadcrumbs
|
|
209
|
+
breadcrumbs={breadcrumbs}
|
|
210
|
+
createEnabled={isAllowedToCreateDocuments}
|
|
211
|
+
onCreate={handleCreateFolder}
|
|
212
|
+
onBreadcrumbSelected={onBreadcrumbSelected}
|
|
213
|
+
/>
|
|
214
|
+
</div>
|
|
215
|
+
)}
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
{/* === FOLDERS SECTION === */}
|
|
219
|
+
{/* Customize grid layout by changing grid-cols-1 */}
|
|
220
|
+
{folderChildren.length > 0 && (
|
|
221
|
+
<div>
|
|
222
|
+
<h3 className="mb-2 text-sm font-medium text-gray-500">
|
|
223
|
+
📁 Folders
|
|
224
|
+
</h3>
|
|
225
|
+
<div className="grid grid-cols-1 gap-2">
|
|
226
|
+
{folderChildren.map((folderNode) => (
|
|
227
|
+
<FolderItem
|
|
228
|
+
key={folderNode.id}
|
|
229
|
+
folderNode={folderNode}
|
|
230
|
+
isAllowedToCreateDocuments={isAllowedToCreateDocuments}
|
|
231
|
+
sharingType={sharingType || "LOCAL"}
|
|
232
|
+
getSyncStatusSync={getSyncStatusSync}
|
|
233
|
+
setSelectedNode={setSelectedNode}
|
|
234
|
+
onAddFile={onAddFile}
|
|
235
|
+
onCopyNode={onCopyNode}
|
|
236
|
+
onMoveNode={onMoveNode}
|
|
237
|
+
onRenameNode={onRenameNode}
|
|
238
|
+
onDuplicateNode={onDuplicateNode}
|
|
239
|
+
onAddFolder={onAddFolder}
|
|
240
|
+
onAddAndSelectNewFolder={handleCreateFolder}
|
|
241
|
+
showDeleteNodeModal={showDeleteNodeModal}
|
|
242
|
+
/>
|
|
243
|
+
))}
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
)}
|
|
247
|
+
|
|
248
|
+
{/* === FILES/DOCUMENTS SECTION === */}
|
|
249
|
+
{/* Customize grid layout by changing grid-cols-1 */}
|
|
250
|
+
{fileChildren.length > 0 && (
|
|
251
|
+
<div>
|
|
252
|
+
<h3 className="mb-2 text-sm font-medium text-gray-500">
|
|
253
|
+
📄 Documents
|
|
254
|
+
</h3>
|
|
255
|
+
<div className="grid grid-cols-1 gap-2">
|
|
256
|
+
{fileChildren.map((fileNode) => (
|
|
257
|
+
<FileItem
|
|
258
|
+
key={fileNode.id}
|
|
259
|
+
fileNode={fileNode}
|
|
260
|
+
isAllowedToCreateDocuments={isAllowedToCreateDocuments}
|
|
261
|
+
sharingType={sharingType || "LOCAL"}
|
|
262
|
+
getSyncStatusSync={getSyncStatusSync}
|
|
263
|
+
setSelectedNode={setSelectedNode}
|
|
264
|
+
showDeleteNodeModal={showDeleteNodeModal}
|
|
265
|
+
onRenameNode={onRenameNode}
|
|
266
|
+
onDuplicateNode={onDuplicateNode}
|
|
267
|
+
onAddFile={onAddFile}
|
|
268
|
+
onCopyNode={onCopyNode}
|
|
269
|
+
onMoveNode={onMoveNode}
|
|
270
|
+
onAddFolder={onAddFolder}
|
|
271
|
+
onAddAndSelectNewFolder={handleCreateFolder}
|
|
272
|
+
/>
|
|
273
|
+
))}
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
)}
|
|
277
|
+
|
|
278
|
+
{/* === EMPTY STATE === */}
|
|
279
|
+
{/* Customize empty state message and styling here */}
|
|
280
|
+
{folderChildren.length === 0 && fileChildren.length === 0 && (
|
|
281
|
+
<div className="py-12 text-center text-gray-500">
|
|
282
|
+
<p className="text-lg">📁 This folder is empty</p>
|
|
283
|
+
<p className="mt-2 text-sm">
|
|
284
|
+
Create your first document or folder below
|
|
285
|
+
</p>
|
|
286
|
+
</div>
|
|
287
|
+
)}
|
|
288
|
+
|
|
289
|
+
{/* === DOCUMENT CREATION SECTION === */}
|
|
290
|
+
{/* Component for creating new documents */}
|
|
291
|
+
<CreateDocument />
|
|
292
|
+
</div>
|
|
227
293
|
)}
|
|
228
294
|
</div>
|
|
229
295
|
|
|
230
|
-
{/*
|
|
296
|
+
{/* === DOCUMENT CREATION MODAL === */}
|
|
297
|
+
{/* Modal for entering document name after selecting type */}
|
|
231
298
|
<CreateDocumentModal
|
|
232
299
|
onContinue={onCreateDocument}
|
|
233
300
|
onOpenChange={(open) => setOpenModal(open)}
|
|
@@ -235,4 +302,4 @@ export function DriveExplorer({
|
|
|
235
302
|
/>
|
|
236
303
|
</div>
|
|
237
304
|
);
|
|
238
|
-
}
|
|
305
|
+
}
|
|
@@ -2,117 +2,98 @@
|
|
|
2
2
|
to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/EditorContainer.tsx"
|
|
3
3
|
unless_exists: true
|
|
4
4
|
---
|
|
5
|
+
import { getRevisionFromDate, useTimelineItems } from "@powerhousedao/common";
|
|
5
6
|
import {
|
|
6
|
-
|
|
7
|
-
exportDocument,
|
|
8
|
-
type User,
|
|
9
|
-
type DriveEditorContext,
|
|
10
|
-
} from "@powerhousedao/reactor-browser";
|
|
11
|
-
import {
|
|
12
|
-
type EditorContext,
|
|
13
|
-
type DocumentModelModule,
|
|
14
|
-
type EditorModule,
|
|
15
|
-
type EditorProps,
|
|
16
|
-
type PHDocument,
|
|
17
|
-
} from "document-model";
|
|
18
|
-
import {
|
|
7
|
+
DefaultEditorLoader,
|
|
19
8
|
DocumentToolbar,
|
|
20
9
|
RevisionHistory,
|
|
21
|
-
DefaultEditorLoader,
|
|
22
10
|
type TimelineItem,
|
|
23
11
|
} from "@powerhousedao/design-system";
|
|
24
|
-
import {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
context: Omit<DriveEditorContext, "getDocumentRevision"> & Pick<EditorContext, "getDocumentRevision">;
|
|
34
|
-
documentModelModule: DocumentModelModule<PHDocument>;
|
|
35
|
-
editorModule: EditorModule;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export const EditorContainer: React.FC<EditorContainerProps> = (props) => {
|
|
39
|
-
const {
|
|
40
|
-
title,
|
|
41
|
-
driveId,
|
|
42
|
-
context,
|
|
43
|
-
onClose,
|
|
44
|
-
documentId,
|
|
45
|
-
documentType,
|
|
46
|
-
editorModule,
|
|
47
|
-
documentModelModule,
|
|
48
|
-
} = props;
|
|
12
|
+
import {
|
|
13
|
+
exportFile,
|
|
14
|
+
useEditorModuleById,
|
|
15
|
+
useSelectedDocument,
|
|
16
|
+
useSelectedDrive,
|
|
17
|
+
} from "@powerhousedao/reactor-browser";
|
|
18
|
+
import { error } from "console";
|
|
19
|
+
import { title } from "process";
|
|
20
|
+
import { Suspense, useCallback, useState } from "react";
|
|
49
21
|
|
|
50
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Document editor container that wraps individual document editors.
|
|
24
|
+
* Handles document loading, toolbar, revision history, and dynamic editor loading.
|
|
25
|
+
* Customize toolbar actions and editor context here.
|
|
26
|
+
*/
|
|
27
|
+
export const EditorContainer = (props: { handleClose: () => void }) => {
|
|
28
|
+
const { handleClose } = props;
|
|
29
|
+
// UI state for revision history and timeline
|
|
30
|
+
const [selectedTimelineItem, setSelectedTimelineItem] =
|
|
31
|
+
useState<TimelineItem | null>(null);
|
|
51
32
|
const [showRevisionHistory, setShowRevisionHistory] = useState(false);
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const { dispatch, error, document } = useDocumentEditorProps({
|
|
57
|
-
documentId,
|
|
58
|
-
documentType,
|
|
59
|
-
driveId,
|
|
60
|
-
documentModelModule,
|
|
61
|
-
user,
|
|
62
|
-
});
|
|
63
|
-
|
|
33
|
+
const [selectedDocument, dispatch] = useSelectedDocument();
|
|
34
|
+
const [selectedDrive] = useSelectedDrive();
|
|
35
|
+
// Timeline data for revision history
|
|
64
36
|
const timelineItems = useTimelineItems(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
37
|
+
selectedDocument?.header.id,
|
|
38
|
+
selectedDocument?.header.createdAtUtcIso,
|
|
39
|
+
selectedDrive?.header.id,
|
|
40
|
+
);
|
|
41
|
+
const editorModule = useEditorModuleById(
|
|
42
|
+
selectedDocument?.header.meta?.preferredEditor,
|
|
68
43
|
);
|
|
69
44
|
|
|
45
|
+
// Document export functionality - customize export behavior here
|
|
70
46
|
const onExport = useCallback(async () => {
|
|
71
|
-
if (
|
|
72
|
-
|
|
73
|
-
await exportDocument(document, title, ext);
|
|
47
|
+
if (selectedDocument) {
|
|
48
|
+
await exportFile(selectedDocument);
|
|
74
49
|
}
|
|
75
|
-
}, [
|
|
50
|
+
}, [selectedDocument]);
|
|
76
51
|
|
|
52
|
+
// Loading state component
|
|
77
53
|
const loadingContent = (
|
|
78
|
-
<div className="flex-
|
|
54
|
+
<div className="flex h-full flex-1 items-center justify-center">
|
|
79
55
|
<DefaultEditorLoader />
|
|
80
56
|
</div>
|
|
81
57
|
);
|
|
82
58
|
|
|
83
|
-
if (!
|
|
59
|
+
if (!selectedDocument) return loadingContent;
|
|
84
60
|
|
|
85
|
-
|
|
61
|
+
// Dynamically load the appropriate editor component for this document type
|
|
62
|
+
const EditorComponent = editorModule?.Component;
|
|
63
|
+
if (!EditorComponent) return loadingContent;
|
|
86
64
|
|
|
87
65
|
return showRevisionHistory ? (
|
|
66
|
+
// Revision history view
|
|
88
67
|
<RevisionHistory
|
|
89
|
-
documentId={
|
|
90
|
-
documentTitle={
|
|
91
|
-
globalOperations={
|
|
92
|
-
key={
|
|
93
|
-
localOperations={
|
|
68
|
+
documentId={selectedDocument.header.id}
|
|
69
|
+
documentTitle={selectedDocument.header.name}
|
|
70
|
+
globalOperations={selectedDocument.operations.global}
|
|
71
|
+
key={selectedDocument.header.id}
|
|
72
|
+
localOperations={selectedDocument.operations.local}
|
|
94
73
|
onClose={() => setShowRevisionHistory(false)}
|
|
95
74
|
/>
|
|
96
75
|
) : (
|
|
76
|
+
// Main editor view
|
|
97
77
|
<Suspense fallback={loadingContent}>
|
|
78
|
+
{/* Document toolbar - customize available actions here */}
|
|
98
79
|
<DocumentToolbar
|
|
99
|
-
onClose={
|
|
80
|
+
onClose={handleClose}
|
|
100
81
|
onExport={onExport}
|
|
101
82
|
onShowRevisionHistory={() => setShowRevisionHistory(true)}
|
|
102
|
-
onSwitchboardLinkClick={() => {}}
|
|
83
|
+
onSwitchboardLinkClick={() => {}} // Customize switchboard integration
|
|
103
84
|
title={title}
|
|
104
85
|
timelineButtonVisible={editorModule.config.timelineEnabled}
|
|
105
86
|
timelineItems={timelineItems.data}
|
|
106
87
|
onTimelineItemClick={setSelectedTimelineItem}
|
|
107
88
|
/>
|
|
89
|
+
{/* Dynamic editor component based on document type */}
|
|
108
90
|
<EditorComponent
|
|
109
91
|
context={{
|
|
110
|
-
...context,
|
|
111
92
|
readMode: !!selectedTimelineItem,
|
|
112
93
|
selectedTimelineRevision: getRevisionFromDate(
|
|
113
94
|
selectedTimelineItem?.startDate,
|
|
114
95
|
selectedTimelineItem?.endDate,
|
|
115
|
-
|
|
96
|
+
selectedDocument.operations.global,
|
|
116
97
|
),
|
|
117
98
|
}}
|
|
118
99
|
dispatch={dispatch}
|
|
@@ -121,4 +102,4 @@ export const EditorContainer: React.FC<EditorContainerProps> = (props) => {
|
|
|
121
102
|
/>
|
|
122
103
|
</Suspense>
|
|
123
104
|
);
|
|
124
|
-
};
|
|
105
|
+
};
|