From 5abb748c3eb57b6c1d8184cf29562f5b0272ab6e Mon Sep 17 00:00:00 2001 From: Anil Sahoo <122535205+anilsahoo20@users.noreply.github.com> Date: Thu, 2 Mar 2023 11:02:15 +0530 Subject: [PATCH] Display the 'No menu available for this object' message if the selected tree node does not have any options. #5775 --- .../browser/static/js/MainMenuFactory.js | 14 +- web/pgadmin/browser/static/js/browser.js | 152 ++++++++++-------- web/pgadmin/static/js/tree/tree_init.tsx | 2 +- 3 files changed, 97 insertions(+), 71 deletions(-) diff --git a/web/pgadmin/browser/static/js/MainMenuFactory.js b/web/pgadmin/browser/static/js/MainMenuFactory.js index 7d26c1550..c85aebea7 100644 --- a/web/pgadmin/browser/static/js/MainMenuFactory.js +++ b/web/pgadmin/browser/static/js/MainMenuFactory.js @@ -113,4 +113,16 @@ export default class MainMenuFactory { Menu.sortMenus(menuList); return menuList; } -} + + static checkNoMenuOptionForNode(d){ + let selectedNodeFromNodes=pgAdmin.Browser.Nodes[d._type]; + let selectedNode=pgAdmin.Browser.tree.selected(); + let flag=!_.isUndefined(selectedNodeFromNodes.showMenu); + if(flag){ + var showMenu = selectedNodeFromNodes.showMenu(d, selectedNode); + return {flag:showMenu?false:flag,showMenu}; + } else{ + return {flag,showMenu:undefined}; + } + } +} \ No newline at end of file diff --git a/web/pgadmin/browser/static/js/browser.js b/web/pgadmin/browser/static/js/browser.js index 632c6cc0c..2c9fe87b0 100644 --- a/web/pgadmin/browser/static/js/browser.js +++ b/web/pgadmin/browser/static/js/browser.js @@ -378,77 +378,91 @@ define('pgadmin.browser', [ masterpass_callback_queue: [], getMenuList: function(name, item, d, skipDisabled=false) { let obj = this; - let category = { - 'common': [] - }; - const nodeTypeMenus = obj.all_menus_cache[name][d._type]; - for(let key of Object.keys(nodeTypeMenus)) { - let menuItem = nodeTypeMenus[key]; - let menuCategory = menuItem.category ?? 'common'; - category[menuCategory] = category[menuCategory] ?? []; - category[menuCategory].push(menuItem); - } - let menuItemList = []; - - for(let c in category) { - if((c in obj.menu_categories || category[c].length > 1) && c != 'common' ) { - let allMenuItemsDisabled = true; - category[c].forEach((mi)=> { - mi.checkAndSetDisabled(d, item); - if(allMenuItemsDisabled) { - allMenuItemsDisabled = mi.isDisabled; - } - }); - - const categoryMenuOptions = obj.menu_categories[c]; - let label = categoryMenuOptions?.label ?? c; - let priority = categoryMenuOptions?.priority ?? 10; - - if(categoryMenuOptions?.above) { - menuItemList.push(MainMenuFactory.getSeparator(label, priority)); - } - if(!allMenuItemsDisabled && skipDisabled) { - let _menuItem = MainMenuFactory.createMenuItem({ - name: c, - label: label, - module: c, - category: c, - menu_items: category[c], - priority: priority - }); - - menuItemList.push(_menuItem); - } else if(!skipDisabled){ - let _menuItem = MainMenuFactory.createMenuItem({ - name: c, - label: label, - module:c, - category: c, - menu_items: category[c], - priority: priority - }); - - menuItemList.push(_menuItem); - } - if(categoryMenuOptions?.below) { - menuItemList.push(MainMenuFactory.getSeparator(label, priority)); - } - } else { - category[c].forEach((c)=> { - c.checkAndSetDisabled(d, item); - }); - - category[c].forEach((m)=> { - if(!skipDisabled) { - menuItemList.push(m); - } else if(skipDisabled && !m.isDisabled){ - menuItemList.push(m); - } - }); + //This 'checkNoMenuOptionForNode' function will check if showMenu flag is present or not for selected node + let {flag,showMenu}=MainMenuFactory.checkNoMenuOptionForNode(d); + if(flag){ + if(showMenu===false){ + return [MainMenuFactory.createMenuItem({ + enable : false, + label: gettext('No menu available for this object.'), + name:'', + priority: 1, + category: 'create', + })]; } - } + }else{ + let category = { + 'common': [] + }; + const nodeTypeMenus = obj.all_menus_cache[name][d._type]; + for(let key of Object.keys(nodeTypeMenus)) { + let menuItem = nodeTypeMenus[key]; + let menuCategory = menuItem.category ?? 'common'; + category[menuCategory] = category[menuCategory] ?? []; + category[menuCategory].push(menuItem); + } + let menuItemList = []; - return menuItemList; + for(let c in category) { + if((c in obj.menu_categories || category[c].length > 1) && c != 'common' ) { + let allMenuItemsDisabled = true; + category[c].forEach((mi)=> { + mi.checkAndSetDisabled(d, item); + if(allMenuItemsDisabled) { + allMenuItemsDisabled = mi.isDisabled; + } + }); + + const categoryMenuOptions = obj.menu_categories[c]; + let label = categoryMenuOptions?.label ?? c; + let priority = categoryMenuOptions?.priority ?? 10; + + if(categoryMenuOptions?.above) { + menuItemList.push(MainMenuFactory.getSeparator(label, priority)); + } + if(!allMenuItemsDisabled && skipDisabled) { + let _menuItem = MainMenuFactory.createMenuItem({ + name: c, + label: label, + module: c, + category: c, + menu_items: category[c], + priority: priority + }); + + menuItemList.push(_menuItem); + } else if(!skipDisabled){ + let _menuItem = MainMenuFactory.createMenuItem({ + name: c, + label: label, + module:c, + category: c, + menu_items: category[c], + priority: priority + }); + + menuItemList.push(_menuItem); + } + if(categoryMenuOptions?.below) { + menuItemList.push(MainMenuFactory.getSeparator(label, priority)); + } + } else { + category[c].forEach((c)=> { + c.checkAndSetDisabled(d, item); + }); + + category[c].forEach((m)=> { + if(!skipDisabled) { + menuItemList.push(m); + } else if(skipDisabled && !m.isDisabled){ + menuItemList.push(m); + } + }); + } + } + + return menuItemList; + } }, // Enable/disable menu options enable_disable_menus: function(item) { diff --git a/web/pgadmin/static/js/tree/tree_init.tsx b/web/pgadmin/static/js/tree/tree_init.tsx index 69c31a29b..b12900aa7 100644 --- a/web/pgadmin/static/js/tree/tree_init.tsx +++ b/web/pgadmin/static/js/tree/tree_init.tsx @@ -108,7 +108,7 @@ function BrowserTree(props) { return ; } if(menuItem.isDisabled) { - return ; + return
{menuItem.label}
; } const hasCheck = typeof menuItem.checked == 'boolean';