Rev 1 | AutorÃa | Comparar con el anterior | Ultima modificación | Ver Log |
{"version":3,"file":"showhidesettings.min.js","sources":["../src/showhidesettings.js"],"sourcesContent":["/**\n * Show/hide admin settings based on other settings selected\n *\n * @copyright 2018 Davo Smith, Synergy Learning\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n var dependencies;\n\n // -------------------------------------------------\n // Support functions, used by dependency functions.\n // -------------------------------------------------\n\n /**\n * Check to see if the given element is the hidden element that makes sure checkbox\n * elements always submit a value.\n * @param {jQuery} $el\n * @returns {boolean}\n */\n function isCheckboxHiddenElement($el) {\n return ($el.is('input[type=hidden]') && $el.siblings('input[type=checkbox][name=\"' + $el.attr('name') + '\"]').length);\n }\n\n /**\n * Check to see if this is a radio button with the wrong value (i.e. a radio button from\
n * the group we are interested in, but not the specific one we wanted).\n * @param {jQuery} $el\n * @param {string} value\n * @returns {boolean}\n */\n function isWrongRadioButton($el, value) {\n return ($el.is('input[type=radio]') && $el.attr('value') !== value);\n }\n\n /**\n * Is this element relevant when we're looking for checked / not checked status?\n * @param {jQuery} $el\n * @param {string} value\n * @returns {boolean}\n */\n function isCheckedRelevant($el, value) {\n return (!isCheckboxHiddenElement($el) && !isWrongRadioButton($el, value));\n }\n\n /**\n * Is this an unchecked radio button? (If it is, we want to skip it, as\n * we're only interested in the value of the radio button that is checked)\n * @param {jQuery} $el\n * @returns {boolean}\n */\n function isUncheckedRadioButton($el) {\n return ($el.is('input[type=radio]') && !$el.prop('checked'));\n }\n\n /**\n * Is this an unchecke
d checkbox?\n * @param {jQuery} $el\n * @returns {boolean}\n */\n function isUncheckedCheckbox($el) {\n return ($el.is('input[type=checkbox]') && !$el.prop('checked'));\n }\n\n /**\n * Is this a multi-select select element?\n * @param {jQuery} $el\n * @returns {boolean}\n */\n function isMultiSelect($el) {\n return ($el.is('select') && $el.prop('multiple'));\n }\n\n /**\n * Are the selected values of a multi-select a subset of (i.e. 'in') the list of values provided?\n * @param {jQuery} $el\n * @param {array} values\n * @returns {boolean}\n */\n function multiSelectIn($el, values) {\n let selected = $el.val() || [];\n if (selected.length == 0) {\n selected.push('');\n }\n\n // Lock/hide if the selected values are a subset of the values.\n let isSubset = selected.every(element => values.includes(element));\n return isSubset;\n }\n\n /**\n * Are the selected values o
f a multi-select an exact match (i.e. 'eq') to the list of values provided?\n * @param {jQuery} $el\n * @param {array} values\n * @returns {boolean}\n */\n function multiSelectMatches($el, values) {\n var selected = $el.val() || [];\n if (values.length === 1 && values[0] === '') {\n // Values array contains a single empty entry -> value was empty.\n return selected.length === 0;\n }\n if (selected.length !== values.length) {\n // Different number of expected and actual values - cannot possibly be a match.\n return false;\n }\n for (var i in selected) {\n if (selected.hasOwnProperty(i)) {\n if (values.indexOf(selected[i]) === -1) {\n return false; // Found a non-matching value - give up immediately.\n }\n }\n }\n // Didn't find a non-matching value, so we have a match.\n return true;\n }\n\n // ---------------
----------------\n // Specific dependency functions.\n // -------------------------------\n\n var depFns = {\n notchecked: function($dependon, value) {\n var hide = false;\n value = String(value);\n $dependon.each(function(idx, el) {\n var $el = $(el);\n if (isCheckedRelevant($el, value)) {\n hide = hide || !$el.prop('checked');\n }\n });\n return hide;\n },\n\n checked: function($dependon, value) {\n var hide = false;\n value = String(value);\n $dependon.each(function(idx, el) {\n var $el = $(el);\n if (isCheckedRelevant($el, value)) {\n hide = hide || $el.prop('checked');\n }\n });\n return hide;\n },\n\n noitemselected: function($dependon) {\n var hide = false;\n $dependon.each(function(idx, el) {\n
var $el = $(el);\n hide = hide || ($el.prop('selectedIndex') === -1);\n });\n return hide;\n },\n\n eq: function($dependon, value) {\n var hide = false;\n var hiddenVal = false;\n value = String(value);\n $dependon.each(function(idx, el) {\n var $el = $(el);\n if (isUncheckedRadioButton($el)) {\n // For radio buttons, we're only interested in the one that is checked.\n return;\n }\n if (isCheckboxHiddenElement($el)) {\n // This is the hidden input that is part of the checkbox setting.\n // We will use this value, if the associated checkbox is unchecked.\n hiddenVal = ($el.val() === value);\n return;\n }\n if (isUncheckedCheckbox($el)) {\n // Checkbox is not checked - hide depends on the '
unchecked' value stored in\n // the associated hidden element, which we have already found, above.\n hide = hide || hiddenVal;\n return;\n }\n if (isMultiSelect($el)) {\n // Expect a list of values to match, separated by '|' - all of them must\n // match the values selected.\n var values = value.split('|');\n hide = multiSelectMatches($el, values);\n return;\n }\n // All other element types - just compare the value directly.\n hide = hide || ($el.val() === value);\n });\n return hide;\n },\n\n 'in': function($dependon, value) {\n var hide = false;\n var hiddenVal = false;\n var values = value.split('|');\n $dependon.each(function(idx, el) {\n var $el = $(el);\n if (isUncheckedR
adioButton($el)) {\n // For radio buttons, we're only interested in the one that is checked.\n return;\n }\n if (isCheckboxHiddenElement($el)) {\n // This is the hidden input that is part of the checkbox setting.\n // We will use this value, if the associated checkbox is unchecked.\n hiddenVal = (values.indexOf($el.val()) > -1);\n return;\n }\n if (isUncheckedCheckbox($el)) {\n // Checkbox is not checked - hide depends on the 'unchecked' value stored in\n // the associated hidden element, which we have already found, above.\n hide = hide || hiddenVal;\n return;\n }\n if (isMultiSelect($el)) {\n // For multiselect, we check to see if the selected values are a subset of the list of values provided.\n
hide = multiSelectIn($el, values);\n return;\n }\n // All other element types - check to see if the value is in the list.\n hide = hide || (values.indexOf($el.val()) > -1);\n });\n return hide;\n },\n\n defaultCondition: function($dependon, value) { // Not equal.\n var hide = false;\n var hiddenVal = false;\n value = String(value);\n $dependon.each(function(idx, el) {\n var $el = $(el);\n if (isUncheckedRadioButton($el)) {\n // For radio buttons, we're only interested in the one that is checked.\n return;\n }\n if (isCheckboxHiddenElement($el)) {\n // This is the hidden input that is part of the checkbox setting.\n // We will use this value, if the associated checkbox is unchecked.\n hiddenVal = ($el.val() !== v
alue);\n return;\n }\n if (isUncheckedCheckbox($el)) {\n // Checkbox is not checked - hide depends on the 'unchecked' value stored in\n // the associated hidden element, which we have already found, above.\n hide = hide || hiddenVal;\n return;\n }\n if (isMultiSelect($el)) {\n // Expect a list of values to match, separated by '|' - all of them must\n // match the values selected to *not* hide the element.\n var values = value.split('|');\n hide = !multiSelectMatches($el, values);\n return;\n }\n // All other element types - just compare the value directly.\n hide = hide || ($el.val() !== value);\n });\n return hide;\n }\n };\n\n /**\n * Find the element with the given name\n *
@param {String} name\n * @returns {*|jQuery|HTMLElement}\n */\n function getElementsByName(name) {\n // For the array elements, we use [name^=\"something[\"] to find the elements that their name begins with 'something['/\n // This is to find both name = 'something[]' and name='something[index]'.\n return $('[name=\"' + name + '\"],[name^=\"' + name + '[\"]');\n }\n\n /**\n * Check to see whether a particular condition is met\n * @param {*|jQuery|HTMLElement} $dependon\n * @param {String} condition\n * @param {mixed} value\n * @returns {Boolean}\n */\n function checkDependency($dependon, condition, value) {\n if (typeof depFns[condition] === \"function\") {\n return depFns[condition]($dependon, value);\n }\n return depFns.defaultCondition($dependon, value);\n }\n\n /**\n * Show / hide the elements that depend on some elements.\n */\n function updateDependencies() {\n // Process all depende
ncy conditions.\n var toHide = {};\n $.each(dependencies, function(dependonname) {\n var dependon = getElementsByName(dependonname);\n $.each(dependencies[dependonname], function(condition, values) {\n $.each(values, function(value, elements) {\n var hide = checkDependency(dependon, condition, value);\n $.each(elements, function(idx, elToHide) {\n if (toHide.hasOwnProperty(elToHide)) {\n toHide[elToHide] = toHide[elToHide] || hide;\n } else {\n toHide[elToHide] = hide;\n }\n });\n });\n });\n });\n\n // Update the hidden status of all relevant elements.\n $.each(toHide, function(elToHide, hide) {\n getElementsByName(elToHide).each(function(idx, el) {\n var $parent = $(el).closest('.form-item');\n
if ($parent.length) {\n if (hide) {\n $parent.hide();\n } else {\n $parent.show();\n }\n }\n });\n });\n }\n\n /**\n * Initialise the event handlers.\n */\n function initHandlers() {\n $.each(dependencies, function(depname) {\n var $el = getElementsByName(depname);\n if ($el.length) {\n $el.on('change', updateDependencies);\n }\n });\n updateDependencies();\n }\n\n /**\n * Hide the 'this setting may be hidden' messages.\n */\n function hideDependencyInfo() {\n $('.form-dependenton').hide();\n }\n\n return {\n init: function(opts) {\n dependencies = opts.dependencies;\n initHandlers();\n hideDependencyInfo();\n }\n };\n});\n"],"names":["define","$","dependencies","isCheckboxHiddenElement","$el","is","siblings",
"attr","length","isCheckedRelevant","value","isWrongRadioButton","isUncheckedRadioButton","prop","isUncheckedCheckbox","isMultiSelect","multiSelectMatches","values","selected","val","i","hasOwnProperty","indexOf","depFns","notchecked","$dependon","hide","String","each","idx","el","checked","noitemselected","eq","hiddenVal","split","push","every","element","includes","multiSelectIn","defaultCondition","getElementsByName","name","updateDependencies","toHide","dependonname","dependon","condition","elements","checkDependency","elToHide","$parent","closest","show","init","opts","depname","on"],"mappings":"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"}