PWV-73 Determine missing timepoint studies
- Display timepoint availability based on its studies' availability - Display study availability in study level when timepoint is loaded
This commit is contained in:
parent
a8d9e0f24f
commit
b88c2f472b
@ -2,6 +2,9 @@
|
|||||||
<div class="timepoint-browser-item" data-id="{{this.timepoint.timepointId}}">
|
<div class="timepoint-browser-item" data-id="{{this.timepoint.timepointId}}">
|
||||||
<div class="timepoint-item p-y-2">
|
<div class="timepoint-item p-y-2">
|
||||||
<div class="timepoint-details clearfix">
|
<div class="timepoint-details clearfix">
|
||||||
|
<div class="timepoint-study-availability pull-left m-r-1" >
|
||||||
|
<i class="fa fa-circle {{studyAvailability}}"></i>
|
||||||
|
</div>
|
||||||
<div class="timepoint-title pull-left">
|
<div class="timepoint-title pull-left">
|
||||||
{{this.timepointApi.title timepoint}}
|
{{this.timepointApi.title timepoint}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -13,6 +13,7 @@ Template.timepointBrowserItem.onCreated(() => {
|
|||||||
const hasStudiesData = !!(timepoint.studiesData && timepoint.studiesData.length);
|
const hasStudiesData = !!(timepoint.studiesData && timepoint.studiesData.length);
|
||||||
instance.summary = new ReactiveVar('');
|
instance.summary = new ReactiveVar('');
|
||||||
instance.studiesData = new ReactiveVar(hasStudiesData ? timepoint.studiesData : null);
|
instance.studiesData = new ReactiveVar(hasStudiesData ? timepoint.studiesData : null);
|
||||||
|
instance.missingStudyUids = new ReactiveVar(null);
|
||||||
|
|
||||||
const updateStudiesData = newDocument => {
|
const updateStudiesData = newDocument => {
|
||||||
const newTimepoint = newDocument || timepointApi.timepoints.findOne({ timepointId });
|
const newTimepoint = newDocument || timepointApi.timepoints.findOne({ timepointId });
|
||||||
@ -57,10 +58,45 @@ Template.timepointBrowserItem.onCreated(() => {
|
|||||||
const studiesData = instance.studiesData.get();
|
const studiesData = instance.studiesData.get();
|
||||||
if (studiesData) {
|
if (studiesData) {
|
||||||
instance.setModalitiesSummary();
|
instance.setModalitiesSummary();
|
||||||
|
|
||||||
|
// Determine missing timepoint studies
|
||||||
|
const missingStudyUids = [];
|
||||||
|
timepoint.studyInstanceUids.forEach((timepointStudyUid) => {
|
||||||
|
if (!studiesData.find(studyData => studyData.available && studyData.studyInstanceUid === timepointStudyUid)) {
|
||||||
|
missingStudyUids.push(timepointStudyUid);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
instance.missingStudyUids.set(missingStudyUids);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Template.timepointBrowserItem.helpers({
|
||||||
|
studyAvailability: () => {
|
||||||
|
const instance = Template.instance();
|
||||||
|
const { timepoint } = instance.data;
|
||||||
|
const missingStudyUids = instance.missingStudyUids && instance.missingStudyUids.get();
|
||||||
|
|
||||||
|
if (!missingStudyUids || !timepoint) {
|
||||||
|
// Timepoint studies are not loaded/checked yet (may be indicated as disabled circle)
|
||||||
|
return "studies-not-ready";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (missingStudyUids.length >= timepoint.studyInstanceUids.length) {
|
||||||
|
// All timepoint studies are not available (may be indicated as empty circle)
|
||||||
|
return "studies-not-available";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (missingStudyUids.length > 0) {
|
||||||
|
// Timepoint studies are partially available (may be indicated as half-filled circle)
|
||||||
|
return "studies-partially-available";
|
||||||
|
}
|
||||||
|
|
||||||
|
// All timepoint studies are available (may be indicated as filled circle)
|
||||||
|
return "studies-fully-available";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Template.timepointBrowserItem.events({
|
Template.timepointBrowserItem.events({
|
||||||
'ohif.lesiontracker.timepoint.load .timepoint-item'(event, instance) {
|
'ohif.lesiontracker.timepoint.load .timepoint-item'(event, instance) {
|
||||||
instance.loadStudies();
|
instance.loadStudies();
|
||||||
|
|||||||
@ -78,6 +78,16 @@
|
|||||||
theme('color', '$textPrimaryColor')
|
theme('color', '$textPrimaryColor')
|
||||||
padding-top: 2px
|
padding-top: 2px
|
||||||
|
|
||||||
|
.timepoint-study-availability
|
||||||
|
.studies-not-ready
|
||||||
|
color: gray
|
||||||
|
.studies-not-available
|
||||||
|
color: red
|
||||||
|
.studies-partially-available
|
||||||
|
color: yellow
|
||||||
|
.studies-fully-available
|
||||||
|
color: green
|
||||||
|
|
||||||
.series-quick-switch .timepoint-browser-list
|
.series-quick-switch .timepoint-browser-list
|
||||||
padding: 0 10px
|
padding: 0 10px
|
||||||
|
|
||||||
|
|||||||
@ -10,8 +10,12 @@
|
|||||||
<div class="study-modality-text" style="{{modalityStyle studyData.modalities}}">{{studyData.modalities}}</div>
|
<div class="study-modality-text" style="{{modalityStyle studyData.modalities}}">{{studyData.modalities}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="study-text">
|
<div class="study-text">
|
||||||
<div class="study-date">{{formatDA studyData.studyDate 'D-MMM-YYYY'}}</div>
|
{{#if isLoaded}}
|
||||||
<div class="study-description">{{studyData.studyDescription}}</div>
|
<div class="study-date">{{formatDA studyData.studyDate 'D-MMM-YYYY'}}</div>
|
||||||
|
<div class="study-description">{{studyData.studyDescription}}</div>
|
||||||
|
{{else}}
|
||||||
|
<div class="study-availability">{{#if studyData.available}}Click to load{{else}}N/A{{/if}}</div>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/let}}
|
{{/let}}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ Template.studyBrowserItem.onCreated(() => {
|
|||||||
const { studyInformation } = instance.data;
|
const { studyInformation } = instance.data;
|
||||||
const { studyInstanceUid } = studyInformation;
|
const { studyInstanceUid } = studyInformation;
|
||||||
|
|
||||||
instance.loaded = false;
|
instance.loaded = new ReactiveVar(false);
|
||||||
instance.loading = new ReactiveVar(false);
|
instance.loading = new ReactiveVar(false);
|
||||||
|
|
||||||
instance.studyData = new ReactiveVar(studyInformation);
|
instance.studyData = new ReactiveVar(studyInformation);
|
||||||
@ -44,7 +44,7 @@ Template.studyBrowserItem.onCreated(() => {
|
|||||||
modalities: firstInstance.getRawValue('x00080060') || '',
|
modalities: firstInstance.getRawValue('x00080060') || '',
|
||||||
});
|
});
|
||||||
|
|
||||||
instance.loaded = true;
|
instance.loaded.set(true);
|
||||||
instance.loading.set(false);
|
instance.loading.set(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -55,6 +55,12 @@ Template.studyBrowserItem.events({
|
|||||||
if (instance.loading.get()) return;
|
if (instance.loading.get()) return;
|
||||||
|
|
||||||
const { studyInformation } = instance.data;
|
const { studyInformation } = instance.data;
|
||||||
|
|
||||||
|
// Skip if study is not available
|
||||||
|
if (!studyInformation.available) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const element = event.currentTarget.parentElement;
|
const element = event.currentTarget.parentElement;
|
||||||
const $element = $(element);
|
const $element = $(element);
|
||||||
const triggerClick = () => {
|
const triggerClick = () => {
|
||||||
@ -65,12 +71,12 @@ Template.studyBrowserItem.events({
|
|||||||
$element.trigger(newEvent, studyInformation);
|
$element.trigger(newEvent, studyInformation);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (instance.loaded) {
|
if (instance.loaded.get()) {
|
||||||
triggerClick();
|
triggerClick();
|
||||||
} else {
|
} else {
|
||||||
instance.loading.set(true);
|
instance.loading.set(true);
|
||||||
OHIF.studies.loadStudy(studyInformation.studyInstanceUid).then(() => {
|
OHIF.studies.loadStudy(studyInformation.studyInstanceUid).then(() => {
|
||||||
instance.loaded = true;
|
instance.loaded.set(true);
|
||||||
instance.loading.set(false);
|
instance.loading.set(false);
|
||||||
$element.trigger('ohif.studies.study.load', studyInformation);
|
$element.trigger('ohif.studies.study.load', studyInformation);
|
||||||
Tracker.afterFlush(triggerClick);
|
Tracker.afterFlush(triggerClick);
|
||||||
@ -80,6 +86,10 @@ Template.studyBrowserItem.events({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.studyBrowserItem.helpers({
|
Template.studyBrowserItem.helpers({
|
||||||
|
isLoaded() {
|
||||||
|
return Template.instance().loaded.get();
|
||||||
|
},
|
||||||
|
|
||||||
isLoading() {
|
isLoading() {
|
||||||
return Template.instance().loading.get();
|
return Template.instance().loading.get();
|
||||||
},
|
},
|
||||||
|
|||||||
@ -104,6 +104,9 @@ $spacerY = 12px
|
|||||||
.study-description
|
.study-description
|
||||||
margin-top: 8px
|
margin-top: 8px
|
||||||
theme('color', '$textPrimaryColor')
|
theme('color', '$textPrimaryColor')
|
||||||
|
.study-availability
|
||||||
|
margin-top: 24px
|
||||||
|
theme('color', '$textPrimaryColor')
|
||||||
|
|
||||||
.study-modality
|
.study-modality
|
||||||
theme('color', '$textSecondaryColor')
|
theme('color', '$textSecondaryColor')
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user