diff --git a/adminsortable/admin.py b/adminsortable/admin.py index 7c7bd6c..10281a6 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, @@ -206,7 +208,11 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): except AttributeError: verbose_name_plural = opts.verbose_name_plural - context = self.admin_site.each_context(request) + if VERSION <= (1, 7): + context = {} + else: + context = self.admin_site.each_context(request) + context.update({ 'title': u'Drag and drop {0} to change display order'.format( capfirst(verbose_name_plural)), @@ -218,7 +224,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) @@ -241,7 +248,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 95ff182..a965dbf 100644 --- a/adminsortable/templates/adminsortable/change_list.html +++ b/adminsortable/templates/adminsortable/change_list.html @@ -21,14 +21,14 @@ {% 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 %} 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 %}