Skip to content

Commit 1fa69a6

Browse files
committed
WIP: htmx search for maintenance components
1 parent 96c81ee commit 1fa69a6

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

python/nav/web/maintenance/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
re_path(r'^active/$', views.active, name='maintenance-active'),
3333
re_path(r'^planned/$', views.planned, name='maintenance-planned'),
3434
re_path(r'^historic/$', views.historic, name='maintenance-historic'),
35+
re_path(r'^search/$', views.component_search, name='maintenance-component-search'),
3536
re_path(r'^new/$', views.edit, name='maintenance-new'),
3637
re_path(
3738
r'^new/(?P<start_time>\d{4}-\d{2}-\d{2})/$',

python/nav/web/maintenance/views.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,17 @@
2020
from datetime import datetime
2121

2222
from django.db import connection, transaction
23-
from django.db.models import Count, Q
23+
from django.db.models import Count, Model, Q
2424
from django.http import HttpResponseRedirect
2525
from django.shortcuts import get_object_or_404, redirect, render
2626
from django.urls import reverse
2727
from django.utils.safestring import mark_safe
2828

2929
import nav.maintengine
3030
from nav.django.utils import get_account
31-
from nav.models.manage import Netbox
31+
from nav.models.manage import Location, Netbox, NetboxGroup, Room
3232
from nav.models.msgmaint import MaintenanceComponent, MaintenanceTask
33+
from nav.models.service import Service
3334
from nav.web.maintenance.forms import (
3435
MaintenanceAddSingleNetbox,
3536
MaintenanceCalendarForm,
@@ -349,6 +350,29 @@ def edit(request, task_id=None, start_time=None, **_):
349350
)
350351

351352

353+
def component_search(request):
354+
"""HTMX endpoint for component searches from maintenance task form"""
355+
search = request.POST.get("search")
356+
results = {}
357+
searches: list[tuple[Model, Q]] = [
358+
(Location, Q(id__icontains=search)),
359+
(Room, Q(id__icontains=search)),
360+
(Netbox, Q(sysname__icontains=search)),
361+
(NetboxGroup, Q(id__icontains=search)),
362+
(Service, Q(handler__icontains=search) | Q(netbox__sysname__icontains=search)),
363+
]
364+
365+
for component_type, query in searches:
366+
component_result = component_type.objects.filter(query)
367+
if component_result:
368+
component_title = component_type._meta.verbose_name.title()
369+
results[component_title] = component_result
370+
371+
return render(
372+
request, 'maintenance/component-search-results-frag.html', {'results': results}
373+
)
374+
375+
352376
def add_box_to_maintenance(request):
353377
"""
354378
This view puts a Netbox on immediate, indefinite maintenance and
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{% if results %}
2+
{% for component_type, values in results.items %}
3+
{% if values %}
4+
<h4>{{ component_type }}</h4>
5+
<ul>
6+
{% for value in values %}
7+
<li>{{ value }}</li>
8+
{% endfor %}
9+
</ul>
10+
{% endif %}
11+
{% endfor %}
12+
{% else %}
13+
<strong>No hits</strong>
14+
{% endif %}

python/nav/web/templates/maintenance/new_task.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,20 @@ <h4>{{ heading }}</h4>
4545
<legend>Select components</legend>
4646
{{ quickselect }}
4747
</fieldset>
48+
49+
<h3>Search components
50+
</h3>
51+
<input class="form-control" type="search"
52+
name="search" placeholder="Begin Typing To Search for stuff..."
53+
hx-post="{% url 'maintenance-component-search' %}"
54+
hx-trigger="input changed delay:500ms, search"
55+
hx-target="#search-results"
56+
hx-indicator=".htmx-indicator">
57+
<span class="htmx-indicator">
58+
<img src="/static/images/select2/select2-spinner.gif"/> Searching...
59+
</span>
60+
<div id="search-results"></div>
61+
4862
</div>
4963

5064
<div class="large-4 columns">
@@ -81,6 +95,7 @@ <h4>{{ heading }}</h4>
8195
value="Remove selected" disabled="disabled" class="button small secondary"/>
8296
{% endif %}
8397
</fieldset>
98+
8499
</div> {# column #}
85100
</div> {# row #}
86101

0 commit comments

Comments
 (0)