Feat v0.4.1 folders navigation tree (#23)

Add folders as a first-class concept in the Notes surface with full
CRUD, nested tree navigation, and folder-based note filtering.

Backend (script.star):
- Folder CRUD handlers: list, create, update, delete
- Move-note endpoint to reassign folder_id
- Delete cascades: orphan notes to unfiled, reparent child folders
- Stats now include unfiled and folder counts

Frontend (js/main.js):
- FolderTree component with flat-to-tree builder via useMemo
- FolderNode recursive component with expand/collapse, inline rename
- Folder state: activeFolderId, showUnfiled for sidebar filtering
- Editor folder select dropdown for moving notes between folders
- New notes inherit active folder on creation

Schema (manifest.json):
- New ext_notes_folders table (name, parent_id, creator_id, sort_order)
- 5 new API routes: GET/POST /folders, PUT/DELETE /folders/*, POST /notes/move
- Version bumped to 0.2.0

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 11:38:54 +00:00
parent 2c8dc59284
commit 70404ff070
4 changed files with 441 additions and 16 deletions

View File

@@ -6,7 +6,7 @@
"route": "/s/notes",
"auth": "authenticated",
"layout": "single",
"version": "0.1.0",
"version": "0.2.0",
"icon": "📝",
"description": "Markdown notes surface with folders, tags, and backlinks.",
"author": "switchboard",
@@ -20,7 +20,12 @@
{"method": "PUT", "path": "/notes/*"},
{"method": "DELETE", "path": "/notes/*"},
{"method": "GET", "path": "/search"},
{"method": "GET", "path": "/stats"}
{"method": "GET", "path": "/stats"},
{"method": "GET", "path": "/folders"},
{"method": "POST", "path": "/folders"},
{"method": "PUT", "path": "/folders/*"},
{"method": "DELETE", "path": "/folders/*"},
{"method": "POST", "path": "/notes/move"}
],
"db_tables": {
@@ -40,6 +45,18 @@
["pinned"],
["updated_at"]
]
},
"folders": {
"columns": {
"name": "text",
"parent_id": "text",
"creator_id": "text",
"sort_order": "int"
},
"indexes": [
["parent_id"],
["creator_id"]
]
}
},