feat: Refactor move series case selection logic with improved event handling and state synchronization

This commit is contained in:
Ross
2026-04-27 22:55:23 +01:00
parent bf12204c51
commit 61a83ed836
+43 -48
View File
@@ -493,6 +493,49 @@
Move selected series
</button>
</form>
<script>
(function () {
if (window.__moveSeriesCaseSelectionBound) return;
window.__moveSeriesCaseSelectionBound = true;
function syncMoveSeriesSubmitState() {
const form = document.getElementById('move-selected-series-form');
const hiddenInput = form ? form.querySelector("[name='destination_case']") : null;
const submitBtn = document.getElementById('move-selected-series-submit');
if (!hiddenInput || !submitBtn) return;
submitBtn.disabled = !hiddenInput.value;
}
document.body.addEventListener('case:selected', function (e) {
try {
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: <strong>' + caseTitle + ' (' + casePk + ')</strong>';
label.classList.remove('text-muted');
}
syncMoveSeriesSubmitState();
} catch (err) {
console.error('Move series case:selected handler error', err);
}
});
syncMoveSeriesSubmitState();
})();
</script>
{% else %}
<div class="text-muted small mt-2">Case move options are unavailable in this view.</div>
{% endif %}
@@ -1034,54 +1077,6 @@
detailsElement.addEventListener("toggle", toggleCheckboxes);
}
const moveSeriesForm = document.getElementById("move-selected-series-form");
if (moveSeriesForm) {
console.log("Move series form found, setting up event listeners");
const hiddenInput = moveSeriesForm.querySelector("[name='destination_case']");
const moveSubmitButton = document.getElementById("move-selected-series-submit");
const selectionLabel = document.getElementById("selected-move-case");
function syncMoveSeriesSubmitState() {
if (!moveSubmitButton || !hiddenInput) {
return;
}
moveSubmitButton.disabled = !hiddenInput.value;
}
function setSelectedDestination(casePk, caseTitle) {
if (!hiddenInput || !casePk) {
return;
}
hiddenInput.value = casePk;
if (selectionLabel) {
selectionLabel.innerHTML = "Selected destination: <strong>" + caseTitle + " (" + casePk + ")</strong>";
selectionLabel.classList.remove("text-muted");
}
syncMoveSeriesSubmitState();
}
// Mirror user_uploads pattern: listen at body level for case_search_widget selection events.
document.body.addEventListener("case:selected", async function(event) {
console.log("case:selected event received in case display block", event);
const detail = event.detail || {};
if (!detail.casePk) {
return;
}
// Ignore case selections from other widgets on the page.
//if (!event.target || !event.target.closest("#move-selected-series-form")) {
// return;
//}
const casePk = detail.casePk;
const caseTitle = detail.caseTitle || ("Case #" + casePk);
setSelectedDestination(casePk, caseTitle);
});
syncMoveSeriesSubmitState();
}
const modal = new bootstrap.Modal(document.getElementById("findingModal"));
const modalBody = document.getElementById("findingModalBody");