diff --git a/web/pgadmin/browser/static/js/datamodel.js b/web/pgadmin/browser/static/js/datamodel.js index b28e041..6eb3ae5 100644 --- a/web/pgadmin/browser/static/js/datamodel.js +++ b/web/pgadmin/browser/static/js/datamodel.js @@ -199,6 +199,36 @@ function(_, pgAdmin, $, Backbone) { return self; }, + // Create a reset function, which allow us to remove the nested object. + reset: function() { + var obj; + for(id in this.objects) { + obj = this.get(id); + + if (obj) { + if (obj instanceof pgBrowser.DataModel) { + obj.reset(); + delete obj; + } else if (obj instanceof Backbone.Model) { + obj.clear({silent: true}); + delete obj; + } else if (obj instanceof pgBrowser.DataCollection) { + obj.reset({silent: true}); + delete obj; + } else if (obj instanceof Backbone.Collection) { + obj.each(function(m) { + if (m instanceof Bakbone.DataModel) { + obj.reset(); + obj.clear({silent: true}); + } + }); + Backbone.Collection.prototype.reset.apply(obj, {silent: true}); + delete obj; + } + } + } + this.clear({silent: true}); + }, sessChanged: function() { var self = this; @@ -755,6 +785,20 @@ function(_, pgAdmin, $, Backbone) { return (_.size(res) == 0 ? null : res); } }, + // Override the reset function, so that - we can reset the model + // properly. + reset: function(opts) { + this.each(function(m) { + if (!m) + return; + if (m instanceof pgBrowser.DataModel) { + m.reset(); + } else { + m.clear({silent: true}); + } + }); + Backbone.Collection.prototype.reset.apply(this, arguments); + }, objFindInSession: function(m, type) { var hasPrimaryKey = m.primary_key && typeof(m.primary_key) == 'function', diff --git a/web/pgadmin/browser/templates/browser/js/collection.js b/web/pgadmin/browser/templates/browser/js/collection.js index fb1dd42..cb9b650 100644 --- a/web/pgadmin/browser/templates/browser/js/collection.js +++ b/web/pgadmin/browser/templates/browser/js/collection.js @@ -67,16 +67,20 @@ function($, _, S, pgAdmin, Backbone, Alertify, Backform) { gridView = { 'remove': function() { if (this.grid) { + if (this.grid.collection) { + this.grid.collection.reset(null, {silent: true}); + delete (this.grid.collection); + } delete (this.grid); this.grid = null; } - } + }, + grid: grid }; - gridView.grid = grid; if (view) { // Release the view - view.remove(); + view.remove({data: true}); // Deallocate the view delete view; view = null; diff --git a/web/pgadmin/browser/templates/browser/js/node.js b/web/pgadmin/browser/templates/browser/js/node.js index 54ddfb8..9b43e4f 100644 --- a/web/pgadmin/browser/templates/browser/js/node.js +++ b/web/pgadmin/browser/templates/browser/js/node.js @@ -652,7 +652,7 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { // creating new view. if (view) { // Release the view - view.remove(); + view.remove({data: true}); // Deallocate the view delete view; view = null; @@ -773,7 +773,7 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { // creating the new view. if (view) { // Release the view - view.remove(); + view.remove({data: true}); // Deallocate the view delete view; view = null; @@ -907,8 +907,8 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { }.bind(panel), closePanel = function() { // Closing this panel - this.close() - }, + this.close(); + }.bind(panel), updateTreeItem = function() { var panel = this; @@ -940,9 +940,7 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { if (view.model.tnode && '_id' in view.model.tnode) { var d = _.extend({}, view.model.tnode), func = function(i) { - setTimeout(function() { - closePanel(); - }, 0); + setTimeout(function() {closePanel();}, 0); if (i) { tree.select(i, {focus: true}); } @@ -962,6 +960,11 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { itemData: d, success: function(i, o) { func(o.items.eq(0)); + }, + fail: function() { + // We still want to close the panel + console.log(arguments); + func(null); } }); return; @@ -1017,7 +1020,9 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { func(null); }, fail: function() { + // We would still like to close it. console.log(arguments); + func(null); } }); } @@ -1052,13 +1057,17 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { func(i); }, fail: function() { + // We would still like to close it. console.log(arguments); + func(null); } }); }, fail: function() { + // We would still like to close it. console.log(arguments); + func(null); } }); } @@ -1067,53 +1076,60 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { itemData: d, success: function(i, o) { func(i); + }, + fail: function() { + // We would still like to close it. + console.log(arguments); + func(null); } }); } } else { - /* - * Sometime we don't get node in response even though it's saved - * on server. In such case just reload the collection to get newly - * created nodes. - */ - - var children = tree.children(item, false, false), - openNode = function(item, animation){ - tree.open(item, { - success: function (item, options){ - setTimeout(function() { - closePanel(); - }, 0); - }, - fail: function (item, options){ - }, - unanimated: animation - }); - }; + /* + * Sometime we don't get node in response even though it's saved + * on server. In such case just reload the collection to get newly + * created nodes. + */ + + var children = tree.children(item, false, false), + openNode = function(item, animation){ + tree.open(item, { + success: function (item, options){ + setTimeout(function() {closePanel();}, 0); + }, + fail: function (item, options){ + setTimeout(function() {closePanel();}, 0); + }, + unanimated: animation + }); + }; if (children) { _.each(children, function(child) { - var $child = $(child); - var data = tree.itemData($child) - if (data._type == that.collection_type){ - // We found collection which need to reload. - if (tree.wasLoad($child)) { - tree.unload($child, { - success: function (item, options){ - openNode(item, true); - }, - fail: function (item, options){ - }, - unanimated: true - }); - } else { - openNode($child, false); - } + var $child = $(child), + data = tree.itemData($child); + if (data._type == that.collection_type){ + // We found collection which need to reload. + if (tree.wasLoad($child)) { + tree.unload($child, { + success: function (item, options){ + openNode(item, true); + }, + fail: function (item, options){ + setTimeout(function() {closePanel();}, 0); + }, + unanimated: true + }); + } else { + openNode($child, false); } + } }); + return; } + setTimeout(function() {closePanel();}, 0); } - }, + }.bind(panel), editInNewPanel = function() { // Open edit in separate panel setTimeout(function() { @@ -1123,14 +1139,14 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { }]); }, 0); }, - onCancelFunc = closePanel.bind(panel), + onCancelFunc = closePanel, onSaveFunc = updateTreeItem.bind(panel), onEdit = editFunc.bind(panel); if (action) { if (action == 'create'){ - onCancelFunc = closePanel.bind(panel); - onSaveFunc = saveNewNode.bind(panel); + onCancelFunc = closePanel; + onSaveFunc = saveNewNode; } if (action != 'properties') { // We need to keep track edit/create mode for this panel. @@ -1143,6 +1159,17 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) { properties(); onEdit = editInNewPanel.bind(panel); } + if (panel.closeable()) { + var onCloseFunc = function() { + var j = this.$container.find('.obj_properties').first(), + view = j && j.data('obj-view'); + + if (view) { + view.remove({data: true}); + } + }.bind(panel); + panel.on(wcDocker.EVENT.CLOSED, onCloseFunc); + } }, /********************************************************************** * Generate the URL for different operations diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js index 2f5ac15..580573c 100644 --- a/web/pgadmin/static/js/backform.pgadmin.js +++ b/web/pgadmin/static/js/backform.pgadmin.js @@ -594,6 +594,23 @@ } return this; + }, + remove: function(opts) { + if (opts && opts.data) { + if (this.model) { + if (this.model.reset) { + this.model.reset(); + } + this.model.clear({silent: true}); + delete (this.model); + } + if (this.errorModel) { + this.errorModel.clear({silent: true}); + delete (this.errorModel); + } + } + this.cleanup(); + Backform.Form.prototype.remove.apply(this, arguments); } });