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