improve vivas
This commit is contained in:
+1
-1
@@ -1147,7 +1147,7 @@ class CaseDetail(models.Model):
|
||||
return None
|
||||
|
||||
def default_viewerstate_string(self):
|
||||
return json.dumps(self.default_viewerstate) if self.default_viewerstate else ""
|
||||
return json.dumps(self.default_viewerstate) if self.default_viewerstate else "{}"
|
||||
|
||||
class CasePrior(models.Model):
|
||||
case_detail = models.ForeignKey(CaseDetail, on_delete=models.CASCADE)
|
||||
|
||||
@@ -18,7 +18,11 @@
|
||||
<li data-question_pk={{casedetail.case.pk}}><a title="sort_order: {{casedetail.sort_order}}" href="{% url 'atlas:collection_case_view' pk=collection.pk case_number=forloop.counter0 %}">Case {{forloop.counter}}</a>
|
||||
: {{casedetail.case.title}}
|
||||
|
||||
(<a href="{% url 'atlas:collection_case_display_setup' casedetail.collection.pk casedetail.case.pk %}">setup default display</a>)
|
||||
(<a href="{% url 'atlas:collection_case_display_setup' casedetail.collection.pk casedetail.case.pk %}">setup default display</a>
|
||||
{% if casedetail.default_viewerstate %}
|
||||
<i class="bi bi-check text-success" title="This case has a default viewerstate defined"></i>
|
||||
{% endif %}
|
||||
)
|
||||
|
||||
{% if collection.collection_type == "QUE" %}
|
||||
(<a href='{% url "atlas:collection_case_details" casedetail.collection.pk casedetail.case.pk %}'>edit questions</a>
|
||||
|
||||
@@ -10,9 +10,9 @@
|
||||
<p>It is also possible to open a single series by clicking on the 'Load' button next to the individual series.</p>
|
||||
<p>Once opened the case details will be show on the right hand side of the page.</p>
|
||||
|
||||
<div class="mb-2">
|
||||
<button id="toggle-load-mode" class="btn btn-secondary">Switch to Load OHIF</button>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<button id="toggle-load-mode" class="btn btn-secondary">Switch to Load OHIF</button>
|
||||
</div>
|
||||
</details>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
@@ -22,48 +22,49 @@
|
||||
<button id="open-viewer-local" >Open Viewer Local</button>
|
||||
<button id="view-series" class="text-dark border-dark" >Toggle series</button>
|
||||
<ol id="" class="sortable">
|
||||
{% for case in cases %}
|
||||
{% for casedetail in casedetails %}
|
||||
{% with case=casedetail.case %}
|
||||
|
||||
<li data-question_pk={{case.pk}}>
|
||||
{{case.casedetail.sort_order}}
|
||||
<div class="case-item" data-title="{{case.title}}" data-case={{case.pk}} data-casejson='{{case.get_viva_details_json}}' data-images='{{case.get_series_images_nested}}'>Case {{forloop.counter}}: {{case.title}}
|
||||
<li data-question_pk={{case.pk}}>
|
||||
<div class="case-item" data-title="{{case.title}}" data-case={{case.pk}} data-casejson='{{case.get_viva_details_json}}' data-images='{{case.get_series_images_nested}}' data-viewerstate={{casedetail.default_viewerstate_string}}>Case {{forloop.counter}}: {{case.title}}
|
||||
{% comment %} <button class="show-case no-padding" data-target="/ohif/viewer/dicomjson?url=https://www.penracourses.org.uk{% url 'atlas:case_dicom_json' case.pk %}">Show</button> {% endcomment %}
|
||||
{% comment %} <button class="send-message no-padding" data-title="{{case.title}}" data-target="/ohif/viewer/dicomjson?url=https://www.penracourses.org.uk{% url 'atlas:case_dicom_json' case.pk %}">Open</button> {% endcomment %}
|
||||
{% comment %} <button class="open-case no-padding" data-target="{% url 'atlas:collection_viva_case' collection.pk forloop.counter0 %}" data-type="case">Load</button> {% endcomment %}
|
||||
<button class="open-case no-padding" data-target="/ohif/viewer/dicomjson?url=https://www.penracourses.org.uk{% url 'atlas:case_dicom_json' case.pk %}" data-type="case">Load OHIF</button>
|
||||
<button class="open-case-local no-padding" data-target=case.pk data-type="case">Load</button>
|
||||
<br />
|
||||
<div class="pre-whitespace multi-image-block">
|
||||
<details class="series-detail"><summary>Series:</summary>
|
||||
{% for series in case.series.all %}
|
||||
<span class="series-block">
|
||||
<span>
|
||||
<span class="series-block-series-number">Series {{ forloop.counter }}:</span><br>
|
||||
{{series.get_block}}
|
||||
<br />
|
||||
<button class="open-case no-padding" data-target="/ohif/viewer/dicomjson?url=https://www.penracourses.org.uk{% url 'atlas:case_dicom_json' case.pk %}" data-type="case">Load OHIF</button>
|
||||
<button class="open-case-local no-padding" data-target=case.pk data-type="case">Load</button>
|
||||
<br />
|
||||
<div class="pre-whitespace multi-image-block">
|
||||
<details class="series-detail"><summary>Series:</summary>
|
||||
{% for series in case.series.all %}
|
||||
<span class="series-block">
|
||||
<span>
|
||||
<span class="series-block-series-number">Series {{ forloop.counter }}:</span><br>
|
||||
{{series.get_block}}
|
||||
<br />
|
||||
{% comment %} <button class="show-series no-padding text-secondary border-secondary" data-case={{case.pk}} data-target="/ohif/viewer/dicomjson?url=https://www.penracourses.org.uk{% url 'atlas:series_dicom_json' series.pk %}">
|
||||
show
|
||||
</button> {% endcomment %}
|
||||
{% comment %} <button class="open-series no-padding text-secondary border-secondary" data-type="series" data-series={{forloop.counter}} data-case={{case.pk}} data-target="{% url 'atlas:collection_viva_series' collection.pk series.pk %}"> {% endcomment %}
|
||||
<button class="open-series no-padding text-secondary border-secondary" data-type="series" data-series={{forloop.counter}} data-case={{case.pk}} data-target="/ohif/viewer/dicomjson?url=https://www.penracourses.org.uk{% url 'atlas:series_dicom_json' series.pk %}">
|
||||
Load
|
||||
</button>
|
||||
<button class="open-series-local no-padding text-secondary border-secondary"
|
||||
data-type="series"
|
||||
data-series="{{ forloop.counter }}"
|
||||
data-case="{{ case.pk }}"
|
||||
data-target="{{ series.pk }}">
|
||||
Load
|
||||
</button>
|
||||
<br>
|
||||
<button class="open-series no-padding text-secondary border-secondary" data-type="series" data-series={{forloop.counter}} data-case={{case.pk}} data-target="/ohif/viewer/dicomjson?url=https://www.penracourses.org.uk{% url 'atlas:series_dicom_json' series.pk %}">
|
||||
Load
|
||||
</button>
|
||||
<button class="open-series-local no-padding text-secondary border-secondary"
|
||||
data-type="series"
|
||||
data-series="{{ forloop.counter }}"
|
||||
data-case="{{ case.pk }}"
|
||||
data-target="{{ series.pk }}">
|
||||
Load
|
||||
</button>
|
||||
<br>
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</details>
|
||||
{% endfor %}
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</li>
|
||||
|
||||
{% endwith %}
|
||||
{% endfor %}
|
||||
</ol>
|
||||
</div>
|
||||
@@ -92,37 +93,37 @@
|
||||
var win2 = false;
|
||||
|
||||
$(document).ready(function() {
|
||||
let loadLocalMode = true;
|
||||
let loadLocalMode = true;
|
||||
|
||||
// Update all "Load" buttons to reflect the current mode
|
||||
function updateLoadButtons() {
|
||||
if (loadLocalMode) {
|
||||
$('.open-case').hide();
|
||||
$('.open-series').hide();
|
||||
$('.open-case-local').show();
|
||||
$('.open-series-local').show();
|
||||
$('#toggle-load-mode').text('Switch to Load OHIF');
|
||||
$("#open-viewer").hide()
|
||||
$("#open-viewer-local").show()
|
||||
} else {
|
||||
$('.open-case').show();
|
||||
$('.open-series').show();
|
||||
$('.open-case-local').hide();
|
||||
$('.open-series-local').hide();
|
||||
$("#open-viewer").show()
|
||||
$("#open-viewer-local").hide()
|
||||
$('#toggle-load-mode').text('Switch to Load Local');
|
||||
}
|
||||
}
|
||||
function updateLoadButtons() {
|
||||
if (loadLocalMode) {
|
||||
$('.open-case').hide();
|
||||
$('.open-series').hide();
|
||||
$('.open-case-local').show();
|
||||
$('.open-series-local').show();
|
||||
$('#toggle-load-mode').text('Switch to Load OHIF');
|
||||
$("#open-viewer").hide()
|
||||
$("#open-viewer-local").show()
|
||||
} else {
|
||||
$('.open-case').show();
|
||||
$('.open-series').show();
|
||||
$('.open-case-local').hide();
|
||||
$('.open-series-local').hide();
|
||||
$("#open-viewer").show()
|
||||
$("#open-viewer-local").hide()
|
||||
$('#toggle-load-mode').text('Switch to Load Local');
|
||||
}
|
||||
}
|
||||
|
||||
// Initial state: show only normal Load buttons
|
||||
updateLoadButtons();
|
||||
updateLoadButtons();
|
||||
|
||||
// Toggle button click handler
|
||||
$('#toggle-load-mode').click(function() {
|
||||
loadLocalMode = !loadLocalMode;
|
||||
updateLoadButtons();
|
||||
});
|
||||
$('#toggle-load-mode').click(function() {
|
||||
loadLocalMode = !loadLocalMode;
|
||||
updateLoadButtons();
|
||||
});
|
||||
|
||||
const bc = new BroadcastChannel("viva_load");
|
||||
bc.onmessage = (event) => {
|
||||
@@ -152,6 +153,7 @@
|
||||
console.log('clicked local', c)
|
||||
console.log('open local', c.dataset.case)
|
||||
case_details = JSON.parse(c.dataset.casejson);
|
||||
let viewerstate = JSON.parse(c.dataset.viewerstate) || {};
|
||||
$('#loading-case').show()
|
||||
$("#open-viewer-local").addClass("flash-button");
|
||||
$('#current-case-title').html("<span class='title'>Case:</span> "+c.dataset.title);
|
||||
@@ -159,7 +161,10 @@
|
||||
$("#current-case-discussion").html("<span class='title'>Discussion:</span> "+case_details['discussion']);
|
||||
$("#current-case-report").html("<span class='title'>Report:</span> "+case_details['report']);
|
||||
|
||||
bc.postMessage({"type": "open", "case" : c.dataset.case, "images": c.dataset.images});
|
||||
bc.postMessage({"type": "open",
|
||||
"case" : c.dataset.case, "images": c.dataset.images,
|
||||
"viewerstate": viewerstate
|
||||
});
|
||||
|
||||
});
|
||||
$('.open-series-local').click(function() {
|
||||
@@ -181,7 +186,7 @@
|
||||
"type": "open",
|
||||
"case": c.dataset.case,
|
||||
"series": seriesPk,
|
||||
"images": JSON.stringify(images)
|
||||
"images": JSON.stringify(images),
|
||||
});
|
||||
});
|
||||
$('.open-case, .open-series').click(function() {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Viewer</title>
|
||||
<head>
|
||||
<title>Viewer</title>
|
||||
<style type="text/css">
|
||||
body, html
|
||||
{
|
||||
@@ -12,43 +12,54 @@
|
||||
|
||||
#viewer
|
||||
{
|
||||
position:absolute; left: 0; right: 0; bottom: 0; top: 0px;
|
||||
position:absolute; left: 0; right: 0; bottom: 0; top: 0px;
|
||||
}
|
||||
</style>
|
||||
<script src="{% static 'dv3d/index.js' %}" type="module" defer="defer" type="module"></script>
|
||||
</head>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="awating-load">
|
||||
<p>Awating load request</p>
|
||||
This page will display series when loaded from other pages.
|
||||
</div>
|
||||
<div id="root" class="dicom-viewer-root"
|
||||
style="box-sizing: border-box; background: #222; position: absolute; top: 0; left: 0; right: 0; bottom: 0; width: 100vw; height: 100vh;"
|
||||
data-auto-cache-stack="true"
|
||||
></div>
|
||||
<body>
|
||||
<div id="awating-load">
|
||||
<p>Awating load request</p>
|
||||
This page will display series when loaded from other pages.
|
||||
</div>
|
||||
<div id="root" class="dicom-viewer-root"
|
||||
style="box-sizing: border-box; background: #222; position: absolute; top: 0; left: 0; right: 0; bottom: 0; width: 100vw; height: 100vh;"
|
||||
data-auto-cache-stack="true"
|
||||
></div>
|
||||
|
||||
<script type="text/javascript">
|
||||
var win2 = false;
|
||||
<script type="text/javascript">
|
||||
var win2 = false;
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
document.title = "Case: {{current_case.title}}";
|
||||
console.log('ready');
|
||||
const bc = new BroadcastChannel("viva_load");
|
||||
bc.onmessage = (event) => {
|
||||
console.log("message received");
|
||||
console.log(event);
|
||||
if (event.data.type == "open") {
|
||||
document.getElementById("awating-load").style.display = "none";
|
||||
console.log("open, images: ", event.data.images);
|
||||
document.getElementById("root").dataset.images = event.data.images;
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
document.title = "Case: {{current_case.title}}";
|
||||
console.log('ready');
|
||||
const bc = new BroadcastChannel("viva_load");
|
||||
bc.onmessage = (event) => {
|
||||
console.log("message received");
|
||||
console.log(event);
|
||||
if (event.data.type == "open") {
|
||||
document.getElementById("awating-load").style.display = "none";
|
||||
console.log("open, images: ", event.data.images);
|
||||
document.getElementById("root").dataset.images = event.data.images;
|
||||
|
||||
window.mountDicomViewers();
|
||||
bc.postMessage({"type": "open-complete-local"});
|
||||
}
|
||||
};
|
||||
});
|
||||
</script>
|
||||
console.log("viewerstate: ", event.data.viewerstate);
|
||||
console.log(event.data.viewerstate == {});
|
||||
if (
|
||||
event.data.viewerstate &&
|
||||
Object.keys(event.data.viewerstate).length > 0
|
||||
) {
|
||||
document.getElementById("root").dataset.viewerstate = event.data.viewerstate;
|
||||
} else {
|
||||
delete document.getElementById("root").dataset.viewerstate;
|
||||
}
|
||||
|
||||
</body>
|
||||
window.mountDicomViewers();
|
||||
bc.postMessage({"type": "open-complete-local"});
|
||||
}
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-11
@@ -1611,22 +1611,28 @@ class CollectionView(LoginRequiredMixin, SingleTableMixin, FilterView):
|
||||
def collection_viva(request, pk):
|
||||
collection = get_object_or_404(CaseCollection, pk=pk)
|
||||
|
||||
cases = (
|
||||
collection.cases.all()
|
||||
.order_by("casedetail__sort_order")
|
||||
.prefetch_related(
|
||||
"series",
|
||||
"series__images",
|
||||
"series__contrast",
|
||||
"series__plane",
|
||||
"series__examination",
|
||||
)
|
||||
#cases = (
|
||||
# collection.cases.all()
|
||||
# .order_by("casedetail__sort_order")
|
||||
# .prefetch_related(
|
||||
# "series",
|
||||
# "series__images",
|
||||
# "series__contrast",
|
||||
# "series__plane",
|
||||
# "series__examination",
|
||||
# )
|
||||
#)
|
||||
|
||||
casedetails = CaseDetail.objects.filter(collection=collection).order_by(
|
||||
"sort_order"
|
||||
)
|
||||
logger.debug(casedetails)
|
||||
|
||||
|
||||
return render(
|
||||
request,
|
||||
"atlas/collection_viva.html",
|
||||
{"collection": collection, "cases": cases, "can_edit": True},
|
||||
{"collection": collection, "casedetails": casedetails, "can_edit": True},
|
||||
)
|
||||
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user