[WIP] better url management, only views are allowed to call this.do_push_state
authorChristophe Simonis <chs@openerp.com>
Wed, 14 Dec 2011 16:09:58 +0000 (17:09 +0100)
committerAntony Lesuisse <al@openerp.com>
Wed, 14 Dec 2011 16:09:58 +0000 (17:09 +0100)
bzr revid: chs@openerp.com-20111214160958-xrtdubgh6jqn3mq3

addons/web/static/src/js/chrome.js
addons/web/static/src/js/view_form.js
addons/web/static/src/js/views.js

index 8c8c3b5..4b41d3a 100644 (file)
@@ -1061,7 +1061,6 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
         if(this.action_manager)
             this.action_manager.stop();
         this.action_manager = new openerp.web.ActionManager(this);
-        this.action_manager.do_push_state.add(this.do_push_state);
         this.action_manager.appendTo($("#oe_app"));
 
         if (openerp._modules_loaded) { // TODO: find better option than this
@@ -1076,7 +1075,7 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
     },
     on_logged_out: function() {
         $(window).unbind('hashchange', this.on_hashchange);
-        this.do_push_state({},true);
+        this.do_push_state({});
         if(this.action_manager)
             this.action_manager.stop();
         this.action_manager = null;
@@ -1098,11 +1097,8 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
         }
         this._current_state = state;
     },
-    do_push_state: function(state, overwrite) {
-        if (!overwrite) {
-            var hash = $.deparam.fragment(true);
-            state = _.extend({}, hash, state);
-        }
+    do_push_state: function(state) {
+        console.log('dopushstate', state);
         var url = '#' + $.param(state);
         this._current_state = _.clone(state);
         $.bbq.pushState(url);
index 0ac70e6..b961b00 100644 (file)
@@ -175,6 +175,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
             if (self.default_focus_field && !self.embedded_view) {
                 self.default_focus_field.focus();
             }
+            if (record.id) {
+                self.do_push_state({id:record.id});
+            }
         });
     },
     on_form_changed: function() {
index fcc8a4c..af0f0f4 100644 (file)
@@ -20,6 +20,7 @@ session.web.ActionManager = session.web.Widget.extend({
     identifier_prefix: "actionmanager",
     init: function(parent) {
         this._super(parent);
+        this.action = null;
         this.inner_viewmanager = null;
         this.dialog = null;
         this.dialog_viewmanager = null;
@@ -47,7 +48,15 @@ session.web.ActionManager = session.web.Widget.extend({
         }
     },
 
-    do_push_state: function(state, overwrite) {
+    do_push_state: function(state) {
+        if (this.wiget_parent && this.widget_parent.do_push_state) {
+            if (this.action.id) {
+                state = _.extend({}, state || {}, {
+                    action_id: this.action.id,
+                });
+            }
+            this.widget_parent.do_push_state(state);
+        }
     },
 
     do_load_state: function(state) {
@@ -95,6 +104,7 @@ session.web.ActionManager = session.web.Widget.extend({
             console.error("Action manager can't handle action of type " + action.type, action);
             return;
         }
+        this.action = action;
         return this[type](action, on_close);
     },
     null_action: function() {
@@ -128,10 +138,6 @@ session.web.ActionManager = session.web.Widget.extend({
             this.content_stop();
             this.inner_action = action;
             this.inner_viewmanager = new session.web.ViewManagerAction(this, action);
-            this.inner_viewmanager.do_push_state.add(function(state,overwrite) {
-                state['action_id'] = action.id;
-                self.do_push_state(state,true);
-            });
             this.inner_viewmanager.appendTo(this.$element);
         }
     },
@@ -154,10 +160,6 @@ session.web.ActionManager = session.web.Widget.extend({
         this.content_stop();
         var ClientWidget = session.web.client_actions.get_object(action.tag);
         (this.client_widget = new ClientWidget(this, action.params)).appendTo(this);
-
-        var client_action = {tag: action.tag};
-        if (action.params) _.extend(client_action, {params: action.params});
-        this.do_push_state({client_action: client_action}, true);
     },
     ir_actions_report_xml: function(action, on_closed) {
         var self = this;
@@ -466,12 +468,6 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
 
         var main_view_loaded = this._super();
 
-        _.each(_.keys(this.views), function(view_type) {
-            $.when(self.views[view_type].deferred).done(function(view_type) {
-                self.views[view_type].controller.do_push_state.add(self.do_push_state);
-            });
-        });
-
         var manager_ready = $.when(searchview_loaded, main_view_loaded);
 
         this.$element.find('.oe_debug_view').change(this.on_debug_changed);
@@ -584,12 +580,16 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
             } else {
                 $search_prefix.remove();
             }
-
-            self.do_push_state({view_type: self.active_view});
         });
     },
 
-    do_push_state: function(state, overwrite) {
+    do_push_state: function(state) {
+        if (this.wiget_parent && this.widget_parent.do_push_state) {
+            state = _.extend({}, state || {}, {
+                view_type: this.active_view
+            });
+            this.widget_parent.do_push_state(state);
+        }
     },
 
     do_load_state: function(state) {
@@ -1146,11 +1146,12 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
         return $.Deferred().resolve({}).promise();
     },
 
-    do_push_state: function(state, overwrite) {
+    do_push_state: function(state) {
+        if (this.wiget_parent && this.widget_parent.do_push_state) {
+            this.widget_parent.do_push_state(state);
+        }
     },
 
-    do_load_state: function(state) {
-    }
 });
 
 session.web.json_node_to_xml = function(node, human_readable, indent) {