let prev;
function clickHandler( e ) {
// When our boxes are clicked and one has been clicked before...
if ( prev && e.shiftKey ) {
// Check or uncheck this one and all in-between checkboxes,
// except for disabled ones
const $checkboxes = e.data.$checkboxes;
$checkboxes
.slice(
Math.min( $checkboxes.index( prev ), $checkboxes.index( e.target ) ),
Math.max( $checkboxes.index( prev ), $checkboxes.index( e.target ) ) + 1
)
.filter( function () {
return !this.disabled && this.checked !== e.target.checked;
} )
.prop( 'checked', e.target.checked )
// Since the state change is a consequence of direct user action,
// fire the 'change' event (see T313077).
.trigger( 'change' );
}
// Either way, remember this as the last clicked one
prev = e.target;
}
/**
* Enable checkboxes to be checked or unchecked in a row by clicking one,
* holding shift and clicking another one.
*
* @method checkboxShift
* @memberof module:mediawiki.page.ready
* @param {jQuery} $checkboxes
*/
module.exports = function ( $checkboxes ) {
$checkboxes
.off( 'click', clickHandler )
.on( 'click', { $checkboxes: $checkboxes }, clickHandler );
};