diff --git a/atlas/templates/atlas/case_display_block.html b/atlas/templates/atlas/case_display_block.html index a14a4199..f9913088 100755 --- a/atlas/templates/atlas/case_display_block.html +++ b/atlas/templates/atlas/case_display_block.html @@ -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 = "

Loading...

"; + 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 = "

Failed to load display set.

"; + } + } + + async function loadDisplaysetFullscreen(url, dsId) { + if (!url && dsId) url = `/atlas/${dsId}/display_sets/modal`; + if (!url) return; + document.getElementById('displaysetFullscreenLeft').innerHTML = '

Loading viewer...

'; + document.getElementById('displaysetFullscreenRight').innerHTML = '

Loading details...

'; + 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 = '

No viewer available

'; + } + 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 = '

Failed to load viewer

'; + document.getElementById('displaysetFullscreenRight').innerHTML = '

Failed to load details.

'; + } + } + + async function loadFindingModal(findingId, url) { + if (!url && findingId) url = `/atlas/series_finding/${findingId}/details/`; + if (!url) return; + const modalBody = document.getElementById('findingModalBody'); + modalBody.innerHTML = '

Loading...

'; + 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 = '

Failed to load finding details.

'; + } + } + 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 = "

Loading...

"; - 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 = "

Failed to load display set.

"; - }); - 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 = '

Loading viewer...

'; - document.getElementById('displaysetFullscreenRight').innerHTML = '

Loading details...

'; - // 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 = '

No viewer available

'; - } - // 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 = '

Failed to load viewer

'; - document.getElementById('displaysetFullscreenRight').innerHTML = '

Failed to load details.

'; - }); + const dsId = btn.dataset.dsId || null; + loadDisplaysetFullscreen(url, dsId); }); });