From 445f5e1257b6e4b6a432635421cb14da0d8ef871 Mon Sep 17 00:00:00 2001 From: Hermes Date: Sat, 1 Aug 2026 12:51:50 +0000 Subject: [PATCH] fix: use uncontrolled input for note title to prevent focus leak to search field --- apps/web/src/routes/_app/notes.tsx | 29 ++++++---------- fix_notes.py | 56 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 fix_notes.py diff --git a/apps/web/src/routes/_app/notes.tsx b/apps/web/src/routes/_app/notes.tsx index 7bf3dce..bb8e155 100644 --- a/apps/web/src/routes/_app/notes.tsx +++ b/apps/web/src/routes/_app/notes.tsx @@ -53,10 +53,8 @@ function NotesPage() { const queryClient = useQueryClient(); const [search, setSearch] = useState(""); const [selectedNote, setSelectedNote] = useState(null); - const [titleDraft, setTitleDraft] = useState(""); const [editorContent, setEditorContent] = useState(""); const saveTimerRef = useRef | null>(null); - const titleTimerRef = useRef | null>(null); const [showBacklinks, setShowBacklinks] = useState(false); const [showVersions, setShowVersions] = useState(false); @@ -95,11 +93,9 @@ function NotesPage() { try { const detail = await api.get("/notes/" + note.id); setSelectedNote(detail); - setTitleDraft(detail.title); setEditorContent(detail.content || ""); } catch { setSelectedNote(note); - setTitleDraft(note.title); setEditorContent(note.content || ""); } setShowBacklinks(false); @@ -116,16 +112,6 @@ function NotesPage() { }, 500); }, [selectedNote, updateMutation]); - const handleTitleChange = (title: string) => { - setTitleDraft(title); - }; - - const handleTitleBlur = () => { - if (selectedNote && titleDraft !== selectedNote.title) { - updateMutation.mutate({ id: selectedNote.id, data: { title: titleDraft } }); - setSelectedNote({ ...selectedNote, title: titleDraft }); - } - }; return (
@@ -177,11 +163,16 @@ function NotesPage() { {selectedNote ? ( <>
- handleTitleChange(e.target.value)} - onBlur={handleTitleBlur} - className="text-lg font-semibold border-0 focus-visible:ring-0 px-0" + { + if (selectedNote && e.target.value !== selectedNote.title) { + updateMutation.mutate({ id: selectedNote.id, data: { title: e.target.value } }); + setSelectedNote({ ...selectedNote, title: e.target.value }); + } + }} + className="flex h-9 w-full rounded-md border-0 bg-transparent px-0 py-1 text-lg font-semibold text-base shadow-none transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0 disabled:cursor-not-allowed disabled:opacity-50" />