144 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | (function($) { | ||
|  | 	var lastChecked; | ||
|  | 
 | ||
|  | 	$.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(); | ||
|  | 			} | ||
|  | 			$(actionCheckboxes).prop("checked", checked) | ||
|  | 				.parent().parent().toggleClass(options.selectedClass, checked); | ||
|  | 		}, | ||
|  | 		updateCounter = function() { | ||
|  | 			var sel = $(actionCheckboxes).filter(":checked").length; | ||
|  | 			// _actions_icnt is defined in the generated HTML
 | ||
|  | 			// and contains the total amount of objects in the queryset
 | ||
|  | 			$(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; | ||
|  | 			}); | ||
|  | 		}, | ||
|  | 		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() { | ||
|  | 			checker($(this).prop("checked")); | ||
|  | 			updateCounter(); | ||
|  | 		}); | ||
|  | 		$("a", options.acrossQuestions).click(function(event) { | ||
|  | 			event.preventDefault(); | ||
|  | 			$(options.acrossInput).val(1); | ||
|  | 			showClear(); | ||
|  | 		}); | ||
|  | 		$("a", options.acrossClears).click(function(event) { | ||
|  | 			event.preventDefault(); | ||
|  | 			$(options.allToggle).prop("checked", false); | ||
|  | 			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; | ||
|  | 				$(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').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; | ||
|  | 			$('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" | ||
|  | 	}; | ||
|  | })(django.jQuery); |