Commit 9316a9d1 authored by Romain Courteaud's avatar Romain Courteaud

[erp5_web_renderjs_ui] Disable the dialog as soon as it is submitted.

This will prevent double concurrent submit.
Mutex can not be used, as it will block the update rendering.

Disable the dialog until the event listener is actived.
parent 2b7ac6c9
...@@ -13,9 +13,9 @@ ...@@ -13,9 +13,9 @@
<script id="dialog-button-template" type="text/x-handlebars-template"> <script id="dialog-button-template" type="text/x-handlebars-template">
{{#if show_update_button}} {{#if show_update_button}}
<button name="action_update" type="submit" data-i18n="Update">Update</button> <button disabled name="action_update" type="submit" data-i18n="Update">Update</button>
{{/if}} {{/if}}
<input name="action_confirm" class="dialogconfirm" data-theme="b" data-inline="true" type="submit" data-i18n="[value]Proceed" value="Proceed" data-icon="check" /> <input disabled name="action_confirm" class="dialogconfirm" data-theme="b" data-inline="true" type="submit" data-i18n="[value]Proceed" value="Proceed" data-icon="check" />
<a class="dialogcancel" data-i18n="Cancel">Cancel</a> <a class="dialogcancel" data-i18n="Cancel">Cancel</a>
</script> </script>
......
...@@ -220,7 +220,7 @@ ...@@ -220,7 +220,7 @@
</item> </item>
<item> <item>
<key> <string>actor</string> </key> <key> <string>actor</string> </key>
<value> <string>superkato</string> </value> <value> <string>zope</string> </value>
</item> </item>
<item> <item>
<key> <string>comment</string> </key> <key> <string>comment</string> </key>
...@@ -234,7 +234,7 @@ ...@@ -234,7 +234,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>965.12118.35525.1655</string> </value> <value> <string>967.55044.25804.33536</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -252,7 +252,7 @@ ...@@ -252,7 +252,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1524057259.75</float> <float>1527506690.43</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -3,9 +3,39 @@ ...@@ -3,9 +3,39 @@
(function (window, rJS, RSVP, calculatePageTitle, Handlebars, ensureArray) { (function (window, rJS, RSVP, calculatePageTitle, Handlebars, ensureArray) {
"use strict"; "use strict";
function submitDialog(gadget, is_updating) { function checkValidity() {
return this.getDeclaredGadget("erp5_form")
.push(function (declared_gadget) {
return declared_gadget.checkValidity();
});
}
function getContent() {
return this.getDeclaredGadget("erp5_form")
.push(function (sub_gadget) {
return sub_gadget.getContent();
});
}
function submitDialog(is_updating) {
var gadget = this,
button_container =
gadget.element.querySelector('.dialog_button_container'),
update_button = button_container.querySelector('button'),
submit_input = button_container.querySelector('input');
submit_input.disabled = true;
if (update_button !== null) {
update_button.disabled = true;
}
function enableButton() {
submit_input.disabled = false;
if (update_button !== null) {
update_button.disabled = false;
}
}
return gadget.getContent() return getContent.apply(this)
.push(function (content_dict) { .push(function (content_dict) {
var data = {}, var data = {},
key; key;
...@@ -80,6 +110,13 @@ ...@@ -80,6 +110,13 @@
// do not mingle with editable because it isn't necessary // do not mingle with editable because it isn't necessary
} }
}); });
})
.push(function (result) {
enableButton();
return result;
}, function (error) {
enableButton();
throw error;
}); });
// We do not handle submit failures because Page Form handles them well // We do not handle submit failures because Page Form handles them well
// If any error bubbles here we do not know what to do with it anyway // If any error bubbles here we do not know what to do with it anyway
...@@ -112,19 +149,9 @@ ...@@ -112,19 +149,9 @@
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Proxy methods to the child gadget // Proxy methods to the child gadget
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
.declareMethod('checkValidity', function checkValidity() { .declareMethod('checkValidity', checkValidity, {mutex: 'changestate'})
return this.getDeclaredGadget("erp5_form")
.push(function (declared_gadget) {
return declared_gadget.checkValidity();
});
}, {mutex: 'changestate'})
.declareMethod('getContent', function getContent() { .declareMethod('getContent', getContent, {mutex: 'changestate'})
return this.getDeclaredGadget("erp5_form")
.push(function (sub_gadget) {
return sub_gadget.getContent();
});
}, {mutex: 'changestate'})
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// declared methods // declared methods
...@@ -155,6 +182,8 @@ ...@@ -155,6 +182,8 @@
}); });
}) })
// .declareMethod('submitDialog', submitDialog, {mutex: 'changestate'})
.onStateChange(function onStateChange(modification_dict) { .onStateChange(function onStateChange(modification_dict) {
var form_gadget = this, var form_gadget = this,
selector = form_gadget.element.querySelector("h3"), selector = form_gadget.element.querySelector("h3"),
...@@ -255,20 +284,34 @@ ...@@ -255,20 +284,34 @@
.onEvent('submit', function submit() { .onEvent('submit', function submit() {
if (this.state.has_update_action === true) { if (this.state.has_update_action === true) {
// default action on submit is update in case of its existence // default action on submit is update in case of its existence
return submitDialog(this, true); return submitDialog.apply(this, [true]);
} }
return submitDialog(this, false); return submitDialog.apply(this, [false]);
}, false, true) }, false, true)
.onEvent('click', function click(evt) { .onEvent('click', function click(evt) {
if (evt.target.name === "action_confirm") { if (evt.target.name === "action_confirm") {
evt.preventDefault(); evt.preventDefault();
return submitDialog(this, false); return submitDialog.apply(this, [false]);
} }
if (evt.target.name === "action_update") { if (evt.target.name === "action_update") {
evt.preventDefault(); evt.preventDefault();
return submitDialog(this, true); return submitDialog.apply(this, [true]);
}
}, false, false)
.declareService(function enableButton() {
// click event listener is now activated
// Change the state of the gadget
var gadget = this,
button_container =
gadget.element.querySelector('.dialog_button_container'),
update_button = button_container.querySelector('button'),
submit_input = button_container.querySelector('input');
submit_input.disabled = false;
if (update_button !== null) {
update_button.disabled = false;
} }
}, false, false); });
}(window, rJS, RSVP, calculatePageTitle, Handlebars, ensureArray)); }(window, rJS, RSVP, calculatePageTitle, Handlebars, ensureArray));
...@@ -224,7 +224,7 @@ ...@@ -224,7 +224,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>967.24634.17714.15001</string> </value> <value> <string>967.55054.64073.15854</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -242,7 +242,7 @@ ...@@ -242,7 +242,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1526654351.56</float> <float>1527506827.94</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment