From 7031942198910157c99eaef2283d30d0541a066b Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 27 Apr 2026 23:07:06 +0100 Subject: [PATCH] feat: Enhance case selection functionality with dedicated select button and improved event handling --- atlas/templates/atlas/case_display_block.html | 79 ++++++++++++++----- .../atlas/partials/_case_search_item.html | 3 +- .../atlas/partials/case_search_widget.html | 10 ++- 3 files changed, 69 insertions(+), 23 deletions(-) diff --git a/atlas/templates/atlas/case_display_block.html b/atlas/templates/atlas/case_display_block.html index a0462602..c3455ab9 100755 --- a/atlas/templates/atlas/case_display_block.html +++ b/atlas/templates/atlas/case_display_block.html @@ -1,4 +1,3 @@ - {% load case_widgets %} {% partialdef case-series %} @@ -475,6 +474,7 @@
Move selected series to another case + aaoecuthsaoehntu {% if move_series_form %}
{{ move_series_form.destination_case }} @@ -498,6 +498,30 @@ if (window.__moveSeriesCaseSelectionBound) return; window.__moveSeriesCaseSelectionBound = true; + function applyMoveCaseSelection(casePk, caseTitle) { + if (!casePk) return; + + const form = document.getElementById('move-selected-series-form'); + const hiddenInput = form ? form.querySelector("[name='destination_case']") : null; + const label = document.getElementById('selected-move-case'); + const results = document.getElementById('move-series-case-search-results'); + if (!hiddenInput) return; + + hiddenInput.value = casePk; + if (label) { + label.innerHTML = 'Selected destination: ' + caseTitle + ' (' + casePk + ')'; + label.classList.remove('text-muted'); + } + + if (results) { + results.querySelectorAll('.list-group-item[data-case-pk]').forEach(function (item) { + item.classList.toggle('active', String(item.getAttribute('data-case-pk')) === String(casePk)); + }); + } + + syncMoveSeriesSubmitState(); + } + function syncMoveSeriesSubmitState() { const form = document.getElementById('move-selected-series-form'); const hiddenInput = form ? form.querySelector("[name='destination_case']") : null; @@ -506,29 +530,44 @@ submitBtn.disabled = !hiddenInput.value; } - document.body.addEventListener('case:selected', async function (e) { + function selectFromRow(row) { + if (!row) return; + const casePk = row.getAttribute('data-case-pk'); + const caseTitleEl = row.querySelector('h6'); + const caseTitle = caseTitleEl ? caseTitleEl.textContent.trim() : ('Case #' + casePk); + applyMoveCaseSelection(casePk, caseTitle); + } + + // Hard fallback: capture-phase click listener scoped to this widget results. + document.addEventListener('click', function (e) { + try { + const row = e.target.closest('#move-series-case-search-results .list-group-item[data-case-pk]'); + if (!row) return; + if (e.target.closest('a,button,form,input')) return; + selectFromRow(row); + } catch (err) { + console.error('Move series capture click handler error', err); + } + }, true); + + // Mirror uploads-style delegated click handling directly on rows. + document.body.addEventListener('click', function (e) { + try { + const item = e.target.closest('#move-series-case-search-results .list-group-item[data-case-pk]'); + if (!item) return; + if (e.target.closest('a,button,form,input')) return; + selectFromRow(item); + } catch (err) { + console.error('Move series row click handler error', err); + } + }); + + document.body.addEventListener('case:selected', function (e) { try { - console.log('Received case:selected event', e); const detail = e.detail || {}; const casePk = detail.casePk; const caseTitle = detail.caseTitle || ('Case #' + casePk); - if (!casePk) return; - - // Only react to selections from this move panel's widget. - if (!e.target || !e.target.closest('#move-selected-series-form')) return; - - const form = document.getElementById('move-selected-series-form'); - const hiddenInput = form ? form.querySelector("[name='destination_case']") : null; - const label = document.getElementById('selected-move-case'); - if (!hiddenInput) return; - - hiddenInput.value = casePk; - if (label) { - label.innerHTML = 'Selected destination: ' + caseTitle + ' (' + casePk + ')'; - label.classList.remove('text-muted'); - } - - syncMoveSeriesSubmitState(); + applyMoveCaseSelection(casePk, caseTitle); } catch (err) { console.error('Move series case:selected handler error', err); } diff --git a/atlas/templates/atlas/partials/_case_search_item.html b/atlas/templates/atlas/partials/_case_search_item.html index 81141338..1803f415 100644 --- a/atlas/templates/atlas/partials/_case_search_item.html +++ b/atlas/templates/atlas/partials/_case_search_item.html @@ -28,7 +28,8 @@
View {% else %} - View + + View {% endif %} diff --git a/atlas/templates/atlas/partials/case_search_widget.html b/atlas/templates/atlas/partials/case_search_widget.html index 351cd8f7..e4edb5f0 100644 --- a/atlas/templates/atlas/partials/case_search_widget.html +++ b/atlas/templates/atlas/partials/case_search_widget.html @@ -60,8 +60,14 @@ targetEl.addEventListener('click', function(e){ var item = e.target.closest('.list-group-item'); if (!item || !targetEl.contains(item)) return; - // Ignore clicks on interactive elements inside the item (links, buttons, forms, inputs) - if (e.target.closest('a,button,form,input')) return; + + // Explicit select action button should always select the row. + if (e.target.closest('.case-select-btn')) { + e.preventDefault(); + } else { + // Ignore other interactive elements inside the item (links, buttons, forms, inputs) + if (e.target.closest('a,button,form,input')) return; + } var casePk = item.getAttribute('data-case-pk'); if (!casePk) {