diff --git a/web/pgadmin/browser/templates/browser/js/browser.js b/web/pgadmin/browser/templates/browser/js/browser.js index a663ae8..d9a94f7 100644 --- a/web/pgadmin/browser/templates/browser/js/browser.js +++ b/web/pgadmin/browser/templates/browser/js/browser.js @@ -593,17 +593,77 @@ function(require, $, _, S, Bootstrap, pgAdmin, Alertify, CodeMirror) { single: single } }, + + // This will hold preference data (Works as a cache object) + // Here node will be a key and it's preference data will be value + node_preference_data: {}, + + // To check if node is visible in browser tree or not + is_node_visible: function(node_type) { + if(_.isUndefined(node_type) || _.isNull(node_type)) { + return true; + } + + // Target actual node instead of collection. + // If node is disabled then there is no meaning of + // adding collection node menu + if(S.startsWith(node_type, "coll-")) { + node_type = node_type.replace("coll-", "") + } + + // Exclude non-applicable nodes + var nodes_not_supported = [ + "server-group", "server", "catalog_object_column" + ]; + if(_.indexOf(nodes_not_supported, node_type) >= 0) { + return true; + } + + var perf; + // If we have already fetched preference earlier then pick + // it from our cache object + if (_.has(this.node_preference_data, node_type)) { + return this.node_preference_data[node_type].value + } + + perf = this.get_preference( + 'browser', 'show_node_' + node_type + ); + + // Save it for future use, kind of caching + if(!_.isUndefined(perf) && !_.isNull(perf)) { + this.node_preference_data[node_type] = perf; + return perf.value; + } else { + return true; + } + }, + // Add menus of module/extension at appropriate menu add_menus: function(menus) { - var pgMenu = this.menus; - var MenuItem = pgAdmin.Browser.MenuItem; + var self = this, + pgMenu = this.menus, + MenuItem = pgAdmin.Browser.MenuItem; _.each(menus, function(m) { _.each(m.applies, function(a) { /* We do support menu type only from this list */ if ($.inArray(a, [ - 'context', 'file', 'edit', 'object', - 'management', 'tools', 'help']) >= 0) { + 'context', 'file', 'edit', 'object', + 'management', 'tools', 'help']) >= 0) { var menus; + + // If current node is not visible in browser tree + // then return from here + if(!self.is_node_visible(m.node)) { + return; + } else if(_.has(m, 'module') && !_.isUndefined(m.module)) { + // If module to which this menu applies is not visible in + // browser tree then also we do not display menu + if(!self.is_node_visible(m.module.type)) { + return; + } + } + pgMenu[a] = pgMenu[a] || {}; if (_.isString(m.node)) { menus = pgMenu[a][m.node] = pgMenu[a][m.node] || {};