@powerhousedao/codegen 5.0.0-staging.9 → 5.0.1-staging.2

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.
Files changed (157) hide show
  1. package/README.md +0 -1
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.js +8 -10
  7. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/resolvers.esm.t +1 -1
  8. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/schema.esm.t +1 -1
  9. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/documentModel.esm.t +2 -2
  10. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.esm.t +0 -2
  11. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.js +69 -54
  12. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/ph-factories.esm.t +14 -17
  13. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/reducer.esm.t +3 -2
  14. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/rootIndex.esm.t +5 -4
  15. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/types.esm.t +16 -6
  16. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/utils.esm.t +37 -51
  17. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/creators.esm.t +1 -1
  18. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js +52 -39
  19. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.js +21 -20
  20. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/resolvers.esm.t +2 -2
  21. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/schema.esm.t +1 -7
  22. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/CreateDocument.esm.t +20 -23
  23. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/DriveExplorer.esm.t +53 -201
  24. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderTree.esm.t +92 -87
  25. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/config.esm.t +10 -0
  26. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/editor.esm.t +7 -35
  27. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.esm.t +5 -9
  28. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js +11 -11
  29. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/editor.esm.t +103 -18
  30. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/hooks.esm.t +16 -0
  31. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.esm.t +3 -7
  32. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js +28 -16
  33. package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.js +8 -10
  34. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/factory.esm.t +1 -1
  35. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.esm.t +3 -2
  36. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js +11 -15
  37. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.root.inject.esm.t +12 -0
  38. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.esm.t +2 -2
  39. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/factory.esm.t +2 -2
  40. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.esm.t +3 -4
  41. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.js +11 -15
  42. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.root.inject.esm.t +12 -0
  43. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/lib.esm.t +1 -1
  44. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/migrations.esm.t +1 -1
  45. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.esm.t +3 -3
  46. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js +9 -11
  47. package/dist/src/codegen/generate.d.ts +33 -0
  48. package/dist/src/codegen/generate.d.ts.map +1 -0
  49. package/dist/src/codegen/generate.js +202 -0
  50. package/dist/src/codegen/generate.js.map +1 -0
  51. package/dist/src/codegen/graphql.d.ts +2 -2
  52. package/dist/src/codegen/graphql.d.ts.map +1 -1
  53. package/dist/src/codegen/graphql.js +1 -1
  54. package/dist/src/codegen/graphql.js.map +1 -1
  55. package/dist/src/codegen/hygen.d.ts +15 -10
  56. package/dist/src/codegen/hygen.d.ts.map +1 -1
  57. package/dist/src/codegen/hygen.js +28 -19
  58. package/dist/src/codegen/hygen.js.map +1 -1
  59. package/dist/src/codegen/index.d.ts +6 -34
  60. package/dist/src/codegen/index.d.ts.map +1 -1
  61. package/dist/src/codegen/index.js +6 -249
  62. package/dist/src/codegen/index.js.map +1 -1
  63. package/dist/src/codegen/types.d.ts +9 -0
  64. package/dist/src/codegen/types.d.ts.map +1 -0
  65. package/dist/src/codegen/types.js +2 -0
  66. package/dist/src/codegen/types.js.map +1 -0
  67. package/dist/src/codegen/utils.d.ts +5 -2
  68. package/dist/src/codegen/utils.d.ts.map +1 -1
  69. package/dist/src/codegen/utils.js +42 -4
  70. package/dist/src/codegen/utils.js.map +1 -1
  71. package/dist/src/create-lib/create-project.d.ts.map +1 -1
  72. package/dist/src/create-lib/create-project.js +17 -2
  73. package/dist/src/create-lib/create-project.js.map +1 -1
  74. package/dist/src/index.d.ts +5 -0
  75. package/dist/src/index.d.ts.map +1 -0
  76. package/dist/src/index.js +5 -0
  77. package/dist/src/index.js.map +1 -0
  78. package/dist/src/ts-morph-generator/core/FileGenerator.d.ts +2 -3
  79. package/dist/src/ts-morph-generator/core/FileGenerator.d.ts.map +1 -1
  80. package/dist/src/ts-morph-generator/core/FileGenerator.js.map +1 -1
  81. package/dist/src/ts-morph-generator/core/GenerationContext.d.ts +17 -9
  82. package/dist/src/ts-morph-generator/core/GenerationContext.d.ts.map +1 -1
  83. package/dist/src/ts-morph-generator/{file-generators → core}/ReducerGenerator.d.ts +2 -2
  84. package/dist/src/ts-morph-generator/core/ReducerGenerator.d.ts.map +1 -0
  85. package/dist/src/ts-morph-generator/{file-generators → core}/ReducerGenerator.js +3 -3
  86. package/dist/src/ts-morph-generator/core/ReducerGenerator.js.map +1 -0
  87. package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts +3 -3
  88. package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts.map +1 -1
  89. package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js +2 -3
  90. package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js.map +1 -1
  91. package/dist/src/ts-morph-generator/index.d.ts +2 -2
  92. package/dist/src/ts-morph-generator/index.d.ts.map +1 -1
  93. package/dist/src/ts-morph-generator/index.js +2 -2
  94. package/dist/src/ts-morph-generator/index.js.map +1 -1
  95. package/dist/src/ts-morph-generator/utilities/DirectoryManager.d.ts +2 -2
  96. package/dist/src/ts-morph-generator/utilities/DirectoryManager.d.ts.map +1 -1
  97. package/dist/src/ts-morph-generator/utilities/ImportManager.d.ts +1 -1
  98. package/dist/src/ts-morph-generator/utilities/ImportManager.d.ts.map +1 -1
  99. package/dist/src/utils/index.d.ts +0 -1
  100. package/dist/src/utils/index.d.ts.map +1 -1
  101. package/dist/src/utils/index.js +0 -1
  102. package/dist/src/utils/index.js.map +1 -1
  103. package/dist/src/utils/validation.d.ts +6 -6
  104. package/dist/src/utils/validation.d.ts.map +1 -1
  105. package/dist/src/utils/validation.js +2 -2
  106. package/dist/src/utils/validation.js.map +1 -1
  107. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  108. package/package.json +24 -33
  109. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.d.ts +0 -14
  110. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.d.ts.map +0 -1
  111. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.js.map +0 -1
  112. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.d.ts +0 -25
  113. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.d.ts.map +0 -1
  114. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/index.js.map +0 -1
  115. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/object.esm.t +0 -49
  116. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts +0 -27
  117. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts.map +0 -1
  118. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js.map +0 -1
  119. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/object.esm.t +0 -32
  120. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.d.ts +0 -22
  121. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.d.ts.map +0 -1
  122. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/index.js.map +0 -1
  123. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/EditorContainer.esm.t +0 -103
  124. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.d.ts +0 -16
  125. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.d.ts.map +0 -1
  126. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js.map +0 -1
  127. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/types/css.d.esm.t +0 -8
  128. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts +0 -22
  129. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts.map +0 -1
  130. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js.map +0 -1
  131. package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.d.ts +0 -14
  132. package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.d.ts.map +0 -1
  133. package/dist/src/codegen/.hygen/templates/powerhouse/generate-import-script/index.js.map +0 -1
  134. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.d.ts +0 -20
  135. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.d.ts.map +0 -1
  136. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/index.js.map +0 -1
  137. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.d.ts +0 -20
  138. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.d.ts.map +0 -1
  139. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/index.js.map +0 -1
  140. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.d.ts +0 -16
  141. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.d.ts.map +0 -1
  142. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.js.map +0 -1
  143. package/dist/src/ts-morph-generator/core/index.d.ts +0 -4
  144. package/dist/src/ts-morph-generator/core/index.d.ts.map +0 -1
  145. package/dist/src/ts-morph-generator/core/index.js +0 -4
  146. package/dist/src/ts-morph-generator/core/index.js.map +0 -1
  147. package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.d.ts.map +0 -1
  148. package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.js.map +0 -1
  149. package/dist/src/ts-morph-generator/file-generators/index.d.ts +0 -2
  150. package/dist/src/ts-morph-generator/file-generators/index.d.ts.map +0 -1
  151. package/dist/src/ts-morph-generator/file-generators/index.js +0 -2
  152. package/dist/src/ts-morph-generator/file-generators/index.js.map +0 -1
  153. package/dist/src/utils/package-manager.d.ts +0 -5
  154. package/dist/src/utils/package-manager.d.ts.map +0 -1
  155. package/dist/src/utils/package-manager.js +0 -17
  156. package/dist/src/utils/package-manager.js.map +0 -1
  157. 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 { type Subgraph } from "@powerhousedao/reactor-api";
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: Subgraph): Record<string, unknown> => {
10
+ export const getResolvers = (subgraph: BaseSubgraph): Record<string, unknown> => {
11
11
  const reactor = subgraph.reactor;
12
12
 
13
13
  return ({
@@ -7,13 +7,7 @@ import type { DocumentNode } from "graphql";
7
7
 
8
8
  export const schema: DocumentNode = gql`
9
9
  """
10
- Subgraph definition for <%= h.changeCase.pascal(documentType) %> (<%- documentTypeId %>)
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
- addDocument,
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 const CreateDocument = () => {
18
+ export function CreateDocument() {
19
19
  const selectedDriveId = useSelectedDriveId();
20
- const selectedFolder = useSelectedFolder();
21
- const documentModelModules = useDocumentModelModules();
20
+ const allowedDocumentModelModules = useAllowedDocumentModelModules();
22
21
 
23
- async function handleAddDocument(module: VetraDocumentModelModule) {
22
+ function handleAddDocument(module: VetraDocumentModelModule) {
24
23
  if (!selectedDriveId) {
25
24
  return;
26
25
  }
27
- await addDocument(
28
- selectedDriveId,
29
- `New ${module.documentModel.name} document`,
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 className="px-6">
32
+ <div>
37
33
  {/* Customize section title here */}
38
34
  <h3 className="mb-3 mt-4 text-sm font-bold text-gray-600">
39
- New document
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
- {documentModelModules?.map((documentModelModule) => {
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
- size="small"
49
- className="cursor-pointer"
50
- title={documentModelModule.documentModel.name}
51
- aria-description={documentModelModule.documentModel.description}
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
- CreateDocumentModal,
7
+ Button,
8
8
  FileItem,
9
9
  FolderItem,
10
- useBreadcrumbs,
11
10
  } from "@powerhousedao/design-system";
12
11
  import {
13
- addDocument,
14
- type DriveEditorProps,
15
- getSyncStatusSync,
16
- setSelectedNode,
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 { DocumentModelModule } from "document-model";
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: DriveEditorProps) {
40
- // === DOCUMENT EDITOR STATE ===
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
- // All folders for the sidebar tree view
79
- const allFolders = useAllFolderNodes();
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 = useCallback(
85
- async (folderName?: string) => {
86
- let name: string | undefined = folderName;
39
+ const handleCreateFolder = async (folderName?: string) => {
40
+ let name: string | undefined = folderName;
87
41
 
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
- }
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
- const node = await addDocument(
50
+ await addFolder(
115
51
  selectedDrive.header.id,
116
- fileName,
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 document:", error);
56
+ console.error("Failed to create folder:", error);
129
57
  }
130
- },
131
- [addDocument, editorModules, selectedDrive?.header.id, selectedFolder?.id],
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
- const editorModule = activeDocument
150
- ? editorModules?.find((e) =>
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
- {/* Customize sidebar width by changing w-64 */}
160
- <div className="w-64 overflow-y-auto border-r border-gray-200 bg-white">
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
- {activeDocument && documentModelModule && editorModule ? (
74
+ {showDocumentEditor ? (
176
75
  // Document editor view
177
- <EditorContainer handleClose={() => setActiveDocumentId(undefined)} />
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
- <button
91
+ <Button
193
92
  onClick={() => handleCreateFolder()}
194
- className="rounded bg-blue-500 px-3 py-1 text-sm text-white hover:bg-blue-600"
93
+ className="bg-gray-200 p-2 hover:bg-gray-300"
195
94
  >
196
- + New Folder
197
- </button>
95
+ New Folder
96
+ </Button>
198
97
  )}
199
98
  </div>
200
99
 
201
100
  {/* Navigation breadcrumbs */}
202
- {breadcrumbs.length > 1 && (
203
- <div className="border-b border-gray-200 pb-3">
204
- <Breadcrumbs
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
- {/* Customize grid layout by changing grid-cols-1 */}
216
- {folderChildren.length > 0 && (
107
+ {folderNodes.length > 0 && (
217
108
  <div>
218
- <h3 className="mb-2 text-sm font-medium text-gray-500">
219
- 📁 Folders
109
+ <h3 className="mb-2 text-sm font-bold text-gray-600">
110
+ Folders
220
111
  </h3>
221
- <div className="grid grid-cols-1 gap-2">
222
- {folderChildren.map((folderNode) => (
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
- {/* Customize grid layout by changing grid-cols-1 */}
246
- {fileChildren.length > 0 && (
121
+ {fileNodes.length > 0 && (
247
122
  <div>
248
- <h3 className="mb-2 text-sm font-medium text-gray-500">
249
- 📄 Documents
123
+ <h3 className="mb-2 text-sm font-semibold text-gray-600">
124
+ Documents
250
125
  </h3>
251
- <div className="grid grid-cols-1 gap-2">
252
- {fileChildren.map((fileNode) => (
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
- {folderChildren.length === 0 && fileChildren.length === 0 && (
136
+ {folderNodes.length === 0 && fileNodes.length === 0 && (
277
137
  <div className="py-12 text-center text-gray-500">
278
- <p className="text-lg">📁 This folder is empty</p>
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 type { FolderNode } from "document-drive";
6
- import { useState } from "react";
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
- interface FolderTreeProps {
9
- folders: FolderNode[];
10
- selectedNodeId?: string;
11
- onSelectNode: (nodeId: string | undefined) => void;
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
- folders,
20
- selectedNodeId,
21
- onSelectNode,
22
- }: FolderTreeProps) {
23
- // Track which folders are expanded
24
- const [expandedFolders, setExpandedFolders] = useState<Set<string>>(
25
- new Set(),
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
- // Toggle folder expansion state
29
- const toggleFolder = (folderId: string) => {
30
- setExpandedFolders((prev) => {
31
- const next = new Set(prev);
32
- if (next.has(folderId)) {
33
- next.delete(folderId);
34
- } else {
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
- <div className="space-y-1">
86
- {/* Root Directory Option */}
87
- {/* Customize root folder appearance here */}
88
- <div
89
- className={`flex cursor-pointer items-center rounded px-2 py-1 text-sm hover:bg-gray-100 ${
90
- !selectedNodeId ? "bg-blue-100 text-blue-800" : ""
91
- }`}
92
- onClick={() => onSelectNode(undefined)}
93
- >
94
- <span>🏠 Root</span>
95
- </div>
96
-
97
- {/* Render top-level folders (no parent) */}
98
- {folders
99
- .filter((folder) => !folder.parentFolder)
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
+ };