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. :param user: Personalize table display for the given user (optional). Has no effect if AnonymousUser is passed.
""" """
exempt_columns = () exempt_columns = ()
filterset_form = None
class Meta: class Meta:
attrs = { attrs = {

View File

@ -160,6 +160,11 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
# Render the objects table # Render the objects table
table = self.get_table(self.queryset, request, has_bulk_actions) 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 this is an HTMX request, return only the rendered table HTML
if request.htmx: if request.htmx:
if request.htmx.target != 'object_list': if request.htmx.target != 'object_list':
@ -175,7 +180,7 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
'model': model, 'model': model,
'table': table, 'table': table,
'actions': actions, '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), 'prerequisite_model': get_prerequisite_model(self.queryset),
**self.get_extra_context(request), **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 django_tables2 %}
{% load form_helpers %}
<table{% if table.attrs %} {{ table.attrs.as_html }}{% endif %}> <table{% if table.attrs %} {{ table.attrs.as_html }}{% endif %}>
{% if table.show_header %} {% if table.show_header %}
<thead> <thead>
@ -21,9 +22,13 @@
hx-target="closest .htmx-container" hx-target="closest .htmx-container"
{% if not table.embedded %}hx-push-url="true"{% endif %} {% if not table.embedded %}hx-push-url="true"{% endif %}
>{{ column.header }}</a> >{{ column.header }}</a>
{% include 'inc/table_header_filter_dropdown.html' with form_field=table.filterset_form|getfilterfield:column.name %}
</th> </th>
{% else %} {% 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 %} {% endif %}
{% endfor %} {% endfor %}
</tr> </tr>

View File

@ -2,6 +2,7 @@ from django import template
__all__ = ( __all__ = (
'getfield', 'getfield',
'getfilterfield',
'render_custom_fields', 'render_custom_fields',
'render_errors', 'render_errors',
'render_field', 'render_field',
@ -28,6 +29,15 @@ def getfield(form, fieldname):
return None 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') @register.filter(name='widget_type')
def widget_type(field): 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') @register.inclusion_tag('form_helpers/render_custom_fields.html')
def render_custom_fields(form): def render_custom_fields(form):
""" """