5.4 KiB
Knowledge View Task Consolidation — Design Spec
Goal
Consolidate tasks into the Knowledge view as a card type, deprecate the standalone /notes and /tasks list views, and simplify navigation. The Knowledge view becomes the single hub for all content types: notes, tasks, people, places, and lists.
Architecture
The Knowledge view already renders notes, people, places, and lists as typed cards in a filterable grid with a sidebar. Tasks are added as a fifth card type using the same two-tier pagination system (ID pre-fetch → content batch). The backend knowledge endpoints (/api/knowledge/ids, /api/knowledge/batch, /api/knowledge/counts) are extended to include tasks. No changes to the note/task CRUD API.
Task Cards
Task cards follow the same layout as other knowledge cards:
- Left accent strip: distinct color for tasks (e.g.
#a78bfapurple to differentiate from note indigo) - Type badge: "Task" in top-right corner
- Card body:
- Title (2-line clamp)
- Status badge:
todo/in_progress/done/cancelled— styled with existing status colors from theme (--color-status-*) - Priority indicator: shown only when priority is not
none— uses existing priority colors (--color-priority-*) - Due date: shown when set, with overdue styling (
--color-overdue) when past and status is notdone/cancelled
- Card footer: tags (up to 3) + last-modified date — identical to other card types
Clicking a task card navigates to /tasks/:id/edit (same as today).
Filter Sidebar Changes
The type filter section gains a "Tasks" button:
Type
──────────
[All] 127
[Notes] 84
[Tasks] 22
[People] 8
[Places] 5
[Lists] 8
The filter value for tasks is type=task. The backend already stores tasks as notes with is_task=True; the knowledge endpoints need to map the type=task filter to is_task=True.
New Note Button Interaction
Current: click "New note" to create a note; chevron expands a dropdown with Note/Person/Place/List.
New behavior:
- Click "New note" (when collapsed) → expands to reveal type options: Task, Person, Place, List. The main button label does not change.
- Click "New note" again (when expanded) → navigates to
/notes/new(generic note). - Click any type option → navigates to
/notes/new?type=<type>(for task:/notes/new?type=task, which is equivalent to/tasks/new). - Click outside → collapses the dropdown.
This replaces the current chevron split-button pattern with a simpler toggle. The dropdown items are: Task, Person, Place, List (no "Note" item in the dropdown — clicking the button itself creates a note).
Route Changes
Redirects
| Old route | New behavior |
|---|---|
/notes |
302 redirect → / (Knowledge view) |
/tasks |
302 redirect → / (Knowledge view) |
Preserved routes (no change)
| Route | Purpose |
|---|---|
/notes/:id |
Note viewer |
/notes/:id/edit |
Note editor |
/notes/new |
New note (with optional ?type= param) |
/tasks/:id/edit |
Task editor |
/tasks/new |
New task |
Router implementation
Add redirect entries in the router config:
{ path: '/notes', redirect: '/' },
{ path: '/tasks', redirect: '/' },
Navigation
Remove from AppHeader.vue:
- "Tasks" nav link (
<router-link to="/tasks">) - The
/tasksentry in both desktop nav-center and mobile menu
Remove from AppHeader.vue (already done — /notes was removed in a prior change, but verify).
Deleted files
frontend/src/views/NotesListView.vuefrontend/src/views/TasksListView.vuefrontend/src/stores/notes.ts(if only used by NotesListView)frontend/src/stores/tasks.ts(if only used by TasksListView)
Verify no other components import from these before deleting. The note/task viewer and editor screens import from api/client.ts directly, not from the list stores.
Backend Changes
/api/knowledge/ids
Accept type=task as a valid filter. When type=task, query notes table with is_task = True. When type is not set (all), include tasks in results alongside notes/people/places/lists.
/api/knowledge/batch
Return task-specific fields for items where is_task = True:
status: todo / in_progress / done / cancelledpriority: none / low / normal / highdue_date: ISO date string or null
These are already columns on the Note model — just include them in the batch response when the item is a task.
/api/knowledge/counts
Add task to the counts response:
{ "note": 84, "task": 22, "person": 8, "place": 5, "list": 8, "total": 127 }
/api/knowledge/tags
No change — tasks already have tags on the same Note model.
Keyboard Shortcuts
Remove from App.vue onGlobalKeydown:
case "t": router.push("/tasks/new")— keep this, it still workscase "g"sequencecase "t": router.push("/tasks")— change torouter.push("/")(direct navigation, don't rely on redirect)
Update shortcuts overlay panel text if it references "Tasks list".
No API Endpoint Changes
All existing REST endpoints remain:
GET/POST /api/notes— notes CRUDGET/POST /api/tasks— tasks CRUDPATCH /api/notes/:id,PATCH /api/tasks/:idDELETE /api/notes/:id,DELETE /api/tasks/:id
MCP tools (fable_create_task, fable_list_tasks, etc.) are unaffected.