[imp] simplified WebClient
authorniv-openerp <nicolas.vanhoren@openerp.com>
Wed, 4 Jan 2012 18:11:50 +0000 (19:11 +0100)
committerniv-openerp <nicolas.vanhoren@openerp.com>
Wed, 4 Jan 2012 18:11:50 +0000 (19:11 +0100)
bzr revid: nicolas.vanhoren@openerp.com-20120104181150-0zm2b3m6e89yb2zp

addons/web/static/src/js/chrome.js
addons/web/static/src/js/core.js

index 4189569..54718a5 100644 (file)
@@ -226,8 +226,20 @@ openerp.web.Loading = openerp.web.Widget.extend(/** @lends openerp.web.Loading#
         this._super(parent);
         this.count = 0;
         this.blocked_ui = false;
-        this.session.on_rpc_request.add_first(this.on_rpc_event, 1);
-        this.session.on_rpc_response.add_last(this.on_rpc_event, -1);
+        var self = this;
+        this.request_call = function() {
+            self.on_rpc_event(1);
+        };
+        this.response_call = function() {
+            self.on_rpc_event(-1);
+        };
+        this.session.on_rpc_request.add_first(this.request_call);
+        this.session.on_rpc_response.add_last(this.response_call);
+    },
+    stop: function() {
+        this.session.on_rpc_request.remove(this.request_call);
+        this.session.on_rpc_response.remove(this.response_call);
+        this._super();
     },
     on_rpc_event : function(increment) {
         var self = this;
@@ -1056,31 +1068,12 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
                 });
             }
             
-            self.crashmanager =  new openerp.web.CrashManager();
-            self.notification = new openerp.web.Notification(self);
-            self.notification.appendTo(self.$element);
-            self.loading = new openerp.web.Loading(self);
-            self.loading.appendTo(self.$element);
-            
             if (!self.session.session_is_valid()) {
-                self.login = new openerp.web.Login(self);
-                self.login.appendTo(self.$element);
+                self.show_login();
             }
         });
         this.session.ready.then(function() {
-            if (self.login) {
-                self.login.stop();
-                self.login = undefined;
-            }
-            self.$table = $(QWeb.render("Interface", {}));
-            self.$element.append(self.$table);
-            self.header = new openerp.web.Header(self);
-            self.header.on_logout.add(self.on_logout);
-            self.header.on_action.add(self.on_menu_action);
-            self.header.appendTo($("#oe_header"));
-            self.menu = new openerp.web.Menu(self, "oe_menu", "oe_secondary_menu");
-            self.menu.on_action.add(self.on_menu_action);
-            self.menu.start();
+            self.show_application();
             
             self.header.do_update();
             self.menu.do_reload();
@@ -1095,6 +1088,40 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
             }
         });
     },
+    show_login: function() {
+        var self = this;
+        this.destroy_content();
+        this.show_common();
+        self.login = new openerp.web.Login(self);
+        self.login.appendTo(self.$element);
+    },
+    show_application: function() {
+        var self = this;
+        this.destroy_content();
+        this.show_common();
+        self.$table = $(QWeb.render("Interface", {}));
+        self.$element.append(self.$table);
+        self.header = new openerp.web.Header(self);
+        self.header.on_logout.add(self.on_logout);
+        self.header.on_action.add(self.on_menu_action);
+        self.header.appendTo($("#oe_header"));
+        self.menu = new openerp.web.Menu(self, "oe_menu", "oe_secondary_menu");
+        self.menu.on_action.add(self.on_menu_action);
+        self.menu.start();
+    },
+    show_common: function() {
+        var self = this;
+        self.crashmanager =  new openerp.web.CrashManager();
+        self.notification = new openerp.web.Notification(self);
+        self.notification.appendTo(self.$element);
+        self.loading = new openerp.web.Loading(self);
+        self.loading.appendTo(self.$element);
+    },
+    destroy_content: function() {
+        _.each(_.clone(this.widget_children), function(el) {
+            el.stop();
+        });
+    },
     do_reload: function() {
         return this.session.session_init().pipe(_.bind(function() {this.menu.do_reload();}, this));
     },
@@ -1111,22 +1138,7 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
         this.header.do_update();
         $(window).unbind('hashchange', this.on_hashchange);
         this.do_push_state({});
-        if(this.action_manager) {
-            this.action_manager.stop();
-            this.action_manager = undefined;
-        }
-        if (this.menu) {
-            this.menu.stop();
-            this.menu = undefined;
-        }
-        if (this.header) {
-            this.header.stop();
-            this.header = undefined;
-        }
-        if (this.$table) {
-            this.$table.remove();
-            this.$table = undefined;
-        }
+        this.show_login();
         window.location.reload();
     },
     bind_hashchange: function() {
index 24f1a95..e59c6d4 100644 (file)
@@ -160,6 +160,12 @@ openerp.web.callback = function(obj, method) {
             position: "last"
         });
     };
+    callback.remove = function(f) {
+        callback.callback_chain = _.difference(callback.callback_chain, _.filter(callback.callback_chain, function(el) {
+            return el.callback === f;
+        }));
+        return callback;
+    };
 
     return callback.add({
         callback: method,