Final adjustments on quickSwitch
This commit is contained in:
1 parent
89f6bd4610
commit
37137b9331
13 files changed
+170
-80
No files matched your search
@@ -13,8 +13,8 @@
|
||||
<div class="timepoint-summary">{{choose instance.summary.get 'Click to load'}}</div>
|
||||
</div>
|
||||
{{#if this.timepointChildTemplate}}
|
||||
{{#if and (not instance.loading.get) instance.loaded}}
|
||||
{{>Template.dynamic template=this.timepointChildTemplate data=(clone this studiesInformation=timepoint.studiesData)}}
|
||||
{{#if instance.studiesData.get}}
|
||||
{{>Template.dynamic template=this.timepointChildTemplate data=(clone this studiesInformation=instance.studiesData.get)}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
@@ -8,15 +8,28 @@ import { OHIF } from 'meteor/ohif:core';
|
||||
Template.timepointBrowserItem.onCreated(() => {
|
||||
const instance = Template.instance();
|
||||
const { timepoint, timepointApi } = instance.data;
|
||||
const { timepointId } = timepoint;
|
||||
|
||||
const hasStudiesData = !!(timepoint.studiesData && timepoint.studiesData.length);
|
||||
instance.summary = new ReactiveVar('');
|
||||
instance.loading = new ReactiveVar(false);
|
||||
instance.loaded = !!(timepoint.studiesData && timepoint.studiesData.length);
|
||||
instance.studiesData = new ReactiveVar(hasStudiesData ? timepoint.studiesData : null);
|
||||
|
||||
const updateStudiesData = newDocument => {
|
||||
const newTimepoint = newDocument || timepointApi.timepoints.findOne({ timepointId });
|
||||
if (newTimepoint && newTimepoint.studiesData && newTimepoint.studiesData.length) {
|
||||
instance.studiesData.set(newTimepoint.studiesData);
|
||||
}
|
||||
};
|
||||
|
||||
timepointApi.timepoints.find({ timepointId }).observe({ changed: updateStudiesData });
|
||||
|
||||
// Build the modalities summary of all timepoint's studies
|
||||
instance.setModalitiesSummary = () => {
|
||||
const studiesData = instance.studiesData.get();
|
||||
if (!studiesData) return;
|
||||
|
||||
const modalities = {};
|
||||
timepoint.studiesData.forEach(study => {
|
||||
studiesData.forEach(study => {
|
||||
const modality = study.modalities || 'UN';
|
||||
modalities[modality] = modalities[modality] + 1 || 1;
|
||||
});
|
||||
@@ -29,20 +42,22 @@ Template.timepointBrowserItem.onCreated(() => {
|
||||
|
||||
const filter = { studyInstanceUid: timepoint.studyInstanceUids };
|
||||
instance.loadStudies = () => OHIF.studies.searchStudies(filter).then(studiesData => {
|
||||
timepoint.studiesData = studiesData;
|
||||
instance.studiesData.set(studiesData);
|
||||
timepointApi.timepoints.update(timepoint._id, { $set: { studiesData } });
|
||||
instance.loaded = true;
|
||||
instance.setModalitiesSummary();
|
||||
instance.loading.set(false);
|
||||
}).catch(error => {
|
||||
const text = 'An error has occurred while retrieving studies information';
|
||||
OHIF.ui.notifications.danger({ text });
|
||||
OHIF.log.error(error);
|
||||
});
|
||||
|
||||
if (instance.loaded) {
|
||||
instance.setModalitiesSummary();
|
||||
}
|
||||
updateStudiesData();
|
||||
instance.autorun(() => {
|
||||
const studiesData = instance.studiesData.get();
|
||||
if (studiesData) {
|
||||
instance.setModalitiesSummary();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Template.timepointBrowserItem.events({
|
||||
@@ -58,7 +73,7 @@ Template.timepointBrowserItem.events({
|
||||
$element.trigger('ohif.lesiontracker.timepoint.click', instance.data.timepoint);
|
||||
};
|
||||
|
||||
if (!instance.loaded) {
|
||||
if (!instance.studiesData.get()) {
|
||||
instance.summary.set('Loading...');
|
||||
instance.loadStudies().then(() => Tracker.afterFlush(triggerClick));
|
||||
} else {
|
||||
|
||||
@@ -77,3 +77,9 @@
|
||||
.timepoint-title
|
||||
theme('color', '$textPrimaryColor')
|
||||
padding-top: 2px
|
||||
|
||||
.series-quick-switch .timepoint-browser-list
|
||||
padding: 0 10px
|
||||
|
||||
div.timepoint-title
|
||||
text-transform: none
|
||||
@@ -1,6 +1,6 @@
|
||||
<template name="timepointBrowserQuickSwitch">
|
||||
{{>timepointBrowserList (extend timepointBrowserData)}}
|
||||
{{#unless instance.showAdditional.get}}
|
||||
<div class='show-additional'>Show additional timepoints</div>
|
||||
{{/unless}}
|
||||
{{#if instance.hasAdditional.get}}
|
||||
<div class='study-item-box additional'>Show additional timepoints</div>
|
||||
{{/if}}
|
||||
</template>
|
||||
@@ -2,45 +2,66 @@ import { Meteor } from 'meteor/meteor';
|
||||
import { Template } from 'meteor/templating';
|
||||
import { ReactiveVar } from 'meteor/reactive-var';
|
||||
import { Tracker } from 'meteor/tracker';
|
||||
import { _ } from 'meteor/underscore';
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
|
||||
Template.timepointBrowserQuickSwitch.onCreated(() => {
|
||||
const instance = Template.instance();
|
||||
instance.showAdditional = new ReactiveVar(false);
|
||||
instance.currentTimepoint = new ReactiveVar();
|
||||
const { timepointApi } = OHIF.viewer;
|
||||
|
||||
instance.updateCurrentTimepoint = studyInstanceUid => {
|
||||
const currentTimepoint = OHIF.viewer.timepointApi.study(studyInstanceUid)[0];
|
||||
instance.currentTimepoint.set(currentTimepoint);
|
||||
instance.hasAdditional = new ReactiveVar(false);
|
||||
instance.showAdditional = new ReactiveVar(false);
|
||||
instance.selectedTimepoint = new ReactiveVar();
|
||||
instance.timepoints = new ReactiveVar([]);
|
||||
|
||||
instance.updateSelectedTimepoint = studyInstanceUid => {
|
||||
const selectedTimepoint = timepointApi.study(studyInstanceUid)[0];
|
||||
instance.selectedTimepoint.set(selectedTimepoint);
|
||||
};
|
||||
|
||||
const currentTimepoint = timepointApi.current();
|
||||
const filter = { latestDate: { $lte: currentTimepoint.latestDate } };
|
||||
instance.keyTimepoints = timepointApi.key(filter);
|
||||
|
||||
const { viewportIndex } = instance.data;
|
||||
instance.autorun(() => {
|
||||
OHIF.viewerbase.layoutManager.observer.depend();
|
||||
const viewportData = OHIF.viewerbase.layoutManager.viewportData[viewportIndex];
|
||||
instance.updateCurrentTimepoint(viewportData.studyInstanceUid);
|
||||
instance.updateSelectedTimepoint(viewportData.studyInstanceUid);
|
||||
});
|
||||
|
||||
instance.autorun(() => {
|
||||
instance.data.currentStudy.dep.depend();
|
||||
instance.showAdditional.set(false);
|
||||
});
|
||||
|
||||
instance.autorun(() => {
|
||||
const showAdditional = instance.showAdditional.get();
|
||||
instance.hasAdditional.set(!showAdditional && instance.keyTimepoints.length > 1);
|
||||
});
|
||||
|
||||
instance.autorun(() => {
|
||||
const selectedTimepoint = instance.selectedTimepoint.get();
|
||||
const showAdditional = instance.showAdditional.get();
|
||||
const timepoints = showAdditional ? instance.keyTimepoints : [selectedTimepoint];
|
||||
instance.timepoints.set(timepoints);
|
||||
});
|
||||
});
|
||||
|
||||
Template.timepointBrowserQuickSwitch.onRendered(() => {
|
||||
const instance = Template.instance();
|
||||
|
||||
instance.autorun(() => {
|
||||
const currentTimepoint = instance.currentTimepoint.get();
|
||||
const currentTimepointId = (currentTimepoint && currentTimepoint.timepointId) || '';
|
||||
const selectedTimepoint = instance.selectedTimepoint.get();
|
||||
const selectedTimepointId = (selectedTimepoint && selectedTimepoint.timepointId) || '';
|
||||
const $allBrowserItems = instance.$('.timepoint-browser-item');
|
||||
const $browserItem = $allBrowserItems.filter(`[data-id=${currentTimepointId}]`);
|
||||
const $browserItem = $allBrowserItems.filter(`[data-id=${selectedTimepointId}]`);
|
||||
if (!$browserItem.hasClass('active')) {
|
||||
$browserItem.find('.timepoint-item').trigger('click');
|
||||
}
|
||||
});
|
||||
|
||||
instance.autorun(() => {
|
||||
instance.updateActiveStudy = () => {
|
||||
const currentStudy = instance.data.currentStudy.get();
|
||||
const studyInstanceUid = (currentStudy && currentStudy.studyInstanceUid) || '';
|
||||
Tracker.afterFlush(() => {
|
||||
@@ -48,15 +69,16 @@ Template.timepointBrowserQuickSwitch.onRendered(() => {
|
||||
$studyBrowserItems.removeClass('active');
|
||||
$studyBrowserItems.filter(`[data-uid="${studyInstanceUid}"]`).addClass('active');
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
instance.autorun(instance.updateActiveStudy);
|
||||
});
|
||||
|
||||
Template.timepointBrowserQuickSwitch.events({
|
||||
'ohif.lesiontracker.timepoint.click'(event, instance) {
|
||||
const $element = $(event.currentTarget);
|
||||
|
||||
// Defer the active class toggling to wait for child template rendering
|
||||
Meteor.defer(() => $element.toggleClass('active'));
|
||||
$element.toggleClass('active');
|
||||
instance.updateActiveStudy();
|
||||
},
|
||||
|
||||
'ohif.studies.study.click'(event, instance, studyInformation) {
|
||||
@@ -65,29 +87,39 @@ Template.timepointBrowserQuickSwitch.events({
|
||||
instance.data.currentStudy.set(study);
|
||||
const $studySwitch = $(event.currentTarget).closest('.study-switch');
|
||||
$studySwitch.siblings('.series-switch').trigger('rescale');
|
||||
instance.updateCurrentTimepoint(studyInformation.studyInstanceUid);
|
||||
instance.updateSelectedTimepoint(studyInformation.studyInstanceUid);
|
||||
|
||||
// Create a hover bridge to prevent quick switch from closing due to scroll height
|
||||
Meteor.defer(() => {
|
||||
const $scrollable = $studySwitch.find('.study-browser>.scrollable');
|
||||
const offsetY = $scrollable.offset().top + $scrollable.outerHeight();
|
||||
if (event.clientY > offsetY) {
|
||||
const hoverHandler = _.throttle(event => {
|
||||
if (event.clientY <= offsetY) {
|
||||
$scrollable.css('padding-bottom', '');
|
||||
$scrollable.off('mousemove', hoverHandler);
|
||||
$scrollable.off('mouseleave', hoverHandler);
|
||||
}
|
||||
}, 100);
|
||||
$scrollable.css('padding-bottom', event.clientY - offsetY + 20);
|
||||
$scrollable.on('mousemove', hoverHandler);
|
||||
$scrollable.one('mouseleave', () => $scrollable.off('mousemove', hoverHandler));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click .show-additional'(event, instance) {
|
||||
'click .study-item-box.additional'(event, instance) {
|
||||
instance.showAdditional.set(true);
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
Template.timepointBrowserQuickSwitch.helpers({
|
||||
timepointBrowserData() {
|
||||
const instance = Template.instance();
|
||||
const { timepointApi } = OHIF.viewer;
|
||||
const currentTimepoint = instance.currentTimepoint.get();
|
||||
let timepoints;
|
||||
if (instance.showAdditional.get()) {
|
||||
timepoints = timepointApi.key();
|
||||
} else {
|
||||
timepoints = [currentTimepoint];
|
||||
}
|
||||
|
||||
return {
|
||||
timepointApi,
|
||||
timepoints,
|
||||
timepoints: instance.timepoints.get(),
|
||||
timepointChildTemplate: 'timepointBrowserStudies'
|
||||
};
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user