From 58fcbd943a277793bd0170f3b005e666881a7142 Mon Sep 17 00:00:00 2001 From: Ashesh Vashi Date: Fri, 15 Apr 2016 16:14:01 +0530 Subject: [PATCH] Deleting the object (model & nested model/collection) during showing the node properties. --- web/pgadmin/browser/static/js/datamodel.js | 44 +++++++++++++++++++ .../templates/browser/js/collection.js | 10 +++-- .../browser/templates/browser/js/node.js | 15 ++++++- web/pgadmin/static/js/backform.pgadmin.js | 17 +++++++ 4 files changed, 81 insertions(+), 5 deletions(-) diff --git a/web/pgadmin/browser/static/js/datamodel.js b/web/pgadmin/browser/static/js/datamodel.js index b28e0412b..6eb3ae5a9 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 fb1dd424b..cb9b65047 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 54ddfb8ce..a38bda279 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; @@ -1143,6 +1143,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 2f5ac157e..580573c35 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); } });