# HG changeset patch # User Cédric Krier 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); + } } });