From 5c8e4fd6fd5e22049f40cf56221695c3538c4166 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 9 Aug 2025 19:49:32 +0300 Subject: [PATCH] feat(react/bulk_actions): improve note auto complete handling --- .../src/widgets/bulk_actions/note/move_note.tsx | 10 ++++------ .../bulk_actions/relation/add_relation.tsx | 1 + .../client/src/widgets/react/NoteAutocomplete.tsx | 15 ++++++++++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/client/src/widgets/bulk_actions/note/move_note.tsx b/apps/client/src/widgets/bulk_actions/note/move_note.tsx index 677680bbc..5e9945bbb 100644 --- a/apps/client/src/widgets/bulk_actions/note/move_note.tsx +++ b/apps/client/src/widgets/bulk_actions/note/move_note.tsx @@ -4,15 +4,13 @@ import BulkAction, { BulkActionText } from "../BulkAction.jsx"; import NoteAutocomplete from "../../react/NoteAutocomplete.jsx"; import { useEffect, useState } from "preact/hooks"; import { useSpacedUpdate } from "../../react/hooks.jsx"; -import { Suggestion } from "../../../services/note_autocomplete.js"; function MoveNoteBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) { - const [ suggestion, setSuggestion ] = useState(); + const [ targetParentNoteId, setTargetParentNoteId ] = useState(); const spacedUpdate = useSpacedUpdate(() => { - const noteId = suggestion?.notePath?.split("/")?.at(-1); - return bulkAction.saveAction({ targetParentNoteId: noteId }) + return bulkAction.saveAction({ targetParentNoteId: targetParentNoteId }) }); - useEffect(() => spacedUpdate.scheduleUpdate(), [ suggestion ]); + useEffect(() => spacedUpdate.scheduleUpdate(), [ targetParentNoteId ]); return ( ) diff --git a/apps/client/src/widgets/bulk_actions/relation/add_relation.tsx b/apps/client/src/widgets/bulk_actions/relation/add_relation.tsx index 927c10ace..5e10933a8 100644 --- a/apps/client/src/widgets/bulk_actions/relation/add_relation.tsx +++ b/apps/client/src/widgets/bulk_actions/relation/add_relation.tsx @@ -32,6 +32,7 @@ function AddRelationBulkActionComponent({ bulkAction, actionDef }: { bulkAction: ) diff --git a/apps/client/src/widgets/react/NoteAutocomplete.tsx b/apps/client/src/widgets/react/NoteAutocomplete.tsx index 1a7e9ad55..926a9e328 100644 --- a/apps/client/src/widgets/react/NoteAutocomplete.tsx +++ b/apps/client/src/widgets/react/NoteAutocomplete.tsx @@ -12,9 +12,11 @@ interface NoteAutocompleteProps { opts?: Omit; onChange?: (suggestion: Suggestion | null) => void; onTextChange?: (text: string) => void; + noteIdChanged?: (noteId: string) => void; + noteId?: string; } -export default function NoteAutocomplete({ inputRef: _ref, text, placeholder, onChange, onTextChange, container, opts }: NoteAutocompleteProps) { +export default function NoteAutocomplete({ inputRef: _ref, text, placeholder, onChange, onTextChange, container, opts, noteId, noteIdChanged }: NoteAutocompleteProps) { const ref = _ref ?? useRef(null); useEffect(() => { @@ -30,8 +32,15 @@ export default function NoteAutocomplete({ inputRef: _ref, text, placeholder, on ...opts, container: container?.current }); - if (onChange) { - const listener = (_e, suggestion) => onChange(suggestion); + if (onChange || noteIdChanged) { + const listener = (_e, suggestion) => { + onChange?.(suggestion); + + if (noteIdChanged) { + const noteId = suggestion?.notePath?.split("/")?.at(-1); + noteIdChanged(noteId); + } + }; $autoComplete .on("autocomplete:noteselected", listener) .on("autocomplete:externallinkselected", listener)