X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=js%2FCommon.js;h=47c6e48b18e095dd3950eaa92d0d0e7e034f8ca0;hb=f86965934c7d4bbd2953e72abcd2be6e6b095bf7;hp=1dee5a526a7798292b3c9968c26ea618d98c299f;hpb=2918a67d3bde046b49ef6073e97de1132cca9bac;p=civicrm-core.git diff --git a/js/Common.js b/js/Common.js index 1dee5a526a..47c6e48b18 100644 --- a/js/Common.js +++ b/js/Common.js @@ -144,17 +144,11 @@ function showHideByValue(trigger_field_id, trigger_value, target_element_id, tar } } +var submitcount = 0; /** - * Function to change button text and disable one it is clicked + * Old submit-once function. Will be removed soon. * @deprecated - * @param obj object - the button clicked - * @param formID string - the id of the form being submitted - * @param string procText - button text after user clicks it - * @return bool */ -var submitcount = 0; -/* Changes button label on submit, and disables button after submit for newer browsers. - Puts up alert for older browsers. */ function submitOnce(obj, formId, procText) { // if named button clicked, change text if (obj.value != null) { @@ -860,6 +854,41 @@ if (!CRM.vars) CRM.vars = {}; }); }; + // Submit-once + var submitted = [], + submitButton; + function submitOnceForm(e) { + if (e.isDefaultPrevented()) { + return; + } + if (_.contains(submitted, e.target)) { + return false; + } + submitted.push(e.target); + // Spin submit button icon + if (submitButton && $(submitButton, e.target).length) { + // Dialog button + if ($(e.target).closest('.ui-dialog .crm-ajax-container')) { + var identifier = $(submitButton).attr('name') || $(submitButton).attr('href'); + if (identifier) { + submitButton = $(e.target).closest('.ui-dialog').find('button[data-identifier="' + identifier + '"]')[0] || submitButton; + } + } + var $icon = $(submitButton).siblings('.crm-i').add('.crm-i, .ui-icon', submitButton); + $icon.data('origClass', $icon.attr('class')).removeClass().addClass('crm-i crm-submit-icon fa-spinner fa-pulse'); + } + } + + // If form fails validation, restore button icon and reset the submitted array + function submitFormInvalid(form) { + submitted = []; + $('.crm-i.crm-submit-icon').each(function() { + if ($(this).data('origClass')) { + $(this).removeClass().addClass($(this).data('origClass')); + } + }); + } + // Initialize widgets $(document) .on('crmLoad', function(e) { @@ -879,6 +908,7 @@ if (!CRM.vars) CRM.vars = {}; } }) .find('input.select-row:checked').parents('tr').addClass('crm-row-selected'); + $('.crm-sortable-list', e.target).sortable(); $('table.crm-sortable', e.target).DataTable(); $('table.crm-ajax-table', e.target).each(function() { var @@ -924,6 +954,13 @@ if (!CRM.vars) CRM.vars = {}; CRM.wysiwyg.create(this); } }); + // Submit once handlers + $('form[data-submit-once]', e.target) + .submit(submitOnceForm) + .on('invalid-form', submitFormInvalid); + $('form[data-submit-once] input[type=submit]', e.target).click(function(e) { + submitButton = e.target; + }); }) .on('dialogopen', function(e) { var $el = $(e.target); @@ -1561,6 +1598,25 @@ if (!CRM.vars) CRM.vars = {}; return (yiq >= 128) ? 'black' : 'white'; }; + // based on https://github.com/janl/mustache.js/blob/master/mustache.js + // If you feel the need to use this function, consider whether assembling HTML + // via DOM might be a cleaner approach rather than using string concatenation. + CRM.utils.escapeHtml = function(string) { + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + return String(string).replace(/[&<>"'`=\/]/g, function fromEntityMap (s) { + return entityMap[s]; + }); + } + // CVE-2015-9251 - Prevent auto-execution of scripts when no explicit dataType was provided $.ajaxPrefilter(function(s) { if (s.crossDomain) {