From 7eabcad0ce501a28aa4bedd5817b1bcbad27231a Mon Sep 17 00:00:00 2001 From: Anil Sahoo Date: Mon, 16 Mar 2026 10:51:39 +0530 Subject: [PATCH 1/2] Fixed an issue where Query Tool's Messages tab content right-click "Select All" selects the entire page's content and copying the selection by right-click "Copy" reset the selection. #8992 --- .../js/components/sections/Messages.jsx | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/web/pgadmin/tools/sqleditor/static/js/components/sections/Messages.jsx b/web/pgadmin/tools/sqleditor/static/js/components/sections/Messages.jsx index 5518eb51bed..042e3e760bd 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/sections/Messages.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/sections/Messages.jsx @@ -10,6 +10,8 @@ import { styled } from '@mui/material/styles'; import React from 'react'; import { QueryToolEventsContext } from '../QueryToolComponent'; import { QUERY_TOOL_EVENTS } from '../QueryToolConstants'; +import gettext from 'sources/gettext'; +import { PgMenu, PgMenuItem } from '../../../../../../static/js/components/Menu'; const StyledDiv = styled('div')(({theme}) => ({ whiteSpace: 'pre-wrap', @@ -27,6 +29,8 @@ const StyledDiv = styled('div')(({theme}) => ({ export function Messages() { const [messageText, setMessageText] = React.useState(''); + const [contextPos, setContextPos] = React.useState(null); + const containerRef = React.useRef(null); const eventBus = React.useContext(QueryToolEventsContext); React.useEffect(()=>{ eventBus.registerListener(QUERY_TOOL_EVENTS.SET_MESSAGE, (text, append=false)=>{ @@ -38,5 +42,45 @@ export function Messages() { }); }); }, []); - return {messageText}; + + const handleContextMenu = React.useCallback((e)=>{ + e.preventDefault(); + setContextPos({x: e.clientX, y: e.clientY}); + }, []); + + const selectAll = React.useCallback(()=>{ + if(containerRef.current) { + const selection = window.getSelection(); + const range = document.createRange(); + range.selectNodeContents(containerRef.current); + selection.removeAllRanges(); + selection.addRange(range); + } + setContextPos(null); + }, []); + + const copyToClipboard = React.useCallback(()=>{ + const selection = window.getSelection(); + const text = selection.toString(); + if(text) { + navigator.clipboard.writeText(text); + } + setContextPos(null); + }, []); + + return <> + + {messageText} + + setContextPos(null)} + label="messages-context" + portal + > + {gettext('Copy')} + {gettext('Select All')} + + ; } From 0415fa9fdc9f73009abab322a030cd42ad7d8507 Mon Sep 17 00:00:00 2001 From: Anil Sahoo Date: Mon, 16 Mar 2026 13:27:57 +0530 Subject: [PATCH 2/2] Fixed review comments by moving code to textarea HTML element --- .../js/components/sections/Messages.jsx | 53 +++---------------- 1 file changed, 6 insertions(+), 47 deletions(-) diff --git a/web/pgadmin/tools/sqleditor/static/js/components/sections/Messages.jsx b/web/pgadmin/tools/sqleditor/static/js/components/sections/Messages.jsx index 042e3e760bd..4cb3e7e7baf 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/sections/Messages.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/sections/Messages.jsx @@ -10,27 +10,26 @@ import { styled } from '@mui/material/styles'; import React from 'react'; import { QueryToolEventsContext } from '../QueryToolComponent'; import { QUERY_TOOL_EVENTS } from '../QueryToolConstants'; -import gettext from 'sources/gettext'; -import { PgMenu, PgMenuItem } from '../../../../../../static/js/components/Menu'; -const StyledDiv = styled('div')(({theme}) => ({ +const StyledTextarea = styled('textarea')(({theme}) => ({ whiteSpace: 'pre-wrap', fontFamily: '"Source Code Pro", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace', padding: '5px 10px', overflow: 'auto', height: '100%', + width: '100%', fontSize: '12px', - userSelect: 'text', backgroundColor: theme.palette.background.default, color: theme.palette.text.primary, + border: 'none', + outline: 'none', + resize: 'none', ...theme.mixins.fontSourceCode, })); export function Messages() { const [messageText, setMessageText] = React.useState(''); - const [contextPos, setContextPos] = React.useState(null); - const containerRef = React.useRef(null); const eventBus = React.useContext(QueryToolEventsContext); React.useEffect(()=>{ eventBus.registerListener(QUERY_TOOL_EVENTS.SET_MESSAGE, (text, append=false)=>{ @@ -42,45 +41,5 @@ export function Messages() { }); }); }, []); - - const handleContextMenu = React.useCallback((e)=>{ - e.preventDefault(); - setContextPos({x: e.clientX, y: e.clientY}); - }, []); - - const selectAll = React.useCallback(()=>{ - if(containerRef.current) { - const selection = window.getSelection(); - const range = document.createRange(); - range.selectNodeContents(containerRef.current); - selection.removeAllRanges(); - selection.addRange(range); - } - setContextPos(null); - }, []); - - const copyToClipboard = React.useCallback(()=>{ - const selection = window.getSelection(); - const text = selection.toString(); - if(text) { - navigator.clipboard.writeText(text); - } - setContextPos(null); - }, []); - - return <> - - {messageText} - - setContextPos(null)} - label="messages-context" - portal - > - {gettext('Copy')} - {gettext('Select All')} - - ; + return ; }