fix(p3): TipTap focus, Task List toast dedup, TaskCard a11y

Bug #10 (LOW): TipTap editor text input leaks into Search field.
The EditorContent wrapper had no tabIndex so the global keyboard
shortcut (which treats inputs/textareas/buttons as focused but
not contenteditable divs) sent typed text to the search field
instead of the editor. Adding tabIndex={0} makes the wrapper
focusable; TipTap's contentEditable=true then routes the
keyboard events to the editor.

Bug #1 (LOW): Task List view infinite toast loop. The catch block
fired toast.error on every realtime-triggered fetch failure with
no dedup, causing infinite toast spam on 429 or persistent
errors. Realtime subscription also called fetchTasks() on every
event with no debounce, amplifying the problem.

Fixes:
- Add lastErrorRef to track the last error message; only toast
  when the message class changes.
- Distinguish 429/rate-limited from generic 500 in the toast text.
- Reset lastErrorRef on successful fetch.
- Debounce the realtime-triggered refetch by 750ms so event
  bursts collapse to a single fetch.

Bug #8 (LOW): TaskCard in Board view not keyboard-focusable.
The TaskCard in tasks-kanban-view.tsx already has role=button,
tabIndex={0}, onKeyDown for Enter/Space, and aria-label. No
change needed; verified in the tree that the fix is present
(probably landed as part of an earlier leaf integration).

Bug #1 + Bug #8 + Bug #10 all addressed in this commit.

Note: Bug #9 (Search returns No results) is fixed by P0 (the
search route was patched to use resolveActiveDomain). Verified
working without further changes needed.
This commit is contained in:
Hermes
2026-07-31 01:06:31 +00:00
parent 78a9c50ef2
commit efe8db108d
3 changed files with 34 additions and 7 deletions
+1 -1
View File
@@ -128,7 +128,7 @@ export function NoteEditor({ content, onChange, onBlur }: NoteEditorProps) {
{/* Editor content */}
<div className="flex-1 overflow-auto">
<EditorContent editor={editor} className="tiptap-editor min-h-[400px]" />
<EditorContent editor={editor} className="tiptap-editor min-h-[400px]" tabIndex={0} />
</div>
</div>
);