/** * @file * JavaScript behaviors for checkboxes. */ (function ($, Drupal, once) { /** * Adds check all or none checkboxes support. * * @type {Drupal~behavior} * * @see https://www.drupal.org/project/webform/issues/3068998 */ Drupal.behaviors.webformCheckboxesAllorNone = { attach(context) { $(once('webform-checkboxes-all-or-none', '[data-options-all], [data-options-none]', context)) .each(function () { var $element = $(this); var options_all_value = $element.data('options-all'); var options_none_value = $element.data('options-none'); // Get all checkboxes. var $checkboxes = $element.find('input[type="checkbox"]'); // Get all options/checkboxes. var $options = $checkboxes .not('[value="' + options_all_value + '"]') .not('[value="' + options_none_value + '"]'); // Get options all and none checkboxes. var $options_all = $element .find(':checkbox[value="' + options_all_value + '"]'); var $options_none = $element .find(':checkbox[value="' + options_none_value + '"]'); // All of the above. if ($options_all.length) { $options_all.on('click', toggleCheckAllEventHandler); if ($options_all.prop('checked')) { toggleCheckAllEventHandler(); } } // None of the above. if ($options_none.length) { $options_none.on('click', toggleCheckNoneEventHandler); toggleCheckNoneEventHandler(); } $options.on('click', toggleCheckboxesEventHandler); toggleCheckboxesEventHandler(); /** * Toggle check all checkbox checked state. */ function toggleCheckAllEventHandler() { if ($options_all.prop('checked')) { // Uncheck options none. if ($options_none.is(':checked')) { $options_none .prop('checked', false) .trigger('change', ['webform.states']); } // Check check all unchecked options. $options.not(':checked') .prop('checked', true) .trigger('change', ['webform.states']); } else { // Check uncheck all checked options. $options.filter(':checked') .prop('checked', false) .trigger('change', ['webform.states']); } } /** * Toggle check none checkbox checked state. */ function toggleCheckNoneEventHandler() { if ($options_none.prop('checked')) { $checkboxes .not('[value="' + options_none_value + '"]') .filter(':checked') .prop('checked', false) .trigger('change', ['webform.states']); } } /** * Toggle check all checkbox checked state. */ function toggleCheckboxesEventHandler() { var isAllChecked = ($options.filter(':checked').length === $options.length); if ($options_all.length && $options_all.prop('checked') !== isAllChecked) { $options_all .prop('checked', isAllChecked) .trigger('change', ['webform.states']); } var isOneChecked = $options.is(':checked'); if ($options_none.length && isOneChecked) { $options_none .prop('checked', false) .trigger('change', ['webform.states']); } } }); } }; })(jQuery, Drupal, once);