Allow the dashboard panel to be closed. Fixes #2506

This commit is contained in:
Khushboo Vashi 2017-06-30 10:11:34 +01:00 committed by Dave Page
parent 2d65312910
commit 501120701e
8 changed files with 73 additions and 21 deletions

View File

@ -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,14 @@ function(_, pgAdmin) {
});
that.resizedContainer.apply(myPanel);
}
// Bind events only if they are configurable
if (that.canHide) {
_.each([wcDocker.EVENT.CLOSED, wcDocker.EVENT.VISIBILITY_CHANGED],
function(ev) {
myPanel.on(ev, that.handleVisibility.bind(myPanel, ev));
});
}
}
});
}
@ -134,7 +145,32 @@ function(_, pgAdmin) {
100
);
}
},
handleVisibility: function(eventName) {
// Currently this function only works with dashboard panel but
// as per need it can be extended
if (this._type != 'dashboard' || _.isUndefined(pgAdmin.Dashboard))
return;
if (eventName == 'panelClosed') {
pgBrowser.save_current_layout(pgBrowser);
pgAdmin.Dashboard.toggleVisibility(false);
}
else if (eventName == 'panelVisibilityChanged') {
if (pgBrowser.tree) {
pgBrowser.save_current_layout(pgBrowser);
var selectedNode = pgBrowser.tree.selected();
// Discontinue this event after first time visible
this.off(wcDocker.EVENT.VISIBILITY_CHANGED);
if (!_.isUndefined(pgAdmin.Dashboard))
pgAdmin.Dashboard.toggleVisibility(true);
// Explicitly trigger tree selected event when we add the tab.
pgBrowser.Events.trigger('pgadmin-browser:tree:selected', selectedNode,
pgBrowser.tree.itemData(selectedNode), pgBrowser.Node);
}
}
}
});
return pgAdmin.Browser.Panel;

View File

@ -178,7 +178,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 %}
},
@ -365,15 +367,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);
});
}
});
}

View File

@ -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):

View File

@ -11,6 +11,8 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
if (pgAdmin.Dashboard)
return;
var dashboardVisible = true;
pgAdmin.Dashboard = {
init: function() {
if (this.initialized)
@ -55,7 +57,7 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
// Handle treeview clicks
object_selected: function(item, itemData, node) {
if (itemData && itemData._type) {
if (itemData && itemData._type && dashboardVisible) {
var treeHierarchy = node.getTreeNodeHierarchy(item),
url = '{{ url_for('dashboard.index') }}',
sid = -1, did = -1, b = pgAdmin.Browser,
@ -124,6 +126,9 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
// { data: [[0, y0], [1, y1]...], label: 'Label 3', [options] }
// ]
if (!dashboardVisible)
return;
y = 0;
if (dataset.length == 0) {
if (counter == true)
@ -862,6 +867,9 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
}
});
},
toggleVisibility: function(flag) {
dashboardVisible = flag;
}
};

View File

@ -379,7 +379,7 @@ define([
newWin.document.title = grid_title;
});
} else {
var dashboardPanel = pgBrowser.docker.findPanels('dashboard');
var dashboardPanel = pgBrowser.docker.findPanels('properites');
var dataGridPanel = pgBrowser.docker.addPanel('frm_datagrid', wcDocker.DOCK.STACKED, dashboardPanel[0]);
// Set panel title and icon
@ -495,7 +495,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');
var queryToolPanel = pgBrowser.docker.addPanel('frm_datagrid', wcDocker.DOCK.STACKED, dashboardPanel[0]);
// Set panel title and icon

View File

@ -256,7 +256,7 @@ define([
// Create the debugger panel as per the data received from user input dialog.
var dashboardPanel = pgBrowser.docker.findPanels(
'dashboard'
'properties'
),
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
@ -353,7 +353,7 @@ define([
// Create the debugger panel as per the data received from user input dialog.
var dashboardPanel = pgBrowser.docker.findPanels(
'dashboard'
'properties'
),
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]

View File

@ -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]
);

View File

@ -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