From 7469ced9983f125e381a21688be434af7d727378 Mon Sep 17 00:00:00 2001 From: Aditya Toshniwal Date: Tue, 6 Jan 2026 17:36:54 +0530 Subject: [PATCH] Warn user of unsaved data output edits before page navigation. #8916 --- docs/en_US/images/query_data_pagination.png | Bin 18498 -> 20558 bytes docs/en_US/query_tool_toolbar.rst | 2 + web/pgadmin/static/js/custom_hooks.js | 7 ++ .../static/js/helpers/ModalProvider.jsx | 9 +-- .../js/components/sections/ResultSet.jsx | 61 ++++++++++++------ .../utils/driver/psycopg3/server_manager.py | 3 +- 6 files changed, 53 insertions(+), 29 deletions(-) diff --git a/docs/en_US/images/query_data_pagination.png b/docs/en_US/images/query_data_pagination.png index 5fa94e22348284906576377e57acde5d59d13b99..8561d117af1522aae0fd93adc89daae151171077 100644 GIT binary patch delta 19891 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 fnRef.current(...args)), []); +} diff --git a/web/pgadmin/static/js/helpers/ModalProvider.jsx b/web/pgadmin/static/js/helpers/ModalProvider.jsx index 2386da374fe..93fac5c9fb6 100644 --- a/web/pgadmin/static/js/helpers/ModalProvider.jsx +++ b/web/pgadmin/static/js/helpers/ModalProvider.jsx @@ -86,19 +86,14 @@ function alert(title, text, onOkClick, okLabel = gettext('OK')) { function confirm(title, text, onOkClick, onCancelClick, okLabel = gettext('Yes'), cancelLabel = gettext('No'), okIcon = 'default', modalId=null) { // bind the modal provider before calling this.showModal(title, (closeModal) => { - const onCancelClickClose = () => { - onCancelClick?.(); - closeModal(); - }; - const onOkClickClose = () => { onOkClick?.(); closeModal(); }; return ( - + ); - }, {id: modalId}); + }, {id: modalId, onClose: onCancelClick}); } function confirmDelete(title, text, onDeleteClick, onCancelClick, deleteLabel = gettext('Delete'), cancelLabel = gettext('Cancel')) { diff --git a/web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx b/web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx index f91533c85a0..19275df2207 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx @@ -31,6 +31,7 @@ import { GraphVisualiser } from './GraphVisualiser'; import { usePgAdmin } from '../../../../../../static/js/PgAdminProvider'; import pgAdmin from 'sources/pgadmin'; import { connectServer, connectServerModal } from '../connectServer'; +import { useLatestFunc } from '../../../../../../static/js/custom_hooks'; const StyledBox = styled(Box)(({theme}) => ({ display: 'flex', @@ -846,7 +847,7 @@ export function ResultSet() { const modalId = MODAL_DIALOGS.QT_CONFIRMATIONS; // We'll use this track if any changes were saved. // It will help to decide whether results refresh is required or not on page change. - const pageDataDirty = useRef(false); + const pageDataOutOfSync = useRef(false); const selectedCell = useRef([]); const selectedRange = useRef(null); @@ -873,9 +874,10 @@ export function ResultSet() { // To use setLoaderText to the ResultSetUtils. rsu.current.setLoaderText = setLoaderText; - const isDataChanged = ()=>{ - return Boolean(_.size(dataChangeStore.updated) || _.size(dataChangeStore.added) || _.size(dataChangeStore.deleted)); - }; + const isDataChangedRef = useRef(false); + useEffect(()=>{ + isDataChangedRef.current = Boolean(_.size(dataChangeStore.updated) || _.size(dataChangeStore.added) || _.size(dataChangeStore.deleted)); + }, [dataChangeStore]); const fireRowsColsCellChanged = ()=>{ eventBus.fireEvent(QUERY_TOOL_EVENTS.SELECTED_ROWS_COLS_CELL_CHANGED, selectedRows.size, selectedColumns.size, selectedRange.current, selectedCell.current?.length); @@ -948,7 +950,7 @@ export function ResultSet() { }); }; - if(isDataChanged() && !refreshData) { + if(isDataChangedRef.current && !refreshData) { queryToolCtx.modal.confirm( gettext('Unsaved changes'), gettext('The data has been modified, but not saved. Are you sure you wish to discard the changes?'), @@ -1093,6 +1095,7 @@ export function ResultSet() { setLoaderText(gettext('Fetching rows...')); try { res = await rsu.current.getWindowRows(fromRownum, toRownum); + resetSelectionAndChanges(); const newRows = rsu.current.processRows(res.data.data.result, columns); setRows([...newRows]); setQueryData((prev)=>({ @@ -1119,18 +1122,33 @@ export function ResultSet() { useEffect(()=>{ let deregExecEnd; const deregFetch = eventBus.registerListener(QUERY_TOOL_EVENTS.FETCH_WINDOW, (...args)=>{ - if(pageDataDirty.current) { - deregExecEnd = eventBus.registerListener(QUERY_TOOL_EVENTS.EXECUTION_END, (success)=>{ - if(!success) return; - pageDataDirty.current = false; + const impl = ()=> { + if(pageDataOutOfSync.current) { + deregExecEnd = eventBus.registerListener(QUERY_TOOL_EVENTS.EXECUTION_END, (success)=>{ + if(!success) return; + pageDataOutOfSync.current = false; + fetchWindow(...args); + }, true); + eventBus.fireEvent(QUERY_TOOL_EVENTS.EXECUTION_START, rsu.current.query, {refreshData: true}); + // executionStartCallback(rsu.current.query, {refreshData: true}); + } else { + pageDataOutOfSync.current = false; fetchWindow(...args); - }, true); - executionStartCallback(rsu.current.query, {refreshData: true}); + } + }; + + if(isDataChangedRef.current) { + queryToolCtx.modal.confirm( + gettext('Unsaved changes'), + gettext('The data has been modified, but not saved. Are you sure you wish to discard the changes?'), + impl, + function() { + /* Do nothing */ + } + ); } else { - pageDataDirty.current = false; - fetchWindow(...args); + impl(); } - resetSelectionAndChanges(); }); return ()=>{ deregFetch(); @@ -1144,7 +1162,7 @@ export function ResultSet() { const warnSaveDataClose = ()=>{ // No changes. - if(!isDataChanged() || !queryToolCtx.preferences?.sqleditor.prompt_save_data_changes) { + if(!isDataChangedRef.current || !queryToolCtx.preferences?.sqleditor.prompt_save_data_changes) { eventBus.fireEvent(QUERY_TOOL_EVENTS.WARN_SAVE_TEXT_CLOSE); return; } @@ -1172,7 +1190,7 @@ export function ResultSet() { }; }, [dataChangeStore]); - const triggerSaveData = async ()=>{ + const triggerSaveData = useLatestFunc(async ()=>{ if(!_.size(dataChangeStore.updated) && !_.size(dataChangeStore.added) && !_.size(dataChangeStore.deleted)) { return; } @@ -1210,7 +1228,7 @@ export function ResultSet() { } catch {/* History errors should not bother others */} if(!respData.data.status) { - pageDataDirty.current = false; + pageDataOutOfSync.current = false; eventBus.fireEvent(QUERY_TOOL_EVENTS.SET_MESSAGE, respData.data.result); pgAdmin.Browser.notifier.error(respData.data.result, 20000); // If the transaction is not idle, notify the user that previous queries are not rolled back, @@ -1223,7 +1241,7 @@ export function ResultSet() { return; } - pageDataDirty.current = true; + pageDataOutOfSync.current = true; if(_.size(dataChangeStore.added)) { // Update the rows in a grid after addition respData.data.query_results.forEach((qr)=>{ @@ -1258,18 +1276,19 @@ export function ResultSet() { resetSelectionAndChanges(); eventBus.fireEvent(QUERY_TOOL_EVENTS.SET_CONNECTION_STATUS, respData.data.transaction_status); eventBus.fireEvent(QUERY_TOOL_EVENTS.SET_MESSAGE, ''); + setLoaderText(null); pgAdmin.Browser.notifier.success(gettext('Data saved successfully.')); if(respData.data.transaction_status > CONNECTION_STATUS.TRANSACTION_STATUS_IDLE) { pgAdmin.Browser.notifier.info(gettext('Auto-commit is off. You still need to commit changes to the database.')); } } catch (error) { - pageDataDirty.current = false; + pageDataOutOfSync.current = false; eventBus.fireEvent(QUERY_TOOL_EVENTS.HANDLE_API_ERROR, error, { checkTransaction: true, }); + setLoaderText(null); } - setLoaderText(null); - }; + }); useEffect(()=>{ eventBus.registerListener(QUERY_TOOL_EVENTS.TRIGGER_SAVE_DATA, triggerSaveData); diff --git a/web/pgadmin/utils/driver/psycopg3/server_manager.py b/web/pgadmin/utils/driver/psycopg3/server_manager.py index 6952d7a2c6d..76cee8b8446 100644 --- a/web/pgadmin/utils/driver/psycopg3/server_manager.py +++ b/web/pgadmin/utils/driver/psycopg3/server_manager.py @@ -690,7 +690,8 @@ def create_connection_string(self, database, user, password=None): if key == 'hostaddr' and self.use_ssh_tunnel: continue - # Convert boolean connection parameters to integer for libpq compatibility + # Convert boolean connection parameters to integer for + # libpq compatibility if key in ('sslcompression', 'sslsni'): value = 1 if value else 0