Skip to content

Commit b342733

Browse files
fix: date hierarchy is reset on filter (#873) (#875)
1 parent cd0dc18 commit b342733

File tree

4 files changed

+34
-22
lines changed

4 files changed

+34
-22
lines changed

src/unfold/admin.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from django.contrib.admin import StackedInline as BaseStackedInline
88
from django.contrib.admin import TabularInline as BaseTabularInline
99
from django.contrib.admin import display, helpers
10-
from django.contrib.admin.options import IS_POPUP_VAR, TO_FIELD_VAR
1110
from django.contrib.admin.widgets import RelatedFieldWidgetWrapper
1211
from django.db import models
1312
from django.db.models import BLANK_CHOICE_DASH, Model
@@ -477,8 +476,6 @@ def changelist_view(
477476
{
478477
"actions_list": actions,
479478
"actions_row": actions_row,
480-
"to_field_var": TO_FIELD_VAR,
481-
"is_popup_var": IS_POPUP_VAR,
482479
}
483480
)
484481

src/unfold/templates/unfold/change_list_filter.html

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% load i18n admin_list %}
1+
{% load i18n admin_list unfold %}
22

33
<div id="changelist-filter" class="backdrop-blur-sm bg-opacity-80 bg-gray-900 flex inset-0 z-50 fixed {% if not cl.model_admin.list_filter_sheet %}2xl:bg-transparent 2xl:relative 2xl:!block 2xl:z-10{% endif %}" x-show="filterOpen">
44
<label for="show-filters" id="changelist-filter-close" class="flex-grow {% if not cl.model_admin.list_filter_sheet %}2xl:hidden{% endif %}" x-on:click="filterOpen = false"></label>
@@ -38,22 +38,7 @@ <h3 class="border-b flex font-semibold mb-4 px-4 py-4 text-font-important-light
3838
<div class="px-4{% if cl.model_admin.list_filter_submit %} {% endif %}">
3939
{% if cl.model_admin.list_filter_submit %}
4040
<form id="filter-form" method="get">
41-
{% if request.GET.q %}
42-
<input type="hidden" name="q" value="{{ request.GET.q }}">
43-
{% endif %}
44-
45-
{% if request.GET.o %}
46-
<input type="hidden" name="o" value="{{ request.GET.o }}">
47-
{% endif %}
48-
49-
{% if is_popup %}
50-
<input type="hidden" name="{{ is_popup_var }}" value="1">
51-
{% endif %}
52-
53-
{% if to_field %}
54-
<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}">
55-
{% endif %}
56-
41+
{% preserve_filters %}
5742
{% endif %}
5843

5944
{% for spec in cl.filter_specs %}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{% for key, value in params.items %}
2+
<input type="hidden" name="{{ key }}" value="{{ value }}">
3+
{% endfor %}

src/unfold/templatetags/unfold.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
from typing import Any, Dict, List, Mapping, Optional, Union
1+
from typing import Any, Dict, List, Mapping, Optional, Set, Union
22

33
from django import template
44
from django.contrib.admin.helpers import AdminForm, Fieldset
5+
from django.contrib.admin.views.main import ChangeList
56
from django.forms import Field
6-
from django.template import Library, Node, RequestContext, TemplateSyntaxError
7+
from django.http import HttpRequest
8+
from django.template import Context, Library, Node, RequestContext, TemplateSyntaxError
79
from django.template.base import NodeList, Parser, Token, token_kwargs
810
from django.template.loader import render_to_string
911
from django.utils.safestring import SafeText
@@ -224,3 +226,28 @@ def add_css_class(field: Field, classes: Union[list, tuple]) -> Field:
224226
field.field.widget.attrs["class"] = classes
225227

226228
return field
229+
230+
231+
@register.inclusion_tag(
232+
"unfold/templatetags/preserve_changelist_filters.html",
233+
takes_context=True,
234+
name="preserve_filters",
235+
)
236+
def preserve_changelist_filters(context: Context) -> Dict[str, Dict[str, str]]:
237+
"""
238+
Generate hidden input fields to preserve filters for POST forms.
239+
"""
240+
request: Optional[HttpRequest] = context.get("request")
241+
changelist: Optional[ChangeList] = context.get("cl")
242+
243+
if not request or not changelist:
244+
return {"params": {}}
245+
246+
used_params: Set[str] = {
247+
param for spec in changelist.filter_specs for param in spec.used_parameters
248+
}
249+
preserved_params: Dict[str, str] = {
250+
param: value for param, value in request.GET.items() if param not in used_params
251+
}
252+
253+
return {"params": preserved_params}

0 commit comments

Comments
 (0)