From fab3f34f9942ba4d3e1b7a119771e7c006aa7e75 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 24 Nov 2025 19:04:16 +0530 Subject: [PATCH 1/3] Fix adding values from inputs always to the beginning --- .../DataMapper/Header/ExpressionBar.tsx | 27 +++++++++++-------- .../components/Header/ExpressionEditor.tsx | 5 ++++ .../ExpressionEditor/types/header.ts | 1 + 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx index 0bc8c67ccc8..ac280863179 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx @@ -110,21 +110,26 @@ export default function ExpressionBarWrapper({ views }: ExpressionBarProps) { if (inputPort) { // Keep the text field focused when an input port is selected if (textFieldRef.current) { + if (focusedPort || focusedFilter) { - textFieldRef.current.focus(true); + // Update the expression text when an input port is selected + const cursorPosition = textFieldRef.current.inputElement.selectionStart; + + const inputAccessExpr = buildInputAccessExpr(inputPort.attributes.fieldFQN); + const updatedText = + textFieldValue.substring(0, cursorPosition) + + inputAccessExpr + + textFieldValue.substring(cursorPosition); + await handleChange(updatedText); + + textFieldRef.current.setCursor(updatedText, cursorPosition + inputAccessExpr.length); + } else { textFieldRef.current.blur(); } - - // Update the expression text when an input port is selected - const cursorPosition = textFieldRef.current.shadowRoot.querySelector('input').selectionStart; - const inputAccessExpr = buildInputAccessExpr(inputPort.attributes.fieldFQN); - const updatedText = - textFieldValue.substring(0, cursorPosition) + - inputAccessExpr + - textFieldValue.substring(cursorPosition); - await handleChange(updatedText); + resetInputPort(); + } } })(); @@ -161,7 +166,7 @@ export default function ExpressionBarWrapper({ views }: ExpressionBarProps) { return disabled; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [textFieldRef.current, focusedPort, focusedFilter, views]); + }, [focusedPort, focusedFilter, views]); const handleChange = async (text: string, cursorPosition?: number) => { if (textFieldValue === text) { diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx index 3241196f9d6..fab438c36a9 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx @@ -337,6 +337,10 @@ export const ExpressionEditor = forwardRef { + setCursor(inputRef, 'input', value, cursorPosition, manualFocusTrigger); + }; + const handleRefFocus = (manualTrigger?: boolean) => { if (document.activeElement !== elementRef.current) { manualFocusTrigger.current = manualTrigger ?? false; @@ -375,6 +379,7 @@ export const ExpressionEditor = forwardRef) => { await handleExpressionSaveMutation(value, ref); } diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/header.ts b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/header.ts index 62e9455bcf0..378aaa80d28 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/header.ts +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/header.ts @@ -22,4 +22,5 @@ export type HeaderExpressionEditorProps = ExpressionEditorProps; export type HeaderExpressionEditorRef = ExpressionEditorRef & { inputElement: HTMLInputElement; + setCursor: (value: string, cursorPosition: number) => void; }; From 213923673e460bf5f98bdde92997dc87aef4dcea Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 24 Nov 2025 20:02:22 +0530 Subject: [PATCH 2/3] Fix losing focus when closing completions using close button --- .../components/Header/ExpressionEditor.tsx | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx index fab438c36a9..4c26291cff3 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx @@ -424,22 +424,24 @@ export const ExpressionEditor = forwardRef - +
{ e.preventDefault(); }}> + +
Date: Tue, 25 Nov 2025 08:34:42 +0530 Subject: [PATCH 3/3] Refactor mouse down event handler to fix ESLint error --- .../ExpressionEditor/components/Header/ExpressionEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx index 4c26291cff3..3e91ad39d1e 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx @@ -424,7 +424,7 @@ export const ExpressionEditor = forwardRef -
{ e.preventDefault(); }}> +
{ e.preventDefault(); }}>