trytond-patches/issue17881002_1.diff

72 lines
2.3 KiB
Diff

# HG changeset patch
# User Cédric Krier <cedric.krier@b2ck.com>
Disable button during click processing
The click event must be blocked when the screen method is called to limit
double execution. A double execution is still possible if the execution of the
action, which is asynchronous, is not started fast enough.
issue5362
review17881002
Index: src/view/form.js
===================================================================
--- a/sao/src/view/form.js
+++ b/sao/src/view/form.js
@@ -361,7 +361,12 @@
},
button_clicked: function(event) {
var button = event.data;
- this.screen.button(button.attributes);
+ button.el.prop('disabled', true);
+ try {
+ this.screen.button(button.attributes);
+ } finally {
+ button.el.prop('disabled', false);
+ }
},
selected_records: function() {
if (this.screen.current_record) {
Index: src/view/tree.js
===================================================================
--- a/sao/src/view/tree.js
+++ b/sao/src/view/tree.js
@@ -1509,7 +1509,7 @@
},
render: function(record) {
var button = new Sao.common.Button(this.attributes);
- button.el.click(record, this.button_clicked.bind(this));
+ button.el.click([record, button], this.button_clicked.bind(this));
var fields = jQuery.map(this.screen.model.fields,
function(field, name) {
if ((field.description.loading || 'eager') ==
@@ -1526,7 +1526,8 @@
return button.el;
},
button_clicked: function(event) {
- var record = event.data;
+ var record = event.data[0];
+ var button = event.data[1];
if (record != this.screen.current_record) {
return;
}
@@ -1534,7 +1535,12 @@
if (states.invisible || states.readonly) {
return;
}
- this.screen.button(this.attributes);
+ button.el.prop('disabled', true);
+ try {
+ this.screen.button(this.attributes);
+ } finally {
+ button.el.prop('disabled', false);
+ }
}
});