[IMP] web,mail: use of Modals to confirm changes discard

instead of the browser confirm dialogs, for the sake of uniformity.
This commit is contained in:
Aaron Bohy
2015-07-01 11:36:32 +02:00
parent 3a511aaa70
commit b601ec66ca
5 changed files with 107 additions and 70 deletions
+20 -8
View File
@@ -4,6 +4,7 @@ odoo.define('mail.mail', function (require) {
var mail_utils = require('mail.utils');
var core = require('web.core');
var data = require('web.data');
var Dialog = require('web.Dialog');
var form_common = require('web.form_common');
var session = require('web.session');
var SystrayMenu = require('web.SystrayMenu');
@@ -1047,14 +1048,25 @@ var ComposeMessage = Attachment.extend ({
this.view = parent.view;
this.session = session;
core.bus.on('clear_uncommitted_changes', this, function (e) {
if (this.show_composer && !e.isDefaultPrevented()) {
if (!confirm(_t("You are currently composing a message, your message will be discarded.\n\nAre you sure you want to leave this page ?"))) {
e.preventDefault();
}
else {
this.on_cancel();
}
core.bus.on('clear_uncommitted_changes', this, function (chain_callbacks) {
if (this.show_composer) {
chain_callbacks(function() {
var def = $.Deferred();
var message = _t("You are currently composing a message, your message will be discarded. Are you sure you want to leave this page ?");
var options = {
title: _t("Warning"),
confirm_callback: function() {
def.resolve();
},
cancel_callback: function() {
def.reject();
},
};
Dialog.confirm(this, message, options);
return def;
});
} else {
this.on_cancel();
}
});
},
+23 -18
View File
@@ -267,21 +267,22 @@ var ActionManager = Widget.extend({
return $.Deferred().reject();
},
select_action: function(action, index) {
if (this.webclient.has_uncommitted_changes()) {
var self = this;
return this.webclient.clear_uncommitted_changes().then(function() {
// Set the new inner_widget and clear the action_stack
self.inner_widget = action.widget;
var action_index = self.action_stack.indexOf(action);
self.clear_action_stack(self.action_stack.splice(action_index + 1));
// Hide the ControlPanel if the widget doesn't use it
if (!self.inner_widget.need_control_panel) {
self.main_control_panel.do_hide();
}
return action.restore(index);
}).fail(function() {
return $.Deferred().reject();
}
// Set the new inner_widget and clear the action_stack
this.inner_widget = action.widget;
var action_index = this.action_stack.indexOf(action);
this.clear_action_stack(this.action_stack.splice(action_index + 1));
// Hide the ControlPanel if the widget doesn't use it
if (!this.inner_widget.need_control_panel) {
this.main_control_panel.do_hide();
}
return action.restore(index);
});
},
clear_action_stack: function(action_stack) {
_.map(action_stack || this.action_stack, function(action) {
@@ -580,11 +581,15 @@ var ActionManager = Widget.extend({
return this.dialog_widget.appendTo(this.dialog.$el);
}
if (this.inner_widget && this.webclient.has_uncommitted_changes()) {
// Clear uncommitted changes on the current inner widget if there is one
var self = this;
var def = (this.inner_widget && this.webclient.clear_uncommitted_changes()) || $.when();
return def.then(function() {
self.dialog_stop(executor.action);
return self.push_action(executor.widget(), executor.action, options);
}).fail(function() {
return $.Deferred().reject();
}
this.dialog_stop(executor.action);
return this.push_action(executor.widget(), executor.action, options);
});
},
ir_actions_act_window: function (action, options) {
var self = this;
+46 -28
View File
@@ -89,10 +89,17 @@ var FormView = View.extend(common.FieldManagerMixin, {
self.on("change:actual_mode", self, self.do_update_pager);
});
self.on("load_record", self, self.load_record);
core.bus.on('clear_uncommitted_changes', this, function(e) {
if (!this.can_be_discarded()) {
e.preventDefault();
}
core.bus.on('clear_uncommitted_changes', this, function(chain_callbacks) {
var self = this;
chain_callbacks(function() {
var def = $.Deferred();
self.can_be_discarded().then(function() {
def.resolve();
}).fail(function() {
def.reject();
});
return def;
});
});
},
view_loading: function(r) {
@@ -402,26 +409,25 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.$el.addClass('oe_form_dirty');
},
execute_pager_action: function(action) {
if (this.can_be_discarded()) {
var self = this;
return this.can_be_discarded().then(function() {
switch (action) {
case 'first':
this.dataset.index = 0;
self.dataset.index = 0;
break;
case 'previous':
this.dataset.previous();
self.dataset.previous();
break;
case 'next':
this.dataset.next();
self.dataset.next();
break;
case 'last':
this.dataset.index = this.dataset.ids.length - 1;
self.dataset.index = self.dataset.ids.length - 1;
break;
}
var def = this.reload();
this.trigger('pager_action_executed');
return def;
}
return $.when();
self.trigger('pager_action_executed');
return self.reload();
});
},
do_update_pager: function(hide_index) {
if (this.$pager) {
@@ -727,16 +733,16 @@ var FormView = View.extend(common.FieldManagerMixin, {
},
on_button_cancel: function(event) {
var self = this;
if (this.can_be_discarded()) {
if (this.get('actual_mode') === 'create') {
this.trigger('history_back');
this.can_be_discarded().then(function() {
if (self.get('actual_mode') === 'create') {
self.trigger('history_back');
} else {
this.to_view_mode();
$.when.apply(null, this.render_value_defs).then(function(){
self.to_view_mode();
$.when.apply(null, self.render_value_defs).then(function(){
self.trigger('load_record', self.datarecord);
});
}
}
});
this.trigger('on_button_cancel');
return false;
},
@@ -744,9 +750,9 @@ var FormView = View.extend(common.FieldManagerMixin, {
var self = this;
this.to_edit_mode();
return $.when(this.has_been_loaded).then(function() {
if (self.can_be_discarded()) {
return self.can_be_discarded().then(function() {
return self.load_defaults();
}
});
});
},
on_button_edit: function() {
@@ -787,13 +793,25 @@ var FormView = View.extend(common.FieldManagerMixin, {
return def.promise();
},
can_be_discarded: function() {
if (this.$el.is('.oe_form_dirty')) {
if (!confirm(_t("Warning, the record has been modified, your changes will be discarded.\n\nAre you sure you want to leave this page ?"))) {
return false;
}
this.$el.removeClass('oe_form_dirty');
if (!this.$el.is('.oe_form_dirty')) {
return $.Deferred().resolve();
}
return true;
var self = this;
var def = $.Deferred();
var message = _t("The record has been modified, your changes will be discarded. Are you sure you want to leave this page ?");
var options = {
title: _t("Warning"),
confirm_callback: function() {
self.$el.removeClass('oe_form_dirty');
def.resolve();
},
cancel_callback: function() {
def.reject();
},
};
Dialog.confirm(this, message, options);
return def;
},
/**
* Triggers saving the form's record. Chooses between creating a new
+14 -12
View File
@@ -5,6 +5,7 @@ var ActionManager = require('web.ActionManager');
var core = require('web.core');
var crash_manager = require('web.crash_manager');
var data = require('web.data');
var framework = require('web.framework');
var Loading = require('web.Loading');
var Menu = require('web.Menu');
var Model = require('web.Model');
@@ -100,12 +101,11 @@ var WebClient = Widget.extend({
this.set_content_full_screen(full_screen);
});
},
on_logo_click: function(ev){
if (!this.has_uncommitted_changes()) {
return;
} else {
ev.preventDefault();
}
on_logo_click: function(ev) {
ev.preventDefault();
return this.clear_uncommitted_changes().then(function() {
framework.redirect("/web" + (core.debug ? "?debug" : ""));
});
},
show_common: function() {
var self = this;
@@ -133,10 +133,12 @@ var WebClient = Widget.extend({
toggle_bars: function(value) {
this.$('tr:has(td.navbar),.oe_leftbar').toggle(value);
},
has_uncommitted_changes: function() {
var $e = $.Event('clear_uncommitted_changes');
core.bus.trigger('clear_uncommitted_changes', $e);
return $e.isDefaultPrevented();
clear_uncommitted_changes: function() {
var def = $.Deferred().resolve();
core.bus.trigger('clear_uncommitted_changes', function chain_callbacks(callback) {
def = def.then(callback);
});
return def;
},
/**
Sets the first part of the title of the window, dedicated to the current action.
@@ -258,9 +260,9 @@ var WebClient = Widget.extend({
},
on_logout: function() {
var self = this;
if (!this.has_uncommitted_changes()) {
this.clear_uncommitted_changes().then(function() {
self.action_manager.do_action('logout');
}
});
},
bind_hashchange: function() {
var self = this;
@@ -63,15 +63,15 @@ var SystrayMenu = Widget.extend({
},
on_menu_settings: function() {
var self = this;
if (!this.getParent().has_uncommitted_changes()) {
this.getParent().clear_uncommitted_changes().then(function() {
self.rpc("/web/action/load", { action_id: "base.action_res_users_my" }).done(function(result) {
result.res_id = session.uid;
self.getParent().action_manager.do_action(result);
});
}
});
},
on_menu_account: function() {
if (!this.getParent().has_uncommitted_changes()) {
this.getParent().clear_uncommitted_changes().then(function() {
var P = new Model('ir.config_parameter');
P.call('get_param', ['database.uuid']).then(function(dbuuid) {
var state = {
@@ -89,7 +89,7 @@ var SystrayMenu = Widget.extend({
ev.preventDefault();
framework.redirect('https://accounts.odoo.com/account');
});
}
});
},
on_menu_about: function() {
var self = this;