diff --git a/web/pgadmin/browser/static/js/datamodel.js b/web/pgadmin/browser/static/js/datamodel.js
index bf6b7eca0..5567cf341 100644
--- a/web/pgadmin/browser/static/js/datamodel.js
+++ b/web/pgadmin/browser/static/js/datamodel.js
@@ -884,7 +884,9 @@ function(_, pgAdmin, $, Backbone) {
return true;
}
- })
+ });
+
+ pgBrowser.Events = _.extend({}, Backbone.Events);
return pgBrowser;
});
diff --git a/web/pgadmin/browser/static/js/frame.js b/web/pgadmin/browser/static/js/frame.js
index d5b7611f5..286edc851 100644
--- a/web/pgadmin/browser/static/js/frame.js
+++ b/web/pgadmin/browser/static/js/frame.js
@@ -2,7 +2,8 @@ define(
['underscore', 'pgadmin', 'wcdocker'],
function(_, pgAdmin) {
- pgAdmin.Browser = pgAdmin.Browser || {};
+ var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
+
pgAdmin.Browser.Frame = function(options) {
var defaults = [
'name', 'title', 'width', 'height', 'showTitle', 'isCloseable',
@@ -25,23 +26,61 @@ function(_, pgAdmin) {
var that = this;
if (!that.panel) {
docker.registerPanelType(this.name, {
- title: that.title,
- isPrivate: that.isPrivate,
- onCreate: function(myPanel) {
- myPanel.initSize(that.width, that.height);
- if (myPanel.showTitle == false)
- myPanle.title(false);
- myPanel.closeable(!!that.isCloseable);
+ title: that.title,
+ isPrivate: that.isPrivate,
+ onCreate: function(myPanel) {
+ $(myPanel).data('pgAdminName', that.name);
+ myPanel.initSize(that.width, that.height);
+ if (myPanel.showTitle == false)
+ myPanle.title(false);
+ myPanel.closeable(!!that.isCloseable);
- var $frameArea = $('
');
- myPanel.layout().addItem($frameArea);
- that.panel = myPanel;
- that.frame = new wcIFrame($frameArea, myPanel);
+ var $frameArea = $('
');
+ myPanel.layout().addItem($frameArea);
+ that.panel = myPanel;
+ var frame = new wcIFrame($frameArea, myPanel);
+ $(myPanel).data('embededFrame', that.frame);
- setTimeout(function() { that.frame.openURL(that.url); }, 500);
+ setTimeout(function() { frame.openURL(that.url); }, 500);
+
+ if (that.events && _.isObject(that.events)) {
+ _.each(that.events, function(v, k) {
+ if (v && _.isFunction(v)) {
+ myPanel.on(k, v);
+ }
+ });
+ }
+
+ _.each([
+ wcDocker.EVENT.UPDATED, wcDocker.EVENT.VISIBILITY_CHANGED,
+ wcDocker.EVENT.BEGIN_DOCK, wcDocker.EVENT.END_DOCK,
+ wcDocker.EVENT.GAIN_FOCUS, wcDocker.EVENT.LOST_FOCUS,
+ wcDocker.EVENT.CLOSED, wcDocker.EVENT.BUTTON,
+ wcDocker.EVENT.ATTACHED, wcDocker.EVENT.DETACHED,
+ wcDocker.EVENT.MOVE_STARTED, wcDocker.EVENT.MOVE_ENDED,
+ wcDocker.EVENT.MOVED, wcDocker.EVENT.RESIZE_STARTED,
+ wcDocker.EVENT.RESIZE_ENDED, wcDocker.EVENT.RESIZED,
+ wcDocker.EVENT.SCROLLED], function(ev) {
+ myPanel.on(ev, that.eventFunc.bind(myPanel, ev));
+ });
}
});
}
+ },
+ eventFunc: function(eventName) {
+ var name = $(this).data('pgAdminName');
+
+ try {
+ pgBrowser.Events.trigger('pgadmin-browser:frame', eventName, this, arguments);
+ pgBrowser.Events.trigger('pgadmin-browser:frame:' + eventName, this, arguments);
+
+ if (name) {
+ pgBrowser.Events.trigger('pgadmin-browser:frame-' + name, eventName, this, arguments);
+ pgBrowser.Events.trigger('pgadmin-browser:frame-' + name + ':' + eventName, this, arguments);
+ }
+ } catch (e) {
+ console.log(e);
+ }
}
});
diff --git a/web/pgadmin/browser/static/js/panel.js b/web/pgadmin/browser/static/js/panel.js
index 13a3b39f2..5324f5996 100644
--- a/web/pgadmin/browser/static/js/panel.js
+++ b/web/pgadmin/browser/static/js/panel.js
@@ -1,7 +1,9 @@
define(
['underscore', 'pgadmin', 'wcdocker'],
function(_, pgAdmin) {
- pgAdmin.Browser = pgAdmin.Browser || {};
+
+ var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
+
pgAdmin.Browser.Panel = function(options) {
var defaults = [
'name', 'title', 'width', 'height', 'showTitle', 'isCloseable',
@@ -26,6 +28,7 @@ function(_, pgAdmin) {
title: that.title,
isPrivate: that.isPrivate,
onCreate: function(myPanel) {
+ $(myPanel).data('pgAdminName', that.name);
myPanel.initSize(that.width, that.height);
if (!that.showTitle)
myPanel.title(false);
@@ -46,9 +49,36 @@ function(_, pgAdmin) {
}
});
}
+ _.each([
+ wcDocker.EVENT.UPDATED, wcDocker.EVENT.VISIBILITY_CHANGED,
+ wcDocker.EVENT.BEGIN_DOCK, wcDocker.EVENT.END_DOCK,
+ wcDocker.EVENT.GAIN_FOCUS, wcDocker.EVENT.LOST_FOCUS,
+ wcDocker.EVENT.CLOSED, wcDocker.EVENT.BUTTON,
+ wcDocker.EVENT.ATTACHED, wcDocker.EVENT.DETACHED,
+ wcDocker.EVENT.MOVE_STARTED, wcDocker.EVENT.MOVE_ENDED,
+ wcDocker.EVENT.MOVED, wcDocker.EVENT.RESIZE_STARTED,
+ wcDocker.EVENT.RESIZE_ENDED, wcDocker.EVENT.RESIZED,
+ wcDocker.EVENT.SCROLLED], function(ev) {
+ myPanel.on(ev, that.eventFunc.bind(myPanel, ev));
+ });
}
});
}
+ },
+ eventFunc: function(eventName) {
+ var name = $(this).data('pgAdminName');
+
+ try {
+ pgBrowser.Events.trigger('pgadmin-browser:panel', eventName, this, arguments);
+ pgBrowser.Events.trigger('pgadmin-browser:panel:' + eventName, this, arguments);
+
+ if (name) {
+ pgBrowser.Events.trigger('pgadmin-browser:panel-' + name, eventName, this, arguments);
+ pgBrowser.Events.trigger('pgadmin-browser:panel-' + name + ':' + eventName, this, arguments);
+ }
+ } catch (e) {
+ console.log(e);
+ }
}
});
diff --git a/web/pgadmin/browser/templates/browser/js/browser.js b/web/pgadmin/browser/templates/browser/js/browser.js
index 6de28e6e8..ccf3217f8 100644
--- a/web/pgadmin/browser/templates/browser/js/browser.js
+++ b/web/pgadmin/browser/templates/browser/js/browser.js
@@ -16,34 +16,8 @@ function(require, $, _, S, Bootstrap, pgAdmin, alertify, CodeMirror) {
pgAdmin.Browser = pgAdmin.Browser || {};
- // TODO:: Remove dmeo SQL (once completed)
- var demoSql = '-- DROP TABLE tickets_detail; \n\
-\n\
-CREATE TABLE tickets_detail \n\
-( \n\
- id serial NOT NULL, \n\
- ticket_id integer NOT NULL, \n\
- logger_id integer NOT NULL, \n\
- added timestamp with time zone NOT NULL, \n\
- detail text NOT NULL, \n\
- msgid character varying(100), \n\
- CONSTRAINT tickets_detail_pkey PRIMARY KEY (id), \n\
- CONSTRAINT ticket_id_refs_id_6b8dc130 FOREIGN KEY (ticket_id) \n\
- REFERENCES tickets_ticket (id) MATCH SIMPLE \n\
- ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED, \n\
- CONSTRAINT tickets_detail_logger_id_fkey FOREIGN KEY (logger_id) \n\
- REFERENCES auth_user (id) MATCH SIMPLE \n\
- ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED \n\
-) \n\
-WITH ( \n\
- OIDS=FALSE \n\
-); \n\
-ALTER TABLE tickets_detail \n\
-OWNER TO helpdesk;\n';
-
var panelEvents = {};
panelEvents[wcDocker.EVENT.VISIBILITY_CHANGED] = function() {
-
if (this.isVisible()) {
var obj = pgAdmin.Browser,
i = obj.tree ? obj.tree.selected() : undefined,
@@ -57,13 +31,6 @@ OWNER TO helpdesk;\n';
}
};
- var sqlPanelEvents = {};
- sqlPanelEvents[wcDocker.EVENT.VISIBILITY_CHANGED] = function() {
- /* Update the SQL editor to show the latest value all the time */
- if (this.isVisible()) {
- pgAdmin.Browser.editor.setValue($('#sql-textarea').val());
- }
- };
// Extend the browser class attributes
_.extend(pgAdmin.Browser, {
// The base url for browser
@@ -118,8 +85,7 @@ OWNER TO helpdesk;\n';
width: 500,
isCloseable: false,
isPrivate: true,
- content: '',
- events: sqlPanelEvents
+ content: ''
}),
// Dependencies of the object
'dependencies': new pgAdmin.Browser.Panel({
@@ -282,6 +248,11 @@ OWNER TO helpdesk;\n';
init: function() {
var obj=this;
+ if (obj.initialized) {
+ return;
+ }
+ obj.initialized = true;
+
// Store the main browser layout
$(window).bind('unload', function() {
if(obj.docker) {
@@ -340,8 +311,6 @@ OWNER TO helpdesk;\n';
mode: "text/x-sql",
readOnly: true
});
- // TODO:: Revove demoSql later
- $('#sql-textarea').val(demoSql);
// Initialise the treeview
$('#tree').aciTree({
@@ -485,8 +454,10 @@ OWNER TO helpdesk;\n';
break;
}
+ var node;
+
if (d && obj.Nodes[d._type]) {
- var node = obj.Nodes[d._type];
+ node = obj.Nodes[d._type];
/* If the node specific callback returns false, we will also return
* false for further processing.
@@ -507,6 +478,17 @@ OWNER TO helpdesk;\n';
console.log(e);
}
}
+
+ try {
+ obj.Events.trigger(
+ 'pgadmin-browser:tree', eventName, item, d
+ );
+ obj.Events.trigger(
+ 'pgadmin-browser:tree:' + eventName, item, d, node
+ );
+ } catch (e) {
+ console.log(e);
+ }
return true;
});
diff --git a/web/pgadmin/browser/templates/browser/js/node.js b/web/pgadmin/browser/templates/browser/js/node.js
index 380ba024e..bdda1ac5e 100644
--- a/web/pgadmin/browser/templates/browser/js/node.js
+++ b/web/pgadmin/browser/templates/browser/js/node.js
@@ -542,6 +542,8 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) {
// tab is active.)
}
}
+
+ return true;
},
refresh: function(i) {
var self = this,
diff --git a/web/pgadmin/misc/sql/__init__.py b/web/pgadmin/misc/sql/__init__.py
new file mode 100644
index 000000000..131a3669f
--- /dev/null
+++ b/web/pgadmin/misc/sql/__init__.py
@@ -0,0 +1,29 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""A blueprint module providing utility functions for the application."""
+
+import datetime
+from flask import session, current_app, url_for
+from pgadmin.utils import PgAdminModule
+import pgadmin.utils.driver as driver
+
+MODULE_NAME = 'sql'
+
+class SQLModule(PgAdminModule):
+
+ def get_own_javascripts(self):
+ return [{
+ 'name': 'pgadmin.browser.object_sql',
+ 'path': url_for('sql.static', filename='js/sql'),
+ 'when': None
+ }]
+
+# Initialise the module
+blueprint = SQLModule(MODULE_NAME, __name__, url_prefix='/misc/sql')
diff --git a/web/pgadmin/misc/sql/static/js/sql.js b/web/pgadmin/misc/sql/static/js/sql.js
new file mode 100644
index 000000000..2a5a92309
--- /dev/null
+++ b/web/pgadmin/misc/sql/static/js/sql.js
@@ -0,0 +1,85 @@
+define(
+ ['underscore', 'jquery', 'pgadmin.browser'],
+function(_, $, pgBrowser) {
+
+ pgBrowser.ShowNodeSQL = pgBrowser.ShowNodeSQL || {};
+
+ if (pgBrowser.ShowNodeSQL.initialized) {
+ return pgBrowser.ShowNodeSQL;
+ }
+
+ _.extend(pgBrowser.ShowNodeSQL, {
+ init: function() {
+ if (this.initialized) {
+ return;
+ }
+ this.initialized = true;
+ _.bindAll(this, 'showSQL', 'sqlPanelVisibilityChanged');
+
+ var sqlPanels = pgBrowser.docker.findPanels('sql');
+
+ // We will listend to the visibility change of the SQL panel
+ pgBrowser.Events.on('pgadmin-browser:panel-sql:' + wcDocker.EVENT.VISIBILITY_CHANGED, this.sqlPanelVisibilityChanged);
+
+ // Hmm.. Did we find the SQL panel, and is it visible (openned)?
+ // If that is the case - we need to listen the browser tree selection
+ // events.
+ if ((sqlPanels.length == 1 && sqlPanels[0].isVisible()) || sqlPanels.length != 1) {
+ pgBrowser.Events.on('pgadmin-browser:tree:selected', this.showSQL);
+ }
+ },
+ showSQL: function(item, data, node) {
+ /**
+ * We can't start fetching the SQL immediately, it is possible - the user
+ * is just using keyboards to select the node, and just traversing
+ * through. We will wait for some time before fetching the Reversed
+ * Engineering SQL.
+ **/
+ if (this.timeout) {
+ clearTimeout(this.timeout);
+ }
+ this.timeout = setTimeout(
+ function() {
+ var sql = '-- No object selected!';
+ if (node) {
+ sql = '-- No SQL generated for the selected object.';
+ if (node.hasSQL) {
+
+ sql = '-- Please wait while we fetch the SQL from the server.';
+ var url = node.generate_url(item, 'sql', data, true);
+
+ $.ajax({
+ url: url,
+ type:'GET',
+ success: function(res) {
+ pgAdmin.Browser.editor.setValue(res);
+ },
+ error: function() {
+ // TODO:: Report this
+ }
+ });
+ }
+ }
+ pgAdmin.Browser.editor.setValue(sql);
+ }, 400);
+ },
+ sqlPanelVisibilityChanged: function(panel) {
+ if (panel.isVisible()) {
+ var t = pgBrowser.tree,
+ i = t.selected(),
+ d = i && t.itemData(i),
+ n = i && d && pgBrowser.Nodes[d._type];
+
+ pgBrowser.ShowNodeSQL.showSQL.apply(pgBrowser.ShowNodeSQL, [i, d, n]);
+
+ // We will start listening the tree selection event.
+ pgBrowser.Events.on('pgadmin-browser:tree:selected', pgBrowser.ShowNodeSQL.showSQL);
+ } else {
+ // We don't need to listen the tree item selection event.
+ pgBrowser.Events.off('pgadmin-browser:tree:selected', pgBrowser.ShowNodeSQL.showSQL);
+ }
+ }
+ });
+
+ return pgBrowser.ShowNodeSQL;
+});