Spaces:
Runtime error
Runtime error
| /*global gettext, interpolate, ngettext*/ | |
| ; | |
| { | |
| const $ = django.jQuery; | |
| let lastChecked; | |
| $.fn.actions = function(opts) { | |
| const options = $.extend({}, $.fn.actions.defaults, opts); | |
| const actionCheckboxes = $(this); | |
| let list_editable_changed = false; | |
| const 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); | |
| }, | |
| checker = function(checked) { | |
| if (checked) { | |
| showQuestion(); | |
| } else { | |
| reset(); | |
| } | |
| $(actionCheckboxes).prop("checked", checked) | |
| .parent().parent().toggleClass(options.selectedClass, checked); | |
| }, | |
| updateCounter = function() { | |
| const sel = $(actionCheckboxes).filter(":checked").length; | |
| // data-actions-icnt is defined in the generated HTML | |
| // and contains the total amount of objects in the queryset | |
| const actions_icnt = $('.action-counter').data('actionsIcnt'); | |
| $(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() { | |
| let value; | |
| if (sel === actionCheckboxes.length) { | |
| value = true; | |
| showQuestion(); | |
| } else { | |
| value = false; | |
| clearAcross(); | |
| } | |
| return value; | |
| }); | |
| }; | |
| // 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().on('click', function() { | |
| checker($(this).prop("checked")); | |
| updateCounter(); | |
| }); | |
| $("a", options.acrossQuestions).on('click', function(event) { | |
| event.preventDefault(); | |
| $(options.acrossInput).val(1); | |
| showClear(); | |
| }); | |
| $("a", options.acrossClears).on('click', function(event) { | |
| event.preventDefault(); | |
| $(options.allToggle).prop("checked", false); | |
| clearAcross(); | |
| checker(0); | |
| updateCounter(); | |
| }); | |
| lastChecked = null; | |
| $(actionCheckboxes).on('click', function(event) { | |
| if (!event) { event = window.event; } | |
| const target = event.target ? event.target : event.srcElement; | |
| if (lastChecked && $.data(lastChecked) !== $.data(target) && event.shiftKey === true) { | |
| let 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').on('change', 'td:gt(0) :input', function() { | |
| list_editable_changed = true; | |
| }); | |
| $('form#changelist-form button[name="index"]').on('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"]').on('click', function(event) { | |
| let 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" | |
| }; | |
| $(document).ready(function() { | |
| const $actionsEls = $('tr input.action-select'); | |
| if ($actionsEls.length > 0) { | |
| $actionsEls.actions(); | |
| } | |
| }); | |
| } | |