From e108ee66cb5b55d9d8feb749c85da4a6eac95b0e Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Fri, 27 Feb 2026 12:18:48 +0800 Subject: [PATCH] Enhance AssistantsPage template suggestion functionality by adding control parameter to updateTemplateSuggestionState. This allows for dynamic positioning of suggestion dropdowns based on caret position, improving user experience during text input. Update relevant event handlers to pass control element for accurate suggestion placement. --- web/pages/Assistants.tsx | 146 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 135 insertions(+), 11 deletions(-) diff --git a/web/pages/Assistants.tsx b/web/pages/Assistants.tsx index 453c2f8..7722af3 100644 --- a/web/pages/Assistants.tsx +++ b/web/pages/Assistants.tsx @@ -273,7 +273,8 @@ export const AssistantsPage: React.FC = () => { const updateTemplateSuggestionState = ( field: 'prompt' | 'opener', value: string, - caret: number | null + caret: number | null, + control?: HTMLTextAreaElement | HTMLInputElement | null ) => { if (caret === null || caret < 0) { setTemplateSuggestion(null); @@ -294,11 +295,18 @@ export const AssistantsPage: React.FC = () => { setTemplateSuggestion(null); return; } + if (!control) { + setTemplateSuggestion(null); + return; + } + const anchor = getTemplateSuggestionAnchor(control, caret); setTemplateSuggestion({ field, start, end: caret, query: token, + anchorLeft: anchor.left, + anchorTop: anchor.top, }); }; @@ -765,16 +773,16 @@ export const AssistantsPage: React.FC = () => { onChange={(e) => { const next = e.target.value; updateAssistant('prompt', next); - updateTemplateSuggestionState('prompt', next, e.currentTarget.selectionStart); + updateTemplateSuggestionState('prompt', next, e.currentTarget.selectionStart, e.currentTarget); }} onKeyUp={(e) => { - updateTemplateSuggestionState('prompt', e.currentTarget.value, e.currentTarget.selectionStart); + updateTemplateSuggestionState('prompt', e.currentTarget.value, e.currentTarget.selectionStart, e.currentTarget); }} onClick={(e) => { - updateTemplateSuggestionState('prompt', e.currentTarget.value, e.currentTarget.selectionStart); + updateTemplateSuggestionState('prompt', e.currentTarget.value, e.currentTarget.selectionStart, e.currentTarget); }} onFocus={(e) => { - updateTemplateSuggestionState('prompt', e.currentTarget.value, e.currentTarget.selectionStart); + updateTemplateSuggestionState('prompt', e.currentTarget.value, e.currentTarget.selectionStart, e.currentTarget); }} onBlur={() => { window.setTimeout(() => { @@ -784,7 +792,13 @@ export const AssistantsPage: React.FC = () => { placeholder="设定小助手的人设、语气、行为规范以及业务逻辑..." /> {templateSuggestion?.field === 'prompt' && filteredSystemTemplateVariables.length > 0 && ( -
+
{filteredSystemTemplateVariables.map((item) => (