Remove tabbed layout in favour of current Lesion Tracker design (OHIF-49)

This commit is contained in:
Erik Ziegler 2016-07-23 20:11:01 +02:00
parent 8b364ce9d0
commit 82e374b1e3
48 changed files with 371 additions and 511 deletions

View File

@ -1,20 +1,2 @@
body body
background-color: black background-color: black
/* Mobile devices */
@media only screen and (min-device-width : 375px) and (max-device-width : 768px)
.logoContainer
width: 15%
table#tblStudyList
table-layout: fixed
font-size: 0.7em
#tablist
width: 85%
overflow-x: auto
@media (max-device-width: 667px)
#toolbar .btn-group button
width: 35px
height: 35px

View File

@ -11,4 +11,7 @@
<meta name="MobileOptimized" content="320"> <meta name="MobileOptimized" content="320">
<meta name="HandheldFriendly" content="True"> <meta name="HandheldFriendly" content="True">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<link href='http://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Sanchez:400,700&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
</head> </head>

View File

@ -14,8 +14,8 @@ Object.keys(ViewerData).forEach(function(contentId) {
}); });
Router.configure({ Router.configure({
layoutTemplate: 'lesionTrackerLayout', layoutTemplate: 'layout',
loadingTemplate: 'lesionTrackerLayout' loadingTemplate: 'layout'
}); });
Router.onBeforeAction('loading'); Router.onBeforeAction('loading');
@ -50,7 +50,7 @@ Router.route('/', function() {
}); });
Router.route('/viewer/timepoints/:_id', { Router.route('/viewer/timepoints/:_id', {
layoutTemplate: 'lesionTrackerLayout', layoutTemplate: 'layout',
name: 'viewer', name: 'viewer',
onBeforeAction: function() { onBeforeAction: function() {
var timepointId = this.params._id; var timepointId = this.params._id;

View File

@ -1,8 +1,8 @@
Template.flexboxLayout.events({ Template.flexboxLayout.events({
'transitionend .sidebarMenu'(event, instance) { 'transitionend .sidebarMenu'() {
handleResize(); handleResize();
}, },
'transitionend .sidebar-option'(event, instance) { 'transitionend .sidebar-option'(event) {
// Prevent this event from bubbling // Prevent this event from bubbling
event.stopPropagation(); event.stopPropagation();
} }

View File

@ -1,13 +0,0 @@
<template name="layout">
<nav class="topBar noselect" role="navigation">
<div class="clearfix p-x-1 p-t-1">
<a class="brandSection pull-left" href="http://www.ohif.org">
<img class="logoImage" src="/images/logo.png">
<div class="logoText">
Open Health Imaging Foundation
</div>
</a>
</div>
</nav>
{{> yield}}
</template>

View File

@ -1,27 +0,0 @@
@import "{design}/app"
.topBar
margin-bottom: 0
border-radius: 0
background-color: $primaryBackgroundColor
border: none
height: $topBarHeight
color: $textPrimaryColor
transition(all 0.3s ease)
.brandSection
display: inline-block
height: 30px
text-decoration: none
img.logoImage
display: inline-block
height: 100%
max-height: 50px
margin: 0 5px
div.logoText
display: inline-block
font-family: $logoFontFamily
font-weight: $logoFontWeight
color: $textPrimaryColor

View File

@ -0,0 +1,18 @@
<template name="ohifViewer">
<div class="topBar noselect {{#if onStudyList}}studyList{{/if}}">
<div class="clearfix p-x-1 p-t-1">
<a class="brandSection pull-left" href="http://ohif.org">
<img class="logoImage" src="/images/logo.png">
<div class="logoText">
Open Health Imaging Foundation
</div>
</a>
{{ #if studyListToggleText }}
<div class="studyListLinkSection pull-left m-x-1 p-x-2 js-toggle-studyList">
{{studyListToggleText}}
</div>
{{ /if }}
</div>
</div>
{{> worklist }}
</template>

View File

@ -0,0 +1,58 @@
const worklistContentId = 'worklistTab';
const viewerContentId = 'viewerTab';
// Define the ViewerData global object
// If there is currently any Session data for this object,
// use this to repopulate the variable
Template.ohifViewer.onCreated(() => {
ViewerData = Session.get('ViewerData') || {};
});
Template.ohifViewer.onRendered(() => {
const templateData = Template.currentData();
if (templateData && templateData.studyInstanceUid) {
const studyInstanceUid = templateData.studyInstanceUid;
openNewTab(studyInstanceUid, studyInstanceUid);
} else {
// If there is a tab set as active in the Session,
// switch to that now.
const contentId = Session.get('activeContentId');
// TODO: Fix this it seems to be forcing two switches
switchToTab(contentId);
}
});
Template.ohifViewer.events({
'click .js-toggle-studyList'() {
const contentId = Session.get('activeContentId');
if (contentId !== worklistContentId) {
switchToTab(worklistContentId);
} else {
switchToTab(viewerContentId);
}
}
});
Template.ohifViewer.helpers({
studyListToggleText() {
const contentId = Session.get('activeContentId');
// If the Viewer has not been opened yet, 'Back to viewer' should
// not be displayed
const viewerContentExists = !!Object.keys(ViewerData).length;
if (!viewerContentExists) {
return;
}
if (contentId === worklistContentId) {
return 'Back to viewer';
} else {
return 'Study list';
}
},
onStudyList() {
return (Session.get('activeContentId') === 'worklistTab');
}
});

View File

@ -0,0 +1,74 @@
@import "{design}/app"
$expandedHeight = 160px
img.logoImage
display: inline-block
height: 100%
.topBar
height: $topBarHeight
color: $textPrimaryColor
background-color: $primaryBackgroundColor
transition(all 0.5s ease)
.brandSection
height: 30px
display: inline-block
text-decoration: none
img.logoImage
margin: 0 5px
.logoText
display: inline-block
font-family: $logoFontFamily
font-weight: $logoFontWeight
color: $textPrimaryColor
.studyListLinkSection
border-left: $uiBorderThickness solid $uiBorderColor;
color: $textSecondaryColor
cursor: pointer
font-size: 13px
font-weight: 500
line-height: 26px
margin-top: 3px
&:hover
color: $hoverColor
&:active
color: $activeColor
&.studyList
background-color: rgba(21, 25, 30, 0.7)
height: $expandedHeight
.brandSection
height: 100%
width: 80%
padding-left: 50px
line-height: $expandedHeight
img.logoImage
margin: 5px 5px 15px 5px
.logoText
font-size: 30px
.studyListLinkSection
position: absolute
border: none
top: 5px
left: 5px
#worklistTabs
height: "calc(100% - %s)" % $topBarHeight
.tab-pane
.viewerContainer
.loadingTextDiv
color: $textSecondaryColor
font-size: 30px
font-weight: 200

View File

@ -4,9 +4,11 @@
<div class="pull-left m-t-1"> <div class="pull-left m-t-1">
{{>roundedButtonGroup leftSidebarToggleButtonData}} {{>roundedButtonGroup leftSidebarToggleButtonData}}
</div> </div>
{{> toolbarSectionTools toolbarButtons=toolbarButtons extraToolbarButtons=extraToolbarButtons}} {{> toolbarSectionTools
toolbarButtons=toolbarButtons
extraToolbarButtons=extraToolbarButtons}}
<div class="pull-right m-t-1 rm-x-1"> <div class="pull-right m-t-1 rm-x-1">
{{>roundedButtonGroup rightSidebarToggleButtonData}} {{> roundedButtonGroup rightSidebarToggleButtonData}}
</div> </div>
<div class="pull-right"> <div class="pull-right">
{{> toolbarSectionTools toolbarButtons=hangingProtocolButtons}} {{> toolbarSectionTools toolbarButtons=hangingProtocolButtons}}

View File

@ -9,6 +9,6 @@
{{> flexboxLayout (clone this)}} {{> flexboxLayout (clone this)}}
</div> </div>
{{else}} {{else}}
{{>loadingText}} {{> loadingText}}
{{/if}} {{/if}}
</template> </template>

View File

@ -29,23 +29,11 @@ Template.viewer.onCreated(() => {
instance.data.state.set('leftSidebar', Session.get('leftSidebar')); instance.data.state.set('leftSidebar', Session.get('leftSidebar'));
instance.data.state.set('rightSidebar', Session.get('rightSidebar')); instance.data.state.set('rightSidebar', Session.get('rightSidebar'));
Meteor.subscribe('hangingprotocols'); instance.subscribe('hangingprotocols');
log.info('viewer onCreated');
if (isTouchDevice()) {
OHIF.viewer.tooltipConfig = {
trigger: 'manual'
};
} else {
OHIF.viewer.tooltipConfig = {
trigger: 'hover'
};
}
const contentId = instance.data.contentId; const contentId = instance.data.contentId;
if (ViewerData[contentId].loadedSeriesData) { if (ViewerData[contentId] && ViewerData[contentId].loadedSeriesData) {
log.info('Reloading previous loadedSeriesData'); log.info('Reloading previous loadedSeriesData');
OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData; OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData;
@ -53,7 +41,7 @@ Template.viewer.onCreated(() => {
} else { } else {
log.info('Setting default ViewerData'); log.info('Setting default ViewerData');
OHIF.viewer.loadedSeriesData = {}; OHIF.viewer.loadedSeriesData = {};
ViewerData[contentId] = {};
ViewerData[contentId].loadedSeriesData = OHIF.viewer.loadedSeriesData; ViewerData[contentId].loadedSeriesData = OHIF.viewer.loadedSeriesData;
// Update the viewer data object // Update the viewer data object
@ -85,4 +73,4 @@ Template.viewer.events({
const current = instance.data.state.get('rightSidebar'); const current = instance.data.state.get('rightSidebar');
instance.data.state.set('rightSidebar', !current); instance.data.state.set('rightSidebar', !current);
}, },
}) });

View File

@ -1,31 +1,11 @@
@import "{design}/app.styl" @import "{design}/app"
#viewer #viewer
border-top: 1px solid #525252
height: 100%
width: 100%
align-items: stretch align-items: stretch
background-color: black background-color: black
display: flex display: flex
flex-flow: column wrap flex-flow: column wrap
height: 100%
width: 100%
margin: 0 margin: 0
padding: 0 padding: 0
#toolbar
float: left
height: 30px
a.btn
text-align: center
color: $defaultColor
background-color: $primaryBackgroundColor
transition(all 0.1s ease)
// Prevent the blue outline in Chrome when a viewport is selected
outline: 0 !important
&:hover
color: $hoverColor
&.active, &:active
color: $activeColor

View File

@ -8,4 +8,7 @@
<meta name="MobileOptimized" content="320"> <meta name="MobileOptimized" content="320">
<meta name="HandheldFriendly" content="True"> <meta name="HandheldFriendly" content="True">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<link href='http://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Sanchez:400,700&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
</head> </head>

View File

@ -17,13 +17,12 @@ Router.configure({
}); });
Router.onBeforeAction('loading'); Router.onBeforeAction('loading');
Router.onBeforeAction(function() {
Router.route('/', function() { this.next();
this.render('worklist');
}); });
Router.route('/worklist', function() { Router.route('/', function() {
this.render('worklist'); this.render('ohifViewer');
}); });
Router.route('/viewer/:_id', { Router.route('/viewer/:_id', {
@ -37,11 +36,12 @@ Router.route('/viewer/:_id', {
var tabs = WorklistTabs.find({ var tabs = WorklistTabs.find({
studyInstanceUid: studyInstanceUid studyInstanceUid: studyInstanceUid
}); });
if (tabs.count()) { if (tabs.count()) {
return; return;
} }
this.render('worklist', { this.render('ohifViewer', {
data: function() { data: function() {
return { return {
studyInstanceUid: studyInstanceUid studyInstanceUid: studyInstanceUid
@ -50,9 +50,3 @@ Router.route('/viewer/:_id', {
}); });
} }
}); });
Router.onBeforeAction(function() {
// User is logged in, go ahead and route them
this.next();
});

View File

@ -1,2 +1,4 @@
@import url(http://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic&subset=latin,latin-ext) // TODO: Find out why Meteor is complaining about these?
@import url(http://fonts.googleapis.com/css?family=Sanchez:400,700&subset=latin,latin-ext) // Replaced them with <link>'s in the HEAD.html of each application, for now.
//@import url(http://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic&subset=latin,latin-ext)
//@import url(http://fonts.googleapis.com/css?family=Sanchez:400,700&subset=latin,latin-ext)

View File

@ -1,10 +1,5 @@
import { OHIF } from 'meteor/ohif:core'; import { OHIF } from 'meteor/ohif:core';
Template.matchedProtocols.onRendered(() => {
const instance = Template.instance();
instance.$('#matchedProtocols button').tooltip(OHIF.viewer.tooltipConfig);
});
Template.matchedProtocols.helpers({ Template.matchedProtocols.helpers({
/** /**
* Reactively re-render the MatchedProtocols Collection contents * Reactively re-render the MatchedProtocols Collection contents

View File

@ -6,7 +6,7 @@ ViewerData = Session.get('ViewerData') || {};
const worklistContentId = 'worklistTab'; const worklistContentId = 'worklistTab';
const viewerContentId = 'viewerTab'; const viewerContentId = 'viewerTab';
Template.lesionTracker.onRendered(function() { Template.lesionTracker.onRendered(() => {
const templateData = Template.currentData(); const templateData = Template.currentData();
if (templateData && templateData.studyInstanceUid) { if (templateData && templateData.studyInstanceUid) {
const studyInstanceUid = templateData.studyInstanceUid; const studyInstanceUid = templateData.studyInstanceUid;
@ -19,12 +19,10 @@ Template.lesionTracker.onRendered(function() {
// TODO: Fix this it seems to be forcing two switches // TODO: Fix this it seems to be forcing two switches
switchToTab(contentId); switchToTab(contentId);
} }
Meteor.subscribe('hangingprotocols');
}); });
Template.lesionTracker.events({ Template.lesionTracker.events({
'click .js-toggle-studyList': function() { 'click .js-toggle-studyList'() {
const contentId = Session.get('activeContentId'); const contentId = Session.get('activeContentId');
if (contentId !== worklistContentId) { if (contentId !== worklistContentId) {
@ -38,7 +36,7 @@ Template.lesionTracker.events({
Session.set('defaultSignInMessage', 'Tumor tracking in your browser.'); Session.set('defaultSignInMessage', 'Tumor tracking in your browser.');
Template.lesionTracker.helpers({ Template.lesionTracker.helpers({
studyListToggleText: function() { studyListToggleText() {
const contentId = Session.get('activeContentId'); const contentId = Session.get('activeContentId');
// If the Viewer has not been opened yet, 'Back to viewer' should // If the Viewer has not been opened yet, 'Back to viewer' should
@ -54,7 +52,7 @@ Template.lesionTracker.helpers({
return 'Study list'; return 'Study list';
} }
}, },
onStudyList: function() { onStudyList() {
return (Session.get('activeContentId') === 'worklistTab'); return (Session.get('activeContentId') === 'worklistTab');
} }
}); });

View File

@ -72,14 +72,3 @@ img.logoImage
color: $textSecondaryColor color: $textSecondaryColor
font-size: 30px font-size: 30px
font-weight: 200 font-weight: 200
// Override Viewerbase's borders
#imageViewerViewports .viewportContainer
border: none !important
outline: 0 !important // Prevent blue outline in Chrome
&:hover
&.active
&:hover.active
border: none !important
outline: 0 !important // Prevent blue outline in Chrome

View File

@ -1,3 +0,0 @@
<template name="lesionTrackerLayout">
{{>yield }}
</template>

View File

@ -26,6 +26,8 @@ Template.viewer.onCreated(() => {
instance.data.state.set('leftSidebar', Session.get('leftSidebar')); instance.data.state.set('leftSidebar', Session.get('leftSidebar'));
instance.data.state.set('rightSidebar', Session.get('rightSidebar')); instance.data.state.set('rightSidebar', Session.get('rightSidebar'));
instance.subscribe('hangingprotocols');
Session.set('currentTimepointId', instance.data.currentTimepointId); Session.set('currentTimepointId', instance.data.currentTimepointId);
const contentId = instance.data.contentId; const contentId = instance.data.contentId;
@ -49,18 +51,6 @@ Template.viewer.onCreated(() => {
OHIF.viewer.defaultHotkeys.bidirectional = 'T'; // Target OHIF.viewer.defaultHotkeys.bidirectional = 'T'; // Target
OHIF.viewer.defaultHotkeys.nonTarget = 'N'; // Non-target OHIF.viewer.defaultHotkeys.nonTarget = 'N'; // Non-target
if (isTouchDevice()) {
OHIF.viewer.tooltipConfig = {
trigger: 'manual'
};
} else {
OHIF.viewer.tooltipConfig = {
trigger: 'hover'
};
}
OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer('CornerstoneNewImage', cornerstoneTools.updateImageSynchronizer);
if (ViewerData[contentId].loadedSeriesData) { if (ViewerData[contentId].loadedSeriesData) {
log.info('Reloading previous loadedSeriesData'); log.info('Reloading previous loadedSeriesData');
OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData; OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData;
@ -68,20 +58,7 @@ Template.viewer.onCreated(() => {
} else { } else {
log.info('Setting default ViewerData'); log.info('Setting default ViewerData');
OHIF.viewer.loadedSeriesData = {}; OHIF.viewer.loadedSeriesData = {};
ViewerData[contentId].loadedSeriesData = {};
ViewerData[contentId].loadedSeriesData = OHIF.viewer.loadedSeriesData;
// Update the viewer data object
if (!instance.data.timepointIds || instance.data.timepointIds.length <= 1) {
// Update the viewer data object
ViewerData[contentId].viewportColumns = 1;
ViewerData[contentId].viewportRows = 1;
} else if (instance.data.timepointIds.length > 1) {
ViewerData[contentId].viewportColumns = 2;
ViewerData[contentId].viewportRows = 1;
}
ViewerData[contentId].activeViewport = 0;
Session.set('ViewerData', ViewerData); Session.set('ViewerData', ViewerData);
} }
@ -109,10 +86,7 @@ Template.viewer.onCreated(() => {
instance.subscribe('singlePatientImageMeasurements', dataContext.studies[0].patientId); instance.subscribe('singlePatientImageMeasurements', dataContext.studies[0].patientId);
instance.subscribe('singlePatientAdditionalFindings', dataContext.studies[0].patientId); instance.subscribe('singlePatientAdditionalFindings', dataContext.studies[0].patientId);
const subscriptionsReady = instance.subscriptionsReady(); if (instance.subscriptionsReady()) {
log.info('autorun viewer.js. Ready: ' + subscriptionsReady);
if (subscriptionsReady) {
// Set buttons as enabled/disabled when Timepoints collection is ready // Set buttons as enabled/disabled when Timepoints collection is ready
timepointAutoCheck(dataContext); timepointAutoCheck(dataContext);

View File

@ -6,6 +6,23 @@
display: flex display: flex
flex-flow: column wrap flex-flow: column wrap
height: 100% height: 100%
width: 100%
margin: 0 margin: 0
padding: 0 padding: 0
width: 100%
#imageViewerViewports
.viewportContainer
border: none !important
outline: 0 !important // Prevent blue outline in Chrome
&:hover
&.active
&:hover.active
border: none !important
outline: 0 !important // Prevent blue outline in Chrome
&:not(:last-child)
.removable
.imageViewerViewport
border-right: $uiBorderThickness solid #436270

View File

@ -56,6 +56,8 @@ Package.onUse(function(api) {
bare: true bare: true
}); });
api.addFiles('client/tools.js', 'client');
// UI Components // UI Components
api.addFiles('client/components/viewer/viewer.html', 'client'); api.addFiles('client/components/viewer/viewer.html', 'client');
api.addFiles('client/components/viewer/viewer.styl', 'client'); api.addFiles('client/components/viewer/viewer.styl', 'client');
@ -81,8 +83,6 @@ Package.onUse(function(api) {
api.addFiles('client/components/lesionTracker/lesionTracker.styl', 'client'); api.addFiles('client/components/lesionTracker/lesionTracker.styl', 'client');
api.addFiles('client/components/lesionTracker/lesionTracker.js', 'client'); api.addFiles('client/components/lesionTracker/lesionTracker.js', 'client');
api.addFiles('client/components/lesionTrackerLayout/lesionTrackerLayout.html', 'client');
api.addFiles('client/components/additionalFindings/additionalFindings.html', 'client'); api.addFiles('client/components/additionalFindings/additionalFindings.html', 'client');
api.addFiles('client/components/additionalFindings/additionalFindings.styl', 'client'); api.addFiles('client/components/additionalFindings/additionalFindings.styl', 'client');
api.addFiles('client/components/additionalFindings/additionalFindings.js', 'client'); api.addFiles('client/components/additionalFindings/additionalFindings.js', 'client');

View File

@ -0,0 +1,3 @@
<template name="layout">
{{>yield }}
</template>

View File

@ -1,11 +0,0 @@
<template name="relatedStudySelect">
<div class="relatedStudySelect">
<label>Study:</label>
<span class="loading"><i class="fa fa-spinner fa-spin"></i></span>
<select id="selectStudyDate">
{{#each relatedStudies}}
<option value="{{studyInstanceUid}}" selected={{selected}}>{{formatDA studyDate}}: {{studyDescription}}</option>
{{/each}}
</select>
</div>
</template>

View File

@ -1,105 +0,0 @@
Template.relatedStudySelect.helpers({
/**
* Returns an array of studies that are related to the current study by patient ID.
* The value for 'selected' for the currently loaded study is set to true, so that
* this becomes the current option in the combo box.
*
* @returns {*} Array of studies that are related to the current study by patient ID
*/
relatedStudies: function() {
// Check which study is currently loaded into the study browser
var currentStudyInBrowser = ViewerStudies.findOne({
selected: true
});
// Find all studies in the Worklist which have the same patientId as the currently selected study
var relatedStudies = WorklistStudies.find({
patientId: currentStudyInBrowser.patientId
}, {
sort: {
studyDate: -1
}
}).fetch();
// If no Study / Timepoint associated studies exist, just
// return the list of loaded studies
if (!relatedStudies.length) {
return ViewerStudies.find();
}
// Modify the array of related studies so the default option is the currently selected study
relatedStudies.forEach(function(study, index) {
// If the studyInstanceUid matches that of the current study in the browser,
// Set this to 'selected', so that it becomes the default option
if (study.studyInstanceUid === currentStudyInBrowser.studyInstanceUid) {
relatedStudies[index].selected = true;
}
});
// Use this array to populate the combo box
return relatedStudies;
}
});
Template.relatedStudySelect.events({
/**
* When the study date selector combo box is changed, we will
* hide the select box, temporarily display a loading sign, and grab
* the selected study. Once the study has been retrieved it is added
* into the ViewerStudies collection and set as selected. This reactively
* populated the thumbnail browser.
*
* @param e The select box change event
*/
'change select#selectStudyDate': function(e) {
var selectBox = $(e.currentTarget);
var studyInstanceUid = selectBox.val();
// Hide the select box
selectBox.css('display', 'none');
// Show the loading indicator
var loadingIndicator = selectBox.siblings('.loading');
loadingIndicator.css('display', 'block');
getStudyMetadata(studyInstanceUid, function(study) {
sortStudy(study);
// Hide the loading indicator
loadingIndicator.css('display', 'none');
// Show the select box again
selectBox.css('display', 'block');
// Set "Selected" to false for the entire collection
ViewerStudies.update({}, {
$set: {
selected: false
}
}, {
multi: true
});
// Check if this study already exists in the ViewerStudies collection
// of loaded studies. If it does, set it's 'selected' value to true.
var existingStudy = ViewerStudies.findOne({
studyInstanceUid: studyInstanceUid
});
if (existingStudy) {
// Set the current finding in the collection to true
ViewerStudies.update(existingStudy._id, {
$set: {
selected: true
}
});
return;
}
// If the study does not exist, add the 'selected' key to the object
// with the value True, and insert it into the ViewerStudies Collection
study.selected = true;
ViewerStudies.insert(study);
});
}
});

View File

@ -1,23 +0,0 @@
.relatedStudySelect
margin: 0 auto 15px
text-align: center
width: 100px
#selectStudyDate
color: black
background-color: #666
border-color: #666
width: 96%
margin: 0 auto
label
font-weight: normal
color: #666
float: left
padding-left: 2%
.loading
display: none
color: white
text-align: center

View File

@ -30,11 +30,3 @@ Template.gridLayout.helpers({
return viewportData; return viewportData;
} }
}); });
Template.gridLayout.onRendered(function() {
OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer('CornerstoneNewImage', cornerstoneTools.updateImageSynchronizer);
});
Template.gridLayout.onDestroyed(function() {
OHIF.viewer.updateImageSynchronizer.destroy();
});

View File

@ -3,18 +3,3 @@
#imageViewerViewports #imageViewerViewports
height: 100% height: 100%
width: 100% width: 100%
.viewportContainer
float: left
border: $viewportBorderThickness solid $viewportBorderColor
&.active, &:hover.active
border: $viewportBorderThickness solid $viewportBorderColorActive
&:hover
border: $viewportBorderThickness solid $viewportBorderColorHover
.removable
width: 100%
height: 100%
position: relative // Necessary so that the viewportOverlay is on top of the viewports

View File

@ -25,6 +25,11 @@ function loadSeriesIntoViewport(data, templateData) {
var viewportIndex = $('.imageViewerViewport').index(element); var viewportIndex = $('.imageViewerViewport').index(element);
layoutManager = layoutManager || window.layoutManager; layoutManager = layoutManager || window.layoutManager;
layoutManager.viewportData = layoutManager.viewportData || {};
if (layoutManager.viewportData[viewportIndex] === undefined) {
layoutManager.viewportData[viewportIndex] = {};
}
layoutManager.viewportData[viewportIndex].viewportIndex = viewportIndex; layoutManager.viewportData[viewportIndex].viewportIndex = viewportIndex;
// Get the contentID of the current worklist tab, if the viewport is running // Get the contentID of the current worklist tab, if the viewport is running

View File

@ -1,6 +1,9 @@
Template.viewerMain.onCreated(() => { Template.viewerMain.onCreated(() => {
// Attach the Window resize listener // Attach the Window resize listener
$(window).on('resize', handleResize); $(window).on('resize', handleResize);
// Create the synchronizer used to update reference lines
OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer('CornerstoneNewImage', cornerstoneTools.updateImageSynchronizer);
}); });
Template.viewerMain.onRendered(() => { Template.viewerMain.onRendered(() => {
@ -21,6 +24,6 @@ Template.viewerMain.onDestroyed(() => {
// Remove the Window resize listener // Remove the Window resize listener
$(window).off('resize', handleResize); $(window).off('resize', handleResize);
// Destory the synchronizer used to update reference lines // Destroy the synchronizer used to update reference lines
OHIF.viewer.updateImageSynchronizer.destroy(); OHIF.viewer.updateImageSynchronizer.destroy();
}); });

View File

@ -7,11 +7,22 @@
#layoutManagerTarget #layoutManagerTarget
width: 100% width: 100%
height: 100% height: 100%
transition(all 0.3s ease) transition(all 0.3s ease)
#imageViewerViewports #imageViewerViewports
.viewportContainer:not(:last-child) .viewportContainer
float: left
border: $viewportBorderThickness solid $viewportBorderColor
&:hover
border: $viewportBorderThickness solid $viewportBorderColorHover
&.active, &:hover.active
border: $viewportBorderThickness solid $viewportBorderColorActive
.removable .removable
.imageViewerViewport width: 100%
border-right: $uiBorderThickness solid #436270 height: 100%
position: relative // Necessary so that the viewportOverlay is on top of the viewports

View File

@ -11,13 +11,13 @@
<div>{{formatDA studyDate}} {{formatTM studyTime}}</div> <div>{{formatDA studyDate}} {{formatTM studyTime}}</div>
</div> </div>
<div class="bottomright dicomTag"> <div class="bottomright dicomTag">
<div>Zoom: {{formatNumberPrecision zoom 2}}%</div> <div>{{#if zoom}}Zoom: {{formatNumberPrecision zoom 2}}%{{/if}}</div>
<div>{{compression}}</div> <div>{{compression}}</div>
<div>{{wwwc}}</div> <div>{{wwwc}}</div>
</div> </div>
<div class="bottomleft dicomTag"> <div class="bottomleft dicomTag">
<div>Ser: {{seriesNumber}}</div> <div>{{#if seriesNumber}}Ser: {{seriesNumber}}{{/if}}</div>
<div>Img: {{imageNumber}} ({{imageIndex}}/{{numImages}})</div> <div>{{#if numImages}}Img: {{imageNumber}} ({{imageIndex}}/{{numImages}}){{/if}}</div>
<div>{{#if frameRate}}{{frameRate}} FPS{{/if}}</div> <div>{{#if frameRate}}{{frameRate}} FPS{{/if}}</div>
<div>{{imageDimensions}}</div> <div>{{imageDimensions}}</div>
<div>{{seriesDescription}}</div> <div>{{seriesDescription}}</div>
@ -33,12 +33,12 @@
<div>{{formatDA studyDate}} {{formatTM studyTime}}</div> <div>{{formatDA studyDate}} {{formatTM studyTime}}</div>
</div> </div>
<div class="bottomright dicomTag"> <div class="bottomright dicomTag">
<div>Ser: {{seriesNumber}}</div> <div>{{#if seriesNumber}}Ser: {{seriesNumber}}{{/if}}</div>
<div>Img: {{imageNumber}} ({{imageIndex}}/{{numImages}})</div> <div>{{#if numImages}}Img: {{imageNumber}} ({{imageIndex}}/{{numImages}}){{/if}}</div>
<div>{{#if frameRate}}{{frameRate}} FPS{{/if}}</div> <div>{{#if frameRate}}{{frameRate}} FPS{{/if}}</div>
<div>{{imageDimensions}}</div> <div>{{imageDimensions}}</div>
<div>{{seriesDescription}}</div> <div>{{seriesDescription}}</div>
<div>Zoom: {{formatNumberPrecision zoom 2}}%</div> <div>{{#if zoom}}Zoom: {{formatNumberPrecision zoom 2}}%{{/if}}</div>
<div>{{compression}}</div> <div>{{compression}}</div>
<div>{{wwwc}}</div> <div>{{wwwc}}</div>
</div> </div>
@ -53,12 +53,12 @@
<div>{{formatDA studyDate}} {{formatTM studyTime}}</div> <div>{{formatDA studyDate}} {{formatTM studyTime}}</div>
</div> </div>
<div class="bottomleft dicomTag"> <div class="bottomleft dicomTag">
<div>Ser: {{seriesNumber}}</div> <div>{{#if seriesNumber}}Ser: {{seriesNumber}}{{/if}}</div>
<div>Img: {{imageNumber}} ({{imageIndex}}/{{numImages}})</div> <div>{{#if numImages}}Img: {{imageNumber}} ({{imageIndex}}/{{numImages}}){{/if}}</div>
<div>{{#if frameRate}}{{frameRate}} FPS{{/if}}</div> <div>{{#if frameRate}}{{frameRate}} FPS{{/if}}</div>
<div>{{imageDimensions}}</div> <div>{{imageDimensions}}</div>
<div>{{seriesDescription}}</div> <div>{{seriesDescription}}</div>
<div>Zoom: {{formatNumberPrecision zoom 2}}%</div> <div>{{#if zoom}}Zoom: {{formatNumberPrecision zoom 2}}%{{/if}}</div>
<div>{{compression}}</div> <div>{{compression}}</div>
<div>{{wwwc}}</div> <div>{{wwwc}}</div>
</div> </div>

View File

@ -133,12 +133,12 @@ Template.viewportOverlay.helpers({
Session.get('CornerstoneImageRendered' + this.viewportIndex); Session.get('CornerstoneImageRendered' + this.viewportIndex);
var element = getElementIfNotEmpty(this.viewportIndex); var element = getElementIfNotEmpty(this.viewportIndex);
if (!element) { if (!element) {
return ''; return;
} }
var viewport = cornerstone.getViewport(element); var viewport = cornerstone.getViewport(element);
if (!viewport) { if (!viewport) {
return ''; return;
} }
return (viewport.scale * 100.0); return (viewport.scale * 100.0);

View File

@ -44,7 +44,7 @@ importStudies = function(filesToImport, importCallback) {
if (fileUploadStatus.numberOfFilesFailed > 0) { if (fileUploadStatus.numberOfFilesFailed > 0) {
//TODO: Some files failed to upload, so let user know //TODO: Some files failed to upload, so let user know
console.log("Failed to upload " + fileUploadStatus.numberOfFilesFailed + " of " + numberOfFilesToUpload + " files"); log.info("Failed to upload " + fileUploadStatus.numberOfFilesFailed + " of " + numberOfFilesToUpload + " files");
} }
} }
}; };

View File

@ -34,6 +34,7 @@ Package.onUse(function(api) {
// ---------- Components ---------- // ---------- Components ----------
// Basic components // Basic components
api.addFiles('client/components/basic/layout/layout.html', 'client');
api.addFiles('client/components/basic/loadingText/loadingText.html', 'client'); api.addFiles('client/components/basic/loadingText/loadingText.html', 'client');
api.addFiles('client/components/basic/loadingText/loadingText.styl', 'client'); api.addFiles('client/components/basic/loadingText/loadingText.styl', 'client');
@ -44,15 +45,15 @@ Package.onUse(function(api) {
api.addFiles('client/components/basic/confirmDeleteDialog/confirmDeleteDialog.styl', 'client'); api.addFiles('client/components/basic/confirmDeleteDialog/confirmDeleteDialog.styl', 'client');
api.addFiles('client/components/basic/confirmDeleteDialog/confirmDeleteDialog.js', 'client'); api.addFiles('client/components/basic/confirmDeleteDialog/confirmDeleteDialog.js', 'client');
api.addFiles('client/components/basic/emailVerification/emailVerification.html', 'client');
api.addFiles('client/components/basic/emailVerification/emailVerification.styl', 'client');
api.addFiles('client/components/basic/emailVerification/emailVerification.js', 'client');
// Study Browser components // Study Browser components
api.addFiles('client/components/studyBrowser/studyBrowser/studyBrowser.html', 'client'); api.addFiles('client/components/studyBrowser/studyBrowser/studyBrowser.html', 'client');
api.addFiles('client/components/studyBrowser/studyBrowser/studyBrowser.js', 'client'); api.addFiles('client/components/studyBrowser/studyBrowser/studyBrowser.js', 'client');
api.addFiles('client/components/studyBrowser/studyBrowser/studyBrowser.styl', 'client'); api.addFiles('client/components/studyBrowser/studyBrowser/studyBrowser.styl', 'client');
api.addFiles('client/components/studyBrowser/relatedStudySelect/relatedStudySelect.html', 'client');
api.addFiles('client/components/studyBrowser/relatedStudySelect/relatedStudySelect.js', 'client');
api.addFiles('client/components/studyBrowser/relatedStudySelect/relatedStudySelect.styl', 'client');
api.addFiles('client/components/studyBrowser/thumbnailEntry/thumbnailEntry.html', 'client'); api.addFiles('client/components/studyBrowser/thumbnailEntry/thumbnailEntry.html', 'client');
api.addFiles('client/components/studyBrowser/thumbnailEntry/thumbnailEntry.js', 'client'); api.addFiles('client/components/studyBrowser/thumbnailEntry/thumbnailEntry.js', 'client');
api.addFiles('client/components/studyBrowser/thumbnailEntry/thumbnailEntry.styl', 'client'); api.addFiles('client/components/studyBrowser/thumbnailEntry/thumbnailEntry.styl', 'client');
@ -139,6 +140,7 @@ Package.onUse(function(api) {
api.addFiles('lib/setMammogramViewportAlignment.js', 'client'); api.addFiles('lib/setMammogramViewportAlignment.js', 'client');
api.addFiles('lib/isImage.js', 'client'); api.addFiles('lib/isImage.js', 'client');
api.addFiles('lib/sopClassDictionary.js', 'client'); api.addFiles('lib/sopClassDictionary.js', 'client');
api.addFiles('lib/debugReactivity.js', 'client');
api.export('resizeViewportElements', 'client'); api.export('resizeViewportElements', 'client');
api.export('handleResize', 'client'); api.export('handleResize', 'client');

View File

@ -5,8 +5,10 @@
</div> </div>
<div class="dialogContent"> <div class="dialogContent">
<div class="progress"> <div class="progress">
<div class="progress-bar progress-bar-striped active" role="progressbar" style="width:{{progressStatus}}"> <div class="progress-bar progress-bar-striped active"
{{progressStatus}} role="progressbar"
style="width:{{progressStatus}}">
{{formatNumberPrecision progressStatus 0}}%
</div> </div>
</div> </div>
<div id="message"> <div id="message">

View File

@ -1,56 +1,69 @@
progressDialog = { progressDialog = {
'show': function(title, numberOfTotal) { show: function(title, numberOfTotal) {
Session.set("progressDialogSettings", { title: title, numberOfCompleted: 0, numberOfTotal: numberOfTotal }); Session.set('progressDialogSettings', {
title: title,
numberOfCompleted: 0,
numberOfTotal: numberOfTotal
});
$('#progressDialog').css('display', 'block'); $('#progressDialog').css('display', 'block');
}, },
'update': function(numberOfCompleted) { update: function(numberOfCompleted) {
var progressDialogSettings = Session.get("progressDialogSettings"); var progressDialogSettings = Session.get('progressDialogSettings');
progressDialogSettings.numberOfCompleted = numberOfCompleted; progressDialogSettings.numberOfCompleted = numberOfCompleted;
Session.set("progressDialogSettings", progressDialogSettings); Session.set('progressDialogSettings', progressDialogSettings);
if (progressDialogSettings.numberOfCompleted === progressDialogSettings.numberOfTotal) { if (progressDialogSettings.numberOfCompleted === progressDialogSettings.numberOfTotal) {
progressDialog.close(); progressDialog.close();
} }
}, },
'close': function() { close: function() {
Session.set("progressDialogSettings", { title: "", numberOfCompleted: 0, numberOfTotal: 1 }); Session.set('progressDialogSettings', {
title: '',
numberOfCompleted: 0,
numberOfTotal: 1
});
$('#progressDialog').css('display', 'none'); $('#progressDialog').css('display', 'none');
}, },
'setMessage': function(message) { setMessage: function(message) {
var progressDialogSettings = Session.get("progressDialogSettings"); let progressDialogSettings = Session.get('progressDialogSettings');
progressDialogSettings.message = message; progressDialogSettings.message = message;
Session.set("progressDialogSettings", progressDialogSettings); Session.set('progressDialogSettings', progressDialogSettings);
} }
}; };
Template.progressDialog.helpers({ Template.progressDialog.helpers({
'progressDialogTitle': function () { progressDialogTitle() {
if (Session.get("progressDialogSettings") && Session.get("progressDialogSettings").title) { var settings = Session.get('progressDialogSettings');
return Session.get("progressDialogSettings").title; if (!settings) {
return;
} }
return ""; return settings.title;
}, },
'progressStatus': function() {
var numberOfCompleted = 0; progressStatus() {
if (Session.get("progressDialogSettings") && Session.get("progressDialogSettings").numberOfCompleted) { const settings = Session.get('progressDialogSettings');
numberOfCompleted = Session.get("progressDialogSettings").numberOfCompleted; if (!settings) {
return;
} }
var numberofTotal = 1; if (settings.numberOfCompleted === undefined ||
if (Session.get("progressDialogSettings") && Session.get("progressDialogSettings").numberOfTotal) { settings.numberOfTotal === undefined) {
numberofTotal = Session.get("progressDialogSettings").numberOfTotal; return;
} }
return parseInt((numberOfCompleted / numberofTotal) * 100) + "%"; return settings.numberOfCompleted / settings.numberOfTotal;
}, },
'progressMessage': function() {
var progressDialogSettings = Session.get("progressDialogSettings"); progressMessage() {
if (progressDialogSettings && progressDialogSettings.message) { var settings = Session.get('progressDialogSettings');
return progressDialogSettings.message; if (!settings) {
return;
} }
return;
return settings.message;
} }
}); });

View File

@ -1,12 +1,4 @@
<template name="worklist"> <template name="worklist">
<ul class="nav noselect" role="tablist" id="tablist">
<li role="presentation" class="tabTitle active">
<a data-target="#worklistTab" role="tab" data-toggle="tab">Study List</a>
</li>
{{#each worklistTabs }}
{{>tabTitle }}
{{/each }}
</ul>
<div id="worklistTabs" class="tab-content"> <div id="worklistTabs" class="tab-content">
<div role="tabpanel" class="tab-pane active" id="worklistTab"> <div role="tabpanel" class="tab-pane active" id="worklistTab">
<div class="worklistContainer"> <div class="worklistContainer">

View File

@ -13,59 +13,6 @@ body
margin: 0 auto margin: 0 auto
color: white color: white
#tabs
width: 100%
#tablist
border-bottom: 1px solid #424242
background-color: #202020
height: 41px
a:hover
background-color: transparent
.tabTitle
background-color: #202020
border-color: #424242
float: left
line-height: 30px
&:hover
color: black
background-color: white
button.close
color: black
&.active
background-color: #424242
border-color: #424242
&:hover
background-color: #424242
cursor: none
a
color: white
button.close
color: white
a
padding: 5px 15px
cursor: pointer
color: #424242
text-decoration: none
button.close
margin: 4px 0 4px 8px
text-shadow: none
color: white
text-decoration: none
&:hover
color: red
.tab-content .tab-content
width: 100% width: 100%
height: calc(100% - 91px) height: calc(100% - 91px)

View File

@ -8,8 +8,8 @@ Template.worklistResult.helpers({
* Returns a sorted instance of the WorklistStudies Collection * Returns a sorted instance of the WorklistStudies Collection
* by Patient name and Study Date in Ascending order. * by Patient name and Study Date in Ascending order.
*/ */
studies: function() { studies() {
var sortOption = Session.get('sortOption'); const sortOption = Session.get('sortOption');
if (sortOption) { if (sortOption) {
return WorklistStudies.find({}, { return WorklistStudies.find({}, {
sort: sortOption sort: sortOption
@ -24,22 +24,24 @@ Template.worklistResult.helpers({
}); });
}, },
numberOfStudies: function() { numberOfStudies() {
return WorklistStudies.find().count(); return WorklistStudies.find().count();
}, },
showLoadingText: function() { showLoadingText() {
return Session.get('searchResults').showLoadingText; return Session.get('searchResults').showLoadingText;
}, },
showNotFoundMessage: function() { showNotFoundMessage() {
return Session.get('searchResults').showNotFoundMessage; return Session.get('searchResults').showNotFoundMessage;
}, },
sortingColumnsIcons: function() { sortingColumnsIcons() {
var sortingColumnsIcons = {}; const instance = Template.instance();
Object.keys(Template.instance().sortingColumns.keys).forEach(function(key) {
var value = Template.instance().sortingColumns.get(key); let sortingColumnsIcons = {};
Object.keys(instance.sortingColumns.keys).forEach(key => {
const value = instance.sortingColumns.get(key);
if (value === 1) { if (value === 1) {
sortingColumnsIcons[key] = 'fa fa-fw fa-sort-up'; sortingColumnsIcons[key] = 'fa fa-fw fa-sort-up';
@ -102,10 +104,10 @@ function replaceUndefinedColumnValue(text) {
* Convert string to study date * Convert string to study date
*/ */
function convertStringToStudyDate(dateStr) { function convertStringToStudyDate(dateStr) {
var y = dateStr.substring(0, 4); const y = dateStr.substring(0, 4);
var m = dateStr.substring(4, 6); const m = dateStr.substring(4, 6);
var d = dateStr.substring(6, 8); const d = dateStr.substring(6, 8);
var newDateStr = m + '/' + d + '/' + y; const newDateStr = m + '/' + d + '/' + y;
return new Date(newDateStr); return new Date(newDateStr);
} }
@ -115,7 +117,7 @@ function convertStringToStudyDate(dateStr) {
*/ */
function search() { function search() {
// Show loading message // Show loading message
var searchResults = Session.get('searchResults'); let searchResults = Session.get('searchResults');
searchResults.showLoadingText = true; searchResults.showLoadingText = true;
searchResults.showNotFoundMessage = false; searchResults.showNotFoundMessage = false;
Session.set('searchResults', searchResults); Session.set('searchResults', searchResults);
@ -130,12 +132,12 @@ function search() {
// Make sure that modality has a reasonable value, since it is occasionally // Make sure that modality has a reasonable value, since it is occasionally
// returned as 'undefined' // returned as 'undefined'
var modality = replaceUndefinedColumnValue($('input#modality').val()); const modality = replaceUndefinedColumnValue($('input#modality').val());
// Clear all current studies // Clear all current studies
WorklistStudies.remove({}); WorklistStudies.remove({});
Meteor.call('WorklistSearch', filter, function(error, studies) { Meteor.call('WorklistSearch', filter, (error, studies) => {
if (error) { if (error) {
log.warn(error); log.warn(error);
return; return;
@ -150,7 +152,7 @@ function search() {
} }
// Loop through all identified studies // Loop through all identified studies
studies.forEach(function(study) { studies.forEach(study => {
// Search the rest of the parameters that aren't done via the server call // Search the rest of the parameters that aren't done via the server call
if (isIndexOf(study.modalities, modality) && if (isIndexOf(study.modalities, modality) &&
(new Date(studyDateFrom).setHours(0, 0, 0, 0) <= convertStringToStudyDate(study.studyDate) || !studyDateFrom || studyDateFrom === '') && (new Date(studyDateFrom).setHours(0, 0, 0, 0) <= convertStringToStudyDate(study.studyDate) || !studyDateFrom || studyDateFrom === '') &&
@ -173,36 +175,38 @@ function search() {
}); });
} }
Template.worklistResult.onCreated(function() { Template.worklistResult.onCreated(() => {
this.sortOption = new ReactiveVar(); let instance = Template.instance();
this.sortingColumns = new ReactiveDict(); instance.sortOption = new ReactiveVar();
instance.sortingColumns = new ReactiveDict();
// Retrieve all studies // Retrieve all studies
search(); search();
// Set sortOption // Set sortOption
var sortOptionSession = Session.get('sortOption'); const sortOptionSession = Session.get('sortOption');
if (sortOptionSession) { if (sortOptionSession) {
this.sortingColumns.set(sortOptionSession); instance.sortingColumns.set(sortOptionSession);
} else { } else {
this.sortingColumns.set('patientName', 1); instance.sortingColumns.set({
this.sortingColumns.set('studyDate', 1); patientName: 1,
this.sortingColumns.set('patientId', 0); studyDate: 1,
this.sortingColumns.set('accessionNumber', 0); patientId: 0,
this.sortingColumns.set('studyDescription', 0); accessionNumber: 0,
this.sortingColumns.set('modality', 0); studyDescription: 0,
this.sortingColumns.set('numberOfStudyRelatedInstances', 0); modality: 0,
numberOfStudyRelatedInstances: 0
});
} }
var self = this;
if (Worklist.subscriptions) { if (Worklist.subscriptions) {
Worklist.subscriptions.forEach(function(collectionName) { Worklist.subscriptions.forEach(collectionName => {
self.subscribe(collectionName); instance.subscribe(collectionName);
}); });
} }
}); });
Template.worklistResult.onRendered(function() { Template.worklistResult.onRendered(() => {
const instance = Template.instance(); const instance = Template.instance();
// Initialize daterangepicker // Initialize daterangepicker
@ -215,29 +219,33 @@ Template.worklistResult.onRendered(function() {
}); });
}); });
function resetSortingColumns(template, sortingColumn) { function resetSortingColumns(instance, sortingColumn) {
Object.keys(template.sortingColumns.keys).forEach(function(key) { Object.keys(instance.sortingColumns.keys).forEach(key => {
if (key !== sortingColumn) { if (key !== sortingColumn) {
template.sortingColumns.set(key, null); instance.sortingColumns.set(key, null);
} }
}); });
} }
Template.worklistResult.events({ Template.worklistResult.events({
'keydown input': function(e) { 'keydown input'(event) {
if (e.which === 13) { // Enter if (event.which === 13) { // Enter
search(); search();
} }
}, },
'onsearch input': function() {
'onsearch input'() {
search(); search();
}, },
'change #studyDate': function(e, template) {
var dateRange = $(e.currentTarget).val(); 'change #studyDate'(event) {
let dateRange = $(event.currentTarget).val();
// Remove all space chars // Remove all space chars
dateRange = dateRange.replace(/ /g, ''); dateRange = dateRange.replace(/ /g, '');
// Split dateRange into subdates // Split dateRange into subdates
var dates = dateRange.split('-'); const dates = dateRange.split('-');
studyDateFrom = dates[0]; studyDateFrom = dates[0];
studyDateTo = dates[1]; studyDateTo = dates[1];
@ -245,23 +253,26 @@ Template.worklistResult.events({
search(); search();
} }
}, },
'click div.sortingCell': function(e, template) {
var elementId = e.currentTarget.id;
// Remove _ from id
var columnName = elementId.replace('_', '');
var sortOption = {}; 'click div.sortingCell'(event, instance) {
resetSortingColumns(template, columnName); const elementId = event.currentTarget.id;
var columnObject = template.sortingColumns.get(columnName);
// Remove _ from id
const columnName = elementId.replace('_', '');
let sortOption = {};
resetSortingColumns(instance, columnName);
const columnObject = instance.sortingColumns.get(columnName);
if (columnObject) { if (columnObject) {
template.sortingColumns.set(columnName, columnObject * -1); instance.sortingColumns.set(columnName, columnObject * -1);
sortOption[columnName] = columnObject * -1; sortOption[columnName] = columnObject * -1;
} else { } else {
template.sortingColumns.set(columnName, 1); instance.sortingColumns.set(columnName, 1);
sortOption[columnName] = 1; sortOption[columnName] = 1;
} }
template.sortOption.set(sortOption); instance.sortOption.set(sortOption);
Session.set('sortOption', sortOption); Session.set('sortOption', sortOption);
} }
}); });

View File

@ -1,5 +1,5 @@
Template.worklistToolbar.onCreated(() => { Template.worklistToolbar.onCreated(() => {
Meteor.call('importSupported', function(error, result) { Meteor.call('importSupported', (error, result) => {
if (error || !result) { if (error || !result) {
Session.set('importSupported', false); Session.set('importSupported', false);
} else { } else {

View File

@ -50,7 +50,6 @@ switchToTab = function(contentId) {
} }
var studies = ViewerData[contentId].studies; var studies = ViewerData[contentId].studies;
if (studies) { if (studies) {
// ViewerData already has the meta data (in cases when worklist is launched externally) // ViewerData already has the meta data (in cases when worklist is launched externally)
viewStudiesInTab(contentId, studies); viewStudiesInTab(contentId, studies);