Refactor display set modal loading functions for improved readability and error handling

This commit is contained in:
Ross
2026-03-23 10:34:03 +00:00
parent 73a364fd44
commit 077bd3ed87
+81 -74
View File
@@ -1200,34 +1200,88 @@
const dsModalBody = document.getElementById("displaysetModalBody");
const dsFullscreenModal = new bootstrap.Modal(document.getElementById("displaysetFullscreenModal"));
// Loader functions: can be called directly on reload
async function loadDisplaysetModal(url, dsId) {
if (!url && dsId) url = `/atlas/${dsId}/display_sets/modal`;
if (!url) return;
dsModalBody.innerHTML = "<p>Loading...</p>";
try {
const resp = await fetch(url);
const html = await resp.text();
dsModalBody.innerHTML = html;
try {
const fsBtn = document.querySelector('.displayset-fullscreen-btn');
if (fsBtn) {
fsBtn.dataset.url = url;
if (dsId) fsBtn.dataset.dsId = dsId;
}
} catch (e) { console.warn(e); }
try { setUrlParam('displayset', dsId); } catch (e) {}
setTimeout(function () { try { window.mountDicomViewers(); } catch (e) { console.warn('mountDicomViewers not available', e); } }, 500);
dsModal.show();
} catch (error) {
console.error('Error loading display set details:', error);
dsModalBody.innerHTML = "<p>Failed to load display set.</p>";
}
}
async function loadDisplaysetFullscreen(url, dsId) {
if (!url && dsId) url = `/atlas/${dsId}/display_sets/modal`;
if (!url) return;
document.getElementById('displaysetFullscreenLeft').innerHTML = '<p style="color:#fff; padding:1rem;">Loading viewer...</p>';
document.getElementById('displaysetFullscreenRight').innerHTML = '<p>Loading details...</p>';
try {
const resp = await fetch(url);
const html = await resp.text();
const tmp = document.createElement('div');
tmp.innerHTML = html;
const viewer = tmp.querySelector('.dicom-viewer-root');
if (viewer) {
const left = document.getElementById('displaysetFullscreenLeft');
left.innerHTML = '';
left.appendChild(viewer);
try { viewer.style.height='100%'; viewer.style.minHeight='100%'; viewer.style.width='100%'; viewer.style.display='block'; viewer.style.flex='1 1 auto'; } catch (e){}
} else {
document.getElementById('displaysetFullscreenLeft').innerHTML = '<p style="color:#fff; padding:1rem;">No viewer available</p>';
}
const viewerInTmp = tmp.querySelector('.dicom-viewer-root');
if (viewerInTmp) viewerInTmp.remove();
document.getElementById('displaysetFullscreenRight').innerHTML = tmp.innerHTML;
try { if (dsId) { setUrlParam('displayset', dsId); setUrlParam('displayset_full', '1'); } } catch (e) {}
dsFullscreenModal.show();
setTimeout(function () { try { window.mountDicomViewers(); } catch (e) { console.warn('mountDicomViewers not available for fullscreen', e); } }, 500);
} catch (error) {
console.error('Error loading fullscreen display set:', error);
document.getElementById('displaysetFullscreenLeft').innerHTML = '<p style="color:#fff; padding:1rem;">Failed to load viewer</p>';
document.getElementById('displaysetFullscreenRight').innerHTML = '<p>Failed to load details.</p>';
}
}
async function loadFindingModal(findingId, url) {
if (!url && findingId) url = `/atlas/series_finding/${findingId}/details/`;
if (!url) return;
const modalBody = document.getElementById('findingModalBody');
modalBody.innerHTML = '<p>Loading...</p>';
try {
const resp = await fetch(url);
const html = await resp.text();
modalBody.innerHTML = html;
setTimeout(function () { try { window.mountDicomViewers(); } catch (e) { console.warn('mountDicomViewers not available', e); } }, 200);
try { setUrlParam('finding', findingId); } catch (e) {}
const modal = new bootstrap.Modal(document.getElementById('findingModal'));
modal.show();
document.getElementById('reload-finding')?.addEventListener('click', function () { window.mountDicomViewers(); });
} catch (e) {
console.error('Error loading finding details:', e);
modalBody.innerHTML = '<p>Failed to load finding details.</p>';
}
}
document.querySelectorAll(".view-displayset-modal").forEach(button => {
button.addEventListener("click", function () {
const url = this.getAttribute("data-url");
const dsId = this.getAttribute('data-ds-id');
dsModalBody.innerHTML = "<p>Loading...</p>";
fetch(url)
.then(response => response.text())
.then(html => {
dsModalBody.innerHTML = html;
// attach url to fullscreen button so it knows what to load
try {
const fsBtn = document.querySelector('.displayset-fullscreen-btn');
if (fsBtn) {
fsBtn.dataset.url = url;
if (dsId) fsBtn.dataset.dsId = dsId;
}
} catch (e) { console.warn(e); }
// add URL param so modal can be reopened after reload
try { setUrlParam('displayset', dsId); } catch (e) { /* ignore */ }
setTimeout(function () {
try { window.mountDicomViewers(); } catch (e) { console.warn('mountDicomViewers not available', e); }
}, 500);
})
.catch(error => {
console.error("Error loading display set details:", error);
dsModalBody.innerHTML = "<p>Failed to load display set.</p>";
});
dsModal.show();
loadDisplaysetModal(url, dsId);
});
});
@@ -1236,59 +1290,12 @@
try { removeUrlParam('displayset'); removeUrlParam('displayset_full'); } catch (e) {}
});
// Fullscreen button handler: fetch the same displayset content but lay out viewer left, details right
// Fullscreen button handler: call loader function
document.querySelectorAll('.displayset-fullscreen-btn').forEach(btn => {
btn.addEventListener('click', function () {
const url = btn.dataset.url;
if (!url) return;
const dsId = btn.dataset.dsId || (new URL(url, window.location.origin)).searchParams.get('displayset') || null;
// show loading state
document.getElementById('displaysetFullscreenLeft').innerHTML = '<p style="color:#fff; padding:1rem;">Loading viewer...</p>';
document.getElementById('displaysetFullscreenRight').innerHTML = '<p>Loading details...</p>';
// set URL params for fullscreen
try { if (dsId) { setUrlParam('displayset', dsId); setUrlParam('displayset_full', '1'); } } catch (e) {}
fetch(url)
.then(response => response.text())
.then(html => {
const tmp = document.createElement('div');
tmp.innerHTML = html;
// find viewer element
const viewer = tmp.querySelector('.dicom-viewer-root');
if (viewer) {
// move viewer into left pane
const left = document.getElementById('displaysetFullscreenLeft');
left.innerHTML = '';
left.appendChild(viewer);
// force the viewer to fill the available space
try {
viewer.style.height = '100%';
viewer.style.minHeight = '100%';
viewer.style.width = '100%';
viewer.style.display = 'block';
viewer.style.flex = '1 1 auto';
} catch (e) { console.warn('failed to resize viewer element', e); }
} else {
document.getElementById('displaysetFullscreenLeft').innerHTML = '<p style="color:#fff; padding:1rem;">No viewer available</p>';
}
// remaining content (without viewer) goes to right pane
// remove viewer from tmp to avoid duplication
const viewerInTmp = tmp.querySelector('.dicom-viewer-root');
if (viewerInTmp) viewerInTmp.remove();
document.getElementById('displaysetFullscreenRight').innerHTML = tmp.innerHTML;
dsFullscreenModal.show();
// allow viewer to initialize
setTimeout(function () {
try { window.mountDicomViewers(); } catch (e) { console.warn('mountDicomViewers not available for fullscreen', e); }
}, 500);
})
.catch(error => {
console.error('Error loading fullscreen display set:', error);
document.getElementById('displaysetFullscreenLeft').innerHTML = '<p style="color:#fff; padding:1rem;">Failed to load viewer</p>';
document.getElementById('displaysetFullscreenRight').innerHTML = '<p>Failed to load details.</p>';
});
const dsId = btn.dataset.dsId || null;
loadDisplaysetFullscreen(url, dsId);
});
});