From 0ebf78ca61a7a274137eed644c4ed840a2d6dc47 Mon Sep 17 00:00:00 2001 From: Anil Sahoo Date: Thu, 10 Jul 2025 15:37:31 +0530 Subject: [PATCH] Fixed an issue in the Search Objects tool where selecting a node occasionally selected an incorrect node. #8675 --- web/pgadmin/browser/static/js/node.js | 24 +++++++++++++++++-- .../components/PgTree/FileTreeItem/index.tsx | 5 ++-- web/pgadmin/static/js/tree/tree.js | 3 +++ .../static/js/SearchObjects.jsx | 1 + 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/web/pgadmin/browser/static/js/node.js b/web/pgadmin/browser/static/js/node.js index e99c072b1..50306eec2 100644 --- a/web/pgadmin/browser/static/js/node.js +++ b/web/pgadmin/browser/static/js/node.js @@ -729,9 +729,19 @@ define('pgadmin.browser.node', [ _item.clear_cache.apply(_item); }, 0); } - pgBrowser.Events.trigger('pgadmin:browser:tree:expand-from-previous-tree-state', - item); pgBrowser.Node.callbacks.change_server_background(item, data); + // Suppress added tree event being called during object search operations + // where tree.select clashes due to previous tree state restore + const suppressPath = pgBrowser.tree.suppressEventsForPath; + if (suppressPath) { + if (item.path === suppressPath) { + pgBrowser.tree.suppressEventsForPath = null; + } else { + return; + } + } + + pgBrowser.Events.trigger('pgadmin:browser:tree:expand-from-previous-tree-state', item); }, // Callback called - when a node is selected in browser tree. selected: function(item, data) { @@ -777,6 +787,16 @@ define('pgadmin.browser.node', [ opened: function(item) { let tree = pgBrowser.tree, auto_expand = usePreferences.getState().getPreferences('browser', 'auto_expand_sole_children'); + // Suppress opened tree event being called during object search operations + // where tree.select clashes due to only child of parent opens automatically. + const suppressPath = pgBrowser.tree.suppressEventsForPath; + if (suppressPath) { + if (item.path === suppressPath) { + pgBrowser.tree.suppressEventsForPath = null; + } else { + return; + } + } if (auto_expand?.value && tree.children(item).length == 1) { // Automatically expand the child node, if a treeview node has only a single child. diff --git a/web/pgadmin/static/js/components/PgTree/FileTreeItem/index.tsx b/web/pgadmin/static/js/components/PgTree/FileTreeItem/index.tsx index ea7b2fcc4..f906daddd 100644 --- a/web/pgadmin/static/js/components/PgTree/FileTreeItem/index.tsx +++ b/web/pgadmin/static/js/components/PgTree/FileTreeItem/index.tsx @@ -130,11 +130,10 @@ export class FileTreeItem extends React.Component => { - + private readonly setFileLoaded = async (FileOrDir): Promise => { this.props.changeDirectoryCount(FileOrDir.parent); if(FileOrDir._loaded !== true) { this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'added', FileOrDir); diff --git a/web/pgadmin/static/js/tree/tree.js b/web/pgadmin/static/js/tree/tree.js index 0ee340feb..b18290268 100644 --- a/web/pgadmin/static/js/tree/tree.js +++ b/web/pgadmin/static/js/tree/tree.js @@ -84,6 +84,9 @@ export class Tree { this.rootNode = manageTree.tempTree; this.Nodes = pgBrowser ? pgBrowser.Nodes : pgAdmin.Browser.Nodes; + // Flag to suppress added and opened tree event being called during object search operations, + // tree.select of search object clashes with other tree.select. + this.suppressEventsForPath = null; this.draggableTypes = {}; } diff --git a/web/pgadmin/tools/search_objects/static/js/SearchObjects.jsx b/web/pgadmin/tools/search_objects/static/js/SearchObjects.jsx index ae5713f38..5b44a9b5d 100644 --- a/web/pgadmin/tools/search_objects/static/js/SearchObjects.jsx +++ b/web/pgadmin/tools/search_objects/static/js/SearchObjects.jsx @@ -313,6 +313,7 @@ export default function SearchObjects({nodeData}) { return false; } + tree.suppressEventsForPath = '/browser/' + rowData.id_path.join('/'); setLoaderText(gettext('Locating...')); tree.findNodeWithToggle(rowData.id_path) .then((treeItem)=>{