web/static/admin/js/actions.js
changeset 0 ecdfc63274bf
equal deleted inserted replaced
-1:000000000000 0:ecdfc63274bf
       
     1 (function($) {
       
     2 	$.fn.actions = function(opts) {
       
     3 		var options = $.extend({}, $.fn.actions.defaults, opts);
       
     4 		var actionCheckboxes = $(this);
       
     5 		var list_editable_changed = false;
       
     6 		checker = function(checked) {
       
     7 			if (checked) {
       
     8 				showQuestion();
       
     9 			} else {
       
    10 				reset();
       
    11 			}
       
    12 			$(actionCheckboxes).attr("checked", checked)
       
    13 				.parent().parent().toggleClass(options.selectedClass, checked);
       
    14 		}
       
    15 		updateCounter = function() {
       
    16 			var sel = $(actionCheckboxes).filter(":checked").length;
       
    17 			$(options.counterContainer).html(interpolate(
       
    18 			ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), {
       
    19 				sel: sel,
       
    20 				cnt: _actions_icnt
       
    21 			}, true));
       
    22 			$(options.allToggle).attr("checked", function() {
       
    23 				if (sel == actionCheckboxes.length) {
       
    24 					value = true;
       
    25 					showQuestion();
       
    26 				} else {
       
    27 					value = false;
       
    28 					clearAcross();
       
    29 				}
       
    30 				return value;
       
    31 			});
       
    32 		}
       
    33 		showQuestion = function() {
       
    34 			$(options.acrossClears).hide();
       
    35 			$(options.acrossQuestions).show();
       
    36 			$(options.allContainer).hide();
       
    37 		}
       
    38 		showClear = function() {
       
    39 			$(options.acrossClears).show();
       
    40 			$(options.acrossQuestions).hide();
       
    41 			$(options.actionContainer).toggleClass(options.selectedClass);
       
    42 			$(options.allContainer).show();
       
    43 			$(options.counterContainer).hide();
       
    44 		}
       
    45 		reset = function() {
       
    46 			$(options.acrossClears).hide();
       
    47 			$(options.acrossQuestions).hide();
       
    48 			$(options.allContainer).hide();
       
    49 			$(options.counterContainer).show();
       
    50 		}
       
    51 		clearAcross = function() {
       
    52 			reset();
       
    53 			$(options.acrossInput).val(0);
       
    54 			$(options.actionContainer).removeClass(options.selectedClass);
       
    55 		}
       
    56 		// Show counter by default
       
    57 		$(options.counterContainer).show();
       
    58 		// Check state of checkboxes and reinit state if needed
       
    59 		$(this).filter(":checked").each(function(i) {
       
    60 			$(this).parent().parent().toggleClass(options.selectedClass);
       
    61 			updateCounter();
       
    62 			if ($(options.acrossInput).val() == 1) {
       
    63 				showClear();
       
    64 			}
       
    65 		});
       
    66 		$(options.allToggle).show().click(function() {
       
    67 			checker($(this).attr("checked"));
       
    68 			updateCounter();
       
    69 		});
       
    70 		$("div.actions span.question a").click(function(event) {
       
    71 			event.preventDefault();
       
    72 			$(options.acrossInput).val(1);
       
    73 			showClear();
       
    74 		});
       
    75 		$("div.actions span.clear a").click(function(event) {
       
    76 			event.preventDefault();
       
    77 			$(options.allToggle).attr("checked", false);
       
    78 			clearAcross();
       
    79 			checker(0);
       
    80 			updateCounter();
       
    81 		});
       
    82 		lastChecked = null;
       
    83 		$(actionCheckboxes).click(function(event) {
       
    84 			if (!event) { var event = window.event; }
       
    85 			var target = event.target ? event.target : event.srcElement;
       
    86 			if (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey == true) {
       
    87 				var inrange = false;
       
    88 				$(lastChecked).attr("checked", target.checked)
       
    89 					.parent().parent().toggleClass(options.selectedClass, target.checked);
       
    90 				$(actionCheckboxes).each(function() {
       
    91 					if ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) {
       
    92 						inrange = (inrange) ? false : true;
       
    93 					}
       
    94 					if (inrange) {
       
    95 						$(this).attr("checked", target.checked)
       
    96 							.parent().parent().toggleClass(options.selectedClass, target.checked);
       
    97 					}
       
    98 				});
       
    99 			}
       
   100 			$(target).parent().parent().toggleClass(options.selectedClass, target.checked);
       
   101 			lastChecked = target;
       
   102 			updateCounter();
       
   103 		});
       
   104 		$('form#changelist-form table#result_list tr').find('td:gt(0) :input').change(function() {
       
   105 			list_editable_changed = true;
       
   106 		});
       
   107 		$('form#changelist-form button[name="index"]').click(function(event) {
       
   108 			if (list_editable_changed) {
       
   109 				return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."));
       
   110 			}
       
   111 		});
       
   112 		$('form#changelist-form input[name="_save"]').click(function(event) {
       
   113 			var action_changed = false;
       
   114 			$('div.actions select option:selected').each(function() {
       
   115 				if ($(this).val()) {
       
   116 					action_changed = true;
       
   117 				}
       
   118 			});
       
   119 			if (action_changed) {
       
   120 				if (list_editable_changed) {
       
   121 					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."));
       
   122 				} else {
       
   123 					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."));
       
   124 				}
       
   125 			}
       
   126 		});
       
   127 	}
       
   128 	/* Setup plugin defaults */
       
   129 	$.fn.actions.defaults = {
       
   130 		actionContainer: "div.actions",
       
   131 		counterContainer: "span.action-counter",
       
   132 		allContainer: "div.actions span.all",
       
   133 		acrossInput: "div.actions input.select-across",
       
   134 		acrossQuestions: "div.actions span.question",
       
   135 		acrossClears: "div.actions span.clear",
       
   136 		allToggle: "#action-toggle",
       
   137 		selectedClass: "selected"
       
   138 	}
       
   139 })(django.jQuery);