[imp] disable buttons in form views during the execution of its action

bzr revid: nicolas.vanhoren@openerp.com-20110930161506-bbffc4gjdt43pbvn
This commit is contained in:
niv-openerp 2011-09-30 18:15:06 +02:00
parent c3d08fa5dd
commit ea79880c3c
2 changed files with 32 additions and 14 deletions

View File

@ -862,6 +862,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
template: 'WidgetButton', template: 'WidgetButton',
init: function(view, node) { init: function(view, node) {
this._super(view, node); this._super(view, node);
this.force_disabled = false;
if (this.string) { if (this.string) {
// We don't have button key bindings in the webclient // We don't have button key bindings in the webclient
this.string = this.string.replace(/_/g, ''); this.string = this.string.replace(/_/g, '');
@ -876,43 +877,60 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
this.$element.find("button").click(this.on_click); this.$element.find("button").click(this.on_click);
}, },
on_click: function() { on_click: function() {
var self = this;
this.force_disabled = true;
this.check_disable();
this.execute_action().always(function() {
self.force_disabled = false;
self.check_disable();
});
},
execute_action: function() {
var self = this; var self = this;
var exec_action = function() { var exec_action = function() {
if (self.node.attrs.confirm) { if (self.node.attrs.confirm) {
var def = $.Deferred();
var dialog = $('<div>' + self.node.attrs.confirm + '</div>').dialog({ var dialog = $('<div>' + self.node.attrs.confirm + '</div>').dialog({
title: 'Confirm', title: 'Confirm',
modal: true, modal: true,
buttons: { buttons: {
Ok: function() { Ok: function() {
self.on_confirmed(); self.on_confirmed().then(function() {
def.resolve();
});
$(self).dialog("close"); $(self).dialog("close");
}, },
Cancel: function() { Cancel: function() {
def.resolve();
$(self).dialog("close"); $(self).dialog("close");
} }
} }
}); });
return def.promise();
} else { } else {
self.on_confirmed(); return self.on_confirmed();
} }
}; };
if ((!this.node.attrs.special && this.view.dirty_for_user) || !this.view.datarecord.id) { if ((!this.node.attrs.special && this.view.dirty_for_user) || !this.view.datarecord.id) {
this.view.recursive_save().then(exec_action); return this.view.recursive_save().pipe(exec_action);
} else { } else {
exec_action(); return exec_action();
} }
}, },
on_confirmed: function() { on_confirmed: function() {
var self = this; var self = this;
this.view.do_execute_action( return this.view.do_execute_action(
this.node.attrs, this.view.dataset, this.view.datarecord.id, function () { this.node.attrs, this.view.dataset, this.view.datarecord.id, function () {
self.view.reload(); self.view.reload();
}); });
}, },
update_dom: function() { update_dom: function() {
this._super(); this._super();
if (!this.view.is_interactible_record()) { this.check_disable();
},
check_disable: function() {
if (this.force_disabled || !this.view.is_interactible_record()) {
this.$element.find("button").attr("disabled", "disabled"); this.$element.find("button").attr("disabled", "disabled");
this.$element.find("button").css("color", "grey"); this.$element.find("button").css("color", "grey");
} else { } else {

View File

@ -86,7 +86,7 @@ db.web.ActionManager = db.web.Widget.extend({
console.log("Action manager can't handle action of type " + action.type, action); console.log("Action manager can't handle action of type " + action.type, action);
return; return;
} }
this[type](action, on_close); return this[type](action, on_close);
}, },
ir_actions_act_window: function (action, on_close) { ir_actions_act_window: function (action, on_close) {
if (action.target === 'new') { if (action.target === 'new') {
@ -470,7 +470,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View
* Intercept do_action resolution from children views * Intercept do_action resolution from children views
*/ */
on_action_executed: function () { on_action_executed: function () {
new db.web.DataSet(this, 'res.log') return new db.web.DataSet(this, 'res.log')
.call('get', [], this.do_display_log); .call('get', [], this.do_display_log);
}, },
/** /**
@ -770,31 +770,31 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
var self = this; var self = this;
var result_handler = function () { var result_handler = function () {
if (on_closed) { on_closed.apply(null, arguments); } if (on_closed) { on_closed.apply(null, arguments); }
self.widget_parent.on_action_executed.apply(null, arguments); return self.widget_parent.on_action_executed.apply(null, arguments);
}; };
var handler = function (r) { var handler = function (r) {
var action = r.result; var action = r.result;
if (action && action.constructor == Object) { if (action && action.constructor == Object) {
self.rpc('/web/session/eval_domain_and_context', { return self.rpc('/web/session/eval_domain_and_context', {
contexts: [dataset.get_context(), action.context || {}, { contexts: [dataset.get_context(), action.context || {}, {
active_id: record_id || false, active_id: record_id || false,
active_ids: [record_id || false], active_ids: [record_id || false],
active_model: dataset.model active_model: dataset.model
}], }],
domains: [] domains: []
}, function (results) { }).pipe(function (results) {
action.context = results.context action.context = results.context
self.do_action(action, result_handler); return self.do_action(action, result_handler);
}); });
} else { } else {
result_handler(); return result_handler();
} }
}; };
var context = new db.web.CompoundContext(dataset.get_context(), action_data.context || {}); var context = new db.web.CompoundContext(dataset.get_context(), action_data.context || {});
if (action_data.special) { if (action_data.special) {
handler({result: {"type":"ir.actions.act_window_close"}}); return handler({result: {"type":"ir.actions.act_window_close"}});
} else if (action_data.type=="object") { } else if (action_data.type=="object") {
return dataset.call_button(action_data.name, [[record_id], context], handler); return dataset.call_button(action_data.name, [[record_id], context], handler);
} else if (action_data.type=="action") { } else if (action_data.type=="action") {