This repository has been archived on 2025-01-19. You can view files and clone it, but cannot push or open issues or pull requests.
drupalcampbristol/web/modules/contrib/webform/js/webform.element.other.js
2018-11-23 12:29:20 +00:00

159 lines
4.9 KiB
JavaScript

/**
* @file
* JavaScript behaviors for other elements.
*/
(function ($, Drupal) {
'use strict';
/**
* Toggle other input (text) field.
*
* @param {boolean} show
* TRUE will display the text field. FALSE with hide and clear the text field.
* @param {object} $element
* The input (text) field to be toggled.
* @param {string} effect
* Effect.
*/
function toggleOther(show, $element, effect) {
var $input = $element.find('input');
var hideEffect = (effect === false) ? 'hide' : 'slideUp';
var showEffect = (effect === false) ? 'show' : 'slideDown';
if (show) {
// Limit the other inputs width to the parent's container.
// If the parent container is not visible it's width will be 0
// and ignored.
var width = $element.parent().width();
if (width) {
$element.width(width);
}
// Display the element.
$element[showEffect]();
// If not initializing, then focus the other element.
if (effect !== false) {
$input.focus();
}
// Require the input.
$input.prop('required', true).attr('aria-required', 'true');
// Restore the input's value.
var value = $input.data('webform-value');
if (typeof value !== 'undefined') {
$input.val(value);
var input = $input.get(0);
// Move cursor to the beginning of the other text input.
// @see https://stackoverflow.com/questions/21177489/selectionstart-selectionend-on-input-type-number-no-longer-allowed-in-chrome
if ($.inArray(input.type, ['text', 'search', 'url', 'tel', 'password']) !== -1) {
input.setSelectionRange(0, 0);
}
}
// Refresh CodeMirror used as other element.
$element.parent().find('.CodeMirror').each(function (index, $element) {
$element.CodeMirror.refresh();
});
}
else {
// Hide the element.
$element[hideEffect]();
// Save the input's value.
$input.data('webform-value', $input.val());
// Empty and un-required the input.
$input.val('').prop('required', false).removeAttr('aria-required');
}
}
/**
* Attach handlers to select other elements.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.webformSelectOther = {
attach: function (context) {
$(context).find('.js-webform-select-other').once('webform-select-other').each(function () {
var $element = $(this);
var $select = $element.find('select');
var $otherOption = $element.find('option[value="_other_"]');
var $input = $element.find('.js-webform-select-other-input');
$select.on('change', function () {
toggleOther($otherOption.is(':selected'), $input);
});
toggleOther($otherOption.is(':selected'), $input, false);
});
}
};
/**
* Attach handlers to checkboxes other elements.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.webformCheckboxesOther = {
attach: function (context) {
$(context).find('.js-webform-checkboxes-other').once('webform-checkboxes-other').each(function () {
var $element = $(this);
var $checkbox = $element.find('input[value="_other_"]');
var $input = $element.find('.js-webform-checkboxes-other-input');
$checkbox.on('change', function () {
toggleOther(this.checked, $input);
});
toggleOther($checkbox.is(':checked'), $input, false);
});
}
};
/**
* Attach handlers to radios other elements.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.webformRadiosOther = {
attach: function (context) {
$(context).find('.js-webform-radios-other').once('webform-radios-other').each(function () {
var $element = $(this);
var $radios = $element.find('input[type="radio"]');
var $input = $element.find('.js-webform-radios-other-input');
$radios.on('change', function () {
toggleOther(($radios.filter(':checked').val() === '_other_'), $input);
});
toggleOther(($radios.filter(':checked').val() === '_other_'), $input, false);
});
}
};
/**
* Attach handlers to buttons other elements.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.webformButtonsOther = {
attach: function (context) {
$(context).find('.js-webform-buttons-other').once('webform-buttons-other').each(function () {
var $element = $(this);
var $buttons = $element.find('input[type="radio"]');
var $input = $element.find('.js-webform-buttons-other-input');
var $container = $(this).find('.js-webform-webform-buttons');
// Create set onchange handler.
$container.change(function () {
toggleOther(($(this).find(':radio:checked').val() === '_other_'), $input);
});
toggleOther(($buttons.filter(':checked').val() === '_other_'), $input, false);
});
}
};
})(jQuery, Drupal);