diff --git a/adminsortable/admin.py b/adminsortable/admin.py index 3bad43e..612947d 100644 --- a/adminsortable/admin.py +++ b/adminsortable/admin.py @@ -32,6 +32,8 @@ class SortableAdminBase(object): change_form_template_extends = 'admin/change_form.html' change_list_template_extends = 'admin/change_list.html' + after_sorting_js_callback_name = None + def changelist_view(self, request, extra_context=None): """ If the model that inherits Sortable has more than one object, @@ -215,7 +217,8 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): 'sortable_by_class_is_sortable': sortable_by_class_is_sortable, 'sortable_by_class_display_name': sortable_by_class_display_name, 'jquery_lib_path': jquery_lib_path, - 'csrf_cookie_name': getattr(settings, 'CSRF_COOKIE_NAME', 'csrftoken') + 'csrf_cookie_name': getattr(settings, 'CSRF_COOKIE_NAME', 'csrftoken'), + 'after_sorting_js_callback_name': self.after_sorting_js_callback_name }) return render(request, self.sortable_change_list_template, context) @@ -238,7 +241,8 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): 'change_form_template_extends': self.change_form_template_extends, 'has_sortable_tabular_inlines': self.has_sortable_tabular_inlines, 'has_sortable_stacked_inlines': self.has_sortable_stacked_inlines, - 'csrf_cookie_name': getattr(settings, 'CSRF_COOKIE_NAME', 'csrftoken') + 'csrf_cookie_name': getattr(settings, 'CSRF_COOKIE_NAME', 'csrftoken'), + 'after_sorting_js_callback_name': self.after_sorting_js_callback_name }) return super(SortableAdmin, self).change_view(request, object_id, diff --git a/adminsortable/static/adminsortable/js/admin.sortable.js b/adminsortable/templates/adminsortable/admin.sortable.html similarity index 83% rename from adminsortable/static/adminsortable/js/admin.sortable.js rename to adminsortable/templates/adminsortable/admin.sortable.html index ad4b099..15a42a1 100644 --- a/adminsortable/static/adminsortable/js/admin.sortable.js +++ b/adminsortable/templates/adminsortable/admin.sortable.html @@ -1,47 +1,54 @@ -(function($){ - - $(function() { - jQuery('.sortable').sortable({ - axis : 'y', - containment : 'parent', - tolerance : 'pointer', - items : 'li', - stop : function(event, ui) { - var indexes = [], - lineItems = ui.item.parent().find('> li'); - - lineItems.each(function(i) { - indexes.push($(this).find(':hidden[name="pk"]').val()); - }); - - $.ajax({ - url: ui.item.find('a.admin_sorting_url').attr('href'), - type: 'POST', - data: { indexes: indexes.join(',') }, - success: function() { - // set icons based on position - lineItems.each(function(index, element) { - var icon = $(element).find('a.admin_sorting_url .fa'); - icon.removeClass('fa-sort-desc fa-sort-asc fa-sort'); - - if (index === 0) { - icon.addClass('fa fa-sort-desc'); - } - else if (index == lineItems.length - 1) { - icon.addClass('fa fa-sort-asc'); - } - else { - icon.addClass('fa fa-sort'); - } - }); - - ui.item.effect('highlight', {}, 1000); - } - }); - } - }).click(function(e){ - e.preventDefault(); - }); - }); - -})(django.jQuery); + diff --git a/adminsortable/templates/adminsortable/change_form.html b/adminsortable/templates/adminsortable/change_form.html index 65763cb..c60b413 100644 --- a/adminsortable/templates/adminsortable/change_form.html +++ b/adminsortable/templates/adminsortable/change_form.html @@ -7,17 +7,17 @@ {% url 'admin:jsi18n' as jsi18nurl %} {% if has_sortable_tabular_inlines or has_sortable_stacked_inlines %} - + {% include 'adminsortable/csrf/jquery.django-csrf.html' with csrf_cookie_name=csrf_cookie_name %} {% endif %} {% if has_sortable_tabular_inlines %} - + {% include 'adminsortable/edit_inline/admin.sortable.stacked.inlines.html' with after_sorting_js_callback_name=after_sorting_js_callback_name %} {% endif %} {% if has_sortable_stacked_inlines %} - + {% include 'adminsortable/edit_inline/admin.sortable.tabular.inlines.html' with after_sorting_js_callback_name=after_sorting_js_callback_name %} {% endif %} {% endblock %} diff --git a/adminsortable/templates/adminsortable/change_list.html b/adminsortable/templates/adminsortable/change_list.html index 3be48ab..5fc6ca2 100644 --- a/adminsortable/templates/adminsortable/change_list.html +++ b/adminsortable/templates/adminsortable/change_list.html @@ -21,14 +21,31 @@ {% endblock %} {% block extrahead %} -{{ block.super }} -{{ media.js }} +{{ block.super }} +{{ media.js }} {% include 'adminsortable/csrf/jquery.django-csrf.html' with csrf_cookie_name=csrf_cookie_name %} - +{% include 'adminsortable/admin.sortable.html' with after_sorting_js_callback_name=after_sorting_js_callback_name %} + + {% endblock %} {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %} diff --git a/adminsortable/static/adminsortable/js/admin.sortable.stacked.inlines.js b/adminsortable/templates/adminsortable/edit_inline/admin.sortable.stacked.inlines.html similarity index 89% rename from adminsortable/static/adminsortable/js/admin.sortable.stacked.inlines.js rename to adminsortable/templates/adminsortable/edit_inline/admin.sortable.stacked.inlines.html index b6e21f4..f414272 100644 --- a/adminsortable/static/adminsortable/js/admin.sortable.stacked.inlines.js +++ b/adminsortable/templates/adminsortable/edit_inline/admin.sortable.stacked.inlines.html @@ -1,70 +1,78 @@ -(function($){ - - $(function() { - var sorting_urls = $(':hidden[name="admin_sorting_url"]'); - if (sorting_urls.length > 0) - { - var sortable_inline_groups = sorting_urls.closest('.inline-group') - var sortable_inline_rows = sortable_inline_groups.find('.inline-related'); - - sortable_inline_groups.addClass('sortable') - sortable_inline_rows.addClass('sortable'); - - sortable_inline_groups.sortable({ - axis : 'y', - containment : 'parent', - create: function(event, ui) { - $('.inline-related :checkbox').unbind(); - }, - tolerance : 'pointer', - items : '.inline-related', - stop : function(event, ui) - { - if ($('.inline-deletelink').length > 0) { - $(ui.sender).sortable('cancel'); - alert($('#localized_save_before_reorder_message').val()); - return false; - } - - var indexes = []; - ui.item.parent().children('.inline-related').each(function(i) - { - var index_value = $(this).find(':hidden[name$="-id"]').val(); - if (index_value !== "" && index_value !== undefined) { - indexes.push(index_value); - } - }); - - $.ajax({ - url: ui.item.parent().find(':hidden[name="admin_sorting_url"]').val(), - type: 'POST', - data: { indexes : indexes.join(',') }, - success: function() { - var fieldsets = ui.item.find('fieldset'), - highlightedSelector = fieldsets.filter('.collapsed').length === fieldsets.length ? 'h3' : '.form-row', - icons = ui.item.parent().find('h3 > .fa'); - - // set icons based on position - icons.removeClass('fa-sort-desc fa-sort-asc fa-sort'); - icons.each(function(index, element) { - var icon = $(element); - if (index === 0) { - icon.addClass('fa fa-sort-desc'); - } - else if (index == icons.length - 1) { - icon.addClass('fa fa-sort-asc'); - } - else { - icon.addClass('fa fa-sort'); - } - }); - - ui.item.find(highlightedSelector).effect('highlight', {}, 1000); - } - }); - } - }); - } - }); - -})(django.jQuery); + diff --git a/adminsortable/static/adminsortable/js/admin.sortable.tabular.inlines.js b/adminsortable/templates/adminsortable/edit_inline/admin.sortable.tabular.inlines.html similarity index 89% rename from adminsortable/static/adminsortable/js/admin.sortable.tabular.inlines.js rename to adminsortable/templates/adminsortable/edit_inline/admin.sortable.tabular.inlines.html index 376df13..d993b39 100644 --- a/adminsortable/static/adminsortable/js/admin.sortable.tabular.inlines.js +++ b/adminsortable/templates/adminsortable/edit_inline/admin.sortable.tabular.inlines.html @@ -1,69 +1,77 @@ -(function($){ - - $(function() { - var sorting_urls = $(':hidden[name="admin_sorting_url"]'); - if (sorting_urls.length) - { - var sortable_inline_group = sorting_urls.closest('.inline-group'); - var tabular_inline_rows = sortable_inline_group.find('.tabular table tbody tr'); - - tabular_inline_rows.addClass('sortable'); - - sortable_inline_group.find('.tabular.inline-related').sortable({ - axis : 'y', - containment : 'parent', - create: function(event, ui) { - $('td.delete :checkbox').unbind(); - }, - tolerance : 'pointer', - items : 'tr:not(.add-row)', - stop : function(event, ui) { - if ($('.inline-deletelink').length > 0) { - $(ui.sender).sortable('cancel'); - alert($('#localized_save_before_reorder_message').val()); - return false; - } - - var indexes = []; - ui.item.parent().children('tr').each(function(i) - { - var index_value = $(this).find('.original :input:first').val(); + diff --git a/sample_project/database/test_project.sqlite b/sample_project/database/test_project.sqlite index d439e4a..944cf22 100644 Binary files a/sample_project/database/test_project.sqlite and b/sample_project/database/test_project.sqlite differ diff --git a/sample_project/samples/admin.py b/sample_project/samples/admin.py index ec18418..fb1acf1 100644 --- a/sample_project/samples/admin.py +++ b/sample_project/samples/admin.py @@ -83,6 +83,9 @@ class ProjectAdmin(SortableAdmin): NonSortableCreditInline, NonSortableNoteInline ] list_display = ['__str__', 'category'] + after_sorting_js_callback_name = 'afterSortCallback' + sortable_change_list_template = 'adminsortable/custom_change_list.html' + sortable_change_form_template = "adminsortable/custom_change_form.html" admin.site.register(Project, ProjectAdmin) diff --git a/sample_project/templates/adminsortable/custom_change_form.html b/sample_project/templates/adminsortable/custom_change_form.html new file mode 100644 index 0000000..84f706c --- /dev/null +++ b/sample_project/templates/adminsortable/custom_change_form.html @@ -0,0 +1,15 @@ +{% extends "adminsortable/change_form.html" %} + +{% block extrahead %} + {{ block.super }} + + +{% endblock %} diff --git a/sample_project/templates/adminsortable/custom_change_list.html b/sample_project/templates/adminsortable/custom_change_list.html new file mode 100644 index 0000000..3fbc2b6 --- /dev/null +++ b/sample_project/templates/adminsortable/custom_change_list.html @@ -0,0 +1,15 @@ +{% extends 'adminsortable/change_list.html' %} + +{% block extrahead %} + {{ block.super }} + + +{% endblock %}