feat(react/bulk_actions): improve note auto complete handling

This commit is contained in:
Elian Doran 2025-08-09 19:49:32 +03:00
parent 5be9bb47a7
commit 5c8e4fd6fd
No known key found for this signature in database
3 changed files with 17 additions and 9 deletions

View File

@ -4,15 +4,13 @@ import BulkAction, { BulkActionText } from "../BulkAction.jsx";
import NoteAutocomplete from "../../react/NoteAutocomplete.jsx"; import NoteAutocomplete from "../../react/NoteAutocomplete.jsx";
import { useEffect, useState } from "preact/hooks"; import { useEffect, useState } from "preact/hooks";
import { useSpacedUpdate } from "../../react/hooks.jsx"; import { useSpacedUpdate } from "../../react/hooks.jsx";
import { Suggestion } from "../../../services/note_autocomplete.js";
function MoveNoteBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) { function MoveNoteBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) {
const [ suggestion, setSuggestion ] = useState<Suggestion>(); const [ targetParentNoteId, setTargetParentNoteId ] = useState<string>();
const spacedUpdate = useSpacedUpdate(() => { const spacedUpdate = useSpacedUpdate(() => {
const noteId = suggestion?.notePath?.split("/")?.at(-1); return bulkAction.saveAction({ targetParentNoteId: targetParentNoteId })
return bulkAction.saveAction({ targetParentNoteId: noteId })
}); });
useEffect(() => spacedUpdate.scheduleUpdate(), [ suggestion ]); useEffect(() => spacedUpdate.scheduleUpdate(), [ targetParentNoteId ]);
return ( return (
<BulkAction <BulkAction
@ -32,7 +30,7 @@ function MoveNoteBulkActionComponent({ bulkAction, actionDef }: { bulkAction: Ab
<NoteAutocomplete <NoteAutocomplete
placeholder={t("move_note.target_parent_note")} placeholder={t("move_note.target_parent_note")}
onChange={setSuggestion} noteId={targetParentNoteId} noteIdChanged={setTargetParentNoteId}
/> />
</BulkAction> </BulkAction>
) )

View File

@ -32,6 +32,7 @@ function AddRelationBulkActionComponent({ bulkAction, actionDef }: { bulkAction:
<NoteAutocomplete <NoteAutocomplete
placeholder={t("add_relation.target_note")} placeholder={t("add_relation.target_note")}
noteId={targetNoteId} noteIdChanged={setTargetNoteId}
/> />
</BulkAction> </BulkAction>
) )

View File

@ -12,9 +12,11 @@ interface NoteAutocompleteProps {
opts?: Omit<Options, "container">; opts?: Omit<Options, "container">;
onChange?: (suggestion: Suggestion | null) => void; onChange?: (suggestion: Suggestion | null) => void;
onTextChange?: (text: string) => 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<HTMLInputElement>(null); const ref = _ref ?? useRef<HTMLInputElement>(null);
useEffect(() => { useEffect(() => {
@ -30,8 +32,15 @@ export default function NoteAutocomplete({ inputRef: _ref, text, placeholder, on
...opts, ...opts,
container: container?.current container: container?.current
}); });
if (onChange) { if (onChange || noteIdChanged) {
const listener = (_e, suggestion) => onChange(suggestion); const listener = (_e, suggestion) => {
onChange?.(suggestion);
if (noteIdChanged) {
const noteId = suggestion?.notePath?.split("/")?.at(-1);
noteIdChanged(noteId);
}
};
$autoComplete $autoComplete
.on("autocomplete:noteselected", listener) .on("autocomplete:noteselected", listener)
.on("autocomplete:externallinkselected", listener) .on("autocomplete:externallinkselected", listener)