Merge branch 'MDL-85514-500' of https://github.com/snake/moodle into MOODLE_500_STABLE

This commit is contained in:
Mihail Geshoski
2025-06-19 10:59:53 +08:00
7 changed files with 38 additions and 28 deletions
+1 -1
View File
@@ -4,6 +4,6 @@
* @copyright 2018 Davo Smith, Synergy Learning
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("core/showhidesettings",["jquery"],(function($){var dependencies;function isCheckboxHiddenElement($el){return $el.is("input[type=hidden]")&&$el.siblings('input[type=checkbox][name="'+$el.attr("name")+'"]').length}function isCheckedRelevant($el,value){return!isCheckboxHiddenElement($el)&&!function($el,value){return $el.is("input[type=radio]")&&$el.attr("value")!==value}($el,value)}function isUncheckedRadioButton($el){return $el.is("input[type=radio]")&&!$el.prop("checked")}function isUncheckedCheckbox($el){return $el.is("input[type=checkbox]")&&!$el.prop("checked")}function isMultiSelect($el){return $el.is("select")&&$el.prop("multiple")}function multiSelectMatches($el,values){var selected=$el.val()||[];if(1===values.length&&""===values[0])return 0===selected.length;if(selected.length!==values.length)return!1;for(var i in selected)if(selected.hasOwnProperty(i)&&-1===values.indexOf(selected[i]))return!1;return!0}var depFns={notchecked:function($dependon,value){var hide=!1;return value=String(value),$dependon.each((function(idx,el){var $el=$(el);isCheckedRelevant($el,value)&&(hide=hide||!$el.prop("checked"))})),hide},checked:function($dependon,value){var hide=!1;return value=String(value),$dependon.each((function(idx,el){var $el=$(el);isCheckedRelevant($el,value)&&(hide=hide||$el.prop("checked"))})),hide},noitemselected:function($dependon){var hide=!1;return $dependon.each((function(idx,el){var $el=$(el);hide=hide||-1===$el.prop("selectedIndex")})),hide},eq:function($dependon,value){var hide=!1,hiddenVal=!1;return value=String(value),$dependon.each((function(idx,el){var $el=$(el);if(!isUncheckedRadioButton($el))if(isCheckboxHiddenElement($el))hiddenVal=$el.val()===value;else if(isUncheckedCheckbox($el))hide=hide||hiddenVal;else if(isMultiSelect($el)){var values=value.split("|");hide=multiSelectMatches($el,values)}else hide=hide||$el.val()===value})),hide},in:function($dependon,value){var hide=!1,hiddenVal=!1,values=value.split("|");return $dependon.each((function(idx,el){var $el=$(el);isUncheckedRadioButton($el)||(isCheckboxHiddenElement($el)?hiddenVal=values.indexOf($el.val())>-1:hide=isUncheckedCheckbox($el)?hide||hiddenVal:isMultiSelect($el)?multiSelectMatches($el,values):hide||values.indexOf($el.val())>-1)})),hide},defaultCondition:function($dependon,value){var hide=!1,hiddenVal=!1;return value=String(value),$dependon.each((function(idx,el){var $el=$(el);if(!isUncheckedRadioButton($el))if(isCheckboxHiddenElement($el))hiddenVal=$el.val()!==value;else if(isUncheckedCheckbox($el))hide=hide||hiddenVal;else if(isMultiSelect($el)){var values=value.split("|");hide=!multiSelectMatches($el,values)}else hide=hide||$el.val()!==value})),hide}};function getElementsByName(name){return $('[name="'+name+'"],[name^="'+name+'["]')}function updateDependencies(){var toHide={};$.each(dependencies,(function(dependonname){var dependon=getElementsByName(dependonname);$.each(dependencies[dependonname],(function(condition,values){$.each(values,(function(value,elements){var hide=function($dependon,condition,value){return"function"==typeof depFns[condition]?depFns[condition]($dependon,value):depFns.defaultCondition($dependon,value)}(dependon,condition,value);$.each(elements,(function(idx,elToHide){toHide.hasOwnProperty(elToHide)?toHide[elToHide]=toHide[elToHide]||hide:toHide[elToHide]=hide}))}))}))})),$.each(toHide,(function(elToHide,hide){getElementsByName(elToHide).each((function(idx,el){var $parent=$(el).closest(".form-item");$parent.length&&(hide?$parent.hide():$parent.show())}))}))}return{init:function(opts){dependencies=opts.dependencies,$.each(dependencies,(function(depname){var $el=getElementsByName(depname);$el.length&&$el.on("change",updateDependencies)})),updateDependencies(),$(".form-dependenton").hide()}}}));
define("core/showhidesettings",["jquery"],(function($){var dependencies;function isCheckboxHiddenElement($el){return $el.is("input[type=hidden]")&&$el.siblings('input[type=checkbox][name="'+$el.attr("name")+'"]').length}function isCheckedRelevant($el,value){return!isCheckboxHiddenElement($el)&&!function($el,value){return $el.is("input[type=radio]")&&$el.attr("value")!==value}($el,value)}function isUncheckedRadioButton($el){return $el.is("input[type=radio]")&&!$el.prop("checked")}function isUncheckedCheckbox($el){return $el.is("input[type=checkbox]")&&!$el.prop("checked")}function isMultiSelect($el){return $el.is("select")&&$el.prop("multiple")}function multiSelectMatches($el,values){var selected=$el.val()||[];if(1===values.length&&""===values[0])return 0===selected.length;if(selected.length!==values.length)return!1;for(var i in selected)if(selected.hasOwnProperty(i)&&-1===values.indexOf(selected[i]))return!1;return!0}var depFns={notchecked:function($dependon,value){var hide=!1;return value=String(value),$dependon.each((function(idx,el){var $el=$(el);isCheckedRelevant($el,value)&&(hide=hide||!$el.prop("checked"))})),hide},checked:function($dependon,value){var hide=!1;return value=String(value),$dependon.each((function(idx,el){var $el=$(el);isCheckedRelevant($el,value)&&(hide=hide||$el.prop("checked"))})),hide},noitemselected:function($dependon){var hide=!1;return $dependon.each((function(idx,el){var $el=$(el);hide=hide||-1===$el.prop("selectedIndex")})),hide},eq:function($dependon,value){var hide=!1,hiddenVal=!1;return value=String(value),$dependon.each((function(idx,el){var $el=$(el);if(!isUncheckedRadioButton($el))if(isCheckboxHiddenElement($el))hiddenVal=$el.val()===value;else if(isUncheckedCheckbox($el))hide=hide||hiddenVal;else if(isMultiSelect($el)){var values=value.split("|");hide=multiSelectMatches($el,values)}else hide=hide||$el.val()===value})),hide},in:function($dependon,value){var hide=!1,hiddenVal=!1,values=value.split("|");return $dependon.each((function(idx,el){var $el=$(el);isUncheckedRadioButton($el)||(isCheckboxHiddenElement($el)?hiddenVal=values.indexOf($el.val())>-1:hide=isUncheckedCheckbox($el)?hide||hiddenVal:isMultiSelect($el)?function($el,values){let selected=$el.val()||[];return 0==selected.length&&selected.push(""),selected.every((element=>values.includes(element)))}($el,values):hide||values.indexOf($el.val())>-1)})),hide},defaultCondition:function($dependon,value){var hide=!1,hiddenVal=!1;return value=String(value),$dependon.each((function(idx,el){var $el=$(el);if(!isUncheckedRadioButton($el))if(isCheckboxHiddenElement($el))hiddenVal=$el.val()!==value;else if(isUncheckedCheckbox($el))hide=hide||hiddenVal;else if(isMultiSelect($el)){var values=value.split("|");hide=!multiSelectMatches($el,values)}else hide=hide||$el.val()!==value})),hide}};function getElementsByName(name){return $('[name="'+name+'"],[name^="'+name+'["]')}function updateDependencies(){var toHide={};$.each(dependencies,(function(dependonname){var dependon=getElementsByName(dependonname);$.each(dependencies[dependonname],(function(condition,values){$.each(values,(function(value,elements){var hide=function($dependon,condition,value){return"function"==typeof depFns[condition]?depFns[condition]($dependon,value):depFns.defaultCondition($dependon,value)}(dependon,condition,value);$.each(elements,(function(idx,elToHide){toHide.hasOwnProperty(elToHide)?toHide[elToHide]=toHide[elToHide]||hide:toHide[elToHide]=hide}))}))}))})),$.each(toHide,(function(elToHide,hide){getElementsByName(elToHide).each((function(idx,el){var $parent=$(el).closest(".form-item");$parent.length&&(hide?$parent.hide():$parent.show())}))}))}return{init:function(opts){dependencies=opts.dependencies,$.each(dependencies,(function(depname){var $el=getElementsByName(depname);$el.length&&$el.on("change",updateDependencies)})),updateDependencies(),$(".form-dependenton").hide()}}}));
//# sourceMappingURL=showhidesettings.min.js.map
File diff suppressed because one or more lines are too long
+21 -4
View File
@@ -71,7 +71,24 @@ define(['jquery'], function($) {
}
/**
* Does the multi-select exactly match the list of values provided?
* Are the selected values of a multi-select a subset of (i.e. 'in') the list of values provided?
* @param {jQuery} $el
* @param {array} values
* @returns {boolean}
*/
function multiSelectIn($el, values) {
let selected = $el.val() || [];
if (selected.length == 0) {
selected.push('');
}
// Lock/hide if the selected values are a subset of the values.
let isSubset = selected.every(element => values.includes(element));
return isSubset;
}
/**
* Are the selected values of a multi-select an exact match (i.e. 'eq') to the list of values provided?
* @param {jQuery} $el
* @param {array} values
* @returns {boolean}
@@ -193,8 +210,8 @@ define(['jquery'], function($) {
return;
}
if (isMultiSelect($el)) {
// For multiselect, we check to see if the list of values provided matches the list selected.
hide = multiSelectMatches($el, values);
// For multiselect, we check to see if the selected values are a subset of the list of values provided.
hide = multiSelectIn($el, values);
return;
}
// All other element types - check to see if the value is in the list.
@@ -328,4 +345,4 @@ define(['jquery'], function($) {
hideDependencyInfo();
}
};
});
});
+9 -16
View File
@@ -572,23 +572,16 @@ if (typeof M.form.dependencyManager === 'undefined') {
selected[selected.length] = this.get('value');
}
});
if (values.length === 1 && values[0] === '') {
// Values array contains a single empty entry -> value was empty.
lock = selected.length === 0;
return;
}
if (selected.length !== values.length) {
lock = false;
return;
}
lock = true;
for (const i in selected) {
v = selected[i];
if (values.indexOf(v) === -1) {
lock = false;
return;
}
// Needed to support subset resolution for empty selects, where 'no selection' is represented by ''.
if (selected.length == 0) {
selected.push('');
}
// Lock/hide if the selected values are a subset of the values.
let isSubset = selected.every(element => values.includes(element));
lock = isSubset;
return;
} else {
value = this.get('value');
lock = lock || (values.indexOf(value) > -1);
+2 -2
View File
@@ -56,6 +56,6 @@ Feature: disabledIf functionality in forms
Examples:
| selection | enabledEq_ | enabledIn_ | enabledNeq_ | enabledEq1 | enabledIn1 | enabledNeq1 | enabledEq12 | enabledIn12 | enabledNeq12 |
| | disabled | disabled | enabled | enabled | enabled | disabled | enabled | enabled | disabled |
| Option 1 | enabled | enabled | disabled | disabled | disabled | enabled | enabled | enabled | disabled |
| Option 2 | enabled | enabled | disabled | enabled | enabled | disabled | enabled | enabled | disabled |
| Option 1 | enabled | enabled | disabled | disabled | disabled | enabled | enabled | disabled | disabled |
| Option 2 | enabled | enabled | disabled | enabled | enabled | disabled | enabled | disabled | disabled |
| Option 1, Option 2 | enabled | enabled | disabled | enabled | enabled | disabled | disabled | disabled | enabled |
+2 -2
View File
@@ -68,6 +68,6 @@ Feature: hideIf functionality in forms
Examples:
| selection | shouldSeeEq_ | shouldSeeIn_ | shouldSeeNeq_ | shouldSeeEq1 | shouldSeeIn1 | shouldSeeNeq1 | shouldSeeEq12 | shouldSeeIn12 | shouldSeeNeq12 |
| | should not | should not | should | should | should | should not | should | should | should not |
| Option 1 | should | should | should not | should not | should not | should | should | should | should not |
| Option 2 | should | should | should not | should | should | should not | should | should | should not |
| Option 1 | should | should | should not | should not | should not | should | should | should not | should not |
| Option 2 | should | should | should not | should | should | should not | should | should not | should not |
| Option 1, Option 2 | should | should | should not | should | should | should not | should not | should not | should |
@@ -23,6 +23,6 @@ Feature: hide_if functionality in admin settings
Examples:
| selection | shouldSeeEq_ | shouldSeeIn_ | shouldSeeNeq_ | shouldSeeEq1 | shouldSeeIn1 | shouldSeeNeq1 | shouldSeeEq12 | shouldSeeIn12 | shouldSeeNeq12 |
| | should not | should not | should | should | should | should not | should | should | should not |
| Option 1 | should | should | should not | should not | should not | should | should | should | should not |
| Option 2 | should | should | should not | should | should | should not | should | should | should not |
| Option 1 | should | should | should not | should not | should not | should | should | should not | should not |
| Option 2 | should | should | should not | should | should | should not | should | should not | should not |
| Option 1, Option 2 | should | should | should not | should | should | should not | should not | should not | should |