diff options
| -rw-r--r-- | django/contrib/admin/static/admin/css/base.css | 89 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/rtl.css | 17 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/img/arrow-down.gif | bin | 80 -> 0 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/arrow-up.gif | bin | 838 -> 0 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_cog.gif | bin | 537 -> 0 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/sorting-icons.gif | bin | 0 -> 369 bytes | |||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_list_results.html | 106 | ||||
| -rw-r--r-- | django/contrib/admin/templatetags/admin_list.py | 27 | ||||
| -rw-r--r-- | docs/releases/1.4.txt | 13 |
9 files changed, 85 insertions, 167 deletions
diff --git a/django/contrib/admin/static/admin/css/base.css b/django/contrib/admin/static/admin/css/base.css index 89f2225c7c..5db94a7d25 100644 --- a/django/contrib/admin/static/admin/css/base.css +++ b/django/contrib/admin/static/admin/css/base.css @@ -309,77 +309,84 @@ tr.alt { /* SORTABLE TABLES */ +thead th { + padding: 0; + line-height: normal; +} + thead th a:link, thead th a:visited { color: #666; - display: block; } thead th.sorted { background: #c5c5c5 url(../img/nav-bg-selected.gif) top left repeat-x; } -table thead th.sorted a { - padding-right: 13px; +table thead th .text span { + padding: 2px 5px; + display:block; } -table thead th.ascending a { - background: url(../img/arrow-up.gif) right .4em no-repeat; +table thead th .text a { + display: block; + cursor: pointer; + padding: 2px 5px; } -table thead th.descending a { - background: url(../img/arrow-down.gif) right .4em no-repeat; +table thead th.sortable:hover { + background: white url(../img/nav-bg-reverse.gif) 0 -5px repeat-x; } -table thead th.sorted a span.text { - display: block; - float: left; - cursor: pointer; /* IE needs this */ +thead th.sorted a.sortremove { + visibility: hidden; } -table thead th.sorted a span.sortpos { - display: block; - float: right; - font-size: .6em; - text-align: right; - cursor: pointer; /* IE needs this */ +table thead th.sorted:hover a.sortremove { + visibility: visible; } -table thead th.sorted a img { - vertical-align: top; +table thead th.sorted .sortoptions { + display: block; + padding: 4px 5px 0 5px; + float: right; + text-align: right; } -table thead th.sorted a span.clear { - display: block; - clear: both; +table thead th.sorted .sortpriority { + font-size: .8em; + min-width: 12px; + text-align: center; + vertical-align: top; } -#sorting-popup-div { - display: none; - position: absolute; - background-color: white; - border: 1px solid #ddd; - z-index: 2000; /* more than filters on right */ +table thead th.sorted .sortoptions a { + width: 14px; + height: 12px; + display: inline-block; } -#sorting-popup-div table { - border-right: 0px; - border-left: 0px; +table thead th.sorted .sortoptions a.sortremove { + background: url(../img/sorting-icons.gif) -4px -5px no-repeat; } -#sorting-popup-div .reset { - text-align: center; +table thead th.sorted .sortoptions a.sortremove:hover { + background: url(../img/sorting-icons.gif) -4px -27px no-repeat; } -#sorting-popup-div .cancel { - font-size: 10px; - background: #e1e1e1 url(../img/nav-bg.gif) 0 50% repeat-x; - border-top: 1px solid #ddd; - text-align: center; +table thead th.sorted .sortoptions a.ascending { + background: url(../img/sorting-icons.gif) -5px -50px no-repeat; } -#sorting-popup-div .cancel a { - width: 100%; - display: block; +table thead th.sorted .sortoptions a.ascending:hover { + background: url(../img/sorting-icons.gif) -5px -72px no-repeat; +} + +table thead th.sorted .sortoptions a.descending { + background: url(../img/sorting-icons.gif) -5px -94px no-repeat; +} + +table thead th.sorted .sortoptions a.descending:hover { + background: url(../img/sorting-icons.gif) -5px -115px no-repeat; } /* ORDERABLE TABLES */ diff --git a/django/contrib/admin/static/admin/css/rtl.css b/django/contrib/admin/static/admin/css/rtl.css index fce6b1ab0e..029bf36f82 100644 --- a/django/contrib/admin/static/admin/css/rtl.css +++ b/django/contrib/admin/static/admin/css/rtl.css @@ -80,22 +80,7 @@ div.breadcrumbs { /* SORTABLE TABLES */ - -table thead th.sorted a { - padding-left: 13px; - padding-right: 0px; -} - -table thead th.ascending a, -table thead th.descending a { - background-position: left; -} - -table thead th.sorted a span.text { - float: right; -} - -table thead th.sorted a span.sortpos { +table thead th.sorted .sortoptions { float: left; } diff --git a/django/contrib/admin/static/admin/img/arrow-down.gif b/django/contrib/admin/static/admin/img/arrow-down.gif Binary files differdeleted file mode 100644 index a967b9fd55..0000000000 --- a/django/contrib/admin/static/admin/img/arrow-down.gif +++ /dev/null diff --git a/django/contrib/admin/static/admin/img/arrow-up.gif b/django/contrib/admin/static/admin/img/arrow-up.gif Binary files differdeleted file mode 100644 index 3fe4851399..0000000000 --- a/django/contrib/admin/static/admin/img/arrow-up.gif +++ /dev/null diff --git a/django/contrib/admin/static/admin/img/icon_cog.gif b/django/contrib/admin/static/admin/img/icon_cog.gif Binary files differdeleted file mode 100644 index e390ef2ef5..0000000000 --- a/django/contrib/admin/static/admin/img/icon_cog.gif +++ /dev/null diff --git a/django/contrib/admin/static/admin/img/sorting-icons.gif b/django/contrib/admin/static/admin/img/sorting-icons.gif Binary files differnew file mode 100644 index 0000000000..451aae5987 --- /dev/null +++ b/django/contrib/admin/static/admin/img/sorting-icons.gif diff --git a/django/contrib/admin/templates/admin/change_list_results.html b/django/contrib/admin/templates/admin/change_list_results.html index b1db6470c9..e3d4b2549a 100644 --- a/django/contrib/admin/templates/admin/change_list_results.html +++ b/django/contrib/admin/templates/admin/change_list_results.html @@ -11,15 +11,17 @@ <tr> {% for header in result_headers %} <th scope="col" {{ header.class_attrib }}> - {% if header.sortable %}<a href="{{ header.url_primary }}">{% endif %} - <span class="text">{{ header.text|capfirst }}</span> - {% if header.sortable %} - {% if header.sort_pos > 0 %}<span class="sortpos"> - {% if header.sort_pos == 1 %}<img id="primary-sort-icon" src="{% static "admin/img/icon_cog.gif" %}" alt="" /> {% endif %} - {{ header.sort_pos }}</span> - {% endif %} - <span class="clear"></span></a> - {% endif %} + {% if header.sortable %} + {% if header.sort_priority > 0 %} + <div class="sortoptions"> + <a class="sortremove" href="{{ header.url_remove }}" title="{% trans "Remove from sorting" %}"></a> + {% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktrans with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktrans %}">{{ header.sort_priority }}</span>{% endif %} + <a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% trans "Toggle sorting" %}"></a> + </div> + {% endif %} + {% endif %} + <div class="text">{% if header.sortable %}<a href="{{ header.url_primary }}">{{ header.text|capfirst }}</a>{% else %}<span>{{ header.text|capfirst }}</span>{% endif %}</div> + <div class="clear"></div> </th>{% endfor %} </tr> </thead> @@ -33,90 +35,4 @@ </tbody> </table> </div> - -{# Sorting popup: #} -<div id="sorting-popup-div"> -<table> - <caption> - {% trans "Sorting by:" %} - </caption> - <tbody> - {% for header in result_headers|dictsort:"sort_pos" %} - {% if header.sort_pos > 0 %} - <tr> - <td>{{ header.sort_pos }}</td> - <td>{{ header.text|capfirst }}</td> - <td>{% if header.ascending %}{% trans "ascending" %}{% else %}{% trans "descending" %}{% endif %}</td> - <td><a href="{{ header.url_toggle }}">{% trans "toggle" %}</a></td> - <td><a href="{{ header.url_remove }}">{% trans "remove" %}</a></td> - </tr> - {% endif %} - {% endfor %} - </tbody> -</table> -<div class="reset"><a href="{{ reset_sorting_url }}">{% trans "Reset sorting" %}</a></div> -<div class="cancel"><a href="javascript:void" id="sorting-popup-dismiss">{% trans "Cancel" %}</a></div> -</div> -<script type="text/javascript"> -<!-- -(function($) { - $(document).ready(function() { - var popup = $('#sorting-popup-div'); - var img = $('#primary-sort-icon'); - /* These next lines seems necessary to prime the popup: */ - popup.offset({left:0, top:-1000}); - popup.show(); - if ($.browser.msie) { - // Can't find a way to make IE autosize the div. - popup.width(300); - } - var popupWidth = popup.width(); - popup.hide(); - - var visible = false; - - var escHandler = function(ev) { - if (ev.which == 27) { - hidePopup(); - ev.preventDefault(); - } - }; - - var showPopup = function() { - var pos = img.offset(); - pos.top += img.height(); - if (pos.left + popupWidth > - $(window).width()) { - pos.left -= popupWidth; - } - popup.show(); - popup.offset(pos); - visible = true; - $(document).bind('keyup', escHandler); - }; - - var hidePopup = function() { - popup.hide(); - visible = false; - $(document).unbind('keyup', escHandler); - }; - - $('#primary-sort-icon').click(function(ev) { - ev.preventDefault(); - if (visible) { - hidePopup(); - } else { - showPopup(); - } - }); - - $('#sorting-popup-dismiss').click(function(ev) { - hidePopup(); - ev.preventDefault() - }); - }); -})(django.jQuery); -//--> -</script> - {% endif %} diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index 0f5eafc24d..ba3d1329ad 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -83,7 +83,6 @@ def result_headers(cl): """ ordering_field_columns = cl.get_ordering_field_columns() for i, field_name in enumerate(cl.list_display): - admin_order_field = None text, attr = label_for_field(field_name, cl.model, model_admin = cl.model_admin, return_attr = True @@ -95,25 +94,31 @@ def result_headers(cl): if field_name == 'action_checkbox': yield { "text": text, - "class_attrib": mark_safe(' class="action-checkbox-column"') + "class_attrib": mark_safe(' class="action-checkbox-column"'), + "sortable": False, } continue admin_order_field = getattr(attr, "admin_order_field", None) if not admin_order_field: # Not sortable - yield {"text": text} + yield { + "text": text, + "sortable": False, + } continue # OK, it is sortable if we got this far - th_classes = [] + th_classes = ['sortable'] order_type = '' new_order_type = 'asc' - sort_pos = 0 + sort_priority = 0 + sorted = False # Is it currently being sorted on? if i in ordering_field_columns: + sorted = True order_type = ordering_field_columns.get(i).lower() - sort_pos = ordering_field_columns.keys().index(i) + 1 + sort_priority = ordering_field_columns.keys().index(i) + 1 th_classes.append('sorted %sending' % order_type) new_order_type = {'asc': 'desc', 'desc': 'asc'}[order_type] @@ -144,8 +149,9 @@ def result_headers(cl): yield { "text": text, "sortable": True, + "sorted": sorted, "ascending": order_type == "asc", - "sort_pos": sort_pos, + "sort_priority": sort_priority, "url_primary": cl.get_query_string({ORDER_VAR: '.'.join(o_list_primary)}), "url_remove": cl.get_query_string({ORDER_VAR: '.'.join(o_list_remove)}), "url_toggle": cl.get_query_string({ORDER_VAR: '.'.join(o_list_toggle)}), @@ -260,13 +266,14 @@ def result_list(cl): Displays the headers and data list together """ headers = list(result_headers(cl)) + num_sorted_fields = 0 for h in headers: - # Sorting in templates depends on sort_pos attribute - h.setdefault('sort_pos', 0) + if h['sortable'] and h['sorted']: + num_sorted_fields += 1 return {'cl': cl, 'result_hidden_fields': list(result_hidden_fields(cl)), 'result_headers': headers, - 'reset_sorting_url': cl.get_query_string(remove=[ORDER_VAR]), + 'num_sorted_fields': num_sorted_fields, 'results': list(results(cl))} @register.inclusion_tag('admin/date_hierarchy.html') diff --git a/docs/releases/1.4.txt b/docs/releases/1.4.txt index 5b92f95f59..9cf268a869 100644 --- a/docs/releases/1.4.txt +++ b/docs/releases/1.4.txt @@ -360,13 +360,16 @@ Removed admin icons ~~~~~~~~~~~~~~~~~~~ As part of an effort to improve the performance and usability of the admin's -vertical and horizontal "filter" widgets, some icon files were removed and -grouped into a single sprite file (``selector-icons.gif``): +changelist sorting interface and of the admin's :attr:`horizontal +<django.contrib.admin.ModelAdmin.filter_horizontal>` and :attr:`vertical +<django.contrib.admin.ModelAdmin.filter_vertical>` "filter" widgets, some icon +files were removed and grouped into two sprite files, respectively: ``selector-add.gif``, ``selector-addall.gif``, ``selector-remove.gif``, ``selector-removeall.gif``, ``selector_stacked-add.gif`` and -``selector_stacked-remove.gif``. If you used those icons to customize the -admin then you will want to replace them with your own icons or retrieve them -from a previous release. +``selector_stacked-remove.gif`` into ``selector-icons.gif``; and +``arrow-up.gif`` and ``arrow-down.gif`` into ``sorting-icons.gif``. If you used +those icons to customize the admin then you will want to replace them with your +own icons or retrieve them from a previous release. Compatibility with old signed data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
