Hi, Please find the attached patch for the feature #2506: Allow the dashboard panel to be closed.
Thanks, Khushboo
diff --git a/web/pgadmin/browser/static/js/panel.js b/web/pgadmin/browser/static/js/panel.js index 71d2c68..bfa2e32 100644 --- a/web/pgadmin/browser/static/js/panel.js +++ b/web/pgadmin/browser/static/js/panel.js @@ -7,7 +7,8 @@ function(_, pgAdmin) { pgAdmin.Browser.Panel = function(options) { var defaults = [ 'name', 'title', 'width', 'height', 'showTitle', 'isCloseable', - 'isPrivate', 'content', 'icon', 'events', 'onCreate', 'elContainer' + 'isPrivate', 'content', 'icon', 'events', 'onCreate', 'elContainer', + 'canHide', 'limit' ]; _.extend(this, _.pick(options, defaults)); } @@ -25,12 +26,14 @@ function(_, pgAdmin) { panel: null, onCreate: null, elContainer: false, + limit: null, load: function(docker, title) { var that = this; if (!that.panel) { docker.registerPanelType(that.name, { title: that.title, isPrivate: that.isPrivate, + limit: that.limit, onCreate: function(myPanel) { $(myPanel).data('pgAdminName', that.name); myPanel.initSize(that.width, that.height); @@ -85,6 +88,25 @@ function(_, pgAdmin) { }); that.resizedContainer.apply(myPanel); } + + // Bind events only if they are configurable + if (that.canHide) { + myPanel.on(wcDocker.EVENT.CLOSED, function() { + pgBrowser.save_current_layout(pgBrowser); + }); + myPanel.on(wcDocker.EVENT.VISIBILITY_CHANGED, function() { + if (pgBrowser.tree) { + pgBrowser.save_current_layout(pgBrowser); + var selectedNode = pgBrowser.tree.selected(); + // Discontinue this event after first time visible + myPanel.off(wcDocker.EVENT.VISIBILITY_CHANGED); + // Explicitly trigger tree selected event when we add the tab. + pgBrowser.Events.trigger('pgadmin-browser:tree:selected', selectedNode, + pgBrowser.tree.itemData(selectedNode), pgBrowser.Node); + } + + }); + } } }); } diff --git a/web/pgadmin/browser/templates/browser/js/browser.js b/web/pgadmin/browser/templates/browser/js/browser.js index 4494e7a..4588128 100644 --- a/web/pgadmin/browser/templates/browser/js/browser.js +++ b/web/pgadmin/browser/templates/browser/js/browser.js @@ -177,7 +177,9 @@ define( showTitle: {% if panel_item.showTitle %}true{% else %}false{% endif %}, isCloseable: {% if panel_item.isCloseable %}true{% else %}false{% endif %}, isPrivate: {% if panel_item.isPrivate %}true{% else %}false{% endif %}, - content: '{{ panel_item.content }}'{% if panel_item.events is not none %}, + content: '{{ panel_item.content }}', + canHide: {% if panel_item.canHide %}true{% else %}false{% endif %}{% if panel_item.limit is not none %}, + limit: {{ panel_item.limit }}{% endif %}{% if panel_item.events is not none %}, events: {{ panel_item.events }} {% endif %} }){% endif %}{% endfor %} }, @@ -364,15 +366,17 @@ define( // Listen to panel attach/detach event so that last layout will be remembered _.each(obj.panels, function(panel, name) { - panel.panel.on(wcDocker.EVENT.ATTACHED, function() { - obj.save_current_layout(obj); - }); - panel.panel.on(wcDocker.EVENT.DETACHED, function() { - obj.save_current_layout(obj); - }); - panel.panel.on(wcDocker.EVENT.MOVE_ENDED, function() { - obj.save_current_layout(obj); - }); + if (panel.panel) { + panel.panel.on(wcDocker.EVENT.ATTACHED, function() { + obj.save_current_layout(obj); + }); + panel.panel.on(wcDocker.EVENT.DETACHED, function() { + obj.save_current_layout(obj); + }); + panel.panel.on(wcDocker.EVENT.MOVE_ENDED, function() { + obj.save_current_layout(obj); + }); + } }); } diff --git a/web/pgadmin/dashboard/__init__.py b/web/pgadmin/dashboard/__init__.py index a95ba53..8f813d7 100644 --- a/web/pgadmin/dashboard/__init__.py +++ b/web/pgadmin/dashboard/__init__.py @@ -58,9 +58,11 @@ class DashboardModule(PgAdminModule): title=gettext('Dashboard'), icon='fa fa-tachometer', content='', - isCloseable=False, - isPrivate=True, - isIframe=False) + isCloseable=True, + isPrivate=False, + limit=1, + isIframe=False, + canHide=True) ] def register_preferences(self): diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js b/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js index 7c48ea5..f6efce7 100644 --- a/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js +++ b/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js @@ -360,7 +360,7 @@ define([ newWin.document.title = grid_title; }); } else { - var dashboardPanel = pgBrowser.docker.findPanels('dashboard'); + var dashboardPanel = pgBrowser.docker.findPanels('properties'); dataGridPanel = pgBrowser.docker.addPanel('frm_datagrid', wcDocker.DOCK.STACKED, dashboardPanel[0]); dataGridPanel.title('<span title="'+grid_title+'">'+grid_title+'</span>'); dataGridPanel.icon('fa fa-bolt'); @@ -462,7 +462,7 @@ define([ /* On successfully initialization find the dashboard panel, * create new panel and add it to the dashboard panel. */ - var dashboardPanel = pgBrowser.docker.findPanels('dashboard'); + var dashboardPanel = pgBrowser.docker.findPanels('properties'); queryToolPanel = pgBrowser.docker.addPanel('frm_datagrid', wcDocker.DOCK.STACKED, dashboardPanel[0]); queryToolPanel.title('<span title="'+panel_title+'">'+panel_title+'</span>'); queryToolPanel.icon('fa fa-bolt'); diff --git a/web/pgadmin/tools/debugger/templates/debugger/js/debugger_ui.js b/web/pgadmin/tools/debugger/templates/debugger/js/debugger_ui.js index cfbba13..a692ae8 100644 --- a/web/pgadmin/tools/debugger/templates/debugger/js/debugger_ui.js +++ b/web/pgadmin/tools/debugger/templates/debugger/js/debugger_ui.js @@ -562,7 +562,7 @@ define([ }); // Create the debugger panel as per the data received from user input dialog. - var dashboardPanel = pgBrowser.docker.findPanels('dashboard'), + var dashboardPanel = pgBrowser.docker.findPanels('properties'), panel = pgBrowser.docker.addPanel( 'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0] ); diff --git a/web/pgadmin/utils/menu.py b/web/pgadmin/utils/menu.py index 66cb994..a426007 100644 --- a/web/pgadmin/utils/menu.py +++ b/web/pgadmin/utils/menu.py @@ -18,7 +18,7 @@ class MenuItem(object): class Panel(object): def __init__(self, name, title, content='', width=500, height=600, isIframe=True, showTitle=True, isCloseable=True, isPrivate=False, priority=None, - icon=None, data=None, events=None): + icon=None, data=None, events=None, limit=None, canHide=False): self.name = name self.title = title self.content = content @@ -31,6 +31,8 @@ class Panel(object): self.icon = icon self.data = data self.events = events + self.limit = limit + self.canHide = canHide if priority is None: global PRIORITY PRIORITY += 100