mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 08:42:41 +01:00
Multiple comment submissions for a diff is prevented now.
Summary: It was possible to submit a comment multiple times if the submit button was pressed more than once quickly. Added javascript code that disables the button when it is clicked. Test Plan: Tried to click the button multiple times very quickly, but the button was disabled after the first click. Reviewed By: epriestley Reviewers: epriestley, jungejason Commenters: aran CC: aran, epriestley, tuomaspelkonen Differential Revision: 337
This commit is contained in:
parent
3dd12e7cc6
commit
d21a056f1c
4 changed files with 66 additions and 0 deletions
|
@ -284,6 +284,18 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/js/application/core/behavior-tokenizer.js',
|
'disk' => '/rsrc/js/application/core/behavior-tokenizer.js',
|
||||||
),
|
),
|
||||||
|
'javelin-behavior-aphront-form-disable-on-submit' =>
|
||||||
|
array(
|
||||||
|
'uri' => '/res/6c659ede/rsrc/js/application/core/behavior-form.js',
|
||||||
|
'type' => 'js',
|
||||||
|
'requires' =>
|
||||||
|
array(
|
||||||
|
0 => 'javelin-behavior',
|
||||||
|
1 => 'javelin-stratcom',
|
||||||
|
2 => 'javelin-dom',
|
||||||
|
),
|
||||||
|
'disk' => '/rsrc/js/application/core/behavior-form.js',
|
||||||
|
),
|
||||||
'javelin-behavior-dark-console' =>
|
'javelin-behavior-dark-console' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/044c171f/rsrc/js/application/core/behavior-dark-console.js',
|
'uri' => '/res/044c171f/rsrc/js/application/core/behavior-dark-console.js',
|
||||||
|
|
|
@ -64,6 +64,11 @@ final class AphrontFormView extends AphrontView {
|
||||||
|
|
||||||
public function render() {
|
public function render() {
|
||||||
require_celerity_resource('aphront-form-view-css');
|
require_celerity_resource('aphront-form-view-css');
|
||||||
|
|
||||||
|
Javelin::initBehavior(
|
||||||
|
'aphront-form-disable-on-submit',
|
||||||
|
array());
|
||||||
|
|
||||||
return javelin_render_tag(
|
return javelin_render_tag(
|
||||||
'form',
|
'form',
|
||||||
array(
|
array(
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
|
|
||||||
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
||||||
|
phutil_require_module('phabricator', 'infrastructure/javelin/api');
|
||||||
phutil_require_module('phabricator', 'infrastructure/javelin/markup');
|
phutil_require_module('phabricator', 'infrastructure/javelin/markup');
|
||||||
phutil_require_module('phabricator', 'view/base');
|
phutil_require_module('phabricator', 'view/base');
|
||||||
|
|
||||||
|
|
48
webroot/rsrc/js/application/core/behavior-form.js
Normal file
48
webroot/rsrc/js/application/core/behavior-form.js
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/**
|
||||||
|
* @requires javelin-behavior javelin-stratcom javelin-dom
|
||||||
|
* @provides javelin-behavior-aphront-form-disable-on-submit
|
||||||
|
*/
|
||||||
|
|
||||||
|
JX.behavior('aphront-form-disable-on-submit', function(config) {
|
||||||
|
|
||||||
|
var restore = [];
|
||||||
|
var root = null;
|
||||||
|
|
||||||
|
JX.Stratcom.listen('submit', 'tag:form', function(e) {
|
||||||
|
if (e.getNode('workflow')) {
|
||||||
|
// Don't activate for forms with workflow, the workflow behavior will
|
||||||
|
// handle it.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
root = e.getNode('tag:form');
|
||||||
|
if (root._disabled) {
|
||||||
|
e.kill();
|
||||||
|
}
|
||||||
|
root._disabled = true;
|
||||||
|
var buttons = JX.DOM.scry(root, 'button');
|
||||||
|
for (var ii = 0; ii < buttons.length; ii++) {
|
||||||
|
if (!buttons[ii].disabled) {
|
||||||
|
buttons[ii].disabled = 'disabled';
|
||||||
|
JX.DOM.alterClass(buttons[ii], 'disabled', true);
|
||||||
|
restore.push(buttons[ii]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
JX.Stratcom.listen('unload', null, function(e) {
|
||||||
|
// Reenable everything on page unload so we don't bfcache back to a page
|
||||||
|
// that has disabled forms.
|
||||||
|
for (var ii = 0; ii < restore.length; ii++) {
|
||||||
|
restore[ii].disabled = '';
|
||||||
|
JX.DOM.alterClass(restore[ii], 'disabled', false);
|
||||||
|
root._disabled = false;
|
||||||
|
}
|
||||||
|
if (root) {
|
||||||
|
delete root._disabled;
|
||||||
|
}
|
||||||
|
restore = [];
|
||||||
|
root = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in a new issue