Skip to content

Commit 3098d78

Browse files
RhinoWstephane
authored andcommitted
Option for first click to sort descending
e.g. {% anchor some_date _("Date") desc %}
1 parent d82c914 commit 3098d78

File tree

11 files changed

+138
-22
lines changed

11 files changed

+138
-22
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Webstack-django-sorting Changelog
22
=================================
33

4+
vX.X.X
5+
------
6+
7+
- Set default sort order on first click of a column
8+
49
v2.0.0
510
------
611

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,11 @@ The project provides examples of integration with Django and Jinja2 templates.
106106
</tr>
107107
```
108108

109+
An optional 3rd argument allows you to sort first by descending
110+
(e.g. show most recent dates first) `{% anchor some_date _("Date") desc %}`
111+
109112
If your application doesn't support internationalization, you can use a
110-
simple `{% anchor first_name Name %}`.
113+
simple `{% anchor first_name Name %}`.
111114

112115
## For Jinja2 templates
113116

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<title>Default list</title>
5+
<link rel="stylesheet" href="{{ static("css/style.css") }}" />
6+
</head>
7+
<body>
8+
<h2>List of files</h2>
9+
<table>
10+
<thead>
11+
<tr>
12+
<th>{{ sorting_anchor(request, "id", "File ID") }}</th>
13+
<th>{{ sorting_anchor(request, "filename", "Filename") }}</th>
14+
<th>{{ sorting_anchor(request, "created_on", "Date", "desc") }}</th>
15+
<th>{{ sorting_anchor(request, "size", "Size") }}</th>
16+
<th>{{ sorting_anchor(request, "order", "Order", "desc") }}</th>
17+
<th>{{ sorting_anchor(request, "is_secret", "Secret?") }}</th>
18+
</tr>
19+
</thead>
20+
<tbody>
21+
{% for secret_file in sort_queryset(request, secret_files) %}
22+
<tr>
23+
<td>{{ secret_file.id }}</td>
24+
<td>{{ secret_file.filename }}</td>
25+
<td>{{ secret_file.created_on }}</td>
26+
<td>{{ secret_file.size }}</td>
27+
<td>{{ secret_file.order }}</td>
28+
<td>{{ secret_file.is_secret|yesno() }}</td>
29+
</tr>
30+
{% endfor %}
31+
</tbody>
32+
</table>
33+
</body>
34+
</html>

src/testproj/testproj/testapp/templates/home.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ <h2>Test views with Django template</h2>
1111
<li>
1212
<a href="{% url 'secret_list' %}">List of secrets</a>
1313
</li>
14+
<li>
15+
<a href="{% url 'secret_list_some_desc' %}">List of secrets - date and order descending</a>
16+
</li>
1417
<li>
1518
<a href="{% url 'nulls_first' %}">Nulls first</a>
1619
</li>
@@ -23,6 +26,9 @@ <h2>Test views with Jinja template</h2>
2326
<li>
2427
<a href="{% url 'jinja_secret_list' %}">List of secrets</a>
2528
</li>
29+
<li>
30+
<a href="{% url 'jinja_secret_list_some_desc' %}">List of secrets - date and order descending</a>
31+
</li>
2632
<li>
2733
<a href="{% url 'jinja_nulls_first' %}">Nulls first</a>
2834
</li>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{% load static sorting_tags %}
2+
<!DOCTYPE html>
3+
<html lang="en">
4+
<head>
5+
<title>Default list</title>
6+
<link rel="stylesheet" href="{% static 'css/style.css' %}" />
7+
</head>
8+
<body>
9+
<h2>List of files</h2>
10+
<p>In this example the Date and Order field will be sorted DESC on first click</p>
11+
{% autosort secret_files %}
12+
<table>
13+
<thead>
14+
<tr>
15+
<th>{% anchor id "ID" %}</th>
16+
<th>{% anchor filename "Filename" %}</th>
17+
<th>{% anchor created_on "Date" desc %}</th>
18+
<th>{% anchor size "Size" %}</th>
19+
<!-- Deliberately "desc" to test common mistake, can be either "desc" or desc, should handle both -->
20+
<th>{% anchor order "Order" "desc" %}</th>
21+
<th>{% anchor is_secret "Secret?" %}</th>
22+
</tr>
23+
</thead>
24+
<tbody>
25+
{% for secret_file in secret_files %}
26+
<tr>
27+
<td>{{ secret_file.id }}</td>
28+
<td>{{ secret_file.filename }}</td>
29+
<td>{{ secret_file.created_on }}</td>
30+
<td>{{ secret_file.size }}</td>
31+
<td>{{ secret_file.order }}</td>
32+
<td>{{ secret_file.is_secret|yesno }}</td>
33+
</tr>
34+
{% endfor %}
35+
</tbody>
36+
</table>
37+
</body>
38+
</html>

src/testproj/testproj/testapp/views.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ def secret_list(request):
1212
request, "secret_list.html", {"secret_files": models.SecretFile.objects.all()}
1313
)
1414

15+
def secret_list_some_desc(request):
16+
return render(
17+
request, "secret_list_some_desc.html", {"secret_files": models.SecretFile.objects.all()}
18+
)
1519

1620
def secret_list_nulls_first(request):
1721
return render(
@@ -34,6 +38,10 @@ def jinja_secret_list(request):
3438
request, "secret_list.jinja2", {"secret_files": models.SecretFile.objects.all()}
3539
)
3640

41+
def jinja_secret_list_some_desc(request):
42+
return render(
43+
request, "secret_list_some_desc.jinja2", {"secret_files": models.SecretFile.objects.all()}
44+
)
3745

3846
def jinja_secret_list_nulls_first(request):
3947
return render(

src/testproj/testproj/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
urlpatterns = [
77
path("", views.home, name="home"),
88
path("list", views.secret_list, name="secret_list"),
9+
path("list_some_desc", views.secret_list_some_desc, name="secret_list_some_desc"),
910
path("nulls/first", views.secret_list_nulls_first, name="nulls_first"),
1011
path("nulls/last", views.secret_list_nulls_last, name="nulls_last"),
1112
path("jinja/list", views.jinja_secret_list, name="jinja_secret_list"),
13+
path("jinja/list_some_desc", views.jinja_secret_list_some_desc, name="jinja_secret_list_some_desc"),
1214
path(
1315
"jinja/nulls/first",
1416
views.jinja_secret_list_nulls_first,

src/webstack_django_sorting/common.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,30 @@
99
from . import settings
1010

1111

12-
def render_sort_anchor(request, field_name, title):
12+
def render_sort_anchor(request, field_name, title, default_direction):
1313
get_params = request.GET.copy()
14-
sort_by = get_params.get("sort", None)
14+
sort_by = get_params.get("sort", None)
1515
if sort_by == field_name:
16-
# Render anchor link to next direction
17-
current_direction = settings.SORT_DIRECTIONS.get(
18-
get_params.get("dir", ""), settings.SORT_DIRECTIONS[""]
19-
)
20-
icon = current_direction["icon"]
21-
next_direction_code = current_direction["next"]
16+
17+
dir = get_params.get("dir")
18+
19+
if dir == "asc":
20+
icon = settings.DEFAULT_SORT_UP
21+
elif dir == "desc":
22+
icon = settings.DEFAULT_SORT_DOWN
23+
else:
24+
icon = ""
25+
26+
# Mapping of direction transitions based on the default sort direction
27+
transition_map = {
28+
"asc": {"asc": "desc", "desc": "", "": "asc"},
29+
"desc": {"desc": "asc", "asc": "", "": "desc"}
30+
}
31+
next_direction_code = transition_map[default_direction].get(dir, "")
32+
2233
else:
2334
icon = ""
24-
next_direction_code = "asc"
35+
next_direction_code = default_direction
2536

2637
# Not usual dict (can't update to replace)
2738
get_params["sort"] = field_name

src/webstack_django_sorting/jinja2_globals.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from . import common
44

55

6-
def sorting_anchor(request, field_name, title):
7-
return Markup(common.render_sort_anchor(request, field_name, title))
6+
def sorting_anchor(request, field_name, title, default_sort_order="asc"):
7+
return Markup(common.render_sort_anchor(request, field_name, title, default_sort_order))
88

99

1010
def sort_queryset(request, queryset, **context_var):

src/webstack_django_sorting/settings.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,4 @@
22

33
DEFAULT_SORT_UP = getattr(settings, "DEFAULT_SORT_UP", " &uarr;")
44
DEFAULT_SORT_DOWN = getattr(settings, "DEFAULT_SORT_DOWN", " &darr;")
5-
INVALID_FIELD_RAISES_404 = getattr(settings, "SORTING_INVALID_FIELD_RAISES_404", False)
6-
7-
SORT_DIRECTIONS = {
8-
"asc": {"icon": DEFAULT_SORT_UP, "next": "desc"},
9-
"desc": {"icon": DEFAULT_SORT_DOWN, "next": ""},
10-
"": {"icon": "", "next": "asc"},
11-
}
5+
INVALID_FIELD_RAISES_404 = getattr(settings, "SORTING_INVALID_FIELD_RAISES_404", False)

0 commit comments

Comments
 (0)