75 lines
2.3 KiB
JavaScript
75 lines
2.3 KiB
JavaScript
/**
|
|
* @file
|
|
* JavaScript behaviors for computed elements.
|
|
*/
|
|
|
|
(function ($, Drupal, debounce) {
|
|
|
|
'use strict';
|
|
|
|
Drupal.webform = Drupal.webform || {};
|
|
Drupal.webform.computed = Drupal.webform.computed || {};
|
|
Drupal.webform.computed.delay = Drupal.webform.computed.delay || 500;
|
|
|
|
/**
|
|
* Initialize computed elements.
|
|
*
|
|
* @type {Drupal~behavior}
|
|
*/
|
|
Drupal.behaviors.webformComputed = {
|
|
attach: function (context) {
|
|
$(context).find('.js-webform-computed').once('webform-computed').each(function () {
|
|
// Get computed element and parent form.
|
|
var $element = $(this);
|
|
var $form = $element.closest('form');
|
|
|
|
// Get elements that are used by the computed element.
|
|
var elementKeys = $(this).data('webform-element-keys').split(',');
|
|
if (!elementKeys) {
|
|
return;
|
|
}
|
|
|
|
// Get computed element triggers.
|
|
var inputs = [];
|
|
$.each(elementKeys, function (i, key) {
|
|
// Exact input match.
|
|
inputs.push(':input[name="' + key + '"]');
|
|
// Sub inputs. (aka #tree)
|
|
inputs.push(':input[name^="' + key + '["]');
|
|
});
|
|
var $triggers = $form.find(inputs.join(','));
|
|
|
|
// Add event handler to computed element triggers.
|
|
$triggers.on('keyup change',
|
|
debounce(triggerUpdate, Drupal.webform.computed.delay));
|
|
|
|
// Initialize computed element update which refreshes the displayed
|
|
// value and accounts for any changes to the #default_value for a
|
|
// computed element.
|
|
triggerUpdate(true);
|
|
|
|
function triggerUpdate(initialize) {
|
|
// Prevent duplicate computations.
|
|
// @see Drupal.behaviors.formSingleSubmit
|
|
if (initialize !== true) {
|
|
var formValues = $triggers.serialize();
|
|
var previousValues = $element.attr('data-webform-computed-last');
|
|
if (previousValues === formValues) {
|
|
return;
|
|
}
|
|
$element.attr('data-webform-computed-last', formValues);
|
|
}
|
|
|
|
// Add loading class to computed wrapper.
|
|
$element.find('.js-webform-computed-wrapper')
|
|
.addClass('webform-computed-loading');
|
|
|
|
// Trigger computation.
|
|
$element.find('.js-form-submit').mousedown();
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
})(jQuery, Drupal, Drupal.debounce);
|