feat: Add show select button option to case search widget and related templates for improved case selection

This commit is contained in:
Ross
2026-04-27 23:10:20 +01:00
parent 7031942198
commit 4a787aa3eb
7 changed files with 39 additions and 12 deletions
@@ -480,7 +480,7 @@
{{ move_series_form.destination_case }}
<div class="small text-muted">Click any case row below to select the destination case.</div>
<div id="selected-move-case" class="small text-muted">No destination case selected.</div>
{% case_search_widget collection=None input_id='move-series-case-search-input' target_id='move-series-case-search-results' %}
{% case_search_widget collection=None input_id='move-series-case-search-input' target_id='move-series-case-search-results' show_select_button=True %}
<button type="button"
id="move-selected-series-submit"
class="btn btn-sm btn-outline-primary text-start"
@@ -28,8 +28,12 @@
</form>
<a class="btn btn-sm btn-outline-secondary ms-2" href="{% url 'atlas:case_detail' case.pk %}" target="_blank" rel="noopener">View</a>
{% else %}
{% if show_select_button %}
<button type="button" class="btn btn-sm btn-outline-primary case-select-btn" data-case-select="{{ case.pk }}">Select</button>
<a class="btn btn-sm btn-outline-secondary ms-2" href="{% url 'atlas:case_detail' case.pk %}">View</a>
{% else %}
<a class="btn btn-sm btn-outline-secondary" href="{% url 'atlas:case_detail' case.pk %}">View</a>
{% endif %}
{% endif %}
</div>
</div>
@@ -2,7 +2,7 @@
{% if cases and cases|length > 0 %}
<div class="list-group mb-2">
{% for case in cases %}
{% include 'atlas/partials/_case_search_item.html' with case=case collection=collection %}
{% include 'atlas/partials/_case_search_item.html' with case=case collection=collection show_select_button=show_select_button %}
{% endfor %}
</div>
{% else %}
@@ -15,7 +15,7 @@
<div class="small text-muted mb-1">Recently created</div>
<div class="list-group">
{% for case in recent_cases %}
{% include 'atlas/partials/_case_search_item.html' with case=case collection=collection %}
{% include 'atlas/partials/_case_search_item.html' with case=case collection=collection show_select_button=show_select_button %}
{% endfor %}
</div>
</div>
@@ -1,18 +1,23 @@
<div class="case-search-widget">
{% with input_id=input_id|default:'case-search-input' target_id=target_id|default:'case-search-results' %}
<label for="{{ input_id }}" class="form-label">Search cases</label>
{% if collection %}
<input type="hidden" id="{{ input_id }}-collection" name="collection" value="{{ collection.pk }}">
{% endif %}
{% if show_select_button %}
<input type="hidden" id="{{ input_id }}-show-select" name="show_select" value="1">
{% endif %}
<input id="{{ input_id }}" name="q" class="form-control" type="search"
placeholder="Type to search cases..."
hx-get="{% url 'atlas:case_search' %}"
hx-include="#{{ input_id }}"
{% if collection %}hx-vals='{"collection": "{{ collection.pk }}"}'{% endif %}
hx-include="closest .case-search-widget"
hx-target="#{{ target_id }}"
hx-trigger="keyup changed delay:400ms"
autocomplete="off">
<div id="{{ target_id }}" class="mt-2">
{# Render initial results (search + recent) on initial GET; HTMX searches will replace this div with partial results #}
{% include 'atlas/partials/case_search_results.html' with cases=cases recent_cases=recent_cases collection=collection %}
{% include 'atlas/partials/case_search_results.html' with cases=cases recent_cases=recent_cases collection=collection show_select_button=show_select_button %}
</div>
{% endwith %}
</div>
@@ -28,7 +33,7 @@
timer = setTimeout(function(){
try {
var q = encodeURIComponent(input.value || '');
var url = "{% url 'atlas:case_search' %}?q=" + q + ({% if collection %} "&collection={{ collection.pk }}" {% else %} '' {% endif %});
var url = "{% url 'atlas:case_search' %}?q=" + q + ({% if collection %} "&collection={{ collection.pk }}" {% else %} '' {% endif %}) + ({% if show_select_button %} "&show_select=1" {% else %} '' {% endif %});
var target = '#{{ target_id|default:"case-search-results" }}';
if (window.htmx && typeof window.htmx.ajax === 'function') {
window.htmx.ajax('GET', url, { target: target, swap: 'innerHTML' });
+1 -1
View File
@@ -132,7 +132,7 @@
</div>
<div class="modal-body">
<div class="mb-2">
{% case_search_widget collection=None input_id='case-search-input-modal' target_id='case-search-results-modal' %}
{% case_search_widget collection=None input_id='case-search-input-modal' target_id='case-search-results-modal' show_select_button=True %}
</div>
</div>
<div class="modal-footer">
+12 -1
View File
@@ -6,7 +6,17 @@ register = template.Library()
@register.inclusion_tag('atlas/partials/case_search_widget.html', takes_context=True)
def case_search_widget(context, collection=None, cases=None, recent_cases=None, input_id='case-search-input', target_id='case-search-results', selection_mode='single', action_url=None):
def case_search_widget(
context,
collection=None,
cases=None,
recent_cases=None,
input_id='case-search-input',
target_id='case-search-results',
selection_mode='single',
action_url=None,
show_select_button=False,
):
"""Render a reusable case search widget.
Parameters:
@@ -35,6 +45,7 @@ def case_search_widget(context, collection=None, cases=None, recent_cases=None,
'target_id': target_id,
'selection_mode': selection_mode,
'action_url': action_url,
'show_select_button': show_select_button,
}
+8 -1
View File
@@ -2137,6 +2137,7 @@ def case_search(request):
q = request.GET.get("q", "").strip()
collection_id = request.GET.get("collection")
show_select = str(request.GET.get("show_select", "")).lower() in ("1", "true", "yes", "on")
collection = None
if collection_id:
try:
@@ -2172,7 +2173,13 @@ def case_search(request):
return render(
request,
"atlas/partials/case_search_results.html",
{"cases": cases, "collection": collection, "recent_cases": recent_cases, "q": q},
{
"cases": cases,
"collection": collection,
"recent_cases": recent_cases,
"q": q,
"show_select_button": show_select,
},
)