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.icheck.js
2018-11-23 12:29:20 +00:00

111 lines
3.3 KiB
JavaScript

/**
* @file
* JavaScript behaviors for iCheck integration.
*/
(function ($, Drupal) {
'use strict';
// @see http://icheck.fronteed.com/#options
Drupal.webform = Drupal.webform || {};
Drupal.webform.iCheck = Drupal.webform.iCheck || {};
Drupal.webform.iCheck.options = Drupal.webform.iCheck.options || {};
/**
* Enhance checkboxes and radios using iCheck.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.webformICheck = {
attach: function (context) {
if (!$.fn.iCheck) {
return;
}
$('input[data-webform-icheck]', context).each(function () {
var $input = $(this);
var icheck = $input.attr('data-webform-icheck');
var options = $.extend({
checkboxClass: 'icheckbox_' + icheck,
radioClass: 'iradio_' + icheck
}, Drupal.webform.iCheck.options);
// The line skin requires that the label be added to the options.
// @see http://icheck.fronteed.com/#skin-line
if (icheck.indexOf('line') === 0) {
var $label = $input.parent().find('label[for="' + $input.attr('id') + '"]');
// Set insert with label text.
options.insert = '<div class="icheck_line-icon"></div>' + $label.text();
// Make sure checkbox is outside the label and then remove the label.
$label.insertAfter($input).remove();
}
$input.addClass('js-webform-icheck')
.iCheck(options)
// @see https://github.com/fronteed/iCheck/issues/244
.on('ifChecked', function (e) {
$(e.target).attr('checked', 'checked').change();
})
.on('ifUnchecked', function (e) {
$(e.target).removeAttr('checked').change();
});
});
}
};
/**
* Enhance table select checkall.
*
* ISSUE: Select all is not sync'd with checkboxes because iCheck overrides all existing event handlers.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.webformICheckTableSelectAll = {
attach: function (context) {
if (!$.fn.iCheck) {
return;
}
$('table[data-webform-icheck] th.select-all').bind('DOMNodeInserted', function () {
$(this).unbind('DOMNodeInserted');
$(this).find('input[type="checkbox"]').each(function () {
var icheck = $(this).closest('table[data-webform-icheck]').attr('data-webform-icheck');
var options = $.extend({
checkboxClass: 'icheckbox_' + icheck,
radioClass: 'iradio_' + icheck
}, Drupal.webform.iCheck.options);
$(this).iCheck(options);
})
.on('ifChanged', function () {
var _index = $(this).parents('th').index() + 1;
$(this).parents('thead').next('tbody').find('tr td:nth-child(' + _index + ') input')
.iCheck(!$(this).is(':checked') ? 'check' : 'uncheck')
.iCheck($(this).is(':checked') ? 'check' : 'uncheck');
});
});
}
};
/**
* Sync iCheck element when checkbox/radio is enabled/disabled via the #states.
*
* @see core/misc/states.js
*/
if ($.fn.iCheck) {
$(document).on('state:disabled', function (e) {
if ($(e.target).hasClass('.js-webform-icheck')) {
$(e.target).iCheck(e.value ? 'disable' : 'enable');
}
$(e.target).iCheck(e.value ? 'disable' : 'enable');
});
}
})(jQuery, Drupal);