mirror of
https://github.com/moodle/moodle.git
synced 2025-04-13 12:32:08 +02:00
MDL-69525 core: Publish a single event when toggling slave checkboxes
This commit is contained in:
parent
38abfb6a01
commit
775dea63e9
2
lib/amd/build/checkbox-toggleall.min.js
vendored
2
lib/amd/build/checkbox-toggleall.min.js
vendored
@ -1,2 +1,2 @@
|
||||
define ("core/checkbox-toggleall",["jquery","core/pubsub"],function(a,b){var c=!1,d={checkboxToggled:"core/checkbox-toggleall:checkboxToggled"},e=function(a,b,c){if(c){return a.find("[data-action=\"toggle\"][data-togglegroup=\""+b+"\"]")}else{return a.find("[data-action=\"toggle\"][data-togglegroup^=\""+b+"\"]")}},f=function(a,b){return e(a,b,!1).filter("[data-toggle=\"slave\"]")},g=function(a,b,c){return e(a,b,c).filter("[data-toggle=\"master\"]")},h=function(a,b){return e(a,b,!0).filter("[data-toggle=\"action\"]")},i=function(b){var c=b.data.root,d=a(b.target),e=d.data("togglegroup"),f;if(d.is(":checkbox")){f=d.is(":checked")}else{f=1===d.data("checkall")}j(c,e,f)},j=function(a,c,e){var g=f(a,c),h=g.filter(":checked");m(a,c,e,!1);g.prop("checked",e);g.trigger("change");b.publish(d.checkboxToggled,{root:a,toggleGroupName:c,slaves:g,checkedSlaves:h,anyChecked:e})},k=function(c){var e=c.data.root,g=a(c.target),h=g.data("togglegroup").split(" "),i=[],j="";h.forEach(function(a){j+=" "+a;i.push(j.trim())});i.forEach(function(a){var c=f(e,a),g=c.filter(":checked"),h=c.length===g.length;m(e,a,h,!0);l(e,a,!g.length);b.publish(d.checkboxToggled,{root:e,toggleGroupName:a,slaves:c,checkedSlaves:g,anyChecked:!!g.length})})},l=function(a,b,c){h(a,b).prop("disabled",c)},m=function(b,c,d,e){var f=g(b,c,e);f.prop("checked",d);f.each(function(c,e){e=a(e);var f;if(d){f=e.data("toggle-deselectall")}else{f=e.data("toggle-selectall")}if(e.is(":checkbox")){var g=b.find("[for=\""+e.attr("id")+"\"]");if(g.length){if(g.html()!==f){g.html(f)}}}else{e.text(f);e.data("checkall",d?0:1)}})},n=function(){if(!c){c=!0;var b=a(document.body);b.on("click","[data-action=\"toggle\"][data-toggle=\"master\"]",{root:b},i);b.on("change","[data-action=\"toggle\"][data-toggle=\"slave\"]",{root:b},k)}};return{init:function init(){n()},events:d,setGroupState:function setGroupState(b,c,d){b=a(b);m(b,c,d,!0);j(b,c,d)},updateSlavesFromMasterState:function updateSlavesFromMasterState(b,c){b=a(b);var d=g(b,c,!1),e;if(d.is(":checkbox")){e=d.is(":checked")}else{e=1===d.data("checkall")}j(b,c,e)}}});
|
||||
define ("core/checkbox-toggleall",["jquery","core/pubsub"],function(a,b){var c=!1,d={checkboxToggled:"core/checkbox-toggleall:checkboxToggled"},e=function(a,b,c){if(c){return a.find("[data-action=\"toggle\"][data-togglegroup=\""+b+"\"]")}else{return a.find("[data-action=\"toggle\"][data-togglegroup^=\""+b+"\"]")}},f=function(a,b){return e(a,b,!1).filter("[data-toggle=\"slave\"]")},g=function(a,b,c){return e(a,b,c).filter("[data-toggle=\"master\"]")},h=function(a,b){return e(a,b,!0).filter("[data-toggle=\"action\"]")},i=function(b){var c=b.data.root,d=a(b.target),e=d.data("togglegroup"),f;if(d.is(":checkbox")){f=d.is(":checked")}else{f=1===d.data("checkall")}l(c,e,f)},j=function(a,b){var c=f(a,b);if(0<c.length){var d=c.filter(":checked"),e=c.length===d.length;o(a,b,e,!0);n(a,b,!d.length)}},k=function(a){var b=a.split(" "),c=[],d="";b.forEach(function(a){d+=" "+a;c.push(d.trim())});return c},l=function(a,c,e){var g=f(a,c);g.prop("checked",e).trigger("change");var h=g.filter(":checked");o(a,c,e,!1);n(a,c,!h.length);var i=k(c).filter(function(a){return a!==c});i.forEach(function(b){j(a,b)});b.publish(d.checkboxToggled,{root:a,toggleGroupName:c,slaves:g,checkedSlaves:h,anyChecked:e})},m=function(c){var e=c.data.root,g=a(c.target),h=g.data("togglegroup"),i=f(e,h),l=i.filter(":checked"),m=k(h);m.forEach(function(a){j(e,a)});b.publish(d.checkboxToggled,{root:e,toggleGroupName:h,slaves:i,checkedSlaves:l,anyChecked:!!l.length})},n=function(a,b,c){h(a,b).prop("disabled",c)},o=function(b,c,d,e){var f=g(b,c,e);f.prop("checked",d);f.each(function(c,e){e=a(e);var f;if(d){f=e.data("toggle-deselectall")}else{f=e.data("toggle-selectall")}if(e.is(":checkbox")){var g=b.find("[for=\""+e.attr("id")+"\"]");if(g.length){if(g.html()!==f){g.html(f)}}}else{e.text(f);e.data("checkall",d?0:1)}})},p=function(){if(!c){c=!0;var b=a(document.body);b.on("click","[data-action=\"toggle\"][data-toggle=\"master\"]",{root:b},i);b.on("click","[data-action=\"toggle\"][data-toggle=\"slave\"]",{root:b},m)}};return{init:function init(){p()},events:d,setGroupState:function setGroupState(b,c,d){b=a(b);o(b,c,d,!0);l(b,c,d)},updateSlavesFromMasterState:function updateSlavesFromMasterState(b,c){b=a(b);var d=g(b,c,!1),e;if(d.is(":checkbox")){e=d.is(":checked")}else{e=1===d.data("checkall")}l(b,c,e)}}});
|
||||
//# sourceMappingURL=checkbox-toggleall.min.js.map
|
||||
|
File diff suppressed because one or more lines are too long
@ -137,6 +137,45 @@ define(['jquery', 'core/pubsub'], function($, PubSub) {
|
||||
toggleSlavesToState(root, toggleGroupName, targetState);
|
||||
};
|
||||
|
||||
/**
|
||||
* Toggles the master checkboxes and action elements in a given toggle group.
|
||||
*
|
||||
* @param {jQuery} root The root jQuery element.
|
||||
* @param {String} toggleGroupName The name of the toggle group
|
||||
*/
|
||||
var toggleMastersAndActionElements = function(root, toggleGroupName) {
|
||||
var toggleGroupSlaves = getAllSlaveCheckboxes(root, toggleGroupName);
|
||||
if (toggleGroupSlaves.length > 0) {
|
||||
var toggleGroupCheckedSlaves = toggleGroupSlaves.filter(':checked');
|
||||
var targetState = toggleGroupSlaves.length === toggleGroupCheckedSlaves.length;
|
||||
|
||||
// Make sure to toggle the exact master checkbox in the given toggle group.
|
||||
setMasterStates(root, toggleGroupName, targetState, true);
|
||||
// Enable the action elements if there's at least one checkbox checked in the given toggle group.
|
||||
// Disable otherwise.
|
||||
setActionElementStates(root, toggleGroupName, !toggleGroupCheckedSlaves.length);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns an array containing every toggle group level of a given toggle group.
|
||||
*
|
||||
* @param {String} toggleGroupName The name of the toggle group
|
||||
* @return {Array} toggleGroupLevels Array that contains every toggle group level of a given toggle group
|
||||
*/
|
||||
var getToggleGroupLevels = function(toggleGroupName) {
|
||||
var toggleGroups = toggleGroupName.split(' ');
|
||||
var toggleGroupLevels = [];
|
||||
var toggleGroupLevel = '';
|
||||
|
||||
toggleGroups.forEach(function(toggleGroupName) {
|
||||
toggleGroupLevel += ' ' + toggleGroupName;
|
||||
toggleGroupLevels.push(toggleGroupLevel.trim());
|
||||
});
|
||||
|
||||
return toggleGroupLevels;
|
||||
};
|
||||
|
||||
/**
|
||||
* Toggles the slave checkboxes to a specific state.
|
||||
*
|
||||
@ -146,14 +185,26 @@ define(['jquery', 'core/pubsub'], function($, PubSub) {
|
||||
*/
|
||||
var toggleSlavesToState = function(root, toggleGroupName, targetState) {
|
||||
var slaves = getAllSlaveCheckboxes(root, toggleGroupName);
|
||||
// Set the slave checkboxes from the masters and manually trigger the native 'change' event.
|
||||
slaves.prop('checked', targetState).trigger('change');
|
||||
// Get all checked slaves after the change of state.
|
||||
var checkedSlaves = slaves.filter(':checked');
|
||||
|
||||
// Toggle the master checkbox in the given toggle group.
|
||||
setMasterStates(root, toggleGroupName, targetState, false);
|
||||
// Enable the action elements if there's at least one checkbox checked in the given toggle group. Disable otherwise.
|
||||
setActionElementStates(root, toggleGroupName, !checkedSlaves.length);
|
||||
|
||||
// Set the slave checkboxes from the masters.
|
||||
slaves.prop('checked', targetState);
|
||||
// Trigger 'change' event to toggle other master checkboxes (e.g. parent master checkboxes) and action elements.
|
||||
slaves.trigger('change');
|
||||
// Get all toggle group levels and toggle accordingly all parent master checkboxes and action elements from each
|
||||
// level. Exclude the given toggle group (toggleGroupName) as the master checkboxes and action elements from this
|
||||
// level have been already toggled.
|
||||
var toggleGroupLevels = getToggleGroupLevels(toggleGroupName)
|
||||
.filter(toggleGroupLevel => toggleGroupLevel !== toggleGroupName);
|
||||
|
||||
toggleGroupLevels.forEach(function(toggleGroupLevel) {
|
||||
// Toggle the master checkboxes action elements in the given toggle group level.
|
||||
toggleMastersAndActionElements(root, toggleGroupLevel);
|
||||
});
|
||||
|
||||
PubSub.publish(events.checkboxToggled, {
|
||||
root: root,
|
||||
@ -190,33 +241,24 @@ define(['jquery', 'core/pubsub'], function($, PubSub) {
|
||||
var toggleMastersFromSlaves = function(e) {
|
||||
var root = e.data.root;
|
||||
var target = $(e.target);
|
||||
var toggleGroupName = target.data('togglegroup');
|
||||
var slaves = getAllSlaveCheckboxes(root, toggleGroupName);
|
||||
var checkedSlaves = slaves.filter(':checked');
|
||||
|
||||
var toggleGroups = target.data('togglegroup').split(' ');
|
||||
var toggleGroupLevels = [];
|
||||
var toggleGroupLevel = '';
|
||||
toggleGroups.forEach(function(toggleGroupName) {
|
||||
toggleGroupLevel += ' ' + toggleGroupName;
|
||||
toggleGroupLevels.push(toggleGroupLevel.trim());
|
||||
// Get all toggle group levels for the given toggle group and toggle accordingly all master checkboxes
|
||||
// and action elements from each level.
|
||||
var toggleGroupLevels = getToggleGroupLevels(toggleGroupName);
|
||||
toggleGroupLevels.forEach(function(toggleGroupLevel) {
|
||||
// Toggle the master checkboxes action elements in the given toggle group level.
|
||||
toggleMastersAndActionElements(root, toggleGroupLevel);
|
||||
});
|
||||
|
||||
toggleGroupLevels.forEach(function(toggleGroupName) {
|
||||
var slaves = getAllSlaveCheckboxes(root, toggleGroupName);
|
||||
var checkedSlaves = slaves.filter(':checked');
|
||||
var targetState = (slaves.length === checkedSlaves.length);
|
||||
|
||||
// Make sure to toggle the exact master checkbox.
|
||||
setMasterStates(root, toggleGroupName, targetState, true);
|
||||
|
||||
// Enable action elements when there's at least one checkbox checked. Disable otherwise.
|
||||
setActionElementStates(root, toggleGroupName, !checkedSlaves.length);
|
||||
|
||||
PubSub.publish(events.checkboxToggled, {
|
||||
root: root,
|
||||
toggleGroupName: toggleGroupName,
|
||||
slaves: slaves,
|
||||
checkedSlaves: checkedSlaves,
|
||||
anyChecked: !!checkedSlaves.length,
|
||||
});
|
||||
PubSub.publish(events.checkboxToggled, {
|
||||
root: root,
|
||||
toggleGroupName: toggleGroupName,
|
||||
slaves: slaves,
|
||||
checkedSlaves: checkedSlaves,
|
||||
anyChecked: !!checkedSlaves.length,
|
||||
});
|
||||
};
|
||||
|
||||
@ -281,7 +323,7 @@ define(['jquery', 'core/pubsub'], function($, PubSub) {
|
||||
|
||||
var root = $(document.body);
|
||||
root.on('click', '[data-action="toggle"][data-toggle="master"]', {root: root}, toggleSlavesFromMasters);
|
||||
root.on('change', '[data-action="toggle"][data-toggle="slave"]', {root: root}, toggleMastersFromSlaves);
|
||||
root.on('click', '[data-action="toggle"][data-toggle="slave"]', {root: root}, toggleMastersFromSlaves);
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user