2013-08-17 21:12:21 +10:00
( function ( $ ) {
$ . fn . actions = function ( opts ) {
var options = $ . extend ( { } , $ . fn . actions . defaults , opts ) ;
var actionCheckboxes = $ ( this ) ;
var list _editable _changed = false ;
var checker = function ( checked ) {
if ( checked ) {
showQuestion ( ) ;
} else {
reset ( ) ;
}
2014-12-02 16:20:52 +10:00
$ ( actionCheckboxes ) . prop ( "checked" , checked )
2013-08-17 21:12:21 +10:00
. parent ( ) . parent ( ) . toggleClass ( options . selectedClass , checked ) ;
} ,
updateCounter = function ( ) {
var sel = $ ( actionCheckboxes ) . filter ( ":checked" ) . length ;
$ ( options . counterContainer ) . html ( interpolate (
ngettext ( '%(sel)s of %(cnt)s selected' , '%(sel)s of %(cnt)s selected' , sel ) , {
sel : sel ,
cnt : _actions _icnt
} , true ) ) ;
2014-12-02 16:20:52 +10:00
$ ( options . allToggle ) . prop ( "checked" , function ( ) {
2013-08-17 21:12:21 +10:00
if ( sel == actionCheckboxes . length ) {
value = true ;
showQuestion ( ) ;
} else {
value = false ;
clearAcross ( ) ;
}
return value ;
} ) ;
} ,
showQuestion = function ( ) {
$ ( 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 ( ) {
reset ( ) ;
$ ( options . acrossInput ) . val ( 0 ) ;
$ ( options . actionContainer ) . removeClass ( options . selectedClass ) ;
} ;
// 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 ( ) . click ( function ( ) {
2014-12-02 16:20:52 +10:00
checker ( $ ( this ) . prop ( "checked" ) ) ;
2013-08-17 21:12:21 +10:00
updateCounter ( ) ;
} ) ;
$ ( "div.actions span.question a" ) . click ( function ( event ) {
event . preventDefault ( ) ;
$ ( options . acrossInput ) . val ( 1 ) ;
showClear ( ) ;
} ) ;
$ ( "div.actions span.clear a" ) . click ( function ( event ) {
event . preventDefault ( ) ;
2014-12-02 16:20:52 +10:00
$ ( options . allToggle ) . prop ( "checked" , false ) ;
2013-08-17 21:12:21 +10:00
clearAcross ( ) ;
checker ( 0 ) ;
updateCounter ( ) ;
} ) ;
lastChecked = null ;
$ ( actionCheckboxes ) . 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 ;
2014-12-02 16:20:52 +10:00
$ ( lastChecked ) . prop ( "checked" , target . checked )
2013-08-17 21:12:21 +10:00
. 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 ) {
2014-12-02 16:20:52 +10:00
$ ( this ) . prop ( "checked" , target . checked )
2013-08-17 21:12:21 +10:00
. 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' ) . find ( 'td:gt(0) :input' ) . change ( function ( ) {
list _editable _changed = true ;
} ) ;
$ ( 'form#changelist-form button[name="index"]' ) . 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"]' ) . click ( function ( event ) {
var action _changed = false ;
$ ( 'div.actions select option:selected' ) . 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"
} ;
} ) ( django . jQuery ) ;