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>
72 lines
1.7 KiB
JSON
72 lines
1.7 KiB
JSON
{
|
|
"id": "notes",
|
|
"title": "Notes",
|
|
"type": "full",
|
|
"tier": "starlark",
|
|
"route": "/s/notes",
|
|
"auth": "authenticated",
|
|
"layout": "single",
|
|
"version": "0.2.0",
|
|
"icon": "📝",
|
|
"description": "Markdown notes surface with folders, tags, and backlinks.",
|
|
"author": "switchboard",
|
|
|
|
"permissions": ["db.write"],
|
|
|
|
"api_routes": [
|
|
{"method": "GET", "path": "/notes"},
|
|
{"method": "POST", "path": "/notes"},
|
|
{"method": "GET", "path": "/notes/*"},
|
|
{"method": "PUT", "path": "/notes/*"},
|
|
{"method": "DELETE", "path": "/notes/*"},
|
|
{"method": "GET", "path": "/search"},
|
|
{"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": {
|
|
"notes": {
|
|
"columns": {
|
|
"title": "text",
|
|
"body": "text",
|
|
"folder_id": "text",
|
|
"creator_id": "text",
|
|
"updated_at": "text",
|
|
"pinned": "int",
|
|
"archived": "int"
|
|
},
|
|
"indexes": [
|
|
["folder_id"],
|
|
["creator_id"],
|
|
["pinned"],
|
|
["updated_at"]
|
|
]
|
|
},
|
|
"folders": {
|
|
"columns": {
|
|
"name": "text",
|
|
"parent_id": "text",
|
|
"creator_id": "text",
|
|
"sort_order": "int"
|
|
},
|
|
"indexes": [
|
|
["parent_id"],
|
|
["creator_id"]
|
|
]
|
|
}
|
|
},
|
|
|
|
"settings": {
|
|
"default_view": {
|
|
"type": "string",
|
|
"label": "Default View",
|
|
"description": "Default note list view: recent or pinned",
|
|
"default": "recent"
|
|
}
|
|
}
|
|
}
|