Preliminary work on 9583.

This commit is contained in:
Daniel Sheppard 2024-02-02 15:49:32 -06:00
parent 93b77cb4f0
commit 4c39516253
5 changed files with 52 additions and 2 deletions

View File

@ -38,6 +38,7 @@ class BaseTable(tables.Table):
:param user: Personalize table display for the given user (optional). Has no effect if AnonymousUser is passed.
"""
exempt_columns = ()
filterset_form = None
class Meta:
attrs = {

View File

@ -160,6 +160,11 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
# Render the objects table
table = self.get_table(self.queryset, request, has_bulk_actions)
filterset_form = self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None
if hasattr(self, 'filterset_form'):
table.filterset_form = filterset_form
# If this is an HTMX request, return only the rendered table HTML
if request.htmx:
if request.htmx.target != 'object_list':
@ -175,7 +180,7 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
'model': model,
'table': table,
'actions': actions,
'filter_form': self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None,
'filter_form': filterset_form,
'prerequisite_model': get_prerequisite_model(self.queryset),
**self.get_extra_context(request),
}

View File

@ -0,0 +1,11 @@
{% load form_helpers %}
{% if form_field %}
<div class="dropdown" style="display: inline;">
<a href="#" classs="btn dropdown-toggle" data-bs-toggle="dropdown" data-bs-auto-close="outside">
<i class="mdi mdi-filter-settings" style="font-size: 1.25rem;"> </i>
</a>
<div class="dropdown-menu dropdown-menu-end">
{% render_filter_field form_field %}
</div>
</div>
{% endif %}

View File

@ -1,4 +1,5 @@
{% load django_tables2 %}
{% load form_helpers %}
<table{% if table.attrs %} {{ table.attrs.as_html }}{% endif %}>
{% if table.show_header %}
<thead>
@ -21,9 +22,13 @@
hx-target="closest .htmx-container"
{% if not table.embedded %}hx-push-url="true"{% endif %}
>{{ column.header }}</a>
{% include 'inc/table_header_filter_dropdown.html' with form_field=table.filterset_form|getfilterfield:column.name %}
</th>
{% else %}
<th {{ column.attrs.th.as_html }}>{{ column.header }}</th>
<th {{ column.attrs.th.as_html }}>
{{ column.header }}
{% include 'inc/table_header_filter_dropdown.html' with form_field=table.filterset_form|getfilterfield:column.name %}
</th>
{% endif %}
{% endfor %}
</tr>

View File

@ -2,6 +2,7 @@ from django import template
__all__ = (
'getfield',
'getfilterfield',
'render_custom_fields',
'render_errors',
'render_field',
@ -28,6 +29,15 @@ def getfield(form, fieldname):
return None
@register.filter()
def getfilterfield(form, fieldname):
field = getfield(form, f'{fieldname}')
if field is not None:
return field
else:
return getfield(form, f'{fieldname}_id')
@register.filter(name='widget_type')
def widget_type(field):
"""
@ -57,6 +67,24 @@ def render_field(field, bulk_nullable=False, label=None):
}
@register.inclusion_tag('form_helpers/render_field.html')
def render_filter_field(field, bulk_nullable=False, label=None):
"""
Render a single form field from template
"""
if hasattr(field.field, 'widget'):
field.field.widget.attrs.update({
'hx-get': None,
'hx-target': '#object_list',
'hx-trigger': 'hidden.bs.dropdown from:closest .dropdown'
})
return {
'field': field,
'label': None,
'bulk_nullable': bulk_nullable,
}
@register.inclusion_tag('form_helpers/render_custom_fields.html')
def render_custom_fields(form):
"""