This commit is contained in:
jeremystretch 2023-03-03 09:22:32 -05:00
parent 9336670fec
commit 48cb2036e9
5 changed files with 65 additions and 10 deletions

View File

@ -1,7 +1,9 @@
from django.shortcuts import render from django.shortcuts import render
from django.views.generic import View from django.views.generic import View
from dcim.filtersets import SiteFilterSet
from dcim.forms import SiteFilterForm from dcim.forms import SiteFilterForm
from dcim.models import Site
class ObjectSelectorView(View): class ObjectSelectorView(View):
@ -11,10 +13,31 @@ class ObjectSelectorView(View):
form_class = self._get_form_class() form_class = self._get_form_class()
form = form_class(request.GET) form = form_class(request.GET)
if '_search' in request.GET:
# Return only search results
model = self._get_model()
filterset = self._get_filterset_class()
queryset = model.objects.restrict(request.user)
if filterset:
queryset = filterset(request.GET, queryset, request=request).qs
return render(request, 'htmx/object_selector_results.html', {
'results': queryset,
})
return render(request, self.template_name, { return render(request, self.template_name, {
'form': form, 'form': form,
}) })
def _get_model(self):
# TODO: Determine model from request parameters
return Site
def _get_form_class(self): def _get_form_class(self):
# TODO: Determine form class from request parameters # TODO: Determine form class from model
return SiteFilterForm return SiteFilterForm
def _get_filterset_class(self):
# TODO: Determine filterset class from model
return SiteFilterSet

View File

@ -119,5 +119,5 @@
{% endblock %} {% endblock %}
{% block modals %} {% block modals %}
{% include 'inc/htmx_modal.html' %} {% include 'inc/htmx_modal.html' with size='lg' %}
{% endblock %} {% endblock %}

View File

@ -1,11 +1,30 @@
{% load form_helpers %} {% load form_helpers %}
<form>
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title">Object Selector</h5> <h5 class="modal-title">Object Selector</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body row">
{% render_form form %} <div class="col-3">
<ul class="nav nav-pills flex-column">
{% for field in form.visible_fields %}
<li class="nav-item">
<a class="nav-link" href="#" data-bs-toggle="tab" data-bs-target="#selector{{ forloop.counter }}">{{ field.label }}</a>
</li>
{% endfor %}
</ul>
</div>
<div class="col-9">
<form hx-get="{% url 'htmx_object_selector' %}" hx-target="#results_list">
<div class="tab-content p-1">
{% for field in form.visible_fields %}
<div class="tab-pane{% if forloop.first %} active{% endif %}" id="selector{{ forloop.counter }}" role="tabpanel">{% render_field field %}</div>
{% endfor %}
</div>
<div class="text-end">
<button type="submit" name="_search" value="true" class="btn btn-sm btn-primary">Submit</button>
</div> </div>
</form> </form>
<div id="results_list" class="mt-3"></div>
</div>
</div>

View File

@ -0,0 +1,13 @@
<div class="list-group">
{% for object in results %}
<a href="#" class="list-group-item list-group-item-action">
<h6 class="mb-1">
{{ object }}
{% if object.status %}{% badge object.get_status_display bg_color=object.get_status_color %}{% endif %}
</h6>
{% if object.description %}
<small>{{ object.description }}</small>
{% endif %}
</a>
{% endfor %}
</div>

View File

@ -1,5 +1,5 @@
<div class="modal fade" id="htmx-modal" tabindex="-1" aria-hidden="true"> <div class="modal fade" id="htmx-modal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog{% if size %} modal-{{ size }}{% endif %}">
<div class="modal-content" id="htmx-modal-content"> <div class="modal-content" id="htmx-modal-content">
{# Dynamic content goes here #} {# Dynamic content goes here #}
</div> </div>