diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index 836bc898..96b409b9 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -3390,9 +3390,9 @@ function App() { return } - // Top-level knowledge folders (except Notes) open as a bases view with folder filter + // Top-level knowledge folders open as a bases view with folder filter const parts = path.split('/') - if (parts.length === 2 && parts[0] === 'knowledge' && parts[1] !== 'Notes') { + if (parts.length === 2 && parts[0] === 'knowledge') { const folderName = parts[1] const folderCfg = FOLDER_BASE_CONFIGS[folderName] setBaseConfigByPath((prev) => ({ @@ -4141,6 +4141,14 @@ function App() { selectedPath={selectedPath} expandedPaths={expandedPaths} onSelectFile={toggleExpand} + onToggleFolder={(path) => { + setExpandedPaths((prev) => { + const next = new Set(prev) + if (next.has(path)) next.delete(path) + else next.add(path) + return next + }) + }} knowledgeActions={knowledgeActions} onVoiceNoteCreated={handleVoiceNoteCreated} runs={runs} diff --git a/apps/x/apps/renderer/src/components/sidebar-content.tsx b/apps/x/apps/renderer/src/components/sidebar-content.tsx index e91f815c..41d6b622 100644 --- a/apps/x/apps/renderer/src/components/sidebar-content.tsx +++ b/apps/x/apps/renderer/src/components/sidebar-content.tsx @@ -63,6 +63,7 @@ import { SidebarGroupContent, SidebarHeader, SidebarMenu, + SidebarMenuAction, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, @@ -170,6 +171,7 @@ type SidebarContentPanelProps = { selectedPath: string | null expandedPaths: Set onSelectFile: (path: string, kind: "file" | "dir") => void + onToggleFolder?: (path: string) => void knowledgeActions: KnowledgeActions onVoiceNoteCreated?: (path: string) => void runs?: RunListItem[] @@ -403,6 +405,7 @@ export function SidebarContentPanel({ selectedPath, expandedPaths, onSelectFile, + onToggleFolder, knowledgeActions, onVoiceNoteCreated, runs = [], @@ -605,6 +608,7 @@ export function SidebarContentPanel({ selectedPath={selectedPath} expandedPaths={expandedPaths} onSelectFile={onSelectFile} + onToggleFolder={onToggleFolder} actions={knowledgeActions} onVoiceNoteCreated={onVoiceNoteCreated} /> @@ -993,6 +997,7 @@ function KnowledgeSection({ selectedPath, expandedPaths, onSelectFile, + onToggleFolder, actions, onVoiceNoteCreated, }: { @@ -1000,6 +1005,7 @@ function KnowledgeSection({ selectedPath: string | null expandedPaths: Set onSelectFile: (path: string, kind: "file" | "dir") => void + onToggleFolder?: (path: string) => void actions: KnowledgeActions onVoiceNoteCreated?: (path: string) => void }) { @@ -1089,6 +1095,7 @@ function KnowledgeSection({ selectedPath={selectedPath} expandedPaths={expandedPaths} onSelect={onSelectFile} + onToggleFolder={onToggleFolder} actions={actions} /> ))} @@ -1125,12 +1132,14 @@ function Tree({ selectedPath, expandedPaths, onSelect, + onToggleFolder, actions, }: { item: TreeNode selectedPath: string | null expandedPaths: Set onSelect: (path: string, kind: "file" | "dir") => void + onToggleFolder?: (path: string) => void actions: KnowledgeActions }) { const isDir = item.kind === 'dir' @@ -1267,15 +1276,15 @@ function Tree({ ) } - // Top-level knowledge folders (except Notes) open bases view — render as flat items + // Top-level knowledge folders open bases view — render as flat items const parts = item.path.split('/') - const isBasesFolder = isDir && parts.length === 2 && parts[0] === 'knowledge' && parts[1] !== 'Notes' + const isBasesFolder = isDir && parts.length === 2 && parts[0] === 'knowledge' if (isBasesFolder) { return ( - + onSelect(item.path, item.kind)}>
@@ -1283,6 +1292,38 @@ function Tree({ {countFiles(item)}
+ {onToggleFolder && (item.children?.length ?? 0) > 0 && ( + { + e.stopPropagation() + onToggleFolder(item.path) + }} + > + + + )} + {isExpanded && ( + + {(item.children ?? []).map((subItem, index) => ( + + ))} + + )}
{contextMenuContent} @@ -1347,6 +1388,7 @@ function Tree({ selectedPath={selectedPath} expandedPaths={expandedPaths} onSelect={onSelect} + onToggleFolder={onToggleFolder} actions={actions} /> ))}