summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorSimon Lejeune <sle@openerp.com>2016-10-12 22:04:43 +0200
committerSimon Lejeune <sle@openerp.com>2016-10-13 15:51:09 +0200
commit5abe76c2d27a6ab07eebb382205c841acf32c551 (patch)
tree689bdbe0e67c15df2df47faf651f7b85364aa243 /addons/web/static/src
parentcfe0dc6d3442f31ffb1638595daf330dc225b34c (diff)
[FIX] web: clear_uncommitted_changes on browser's back button
This is done by guarding the `on_hashchange` evant handler with the `clear_uncommitted_changes` function. Note that the url has already changed when we are in this handler, so we make sure to restore the old url when the user chose to continue its edition.
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/web_client.js36
1 files changed, 24 insertions, 12 deletions
diff --git a/addons/web/static/src/js/web_client.js b/addons/web/static/src/js/web_client.js
index 48216f9c0a3..5498e0a7474 100644
--- a/addons/web/static/src/js/web_client.js
+++ b/addons/web/static/src/js/web_client.js
@@ -285,20 +285,32 @@ var WebClient = Widget.extend({
}
},
on_hashchange: function(event) {
+ if (this._ignore_hashchange) {
+ this._ignore_hashchange = false;
+ return;
+ }
+
var self = this;
- var stringstate = event.getState(false);
- if (!_.isEqual(this._current_state, stringstate)) {
- var state = event.getState(true);
- if(!state.action && state.menu_id) {
- self.menu.is_bound.done(function() {
- self.menu.menu_click(state.menu_id);
- });
- } else {
- state._push_me = false; // no need to push state back...
- this.action_manager.do_load_state(state, !!this._current_state);
+ this.clear_uncommitted_changes().then(function () {
+ var stringstate = event.getState(false);
+ if (!_.isEqual(self._current_state, stringstate)) {
+ var state = event.getState(true);
+ if(!state.action && state.menu_id) {
+ self.menu.is_bound.done(function() {
+ self.menu.menu_click(state.menu_id);
+ });
+ } else {
+ state._push_me = false; // no need to push state back...
+ self.action_manager.do_load_state(state, !!self._current_state);
+ }
}
- }
- this._current_state = stringstate;
+ self._current_state = stringstate;
+ }, function () {
+ if (event) {
+ self._ignore_hashchange = true;
+ window.location = event.originalEvent.oldURL;
+ }
+ });
},
do_push_state: function(state) {
this.set_title(state.title);