-
-
-
-
-
- | Lesion # |
-
- Target |
-
- {{ #each timepoints }}
- {{ >lesionTableTimepointHeader }}
- {{ /each }}
-
-
-
-
- {{ #each measurement }}
- {{ >lesionTableRow }}
- {{ /each }}
-
-
+
+ {{ >roundedButtonGroup buttonGroupData }}
+
+
+ {{ >lesionTableHeaderRow id="target" type="Targets" measurements=targets}}
+ {{ #each targets }}
+ {{ >lesionTableRow }}
+ {{ /each }}
+ {{ >lesionTableHeaderRow id="nonTarget" type="Non-targets" measurements=nonTargets}}
+ {{ #each nonTargets }}
+ {{ >lesionTableRow }}
+ {{ /each }}
+
+ {{ >lesionTableHeaderRow id="newLesions" type="New lesions" measurements=newLesions}}
+ {{ #each nonTargets }}
+ {{ >lesionTableRow }}
+ {{ /each }}
+
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/lesionTable/lesionTable.js b/Packages/lesiontracker/client/components/lesionTable/lesionTable.js
index c76c0afab..8fdc0bb6d 100644
--- a/Packages/lesiontracker/client/components/lesionTable/lesionTable.js
+++ b/Packages/lesiontracker/client/components/lesionTable/lesionTable.js
@@ -1,9 +1,30 @@
Template.lesionTable.helpers({
- measurement: function() {
+ targets: function() {
// All Targets shall be listed first followed by Non-Targets
- return Measurements.find({}, {
+ return Measurements.find({
+ isTarget: true
+ }, {
+ sort: {
+ lesionNumberAbsolute: 1
+ }
+ });
+ },
+ nonTargets: function() {
+ // All Targets shall be listed first followed by Non-Targets
+ return Measurements.find({
+ isTarget: false
+ }, {
+ sort: {
+ lesionNumberAbsolute: 1
+ }
+ });
+ },
+ newLesions: function() {
+ // All Targets shall be listed first followed by Non-Targets
+ return Measurements.find({
+ saved: false
+ }, {
sort: {
- isTarget: -1,
lesionNumberAbsolute: 1
}
});
@@ -14,59 +35,43 @@ Template.lesionTable.helpers({
latestDate: 1
}
});
+ },
+
+ buttonGroupData() {
+ const instance = Template.instance();
+ return {
+ value: instance.lesionTableLayout,
+ options: [{
+ key: 'comparison',
+ text: 'Comparison'
+ }, {
+ key: 'key',
+ text: 'Key Timepoints'
+ }]
+ };
}
});
Template.lesionTable.events({
-// 'click table#tblLesion tbody tr': function(e, template) {
- // Retrieve the lesion id from the DOM data for this row
- // var measurementId = $(e.currentTarget).data('measurementid');
-
- // activateLesion(measurementId, template.data);
- //},
- 'mousedown div#dragbar': function(e, template) {
- var pY = e.pageY;
- var draggableParent = $(e.currentTarget).parent();
- var startHeight = draggableParent.height();
- template.dragging.set(true);
-
- $(document).on('mouseup', function(e) {
- template.dragging.set(false);
- $(document).off('mouseup').off('mousemove');
- });
-
- $(document).on('mousemove', function(e) {
- var topPosition = e.pageY - pY;
- var newHeight = startHeight - topPosition;
-
- // Min lesion table height = 5px
- if (newHeight < 5) {
- return;
- }
-
- draggableParent.css({
- top: topPosition,
- height: newHeight
- });
-
- var viewportAndLesionTableHeight = $('#viewportAndLesionTable').height();
- var newPercentageHeightofLesionTable = (startHeight - topPosition) / viewportAndLesionTableHeight * 100;
- var newPercentageHeightofViewermain = 100 - newPercentageHeightofLesionTable;
- $('.viewerMain').height(newPercentageHeightofViewermain + '%');
-
- // Resize viewport
- resizeViewportElements();
- });
- }
-});
-
-Template.lesionTable.onCreated(function() {
- this.dragging = new ReactiveVar(false);
+ /**
+ * Retrieve the lesion id from the DOM data for this row
+ */
+ /*'click table#tblLesion tbody tr': function(e, template) {
+ var measurementId = $(e.currentTarget).data('measurementid');
+ activateLesion(measurementId, template.data);
+ },*/
});
// Temporary until we have a real window manager with events for series/study changed
Session.setDefault('NewSeriesLoaded', false);
+Template.lesionTable.onCreated(function() {
+ var instance = this;
+
+ instance.lesionTableLayout = new ReactiveVar();
+ instance.lesionTableLayout.set('comparisonTimepoints');
+});
+
Template.lesionTable.onRendered(function() {
// Find the first measurement by Lesion Number
var firstLesion = Measurements.findOne({}, {
diff --git a/Packages/lesiontracker/client/components/lesionTable/lesionTable.styl b/Packages/lesiontracker/client/components/lesionTable/lesionTable.styl
index d17d3df04..ff8094569 100644
--- a/Packages/lesiontracker/client/components/lesionTable/lesionTable.styl
+++ b/Packages/lesiontracker/client/components/lesionTable/lesionTable.styl
@@ -1,93 +1,23 @@
+@import "{design}/app"
+
#lesionTableContainer
width: 100%
height: 16%
background-color: #000000
- #dragbar
- width: 100%
- height: 3px
- top: 0
- left: 0
- right: 0
- bottom: 0
- background-color: #666666
- cursor: row-resize
-
#lesionTableWrapper
position: relative
width: 100%
height: 100%
margin: 0 auto
- .lesionTable
+.lesionTableTimepointHeaderRow
+ display: flex
- td, th
- border: 1px solid #FFFFFF
- border-collapse: collapse
- width: 100px
+ .spacer
+ width: 20px
- td.lesionNumber, th#thNumber
- width: 70px
-
- td.location, th#thLocation
- width: 250px
-
- td.target, th#thTarget
- width: 70px
-
-
- thead
- width: 100%
- height: 40px
- display: block
-
- tr
- width: 100%
- height: 40px
-
- th
- border-bottom-width: 0
- font-weight: normal
- color: #FFFFFF
- line-height: 15px
- text-align: center
- margin: 0
- padding: 5px
- background-color: #424242
- vertical-align: middle
-
- tbody
- display: block
- position: absolute
- top: 40px
- left: 0
- right: 0
- bottom: 0
- overflow: auto
- width: 100%
- padding-bottom: 20px
-
- tr.selectedRow
- background: #F5F5F5 !important
- color: #000000 !important
-
- tr.lesionTableRow
- width: 100%
-
- &:nth-child(even)
- background: #888
- &:nth-child(odd)
- background: #BBB
- &:hover
- cursor: pointer
- background-color: #009BD2
- color: white
-
- td
- border-bottom-width: 0
- margin: 0
- padding: 5px
- line-height: 15px
-
- &.lesionNumber, &.target, &.lesionTableTimepointCell
- text-align: center
+.lesionTableLayoutChanger
+ padding: 5px
+ text-align: center
+ margin: 0 auto
diff --git a/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.html b/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.html
new file mode 100644
index 000000000..935e9e7a3
--- /dev/null
+++ b/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.html
@@ -0,0 +1,22 @@
+
+
+
diff --git a/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.js b/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.js
new file mode 100644
index 000000000..437f801fb
--- /dev/null
+++ b/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.js
@@ -0,0 +1,38 @@
+Template.lesionTableHeaderRow.helpers({
+ numberOfLesions: function() {
+ var instance = Template.instance();
+ return instance.data.measurements.count();
+ },
+ maxNumLesions: function() {
+ var instance = Template.instance();
+ var lesionType = instance.id;
+
+ // TODO: Check what we are annotating
+ var timepointType = 'baseline';
+
+ // Identify which Trial Conformance Criteria are currently being used
+ // Note that there may be more than one.
+ var criteriaTypes = TrialCriteriaTypes.find({
+ selected: true
+ }).map(function(criteria) {
+ return criteria.id;
+ });
+
+ var currentConstraints = getTrialCriteriaConstraints(criteriaTypes);
+ if (!currentConstraints) {
+ // For testing
+ return 10;
+ }
+
+ var criteria = currentConstraints[timepointType][lesionType];
+
+ return criteria.group.totalNumberOfLesions;
+ }
+});
+
+Template.lesionTableHeaderRow.events({
+ 'click .add': function() {
+ console.log('Add was clicked');
+ // TODO: Set active tool to new type
+ }
+});
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.styl b/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.styl
new file mode 100644
index 000000000..266d67dd5
--- /dev/null
+++ b/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.styl
@@ -0,0 +1,58 @@
+@import "{design}/app"
+
+$headerRowHeight = 63px
+
+.lesionTableHeaderRow
+ background: $darkUiColor
+ color: $textSecondaryColor
+ fill: $textSecondaryColor
+ width: 100%
+ height: $headerRowHeight
+ display: flex
+ line-height: $headerRowHeight
+
+ div
+ flex: 1
+ justify-content: space-around
+ align-items: stretch
+ text-align: center
+
+ .add
+ padding: 0 10px
+ max-width: 20px
+ cursor: pointer
+
+ svg
+ height: $headerRowHeight
+ max-width: 11px
+
+ .type
+ cursor: pointer
+ font-weight: 200
+ height: $headerRowHeight
+ font-size: 13pt
+
+ .numberOfLesions
+ float: right
+ font-weight: 100
+ font-size: 40px
+ max-width: 30px
+ margin-right: 5px
+ height: $headerRowHeight
+ line-height: $headerRowHeight
+
+ .max
+ height: $headerRowHeight
+ background: $darkUiColor
+
+ .maxNumLesions
+ margin: 21px auto
+ height: 20px
+ line-height: 20px
+ width: 47px
+ font-size: 12px
+ text-transform: uppercase
+ font-weight: 500
+ border-radius: 3px
+ color: black
+ background-color: $textSecondaryColor;
diff --git a/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.html b/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.html
index 73bf1e1a4..bfeae9ce1 100644
--- a/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.html
+++ b/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.html
@@ -1,11 +1,38 @@
-
- | {{lesionNumberAbsolute}} |
-
- {{#if isTarget}} Y {{else}} N {{/if}} |
-
- {{# each timepoints }}
- {{> lesionTableTimepointCell}}
- {{/ each }}
-
+
+
+
+
+ {{ #if location }}
+ {{location}}
+ {{ else }}
+ (No description)
+ {{ /if }}
+
+
+
+ {{# each timepoints }}
+ {{> lesionTableTimepointCell}}
+ {{/ each }}
+
+
+
diff --git a/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.styl b/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.styl
index c41d8d124..c736068ac 100644
--- a/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.styl
+++ b/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.styl
@@ -1,3 +1,39 @@
-.lesionTableRow .location
- &:hover
- font-weight: bold
\ No newline at end of file
+@import "{design}/app"
+
+.lesionTableRow
+ display: flex
+ width: 100%
+
+ .lesionRowSidebar
+ flex: 1
+ color: $textSecondaryColor
+ background: $darkUiColor
+ max-width: 20px
+ height: 60px
+
+ .lesionNumber
+ padding: 3px
+
+ &.active
+ border-left: 4px $activeColor solid
+
+ .lesionDetails
+ flex: 1
+ display: flex
+ flex-direction: column
+ align-items: stretch
+
+ .location
+ flex: 1
+ text-align: center
+ color: $textSecondaryColor
+ height: 20px
+ width: 100%
+
+ .timepointData
+ display: flex
+
+ div
+ flex: 1
+ text-align: center
+ justify-content: space-around
diff --git a/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.html b/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.html
index 85887ed19..d39d2195d 100644
--- a/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.html
+++ b/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.html
@@ -1,11 +1,11 @@
{{ #if hasDataAtThisTimepoint }}
- {{ #if isBirectional }}
- {{displayData}} |
- {{ else }}
- {{displayData}} |
- {{ /if }}
+
+ {{displayData}}
+
{{ else }}
- |
+
+ ...
+
{{ /if }}
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.styl b/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.styl
index d868f9bff..0457b0c3f 100644
--- a/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.styl
+++ b/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.styl
@@ -1,8 +1,6 @@
+@import "{design}/app"
+
.lesionTableTimepointCell
- &:hover
- font-weight: bold
- .nonTargetCell
- &:hover
- color: red
-
-
+ border-left: $uiBorderThickness $uiBorderColor solid
+ color: $textPrimaryColor
+ padding: 0 10px
diff --git a/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html b/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html
index 25ef19639..a9f86852f 100644
--- a/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html
+++ b/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html
@@ -1,6 +1,10 @@
-
- {{ timepointName }}
- |
+
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.styl b/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.styl
index 4c555bbd0..bb6218d65 100644
--- a/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.styl
+++ b/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.styl
@@ -1,3 +1,15 @@
-#lesionTableContainer .lesionTable thead tr th.lesionTableTimepointCell.loaded
- //font-weight: bold
- color: #4fbfff
\ No newline at end of file
+@import "{design}/app"
+
+.lesionTableTimepointHeader
+ flex: 1
+ justify-content: space-around
+
+ div
+ text-align: center
+
+ .timepointName
+ color: $textSecondaryColor
+
+ .timepointDate
+ color: $textPrimaryColor
+ border-left: $uiBorderColor $uiBorderThickness solid
diff --git a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.html b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.html
new file mode 100644
index 000000000..05b460a2f
--- /dev/null
+++ b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.html
@@ -0,0 +1,35 @@
+
+
+ {{>timeoutCountdownDialog}}
+
+
+
+ {{> worklistResult }}
+
+
+
+
+
+ {{ >associationModal }}
+ {{ >optionsModal }}
+ {{ >serverInformationModal }}
+ {{ >confirmRemoveTimepointAssociation }}
+ {{ >lastLoginModal }}
+ {{ >studyContextMenu }}
+ {{ >progressDialog}}
+
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.js b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.js
new file mode 100644
index 000000000..d2153f7c8
--- /dev/null
+++ b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.js
@@ -0,0 +1,65 @@
+// Define the ViewerData global object
+// If there is currently any Session data for this object,
+// use this to repopulate the variable
+ViewerData = Session.get('ViewerData') || {};
+
+Template.lesionTracker.onCreated(function() {
+ // showViewer to go to viewer from audit
+ this.showWorklistMenu = new ReactiveVar(true);
+ // Get url and check worklist
+ var currentRoute = Router.current();
+ if (!currentRoute || !currentRoute.route) {
+ return;
+ }
+
+ var currentPath = currentRoute.route.path(this);
+ if (currentPath === '/' || currentPath === '/worklist') {
+ this.showWorklistMenu.set(false);
+ }
+});
+
+Template.lesionTracker.onRendered(function() {
+ var templateData = Template.currentData();
+ if (templateData && templateData.studyInstanceUid) {
+ var studyInstanceUid = templateData.studyInstanceUid;
+ openNewTab(studyInstanceUid, studyInstanceUid);
+ } else {
+ // If there is a tab set as active in the Session,
+ // switch to that now.
+ var contentId = Session.get('activeContentId');
+
+ // TODO: FIx this it seems to be forcing two switches
+ switchToTab(contentId);
+ }
+
+ Meteor.subscribe('hangingprotocols');
+});
+
+Template.lesionTracker.events({
+ 'click #tablist a[data-toggle="tab"]': function(e) {
+ // If this tab is already active, do nothing
+ var tabButton = $(e.currentTarget);
+ var tabTitle = tabButton.parents('.tabTitle');
+ if (tabTitle.hasClass('active')) {
+ return;
+ }
+
+ // Otherwise, switch to the tab
+ var contentId = tabButton.data('target').replace('#', '');
+ switchToTab(contentId);
+ },
+ 'click #loadStudyList': function() {
+ switchToTab('worklistTab');
+ }
+});
+
+Session.set('defaultSignInMessage', 'Tumor tracking in your browser.');
+
+Template.lesionTracker.helpers({
+ showWorklistMenu: function() {
+ return Template.instance().showWorklistMenu.get();
+ },
+ onStudyList: function() {
+ return (Session.get('activeContentId') === 'worklistTab');
+ }
+});
diff --git a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.styl b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.styl
new file mode 100644
index 000000000..36b8d374d
--- /dev/null
+++ b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.styl
@@ -0,0 +1,47 @@
+@import "{design}/app"
+
+.topBar
+ height: $topBarHeight
+ color: $textPrimaryColor
+ background-color: $primaryBackgroundColor
+
+ .brandSection
+ height: 100%
+ display: inline-block
+
+ img.logoImage
+ height: 100%
+ margin: 0 5px
+
+ .logoText
+ display: inline-block
+ font-family: $logoFontFamily
+ font-weight: $logoFontWeight
+ color: $textPrimaryColor
+
+ .studyListLinkSection
+ border-left: $uiBorderThickness solid $uiBorderColor;
+ padding: 5px
+ margin: 0 10px
+
+ a
+ text-decoration: none
+ cursor: pointer
+ line-height: 100%
+
+ .userAccountSection
+ margin: 0 10px
+
+#worklistTabs
+ height: "calc(100% - %s)" % $topBarHeight
+
+// 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
diff --git a/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.html b/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.html
index c2f96eff8..5f62f3035 100644
--- a/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.html
+++ b/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.html
@@ -1,12 +1,3 @@
-
- {{>timeoutCountdownDialog}}
- {{>progressDialog}}
{{>yield }}
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.js b/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.js
deleted file mode 100644
index 4012f453d..000000000
--- a/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.js
+++ /dev/null
@@ -1,126 +0,0 @@
-Session.set('defaultSignInMessage', 'Tumor tracking in your browser.');
-
-Template.lesionTrackerLayout.helpers({
- fullName: function() {
- return Meteor.user().profile.fullName;
- },
-
- showWorklistMenu: function() {
- return Template.instance().showWorklistMenu.get();
- },
-
- currentUser: function() {
- var verifyEmail = Meteor.settings && Meteor.settings.public && Meteor.settings.public.verifyEmail || false;
-
- if (!Meteor.user() || !Meteor.userId()) {
- return false;
- }
-
- if (!verifyEmail) {
- return true;
- }
-
- if (Meteor.user().emails[0].verified) {
- return true;
- }
-
- return false;
- }
-});
-
-Template.lesionTrackerLayout.onCreated(function() {
- // showViewer to go to viewer from audit
- this.showWorklistMenu = new ReactiveVar(true);
- // Get url and check worklist
- var currentRoute = Router.current();
- if (!currentRoute || !currentRoute.route) {
- return;
- }
-
- var currentPath = currentRoute.route.path(this);
- if (currentPath === '/' || currentPath === '/worklist') {
- this.showWorklistMenu.set(false);
- }
-
- // Show countdown dialog
- var handle;
- $(document).on('TriggerOpenTimeoutCountdownDialog', function(e, leftTime) {
- // Show modal dialog
- handle = setInterval(function() {
- leftTime--;
- // Set countdownDialogLeftTime session
- Session.set('countdownDialogLeftTime', leftTime);
-
- // Show dialog
- var dialog = $('#timeoutCountdownDialog');
- if (dialog.css('display') === 'none') {
- dialog.css('display', 'block');
- }
- }, 1000);
-
- });
-
- $(document).on('TriggerCloseTimeoutCountdownDialog', function(e) {
- var dialog = $('#timeoutCountdownDialog');
- dialog.css('display', 'none');
- if (handle) {
- clearInterval(handle);
- // Close the dialog
- dialog.css('display', 'none');
-
- // Remove reviewers info for the user
- Meteor.call('removeUserFromReviewers', Meteor.userId());
- }
- });
-});
-
-Template.lesionTrackerLayout.onRendered(function() {
- var oldUserId = undefined;
- var userName;
- var lastLoginModalInterval;
-
- Tracker.autorun(function() {
- // Hook login/logout
- var newUserId = Meteor.userId();
- if (oldUserId === null && newUserId) {
- Session.set('showLastLoginModal', true);
- userName = Meteor.user().profile.fullName;
- // Log
- HipaaLogger.logEvent({
- eventType: 'init',
- userId: Meteor.userId(),
- userName: userName
- });
- } else if (newUserId === null && oldUserId) {
- // Set showLastLoginModal as null
- Session.set('showLastLoginModal', null);
- // Destroy interval for last login modal
- Meteor.clearInterval(lastLoginModalInterval);
- console.log('The user logged out');
-
- // Log
- // TODO: eventype is not defined for logout in hipaa-audit-log
- /*HipaaLogger.logEvent({
- eventType: 'logout',
- userId: oldUserId,
- userName: userName
- });*/
-
- // Remove the user from Reviewers
- Meteor.call('removeUserFromReviewers', oldUserId);
- }
- oldUserId = Meteor.userId();
-
- // Trigger last login date popup
- if (Session.get('showLastLoginModal')) {
- Modal.show('lastLoginModal');
- lastLoginModalInterval = Meteor.setInterval( function() {
- Modal.hide('lastLoginModal');
- Session.set("showLastLoginModal", null);
- }, 3000);
- return true;
- }
- });
-});
-
-
diff --git a/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.styl b/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.styl
deleted file mode 100644
index e53826299..000000000
--- a/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.styl
+++ /dev/null
@@ -1,38 +0,0 @@
-.logoContainer
- position: absolute
- height: 40px
- top: 0
- right: 0
- padding: 0 10px
- color: white
- @media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
- width: 15%
-
- .navbar-brand
- display: inline-block
- padding: 0
- margin-right: 5px
- height: 100%
-
- img
- height: 30px
- float: left
- margin-right: 10px
- margin-top: 5px
- /* Media queries for iPhone6*/
- @media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
- height: 20px
- margin-top: 10px
- margin-bottom: 10px
- margin-right: 5px
-
- h4.name
- float: left
- margin: 10px 0
- font-family: "Sanchez"
- color: white
- @media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
- font-size: 0.3em
- font-size: 0.3em
- width: 50%
-
diff --git a/Packages/lesiontracker/client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.styl b/Packages/lesiontracker/client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.styl
index 5b317c2be..8d12debf7 100644
--- a/Packages/lesiontracker/client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.styl
+++ b/Packages/lesiontracker/client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.styl
@@ -1,3 +1,102 @@
+@import "{design}/app"
+
+$viewportTagPadding = 20px
+$imageSliderBorderRadius = 57px
+$imageSliderColor = #22374d
+$imageSliderTrackColor = rgba(0,0,0,0)
+$imageSliderBorder = none
+
+// Note that these are backwards due to the magic needed to make a cross-browser vertical slider
+$imageSliderWidth = 12px
+$imageSliderHeight = 39px
+$imageSliderCursor = grab
+
.imageViewerViewportOverlay
- .timepointName
- color: #32BFFF
\ No newline at end of file
+ color: $textSecondaryColor
+
+ .dicomTag
+ font-weight: 200
+
+ .topleft
+ top: $viewportTagPadding
+ left: $viewportTagPadding
+
+ .topright
+ top: $viewportTagPadding
+ right: $viewportTagPadding
+ text-align: right
+
+ .bottomleft
+ bottom: $viewportTagPadding
+ left: $viewportTagPadding
+
+ .bottomright
+ bottom: $viewportTagPadding
+ right: $viewportTagPadding
+ text-align: right
+
+ .imageControls
+ #scrollbar
+ #imageSlider
+ -webkit-appearance: none
+ background-color: $imageSliderTrackColor
+
+ // --- Style the range track --- //
+ &::-webkit-slider-runnable-track
+ height: 5px
+ border: none
+ cursor: pointer
+ background-color: $imageSliderTrackColor
+ z-index: 6
+
+ &::-moz-range-track
+ height: 2px
+ border: none
+ cursor: pointer
+ background-color: $imageSliderTrackColor
+ z-index: 6
+
+ &::-ms-track
+ width: 100%
+ height: 2px
+ border: none
+ cursor: pointer
+ animate: 0.2s
+ background: transparent
+ border-width: 15px 0
+ color: $imageSliderTrackColor
+
+ // Hide any fill IE tries to add
+ &::-ms-fill-lower
+ background: $imageSliderTrackColor
+
+ &::-ms-fill-upper
+ background: $imageSliderTrackColor
+
+ // --- Style the range thumb --- //
+ &::-webkit-slider-thumb
+ -webkit-appearance: none !important
+ background-color: $imageSliderColor
+ border-radius: $imageSliderBorderRadius
+ border: $imageSliderBorder
+ height: $imageSliderWidth
+ width: $imageSliderHeight
+ cursor: $imageSliderCursor
+ margin-top: -7px
+
+ &::-moz-range-thumb
+ background-color: $imageSliderColor
+ border-radius: $imageSliderBorderRadius
+ border: $imageSliderBorder
+ height: $imageSliderWidth
+ width: $imageSliderHeight
+ cursor: $imageSliderCursor
+ z-index: 7
+
+ &::-ms-thumb
+ background-color: $imageSliderColor
+ border-radius: $imageSliderBorderRadius
+ border: $imageSliderBorder
+ height: $imageSliderWidth
+ width: $imageSliderHeight
+ cursor: $imageSliderCursor
diff --git a/Packages/lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js b/Packages/lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js
index dbaccfe2e..70d9e848d 100644
--- a/Packages/lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js
+++ b/Packages/lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js
@@ -45,7 +45,10 @@ Template[defaultTemplate].helpers({
return;
}
- var timepointReviewers = Reviewers.findOne({timepointId: timepoint.timepointId});
+ var timepointReviewers = Reviewers.findOne({
+ timepointId: timepoint.timepointId
+ });
+
if (!timepointReviewers) {
return;
}
@@ -59,7 +62,7 @@ function getReviewerTipText(reviewers) {
return;
}
- var newReviewers = reviewers.filter(function ( reviewer ) {
+ var newReviewers = reviewers.filter(function(reviewer) {
return reviewer.userId !== Meteor.userId();
});
@@ -76,6 +79,7 @@ function getReviewerTipText(reviewers) {
if (index > 0) {
tipText += ',';
}
+
tipText += reviewer.userName;
});
@@ -96,4 +100,4 @@ WorklistTabs.find().observe({
});
}
}
-});
\ No newline at end of file
+});
diff --git a/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.html b/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.html
new file mode 100644
index 000000000..e9d854c6d
--- /dev/null
+++ b/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.html
@@ -0,0 +1,43 @@
+
+
+
+
+ {{ #if isLocked }}
+
+ {{ else }}
+ {{ #if progressComplete }}
+
+ {{ else }}
+ {{progressText}}
+ {{ /if }}
+ {{ /if }}
+
+
+
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.js b/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.js
new file mode 100644
index 000000000..4f7e97a99
--- /dev/null
+++ b/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.js
@@ -0,0 +1,13 @@
+Template.radialProgressBar.helpers({
+ progressComplete() {
+ const instance = Template.instance();
+ return instance.data.progressPercent === 100;
+ },
+
+ progressRadius() {
+ var radius = 13 * 2 * Math.PI;
+ const instance = Template.instance();
+ var percentLeft = (100 - instance.data.progressPercent) / 100;
+ return percentLeft * radius;
+ }
+});
diff --git a/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.styl b/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.styl
new file mode 100644
index 000000000..caacf3d54
--- /dev/null
+++ b/Packages/lesiontracker/client/components/radialProgressBar/radialProgressBar.styl
@@ -0,0 +1,41 @@
+@import "{design}/app"
+
+$circleSize = 46px
+$progressTextColor = #6fbde2
+
+.radialProgress
+ height: $circleSize
+ width: $circleSize
+ box-shadow: 0 0 1em black
+ border-radius: 100%
+ position: relative
+
+ #svg circle
+ stroke-dashoffset: 0
+ transition: stroke-dashoffset 1s linear
+ stroke: #203244
+ stroke-width: 3px
+
+ #svg #bar
+ stroke: $activeColor
+ -ms-transform: rotate(270deg); /* IE 9 */
+ -ms-transform-origin: center center; /* IE 9 */
+ -webkit-transform: rotate(270deg); /* Chrome, Safari, Opera */
+ -webkit-transform-origin: center center; /* Chrome, Safari, Opera */
+ transform: rotate(270deg);
+ transform-origin: center center;
+
+ .progressText
+ position: absolute;
+ width: $circleSize;
+ height: $circleSize;
+ line-height: $circleSize;
+ font-family: Roboto-Bold;
+ font-size: 17px;
+ text-align: center;
+ color: $progressTextColor;
+ top: 0;
+
+ svg
+ width: 17px
+ height: 17px
diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.js b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.js
index beb449252..50c95b4af 100644
--- a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.js
+++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.js
@@ -1,4 +1,3 @@
-
function parseUrl(url) {
var parser = document.createElement('a');
parser.href = url;
@@ -11,14 +10,19 @@ Template.serverInformationModal.helpers({
var serviceInfo = Meteor.settings[defaultServiceType];
if (defaultServiceType === 'dicomWeb') {
var serverInformationDicom = [];
- var endpoints = serviceInfo["endpoints"];
+ var endpoints = serviceInfo['endpoints'];
endpoints.forEach(function(endpoint) {
var parsedUrl = parseUrl(endpoint.qidoRoot);
- serverInformationDicom.push({host: parsedUrl.hostname, port: parsedUrl.port, aeTitle: endpoint.name});
+ serverInformationDicom.push({
+ host: parsedUrl.hostname,
+ port: parsedUrl.port,
+ aeTitle: endpoint.name
+ });
});
return serverInformationDicom;
}
+
return serviceInfo;
}
-});
\ No newline at end of file
+});
diff --git a/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.html b/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.html
new file mode 100644
index 000000000..80f566532
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.html
@@ -0,0 +1,29 @@
+
+
+
+
+
Series
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.js b/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.js
new file mode 100644
index 000000000..99a00673f
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.js
@@ -0,0 +1,34 @@
+Template.studySeriesQuickSwitch.onCreated(function studySeriesQuickSwitchOnCreated() {
+ const instance = this;
+
+ instance.seriesOpen = new ReactiveVar(false);
+ instance.studiesOpen = new ReactiveVar(false);
+});
+
+Template.studySeriesQuickSwitch.events({
+ 'mouseenter .js-show-series'(event, instance) {
+ instance.seriesOpen.set(true);
+ },
+
+ 'mouseenter .js-show-studies'(event, instance) {
+ instance.studiesOpen.set(true);
+ },
+
+ 'mouseleave .js-hide-series'(event, instance) {
+ instance.seriesOpen.set(false);
+ },
+
+ 'mouseleave .js-hide-studies'(event, instance) {
+ instance.studiesOpen.set(false);
+ }
+});
+
+Template.studySeriesQuickSwitch.helpers({
+ seriesOpen() {
+ return Template.instance().seriesOpen.get();
+ },
+
+ studiesOpen() {
+ return Template.instance().studiesOpen.get();
+ }
+});
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.styl b/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.styl
new file mode 100644
index 000000000..a85a9eb8e
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.styl
@@ -0,0 +1,68 @@
+@import "{design}/app"
+
+$switchSize = 50px
+
+.quickSwitch
+ position: absolute
+ width: 140px
+ height: 80px
+ top: 5px
+
+ div.switchSection
+ float: left
+ display: inline-block
+ margin: 0 5px
+
+ .label
+ display: block
+ text-transform: uppercase
+ text-align: center
+ font-size: 12px
+ font-weight: 100
+ color: $textSecondaryColor
+
+ .studySwitch
+ display: block
+ margin: 0 auto
+ width: $switchSize
+ height: $switchSize
+ border-radius: 11px
+ background-color: $darkUiColor
+ border: solid 1px $activeColor
+
+ .seriesSwitch
+ display: block
+ width: $switchSize
+ height: $switchSize
+
+ svg
+ width: $switchSize
+ height: $switchSize
+
+.mirror-x
+ transform(scaleX(-1));
+
+.studyHover
+ position: absolute
+ z-index: 10000
+ top: 70px
+ left: -350px
+ width: 400px
+ height: 500px
+ background: red
+ transition(all 0.3s ease)
+
+.seriesHover
+ position: absolute
+ z-index: 10000
+ top: 70px
+ left: 50px
+ width: 700px
+ height: 900px
+ background: blue
+ transition(all 0.3s ease)
+
+ &.tiny
+ width: 0
+ height: 0
+ opacity: 0
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.html b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.html
new file mode 100644
index 000000000..aa5a777e7
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.html
@@ -0,0 +1,9 @@
+
+
+
+ {{#each study in (studies this.timepoint)}}
+ {{>studyTimepointStudy study=study}}
+ {{/each}}
+
+
+
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.js b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.js
new file mode 100644
index 000000000..ab8dcb386
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.js
@@ -0,0 +1,58 @@
+// Initialize the timepoint wrapper max-height to enable CSS transition
+Template.studyTimepoint.onRendered(() => {
+ const instance = Template.instance();
+
+ const $studies = instance.$('.studyTimepoint');
+ const $wrapper = $studies.closest('.studyTimepointWrapper');
+ const $timepoint = $wrapper.closest('.timepointEntry');
+ const studiesVisible = $studies.is(':visible');
+
+ if (!studiesVisible) {
+ $timepoint.addClass('active');
+ }
+
+ // Recalculates the timepoint height to make CSS transition smoother
+ $studies.trigger('displayStateChanged');
+
+ if (!studiesVisible) {
+ $timepoint.removeClass('active');
+ }
+});
+
+Template.studyTimepoint.events({
+ // Changes the selected study
+ 'selectionChanged .studyTimepoint'(event, instance, selection) {
+ const $selection = $(selection);
+ const $thumbnails = $selection.find('.studyTimepointThumbnails');
+ const $timepoint = instance.$('.studyTimepoint');
+
+ // Set the max-height to inherit to be able to expand the wrapper on its full height
+ instance.$('.studyTimepointWrapper').css('max-height', 'inherit');
+
+ // Removes selected state from all studies but the triggered study
+ instance.$('.studyTimepointStudy').not(selection).removeClass('active');
+
+ // Toggle selected state for the triggered study
+ $selection.toggleClass('active');
+
+ // Recalculates the timepoint height to make CSS transition smoother
+ $thumbnails.one('transitionend', () => $timepoint.trigger('displayStateChanged'));
+ },
+ // It should be triggered when the timepoint height is changed
+ 'displayStateChanged .studyTimepoint'(event, instance) {
+ const $timepoint = $(event.currentTarget);
+ const $wrapper = $timepoint.closest('.studyTimepointWrapper');
+
+ // Set the max-height for the wrapper to make CSS transition smoother
+ $wrapper.css('max-height', $timepoint.height());
+ }
+});
+
+Template.studyTimepoint.helpers({
+ studies: function(timepoint) {
+ const query = {
+ selected: true
+ };
+ return ViewerStudies.find(query);
+ }
+});
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.styl b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.styl
new file mode 100644
index 000000000..86d535520
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepoint.styl
@@ -0,0 +1,8 @@
+@import "{design}/app"
+
+.studyTimepointWrapper
+ overflow: hidden
+ transition($sidebarTransition)
+
+.timepointEntry:not(.active) .studyTimepointWrapper
+ max-height: 0 !important
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.html b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.html
new file mode 100644
index 000000000..c74a91c2d
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.html
@@ -0,0 +1,29 @@
+
+
+
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.js b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.js
new file mode 100644
index 000000000..7e835f98d
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.js
@@ -0,0 +1,46 @@
+Template.studyTimepointBrowser.events({
+ 'click .timepointHeader'(event, instance) {
+ const $timepoint = $(event.currentTarget).closest('.timepointEntry');
+
+ // Recalculates the timepoint height to make CSS transition smoother
+ $timepoint.find('.studyTimepoint').trigger('displayStateChanged');
+
+ // Toggle active class to group/ungroup timepoint studies
+ $timepoint.toggleClass('active');
+ }
+});
+
+Template.studyTimepointBrowser.helpers({
+ timepoints: function() {
+ const sort = {
+ sort: {
+ earliestDate: -1
+ }
+ };
+ return Timepoints.find({}, sort);
+ },
+ shouldShowTimepoint(timepoint, index) {
+ const instance = Template.instance();
+ if (instance.data.timepointViewType.get() === 'all') {
+ return true;
+ }
+
+ return index < 4 || timepoint.timepointType === 'baseline';
+ },
+ // Build the timepoint title based on its date
+ timepointTitle(timepoint, total, index) {
+ if (timepoint.timepointType === 'baseline') {
+ return 'Baseline';
+ }
+
+ const states = {
+ 0: '(Current)',
+ 1: '(Prior)',
+ 2: '(Nadir)'
+ };
+ // TODO: [design] find out how to define the nadir timepoint
+ const followUp = total - index - 1;
+ const parenthesis = states[index] || '';
+ return `Follow-up ${followUp} ${parenthesis}`;
+ }
+});
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.styl b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.styl
new file mode 100644
index 000000000..479264f9b
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointBrowser.styl
@@ -0,0 +1,68 @@
+@import "{design}/app"
+
+.studyTimepointBrowser
+ background-color: $primaryBackgroundColor
+ float: left
+ height: calc(100% - 55px - 50px - 30px)
+ overflow: hidden
+ width: 100%
+
+ .timepointEntry
+ &.active
+ .timepointModalities
+ height: 0
+ .timepointDate
+ display: none
+ .expandIcon i
+ transform: rotateX(180deg)
+ .timepointFollowupTitle
+ font-size: 14px
+ color: $textSecondaryColor
+ text-transform: uppercase
+
+ .timepointHeader
+ cursor: pointer
+ font-size: 13px
+
+ &
+ .expandIcon i
+ .timepointFollowupTitle
+ .timepointDate
+ .timepointModalities
+ color: $textSecondaryColor
+ transition($sidebarTransition)
+
+ &:hover
+ &
+ .timepointFollowupTitle
+ .expandIcon i
+ .timepointDate
+ .timepointModalities
+ color: $textPrimaryColor !important
+
+ .timepointDetails
+ .timepointModalities
+ line-height: 25px
+
+ .timepointModalities
+ height: 25px
+ overflow: hidden
+
+ .expandIcon i
+ color: $defaultColor
+
+ .timepointFollowupTitle
+ color: $textPrimaryColor
+ font-family: Roboto
+ padding-top: 2px
+
+ .studyTimepointScrollArea
+ height: 100%
+ overflow-x: hidden
+ overflow-y: auto
+ margin-right: -16px
+ padding-bottom: 20px
+ padding-right: 16px
+
+ &::-webkit-scrollbar
+ display: none
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.html b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.html
new file mode 100644
index 000000000..12edb7158
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.html
@@ -0,0 +1,18 @@
+
+
+
+
+ {{this.study.modalities}}
+
+
+
{{formatDA this.study.studyDate 'D-MMM-YYYY'}}
+
{{this.study.studyDescription}}
+
+
+
+ {{#each thumbnail in (thumbnails this.study)}}
+ {{>thumbnailEntry thumbnail}}
+ {{/each}}
+
+
+
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.js b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.js
new file mode 100644
index 000000000..3de9606a1
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.js
@@ -0,0 +1,40 @@
+// Initialize the study wrapper max-height to enable CSS transition
+Template.studyTimepointStudy.onRendered(() => {
+ const instance = Template.instance();
+ const $study = instance.$('.studyTimepointStudy');
+ const $thumbnails = instance.$('.studyTimepointThumbnails');
+ $study.addClass('active');
+ $thumbnails.css('max-height', $thumbnails.height());
+ $study.removeClass('active');
+});
+
+Template.studyTimepointStudy.events({
+ // Recalculates the timepoint height to make CSS transition smoother
+ 'transitionend .studyTimepointThumbnails'(event, instance) {
+ if (event.target === event.currentTarget) {
+ $(event.currentTarget).closest('.studyTimepoint').trigger('displayStateChanged');
+ }
+ },
+ // Changes the current study selection for the clicked study
+ 'click .studyModality'(event, instance) {
+ const $study = $(event.currentTarget).closest('.studyTimepointStudy');
+ const $timepoint = $study.closest('.studyTimepoint');
+ const study = $study[0];
+ $timepoint.trigger('selectionChanged', [study]);
+ }
+});
+
+Template.studyTimepointStudy.helpers({
+ thumbnails: function(study) {
+ var stacks = createStacks(study);
+
+ var array = [];
+ stacks.forEach(function(stack, index) {
+ array.push({
+ thumbnailIndex: index,
+ stack: stack
+ });
+ });
+ return array;
+ }
+});
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.styl b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.styl
new file mode 100644
index 000000000..996151426
--- /dev/null
+++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.styl
@@ -0,0 +1,99 @@
+@import "{design}/app"
+
+$boxBackgroundColor = #3E5975
+$boxBorderColor = transparent
+$boxHoverBackgroundColor = #14191E
+$boxHoverBorderColor = #2d4660
+$boxActiveBackgroundColor = $activeColor
+$boxActiveTextColor = $primaryBackgroundColor
+$boxActiveBorderColor = #131D29
+$boxWidth = 50px
+$borderThickness = 2px
+$boxBorderRadius = 8px
+$nestingMargin = 6px
+$spacerX = 7px
+$spacerY = 12px
+
+.studyTimepointStudy
+
+ &.active
+ .studyModality
+ box-shadow: inset 0 0 0 3px $activeColor
+ .studyModalityBox
+ color: $boxActiveTextColor
+ &
+ &:before
+ &:after
+ background-color: $boxActiveBackgroundColor
+ border-color: $boxActiveBorderColor
+
+ &:not(.active) .studyTimepointThumbnails
+ max-height: 0 !important
+
+ .studyTimepointThumbnails
+ overflow: hidden
+ transition($sidebarTransition)
+
+ .studyModality
+ border: 1px solid $boxBorderColor
+ border-radius: 12px
+ cursor: pointer
+ font-family: Roboto
+ padding: $spacerY $spacerX ($spacerY - 1)
+ position: relative
+ transition($sidebarTransition)
+ z-index: 1
+
+ &:hover
+ background-color: $boxHoverBackgroundColor
+ border-color: $boxHoverBorderColor
+
+ .studyModalityText
+ font-size: 13px
+ left: ($spacerX * 3) + $boxWidth + ($nestingMargin * 3)
+ line-height: 14px
+ position: absolute
+ right: $spacerX
+ top: $spacerY
+ .studyModalityDate
+ margin-top: 8px
+ color: $textSecondaryColor
+ .studyModalityDescription
+ margin-top: 8px
+ color: $textPrimaryColor
+
+ .studyModalityBox
+ color: $textSecondaryColor
+ font-size: 22px
+ line-height: $boxWidth
+ margin-left: $nestingMargin * 2
+ margin-top: $nestingMargin * 2
+ position: relative
+ text-align: center
+ text-transform: uppercase
+
+ &
+ &:before
+ &:after
+ background-color: $boxBackgroundColor
+ border: $borderThickness solid $primaryBackgroundColor
+ border-radius: $boxBorderRadius
+ height: $boxWidth + ($borderThickness * 2)
+ transition($sidebarTransition)
+ width: $boxWidth + ($borderThickness * 2)
+
+ &:before
+ &:after
+ display: block
+ content: ''
+ position: absolute
+
+ &:before
+ top: -($borderThickness + $nestingMargin)
+ left: -($borderThickness + $nestingMargin)
+ z-index: -1
+
+ &:after
+ top: -($borderThickness + ($nestingMargin * 2))
+ left: -($borderThickness + ($nestingMargin * 2))
+ z-index: -2
diff --git a/Packages/lesiontracker/client/components/timeoutCountdownDialog/timeoutCountdownDialog.html b/Packages/lesiontracker/client/components/timeoutCountdownDialog/timeoutCountdownDialog.html
index 6aefad20a..2f4a15dab 100644
--- a/Packages/lesiontracker/client/components/timeoutCountdownDialog/timeoutCountdownDialog.html
+++ b/Packages/lesiontracker/client/components/timeoutCountdownDialog/timeoutCountdownDialog.html
@@ -1,10 +1,10 @@
-
You will be log out in {{leftTime}} {{secondsText}}.
+
You will be logged out in {{timeLeft}}.
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/timeoutCountdownDialog/timeoutCountdownDialog.js b/Packages/lesiontracker/client/components/timeoutCountdownDialog/timeoutCountdownDialog.js
index 7ef21124d..a6bbbbc47 100644
--- a/Packages/lesiontracker/client/components/timeoutCountdownDialog/timeoutCountdownDialog.js
+++ b/Packages/lesiontracker/client/components/timeoutCountdownDialog/timeoutCountdownDialog.js
@@ -1,9 +1,39 @@
-
Template.timeoutCountdownDialog.helpers({
- leftTime: function(e) {
- return Session.get("countdownDialogLeftTime");
- },
- secondsText: function() {
- return Session.get("countdownDialogLeftTime") > 1? "seconds": "second";
+ timeLeft: function() {
+ var timeLeft = Session.get('countdownDialogLeftTime');
+ var suffix = timeLeft > 1 ? 'seconds': 'second';
+ return timeLeft + suffix;
}
-});
\ No newline at end of file
+});
+
+Template.timeoutCountdownDialog.onRendered(function() {
+ // Show countdown dialog
+ var timeoutCountdownInterval;
+ $(document).on('TriggerOpenTimeoutCountdownDialog', function(e, leftTime) {
+ // Show modal dialog
+ timeoutCountdownInterval = setInterval(function() {
+ // Set countdownDialogLeftTime session
+ Session.set('countdownDialogLeftTime', --leftTime);
+
+ var dialog = $('#timeoutCountdownDialog');
+
+ // Show dialog
+ dialog.css('display', 'block');
+ }, 1000);
+
+ });
+
+ $(document).on('TriggerCloseTimeoutCountdownDialog', function() {
+ var dialog = $('#timeoutCountdownDialog');
+
+ // Close the dialog
+ dialog.css('display', 'none');
+
+ if (timeoutCountdownInterval) {
+ clearInterval(timeoutCountdownInterval);
+
+ // Remove reviewer info for the user
+ Meteor.call('removeUserFromReviewers', Meteor.userId());
+ }
+ });
+});
diff --git a/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.html b/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.html
new file mode 100644
index 000000000..244aa320b
--- /dev/null
+++ b/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.html
@@ -0,0 +1,79 @@
+
+
+
diff --git a/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.js b/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.js
new file mode 100644
index 000000000..fbd1baa12
--- /dev/null
+++ b/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.js
@@ -0,0 +1,133 @@
+Template.toolbarSection.onRendered(function() {
+ var instance = this;
+
+ instance.state = instance.data.state;
+});
+
+Template.toolbarSection.helpers({
+ toolbarButtons: function() {
+ var buttonData = [];
+ buttonData.push({
+ id: 'zoom',
+ title: 'Zoom',
+ classes: 'imageViewerTool',
+ svgLink: '/packages/lesiontracker/assets/icons.svg#icon-tools-zoom'
+ });
+
+ buttonData.push({
+ id: 'wwwc',
+ title: 'Levels',
+ classes: 'imageViewerTool',
+ svgLink: '/packages/lesiontracker/assets/icons.svg#icon-tools-levels'
+ });
+
+ buttonData.push({
+ id: 'pan',
+ title: 'Pan',
+ classes: 'imageViewerTool',
+ svgLink: '/packages/lesiontracker/assets/icons.svg#icon-tools-pan'
+ });
+
+ buttonData.push({
+ id: 'link',
+ title: 'Link',
+ classes: 'imageViewerCommand toolbarSectionButton',
+ svgLink: '/packages/lesiontracker/assets/icons.svg#icon-tools-link'
+ });
+
+ buttonData.push({
+ id: 'bidirectional',
+ title: 'Target',
+ classes: 'imageViewerTool',
+ svgLink: '/packages/lesiontracker/assets/icons.svg#icon-tools-measure-target'
+ });
+
+ buttonData.push({
+ id: 'nonTarget',
+ title: 'Non-Target',
+ classes: 'imageViewerTool toolbarSectionButton',
+ svgLink: '/packages/lesiontracker/assets/icons.svg#icon-tools-measure-non-target'
+ });
+
+ buttonData.push({
+ id: 'length',
+ title: 'Temp',
+ classes: 'imageViewerTool toolbarSectionButton',
+ svgLink: '/packages/lesiontracker/assets/icons.svg#icon-tools-measure-temp'
+ });
+
+ return buttonData;
+ }
+});
+
+Template.toolbarSection.events({
+ 'click #studySidebarToggle': function(event, instance) {
+ var isOpen = instance.data.state.get('studySidebarOpen');
+ instance.data.state.set('studySidebarOpen', !isOpen);
+ },
+ 'click #lesionSidebarToggle': function(event, instance) {
+ var isOpen = instance.data.state.get('lesionSidebarOpen');
+ instance.data.state.set('lesionSidebarOpen', !isOpen);
+ instance.data.state.set('additionalMeasurementsSidebarOpen', false);
+ },
+ 'click #additionalMeasurementsSidebarToggle': function(event, instance) {
+ var isOpen = instance.data.state.get('additionalMeasurementsSidebarOpen');
+ instance.data.state.set('additionalMeasurementsSidebarOpen', !isOpen);
+ instance.data.state.set('lesionSidebarOpen', false);
+ },
+ // TODO: Inherit these from toolbar template somehow
+ 'click .imageViewerTool': function(e) {
+ $(e.currentTarget).tooltip('hide');
+
+ var tool = e.currentTarget.id;
+
+ var elements = $('.imageViewerViewport');
+
+ var activeTool = toolManager.getActiveTool();
+ $('.toolbarSectionButton').removeClass('active');
+ if (tool === activeTool) {
+ var defaultTool = toolManager.getDefaultTool();
+ console.log('Setting active tool to: ' + defaultTool);
+ toolManager.setActiveTool(defaultTool, elements);
+ } else {
+ console.log('Setting active tool to: ' + tool);
+ toolManager.setActiveTool(tool, elements);
+ }
+ },
+ 'click .imageViewerCommand': function(e) {
+ $(e.currentTarget).tooltip('hide');
+
+ var command = e.currentTarget.id;
+ if (!OHIF.viewer.functionList.hasOwnProperty(command)) {
+ return;
+ }
+
+ var activeViewport = Session.get('activeViewport');
+ var element = $('.imageViewerViewport').get(activeViewport);
+ OHIF.viewer.functionList[command](element);
+ }
+});
+
+Template.toolbarSection.onRendered(function() {
+ var tooltipButtons = $('[data-toggle="tooltip"]');
+ tooltipButtons.tooltip(OHIF.viewer.tooltipConfig);
+
+ // Enable tooltips for the layout button
+ var extraTooltipButtons = $('[rel="tooltip"]');
+ extraTooltipButtons.tooltip(OHIF.viewer.tooltipConfig);
+
+ // Set disabled/enabled tool buttons that are set in toolManager
+ var states = toolManager.getToolDefaultStates();
+ var disabledToolButtons = states.disabledToolButtons;
+ var allToolbarButtons = $('#toolbar').find('button');
+ if (disabledToolButtons && disabledToolButtons.length > 0) {
+ for (var i = 0; i < allToolbarButtons.length; i++) {
+ var toolbarButton = allToolbarButtons[i];
+ $(toolbarButton).prop('disabled', false);
+ var index = disabledToolButtons.indexOf($(toolbarButton).attr('id'));
+ if (index !== -1) {
+ $(toolbarButton).prop('disabled', true);
+ }
+ }
+ }
+});
diff --git a/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.styl b/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.styl
new file mode 100644
index 000000000..0eeeaf7d0
--- /dev/null
+++ b/Packages/lesiontracker/client/components/toolbarSection/toolbarSection.styl
@@ -0,0 +1,151 @@
+@import "{design}/app"
+
+.toolbarSection
+ height: $toolbarHeight
+ width: 100%
+ border-bottom: $uiBorderColor $uiBorderThickness solid
+
+ .capsule-group
+ display: inline-block
+
+ div.capsule-entry
+ display: inline-block
+ color: $defaultColor
+ fill: $defaultColor
+ stroke: $defaultColor
+ height: $toolbarHeight
+ min-width: 30px
+ cursor: pointer
+ text-align: center
+ margin: 0
+
+ div.capsule
+ width: 66px
+ height: 26px
+
+ &:first-child
+ .capsule
+ border-radius: 57px
+ background-color: #16202b
+ border: solid 1px #3c5d80
+ border-right: none
+ border-top-right-radius: 0
+ border-bottom-right-radius: 0
+
+ &:last-child
+ .capsule
+ border-radius: 57px
+ background-color: #16202b
+ border: solid 1px #3c5d80
+ border-left: none
+ border-top-left-radius: 0
+ border-bottom-left-radius: 0
+
+ &.disabled
+ opacity: 0.5
+ cursor: not-allowed
+
+ .svgContainer
+ margin: 0 auto
+ text-align: center
+
+ .capsule
+ width: 62px
+ height: 26px
+ border-radius: 100px
+ background-color: #16202b
+ border: solid 1px #3c5d80
+
+ svg
+ background-color: transparent
+ margin: 5px
+ width: 17px
+ height: 17px
+
+ &:active, &.active
+ color: $activeColor
+
+ svg
+ fill: $activeColor
+ stroke: $activeColor
+
+ &:hover
+ color: $hoverColor
+
+ svg
+ fill: $hoverColor
+ stroke: $hoverColor
+
+
+ .toolbarSectionButton
+ display: inline-block
+ color: $defaultColor
+ fill: $defaultColor
+ stroke: $defaultColor
+ padding: 0 10px
+ height: $toolbarHeight
+ min-width: 30px
+ cursor: pointer
+ text-align: center
+
+ &.disabled
+ opacity: 0.5
+ cursor: not-allowed
+
+ .buttonLabel
+ font-size: 12px
+
+ .svgContainer
+ margin: 0 auto
+ text-align: center
+
+ .capsule
+ width: 62px
+ height: 26px
+ border-radius: 100px
+ background-color: #16202b
+ border: solid 1px #3c5d80
+
+ svg
+ background-color: transparent
+ margin: 2px
+ width: 21px
+ height: 21px
+
+ &:active, &.active
+ color: $activeColor
+
+ svg
+ fill: $activeColor
+ stroke: $activeColor
+
+ &:hover
+ color: $hoverColor
+
+ svg
+ fill: $hoverColor
+ stroke: $hoverColor
+
+ .toolbarSectionEntry
+ display: inline-block
+ color: $defaultColor
+ fill: $defaultColor
+ stroke: $defaultColor
+ padding: 0 10px
+ height: $toolbarHeight
+ min-width: 30px
+ cursor: pointer
+ text-align: center
+
+ .quickSwitch
+ position: absolute
+
+ &.middle
+ left: calc(50% - 60px)
+
+ &.left
+ left: calc(50% - 160px)
+
+ &.right
+ left: 50%
+ margin-left: 20px
diff --git a/Packages/lesiontracker/client/components/toolbarSectionButton/toolbarSectionButton.html b/Packages/lesiontracker/client/components/toolbarSectionButton/toolbarSectionButton.html
new file mode 100644
index 000000000..f4640c3a4
--- /dev/null
+++ b/Packages/lesiontracker/client/components/toolbarSectionButton/toolbarSectionButton.html
@@ -0,0 +1,12 @@
+
+
+
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/toolbarSectionButton/toolbarSectionButton.js b/Packages/lesiontracker/client/components/toolbarSectionButton/toolbarSectionButton.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/Packages/lesiontracker/client/components/toolbarSectionButton/toolbarSectionButton.styl b/Packages/lesiontracker/client/components/toolbarSectionButton/toolbarSectionButton.styl
new file mode 100644
index 000000000..e69de29bb
diff --git a/Packages/lesiontracker/client/components/userAccountMenu/userAccountMenu.html b/Packages/lesiontracker/client/components/userAccountMenu/userAccountMenu.html
index 7049a6acb..72b2af201 100644
--- a/Packages/lesiontracker/client/components/userAccountMenu/userAccountMenu.html
+++ b/Packages/lesiontracker/client/components/userAccountMenu/userAccountMenu.html
@@ -1,38 +1,46 @@
{{#if currentUser}}
-
{{else}}
{{>loadingText}}
diff --git a/LesionTracker/client/components/viewer.js b/Packages/lesiontracker/client/components/viewer/viewer.js
similarity index 89%
rename from LesionTracker/client/components/viewer.js
rename to Packages/lesiontracker/client/components/viewer/viewer.js
index 732712c2c..2a1f9f4e7 100644
--- a/LesionTracker/client/components/viewer.js
+++ b/Packages/lesiontracker/client/components/viewer/viewer.js
@@ -1,4 +1,7 @@
Session.setDefault('activeViewport', false);
+Session.setDefault('studySidebarOpen', false);
+Session.setDefault('lesionSidebarOpen', false);
+Session.setDefault('additionalMeasurementsSidebarOpen', false);
Template.viewer.onCreated(function() {
// Attach the Window resize listener
@@ -6,10 +9,15 @@ Template.viewer.onCreated(function() {
ValidationErrors.remove({});
- var self = this;
+ var instance = this;
+ instance.data.state = new ReactiveDict();
+ instance.data.state.set('studySidebarOpen', Session.get('studySidebarOpen'));
+ instance.data.state.set('lesionSidebarOpen', Session.get('lesionSidebarOpen'));
+ instance.data.state.set('additionalMeasurementsSidebarOpen', Session.get('additionalMeasurementsSidebarOpen'));
+
var contentId = this.data.contentId;
- OHIF = OHIF || {
+ OHIF = OHIF || window.OHIF || {
viewer: {}
};
@@ -100,7 +108,7 @@ Template.viewer.onCreated(function() {
Session.set('activeViewport', ViewerData[contentId].activeViewport || false);
// Set lesion tool buttons as disabled if pixel spacing is not available for active element
- self.autorun(pixelSpacingAutorunCheck);
+ instance.autorun(pixelSpacingAutorunCheck);
// Update the ViewerStudies collection with the loaded studies
ViewerStudies.remove({});
@@ -113,18 +121,17 @@ Template.viewer.onCreated(function() {
var patientId = this.data.studies[0].patientId;
Session.set('patientId', patientId);
- self.autorun(function() {
+ instance.autorun(function() {
var dataContext = Template.currentData();
- self.subscribe('singlePatientAssociatedStudies', dataContext.studies[0].patientId);
- self.subscribe('singlePatientTimepoints', dataContext.studies[0].patientId);
- self.subscribe('singlePatientMeasurements', dataContext.studies[0].patientId);
- self.subscribe('singlePatientImageMeasurements', dataContext.studies[0].patientId);
+ instance.subscribe('singlePatientAssociatedStudies', dataContext.studies[0].patientId);
+ instance.subscribe('singlePatientTimepoints', dataContext.studies[0].patientId);
+ instance.subscribe('singlePatientMeasurements', dataContext.studies[0].patientId);
+ instance.subscribe('singlePatientImageMeasurements', dataContext.studies[0].patientId);
- var subscriptionsReady = self.subscriptionsReady();
+ var subscriptionsReady = instance.subscriptionsReady();
log.info('autorun viewer.js. Ready: ' + subscriptionsReady);
if (subscriptionsReady) {
-
// Set buttons as enabled/disabled when Timepoints collection is ready
timepointAutoCheck(dataContext);
@@ -241,7 +248,7 @@ Template.viewer.onCreated(function() {
// Set reviewer for this timepoint
if (data.timepoints[timepointId].studyInstanceUid) {
- Meteor.call('setReviewer',data.timepoints[timepointId].studyInstanceUid);
+ Meteor.call('setReviewer', data.timepoints[timepointId].studyInstanceUid);
}
});
diff --git a/LesionTracker/client/components/viewerMain/viewerMain.styl b/Packages/lesiontracker/client/components/viewer/viewer.styl
similarity index 51%
rename from LesionTracker/client/components/viewerMain/viewerMain.styl
rename to Packages/lesiontracker/client/components/viewer/viewer.styl
index f29c98428..9931e54a5 100644
--- a/LesionTracker/client/components/viewerMain/viewerMain.styl
+++ b/Packages/lesiontracker/client/components/viewer/viewer.styl
@@ -1,10 +1,12 @@
-.viewerMain
- width: 100%
- height: 84%
+@import "{design}/app"
+
+#viewer
+ width: 100%
+ height: 100%
+ margin: 0
+ padding: 0
+ background-color: black
- #layoutManagerTarget
- width: 100%
- height: calc(100% - 30px)
//font awesome icons
.fa-cr:before
@@ -20,4 +22,14 @@
.fa-ex:before
content: 'EX'
font-weight: bold
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
\ No newline at end of file
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
+
+#btnCollapse
+ background-color: #333
+ border-color: black
+
+ &.active
+ border-color: #333
+
+.btnCollapseIcon
+ color: white
diff --git a/LesionTracker/client/components/viewerMain/viewerMain.html b/Packages/lesiontracker/client/components/viewerMain/viewerMain.html
similarity index 71%
rename from LesionTracker/client/components/viewerMain/viewerMain.html
rename to Packages/lesiontracker/client/components/viewerMain/viewerMain.html
index dd8f44d2d..dbf874b7c 100644
--- a/LesionTracker/client/components/viewerMain/viewerMain.html
+++ b/Packages/lesiontracker/client/components/viewerMain/viewerMain.html
@@ -1,6 +1,5 @@
- {{ >toolbar toolbarOptions=toolbarOptions }}
diff --git a/Packages/lesiontracker/client/components/viewerMain/viewerMain.js b/Packages/lesiontracker/client/components/viewerMain/viewerMain.js
new file mode 100644
index 000000000..70e5cab6c
--- /dev/null
+++ b/Packages/lesiontracker/client/components/viewerMain/viewerMain.js
@@ -0,0 +1,10 @@
+Template.viewerMain.onRendered(function() {
+ var instance = this;
+ var studies = instance.data.studies;
+
+ var parentElement = instance.$("#layoutManagerTarget").get(0);
+ window.layoutManager = new LayoutManager(parentElement, studies);
+
+ ProtocolEngine = new HP.ProtocolEngine(layoutManager, studies);
+ HP.setEngine(ProtocolEngine);
+});
\ No newline at end of file
diff --git a/Packages/lesiontracker/client/components/viewerMain/viewerMain.styl b/Packages/lesiontracker/client/components/viewerMain/viewerMain.styl
new file mode 100644
index 000000000..6cac01b6c
--- /dev/null
+++ b/Packages/lesiontracker/client/components/viewerMain/viewerMain.styl
@@ -0,0 +1,17 @@
+@import "{design}/app"
+
+.viewerMain
+ width: 100%
+ height: 100%
+
+ #layoutManagerTarget
+ width: 100%
+ height: 100%
+
+ transition(all 0.3s ease)
+
+ #imageViewerViewports
+ .viewportContainer:not(:last-child)
+ .removable
+ .imageViewerViewport
+ border-right: $uiBorderThickness solid #436270
diff --git a/Packages/lesiontracker/lib/toggleLesionTrackerTools.js b/Packages/lesiontracker/lib/toggleLesionTrackerTools.js
index 859a42978..a78926dab 100644
--- a/Packages/lesiontracker/lib/toggleLesionTrackerTools.js
+++ b/Packages/lesiontracker/lib/toggleLesionTrackerTools.js
@@ -18,7 +18,7 @@ toggleLesionTrackerTools = function() {
activate: [ 'deleteLesionKeyboardTool' ],
deactivate: [],
enable: [],
- disable: [ 'bidirectional', 'nonTarget', 'scaleOverlayTool', 'length', 'crTool', 'unTool', 'exTool' ]
+ disable: [ 'bidirectional', 'nonTarget', 'length', 'crTool', 'unTool', 'exTool' ]
};
toolManager.setToolDefaultStates(toolDefaultStates);
diff --git a/Packages/lesiontracker/lib/worklist/openNewTabWithTimepoint.js b/Packages/lesiontracker/lib/worklist/openNewTabWithTimepoint.js
index dc92d3cee..e135d565b 100644
--- a/Packages/lesiontracker/lib/worklist/openNewTabWithTimepoint.js
+++ b/Packages/lesiontracker/lib/worklist/openNewTabWithTimepoint.js
@@ -6,12 +6,7 @@
* @param title The title to be used for the tab heading
*/
openNewTabWithTimepoint = function(timepointId, title) {
- log.info('openNewTabWithTimepoint: ' + timepointId + ' ' + title);
-
- // Generate a unique ID to represent this tab
- // We can't just use the Mongo entry ID because
- // then it will change after hot-reloading.
- var contentid = uuid.new();
+ var contentid = 'viewerTab';
var timepoint = Timepoints.findOne({
timepointId: timepointId
@@ -27,13 +22,7 @@ openNewTabWithTimepoint = function(timepointId, title) {
throw 'No studies found that are related to this timepoint';
}
- // Create a new entry in the WorklistTabs Collection
- WorklistTabs.insert({
- title: title,
- contentid: contentid,
- active: false,
- timepointId: timepointId
- });
+ ViewerData = window.ViewerData || ViewerData;
// Update the ViewerData global object
ViewerData[contentid] = {
diff --git a/Packages/lesiontracker/lib/worklist/worklistModification.js b/Packages/lesiontracker/lib/worklist/worklistModification.js
index 487a73eef..11fec351a 100644
--- a/Packages/lesiontracker/lib/worklist/worklistModification.js
+++ b/Packages/lesiontracker/lib/worklist/worklistModification.js
@@ -17,7 +17,7 @@ function dblClickOnStudy(data) {
// Check if the study has been associated, and if not, just open it on its own
if (!study) {
// Open a new tab with this study
- openNewTab(data.studyInstanceUid, title);
+ open(data.studyInstanceUid, title);
return;
}
@@ -29,7 +29,7 @@ function dblClickOnStudy(data) {
});
if (!timepoint) {
- openNewTab(data.studyInstanceUid, title);
+ open(data.studyInstanceUid, title);
return;
}
@@ -37,4 +37,36 @@ function dblClickOnStudy(data) {
title += ' ' + getTimepointName(timepoint);
openNewTabWithTimepoint(timepoint.timepointId, title);
-}
\ No newline at end of file
+}
+
+/**
+ * Opens a study
+ *
+ * @param studyInstanceUid The UID of the Study to be opened
+ * @param title The title to be used for the tab heading
+ */
+function open(studyInstanceUid, title) {
+ var contentid = 'viewerTab';
+
+ WorklistTabs.remove({});
+
+ // Create a new entry in the WorklistTabs Collection
+ WorklistTabs.insert({
+ title: title,
+ contentid: contentid,
+ studyInstanceUid: studyInstanceUid,
+ active: false
+ });
+
+ ViewerData = window.ViewerData || ViewerData;
+
+ // Update the ViewerData global object
+ ViewerData[contentid] = {
+ title: title,
+ contentid: contentid,
+ studyInstanceUids: [studyInstanceUid]
+ };
+
+ // Switch to the new tab
+ switchToTab(contentid);
+}
diff --git a/Packages/lesiontracker/package.js b/Packages/lesiontracker/package.js
index a6c6d38c8..fd93d150a 100644
--- a/Packages/lesiontracker/package.js
+++ b/Packages/lesiontracker/package.js
@@ -7,9 +7,11 @@ Package.describe({
Package.onUse(function(api) {
api.versionsFrom('1.2.0.2');
+ api.use('ecmascript');
api.use('standard-app-packages');
api.use('jquery');
api.use('stylus');
+ api.use('design');
api.use('validatejs');
@@ -33,37 +35,68 @@ Package.onUse(function(api) {
api.addFiles('client/collections/LocationResponses.js', 'client');
api.addFiles('client/collections/subscriptions.js', 'client');
-
// Additional Custom Cornerstone Tools for Lesion Tracker
- api.addFiles('client/compatibility/bidirectionalTool.js', 'client', {
- bare: true
- });
- api.addFiles('client/compatibility/nonTargetTool.js', 'client', {
- bare: true
- });
- api.addFiles('client/compatibility/scaleOverlayTool.js', 'client', {
- bare: true
- });
- api.addFiles('client/compatibility/deleteLesionKeyboardTool.js', 'client', {
- bare: true
- });
- api.addFiles('client/compatibility/crunexTool.js', 'client', {
- bare: true
- });
- api.addFiles('client/compatibility/crTool.js', 'client', {
- bare: true
- });
- api.addFiles('client/compatibility/unTool.js', 'client', {
- bare: true
- });
- api.addFiles('client/compatibility/exTool.js', 'client', {
+ api.addFiles([
+ 'client/compatibility/bidirectionalTool.js',
+ 'client/compatibility/nonTargetTool.js',
+ 'client/compatibility/scaleOverlayTool.js',
+ 'client/compatibility/deleteLesionKeyboardTool.js',
+ 'client/compatibility/crunexTool.js',
+ 'client/compatibility/crTool.js',
+ 'client/compatibility/unTool.js',
+ 'client/compatibility/exTool.js'
+ ], 'client', {
bare: true
});
+ api.addAssets('assets/icons.svg', 'client');
+
// UI Components
+ api.addFiles('client/components/viewer/viewer.html', 'client');
+ api.addFiles('client/components/viewer/viewer.styl', 'client');
+ api.addFiles('client/components/viewer/viewer.js', 'client');
+
+ api.addFiles('client/components/flexboxLayout/flexboxLayout.html', 'client');
+ api.addFiles('client/components/flexboxLayout/flexboxLayout.styl', 'client');
+ api.addFiles('client/components/flexboxLayout/flexboxLayout.js', 'client');
+
+ api.addFiles('client/components/toolbarSectionButton/toolbarSectionButton.html', 'client');
+ api.addFiles('client/components/toolbarSectionButton/toolbarSectionButton.styl', 'client');
+ api.addFiles('client/components/toolbarSectionButton/toolbarSectionButton.js', 'client');
+
+ api.addFiles('client/components/toolbarSection/toolbarSection.html', 'client');
+ api.addFiles('client/components/toolbarSection/toolbarSection.styl', 'client');
+ api.addFiles('client/components/toolbarSection/toolbarSection.js', 'client');
+
+ api.addFiles('client/components/radialProgressBar/radialProgressBar.html', 'client');
+ api.addFiles('client/components/radialProgressBar/radialProgressBar.styl', 'client');
+ api.addFiles('client/components/radialProgressBar/radialProgressBar.js', 'client');
+
+ api.addFiles('client/components/caseProgress/caseProgress.html', 'client');
+ api.addFiles('client/components/caseProgress/caseProgress.styl', 'client');
+ api.addFiles('client/components/caseProgress/caseProgress.js', 'client');
+
+ api.addFiles('client/components/viewerMain/viewerMain.html', 'client');
+ api.addFiles('client/components/viewerMain/viewerMain.styl', 'client');
+ api.addFiles('client/components/viewerMain/viewerMain.js', 'client');
+
+ api.addFiles('client/components/lesionTracker/lesionTracker.html', 'client');
+ api.addFiles('client/components/lesionTracker/lesionTracker.styl', 'client');
+ api.addFiles('client/components/lesionTracker/lesionTracker.js', 'client');
+
api.addFiles('client/components/lesionTrackerLayout/lesionTrackerLayout.html', 'client');
- api.addFiles('client/components/lesionTrackerLayout/lesionTrackerLayout.styl', 'client');
- api.addFiles('client/components/lesionTrackerLayout/lesionTrackerLayout.js', 'client');
+
+ api.addFiles('client/components/additionalMeasurements/additionalMeasurements.html', 'client');
+ api.addFiles('client/components/additionalMeasurements/additionalMeasurements.styl', 'client');
+ api.addFiles('client/components/additionalMeasurements/additionalMeasurements.js', 'client');
+
+ api.addFiles('client/components/additionalMeasurements/radioOptionGroup/radioOptionGroup.html', 'client');
+ api.addFiles('client/components/additionalMeasurements/radioOptionGroup/radioOptionGroup.styl', 'client');
+ api.addFiles('client/components/additionalMeasurements/radioOptionGroup/radioOptionGroup.js', 'client');
+
+ api.addFiles('client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.html', 'client');
+ api.addFiles('client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.styl', 'client');
+ api.addFiles('client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.js', 'client');
api.addFiles('client/components/associationModal/associationModal.html', 'client');
api.addFiles('client/components/associationModal/associationModal.styl', 'client');
@@ -91,14 +124,19 @@ Package.onUse(function(api) {
api.addFiles('client/components/lesionLocationDialog/lesionLocationDialog.html', 'client');
api.addFiles('client/components/lesionLocationDialog/lesionLocationDialog.js', 'client');
api.addFiles('client/components/lesionLocationDialog/lesionLocationDialog.styl', 'client');
-
+
api.addFiles('client/components/lesionTable/lesionTable.html', 'client');
api.addFiles('client/components/lesionTable/lesionTable.styl', 'client');
api.addFiles('client/components/lesionTable/lesionTable.js', 'client');
api.addFiles('client/components/lesionTableRow/lesionTableRow.html', 'client');
+ api.addFiles('client/components/lesionTableRow/lesionTableRow.styl', 'client');
api.addFiles('client/components/lesionTableRow/lesionTableRow.js', 'client');
+ api.addFiles('client/components/lesionTableHeaderRow/lesionTableHeaderRow.html', 'client');
+ api.addFiles('client/components/lesionTableHeaderRow/lesionTableHeaderRow.styl', 'client');
+ api.addFiles('client/components/lesionTableHeaderRow/lesionTableHeaderRow.js', 'client');
+
api.addFiles('client/components/lesionTableTimepointCell/lesionTableTimepointCell.html', 'client');
api.addFiles('client/components/lesionTableTimepointCell/lesionTableTimepointCell.styl', 'client');
api.addFiles('client/components/lesionTableTimepointCell/lesionTableTimepointCell.js', 'client');
@@ -115,10 +153,20 @@ Package.onUse(function(api) {
api.addFiles('client/components/studyDateList/studyDateList.styl', 'client');
api.addFiles('client/components/studyDateList/studyDateList.js', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepoint.html', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepoint.styl', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepoint.js', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepointBrowser.html', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepointBrowser.styl', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepointBrowser.js', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepointStudy.html', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepointStudy.styl', 'client');
+ api.addFiles('client/components/studyTimepointBrowser/studyTimepointStudy.js', 'client');
+
api.addFiles('client/components/studyAssociationTable/studyAssociationTable.html', 'client');
api.addFiles('client/components/studyAssociationTable/studyAssociationTable.styl', 'client');
api.addFiles('client/components/studyAssociationTable/studyAssociationTable.js', 'client');
-
+
api.addFiles('client/components/conformanceCheckFeedback/conformanceCheckFeedback.html', 'client');
api.addFiles('client/components/conformanceCheckFeedback/conformanceCheckFeedback.styl', 'client');
api.addFiles('client/components/conformanceCheckFeedback/conformanceCheckFeedback.js', 'client');
@@ -236,5 +284,4 @@ Package.onUse(function(api) {
api.export('Studies', [ 'client', 'server' ]);
api.export('Timepoints', [ 'client', 'server' ]);
api.export('Reviewers', [ 'client', 'server' ]);
-
});
diff --git a/Packages/viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.html b/Packages/viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.html
index ae4044fb8..ec1cddb6f 100644
--- a/Packages/viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.html
+++ b/Packages/viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.html
@@ -1,5 +1,6 @@
+
Loading {{percentComplete}}
@@ -7,4 +8,4 @@
Error
-