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