mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-28 11:26:26 -06:00
Preliminary work on 9583.
This commit is contained in:
parent
93b77cb4f0
commit
4c39516253
@ -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 = {
|
||||
|
@ -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),
|
||||
}
|
||||
|
11
netbox/templates/inc/table_header_filter_dropdown.html
Normal file
11
netbox/templates/inc/table_header_filter_dropdown.html
Normal 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 %}
|
@ -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>
|
||||
|
@ -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):
|
||||
"""
|
||||
|
Loading…
Reference in New Issue
Block a user