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..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 @@ -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); } @@ -419,22 +424,24 @@ export const ExpressionEditor = forwardRef - +
{ e.preventDefault(); }}> + +
void; };