2018-10-12 03:11:57 +00:00
/*global gettext, interpolate, ngettext*/
( function ( $ ) {
'use strict' ;
var lastChecked ;
$ . fn . actions = function ( opts ) {
var options = $ . extend ( { } , $ . fn . actions . defaults , opts ) ;
var actionCheckboxes = $ ( this ) ;
var list _editable _changed = false ;
var showQuestion = function ( ) {
2019-07-11 02:25:40 +00:00
$ ( options . acrossClears ) . hide ( ) ;
$ ( options . acrossQuestions ) . show ( ) ;
$ ( options . allContainer ) . hide ( ) ;
} ,
showClear = function ( ) {
$ ( options . acrossClears ) . show ( ) ;
$ ( options . acrossQuestions ) . hide ( ) ;
$ ( options . actionContainer ) . toggleClass ( options . selectedClass ) ;
$ ( options . allContainer ) . show ( ) ;
$ ( options . counterContainer ) . hide ( ) ;
} ,
reset = function ( ) {
$ ( options . acrossClears ) . hide ( ) ;
$ ( options . acrossQuestions ) . hide ( ) ;
$ ( options . allContainer ) . hide ( ) ;
$ ( options . counterContainer ) . show ( ) ;
} ,
clearAcross = function ( ) {
2018-10-12 03:11:57 +00:00
reset ( ) ;
2019-07-11 02:25:40 +00:00
$ ( options . acrossInput ) . val ( 0 ) ;
$ ( options . actionContainer ) . removeClass ( options . selectedClass ) ;
} ,
checker = function ( checked ) {
if ( checked ) {
2018-10-12 03:11:57 +00:00
showQuestion ( ) ;
} else {
2019-07-11 02:25:40 +00:00
reset ( ) ;
2018-10-12 03:11:57 +00:00
}
2019-07-11 02:25:40 +00:00
$ ( actionCheckboxes ) . prop ( "checked" , checked )
. parent ( ) . parent ( ) . toggleClass ( options . selectedClass , checked ) ;
} ,
updateCounter = function ( ) {
var sel = $ ( actionCheckboxes ) . filter ( ":checked" ) . length ;
// data-actions-icnt is defined in the generated HTML
// and contains the total amount of objects in the queryset
var actions _icnt = $ ( '.action-counter' ) . data ( 'actionsIcnt' ) ;
$ ( options . counterContainer ) . html ( interpolate (
ngettext ( '%(sel)s of %(cnt)s selected' , '%(sel)s of %(cnt)s selected' , sel ) , {
sel : sel ,
cnt : actions _icnt
} , true ) ) ;
$ ( options . allToggle ) . prop ( "checked" , function ( ) {
var value ;
if ( sel === actionCheckboxes . length ) {
value = true ;
showQuestion ( ) ;
} else {
value = false ;
clearAcross ( ) ;
}
return value ;
} ) ;
} ;
2018-10-12 03:11:57 +00:00
// Show counter by default
$ ( options . counterContainer ) . show ( ) ;
// Check state of checkboxes and reinit state if needed
$ ( this ) . filter ( ":checked" ) . each ( function ( i ) {
$ ( this ) . parent ( ) . parent ( ) . toggleClass ( options . selectedClass ) ;
updateCounter ( ) ;
if ( $ ( options . acrossInput ) . val ( ) === 1 ) {
showClear ( ) ;
}
} ) ;
$ ( options . allToggle ) . show ( ) . on ( 'click' , function ( ) {
checker ( $ ( this ) . prop ( "checked" ) ) ;
updateCounter ( ) ;
} ) ;
$ ( "a" , options . acrossQuestions ) . on ( 'click' , function ( event ) {
event . preventDefault ( ) ;
$ ( options . acrossInput ) . val ( 1 ) ;
showClear ( ) ;
} ) ;
$ ( "a" , options . acrossClears ) . on ( 'click' , function ( event ) {
event . preventDefault ( ) ;
$ ( options . allToggle ) . prop ( "checked" , false ) ;
clearAcross ( ) ;
checker ( 0 ) ;
updateCounter ( ) ;
} ) ;
lastChecked = null ;
$ ( actionCheckboxes ) . on ( 'click' , function ( event ) {
if ( ! event ) { event = window . event ; }
var target = event . target ? event . target : event . srcElement ;
if ( lastChecked && $ . data ( lastChecked ) !== $ . data ( target ) && event . shiftKey === true ) {
var inrange = false ;
$ ( lastChecked ) . prop ( "checked" , target . checked )
. parent ( ) . parent ( ) . toggleClass ( options . selectedClass , target . checked ) ;
$ ( actionCheckboxes ) . each ( function ( ) {
if ( $ . data ( this ) === $ . data ( lastChecked ) || $ . data ( this ) === $ . data ( target ) ) {
inrange = ( inrange ) ? false : true ;
}
if ( inrange ) {
$ ( this ) . prop ( "checked" , target . checked )
. parent ( ) . parent ( ) . toggleClass ( options . selectedClass , target . checked ) ;
}
} ) ;
}
$ ( target ) . parent ( ) . parent ( ) . toggleClass ( options . selectedClass , target . checked ) ;
lastChecked = target ;
updateCounter ( ) ;
} ) ;
$ ( 'form#changelist-form table#result_list tr' ) . on ( 'change' , 'td:gt(0) :input' , function ( ) {
list _editable _changed = true ;
} ) ;
$ ( 'form#changelist-form button[name="index"]' ) . on ( 'click' , function ( event ) {
if ( list _editable _changed ) {
return confirm ( gettext ( "You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost." ) ) ;
}
} ) ;
$ ( 'form#changelist-form input[name="_save"]' ) . on ( 'click' , function ( event ) {
var action _changed = false ;
$ ( 'select option:selected' , options . actionContainer ) . each ( function ( ) {
if ( $ ( this ) . val ( ) ) {
action _changed = true ;
}
} ) ;
if ( action _changed ) {
if ( list _editable _changed ) {
return confirm ( gettext ( "You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action." ) ) ;
} else {
return confirm ( gettext ( "You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button." ) ) ;
}
}
} ) ;
} ;
/* Setup plugin defaults */
$ . fn . actions . defaults = {
actionContainer : "div.actions" ,
counterContainer : "span.action-counter" ,
allContainer : "div.actions span.all" ,
acrossInput : "div.actions input.select-across" ,
acrossQuestions : "div.actions span.question" ,
acrossClears : "div.actions span.clear" ,
allToggle : "#action-toggle" ,
selectedClass : "selected"
} ;
$ ( document ) . ready ( function ( ) {
var $actionsEls = $ ( 'tr input.action-select' ) ;
if ( $actionsEls . length > 0 ) {
$actionsEls . actions ( ) ;
}
} ) ;
} ) ( django . jQuery ) ;