From 82e374b1e3184f4381e4b6a3e1e6c6d588110924 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Sat, 23 Jul 2016 20:11:01 +0200 Subject: [PATCH] Remove tabbed layout in favour of current Lesion Tracker design (OHIF-49) --- LesionTracker/client/body.styl | 20 +-- LesionTracker/client/head.html | 3 + LesionTracker/client/routes.js | 6 +- .../components/flexboxLayout/flexboxLayout.js | 4 +- .../client/components/layout/layout.html | 13 -- .../client/components/layout/layout.styl | 27 ---- .../components/ohifViewer/ohifViewer.html | 18 +++ .../components/ohifViewer/ohifViewer.js | 58 +++++++++ .../components/ohifViewer/ohifViewer.styl | 74 +++++++++++ .../toolbarSection/toolbarSection.html | 6 +- .../client/components/viewer/viewer.html | 2 +- OHIFViewer/client/components/viewer/viewer.js | 20 +-- .../client/components/viewer/viewer.styl | 28 +---- OHIFViewer/client/head.html | 3 + OHIFViewer/client/routes.js | 18 +-- Packages/design/styles/common/webfonts.styl | 6 +- .../matchedProtocols/matchedProtocols.js | 5 - .../components/lesionTracker/lesionTracker.js | 10 +- .../lesionTracker/lesionTracker.styl | 11 -- .../lesionTrackerLayout.html | 3 - .../client/components/viewer/viewer.js | 36 +----- .../client/components/viewer/viewer.styl | 19 ++- .../lesiontracker/client/tools.js | 4 +- Packages/lesiontracker/package.js | 4 +- .../emailVerification/emailVerification.html | 0 .../emailVerification/emailVerification.js | 0 .../emailVerification/emailVerification.styl | 0 .../components/basic/layout/layout.html | 3 + .../relatedStudySelect.html | 11 -- .../relatedStudySelect/relatedStudySelect.js | 105 ---------------- .../relatedStudySelect.styl | 23 ---- .../viewer/gridLayout/gridLayout.js | 10 +- .../viewer/gridLayout/gridLayout.styl | 17 +-- .../imageViewerViewport.js | 5 + .../viewer/viewerMain/viewerMain.js | 5 +- .../viewer/viewerMain/viewerMain.styl | 19 ++- .../viewportOverlay/viewportOverlay.html | 18 +-- .../viewer/viewportOverlay/viewportOverlay.js | 4 +- .../viewerbase/lib}/debugReactivity.js | 0 Packages/viewerbase/lib/importStudies.js | 2 +- Packages/viewerbase/package.js | 10 +- .../progressDialog/progressDialog.html | 6 +- .../progressDialog/progressDialog.js | 67 ++++++---- .../worklist/client/components/worklist.html | 8 -- .../worklist/client/components/worklist.styl | 53 -------- .../worklistResult/worklistResult.js | 115 ++++++++++-------- .../worklistToolbar/worklistToolbar.js | 2 +- Packages/worklist/client/lib/switchToTab.js | 1 - 48 files changed, 371 insertions(+), 511 deletions(-) delete mode 100644 OHIFViewer/client/components/layout/layout.html delete mode 100644 OHIFViewer/client/components/layout/layout.styl create mode 100644 OHIFViewer/client/components/ohifViewer/ohifViewer.html create mode 100644 OHIFViewer/client/components/ohifViewer/ohifViewer.js create mode 100644 OHIFViewer/client/components/ohifViewer/ohifViewer.styl delete mode 100644 Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.html rename LesionTracker/client/components/init.js => Packages/lesiontracker/client/tools.js (99%) rename {LesionTracker/client/components => Packages/viewerbase/client/components/basic}/emailVerification/emailVerification.html (100%) rename {LesionTracker/client/components => Packages/viewerbase/client/components/basic}/emailVerification/emailVerification.js (100%) rename {LesionTracker/client/components => Packages/viewerbase/client/components/basic}/emailVerification/emailVerification.styl (100%) create mode 100644 Packages/viewerbase/client/components/basic/layout/layout.html delete mode 100644 Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.html delete mode 100644 Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.js delete mode 100644 Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.styl rename {LesionTracker/client => Packages/viewerbase/lib}/debugReactivity.js (100%) diff --git a/LesionTracker/client/body.styl b/LesionTracker/client/body.styl index a33168d3d..aaa17e8fb 100644 --- a/LesionTracker/client/body.styl +++ b/LesionTracker/client/body.styl @@ -1,20 +1,2 @@ body - 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 \ No newline at end of file + background-color: black \ No newline at end of file diff --git a/LesionTracker/client/head.html b/LesionTracker/client/head.html index aa80f2467..5238847e4 100644 --- a/LesionTracker/client/head.html +++ b/LesionTracker/client/head.html @@ -11,4 +11,7 @@ + + + diff --git a/LesionTracker/client/routes.js b/LesionTracker/client/routes.js index b91ebf3ec..ff9086f20 100644 --- a/LesionTracker/client/routes.js +++ b/LesionTracker/client/routes.js @@ -14,8 +14,8 @@ Object.keys(ViewerData).forEach(function(contentId) { }); Router.configure({ - layoutTemplate: 'lesionTrackerLayout', - loadingTemplate: 'lesionTrackerLayout' + layoutTemplate: 'layout', + loadingTemplate: 'layout' }); Router.onBeforeAction('loading'); @@ -50,7 +50,7 @@ Router.route('/', function() { }); Router.route('/viewer/timepoints/:_id', { - layoutTemplate: 'lesionTrackerLayout', + layoutTemplate: 'layout', name: 'viewer', onBeforeAction: function() { var timepointId = this.params._id; diff --git a/OHIFViewer/client/components/flexboxLayout/flexboxLayout.js b/OHIFViewer/client/components/flexboxLayout/flexboxLayout.js index b5747af7c..80fedd635 100644 --- a/OHIFViewer/client/components/flexboxLayout/flexboxLayout.js +++ b/OHIFViewer/client/components/flexboxLayout/flexboxLayout.js @@ -1,8 +1,8 @@ Template.flexboxLayout.events({ - 'transitionend .sidebarMenu'(event, instance) { + 'transitionend .sidebarMenu'() { handleResize(); }, - 'transitionend .sidebar-option'(event, instance) { + 'transitionend .sidebar-option'(event) { // Prevent this event from bubbling event.stopPropagation(); } diff --git a/OHIFViewer/client/components/layout/layout.html b/OHIFViewer/client/components/layout/layout.html deleted file mode 100644 index 02519a366..000000000 --- a/OHIFViewer/client/components/layout/layout.html +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/OHIFViewer/client/components/layout/layout.styl b/OHIFViewer/client/components/layout/layout.styl deleted file mode 100644 index 7ba244f3e..000000000 --- a/OHIFViewer/client/components/layout/layout.styl +++ /dev/null @@ -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 \ No newline at end of file diff --git a/OHIFViewer/client/components/ohifViewer/ohifViewer.html b/OHIFViewer/client/components/ohifViewer/ohifViewer.html new file mode 100644 index 000000000..1d403b177 --- /dev/null +++ b/OHIFViewer/client/components/ohifViewer/ohifViewer.html @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/OHIFViewer/client/components/ohifViewer/ohifViewer.js b/OHIFViewer/client/components/ohifViewer/ohifViewer.js new file mode 100644 index 000000000..61d38691a --- /dev/null +++ b/OHIFViewer/client/components/ohifViewer/ohifViewer.js @@ -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'); + } +}); diff --git a/OHIFViewer/client/components/ohifViewer/ohifViewer.styl b/OHIFViewer/client/components/ohifViewer/ohifViewer.styl new file mode 100644 index 000000000..d1453ca87 --- /dev/null +++ b/OHIFViewer/client/components/ohifViewer/ohifViewer.styl @@ -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 \ No newline at end of file diff --git a/OHIFViewer/client/components/toolbarSection/toolbarSection.html b/OHIFViewer/client/components/toolbarSection/toolbarSection.html index cb8410ec0..077cc9c28 100644 --- a/OHIFViewer/client/components/toolbarSection/toolbarSection.html +++ b/OHIFViewer/client/components/toolbarSection/toolbarSection.html @@ -4,9 +4,11 @@
{{>roundedButtonGroup leftSidebarToggleButtonData}}
- {{> toolbarSectionTools toolbarButtons=toolbarButtons extraToolbarButtons=extraToolbarButtons}} + {{> toolbarSectionTools + toolbarButtons=toolbarButtons + extraToolbarButtons=extraToolbarButtons}}
- {{>roundedButtonGroup rightSidebarToggleButtonData}} + {{> roundedButtonGroup rightSidebarToggleButtonData}}
{{> toolbarSectionTools toolbarButtons=hangingProtocolButtons}} diff --git a/OHIFViewer/client/components/viewer/viewer.html b/OHIFViewer/client/components/viewer/viewer.html index f3bd8537d..a294e370d 100644 --- a/OHIFViewer/client/components/viewer/viewer.html +++ b/OHIFViewer/client/components/viewer/viewer.html @@ -9,6 +9,6 @@ {{> flexboxLayout (clone this)}}
{{else}} - {{>loadingText}} + {{> loadingText}} {{/if}} \ No newline at end of file diff --git a/OHIFViewer/client/components/viewer/viewer.js b/OHIFViewer/client/components/viewer/viewer.js index 301e97767..1d140ef5d 100644 --- a/OHIFViewer/client/components/viewer/viewer.js +++ b/OHIFViewer/client/components/viewer/viewer.js @@ -29,23 +29,11 @@ Template.viewer.onCreated(() => { instance.data.state.set('leftSidebar', Session.get('leftSidebar')); instance.data.state.set('rightSidebar', Session.get('rightSidebar')); - Meteor.subscribe('hangingprotocols'); - - log.info('viewer onCreated'); - - if (isTouchDevice()) { - OHIF.viewer.tooltipConfig = { - trigger: 'manual' - }; - } else { - OHIF.viewer.tooltipConfig = { - trigger: 'hover' - }; - } + instance.subscribe('hangingprotocols'); const contentId = instance.data.contentId; - if (ViewerData[contentId].loadedSeriesData) { + if (ViewerData[contentId] && ViewerData[contentId].loadedSeriesData) { log.info('Reloading previous loadedSeriesData'); OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData; @@ -53,7 +41,7 @@ Template.viewer.onCreated(() => { } else { log.info('Setting default ViewerData'); OHIF.viewer.loadedSeriesData = {}; - + ViewerData[contentId] = {}; ViewerData[contentId].loadedSeriesData = OHIF.viewer.loadedSeriesData; // Update the viewer data object @@ -85,4 +73,4 @@ Template.viewer.events({ const current = instance.data.state.get('rightSidebar'); instance.data.state.set('rightSidebar', !current); }, -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/OHIFViewer/client/components/viewer/viewer.styl b/OHIFViewer/client/components/viewer/viewer.styl index d36f303aa..412d64074 100644 --- a/OHIFViewer/client/components/viewer/viewer.styl +++ b/OHIFViewer/client/components/viewer/viewer.styl @@ -1,31 +1,11 @@ -@import "{design}/app.styl" +@import "{design}/app" #viewer - border-top: 1px solid #525252 - height: 100% - width: 100% align-items: stretch background-color: black display: flex flex-flow: column wrap + height: 100% + width: 100% margin: 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 + padding: 0 \ No newline at end of file diff --git a/OHIFViewer/client/head.html b/OHIFViewer/client/head.html index 7fc632e9a..1317f1f49 100644 --- a/OHIFViewer/client/head.html +++ b/OHIFViewer/client/head.html @@ -8,4 +8,7 @@ + + + diff --git a/OHIFViewer/client/routes.js b/OHIFViewer/client/routes.js index fd474a142..aae9215f8 100644 --- a/OHIFViewer/client/routes.js +++ b/OHIFViewer/client/routes.js @@ -17,13 +17,12 @@ Router.configure({ }); Router.onBeforeAction('loading'); - -Router.route('/', function() { - this.render('worklist'); +Router.onBeforeAction(function() { + this.next(); }); -Router.route('/worklist', function() { - this.render('worklist'); +Router.route('/', function() { + this.render('ohifViewer'); }); Router.route('/viewer/:_id', { @@ -37,11 +36,12 @@ Router.route('/viewer/:_id', { var tabs = WorklistTabs.find({ studyInstanceUid: studyInstanceUid }); + if (tabs.count()) { return; } - this.render('worklist', { + this.render('ohifViewer', { data: function() { return { studyInstanceUid: studyInstanceUid @@ -49,10 +49,4 @@ Router.route('/viewer/:_id', { } }); } -}); - -Router.onBeforeAction(function() { - - // User is logged in, go ahead and route them - this.next(); }); \ No newline at end of file diff --git a/Packages/design/styles/common/webfonts.styl b/Packages/design/styles/common/webfonts.styl index e6e5f698e..9a9753741 100644 --- a/Packages/design/styles/common/webfonts.styl +++ b/Packages/design/styles/common/webfonts.styl @@ -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) -@import url(http://fonts.googleapis.com/css?family=Sanchez:400,700&subset=latin,latin-ext) +// TODO: Find out why Meteor is complaining about these? +// Replaced them with '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) diff --git a/Packages/hangingprotocols/client/components/matchedProtocols/matchedProtocols.js b/Packages/hangingprotocols/client/components/matchedProtocols/matchedProtocols.js index 41436c0a4..7a66e6c82 100644 --- a/Packages/hangingprotocols/client/components/matchedProtocols/matchedProtocols.js +++ b/Packages/hangingprotocols/client/components/matchedProtocols/matchedProtocols.js @@ -1,10 +1,5 @@ import { OHIF } from 'meteor/ohif:core'; -Template.matchedProtocols.onRendered(() => { - const instance = Template.instance(); - instance.$('#matchedProtocols button').tooltip(OHIF.viewer.tooltipConfig); -}); - Template.matchedProtocols.helpers({ /** * Reactively re-render the MatchedProtocols Collection contents diff --git a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.js b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.js index fb6398cf3..131622596 100644 --- a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.js +++ b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.js @@ -6,7 +6,7 @@ ViewerData = Session.get('ViewerData') || {}; const worklistContentId = 'worklistTab'; const viewerContentId = 'viewerTab'; -Template.lesionTracker.onRendered(function() { +Template.lesionTracker.onRendered(() => { const templateData = Template.currentData(); if (templateData && templateData.studyInstanceUid) { const studyInstanceUid = templateData.studyInstanceUid; @@ -19,12 +19,10 @@ Template.lesionTracker.onRendered(function() { // TODO: Fix this it seems to be forcing two switches switchToTab(contentId); } - - Meteor.subscribe('hangingprotocols'); }); Template.lesionTracker.events({ - 'click .js-toggle-studyList': function() { + 'click .js-toggle-studyList'() { const contentId = Session.get('activeContentId'); if (contentId !== worklistContentId) { @@ -38,7 +36,7 @@ Template.lesionTracker.events({ Session.set('defaultSignInMessage', 'Tumor tracking in your browser.'); Template.lesionTracker.helpers({ - studyListToggleText: function() { + studyListToggleText() { const contentId = Session.get('activeContentId'); // If the Viewer has not been opened yet, 'Back to viewer' should @@ -54,7 +52,7 @@ Template.lesionTracker.helpers({ return 'Study list'; } }, - onStudyList: function() { + onStudyList() { return (Session.get('activeContentId') === 'worklistTab'); } }); diff --git a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.styl b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.styl index 0c25c7f69..f25b0a1b5 100644 --- a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.styl +++ b/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.styl @@ -72,14 +72,3 @@ img.logoImage color: $textSecondaryColor font-size: 30px 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 diff --git a/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.html b/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.html deleted file mode 100644 index 5f62f3035..000000000 --- a/Packages/lesiontracker/client/components/lesionTrackerLayout/lesionTrackerLayout.html +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/Packages/lesiontracker/client/components/viewer/viewer.js b/Packages/lesiontracker/client/components/viewer/viewer.js index e1a322f0e..d2c526f51 100644 --- a/Packages/lesiontracker/client/components/viewer/viewer.js +++ b/Packages/lesiontracker/client/components/viewer/viewer.js @@ -26,6 +26,8 @@ Template.viewer.onCreated(() => { instance.data.state.set('leftSidebar', Session.get('leftSidebar')); instance.data.state.set('rightSidebar', Session.get('rightSidebar')); + instance.subscribe('hangingprotocols'); + Session.set('currentTimepointId', instance.data.currentTimepointId); const contentId = instance.data.contentId; @@ -49,18 +51,6 @@ Template.viewer.onCreated(() => { OHIF.viewer.defaultHotkeys.bidirectional = 'T'; // 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) { log.info('Reloading previous loadedSeriesData'); OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData; @@ -68,20 +58,7 @@ Template.viewer.onCreated(() => { } else { log.info('Setting default ViewerData'); OHIF.viewer.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; + ViewerData[contentId].loadedSeriesData = {}; Session.set('ViewerData', ViewerData); } @@ -108,11 +85,8 @@ Template.viewer.onCreated(() => { instance.subscribe('singlePatientMeasurements', dataContext.studies[0].patientId); instance.subscribe('singlePatientImageMeasurements', dataContext.studies[0].patientId); instance.subscribe('singlePatientAdditionalFindings', dataContext.studies[0].patientId); - - const subscriptionsReady = instance.subscriptionsReady(); - log.info('autorun viewer.js. Ready: ' + subscriptionsReady); - - if (subscriptionsReady) { + + if (instance.subscriptionsReady()) { // Set buttons as enabled/disabled when Timepoints collection is ready timepointAutoCheck(dataContext); diff --git a/Packages/lesiontracker/client/components/viewer/viewer.styl b/Packages/lesiontracker/client/components/viewer/viewer.styl index cbbd5bbfb..15559ac18 100644 --- a/Packages/lesiontracker/client/components/viewer/viewer.styl +++ b/Packages/lesiontracker/client/components/viewer/viewer.styl @@ -6,6 +6,23 @@ display: flex flex-flow: column wrap height: 100% + width: 100% margin: 0 padding: 0 - width: 100% \ No newline at end of file + + +#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 diff --git a/LesionTracker/client/components/init.js b/Packages/lesiontracker/client/tools.js similarity index 99% rename from LesionTracker/client/components/init.js rename to Packages/lesiontracker/client/tools.js index ad62626a0..de5278a9f 100644 --- a/LesionTracker/client/components/init.js +++ b/Packages/lesiontracker/client/tools.js @@ -3,7 +3,7 @@ Meteor.startup(function() { mouse: cornerstoneTools.bidirectional, touch: cornerstoneTools.bidirectionalTouch }); - + toolManager.addTool('nonTarget', { mouse: cornerstoneTools.nonTarget, touch: cornerstoneTools.nonTargetTouch @@ -44,4 +44,4 @@ Meteor.startup(function() { states.activate.push('deleteLesionKeyboardTool'); toolManager.setToolDefaultStates(states); -}); +}); \ No newline at end of file diff --git a/Packages/lesiontracker/package.js b/Packages/lesiontracker/package.js index e7a8354d2..4fa57cd98 100644 --- a/Packages/lesiontracker/package.js +++ b/Packages/lesiontracker/package.js @@ -55,6 +55,8 @@ Package.onUse(function(api) { ], 'client', { bare: true }); + + api.addFiles('client/tools.js', 'client'); // UI Components api.addFiles('client/components/viewer/viewer.html', 'client'); @@ -81,8 +83,6 @@ Package.onUse(function(api) { 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/additionalFindings/additionalFindings.html', 'client'); api.addFiles('client/components/additionalFindings/additionalFindings.styl', 'client'); api.addFiles('client/components/additionalFindings/additionalFindings.js', 'client'); diff --git a/LesionTracker/client/components/emailVerification/emailVerification.html b/Packages/viewerbase/client/components/basic/emailVerification/emailVerification.html similarity index 100% rename from LesionTracker/client/components/emailVerification/emailVerification.html rename to Packages/viewerbase/client/components/basic/emailVerification/emailVerification.html diff --git a/LesionTracker/client/components/emailVerification/emailVerification.js b/Packages/viewerbase/client/components/basic/emailVerification/emailVerification.js similarity index 100% rename from LesionTracker/client/components/emailVerification/emailVerification.js rename to Packages/viewerbase/client/components/basic/emailVerification/emailVerification.js diff --git a/LesionTracker/client/components/emailVerification/emailVerification.styl b/Packages/viewerbase/client/components/basic/emailVerification/emailVerification.styl similarity index 100% rename from LesionTracker/client/components/emailVerification/emailVerification.styl rename to Packages/viewerbase/client/components/basic/emailVerification/emailVerification.styl diff --git a/Packages/viewerbase/client/components/basic/layout/layout.html b/Packages/viewerbase/client/components/basic/layout/layout.html new file mode 100644 index 000000000..b023d9c9a --- /dev/null +++ b/Packages/viewerbase/client/components/basic/layout/layout.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.html b/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.html deleted file mode 100644 index cb1d05c7b..000000000 --- a/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.html +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.js b/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.js deleted file mode 100644 index eb8930c71..000000000 --- a/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.js +++ /dev/null @@ -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); - }); - } -}); diff --git a/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.styl b/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.styl deleted file mode 100644 index b690d6cfe..000000000 --- a/Packages/viewerbase/client/components/studyBrowser/relatedStudySelect/relatedStudySelect.styl +++ /dev/null @@ -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 - diff --git a/Packages/viewerbase/client/components/viewer/gridLayout/gridLayout.js b/Packages/viewerbase/client/components/viewer/gridLayout/gridLayout.js index d98f62b82..b283e14ae 100644 --- a/Packages/viewerbase/client/components/viewer/gridLayout/gridLayout.js +++ b/Packages/viewerbase/client/components/viewer/gridLayout/gridLayout.js @@ -29,12 +29,4 @@ Template.gridLayout.helpers({ return viewportData; } -}); - -Template.gridLayout.onRendered(function() { - OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer('CornerstoneNewImage', cornerstoneTools.updateImageSynchronizer); -}); - -Template.gridLayout.onDestroyed(function() { - OHIF.viewer.updateImageSynchronizer.destroy(); -}); +}); \ No newline at end of file diff --git a/Packages/viewerbase/client/components/viewer/gridLayout/gridLayout.styl b/Packages/viewerbase/client/components/viewer/gridLayout/gridLayout.styl index 9c7bf54d4..e89ac155e 100644 --- a/Packages/viewerbase/client/components/viewer/gridLayout/gridLayout.styl +++ b/Packages/viewerbase/client/components/viewer/gridLayout/gridLayout.styl @@ -2,19 +2,4 @@ #imageViewerViewports height: 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 \ No newline at end of file + width: 100% \ No newline at end of file diff --git a/Packages/viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js b/Packages/viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js index 49ad2ca39..b8ce1ff10 100644 --- a/Packages/viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js +++ b/Packages/viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js @@ -25,6 +25,11 @@ function loadSeriesIntoViewport(data, templateData) { var viewportIndex = $('.imageViewerViewport').index(element); layoutManager = layoutManager || window.layoutManager; + layoutManager.viewportData = layoutManager.viewportData || {}; + if (layoutManager.viewportData[viewportIndex] === undefined) { + layoutManager.viewportData[viewportIndex] = {}; + } + layoutManager.viewportData[viewportIndex].viewportIndex = viewportIndex; // Get the contentID of the current worklist tab, if the viewport is running diff --git a/Packages/viewerbase/client/components/viewer/viewerMain/viewerMain.js b/Packages/viewerbase/client/components/viewer/viewerMain/viewerMain.js index 18cd019e4..afbd2fd48 100644 --- a/Packages/viewerbase/client/components/viewer/viewerMain/viewerMain.js +++ b/Packages/viewerbase/client/components/viewer/viewerMain/viewerMain.js @@ -1,6 +1,9 @@ Template.viewerMain.onCreated(() => { // Attach the Window resize listener $(window).on('resize', handleResize); + + // Create the synchronizer used to update reference lines + OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer('CornerstoneNewImage', cornerstoneTools.updateImageSynchronizer); }); Template.viewerMain.onRendered(() => { @@ -21,6 +24,6 @@ Template.viewerMain.onDestroyed(() => { // Remove the Window resize listener $(window).off('resize', handleResize); - // Destory the synchronizer used to update reference lines + // Destroy the synchronizer used to update reference lines OHIF.viewer.updateImageSynchronizer.destroy(); }); \ No newline at end of file diff --git a/Packages/viewerbase/client/components/viewer/viewerMain/viewerMain.styl b/Packages/viewerbase/client/components/viewer/viewerMain/viewerMain.styl index 6cac01b6c..2144bd399 100644 --- a/Packages/viewerbase/client/components/viewer/viewerMain/viewerMain.styl +++ b/Packages/viewerbase/client/components/viewer/viewerMain/viewerMain.styl @@ -7,11 +7,22 @@ #layoutManagerTarget width: 100% height: 100% - transition(all 0.3s ease) #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 - .imageViewerViewport - border-right: $uiBorderThickness solid #436270 + width: 100% + height: 100% + position: relative // Necessary so that the viewportOverlay is on top of the viewports + + diff --git a/Packages/viewerbase/client/components/viewer/viewportOverlay/viewportOverlay.html b/Packages/viewerbase/client/components/viewer/viewportOverlay/viewportOverlay.html index 0671913c5..16a6ae714 100644 --- a/Packages/viewerbase/client/components/viewer/viewportOverlay/viewportOverlay.html +++ b/Packages/viewerbase/client/components/viewer/viewportOverlay/viewportOverlay.html @@ -11,13 +11,13 @@
{{formatDA studyDate}} {{formatTM studyTime}}
-
Zoom: {{formatNumberPrecision zoom 2}}%
+
{{#if zoom}}Zoom: {{formatNumberPrecision zoom 2}}%{{/if}}
{{compression}}
{{wwwc}}
-
Ser: {{seriesNumber}}
-
Img: {{imageNumber}} ({{imageIndex}}/{{numImages}})
+
{{#if seriesNumber}}Ser: {{seriesNumber}}{{/if}}
+
{{#if numImages}}Img: {{imageNumber}} ({{imageIndex}}/{{numImages}}){{/if}}
{{#if frameRate}}{{frameRate}} FPS{{/if}}
{{imageDimensions}}
{{seriesDescription}}
@@ -33,12 +33,12 @@
{{formatDA studyDate}} {{formatTM studyTime}}
-
Ser: {{seriesNumber}}
-
Img: {{imageNumber}} ({{imageIndex}}/{{numImages}})
+
{{#if seriesNumber}}Ser: {{seriesNumber}}{{/if}}
+
{{#if numImages}}Img: {{imageNumber}} ({{imageIndex}}/{{numImages}}){{/if}}
{{#if frameRate}}{{frameRate}} FPS{{/if}}
{{imageDimensions}}
{{seriesDescription}}
-
Zoom: {{formatNumberPrecision zoom 2}}%
+
{{#if zoom}}Zoom: {{formatNumberPrecision zoom 2}}%{{/if}}
{{compression}}
{{wwwc}}
@@ -53,12 +53,12 @@
{{formatDA studyDate}} {{formatTM studyTime}}
-
Ser: {{seriesNumber}}
-
Img: {{imageNumber}} ({{imageIndex}}/{{numImages}})
+
{{#if seriesNumber}}Ser: {{seriesNumber}}{{/if}}
+
{{#if numImages}}Img: {{imageNumber}} ({{imageIndex}}/{{numImages}}){{/if}}
{{#if frameRate}}{{frameRate}} FPS{{/if}}
{{imageDimensions}}
{{seriesDescription}}
-
Zoom: {{formatNumberPrecision zoom 2}}%
+
{{#if zoom}}Zoom: {{formatNumberPrecision zoom 2}}%{{/if}}
{{compression}}
{{wwwc}}
diff --git a/Packages/viewerbase/client/components/viewer/viewportOverlay/viewportOverlay.js b/Packages/viewerbase/client/components/viewer/viewportOverlay/viewportOverlay.js index 4c8cf64a8..286e2ca91 100644 --- a/Packages/viewerbase/client/components/viewer/viewportOverlay/viewportOverlay.js +++ b/Packages/viewerbase/client/components/viewer/viewportOverlay/viewportOverlay.js @@ -133,12 +133,12 @@ Template.viewportOverlay.helpers({ Session.get('CornerstoneImageRendered' + this.viewportIndex); var element = getElementIfNotEmpty(this.viewportIndex); if (!element) { - return ''; + return; } var viewport = cornerstone.getViewport(element); if (!viewport) { - return ''; + return; } return (viewport.scale * 100.0); diff --git a/LesionTracker/client/debugReactivity.js b/Packages/viewerbase/lib/debugReactivity.js similarity index 100% rename from LesionTracker/client/debugReactivity.js rename to Packages/viewerbase/lib/debugReactivity.js diff --git a/Packages/viewerbase/lib/importStudies.js b/Packages/viewerbase/lib/importStudies.js index d29cdaa15..0dc77fd48 100644 --- a/Packages/viewerbase/lib/importStudies.js +++ b/Packages/viewerbase/lib/importStudies.js @@ -44,7 +44,7 @@ importStudies = function(filesToImport, importCallback) { if (fileUploadStatus.numberOfFilesFailed > 0) { //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"); } } }; diff --git a/Packages/viewerbase/package.js b/Packages/viewerbase/package.js index 8a518f512..18dea5432 100644 --- a/Packages/viewerbase/package.js +++ b/Packages/viewerbase/package.js @@ -34,6 +34,7 @@ Package.onUse(function(api) { // ---------- 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.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.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 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.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.js', '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/isImage.js', 'client'); api.addFiles('lib/sopClassDictionary.js', 'client'); + api.addFiles('lib/debugReactivity.js', 'client'); api.export('resizeViewportElements', 'client'); api.export('handleResize', 'client'); diff --git a/Packages/worklist/client/components/progressDialog/progressDialog.html b/Packages/worklist/client/components/progressDialog/progressDialog.html index b65684fc7..fc39f6e2c 100644 --- a/Packages/worklist/client/components/progressDialog/progressDialog.html +++ b/Packages/worklist/client/components/progressDialog/progressDialog.html @@ -5,8 +5,10 @@
-
- {{progressStatus}} +
+ {{formatNumberPrecision progressStatus 0}}%
diff --git a/Packages/worklist/client/components/progressDialog/progressDialog.js b/Packages/worklist/client/components/progressDialog/progressDialog.js index 1dcf92900..b3151b1f1 100644 --- a/Packages/worklist/client/components/progressDialog/progressDialog.js +++ b/Packages/worklist/client/components/progressDialog/progressDialog.js @@ -1,56 +1,69 @@ progressDialog = { - 'show': function(title, numberOfTotal) { - Session.set("progressDialogSettings", { title: title, numberOfCompleted: 0, numberOfTotal: numberOfTotal }); + show: function(title, numberOfTotal) { + Session.set('progressDialogSettings', { + title: title, + numberOfCompleted: 0, + numberOfTotal: numberOfTotal + }); $('#progressDialog').css('display', 'block'); }, - 'update': function(numberOfCompleted) { - var progressDialogSettings = Session.get("progressDialogSettings"); + update: function(numberOfCompleted) { + var progressDialogSettings = Session.get('progressDialogSettings'); progressDialogSettings.numberOfCompleted = numberOfCompleted; - Session.set("progressDialogSettings", progressDialogSettings); + Session.set('progressDialogSettings', progressDialogSettings); if (progressDialogSettings.numberOfCompleted === progressDialogSettings.numberOfTotal) { progressDialog.close(); } }, - 'close': function() { - Session.set("progressDialogSettings", { title: "", numberOfCompleted: 0, numberOfTotal: 1 }); + close: function() { + Session.set('progressDialogSettings', { + title: '', + numberOfCompleted: 0, + numberOfTotal: 1 + }); + $('#progressDialog').css('display', 'none'); }, - 'setMessage': function(message) { - var progressDialogSettings = Session.get("progressDialogSettings"); + setMessage: function(message) { + let progressDialogSettings = Session.get('progressDialogSettings'); progressDialogSettings.message = message; - Session.set("progressDialogSettings", progressDialogSettings); + Session.set('progressDialogSettings', progressDialogSettings); } }; Template.progressDialog.helpers({ - 'progressDialogTitle': function () { - if (Session.get("progressDialogSettings") && Session.get("progressDialogSettings").title) { - return Session.get("progressDialogSettings").title; + progressDialogTitle() { + var settings = Session.get('progressDialogSettings'); + if (!settings) { + return; } - return ""; + return settings.title; }, - 'progressStatus': function() { - var numberOfCompleted = 0; - if (Session.get("progressDialogSettings") && Session.get("progressDialogSettings").numberOfCompleted) { - numberOfCompleted = Session.get("progressDialogSettings").numberOfCompleted; + + progressStatus() { + const settings = Session.get('progressDialogSettings'); + if (!settings) { + return; } - var numberofTotal = 1; - if (Session.get("progressDialogSettings") && Session.get("progressDialogSettings").numberOfTotal) { - numberofTotal = Session.get("progressDialogSettings").numberOfTotal; + if (settings.numberOfCompleted === undefined || + settings.numberOfTotal === undefined) { + return; } - return parseInt((numberOfCompleted / numberofTotal) * 100) + "%"; + return settings.numberOfCompleted / settings.numberOfTotal; }, - 'progressMessage': function() { - var progressDialogSettings = Session.get("progressDialogSettings"); - if (progressDialogSettings && progressDialogSettings.message) { - return progressDialogSettings.message; + + progressMessage() { + var settings = Session.get('progressDialogSettings'); + if (!settings) { + return; } - return; + + return settings.message; } }); diff --git a/Packages/worklist/client/components/worklist.html b/Packages/worklist/client/components/worklist.html index 5c5305250..9615cfafd 100644 --- a/Packages/worklist/client/components/worklist.html +++ b/Packages/worklist/client/components/worklist.html @@ -1,12 +1,4 @@