mirror of
https://expo.survex.com/repositories/troggle/.git
synced 2024-11-26 09:11:54 +00:00
145 lines
4.8 KiB
JavaScript
145 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);
|