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

Reply via email to