mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-05-22 18:45:19 +02:00
better meeting organization and sidebar display
- Meeting notes saved as YYYY/MM/DD/{Title}.md under each source folder
- Sidebar flattens date hierarchy to show "2026-03-15 Title.md" (newest first)
- Empty source folders (granola/fireflies) and empty Meetings folder hidden from sidebar
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
25db5f8d6b
commit
2992196bb3
1 changed files with 44 additions and 1 deletions
|
|
@ -271,6 +271,49 @@ function sortNodes(nodes: TreeNode[]): TreeNode[] {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten date-based folder hierarchy under Meetings/ source folders.
|
||||||
|
* Turns Meetings/granola/2026/03/15/Title.md into a flat list under
|
||||||
|
* Meetings/granola/ with display name "2026-03-15 Title".
|
||||||
|
*/
|
||||||
|
function flattenMeetingsTree(nodes: TreeNode[]): TreeNode[] {
|
||||||
|
return nodes.flatMap(node => {
|
||||||
|
if (node.kind !== 'dir' || node.name !== 'Meetings') return [node]
|
||||||
|
|
||||||
|
const flattenedSourceChildren = (node.children ?? []).flatMap(sourceNode => {
|
||||||
|
if (sourceNode.kind !== 'dir') return [sourceNode]
|
||||||
|
|
||||||
|
// Collect all files recursively from the date hierarchy
|
||||||
|
const files: TreeNode[] = []
|
||||||
|
function collectFiles(n: TreeNode, dateParts: string[]) {
|
||||||
|
for (const child of n.children ?? []) {
|
||||||
|
if (child.kind === 'file') {
|
||||||
|
const dateStr = dateParts.join('-')
|
||||||
|
const displayName = dateStr ? `${dateStr} ${child.name}` : child.name
|
||||||
|
files.push({ ...child, name: displayName })
|
||||||
|
} else if (child.kind === 'dir') {
|
||||||
|
collectFiles(child, [...dateParts, child.name])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
collectFiles(sourceNode, [])
|
||||||
|
|
||||||
|
// Hide empty source folders
|
||||||
|
if (files.length === 0) return []
|
||||||
|
|
||||||
|
// Sort files reverse chronologically (newest first)
|
||||||
|
files.sort((a, b) => b.name.localeCompare(a.name))
|
||||||
|
|
||||||
|
return [{ ...sourceNode, children: files }]
|
||||||
|
})
|
||||||
|
|
||||||
|
// Hide Meetings folder entirely if no source folders have files
|
||||||
|
if (flattenedSourceChildren.length === 0) return []
|
||||||
|
|
||||||
|
return [{ ...node, children: flattenedSourceChildren }]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Build tree structure from flat entries
|
// Build tree structure from flat entries
|
||||||
function buildTree(entries: DirEntry[]): TreeNode[] {
|
function buildTree(entries: DirEntry[]): TreeNode[] {
|
||||||
const treeMap = new Map<string, TreeNode>()
|
const treeMap = new Map<string, TreeNode>()
|
||||||
|
|
@ -928,7 +971,7 @@ function App() {
|
||||||
opts: { recursive: false, includeHidden: false, includeStats: true }
|
opts: { recursive: false, includeHidden: false, includeStats: true }
|
||||||
}).catch(() => [] as DirEntry[]),
|
}).catch(() => [] as DirEntry[]),
|
||||||
])
|
])
|
||||||
const knowledgeTree = buildTree(knowledgeResult)
|
const knowledgeTree = flattenMeetingsTree(buildTree(knowledgeResult))
|
||||||
const basesChildren: TreeNode[] = (basesResult as DirEntry[])
|
const basesChildren: TreeNode[] = (basesResult as DirEntry[])
|
||||||
.filter((e) => e.name.endsWith('.base'))
|
.filter((e) => e.name.endsWith('.base'))
|
||||||
.map((e) => ({ ...e, kind: 'file' as const }))
|
.map((e) => ({ ...e, kind: 'file' as const }))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue