mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-28 19:36: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.
|
: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 = {
|
||||||
|
@ -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),
|
||||||
}
|
}
|
||||||
|
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 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>
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user