From ab4d4c90084707c0f6f709068178a0de7024092a Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Mon, 15 Aug 2016 15:34:36 +0200 Subject: [PATCH] Work on refactoring measurements out of Lesion Tracker package - Removed AssociatedStudies Collection - Measurement API is generated from configuration files - Data exchange methods are defined in configuration --- LesionTracker/.meteor/packages | 17 +- LesionTracker/.meteor/versions | 29 +- .../client/components/app/app.html | 14 +- .../client/components/app/app.js | 16 +- .../client/components/app/app.styl | 2 +- .../toolbarSection/toolbarSection.html | 6 +- .../toolbarSection/toolbarSection.js | 58 ++-- .../toolbarSection/toolbarSection.styl | 0 .../client/components/viewer/viewer.html | 17 + .../client/components/viewer/viewer.js | 113 +++++++ .../client/components/viewer/viewer.styl | 0 .../viewerSection/viewerSection.html | 13 + .../components/viewerSection/viewerSection.js | 14 +- .../viewerSection/viewerSection.styl | 0 .../client/lesionTrackerHangingProtocol.js | 18 +- LesionTracker/client/routes.js | 15 +- LesionTracker/server/dropAllCollections.js | 14 + OHIFViewer/.meteor/packages | 19 +- OHIFViewer/.meteor/versions | 24 +- .../components/ohifViewer/ohifViewer.html | 2 +- .../client/components/viewer/viewer.styl | 3 + OHIFViewer/client/routes.js | 21 -- PETSUVMeasurements/.gagarin/.gitignore | 1 + .../.meteor/.finished-upgraders | 16 + PETSUVMeasurements/.meteor/.gitignore | 2 + PETSUVMeasurements/.meteor/.id | 7 + PETSUVMeasurements/.meteor/nightwatch.json | 136 ++++++++ PETSUVMeasurements/.meteor/packages | 74 +++++ PETSUVMeasurements/.meteor/platforms | 2 + PETSUVMeasurements/.meteor/release | 1 + PETSUVMeasurements/.meteor/versions | 143 +++++++++ PETSUVMeasurements/activeEntry.js | 46 +++ PETSUVMeasurements/client/body.styl | 2 + .../client/components/app/app.html | 40 +++ .../client/components/app/app.js | 46 +++ .../client/components/app/app.styl | 79 +++++ .../toolbarSection/toolbarSection.html | 33 ++ .../toolbarSection/toolbarSection.js | 143 +++++++++ .../toolbarSection/toolbarSection.styl | 24 ++ .../client/components/viewer/viewer.html | 8 +- .../client/components/viewer/viewer.js | 68 ++++ .../client/components/viewer/viewer.styl | 22 ++ .../viewerSection/viewerSection.html | 13 + .../components/viewerSection/viewerSection.js | 19 ++ .../viewerSection/viewerSection.styl | 78 +++++ PETSUVMeasurements/client/head.html | 20 ++ .../client/lesionTrackerHangingProtocol.js | 167 ++++++++++ PETSUVMeasurements/client/log.js | 3 + PETSUVMeasurements/client/routes.js | 55 ++++ PETSUVMeasurements/public/images/logo.png | Bin 0 -> 15344 bytes .../server/dropAllCollections.js | 12 + PETSUVMeasurements/server/email.js | 50 +++ Packages/dicomweb/package.js | 21 -- Packages/dimseservice/package.js | 24 -- Packages/lesiontracker/both/collections.js | 16 - .../both/schema/additionalFindings.js | 54 ---- .../lesiontracker/client/api/measurement.js | 102 ------ .../lesiontracker/client/api/timepoint.js | 130 -------- .../client/compatibility/crTool.js | 10 - .../client/compatibility/exTool.js | 9 - .../client/compatibility/unTool.js | 9 - .../additionalFindings.html | 55 ---- .../additionalFindings/additionalFindings.js | 59 ---- .../additionalFindings.styl | 112 ------- .../conformanceCheckFeedback.html | 7 - .../conformanceCheckFeedback.js | 32 -- .../conformanceCheckFeedback.styl | 19 -- .../flexboxLayout/flexboxLayout.html | 18 -- .../components/lesionTable/lesionTable.html | 17 - .../lesionTableHUD/lesionTableHUD.js | 48 --- .../lesionTableHeaderRow.html | 24 -- .../lesionTableTimepointCell.html | 11 - .../lesionTableTimepointHeader.js | 39 --- .../lesionTableView/lesionTableView.html | 29 -- .../lesionTableView/lesionTableView.js | 23 -- .../lesionTrackerWorklistContextMenu.html | 42 --- .../lesionTrackerWorklistStudy.js | 103 ------ .../client/components/viewer/viewer.js | 262 ---------------- Packages/lesiontracker/lib/LesionManager.js | 210 ------------- .../lib/calculateTotalLesionBurden.js | 59 ---- .../lib/clearMeasurementTimepointData.js | 36 --- Packages/lesiontracker/lib/clearTools.js | 58 ---- .../lib/handleMeasurementAdded.js | 41 --- .../lib/handleMeasurementModified.js | 44 --- .../lib/handleMeasurementRemoved.js | 27 -- .../lib/syncImageMeasurementAndToolData.js | 59 ---- .../lib/syncMeasurementAndToolData.js | 90 ------ .../lesiontracker/lib/timepointAutoCheck.js | 42 --- .../lib/updateRelatedElements.js | 13 - .../lib/worklist/worklistModification.js | 73 ----- Packages/lesiontracker/package.js | 293 ------------------ Packages/lesiontracker/server/methods.js | 61 ---- .../client/cornerstone.js | 0 .../client/cornerstoneMath.js | 0 .../client/cornerstoneTools.js | 131 +++++--- .../client/cornerstoneWADOImageLoader.js | 0 .../client/dicomParser.js | 0 .../client/hammer.js | 0 .../client/jquery.hammer.js | 0 .../client/libCharLS.js | 0 .../client/libopenjpeg.js | 0 .../package.js | 5 +- Packages/{design => ohif-design}/app.styl | 0 .../roundedButtonGroup.html | 2 +- .../roundedButtonGroup/roundedButtonGroup.js | 0 .../roundedButtonGroup.styl | 0 Packages/{design => ohif-design}/package.js | 1 - .../styles/common/global.styl | 0 .../styles/common/keyframes.styl | 0 .../styles/common/spacings.styl | 0 .../styles/common/webfonts.styl | 0 .../styles/components/dialog.styl | 0 .../styles/components/radio.styl | 0 .../styles/components/select2.styl | 0 .../styles/components/selectTree.styl | 0 .../styles/components/states.styl | 0 .../styles/imports/animations.styl | 0 .../styles/imports/mixins.styl | 0 .../styles/imports/spacings.styl | 0 .../styles/imports/theme-tide.styl | 0 .../styles/imports/theme-tigerlilly.styl | 0 .../styles/imports/theming.styl | 0 .../styles/imports/variables.styl | 0 Packages/ohif-dicom-services/package.js | 38 +++ .../server/DICOMWeb}/getAttribute.js | 0 .../server/DICOMWeb}/getJSON.js | 0 .../server/DICOMWeb}/getModalities.js | 0 .../server/DICOMWeb}/getName.js | 0 .../server/DICOMWeb}/getNumber.js | 0 .../server/DICOMWeb}/getString.js | 0 .../server/DICOMWeb}/namespace.js | 0 .../server/DIMSE}/CSocket.js | 0 .../server/DIMSE}/Connection.js | 0 .../server/DIMSE}/DIMSE.js | 0 .../server/DIMSE}/Data.js | 0 .../server/DIMSE}/Field.js | 0 .../server/DIMSE}/Message.js | 0 .../server/DIMSE}/PDU.js | 0 .../server/DIMSE}/RWStream.js | 0 .../server/DIMSE}/constants.js | 0 .../server/DIMSE}/elements_data.js | 0 .../server/DIMSE}/require.js | 0 .../assets/dots.svg | 0 .../both/collections.js | 1 + .../both/dicomTagDescriptions.js | 2 +- .../both/hardcodedData.js | 0 .../both/namespace.js | 0 .../both/routes.js | 0 .../both/schema.js | 12 +- .../both/testData.js | 0 .../client/collections.js | 0 .../matchedProtocols/matchedProtocols.html | 0 .../matchedProtocols/matchedProtocols.js | 0 .../matchedProtocols/matchedProtocols.styl | 0 .../nextPresentationGroupButton.html | 0 .../nextPresentationGroupButton.js | 0 .../previousPresentationGroupButton.html | 0 .../previousPresentationGroupButton.js | 0 .../protocolEditor/protocolEditor.html | 0 .../protocolEditor/protocolEditor.js | 4 +- .../protocolEditor/protocolEditor.styl | 0 .../ruleEntryDialog/ruleEntryDialog.html | 2 +- .../ruleEntryDialog/ruleEntryDialog.js | 2 +- .../ruleEntryDialog/ruleEntryDialog.styl | 0 .../components/ruleTable/ruleTable.html | 2 +- .../client/components/ruleTable/ruleTable.js | 0 .../components/ruleTable/ruleTable.styl | 0 .../settingEntryDialog.html | 0 .../settingEntryDialog/settingEntryDialog.js | 0 .../settingEntryDialog.styl | 0 .../settingsTable/settingsTable.html | 0 .../components/settingsTable/settingsTable.js | 0 .../settingsTable/settingsTable.styl | 0 .../components/stageDetails/stageDetails.html | 0 .../components/stageDetails/stageDetails.js | 0 .../components/stageDetails/stageDetails.styl | 0 .../stageSortable/stageSortable.html | 0 .../components/stageSortable/stageSortable.js | 0 .../stageSortable/stageSortable.styl | 0 .../textEntryDialog/textEntryDialog.html | 0 .../textEntryDialog/textEntryDialog.js | 0 .../textEntryDialog/textEntryDialog.styl | 0 .../client/helpers/attributes.js | 0 .../client/helpers/displayConstraint.js | 0 .../client/protocolEngine.js | 12 +- .../log.js | 0 .../package.js | 6 +- .../server/collections.js | 0 .../server/methods.js | 0 .../testData/GEMS_PARM_01.dcm | Bin .../testData/GEMS_PARM_01.xml | 0 .../testData/NeurosurgeryPlan.dcm | Bin .../testData/NeurosurgeryPlan.xml | 0 .../both/configuration/bidirectional.js | 86 +++++ .../both/configuration/configuration.js | 32 ++ .../both/configuration/dataExchange.js | 66 ++++ .../both/configuration/dataValidation.js | 8 + .../both/configuration/ellipse.js | 33 ++ .../both/configuration/length.js | 33 ++ .../both/configuration/measurementTools.js | 11 + .../both/configuration/nonTarget.js | 55 ++++ .../client/collections/LesionLocations.js | 31 +- .../client/collections/LocationResponses.js | 40 ++- .../client/compatibility/bidirectionalTool.js | 16 - .../compatibility/deleteLesionKeyboardTool.js | 0 .../client/compatibility/nonTargetTool.js | 0 .../compatibility/qualitativeTargetTools.js} | 122 ++++---- .../client/compatibility/scaleOverlayTool.js | 0 .../components/measureFlow/measureFlow.html | 0 .../components/measureFlow/measureFlow.js | 0 .../components/measureFlow/measureFlow.styl | 0 .../measurementLocationDialog.html} | 26 +- .../measurementLocationDialog.js} | 176 +++++------ .../measurementLocationDialog.styl} | 11 +- .../nonTargetLesionDialog.html | 6 +- .../nonTargetLesionDialog.js | 68 ++-- .../nonTargetLesionDialog.styl | 0 .../nonTargetResponseDialog.html | 0 .../nonTargetResponseDialog.js | 0 .../nonTargetResponseDialog.styl | 0 .../irRCDescription/irRCDescription.html | 0 .../components/optionsModal/optionsModal.html | 0 .../components/optionsModal/optionsModal.js | 0 .../components/optionsModal/optionsModal.styl | 0 .../recistDescription/recistDescription.html | 0 .../client/tools.js | 2 +- .../lib/MeasurementValidation.js} | 0 .../lib/TrialCriteriaConstraints.js | 15 +- .../lib/clearMeasurementTimepointData.js} | 23 +- .../lib/convertNonTarget.js | 6 +- .../lib/convertToNonTarget.js | 2 +- .../lib/getTimepointName.js | 0 .../lib/getTimepointObject.js | 0 .../lib/pixelSpacingAutorunCheck.js | 0 .../lib/studylist}/openNewTabWithTimepoint.js | 21 +- .../lib/studylist/studylistModification.js | 58 ++++ .../lib/syncMeasurementAndToolData.js | 60 ++++ .../lib/toggleLesionTrackerTools.js | 0 Packages/ohif-lesiontracker/log.js | 3 + Packages/ohif-lesiontracker/package.js | 135 ++++++++ Packages/ohif-lesiontracker/server/methods.js | 65 ++++ .../server/publications.js | 0 .../both/configuration/measurements.js | 109 +++++++ .../both/configuration/timepoints.js | 230 ++++++++++++++ .../both/schema/measurements.js | 192 ++++++++++++ .../both/schema/timepoints.js | 32 ++ .../associationModal/associationModal.html | 0 .../associationModal/associationModal.js | 60 +--- .../associationModal/associationModal.styl | 0 .../studyAssociationTable.html | 6 +- .../studyAssociationTable.js | 8 +- .../studyAssociationTable.styl | 0 .../confirmRemoveTimepointAssociation.html | 0 .../confirmRemoveTimepointAssociation.js | 2 +- .../components/caseProgress/caseProgress.html | 2 + .../components/caseProgress/caseProgress.js | 34 +- .../components/caseProgress/caseProgress.styl | 0 .../radialProgressBar/radialProgressBar.html | 4 +- .../radialProgressBar/radialProgressBar.js | 0 .../radialProgressBar/radialProgressBar.styl | 0 .../longitudinalStudyListContextMenu.html | 43 +++ .../longitudinalStudyListContextMenu.js} | 78 ++--- .../longitudinalStudyListStudy.html} | 4 +- .../longitudinalStudyListStudy.js | 75 +++++ .../longitudinalStudyListStudy.styl} | 2 +- .../longitudinalViewportOverlay.html} | 2 +- .../longitudinalViewportOverlay.js} | 20 +- .../measurementTable/measurementTable.html | 16 + .../measurementTable/measurementTable.js} | 37 ++- .../measurementTable/measurementTable.styl} | 6 +- .../measurementTableHUD.html} | 8 +- .../measurementTableHUD.js | 50 +++ .../measurementTableHUD.styl} | 6 +- .../measurementTableHeaderRow.html | 24 ++ .../measurementTableHeaderRow.js} | 67 ++-- .../measurementTableHeaderRow.styl} | 8 +- .../measurementTableRow.html} | 18 +- .../measurementTableRow.js} | 6 +- .../measurementTableRow.styl} | 2 +- .../measurementTableTimepointCell.html | 11 + .../measurementTableTimepointCell.js} | 79 ++--- .../measurementTableTimepointCell.styl} | 2 +- .../measurementTableTimepointHeader.html} | 4 +- .../measurementTableTimepointHeader.js | 8 + .../measurementTableTimepointHeader.styl} | 2 +- .../measurementTableView.html | 41 +++ .../measurementTableView.js | 101 ++++++ .../measurementTableView.styl} | 2 +- .../client/helpers/measurements.js | 21 ++ .../client/helpers/timepoints.js | 5 + .../client/lib/MeasurementHandlers.js | 153 +++++++++ .../client/lib/MeasurementManager.js | 47 +++ .../client}/lib/activateLesion.js | 0 .../client}/lib/activateMeasurements.js | 0 .../client/lib/clearTools.js | 61 ++++ .../client}/lib/deactivateAllToolData.js | 0 .../client/lib/getTimepointName.js | 44 +++ .../client/lib/getTimepointObject.js | 18 ++ .../lib/hangingProtocolCustomizations.js | 19 ++ .../client/lib/syncMeasurementAndToolData.js | 60 ++++ Packages/ohif-measurements/log.js | 3 + Packages/ohif-measurements/package.js | 121 ++++++++ .../both/configuration/configuration.js | 17 + .../both/configuration/dataExchange.js | 37 +++ .../both/configuration/dataValidation.js | 5 + .../ohif-petsuv/both/configuration/ellipse.js | 103 ++++++ .../both/configuration/measurementTools.js | 5 + Packages/ohif-petsuv/log.js | 3 + Packages/ohif-petsuv/package.js | 41 +++ Packages/ohif-petsuv/server/methods.js | 65 ++++ Packages/ohif-study-list/both/collections.js | 17 + .../both/lib/getCurrentServer.js | 1 + .../both/schema/servers.js} | 10 + .../client/collections/subscriptions.js | 0 .../progressDialog/progressDialog.html | 0 .../progressDialog/progressDialog.js | 0 .../progressDialog/progressDialog.styl | 0 .../seriesDetailsTable.html | 0 .../seriesDetailsTable/seriesDetailsTable.js | 0 .../seriesDetailsTable.styl | 0 .../serverInformationDicomWeb.html | 0 .../serverInformationDicomWeb.js | 0 .../serverInformationDimse.html | 0 .../serverInformationDimse.js | 0 .../serverInformationForm.html | 0 .../serverInformationForm.js | 4 +- .../serverInformationFormField.html | 0 .../serverInformationList.html | 0 .../serverInformationList.js | 0 .../serverInformationModal.html | 0 .../serverInformationModal.js | 0 .../serverInformationModal.styl | 0 .../studyContextMenu/studyContextMenu.html | 0 .../studyContextMenu/studyContextMenu.js | 14 +- .../studyContextMenu/studyContextMenu.styl | 0 .../client/components/studylist.html | 19 ++ .../client/components/studylist.js} | 36 ++- .../client/components/studylist.styl} | 4 +- .../studylistPagination.html} | 4 +- .../studylistPagination.js} | 10 +- .../studylistPagination.styl} | 2 +- .../studylistResult/studylistResult.html} | 26 +- .../studylistResult/studylistResult.js} | 38 +-- .../studylistResult/studylistResult.styl} | 5 +- .../studylistStudy/studylistStudy.html} | 4 +- .../studylistStudy/studylistStudy.js} | 54 ++-- .../studylistStudy/studylistStudy.styl} | 2 +- .../studylistToolbar/studylistToolbar.html} | 4 +- .../studylistToolbar/studylistToolbar.js} | 6 +- .../studylistToolbar/studylistToolbar.styl} | 2 +- .../client/components/tabTitle/tabTitle.html | 0 .../client/components/tabTitle/tabTitle.js | 8 - .../client/components/tabTitle/tabTitle.styl | 0 .../viewSeriesDetailsModal.html | 0 .../client/lib/exportStudies.js | 0 .../client/lib/getStudiesMetadata.js | 0 .../client/lib/getStudyMetadata.js | 8 +- .../client/lib/importStudies.js | 2 +- .../jquery.twbsPagination.min.js | 0 .../client/lib/openNewTab.js | 5 +- .../client/lib/queryStudies.js | 0 .../client/lib/studylist.js} | 9 +- .../client/lib/switchToTab.js | 35 ++- Packages/{worklist => ohif-study-list}/log.js | 2 +- .../{worklist => ohif-study-list}/package.js | 64 ++-- .../server/lib/encodeQueryData.js | 0 .../server/lib/parseFloatArray.js | 0 .../server/lib/remoteGetValue.js | 0 .../server/methods/getStudyMetadata.js | 0 .../server/methods/importStudies.js | 2 +- .../server/methods/studylistSearch.js} | 5 +- .../server/publications.js | 0 .../server/servers.js | 3 +- .../server/services/dimse/instances.js | 132 ++++---- .../server/services/dimse/retrieveMetadata.js | 0 .../server/services/dimse/setup.js | 0 .../server/services/dimse/studies.js | 118 +++---- .../server/services/namespace.js | 0 .../server/services/qido/instances.js | 0 .../server/services/qido/studies.js | 0 .../server/services/remote/instances.js | 0 .../services/remote/retrieveMetadata.js | 0 .../server/services/remote/studies.js | 0 .../server/services/wado/retrieveMetadata.js | 0 .../server/validateServerConfiguration.js | 2 +- .../ohif-user-management/both/collections.js | 8 + .../both/schema/reviewers.js | 24 ++ .../client/active-entry}/activeEntry.js | 0 .../client/active-entry}/activeEntry.styl | 0 .../client/active-entry}/activeEntrySignIn.js | 0 .../emailVerification/emailVerification.html | 0 .../emailVerification/emailVerification.js | 0 .../emailVerification/emailVerification.styl | 0 .../components/hipaaLogPage/hipaaLogPage.js | 0 .../components/hipaaLogPage/hipaaLogPage.styl | 0 .../lastLoginModal/lastLoginModal.html | 0 .../timeoutCountdownDialog.html | 0 .../timeoutCountdownDialog.js | 0 .../timeoutCountdownDialog.styl | 0 .../userAccountMenu/userAccountMenu.html | 6 +- .../userAccountMenu/userAccountMenu.js | 0 .../userAccountMenu/userAccountMenu.styl | 0 .../client}/subscriptions.js | 0 .../log.js | 0 Packages/ohif-user-management/package.js | 64 ++++ .../server/createDemoUser.js | 0 .../server/publications.js | 5 + .../server/reviewers.js | 20 +- .../assets/icons.svg | 0 .../client/collections.js | 2 - .../client/compatibility/dialogPolyfill.js | 0 .../client/compatibility/dialogPolyfill.styl | 0 .../client/compatibility/jquery.hotkeys.js | 0 .../basic/aboutModal/aboutModal.html | 2 +- .../components/basic/aboutModal/aboutModal.js | 0 .../basic/aboutModal/aboutModal.styl | 0 .../components/basic/layout/layout.html | 0 .../basic/loadingText/loadingText.html | 0 .../basic/loadingText/loadingText.styl | 0 .../removableBackdrop/removableBackdrop.html | 0 .../removableBackdrop/removableBackdrop.styl | 0 .../imageThumbnail/imageThumbnail.html | 0 .../imageThumbnail/imageThumbnail.js | 0 .../imageThumbnail/imageThumbnail.styl | 0 .../studyBrowser/studyBrowser.html | 0 .../studyBrowser/studyBrowser/studyBrowser.js | 0 .../studyBrowser/studyBrowser.styl | 0 .../thumbnailEntry/thumbnailEntry.html | 0 .../thumbnailEntry/thumbnailEntry.js | 0 .../thumbnailEntry/thumbnailEntry.styl | 0 .../annotationDialogs/annotationDialogs.html | 0 .../annotationDialogs/annotationDialogs.js | 0 .../annotationDialogs/annotationDialogs.styl | 0 .../viewer/cineDialog/cineDialog.html | 0 .../viewer/cineDialog/cineDialog.js | 0 .../viewer/cineDialog/cineDialog.styl | 0 .../confirmDeleteDialog.html | 0 .../confirmDeleteDialog.js | 0 .../confirmDeleteDialog.styl | 0 .../displaySetNavigation.html | 0 .../displaySetNavigation.js | 0 .../viewer/gridLayout/gridLayout.html | 0 .../viewer/gridLayout/gridLayout.js | 0 .../viewer/gridLayout/gridLayout.styl | 0 .../viewer/imageControls/imageControls.html | 0 .../viewer/imageControls/imageControls.js | 0 .../viewer/imageControls/imageControls.styl | 0 .../imageViewerViewport.html | 0 .../imageViewerViewport.js | 8 +- .../imageViewerViewport.styl | 0 .../viewer/layoutButton/layoutButton.html | 0 .../viewer/layoutButton/layoutButton.js | 0 .../viewer/layoutChooser/layoutChooser.html | 0 .../viewer/layoutChooser/layoutChooser.js | 0 .../viewer/layoutChooser/layoutChooser.styl | 0 .../loadingIndicator/loadingIndicator.html | 0 .../loadingIndicator/loadingIndicator.js | 0 .../loadingIndicator/loadingIndicator.styl | 0 .../viewer/playClipButton/playClipButton.html | 0 .../viewer/playClipButton/playClipButton.js | 0 .../studySeriesQuickSwitch.html | 0 .../studySeriesQuickSwitch.js | 0 .../studySeriesQuickSwitch.styl | 0 .../studyTimepointBrowser/studyTimepoint.html | 0 .../studyTimepointBrowser/studyTimepoint.js | 0 .../studyTimepointBrowser/studyTimepoint.styl | 0 .../studyTimepointBrowser.html | 0 .../studyTimepointBrowser.js | 10 +- .../studyTimepointBrowser.styl | 0 .../studyTimepointStudy.html | 0 .../studyTimepointStudy.js | 2 +- .../studyTimepointStudy.styl | 2 +- .../toolbarSectionButton.html | 0 .../toolbarSectionButton.js | 0 .../toolbarSectionButton.styl | 0 .../toolbarSectionTools.html | 2 +- .../toolbarSectionTools.js | 0 .../toolbarSectionTools.styl | 0 .../viewer/viewerMain/viewerMain.html | 0 .../viewer/viewerMain/viewerMain.js | 16 +- .../viewer/viewerMain/viewerMain.styl | 0 .../viewportOrientationMarkers.html | 0 .../viewportOrientationMarkers.js | 0 .../viewportOrientationMarkers.styl | 0 .../viewportOverlay/viewportOverlay.html | 0 .../viewer/viewportOverlay/viewportOverlay.js | 0 .../viewportOverlay/viewportOverlay.styl | 0 .../lib/WLPresets.js | 0 .../lib/createStacks.js | 0 .../lib/debugReactivity.js | 0 .../lib/displayReferenceLines.js | 0 .../lib/enableHotkeys.js | 9 + .../lib/enablePrefetchOnElement.js | 0 .../lib/getImageId.js | 0 .../lib/getWADORSImageId.js | 0 .../lib/helpers/capitalizeFirstLetter.js | 0 .../lib/helpers/formatDA.js | 0 .../lib/helpers/formatJSDate.js | 0 .../lib/helpers/formatNumberPrecision.js | 0 .../lib/helpers/formatPN.js | 0 .../lib/helpers/formatTM.js | 0 .../lib/helpers/getUsername.js | 0 .../lib/helpers/ifTypeIs.js | 0 .../lib/helpers/inc.js | 0 .../lib/helpers/isDisplaySetActive.js | 0 .../lib/helpers/isTouchDevice.js | 0 .../lib/helpers/jsDateFromNow.js | 0 .../lib/helpers/objectEach.js | 0 .../lib/helpers/objectToPairs.js | 0 .../lib/helpers/prettyPrintStringify.js | 0 .../lib/helpers/sorting.js | 0 .../lib/helpers/studyThumbnails.js | 0 .../lib/instanceClassSpecificViewport.js | 0 .../lib/isImage.js | 0 .../lib/layoutManager.js | 0 .../lib/metaDataProvider.js | 0 .../lib/resizeViewportElements.js | 0 .../lib/setActiveViewport.js | 0 .../lib/setFocusToActiveViewport.js | 0 .../lib/setMammogramViewportAlignment.js | 0 .../lib/sopClassDictionary.js | 0 .../lib/sortStudy.js | 0 .../lib/switchToImageByIndex.js | 0 .../lib/switchToImageRelative.js | 0 .../lib/toggleDialog.js | 0 .../lib/toolManager.js | 0 .../lib/updateAllViewports.js | 0 .../lib/viewportFunctions.js | 0 .../{viewerbase => ohif-viewerbase}/log.js | 0 .../package.js | 25 +- .../{wadoproxy => ohif-wadoproxy}/package.js | 2 +- .../server/initialize.js | 0 .../server/namespace.js | 0 .../server/routes.js | 0 Packages/viewerbase/lib/helpers/inlineIf.js | 10 - Packages/worklist/both/collections.js | 9 - .../worklist/client/components/worklist.html | 19 -- 537 files changed, 5122 insertions(+), 3545 deletions(-) rename Packages/lesiontracker/client/components/lesionTracker/lesionTracker.html => LesionTracker/client/components/app/app.html (77%) rename Packages/lesiontracker/client/components/lesionTracker/lesionTracker.js => LesionTracker/client/components/app/app.js (73%) rename Packages/lesiontracker/client/components/lesionTracker/lesionTracker.styl => LesionTracker/client/components/app/app.styl (99%) rename {Packages/lesiontracker => LesionTracker}/client/components/toolbarSection/toolbarSection.html (84%) rename {Packages/lesiontracker => LesionTracker}/client/components/toolbarSection/toolbarSection.js (67%) rename {Packages/lesiontracker => LesionTracker}/client/components/toolbarSection/toolbarSection.styl (100%) create mode 100644 LesionTracker/client/components/viewer/viewer.html create mode 100644 LesionTracker/client/components/viewer/viewer.js rename {Packages/lesiontracker => LesionTracker}/client/components/viewer/viewer.styl (100%) create mode 100644 LesionTracker/client/components/viewerSection/viewerSection.html rename Packages/lesiontracker/client/components/flexboxLayout/flexboxLayout.js => LesionTracker/client/components/viewerSection/viewerSection.js (53%) rename Packages/lesiontracker/client/components/flexboxLayout/flexboxLayout.styl => LesionTracker/client/components/viewerSection/viewerSection.styl (100%) create mode 100644 LesionTracker/server/dropAllCollections.js create mode 100644 PETSUVMeasurements/.gagarin/.gitignore create mode 100644 PETSUVMeasurements/.meteor/.finished-upgraders create mode 100644 PETSUVMeasurements/.meteor/.gitignore create mode 100644 PETSUVMeasurements/.meteor/.id create mode 100644 PETSUVMeasurements/.meteor/nightwatch.json create mode 100644 PETSUVMeasurements/.meteor/packages create mode 100644 PETSUVMeasurements/.meteor/platforms create mode 100644 PETSUVMeasurements/.meteor/release create mode 100644 PETSUVMeasurements/.meteor/versions create mode 100644 PETSUVMeasurements/activeEntry.js create mode 100644 PETSUVMeasurements/client/body.styl create mode 100644 PETSUVMeasurements/client/components/app/app.html create mode 100644 PETSUVMeasurements/client/components/app/app.js create mode 100644 PETSUVMeasurements/client/components/app/app.styl create mode 100644 PETSUVMeasurements/client/components/toolbarSection/toolbarSection.html create mode 100644 PETSUVMeasurements/client/components/toolbarSection/toolbarSection.js create mode 100644 PETSUVMeasurements/client/components/toolbarSection/toolbarSection.styl rename {Packages/lesiontracker => PETSUVMeasurements}/client/components/viewer/viewer.html (54%) create mode 100644 PETSUVMeasurements/client/components/viewer/viewer.js create mode 100644 PETSUVMeasurements/client/components/viewer/viewer.styl create mode 100644 PETSUVMeasurements/client/components/viewerSection/viewerSection.html create mode 100644 PETSUVMeasurements/client/components/viewerSection/viewerSection.js create mode 100644 PETSUVMeasurements/client/components/viewerSection/viewerSection.styl create mode 100644 PETSUVMeasurements/client/head.html create mode 100644 PETSUVMeasurements/client/lesionTrackerHangingProtocol.js create mode 100644 PETSUVMeasurements/client/log.js create mode 100644 PETSUVMeasurements/client/routes.js create mode 100644 PETSUVMeasurements/public/images/logo.png create mode 100644 PETSUVMeasurements/server/dropAllCollections.js create mode 100644 PETSUVMeasurements/server/email.js delete mode 100644 Packages/dicomweb/package.js delete mode 100755 Packages/dimseservice/package.js delete mode 100644 Packages/lesiontracker/both/collections.js delete mode 100644 Packages/lesiontracker/both/schema/additionalFindings.js delete mode 100644 Packages/lesiontracker/client/api/measurement.js delete mode 100644 Packages/lesiontracker/client/api/timepoint.js delete mode 100644 Packages/lesiontracker/client/compatibility/crTool.js delete mode 100644 Packages/lesiontracker/client/compatibility/exTool.js delete mode 100644 Packages/lesiontracker/client/compatibility/unTool.js delete mode 100644 Packages/lesiontracker/client/components/additionalFindings/additionalFindings.html delete mode 100644 Packages/lesiontracker/client/components/additionalFindings/additionalFindings.js delete mode 100644 Packages/lesiontracker/client/components/additionalFindings/additionalFindings.styl delete mode 100644 Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.html delete mode 100644 Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.js delete mode 100644 Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.styl delete mode 100644 Packages/lesiontracker/client/components/flexboxLayout/flexboxLayout.html delete mode 100644 Packages/lesiontracker/client/components/lesionTable/lesionTable.html delete mode 100644 Packages/lesiontracker/client/components/lesionTableHUD/lesionTableHUD.js delete mode 100644 Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.html delete mode 100644 Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.html delete mode 100644 Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js delete mode 100644 Packages/lesiontracker/client/components/lesionTableView/lesionTableView.html delete mode 100644 Packages/lesiontracker/client/components/lesionTableView/lesionTableView.js delete mode 100644 Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html delete mode 100644 Packages/lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js delete mode 100644 Packages/lesiontracker/client/components/viewer/viewer.js delete mode 100644 Packages/lesiontracker/lib/LesionManager.js delete mode 100644 Packages/lesiontracker/lib/calculateTotalLesionBurden.js delete mode 100644 Packages/lesiontracker/lib/clearMeasurementTimepointData.js delete mode 100644 Packages/lesiontracker/lib/clearTools.js delete mode 100644 Packages/lesiontracker/lib/handleMeasurementAdded.js delete mode 100644 Packages/lesiontracker/lib/handleMeasurementModified.js delete mode 100644 Packages/lesiontracker/lib/handleMeasurementRemoved.js delete mode 100644 Packages/lesiontracker/lib/syncImageMeasurementAndToolData.js delete mode 100644 Packages/lesiontracker/lib/syncMeasurementAndToolData.js delete mode 100644 Packages/lesiontracker/lib/timepointAutoCheck.js delete mode 100644 Packages/lesiontracker/lib/updateRelatedElements.js delete mode 100644 Packages/lesiontracker/lib/worklist/worklistModification.js delete mode 100644 Packages/lesiontracker/package.js delete mode 100644 Packages/lesiontracker/server/methods.js rename Packages/{cornerstone => ohif-cornerstone}/client/cornerstone.js (100%) rename Packages/{cornerstone => ohif-cornerstone}/client/cornerstoneMath.js (100%) rename Packages/{cornerstone => ohif-cornerstone}/client/cornerstoneTools.js (99%) rename Packages/{cornerstone => ohif-cornerstone}/client/cornerstoneWADOImageLoader.js (100%) rename Packages/{cornerstone => ohif-cornerstone}/client/dicomParser.js (100%) rename Packages/{cornerstone => ohif-cornerstone}/client/hammer.js (100%) rename Packages/{cornerstone => ohif-cornerstone}/client/jquery.hammer.js (100%) rename Packages/{cornerstone => ohif-cornerstone}/client/libCharLS.js (100%) rename Packages/{cornerstone => ohif-cornerstone}/client/libopenjpeg.js (100%) rename Packages/{cornerstone => ohif-cornerstone}/package.js (93%) rename Packages/{design => ohif-design}/app.styl (100%) rename Packages/{design => ohif-design}/components/roundedButtonGroup/roundedButtonGroup.html (87%) rename Packages/{design => ohif-design}/components/roundedButtonGroup/roundedButtonGroup.js (100%) rename Packages/{design => ohif-design}/components/roundedButtonGroup/roundedButtonGroup.styl (100%) rename Packages/{design => ohif-design}/package.js (99%) rename Packages/{design => ohif-design}/styles/common/global.styl (100%) rename Packages/{design => ohif-design}/styles/common/keyframes.styl (100%) rename Packages/{design => ohif-design}/styles/common/spacings.styl (100%) rename Packages/{design => ohif-design}/styles/common/webfonts.styl (100%) rename Packages/{design => ohif-design}/styles/components/dialog.styl (100%) rename Packages/{design => ohif-design}/styles/components/radio.styl (100%) rename Packages/{design => ohif-design}/styles/components/select2.styl (100%) rename Packages/{design => ohif-design}/styles/components/selectTree.styl (100%) rename Packages/{design => ohif-design}/styles/components/states.styl (100%) rename Packages/{design => ohif-design}/styles/imports/animations.styl (100%) rename Packages/{design => ohif-design}/styles/imports/mixins.styl (100%) rename Packages/{design => ohif-design}/styles/imports/spacings.styl (100%) rename Packages/{design => ohif-design}/styles/imports/theme-tide.styl (100%) rename Packages/{design => ohif-design}/styles/imports/theme-tigerlilly.styl (100%) rename Packages/{design => ohif-design}/styles/imports/theming.styl (100%) rename Packages/{design => ohif-design}/styles/imports/variables.styl (100%) create mode 100755 Packages/ohif-dicom-services/package.js rename Packages/{dicomweb/server => ohif-dicom-services/server/DICOMWeb}/getAttribute.js (100%) rename Packages/{dicomweb/server => ohif-dicom-services/server/DICOMWeb}/getJSON.js (100%) rename Packages/{dicomweb/server => ohif-dicom-services/server/DICOMWeb}/getModalities.js (100%) rename Packages/{dicomweb/server => ohif-dicom-services/server/DICOMWeb}/getName.js (100%) rename Packages/{dicomweb/server => ohif-dicom-services/server/DICOMWeb}/getNumber.js (100%) rename Packages/{dicomweb/server => ohif-dicom-services/server/DICOMWeb}/getString.js (100%) rename Packages/{dicomweb/server => ohif-dicom-services/server/DICOMWeb}/namespace.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/CSocket.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/Connection.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/DIMSE.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/Data.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/Field.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/Message.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/PDU.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/RWStream.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/constants.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/elements_data.js (100%) rename Packages/{dimseservice/server => ohif-dicom-services/server/DIMSE}/require.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/assets/dots.svg (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/both/collections.js (79%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/both/dicomTagDescriptions.js (99%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/both/hardcodedData.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/both/namespace.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/both/routes.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/both/schema.js (98%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/both/testData.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/collections.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/matchedProtocols/matchedProtocols.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/matchedProtocols/matchedProtocols.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/matchedProtocols/matchedProtocols.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/nextPresentationGroupButton/nextPresentationGroupButton.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/nextPresentationGroupButton/nextPresentationGroupButton.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/previousPresentationGroupButton/previousPresentationGroupButton.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/previousPresentationGroupButton/previousPresentationGroupButton.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/protocolEditor/protocolEditor.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/protocolEditor/protocolEditor.js (99%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/protocolEditor/protocolEditor.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/ruleEntryDialog/ruleEntryDialog.html (97%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/ruleEntryDialog/ruleEntryDialog.js (99%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/ruleEntryDialog/ruleEntryDialog.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/ruleTable/ruleTable.html (90%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/ruleTable/ruleTable.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/ruleTable/ruleTable.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/settingEntryDialog/settingEntryDialog.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/settingEntryDialog/settingEntryDialog.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/settingEntryDialog/settingEntryDialog.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/settingsTable/settingsTable.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/settingsTable/settingsTable.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/settingsTable/settingsTable.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/stageDetails/stageDetails.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/stageDetails/stageDetails.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/stageDetails/stageDetails.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/stageSortable/stageSortable.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/stageSortable/stageSortable.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/stageSortable/stageSortable.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/textEntryDialog/textEntryDialog.html (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/textEntryDialog/textEntryDialog.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/components/textEntryDialog/textEntryDialog.styl (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/helpers/attributes.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/helpers/displayConstraint.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/client/protocolEngine.js (98%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/log.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/package.js (97%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/server/collections.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/server/methods.js (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/testData/GEMS_PARM_01.dcm (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/testData/GEMS_PARM_01.xml (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/testData/NeurosurgeryPlan.dcm (100%) rename Packages/{hangingprotocols => ohif-hanging-protocols}/testData/NeurosurgeryPlan.xml (100%) create mode 100644 Packages/ohif-lesiontracker/both/configuration/bidirectional.js create mode 100644 Packages/ohif-lesiontracker/both/configuration/configuration.js create mode 100644 Packages/ohif-lesiontracker/both/configuration/dataExchange.js create mode 100644 Packages/ohif-lesiontracker/both/configuration/dataValidation.js create mode 100644 Packages/ohif-lesiontracker/both/configuration/ellipse.js create mode 100644 Packages/ohif-lesiontracker/both/configuration/length.js create mode 100644 Packages/ohif-lesiontracker/both/configuration/measurementTools.js create mode 100644 Packages/ohif-lesiontracker/both/configuration/nonTarget.js rename Packages/{lesiontracker => ohif-lesiontracker}/client/collections/LesionLocations.js (72%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/collections/LocationResponses.js (51%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/compatibility/bidirectionalTool.js (98%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/compatibility/deleteLesionKeyboardTool.js (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/compatibility/nonTargetTool.js (100%) rename Packages/{lesiontracker/client/compatibility/crunexTool.js => ohif-lesiontracker/client/compatibility/qualitativeTargetTools.js} (84%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/compatibility/scaleOverlayTool.js (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/measureFlow/measureFlow.html (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/measureFlow/measureFlow.js (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/measureFlow/measureFlow.styl (100%) rename Packages/{lesiontracker/client/components/lesionLocationDialog/lesionLocationDialog.html => ohif-lesiontracker/client/components/measurementLocationDialog/measurementLocationDialog.html} (55%) rename Packages/{lesiontracker/client/components/lesionLocationDialog/lesionLocationDialog.js => ohif-lesiontracker/client/components/measurementLocationDialog/measurementLocationDialog.js} (58%) rename Packages/{lesiontracker/client/components/lesionLocationDialog/lesionLocationDialog.styl => ohif-lesiontracker/client/components/measurementLocationDialog/measurementLocationDialog.styl} (71%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/nonTargetLesionDialog/nonTargetLesionDialog.html (96%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/nonTargetLesionDialog/nonTargetLesionDialog.js (84%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/nonTargetLesionDialog/nonTargetLesionDialog.styl (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/nonTargetResponseDialog/nonTargetResponseDialog.html (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/nonTargetResponseDialog/nonTargetResponseDialog.js (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/nonTargetResponseDialog/nonTargetResponseDialog.styl (100%) rename Packages/{lesiontracker/client/components => ohif-lesiontracker/client/components/optionsModal}/irRCDescription/irRCDescription.html (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/optionsModal/optionsModal.html (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/optionsModal/optionsModal.js (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/components/optionsModal/optionsModal.styl (100%) rename Packages/{lesiontracker/client/components => ohif-lesiontracker/client/components/optionsModal}/recistDescription/recistDescription.html (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/client/tools.js (96%) rename Packages/{lesiontracker/lib/TrialResponseCriteria.js => ohif-lesiontracker/lib/MeasurementValidation.js} (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/lib/TrialCriteriaConstraints.js (97%) rename Packages/{lesiontracker/lib/removeToolDataWithMeasurementId.js => ohif-lesiontracker/lib/clearMeasurementTimepointData.js} (57%) rename Packages/{lesiontracker => ohif-lesiontracker}/lib/convertNonTarget.js (89%) rename Packages/{lesiontracker => ohif-lesiontracker}/lib/convertToNonTarget.js (97%) rename Packages/{lesiontracker => ohif-lesiontracker}/lib/getTimepointName.js (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/lib/getTimepointObject.js (100%) rename Packages/{lesiontracker => ohif-lesiontracker}/lib/pixelSpacingAutorunCheck.js (100%) rename Packages/{lesiontracker/lib/worklist => ohif-lesiontracker/lib/studylist}/openNewTabWithTimepoint.js (82%) create mode 100644 Packages/ohif-lesiontracker/lib/studylist/studylistModification.js create mode 100644 Packages/ohif-lesiontracker/lib/syncMeasurementAndToolData.js rename Packages/{lesiontracker => ohif-lesiontracker}/lib/toggleLesionTrackerTools.js (100%) create mode 100644 Packages/ohif-lesiontracker/log.js create mode 100644 Packages/ohif-lesiontracker/package.js create mode 100644 Packages/ohif-lesiontracker/server/methods.js rename Packages/{lesiontracker => ohif-lesiontracker}/server/publications.js (100%) create mode 100644 Packages/ohif-measurements/both/configuration/measurements.js create mode 100644 Packages/ohif-measurements/both/configuration/timepoints.js create mode 100644 Packages/ohif-measurements/both/schema/measurements.js create mode 100644 Packages/ohif-measurements/both/schema/timepoints.js rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/association}/associationModal/associationModal.html (100%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/association}/associationModal/associationModal.js (72%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/association}/associationModal/associationModal.styl (100%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/association/associationModal}/studyAssociationTable/studyAssociationTable.html (93%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/association/associationModal}/studyAssociationTable/studyAssociationTable.js (94%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/association/associationModal}/studyAssociationTable/studyAssociationTable.styl (100%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/association}/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.html (100%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/association}/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.js (70%) rename Packages/{lesiontracker => ohif-measurements}/client/components/caseProgress/caseProgress.html (89%) rename Packages/{lesiontracker => ohif-measurements}/client/components/caseProgress/caseProgress.js (67%) rename Packages/{lesiontracker => ohif-measurements}/client/components/caseProgress/caseProgress.styl (100%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/caseProgress}/radialProgressBar/radialProgressBar.html (86%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/caseProgress}/radialProgressBar/radialProgressBar.js (100%) rename Packages/{lesiontracker/client/components => ohif-measurements/client/components/caseProgress}/radialProgressBar/radialProgressBar.styl (100%) create mode 100644 Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.html rename Packages/{lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.js => ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.js} (63%) rename Packages/{lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.html => ohif-measurements/client/components/longitudinal/longitudinalStudyListStudy/longitudinalStudyListStudy.html} (90%) create mode 100644 Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListStudy/longitudinalStudyListStudy.js rename Packages/{lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.styl => ohif-measurements/client/components/longitudinal/longitudinalStudyListStudy/longitudinalStudyListStudy.styl} (76%) rename Packages/{lesiontracker/client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.html => ohif-measurements/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.html} (96%) rename Packages/{lesiontracker/client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.js => ohif-measurements/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js} (50%) create mode 100644 Packages/ohif-measurements/client/components/measurementTable/measurementTable.html rename Packages/{lesiontracker/client/components/lesionTable/lesionTable.js => ohif-measurements/client/components/measurementTable/measurementTable.js} (64%) rename Packages/{lesiontracker/client/components/lesionTable/lesionTable.styl => ohif-measurements/client/components/measurementTable/measurementTable.styl} (68%) rename Packages/{lesiontracker/client/components/lesionTableHUD/lesionTableHUD.html => ohif-measurements/client/components/measurementTable/measurementTableHUD/measurementTableHUD.html} (56%) create mode 100644 Packages/ohif-measurements/client/components/measurementTable/measurementTableHUD/measurementTableHUD.js rename Packages/{lesiontracker/client/components/lesionTableHUD/lesionTableHUD.styl => ohif-measurements/client/components/measurementTable/measurementTableHUD/measurementTableHUD.styl} (95%) create mode 100644 Packages/ohif-measurements/client/components/measurementTable/measurementTableHeaderRow/measurementTableHeaderRow.html rename Packages/{lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.js => ohif-measurements/client/components/measurementTable/measurementTableHeaderRow/measurementTableHeaderRow.js} (50%) rename Packages/{lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.styl => ohif-measurements/client/components/measurementTable/measurementTableHeaderRow/measurementTableHeaderRow.styl} (93%) rename Packages/{lesiontracker/client/components/lesionTableRow/lesionTableRow.html => ohif-measurements/client/components/measurementTable/measurementTableRow/measurementTableRow.html} (63%) rename Packages/{lesiontracker/client/components/lesionTableRow/lesionTableRow.js => ohif-measurements/client/components/measurementTable/measurementTableRow/measurementTableRow.js} (89%) rename Packages/{lesiontracker/client/components/lesionTableRow/lesionTableRow.styl => ohif-measurements/client/components/measurementTable/measurementTableRow/measurementTableRow.styl} (99%) create mode 100644 Packages/ohif-measurements/client/components/measurementTable/measurementTableTimepointCell/measurementTableTimepointCell.html rename Packages/{lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.js => ohif-measurements/client/components/measurementTable/measurementTableTimepointCell/measurementTableTimepointCell.js} (54%) rename Packages/{lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.styl => ohif-measurements/client/components/measurementTable/measurementTableTimepointCell/measurementTableTimepointCell.styl} (82%) rename Packages/{lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html => ohif-measurements/client/components/measurementTable/measurementTableTimepointHeader/measurementTableTimepointHeader.html} (67%) create mode 100644 Packages/ohif-measurements/client/components/measurementTable/measurementTableTimepointHeader/measurementTableTimepointHeader.js rename Packages/{lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.styl => ohif-measurements/client/components/measurementTable/measurementTableTimepointHeader/measurementTableTimepointHeader.styl} (92%) create mode 100644 Packages/ohif-measurements/client/components/measurementTable/measurementTableView/measurementTableView.html create mode 100644 Packages/ohif-measurements/client/components/measurementTable/measurementTableView/measurementTableView.js rename Packages/{lesiontracker/client/components/lesionTableView/lesionTableView.styl => ohif-measurements/client/components/measurementTable/measurementTableView/measurementTableView.styl} (88%) create mode 100644 Packages/ohif-measurements/client/helpers/measurements.js create mode 100644 Packages/ohif-measurements/client/helpers/timepoints.js create mode 100644 Packages/ohif-measurements/client/lib/MeasurementHandlers.js create mode 100644 Packages/ohif-measurements/client/lib/MeasurementManager.js rename Packages/{lesiontracker => ohif-measurements/client}/lib/activateLesion.js (100%) rename Packages/{lesiontracker => ohif-measurements/client}/lib/activateMeasurements.js (100%) create mode 100644 Packages/ohif-measurements/client/lib/clearTools.js rename Packages/{lesiontracker => ohif-measurements/client}/lib/deactivateAllToolData.js (100%) create mode 100644 Packages/ohif-measurements/client/lib/getTimepointName.js create mode 100644 Packages/ohif-measurements/client/lib/getTimepointObject.js create mode 100644 Packages/ohif-measurements/client/lib/hangingProtocolCustomizations.js create mode 100644 Packages/ohif-measurements/client/lib/syncMeasurementAndToolData.js create mode 100644 Packages/ohif-measurements/log.js create mode 100644 Packages/ohif-measurements/package.js create mode 100644 Packages/ohif-petsuv/both/configuration/configuration.js create mode 100644 Packages/ohif-petsuv/both/configuration/dataExchange.js create mode 100644 Packages/ohif-petsuv/both/configuration/dataValidation.js create mode 100644 Packages/ohif-petsuv/both/configuration/ellipse.js create mode 100644 Packages/ohif-petsuv/both/configuration/measurementTools.js create mode 100644 Packages/ohif-petsuv/log.js create mode 100644 Packages/ohif-petsuv/package.js create mode 100644 Packages/ohif-petsuv/server/methods.js create mode 100644 Packages/ohif-study-list/both/collections.js rename Packages/{worklist => ohif-study-list}/both/lib/getCurrentServer.js (79%) rename Packages/{worklist/both/schema.js => ohif-study-list/both/schema/servers.js} (96%) rename Packages/{worklist => ohif-study-list}/client/collections/subscriptions.js (100%) rename Packages/{worklist => ohif-study-list}/client/components/progressDialog/progressDialog.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/progressDialog/progressDialog.js (100%) rename Packages/{worklist => ohif-study-list}/client/components/progressDialog/progressDialog.styl (100%) rename Packages/{worklist => ohif-study-list}/client/components/seriesDetailsTable/seriesDetailsTable.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/seriesDetailsTable/seriesDetailsTable.js (100%) rename Packages/{worklist => ohif-study-list}/client/components/seriesDetailsTable/seriesDetailsTable.styl (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.js (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationDimse/serverInformationDimse.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationDimse/serverInformationDimse.js (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationForm/serverInformationForm.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationForm/serverInformationForm.js (91%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationForm/serverInformationFormField.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationList/serverInformationList.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationList/serverInformationList.js (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationModal/serverInformationModal.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationModal/serverInformationModal.js (100%) rename Packages/{worklist => ohif-study-list}/client/components/serverInformation/serverInformationModal/serverInformationModal.styl (100%) rename Packages/{worklist => ohif-study-list}/client/components/studyContextMenu/studyContextMenu.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/studyContextMenu/studyContextMenu.js (84%) rename Packages/{worklist => ohif-study-list}/client/components/studyContextMenu/studyContextMenu.styl (100%) create mode 100644 Packages/ohif-study-list/client/components/studylist.html rename Packages/{worklist/client/components/worklist.js => ohif-study-list/client/components/studylist.js} (60%) rename Packages/{worklist/client/components/worklist.styl => ohif-study-list/client/components/studylist.styl} (94%) rename Packages/{worklist/client/components/worklistPagination/worklistPagination.html => ohif-study-list/client/components/studylistPagination/studylistPagination.html} (93%) rename Packages/{worklist/client/components/worklistPagination/worklistPagination.js => ohif-study-list/client/components/studylistPagination/studylistPagination.js} (88%) rename Packages/{worklist/client/components/worklistPagination/worklistPagination.styl => ohif-study-list/client/components/studylistPagination/studylistPagination.styl} (97%) rename Packages/{worklist/client/components/worklistResult/worklistResult.html => ohif-study-list/client/components/studylistResult/studylistResult.html} (83%) rename Packages/{worklist/client/components/worklistResult/worklistResult.js => ohif-study-list/client/components/studylistResult/studylistResult.js} (88%) rename Packages/{worklist/client/components/worklistResult/worklistResult.styl => ohif-study-list/client/components/studylistResult/studylistResult.styl} (98%) rename Packages/{worklist/client/components/worklistStudy/worklistStudy.html => ohif-study-list/client/components/studylistStudy/studylistStudy.html} (89%) rename Packages/{worklist/client/components/worklistStudy/worklistStudy.js => ohif-study-list/client/components/studylistStudy/studylistStudy.js} (73%) rename Packages/{worklist/client/components/worklistStudy/worklistStudy.styl => ohif-study-list/client/components/studylistStudy/studylistStudy.styl} (51%) rename Packages/{worklist/client/components/worklistToolbar/worklistToolbar.html => ohif-study-list/client/components/studylistToolbar/studylistToolbar.html} (83%) rename Packages/{worklist/client/components/worklistToolbar/worklistToolbar.js => ohif-study-list/client/components/studylistToolbar/studylistToolbar.js} (89%) rename Packages/{worklist/client/components/worklistToolbar/worklistToolbar.styl => ohif-study-list/client/components/studylistToolbar/studylistToolbar.styl} (96%) rename Packages/{worklist => ohif-study-list}/client/components/tabTitle/tabTitle.html (100%) rename Packages/{worklist => ohif-study-list}/client/components/tabTitle/tabTitle.js (86%) rename Packages/{worklist => ohif-study-list}/client/components/tabTitle/tabTitle.styl (100%) rename Packages/{worklist => ohif-study-list}/client/components/viewSeriesDetailsModal/viewSeriesDetailsModal.html (100%) rename Packages/{worklist => ohif-study-list}/client/lib/exportStudies.js (100%) rename Packages/{worklist => ohif-study-list}/client/lib/getStudiesMetadata.js (100%) rename Packages/{worklist => ohif-study-list}/client/lib/getStudyMetadata.js (92%) rename Packages/{worklist => ohif-study-list}/client/lib/importStudies.js (98%) rename Packages/{worklist => ohif-study-list}/client/lib/jquery.twbsPagination/jquery.twbsPagination.min.js (100%) rename Packages/{worklist => ohif-study-list}/client/lib/openNewTab.js (81%) rename Packages/{worklist => ohif-study-list}/client/lib/queryStudies.js (100%) rename Packages/{worklist/client/lib/worklist.js => ohif-study-list/client/lib/studylist.js} (74%) rename Packages/{worklist => ohif-study-list}/client/lib/switchToTab.js (77%) rename Packages/{worklist => ohif-study-list}/log.js (55%) rename Packages/{worklist => ohif-study-list}/package.js (76%) rename Packages/{worklist => ohif-study-list}/server/lib/encodeQueryData.js (100%) rename Packages/{worklist => ohif-study-list}/server/lib/parseFloatArray.js (100%) rename Packages/{worklist => ohif-study-list}/server/lib/remoteGetValue.js (100%) rename Packages/{worklist => ohif-study-list}/server/methods/getStudyMetadata.js (100%) rename Packages/{worklist => ohif-study-list}/server/methods/importStudies.js (99%) rename Packages/{worklist/server/methods/worklistSearch.js => ohif-study-list/server/methods/studylistSearch.js} (87%) rename Packages/{worklist => ohif-study-list}/server/publications.js (100%) rename Packages/{worklist => ohif-study-list}/server/servers.js (95%) rename Packages/{worklist => ohif-study-list}/server/services/dimse/instances.js (97%) rename Packages/{worklist => ohif-study-list}/server/services/dimse/retrieveMetadata.js (100%) rename Packages/{worklist => ohif-study-list}/server/services/dimse/setup.js (100%) rename Packages/{worklist => ohif-study-list}/server/services/dimse/studies.js (97%) rename Packages/{worklist => ohif-study-list}/server/services/namespace.js (100%) rename Packages/{worklist => ohif-study-list}/server/services/qido/instances.js (100%) rename Packages/{worklist => ohif-study-list}/server/services/qido/studies.js (100%) rename Packages/{worklist => ohif-study-list}/server/services/remote/instances.js (100%) rename Packages/{worklist => ohif-study-list}/server/services/remote/retrieveMetadata.js (100%) rename Packages/{worklist => ohif-study-list}/server/services/remote/studies.js (100%) rename Packages/{worklist => ohif-study-list}/server/services/wado/retrieveMetadata.js (100%) rename Packages/{worklist => ohif-study-list}/server/validateServerConfiguration.js (87%) create mode 100644 Packages/ohif-user-management/both/collections.js create mode 100644 Packages/ohif-user-management/both/schema/reviewers.js rename Packages/{lesiontracker/client/components/activeEntry => ohif-user-management/client/active-entry}/activeEntry.js (100%) rename Packages/{lesiontracker/client/components/activeEntry => ohif-user-management/client/active-entry}/activeEntry.styl (100%) rename Packages/{lesiontracker/client/components/activeEntry/activeEntrySignIn => ohif-user-management/client/active-entry}/activeEntrySignIn.js (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/emailVerification/emailVerification.html (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/emailVerification/emailVerification.js (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/emailVerification/emailVerification.styl (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/hipaaLogPage/hipaaLogPage.js (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/hipaaLogPage/hipaaLogPage.styl (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/lastLoginModal/lastLoginModal.html (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/timeoutCountdownDialog/timeoutCountdownDialog.html (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/timeoutCountdownDialog/timeoutCountdownDialog.js (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/timeoutCountdownDialog/timeoutCountdownDialog.styl (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/userAccountMenu/userAccountMenu.html (90%) rename Packages/{lesiontracker => ohif-user-management}/client/components/userAccountMenu/userAccountMenu.js (100%) rename Packages/{lesiontracker => ohif-user-management}/client/components/userAccountMenu/userAccountMenu.styl (100%) rename Packages/{lesiontracker/client/collections => ohif-user-management/client}/subscriptions.js (100%) rename Packages/{lesiontracker => ohif-user-management}/log.js (100%) create mode 100644 Packages/ohif-user-management/package.js rename Packages/{lesiontracker => ohif-user-management}/server/createDemoUser.js (100%) create mode 100644 Packages/ohif-user-management/server/publications.js rename Packages/{lesiontracker => ohif-user-management}/server/reviewers.js (88%) rename Packages/{viewerbase => ohif-viewerbase}/assets/icons.svg (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/collections.js (83%) rename Packages/{viewerbase => ohif-viewerbase}/client/compatibility/dialogPolyfill.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/compatibility/dialogPolyfill.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/compatibility/jquery.hotkeys.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/basic/aboutModal/aboutModal.html (97%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/basic/aboutModal/aboutModal.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/basic/aboutModal/aboutModal.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/basic/layout/layout.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/basic/loadingText/loadingText.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/basic/loadingText/loadingText.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/basic/removableBackdrop/removableBackdrop.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/basic/removableBackdrop/removableBackdrop.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/imageThumbnail/imageThumbnail.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/imageThumbnail/imageThumbnail.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/imageThumbnail/imageThumbnail.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/studyBrowser/studyBrowser.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/studyBrowser/studyBrowser.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/studyBrowser/studyBrowser.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/thumbnailEntry/thumbnailEntry.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/thumbnailEntry/thumbnailEntry.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/studyBrowser/thumbnailEntry/thumbnailEntry.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/annotationDialogs/annotationDialogs.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/annotationDialogs/annotationDialogs.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/annotationDialogs/annotationDialogs.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/cineDialog/cineDialog.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/cineDialog/cineDialog.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/cineDialog/cineDialog.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/confirmDeleteDialog/confirmDeleteDialog.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/confirmDeleteDialog/confirmDeleteDialog.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/confirmDeleteDialog/confirmDeleteDialog.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/displaySetNavigation/displaySetNavigation.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/displaySetNavigation/displaySetNavigation.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/gridLayout/gridLayout.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/gridLayout/gridLayout.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/gridLayout/gridLayout.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/imageControls/imageControls.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/imageControls/imageControls.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/imageControls/imageControls.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/imageViewerViewport/imageViewerViewport.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/imageViewerViewport/imageViewerViewport.js (98%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/imageViewerViewport/imageViewerViewport.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/layoutButton/layoutButton.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/layoutButton/layoutButton.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/layoutChooser/layoutChooser.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/layoutChooser/layoutChooser.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/layoutChooser/layoutChooser.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/loadingIndicator/loadingIndicator.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/loadingIndicator/loadingIndicator.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/loadingIndicator/loadingIndicator.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/playClipButton/playClipButton.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/playClipButton/playClipButton.js (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studySeriesQuickSwitch/studySeriesQuickSwitch.html (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studySeriesQuickSwitch/studySeriesQuickSwitch.js (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studySeriesQuickSwitch/studySeriesQuickSwitch.styl (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepoint.html (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepoint.js (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepoint.styl (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepointBrowser.html (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepointBrowser.js (92%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepointBrowser.styl (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepointStudy.html (100%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepointStudy.js (98%) rename Packages/{lesiontracker/client/components => ohif-viewerbase/client/components/viewer}/studyTimepointBrowser/studyTimepointStudy.styl (97%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/toolbarSectionButton/toolbarSectionButton.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/toolbarSectionButton/toolbarSectionButton.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/toolbarSectionButton/toolbarSectionButton.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/toolbarSectionTools/toolbarSectionTools.html (90%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/toolbarSectionTools/toolbarSectionTools.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/toolbarSectionTools/toolbarSectionTools.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewerMain/viewerMain.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewerMain/viewerMain.js (72%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewerMain/viewerMain.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewportOrientationMarkers/viewportOrientationMarkers.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewportOrientationMarkers/viewportOrientationMarkers.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewportOrientationMarkers/viewportOrientationMarkers.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewportOverlay/viewportOverlay.html (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewportOverlay/viewportOverlay.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/client/components/viewer/viewportOverlay/viewportOverlay.styl (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/WLPresets.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/createStacks.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/debugReactivity.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/displayReferenceLines.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/enableHotkeys.js (97%) rename Packages/{viewerbase => ohif-viewerbase}/lib/enablePrefetchOnElement.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/getImageId.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/getWADORSImageId.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/capitalizeFirstLetter.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/formatDA.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/formatJSDate.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/formatNumberPrecision.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/formatPN.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/formatTM.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/getUsername.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/ifTypeIs.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/inc.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/isDisplaySetActive.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/isTouchDevice.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/jsDateFromNow.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/objectEach.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/objectToPairs.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/prettyPrintStringify.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/sorting.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/helpers/studyThumbnails.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/instanceClassSpecificViewport.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/isImage.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/layoutManager.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/metaDataProvider.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/resizeViewportElements.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/setActiveViewport.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/setFocusToActiveViewport.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/setMammogramViewportAlignment.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/sopClassDictionary.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/sortStudy.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/switchToImageByIndex.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/switchToImageRelative.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/toggleDialog.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/toolManager.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/updateAllViewports.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/lib/viewportFunctions.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/log.js (100%) rename Packages/{viewerbase => ohif-viewerbase}/package.js (89%) rename Packages/{wadoproxy => ohif-wadoproxy}/package.js (90%) rename Packages/{wadoproxy => ohif-wadoproxy}/server/initialize.js (100%) rename Packages/{wadoproxy => ohif-wadoproxy}/server/namespace.js (100%) rename Packages/{wadoproxy => ohif-wadoproxy}/server/routes.js (100%) delete mode 100644 Packages/viewerbase/lib/helpers/inlineIf.js delete mode 100644 Packages/worklist/both/collections.js delete mode 100644 Packages/worklist/client/components/worklist.html diff --git a/LesionTracker/.meteor/packages b/LesionTracker/.meteor/packages index 22db7d1f8..f8627fab8 100644 --- a/LesionTracker/.meteor/packages +++ b/LesionTracker/.meteor/packages @@ -28,17 +28,19 @@ clinical:hipaa-logger aldeed:simple-schema # Third party package to deal with schemas +# OHIF Packages design ohif:core +ohif:cornerstone +ohif:viewerbase +ohif:study-list +ohif:dicom-services +ohif:hanging-protocols +ohif:user-management +ohif:lesiontracker -insecure@1.0.7 # Allow all DB writes from clients (for prototyping) -cornerstone -worklist -viewerbase -dicomweb accounts-base@1.2.14 accounts-password@1.3.1 - ian:accounts-ui-bootstrap-3 twbs:bootstrap http@1.2.10 @@ -49,7 +51,6 @@ fortawesome:fontawesome random@1.0.10 reactive-var@1.0.11 reactive-dict@1.1.8 -lesiontracker practicalmeteor:loglevel momentjs:moment @@ -61,10 +62,10 @@ gilbertwat:bootstrap3-daterangepicker email@1.1.18 peppelg:bootstrap-3-modal simple:reactive-method -hangingprotocols fastclick@1.0.13 standard-minifier-css@1.3.2 standard-minifier-js@1.2.1 johdirr:meteor-git-rev u2622:persistent-session shell-server@0.2.1 +aldeed:collection2 diff --git a/LesionTracker/.meteor/versions b/LesionTracker/.meteor/versions index f95b132b7..9eaf26fcb 100644 --- a/LesionTracker/.meteor/versions +++ b/LesionTracker/.meteor/versions @@ -1,5 +1,9 @@ accounts-base@1.2.14 accounts-password@1.3.1 +aldeed:collection2@2.10.0 +aldeed:collection2-core@1.2.0 +aldeed:schema-deny@1.1.0 +aldeed:schema-index@1.1.1 aldeed:simple-schema@1.5.3 aldeed:template-extension@4.0.0 allow-deny@1.0.5 @@ -9,10 +13,10 @@ anti:i18n@0.4.3 arsnebula:reactive-promise@0.9.1 autoupdate@1.3.12 babel-compiler@6.13.0 -babel-runtime@0.1.12 +babel-runtime@0.1.13 base64@1.0.10 binary-heap@1.0.10 -blaze@2.1.9 +blaze@2.2.0 blaze-html-templates@1.0.5 blaze-tools@1.0.10 boilerplate-generator@1.0.11 @@ -33,7 +37,6 @@ clinical:router-middleware-stack@2.1.2 clinical:router-url@2.1.0 clinical:theming@0.4.10 coffeescript@1.11.1_2 -cornerstone@0.0.1 ddp@1.2.5 ddp-client@1.3.2 ddp-common@1.2.7 @@ -41,9 +44,7 @@ ddp-rate-limiter@1.0.6 ddp-server@1.3.11 deps@1.0.12 design@0.0.1 -dicomweb@0.0.1 diff-sequence@1.0.7 -dimseservice@0.0.1 ecmascript@0.5.9 ecmascript-runtime@0.3.15 ejson@1.0.13 @@ -54,14 +55,12 @@ fortawesome:fontawesome@4.6.3 geojson-utils@1.0.10 gilbertwat:bootstrap3-daterangepicker@1.3.21_1 grove:less@0.2.0 -hangingprotocols@0.0.1 hot-code-push@1.0.4 html-tools@1.0.11 htmljs@1.0.11 http@1.2.10 ian:accounts-ui-bootstrap-3@1.2.89 id-map@1.0.9 -insecure@1.0.7 iron:controller@1.0.12 iron:core@1.0.11 iron:dynamic-template@1.0.12 @@ -69,7 +68,6 @@ iron:layout@1.0.12 johdirr:meteor-git-rev@0.0.4 jquery@1.11.10 launch-screen@1.1.0 -lesiontracker@0.0.1 livedata@1.0.18 localstorage@1.0.12 logging@1.1.16 @@ -93,12 +91,21 @@ npm-bcrypt@0.9.2 npm-mongo@2.2.11_2 observe-sequence@1.0.14 ohif:core@0.0.1 +ohif:cornerstone@0.0.1 +ohif:dicom-services@0.0.1 +ohif:hanging-protocols@0.0.1 +ohif:lesiontracker@0.0.1 +ohif:measurements@0.0.1 +ohif:study-list@0.0.1 +ohif:user-management@0.0.1 +ohif:viewerbase@0.0.1 +ohif:wadoproxy@0.0.1 ordered-dict@1.0.9 -orthanc-remote@0.0.1 peppelg:bootstrap-3-modal@1.0.4 practicalmeteor:chai@2.1.0_1 practicalmeteor:loglevel@1.2.0_2 promise@0.8.8 +raix:eventemitter@0.1.3 random@1.0.10 rate-limit@1.0.6 reactive-dict@1.1.8 @@ -106,7 +113,6 @@ reactive-var@1.0.11 reload@1.1.11 retry@1.0.9 routepolicy@1.0.12 -rwatts:uuid@0.1.0 service-configuration@1.0.11 session@1.1.7 sha@1.0.9 @@ -133,9 +139,6 @@ ui@1.0.12 underscore@1.0.10 url@1.0.11 validatejs@0.0.1 -viewerbase@0.0.1 -wadoproxy@0.0.1 webapp@1.3.12 webapp-hashing@1.0.9 -worklist@0.0.1 zuuk:stale-session@1.0.8 diff --git a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.html b/LesionTracker/client/components/app/app.html similarity index 77% rename from Packages/lesiontracker/client/components/lesionTracker/lesionTracker.html rename to LesionTracker/client/components/app/app.html index b14819565..af15464c0 100644 --- a/Packages/lesiontracker/client/components/lesionTracker/lesionTracker.html +++ b/LesionTracker/client/components/app/app.html @@ -1,11 +1,11 @@ - diff --git a/OHIFViewer/client/components/viewer/viewer.styl b/OHIFViewer/client/components/viewer/viewer.styl index 6847a00d1..761c86b80 100644 --- a/OHIFViewer/client/components/viewer/viewer.styl +++ b/OHIFViewer/client/components/viewer/viewer.styl @@ -1,5 +1,8 @@ @import "{design}/app" +body + background-color: black + #viewer background-color: black height: 100% diff --git a/OHIFViewer/client/routes.js b/OHIFViewer/client/routes.js index aae9215f8..93a6c9824 100644 --- a/OHIFViewer/client/routes.js +++ b/OHIFViewer/client/routes.js @@ -1,16 +1,5 @@ Session.setDefault('ViewerData', {}); -// Re-add any tab data saved in the Session -WorklistTabs.remove({}); -Object.keys(ViewerData).forEach(function(contentId) { - var tabData = ViewerData[contentId]; - var data = { - title: tabData.title, - contentid: tabData.contentid - }; - WorklistTabs.insert(data); -}); - Router.configure({ layoutTemplate: 'layout', loadingTemplate: 'layout' @@ -30,16 +19,6 @@ Router.route('/viewer/:_id', { name: 'viewer', onBeforeAction: function() { var studyInstanceUid = this.params._id; - - // Check if this study is already loaded in a tab - // If it is, stop here so we don't keep adding tabs on hot-code reloads - var tabs = WorklistTabs.find({ - studyInstanceUid: studyInstanceUid - }); - - if (tabs.count()) { - return; - } this.render('ohifViewer', { data: function() { diff --git a/PETSUVMeasurements/.gagarin/.gitignore b/PETSUVMeasurements/.gagarin/.gitignore new file mode 100644 index 000000000..408303742 --- /dev/null +++ b/PETSUVMeasurements/.gagarin/.gitignore @@ -0,0 +1 @@ +local diff --git a/PETSUVMeasurements/.meteor/.finished-upgraders b/PETSUVMeasurements/.meteor/.finished-upgraders new file mode 100644 index 000000000..a541808f2 --- /dev/null +++ b/PETSUVMeasurements/.meteor/.finished-upgraders @@ -0,0 +1,16 @@ +# This file contains information which helps Meteor properly upgrade your +# app when you run 'meteor update'. You should check it into version control +# with your project. + +notices-for-0.9.0 +notices-for-0.9.1 +0.9.4-platform-file +notices-for-facebook-graph-api-2 +1.2.0-standard-minifiers-package +1.2.0-meteor-platform-split +1.2.0-cordova-changes +1.2.0-breaking-changes +1.3.0-split-minifiers-package +1.3.5-remove-old-dev-bundle-link +1.4.0-remove-old-dev-bundle-link +1.4.1-add-shell-server-package diff --git a/PETSUVMeasurements/.meteor/.gitignore b/PETSUVMeasurements/.meteor/.gitignore new file mode 100644 index 000000000..501f92e4b --- /dev/null +++ b/PETSUVMeasurements/.meteor/.gitignore @@ -0,0 +1,2 @@ +dev_bundle +local diff --git a/PETSUVMeasurements/.meteor/.id b/PETSUVMeasurements/.meteor/.id new file mode 100644 index 000000000..f2d5540e8 --- /dev/null +++ b/PETSUVMeasurements/.meteor/.id @@ -0,0 +1,7 @@ +# This file contains a token that is unique to your project. +# Check it into your repository along with the rest of this directory. +# It can be used for purposes such as: +# - ensuring you don't accidentally deploy one app on top of another +# - providing package authors with aggregated statistics + +1q3vtk41m2yk4k1rqj08l diff --git a/PETSUVMeasurements/.meteor/nightwatch.json b/PETSUVMeasurements/.meteor/nightwatch.json new file mode 100644 index 000000000..3ddebe60d --- /dev/null +++ b/PETSUVMeasurements/.meteor/nightwatch.json @@ -0,0 +1,136 @@ +{ + "starrynight": { + "version": "3.7.0" + }, + "nightwatch": { + "version": "0.8.6" + }, + "src_folders": [ + "./tests/nightwatch/walkthroughs" + ], + "output_folder": "./tests/nightwatch/reports", + "custom_commands_path": [ + "./tests/nightwatch/commands", + "./tests/nightwatch/commands/api/meteor", + "./tests/nightwatch/commands/actions", + "./tests/nightwatch/commands/components", + "./tests/nightwatch/commands/methods" + ], + "custom_assertions_path": [ + "./tests/nightwatch/assertions" + ], + "globals_path": "./tests/nightwatch/globals.json", + "selenium": { + "start_process": true, + "server_path": "${npm_config_prefix}/lib/node_modules/starrynight/node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-2.45.0.jar", + "log_path": "tests/nightwatch/logs", + "host": "127.0.0.1", + "port": 4444, + "cli_args": { + "webdriver.chrome.driver": "${npm_config_prefix}/lib/node_modules/starrynight/node_modules/chromedriver/bin/chromedriver" + } + }, + "test_settings": { + "default": { + "launch_url": "http://localhost:5000", + "selenium_host": "127.0.0.1", + "selenium_port": 4444, + "pathname": "/wd/hub", + "silent": true, + "disable_colors": false, + "firefox_profile": false, + "ie_driver": "", + "screenshots": { + "enabled": false, + "path": "./tests/nightwatch/screenshots" + }, + "desiredCapabilities": { + "browserName": "chrome", + "javascriptEnabled": true, + "acceptSslCerts": true, + "loggingPrefs": { + "browser": "ALL" + } + }, + "exclude": "./tests/nightwatch/unittests/*" + }, + "phantomjs": { + "desiredCapabilities": { + "browserName": "phantomjs", + "javascriptEnabled": true, + "databaseEnabled": false, + "locationContextEnabled": false, + "applicationCacheEnabled": false, + "browserConnectionEnabled": false, + "webStorageEnabled": false, + "acceptSslCerts": true, + "rotatable": false, + "nativeEvents": false, + "phantomjs.binary.path": "${npm_config_prefix}/lib/node_modules/starrynight/node_modules/phantomjs/bin/phantomjs" + } + }, + "travis": { + "launch_url": "http://localhost:3000", + "selenium_host": "127.0.0.1", + "selenium_port": 4444, + "pathname": "/wd/hub", + "silent": true, + "disable_colors": false, + "firefox_profile": false, + "screenshots": { + "enabled": false, + "path": "./tests/nightwatch/screenshots" + }, + "desiredCapabilities": { + "browserName": "firefox", + "javascriptEnabled": true, + "databaseEnabled": true, + "locationContextEnabled": true, + "applicationCacheEnabled": true, + "browserConnectionEnabled": true, + "webStorageEnabled": true, + "acceptSslCerts": true, + "rotatable": true, + "nativeEvents": true + } + }, + "travischrome": { + "launch_url": "http://localhost:3000", + "selenium_host": "127.0.0.1", + "selenium_port": 4444, + "pathname": "/wd/hub", + "silent": true, + "disable_colors": false, + "firefox_profile": false, + "screenshots": { + "enabled": false, + "path": "./tests/nightwatch/screenshots" + }, + "desiredCapabilities": { + "browserName": "chrome", + "javascriptEnabled": true, + "databaseEnabled": true, + "locationContextEnabled": true, + "applicationCacheEnabled": true, + "browserConnectionEnabled": true, + "webStorageEnabled": true, + "acceptSslCerts": true, + "rotatable": true, + "nativeEvents": true, + "chromeOptions": { + "args": [ + "--no-sandbox" + ] + } + } + }, + "unittests": { + "selenium": { + "start_process": false, + "start_session": false + }, + "filter": "./tests/nightwatch/unittests/*", + "exclude": "" + } + } +} diff --git a/PETSUVMeasurements/.meteor/packages b/PETSUVMeasurements/.meteor/packages new file mode 100644 index 000000000..ed5c3298e --- /dev/null +++ b/PETSUVMeasurements/.meteor/packages @@ -0,0 +1,74 @@ +# Meteor packages used by this project, one per line. +# Check this file (and the other files in this directory) into your repository. +# +# 'meteor add' and 'meteor remove' will edit this file for you, +# but you can also edit it by hand. + +npm-bcrypt@0.9.1 + +meteor-base@1.0.4 # Packages every Meteor app needs to have +mobile-experience@1.0.4 # Packages for a great mobile UX +mongo@1.1.12 # The database Meteor supports right now +blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views +session@1.1.6 # Client-side reactive dictionary for your app +jquery@1.11.9 # Helpful client-side library +tracker@1.1.0 # Meteor's client-side reactive programming library + +es5-shim@4.6.14 # ECMAScript 5 compatibility for older browsers. +ecmascript@0.5.8 # Enable ECMAScript2015+ syntax in app code + +insecure + +clinical:router +clinical:extended-api +clinical:active-entry +clinical:error-pages +clinical:theming +clinical:fonts +clinical:hipaa-audit-log +clinical:hipaa-logger + +aldeed:simple-schema # Third party package to deal with schemas + +# OHIF Packages +design +ohif:core +ohif:cornerstone +ohif:viewerbase +ohif:study-list +ohif:dicom-services +ohif:hanging-protocols +ohif:user-management +ohif:petsuv + +accounts-base@1.2.11 +accounts-password@1.3.0 + +ian:accounts-ui-bootstrap-3 +twbs:bootstrap +http@1.2.9 +arsnebula:reactive-promise +promise@0.8.4 +stylus@2.513.5 +fortawesome:fontawesome +random@1.0.10 +reactive-var@1.0.10 +reactive-dict@1.1.8 +practicalmeteor:loglevel +momentjs:moment + +anti:gagarin@=0.4.11 +check@1.2.3 +aldeed:template-extension@4.0.0 +zuuk:stale-session +gilbertwat:bootstrap3-daterangepicker +email@1.1.17 +peppelg:bootstrap-3-modal +simple:reactive-method +fastclick@1.0.12 +standard-minifier-css@1.2.0 +standard-minifier-js@1.2.0 +johdirr:meteor-git-rev +u2622:persistent-session +shell-server +aldeed:collection2 \ No newline at end of file diff --git a/PETSUVMeasurements/.meteor/platforms b/PETSUVMeasurements/.meteor/platforms new file mode 100644 index 000000000..efeba1b50 --- /dev/null +++ b/PETSUVMeasurements/.meteor/platforms @@ -0,0 +1,2 @@ +server +browser diff --git a/PETSUVMeasurements/.meteor/release b/PETSUVMeasurements/.meteor/release new file mode 100644 index 000000000..72980bc2f --- /dev/null +++ b/PETSUVMeasurements/.meteor/release @@ -0,0 +1 @@ +METEOR@1.4.1.1 diff --git a/PETSUVMeasurements/.meteor/versions b/PETSUVMeasurements/.meteor/versions new file mode 100644 index 000000000..4f5b263d6 --- /dev/null +++ b/PETSUVMeasurements/.meteor/versions @@ -0,0 +1,143 @@ +accounts-base@1.2.11 +accounts-password@1.3.0 +aldeed:collection2@2.9.1 +aldeed:collection2-core@1.1.1 +aldeed:schema-deny@1.0.1 +aldeed:schema-index@1.0.1 +aldeed:simple-schema@1.5.3 +aldeed:template-extension@4.0.0 +allow-deny@1.0.5 +amplify@1.0.0 +anti:gagarin@0.4.11 +anti:i18n@0.4.3 +arsnebula:reactive-promise@0.9.1 +autoupdate@1.3.11 +babel-compiler@6.9.1 +babel-runtime@0.1.11 +base64@1.0.9 +binary-heap@1.0.9 +blaze@2.1.8 +blaze-html-templates@1.0.4 +blaze-tools@1.0.9 +boilerplate-generator@1.0.9 +caching-compiler@1.1.7 +caching-html-compiler@1.0.6 +callback-hook@1.0.9 +check@1.2.3 +clinical:active-entry@1.5.16 +clinical:auto-resizing@0.2.0 +clinical:error-pages@0.2.0 +clinical:extended-api@2.2.4 +clinical:fonts@1.1.1 +clinical:hipaa-audit-log@2.4.2 +clinical:hipaa-logger@1.0.1 +clinical:router@2.0.19 +clinical:router-location@2.1.0 +clinical:router-middleware-stack@2.1.2 +clinical:router-url@2.1.0 +clinical:theming@0.4.10 +coffeescript@1.2.4_1 +ddp@1.2.5 +ddp-client@1.3.1 +ddp-common@1.2.6 +ddp-rate-limiter@1.0.5 +ddp-server@1.3.10 +deps@1.0.12 +design@0.0.1 +diff-sequence@1.0.6 +ecmascript@0.5.8 +ecmascript-runtime@0.3.14 +ejson@1.0.12 +email@1.1.17 +es5-shim@4.6.14 +fastclick@1.0.12 +fortawesome:fontawesome@4.5.0 +geojson-utils@1.0.9 +gilbertwat:bootstrap3-daterangepicker@1.3.21_1 +grove:less@0.2.0 +hot-code-push@1.0.4 +html-tools@1.0.10 +htmljs@1.0.10 +http@1.2.9 +ian:accounts-ui-bootstrap-3@1.2.89 +id-map@1.0.8 +insecure@1.0.7 +iron:controller@1.0.12 +iron:core@1.0.11 +iron:dynamic-template@1.0.12 +iron:layout@1.0.12 +johdirr:meteor-git-rev@0.0.4 +jquery@1.11.9 +launch-screen@1.0.12 +livedata@1.0.18 +localstorage@1.0.11 +logging@1.1.15 +mdg:validation-error@0.5.1 +meteor@1.2.17 +meteor-base@1.0.4 +meteor-platform@1.2.6 +minifier-css@1.2.14 +minifier-js@1.2.14 +minimongo@1.0.17 +mobile-experience@1.0.4 +mobile-status-bar@1.0.12 +modules@0.7.6 +modules-runtime@0.7.6 +momentjs:moment@2.14.4 +mongo@1.1.12 +mongo-id@1.0.5 +mrt:moment@2.8.1 +natestrauser:select2@4.0.3 +npm-bcrypt@0.9.1 +npm-mongo@1.5.49 +observe-sequence@1.0.12 +ohif:core@0.0.1 +ohif:cornerstone@0.0.1 +ohif:dicom-services@0.0.1 +ohif:hanging-protocols@0.0.1 +ohif:measurements@0.0.1 +ohif:petsuv@0.0.1 +ohif:study-list@0.0.1 +ohif:user-management@0.0.1 +ohif:viewerbase@0.0.1 +ohif:wadoproxy@0.0.1 +ordered-dict@1.0.8 +peppelg:bootstrap-3-modal@1.0.4 +practicalmeteor:chai@2.1.0_1 +practicalmeteor:loglevel@1.2.0_2 +promise@0.8.4 +raix:eventemitter@0.1.3 +random@1.0.10 +rate-limit@1.0.5 +reactive-dict@1.1.8 +reactive-var@1.0.10 +reload@1.1.10 +retry@1.0.8 +routepolicy@1.0.11 +service-configuration@1.0.10 +session@1.1.6 +sha@1.0.8 +shell-server@0.2.1 +silentcicero:jszip@0.0.4 +simple:reactive-method@1.0.2 +spacebars@1.0.12 +spacebars-compiler@1.0.12 +srp@1.0.9 +standard-app-packages@1.0.9 +standard-minifier-css@1.2.0 +standard-minifier-js@1.2.0 +stylus@2.513.5 +templating@1.2.14 +templating-tools@1.0.4 +tracker@1.1.0 +twbs:bootstrap@3.3.6 +typ:accounts-ldap@1.0.1 +typ:ldapjs@0.7.3 +u2622:persistent-session@0.4.4 +ui@1.0.11 +underscore@1.0.9 +url@1.0.10 +validatejs@0.0.1 +webapp@1.3.11 +webapp-hashing@1.0.9 +zuuk:stale-session@1.0.8 diff --git a/PETSUVMeasurements/activeEntry.js b/PETSUVMeasurements/activeEntry.js new file mode 100644 index 000000000..04acdba62 --- /dev/null +++ b/PETSUVMeasurements/activeEntry.js @@ -0,0 +1,46 @@ +if (Meteor.isClient){ + ActiveEntry.configure({ + logo: { + url: '/mini-circles.png', + displayed: true + }, + signIn: { + displayFullName: true, + destination: '/worklist' + }, + signUp: { + destination: '/worklist' + }, + themeColors: { + primary: "" + }, + passwordOptions: { + showPasswordStrengthIndicator: false, + requireRegexValidation: true, + //requireStrongPasswords: false + passwordHistoryCount: 6, + failedAttemptsLimit: 5 + } + + }); +} + +/* +if (Meteor.isServer){ + Accounts.emailTemplates.siteName = 'AwesomeSite'; + Accounts.emailTemplates.from = 'AwesomeSite Admin '; + Accounts.emailTemplates.enrollAccount.subject = function(user) { + return 'Welcome to Awesome Town, ' + user.profile.name; + }; + + Accounts.emailTemplates.enrollAccount.text = function(user, url) { + return 'You have been selected to participate in building a better future!' + + ' To activate your account, simply click the link below:\n\n' + + url; + }; + + Meteor.startup(function() { + //process.env.MAIL_URL = 'smtp://sandboxid.mailgun.org:mypassword@smtp.mailgun.org:587'; + }); +} +*/ diff --git a/PETSUVMeasurements/client/body.styl b/PETSUVMeasurements/client/body.styl new file mode 100644 index 000000000..aaa17e8fb --- /dev/null +++ b/PETSUVMeasurements/client/body.styl @@ -0,0 +1,2 @@ +body + background-color: black \ No newline at end of file diff --git a/PETSUVMeasurements/client/components/app/app.html b/PETSUVMeasurements/client/components/app/app.html new file mode 100644 index 000000000..c76a9b5df --- /dev/null +++ b/PETSUVMeasurements/client/components/app/app.html @@ -0,0 +1,40 @@ + diff --git a/PETSUVMeasurements/client/components/app/app.js b/PETSUVMeasurements/client/components/app/app.js new file mode 100644 index 000000000..d461c83ab --- /dev/null +++ b/PETSUVMeasurements/client/components/app/app.js @@ -0,0 +1,46 @@ +const studylistContentId = 'studylistTab'; +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.app.onCreated(() => { + ViewerData = Session.get('ViewerData') || {}; +}); + +Template.app.events({ + 'click .js-toggle-studyList'() { + const contentId = Session.get('activeContentId'); + + if (contentId !== studylistContentId) { + switchToTab(studylistContentId); + } else { + switchToTab(viewerContentId); + } + } +}); + +Template.app.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 === studylistContentId) { + return 'Back to viewer'; + } else if (contentId === viewerContentId) { + return 'Study list'; + } + }, + + onStudyList() { + return (Session.get('activeContentId') === 'studylistTab'); + } +}); + +Session.set('defaultSignInMessage', 'Tumor tracking in your browser.'); \ No newline at end of file diff --git a/PETSUVMeasurements/client/components/app/app.styl b/PETSUVMeasurements/client/components/app/app.styl new file mode 100644 index 000000000..e336dbceb --- /dev/null +++ b/PETSUVMeasurements/client/components/app/app.styl @@ -0,0 +1,79 @@ +@import "{design}/app" + +$expandedHeight = 160px + +.logoImage + display: inline-block + height: 100% + float: left + +.topBar + height: $topBarHeight + theme('color', '$textPrimaryColor') + theme('background-color', '$primaryBackgroundColor') + transition(all 0.5s ease) + + .brandSection + height: 30px + display: inline-block + text-decoration: none + + .logoImage + margin: 0 8px + width: 30px + + .logoText + display: inline-block + font-family: $logoFontFamily + font-weight: $logoFontWeight + theme('color', '$textPrimaryColor') + line-height: 30px + + .studyListLinkSection + theme('border-left', '%s solid $uiBorderColor' % $uiBorderThickness) + + .btn + theme('color', '$textSecondaryColor') + cursor: pointer + font-size: 13px + font-weight: 500 + line-height: 26px + margin-top: 3px + + &:hover + theme('color', '$hoverColor') + + &:active + theme('color', '$activeColor') + + &.studyList + background-color: rgba(21, 25, 30, 0.7) + height: $expandedHeight + + .brandSection + height: 100% + width: 80% + padding-left: 50px + line-height: $expandedHeight + + .logoImage + width: 50px + margin: 0 20px + + .logoText + font-size: 30px + + .studyListLinkSection + position: absolute + border: none + top: 5px + left: 5px + +#studylistTabs + height: "calc(100% - %s)" % $topBarHeight + + .tab-pane + .viewerContainer + .loadingTextDiv + theme('color', '$textSecondaryColor') + font-size: 30px diff --git a/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.html b/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.html new file mode 100644 index 000000000..5e1e0ef62 --- /dev/null +++ b/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.html @@ -0,0 +1,33 @@ + diff --git a/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.js b/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.js new file mode 100644 index 000000000..d2d48e768 --- /dev/null +++ b/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.js @@ -0,0 +1,143 @@ +import { OHIF } from 'meteor/ohif:core'; + +Template.toolbarSection.helpers({ + // Returns true if the view shall be split in two viewports + splitView() { + // Run this computation every time the viewports are updated + Session.get('LayoutManagerUpdated'); + + // Stops here if layout manager is not defined yet + if (!window.layoutManager) { + return; + } + + return window.layoutManager.viewportData.length > 1; + }, + + leftSidebarToggleButtonData() { + const instance = Template.instance(); + return { + toggleable: true, + key: 'leftSidebar', + value: instance.data.state, + options: [{ + value: 'studies', + svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-studies', + svgWidth: 15, + svgHeight: 13, + bottomLabel: 'Studies' + }] + }; + }, + + rightSidebarToggleButtonData() { + const instance = Template.instance(); + return { + toggleable: true, + key: 'rightSidebar', + value: instance.data.state, + options: [{ + value: 'measurements', + svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-measurements-lesions', + svgWidth: 18, + svgHeight: 10, + bottomLabel: 'Measurements' + }] + }; + }, + + toolbarButtons() { + // Check if the measure tools shall be disabled + const isToolDisabled = false; //!Template.instance().data.timepointApi; + + const buttonData = []; + + buttonData.push({ + id: 'zoom', + title: 'Zoom', + classes: 'imageViewerTool', + svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-tools-zoom' + }); + + buttonData.push({ + id: 'wwwc', + title: 'Levels', + classes: 'imageViewerTool', + svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-tools-levels' + }); + + buttonData.push({ + id: 'pan', + title: 'Pan', + classes: 'imageViewerTool', + svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-tools-pan' + }); + + buttonData.push({ + id: 'ellipticalRoi', + title: 'Ellipse', + classes: 'imageViewerTool', + iconClasses: 'fa fa-circle-o' + }); + + return buttonData; + }, + + extraToolbarButtons() { + // Check if the measure tools shall be disabled + const isToolDisabled = false; //!Template.instance().data.timepointApi.currentTimepointId; + const buttonData = []; + + // TODO: Get real icons for CR / UN / EX + buttonData.push({ + id: 'crTool', + title: 'CR Tool', + classes: 'imageViewerTool toolbarSectionButton', + svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-tools-measure-temp', + disabled: isToolDisabled + }); + + buttonData.push({ + id: 'unTool', + title: 'UN Tool', + classes: 'imageViewerTool toolbarSectionButton', + svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-tools-measure-temp', + disabled: isToolDisabled + }); + + buttonData.push({ + id: 'exTool', + title: 'EX Tool', + classes: 'imageViewerTool toolbarSectionButton', + svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-tools-measure-temp', + disabled: isToolDisabled + }); + + return buttonData; + } +}); + +Template.toolbarSection.events({ + 'click #toggleHUD'() { + const state = Session.get('measurementTableHudOpen'); + Session.set('measurementTableHudOpen', !state); + } +}); + +Template.toolbarSection.onRendered(function() { + // Set disabled/enabled tool buttons that are set in toolManager + const states = toolManager.getToolDefaultStates(); + const disabledToolButtons = states.disabledToolButtons; + const allToolbarButtons = $('#toolbar').find('button'); + if (disabledToolButtons && disabledToolButtons.length > 0) { + for (var i = 0; i < allToolbarButtons.length; i++) { + const toolbarButton = allToolbarButtons[i]; + $(toolbarButton).prop('disabled', false); + + const index = disabledToolButtons.indexOf($(toolbarButton).attr('id')); + if (index !== -1) { + $(toolbarButton).prop('disabled', true); + } + } + } +}); diff --git a/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.styl b/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.styl new file mode 100644 index 000000000..f093294e2 --- /dev/null +++ b/PETSUVMeasurements/client/components/toolbarSection/toolbarSection.styl @@ -0,0 +1,24 @@ +@import "{design}/app" + +.toolbarSection + theme('border-bottom', '%s solid $uiBorderColor' % $uiBorderThickness) + flex: 0 0 auto + height: $toolbarHeight + overflow: hidden + padding-top: 6px + position: relative + transition(height 300ms ease) + width: 100% + + &.expanded + height: $toolbarHeight + $toolbarDrawerHeight + + .toolbarSectionEntry + theme('color', '$defaultColor') + cursor: pointer + display: inline-block + theme('fill', '$defaultColor') + margin-top: 3px + min-width: 30px + theme('stroke', '$defaultColor') + text-align: center diff --git a/Packages/lesiontracker/client/components/viewer/viewer.html b/PETSUVMeasurements/client/components/viewer/viewer.html similarity index 54% rename from Packages/lesiontracker/client/components/viewer/viewer.html rename to PETSUVMeasurements/client/components/viewer/viewer.html index 149266e42..9af9fba3e 100644 --- a/Packages/lesiontracker/client/components/viewer/viewer.html +++ b/PETSUVMeasurements/client/components/viewer/viewer.html @@ -2,15 +2,11 @@ {{#if Template.subscriptionsReady}}
{{>confirmDeleteDialog}} - {{>lesionLocationDialog}} - {{>nonTargetLesionDialog}} - {{>nonTargetResponseDialog}} - {{>lesionTableHUD (clone this)}} - {{! >conformanceCheckFeedback}} + {{>measurementTableHUD (clone this)}}
{{>toolbarSection (clone this)}} - {{>flexboxLayout (clone this)}} + {{>viewerSection (clone this)}}
{{else}} {{>loadingText}} diff --git a/PETSUVMeasurements/client/components/viewer/viewer.js b/PETSUVMeasurements/client/components/viewer/viewer.js new file mode 100644 index 000000000..1cf9fbc01 --- /dev/null +++ b/PETSUVMeasurements/client/components/viewer/viewer.js @@ -0,0 +1,68 @@ +import { OHIF } from 'meteor/ohif:core'; +import { MeasurementsConfiguration } from 'meteor/ohif:measurements/both/configuration/measurements'; +import { MeasurementHandlers } from 'meteor/ohif:measurements/client/lib/MeasurementHandlers'; + +Session.set('MeasurementsReady', false); + +Template.viewer.onCreated(() => { + const MeasurementApi = MeasurementsConfiguration.getMeasurementsApi(); + + OHIF.viewer = OHIF.viewer || {}; + + const instance = Template.instance(); + + instance.data.state = new ReactiveDict(); + instance.data.state.set('leftSidebar', Session.get('leftSidebar')); + instance.data.state.set('rightSidebar', Session.get('rightSidebar')); + + const contentId = instance.data.contentId; + + if (ViewerData[contentId].loadedSeriesData) { + log.info('Reloading previous loadedSeriesData'); + OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData; + + } else { + log.info('Setting default ViewerData'); + OHIF.viewer.loadedSeriesData = {}; + ViewerData[contentId].loadedSeriesData = {}; + Session.set('ViewerData', ViewerData); + } + + Session.set('activeViewport', ViewerData[contentId].activeViewport || false); + + // Update the ViewerStudies collection with the loaded studies + ViewerStudies.remove({}); + + instance.data.studies.forEach(study => { + study.selected = true; + study.displaySets = createStacks(study); + ViewerStudies.insert(study); + }); + + instance.data.measurementApi = new MeasurementApi(); + const measurementsPromise = instance.data.measurementApi.retrieveMeasurements(); + measurementsPromise.then(() => { + Session.set('MeasurementsReady', true); + + instance.data.measurementApi.syncMeasurementsAndToolData(); + }) +}); + +Template.viewer.helpers({ + dataSourcesReady() { + // TODO: Find a better way to do this + return Session.get('MeasurementsReady'); + } +}) + +Template.viewer.events({ + 'CornerstoneToolsMeasurementAdded .imageViewerViewport'(event, instance, eventData) { + MeasurementHandlers.onAdded(event, instance, eventData); + }, + 'CornerstoneToolsMeasurementModified .imageViewerViewport'(event, instance, eventData) { + MeasurementHandlers.onModified(event, instance, eventData); + }, + 'CornerstoneToolsMeasurementRemoved .imageViewerViewport'(event, instance, eventData) { + MeasurementHandlers.onRemoved(event, instance, eventData); + } +}); diff --git a/PETSUVMeasurements/client/components/viewer/viewer.styl b/PETSUVMeasurements/client/components/viewer/viewer.styl new file mode 100644 index 000000000..0e2f65bb1 --- /dev/null +++ b/PETSUVMeasurements/client/components/viewer/viewer.styl @@ -0,0 +1,22 @@ +@import "{design}/app" + +#viewer + background-color: black + height: 100% + width: 100% + +#imageViewerViewports + .viewportContainer + border: none !important + outline: 0 !important // Prevent blue outline in Chrome + + &:hover + &.active + &:hover.active + border: none !important + outline: 0 !important // Prevent blue outline in Chrome + + &:not(:last-child) + .removable + .imageViewerViewport + theme('border-right', '%s solid $uiBorderColor' % $uiBorderThickness) diff --git a/PETSUVMeasurements/client/components/viewerSection/viewerSection.html b/PETSUVMeasurements/client/components/viewerSection/viewerSection.html new file mode 100644 index 000000000..90ae1ae66 --- /dev/null +++ b/PETSUVMeasurements/client/components/viewerSection/viewerSection.html @@ -0,0 +1,13 @@ + diff --git a/PETSUVMeasurements/client/components/viewerSection/viewerSection.js b/PETSUVMeasurements/client/components/viewerSection/viewerSection.js new file mode 100644 index 000000000..c04031890 --- /dev/null +++ b/PETSUVMeasurements/client/components/viewerSection/viewerSection.js @@ -0,0 +1,19 @@ +Template.viewerSection.events({ + 'transitionend .sidebarMenu'(event) { + if (!event.target.classList.contains('sidebarMenu')) { + return; + } + + handleResize(); + } +}); + +Template.viewerSection.helpers({ + leftSidebarOpen() { + return Template.instance().data.state.get('leftSidebar'); + }, + + rightSidebarOpen() { + return Template.instance().data.state.get('rightSidebar'); + } +}); diff --git a/PETSUVMeasurements/client/components/viewerSection/viewerSection.styl b/PETSUVMeasurements/client/components/viewerSection/viewerSection.styl new file mode 100644 index 000000000..7b59a1805 --- /dev/null +++ b/PETSUVMeasurements/client/components/viewerSection/viewerSection.styl @@ -0,0 +1,78 @@ +@import "{design}/app" + +.viewerSection + display: flex + flex: 1 + flex-flow: row nowrap + align-items: stretch + height: calc(100% - 78px); + width: 100% + + .sidebarMenu + height: 100% + // required transformation to make inner fixed elements relative to this one + transform(scale(1)) + transition($sidebarTransition) + + .sidebar-option + height: 100% + position: fixed + transform(translateX(100%)) + transition($sidebarTransition) + width: 100% + + &.active + transform(translateX(0%)) + + .sidebar-left + theme('border-right', '%s solid $uiBorderColor' % $uiBorderThickness) + flex: 1 + margin-left: - $studiesSidebarMenuWidth + max-width: $studiesSidebarMenuWidth + order: 1 + + &.sidebar-open + margin-left: 0 + + .mainContent + flex: 1 + order: 2 + width: 100% + height: 100% + overflow: hidden + transition($sidebarTransition) + + .sidebar-right + flex: 1 + margin-left: -12px + margin-right: - $lesionsSidebarMenuWidth + max-width: $lesionsSidebarMenuWidth + order: 3 + padding-left: 6px + position: relative + + &[data-timepoints="3"] + margin-right: - ($lesionsSidebarMenuWidth + 135.5px) + max-width: $lesionsSidebarMenuWidth + 135.5px + + &[data-timepoints="4"] + margin-right: - ($lesionsSidebarMenuWidth + 270px) + max-width: $lesionsSidebarMenuWidth + 270px + + &:before + theme('background-color', '$uiBorderColor') + content: '' + display: block + height: 100% + left: 5px + position: absolute + top: 0 + width: $uiBorderThickness + + &.sidebar-open + margin-right: 0 + + .studiesListedChanger + theme('border-bottom', '%s solid $uiBorderColor' % $uiBorderThickness) + padding: 20px 10px + text-align: center diff --git a/PETSUVMeasurements/client/head.html b/PETSUVMeasurements/client/head.html new file mode 100644 index 000000000..ef408f13e --- /dev/null +++ b/PETSUVMeasurements/client/head.html @@ -0,0 +1,20 @@ + + + Lesion Tracker + + + + + + + + + + + + + + + + + diff --git a/PETSUVMeasurements/client/lesionTrackerHangingProtocol.js b/PETSUVMeasurements/client/lesionTrackerHangingProtocol.js new file mode 100644 index 000000000..ebf152653 --- /dev/null +++ b/PETSUVMeasurements/client/lesionTrackerHangingProtocol.js @@ -0,0 +1,167 @@ +// Define Baseline protocol +var proto = new HP.Protocol('LT_Baseline'); +proto.locked = true; + +var studyDescription = new HP.ProtocolMatchingRule(); +studyDescription.required = true; +studyDescription.attribute = 'studyDescription'; +studyDescription.constraint = { + contains: { + value: 'CT' + } +}; + +var isBaseline = new HP.ProtocolMatchingRule(); +isBaseline.required = true; +isBaseline.attribute = 'timepointType'; +isBaseline.constraint = { + equals: { + value: 'baseline' + } +}; + +proto.addProtocolMatchingRule(studyDescription); +proto.addProtocolMatchingRule(isBaseline); + +var oneByOne = new HP.ViewportStructure('grid', { + rows: 1, + columns: 1 +}); + +// Stage 1 +var single = new HP.Viewport(); + +var baseline = new HP.StudyMatchingRule(true); +baseline.required = true; +baseline.attribute = 'timepointType'; +baseline.constraint = { + equals: { + value: 'baseline' + } +}; + +var body = new HP.SeriesMatchingRule(); +body.attribute = 'seriesDescription'; +body.weight = 5; +body.constraint = { + contains: { + value: 'Body' + } +}; + +var chest = new HP.SeriesMatchingRule(); +chest.attribute = 'seriesDescription'; +chest.constraint = { + contains: { + value: 'CHEST' + } +}; + +single.studyMatchingRules.push(baseline); +single.seriesMatchingRules.push(body); +single.seriesMatchingRules.push(chest); + +var first = new HP.Stage(oneByOne, 'oneByOne'); +first.viewports.push(single); + +proto.addStage(first); + +HP.lesionTrackerBaselineProtocol = proto; +HP.lesionTrackerBaselineProtocol.id = 'lesionTrackerBaselineProtocol'; + + +// Define Followup Protocol +var proto = new HP.Protocol('LT_BaselineFollowup'); +proto.locked = true; + +var studyDescription = new HP.ProtocolMatchingRule(); +studyDescription.required = true; +studyDescription.attribute = 'studyDescription'; +studyDescription.constraint = { + contains: { + value: 'CT' + } +}; + +var isFollowup = new HP.ProtocolMatchingRule(); +isFollowup.required = true; +isFollowup.attribute = 'timepointType'; +isFollowup.constraint = { + equals: { + value: 'followup' + } +}; + +proto.addProtocolMatchingRule(studyDescription); +proto.addProtocolMatchingRule(isFollowup); + +var oneByTwo = new HP.ViewportStructure('grid', { + rows: 1, + columns: 2 +}); + +// Stage 1 +var left = new HP.Viewport(); +var right = new HP.Viewport(); + +var baseline = new HP.StudyMatchingRule(true); +baseline.required = true; +baseline.attribute = 'timepointType'; +baseline.constraint = { + equals: { + value: 'baseline' + } +}; + +var followup = new HP.StudyMatchingRule(); +followup.required = true; +followup.attribute = 'timepointType'; +followup.constraint = { + equals: { + value: 'followup' + } +}; + +var body = new HP.SeriesMatchingRule(); +body.attribute = 'seriesDescription'; +body.weight = 5; +body.constraint = { + contains: { + value: 'Body' + } +}; + +var chest = new HP.SeriesMatchingRule(); +chest.attribute = 'seriesDescription'; +chest.constraint = { + contains: { + value: 'CHEST' + } +}; + +left.studyMatchingRules.push(baseline); +//left.seriesMatchingRules.push(body); +//left.seriesMatchingRules.push(chest); + +right.studyMatchingRules.push(followup); +//right.seriesMatchingRules.push(body); +//right.seriesMatchingRules.push(chest); + +var first = new HP.Stage(oneByTwo, 'oneByTwo'); +first.viewports.push(left); +first.viewports.push(right); + +proto.addStage(first); + +HP.lesionTrackerFollowupProtocol = proto; +HP.lesionTrackerFollowupProtocol.id = 'lesionTrackerFollowupProtocol'; + +Meteor.call('removeHangingProtocolByID', HP.lesionTrackerBaselineProtocol.id, function() { + HangingProtocols.insert(HP.lesionTrackerBaselineProtocol); +}); + +Meteor.call('removeHangingProtocolByID', HP.lesionTrackerFollowupProtocol.id, function() { + HangingProtocols.insert(HP.lesionTrackerFollowupProtocol); +}); + +HangingProtocols.insert(HP.defaultProtocol); \ No newline at end of file diff --git a/PETSUVMeasurements/client/log.js b/PETSUVMeasurements/client/log.js new file mode 100644 index 000000000..037c63622 --- /dev/null +++ b/PETSUVMeasurements/client/log.js @@ -0,0 +1,3 @@ +// Create application logger using loglevel +// https://atmospherejs.com/spacejamio/loglevel +log = loglevel.createAppLogger('PETSUVMeasurements', defaultLevel = 'info'); diff --git a/PETSUVMeasurements/client/routes.js b/PETSUVMeasurements/client/routes.js new file mode 100644 index 000000000..c2eafc5f9 --- /dev/null +++ b/PETSUVMeasurements/client/routes.js @@ -0,0 +1,55 @@ +Session.setDefault('ViewerData', {}); + +// verifyEmail controls whether emailVerification template will be rendered or not +var verifyEmail = Meteor.settings && Meteor.settings.public && Meteor.settings.public.verifyEmail || false; + +Router.configure({ + layoutTemplate: 'layout', + loadingTemplate: 'layout' +}); + +Router.onBeforeAction('loading'); + +var data = { + additionalTemplates: [] +}; + +var routerOptions = { + data: data +}; + +Router.route('/', function() { + // Check user is logged in + if (Meteor.user() && Meteor.userId()) { + if (verifyEmail && Meteor.user().emails && !Meteor.user().emails[0].verified) { + this.render('emailVerification', routerOptions); + } else { + Session.set('activeContentId', 'studylistTab'); + this.render('app', routerOptions); + } + + } else { + this.render('entrySignIn', routerOptions); + } +}); + +Router.route('/viewer/timepoints/:_id', { + layoutTemplate: 'layout', + name: 'viewer', + onBeforeAction: function() { + var timepointId = this.params._id; + + this.render('app', routerOptions); + openNewTabWithTimepoint(timepointId); + } +}); + +Router.onBeforeAction(function() { + if (!Meteor.userId() && !Meteor.loggingIn()) { + this.render('entrySignIn'); + } else { + this.next(); + } +}, { + except: ['entrySignIn', 'entrySignUp', 'forgotPassword', 'resetPassword'] +}); diff --git a/PETSUVMeasurements/public/images/logo.png b/PETSUVMeasurements/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fc83b135454a7d4a47fb3c29735eaefe3c7e1d34 GIT binary patch literal 15344 zcmeI3du$s;9>+In8$v>PmREVmxYw$vwRhLgc+YWhW9LQOgw!c1{6RLmlVmUU?q+wB zI025dAfTlvz^T3DCju4&Tx&n|+CjTb z5^L=@dt*#Ytpj~hh4yeaRR6w@_T^ZB_0OiYyO+h!JLvTqML}y_X9RjjZ)Jha`KI)*But19f z4H6&;Q*=myExH!9Pcam|PbmQ~*Ig2$A@!7CVfK_v11YIQn%R?1vuY~6)j?RuT%87Z zL($@jk_e^CwJke)TV0)PWsDaj*<8)_LAp?%ubR9Si0}po!K(H;SjNG+<1U6{eVm6~ z#lZ4r5Rx<1=h*qq#{eT<`a#Sp3l70{CuE!Fx@SdT4^+jb4F70&N&SEr4|%5MBl1O z@J{Cw2rF|3{~ydnERab+H#khAq{G8Af{bsj+q_xVgMqoN*^Y#CmK&4X9(bQ|ykOqh zA)SYt8>Fo}F58x$R64^PC@mwB_8K(%wQJFZTj5L}#&O8wyi`w7G8yY3{bATj%a(wgTtxeoz#+9z{#?Mo3EX zy?|Eb-XNWC%#Rt&{TJZsl!T(e>kNe4LAqEol4aiiW^qGKyj2lwke=68sP8n7eqzwl z`&|tD(5(48lZtj1rfxiQD%xF`n$PTzB_rg@j8@Q$WSRe@(lFM;2Qv`zdA)9LkS=U4 z%xIHRAki6-;BBg#XT%5BW#trh6iwV%DiP_(B&JINd4#emCEW@i(BQKnoqIT(TSU2o z`8x;s75&b}s2v#urGbqJE-WHcKyaZnura}fMT80nE|dl~Cb+POPyxY((!j<97ZwpJ zAh=K(*qGqLB0>cO7fJ&g6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL2`(%m zR6uZ{G_Wzjg++u42riTcHYT{Rh)@B+h0?&r1Q!+&Dj>K}8rYcN!XiQi1Q$vJ8xveu zM5ut^LTO-Qf(wfX6%bq~4QxzsVG*GMf(xaAjR`I+B2++dp){~D!G%SH3J5Ng1~w+R zu!v9r!G+Sm#%IJ;m4Dq5$nYJ@VfZp-;EmP0;ER|xp|L$iQKQQ#YV2-``tdaU{+6N! z8HzgD1z+!+ps350M{awoo}$V=Zid|<`D~vpCUv*Dx#iY2R>bukY6+^uf zcZFuvV}Vb=wi9cfd-SdqW!0UB%KyFcxYt(R^2DnhM}(?W=iRbp8#{B0_(p%t ziGhzR#Ro4;18-(2}p!xr!JpZ;@y+xa!K$KI)5G!+|Z z9dGVh?yzhxn;KiRy2}dX<~?s88EJid?~$EL9{RQac>C3hRt;1?+5UB4>(5Pp{r-ig zc5kQ~eSNy(&b^D5TzqPF?Cr5@hYxK@PQ7'; + + process.env.MAIL_URL = 'smtp://' + + encodeURIComponent(username) + ':' + + encodeURIComponent(password) + '@' + + encodeURIComponent(server) + ':' + port; + + // Subject line of the email. + Accounts.emailTemplates.verifyEmail.subject = function(user) { + return 'Confirm Your Email Address for '+siteName; + }; + + // Email text + Accounts.emailTemplates.verifyEmail.text = function(user, url) { + return 'Thank you for registering. Please click on the following link to verify your email address: \r\n' + url; + }; + + // Reset password mail + Accounts.emailTemplates.resetPassword.subject = function() { + return 'Reset your '+siteName+' password' + }; + + Accounts.urls.resetPassword = function(token) { + return Meteor.absoluteUrl('resetPassword/' + token); + }; + + Accounts.emailTemplates.resetPassword.text = function(user, url) { + return "Hello " + user.profile.fullName + ",\n\n" + + "Click the following link to set your new password:\n" + + url + "\n\n"; + }; + + // Send email when account is created + Accounts.config({ + sendVerificationEmail: verifyEmail + }); + } +}); \ No newline at end of file diff --git a/Packages/dicomweb/package.js b/Packages/dicomweb/package.js deleted file mode 100644 index 9c899d670..000000000 --- a/Packages/dicomweb/package.js +++ /dev/null @@ -1,21 +0,0 @@ -Package.describe({ - name: 'dicomweb', - summary: 'DICOM Web Helper Functions', - version: '0.0.1' -}); - -Package.onUse(function(api) { - api.use('http'); - - // DICOMWeb API functions - api.addFiles('server/namespace.js', 'server'); - api.addFiles('server/getAttribute.js', 'server'); - api.addFiles('server/getJSON.js', 'server'); - api.addFiles('server/getName.js', 'server'); - api.addFiles('server/getNumber.js', 'server'); - api.addFiles('server/getString.js', 'server'); - api.addFiles('server/getModalities.js', 'server'); - - api.export('DICOMWeb', ['client', 'server']); -}); - diff --git a/Packages/dimseservice/package.js b/Packages/dimseservice/package.js deleted file mode 100755 index 01bcbf017..000000000 --- a/Packages/dimseservice/package.js +++ /dev/null @@ -1,24 +0,0 @@ -Package.describe({ - name: 'dimseservice', - summary: 'DICOM DIMSE C-Service', - version: '0.0.1' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.4'); - - api.use('ecmascript'); - api.addFiles('server/require.js', 'server'); - api.addFiles('server/constants.js', 'server'); - api.addFiles('server/elements_data.js', 'server'); - api.addFiles('server/Field.js', 'server'); - api.addFiles('server/RWStream.js', 'server'); - api.addFiles('server/Data.js', 'server'); - api.addFiles('server/Message.js', 'server'); - api.addFiles('server/PDU.js', 'server'); - api.addFiles('server/CSocket.js', 'server'); - api.addFiles('server/Connection.js', 'server'); - api.addFiles('server/DIMSE.js', 'server'); - - api.export('DIMSE', 'server'); -}); diff --git a/Packages/lesiontracker/both/collections.js b/Packages/lesiontracker/both/collections.js deleted file mode 100644 index c37da9dc0..000000000 --- a/Packages/lesiontracker/both/collections.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -Timepoints = new Mongo.Collection('timepoints'); -Studies = new Mongo.Collection('studies'); -Measurements = new Mongo.Collection('measurements'); - -// ImageMeasurements describe temporary measurements that aren't -// specifically listed in the Lesion Table -ImageMeasurements = new Mongo.Collection('imageMeasurements'); - -// Additional Findings stores details from the Additional Findings -// panel, and represents items such as data quality, -AdditionalFindings = new Mongo.Collection('additionalFindings'); - -WorklistSubscriptions = ['studies', 'timepoints']; -Reviewers = new Mongo.Collection('reviewers'); diff --git a/Packages/lesiontracker/both/schema/additionalFindings.js b/Packages/lesiontracker/both/schema/additionalFindings.js deleted file mode 100644 index 8cf64c99b..000000000 --- a/Packages/lesiontracker/both/schema/additionalFindings.js +++ /dev/null @@ -1,54 +0,0 @@ -import { SimpleSchema } from 'meteor/aldeed:simple-schema'; - -export const schema = new SimpleSchema({ - measurableDisease: { - type: String, - label: 'Measurable disease', - allowedValues: ['Present', 'Absent'], - defaultValue: 'Absent', - optional: true - }, - // TODO: Add check so that the value cannot be None & something other region - regionsOfMetastaticDisease: { - type: [String], - label: 'Regions of metastatic disease', - allowedValues: ['None', 'Lymph Node'], - defaultValue: ['None'], - optional: true - }, - tracerRelatedToMetastaticDisease: { - type: String, - label: 'Tracer related to metastatic disease?', - allowedValues: ['Yes', 'No'], - defaultValue: 'Yes', - optional: true - }, - numberOfBoneLesions: { - type: String, - label: 'Number of bone lesions', - allowedValues: ['0', '1-2', '2-4', '>5'], - defaultValue: '0', - optional: true - }, - acceptableImageQuality: { - type: String, - label: 'Acceptable image quality', - allowedValues: ['Yes', 'No'], - defaultValue: 'Yes', - optional: true - }, - adequateAnatomicalCoverage: { - type: String, - label: 'Adequate anatomical coverage', - allowedValues: ['Yes', 'No'], - defaultValue: 'Yes', - optional: true - }, - presenceOfContrast: { - type: String, - label: 'Presence of contrast', - allowedValues: ['Yes', 'No'], - defaultValue: 'Yes', - optional: true - } -}); diff --git a/Packages/lesiontracker/client/api/measurement.js b/Packages/lesiontracker/client/api/measurement.js deleted file mode 100644 index f0e4336d9..000000000 --- a/Packages/lesiontracker/client/api/measurement.js +++ /dev/null @@ -1,102 +0,0 @@ -const hasValueAtTimepoint = timepointId => { - return measurement => { - if (measurement.timepoints[timepointId]) { - return true; - } - }; -}; - -const hasNoValueAtTimepoint = timepointId => { - return measurement => { - if (measurement.timepoints[timepointId] === undefined) { - return true; - } - }; -}; - -export const MeasurementApi = { - sortOptions: { - sort: { - lesionNumberAbsolute: 1 - } - }, - - // Return all Measurements - all(withPriors=false) { - let data = Measurements.find({}, this.sortOptions).fetch(); - - // If we don't have a prior for this Timepoint, - // this filter, we should just return all of the - // available Non-Targets measurements - if (this.priorTimepointId && withPriors === true) { - return data.filter(hasValueAtTimepoint(this.priorTimepointId)) - } - - return data; - }, - - unmarked() { - const withPriors = true; - return this.all(withPriors).filter(hasNoValueAtTimepoint(this.currentTimepointId));; - }, - - unmarkedTargets() { - const withPriors = true; - return this.targets(withPriors).filter(hasNoValueAtTimepoint(this.currentTimepointId));; - }, - - unmarkedNonTargets() { - const withPriors = true; - return this.nonTargets(withPriors).filter(hasNoValueAtTimepoint(this.currentTimepointId));; - }, - - // Return only Target Measurements - targets(withPriors=false) { - let data = Measurements.find({ - isTarget: true - }, this.sortOptions).fetch(); - - // If we don't have a prior for this Timepoint, - // this filter, we should just return all of the - // available Non-Targets measurements - if (this.priorTimepointId && withPriors === true) { - return data.filter(hasValueAtTimepoint(this.priorTimepointId)) - } - - return data; - }, - - // Return only Non-Target Measurements - nonTargets(withPriors=false) { - let data = Measurements.find({ - isTarget: false - }, this.sortOptions).fetch(); - - // If we don't have a prior for this Timepoint, - // this filter, we should just return all of the - // available Non-Targets measurements - if (this.priorTimepointId && withPriors === true) { - return data.filter(hasValueAtTimepoint(this.priorTimepointId)) - } - - return data; - }, - - // Return only New Lesions - newLesions() { - // If we are current editing a Baseline we won't have any priors, so newLesions - // should return an empty array. - if (!this.priorTimepointId) { - return []; - } - - // Find only lesions that have no value at the previous timepoint - return this.all().filter(hasNoValueAtTimepoint(this.priorTimepointId)); - }, - - firstLesion() { - return Measurements.findOne({ - target: true - }, this.sortOptions); - } -}; diff --git a/Packages/lesiontracker/client/api/timepoint.js b/Packages/lesiontracker/client/api/timepoint.js deleted file mode 100644 index ac4bd84b5..000000000 --- a/Packages/lesiontracker/client/api/timepoint.js +++ /dev/null @@ -1,130 +0,0 @@ -class TimepointApi { - - constructor() { - // Run this computation every time the timepoints are changed - Tracker.autorun(() => { - // Get all the timepoints and store it - this.timepoints = new Mongo.Collection(null); - const timepoints = Timepoints.find({}, { - sort: { - latestDate: -1 - } - }).fetch(); - _.each(timepoints, timepoint => this.timepoints.insert(timepoint)); - }); - } - - // Return all timepoints - all() { - return this.timepoints.find().fetch(); - } - - // Return only the current timepoint - current() { - return this.timepoints.findOne({ - timepointId: this.currentTimepointId - }); - } - - // Return the prior timepoint - prior() { - const current = this.current(); - if (!current) { - return; - } - - const latestDate = current.latestDate; - return this.timepoints.findOne({ - latestDate: { - $lt: latestDate - } - }, { - sort: { - latestDate: -1 - }, - }); - } - - // Return only the current and prior Timepoints - currentAndPrior() { - const timepoints = []; - - const current = this.current(); - if (current) { - timepoints.push(current); - } - - const prior = this.prior(); - if (current && prior && prior._id !== current._id) { - timepoints.push(prior); - } - - return timepoints; - } - - // Return only the baseline timepoint - baseline() { - return this.timepoints.findOne({ - timepointType: 'baseline' - }); - } - - // Return only the key timepoints (current, prior, nadir and baseline) - key() { - // Create a new Mini Mongo Collection to store the result - const result = new Mongo.Collection(null); - - // Get all the timepoints - const all = this.all(); - - // Iterate over each timepoint and insert the key ones in the result - _.each(all, (timepoint, index) => { - if (index < 2 || index === (all.length - 1)) { - result.insert(timepoint); - } - }); - - // Return the resulting timepoints - return result.find().fetch(); - } - - // Return only the timepoints for the given study - study(studyInstanceUid) { - // Create a new Mini Mongo Collection to store the result - const result = new Mongo.Collection(null); - - // Iterate over each timepoint and insert the key ones in the result - _.each(this.all(), (timepoint, index) => { - if (_.contains(timepoint.studyInstanceUids, studyInstanceUid)) { - result.insert(timepoint); - } - }); - - // Return the resulting timepoints - return result.find().fetch(); - } - - // Build the timepoint title based on its date - title(timepoint) { - const timepointName = getTimepointName(timepoint); - - const all = this.all(); - let index = -1; - _.each(all, (currentTimepoint, currentIndex) => { - if (currentTimepoint.timepointId === timepoint.timepointId) { - index = currentIndex; - } - }); - - const states = { - 0: '(Current)', - 1: '(Prior)' - }; - // TODO: [design] find out how to define the nadir timepoint - const parenthesis = states[index] || ''; - return `${timepointName} ${parenthesis}`; - } - -} - -export { TimepointApi }; diff --git a/Packages/lesiontracker/client/compatibility/crTool.js b/Packages/lesiontracker/client/compatibility/crTool.js deleted file mode 100644 index 24d3bb28b..000000000 --- a/Packages/lesiontracker/client/compatibility/crTool.js +++ /dev/null @@ -1,10 +0,0 @@ -(function($, cornerstone, cornerstoneMath, cornerstoneTools) { - - 'use strict'; - - var crToolInterface = cornerstoneTools.crunexTool('crTool'); - cornerstoneTools.crTool = crToolInterface.crunex; - cornerstoneTools.crTool.setConfiguration(crToolInterface.defaultConfiguration); - cornerstoneTools.crToolTouch = crToolInterface.crunexTouch; - -})($, cornerstone, cornerstoneMath, cornerstoneTools); diff --git a/Packages/lesiontracker/client/compatibility/exTool.js b/Packages/lesiontracker/client/compatibility/exTool.js deleted file mode 100644 index 1100424ae..000000000 --- a/Packages/lesiontracker/client/compatibility/exTool.js +++ /dev/null @@ -1,9 +0,0 @@ -(function($, cornerstone, cornerstoneMath, cornerstoneTools) { - - 'use strict'; - var exToolInterface = cornerstoneTools.crunexTool('exTool'); - cornerstoneTools.exTool = exToolInterface.crunex; - cornerstoneTools.exTool.setConfiguration(exToolInterface.defaultConfiguration); - cornerstoneTools.exToolTouch = exToolInterface.crunexTouch; - -})($, cornerstone, cornerstoneMath, cornerstoneTools); diff --git a/Packages/lesiontracker/client/compatibility/unTool.js b/Packages/lesiontracker/client/compatibility/unTool.js deleted file mode 100644 index 94e315a1a..000000000 --- a/Packages/lesiontracker/client/compatibility/unTool.js +++ /dev/null @@ -1,9 +0,0 @@ -(function($, cornerstone, cornerstoneMath, cornerstoneTools) { - - 'use strict'; - var unToolInterface = cornerstoneTools.crunexTool('unTool'); - cornerstoneTools.unTool = unToolInterface.crunex; - cornerstoneTools.unTool.setConfiguration(unToolInterface.defaultConfiguration); - cornerstoneTools.unToolTouch = unToolInterface.crunexTouch; - -})($, cornerstone, cornerstoneMath, cornerstoneTools); diff --git a/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.html b/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.html deleted file mode 100644 index dcd49b839..000000000 --- a/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.html +++ /dev/null @@ -1,55 +0,0 @@ - diff --git a/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.js b/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.js deleted file mode 100644 index 4c4ba259e..000000000 --- a/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.js +++ /dev/null @@ -1,59 +0,0 @@ -import { Template } from 'meteor/templating'; -import { ReactiveDict } from 'meteor/reactive-dict'; -import { schema as AdditionalFindingsSchema } from 'meteor/lesiontracker/both/schema/additionalFindings'; - -Template.additionalFindings.onCreated(() => { - const instance = Template.instance(); - - instance.currentSchema = AdditionalFindingsSchema; -}); - -Template.additionalFindings.onRendered(() => { - const instance = Template.instance(); - - // Get the form component - const form = instance.$('form:first').data('component'); - - const currentTimepointId = instance.data.currentTimepointId; - if (!currentTimepointId) { - console.warn('Case has no timepointId'); - return; - } - - const additionalFindings = AdditionalFindings.findOne({ - timepointId: currentTimepointId - }); - - if (additionalFindings) { - instance.id = additionalFindings._id; - form.value(additionalFindings); - } else { - const defaultData = instance.currentSchema.clean({}); - form.value(defaultData); - - // Include patientId and timepointId - defaultData.patientId = Session.get('patientId'); - defaultData.timepointId = currentTimepointId; - - // TODO: [design] Turn this into a Meteor Call to insert it on the server - instance.id = AdditionalFindings.insert(defaultData); - } - - instance.autorun(computation => { - // Run this computation everytime the form data is changed - form.depend(); - - // Stop here if it's the computation's first run - if (computation.firstRun) { - return; - } - - // Get the form data for AdditionalFindings - let formData = form.value(); - - // TODO: [design] Turn this into a Meteor Call to update it on the server - AdditionalFindings.update(instance.id, { - $set: formData - }); - }); -}); diff --git a/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.styl b/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.styl deleted file mode 100644 index bf6a4e8a1..000000000 --- a/Packages/lesiontracker/client/components/additionalFindings/additionalFindings.styl +++ /dev/null @@ -1,112 +0,0 @@ -@import "{design}/app" - -.additionalFindings - width: 100% - height: 100% - background-color: #000000 - - .scrollArea - height: 100% - overflow-x: hidden - overflow-y: auto - margin-right: -16px - padding-right: 16px - - -webkit-overflow-scrolling: touch - - .row - margin-right: 0 - margin-left: 0 - - &::-webkit-scrollbar - display: none - - .header - theme('background-color', '$uiGray') - theme('color', '$textPrimaryColor') - height: 33px - line-height: 33px - font-weight: bold - font-size: 14px - padding: 1px 13px 0 - - .form-group - theme('color', '$textPrimaryColor') - margin-bottom: 0 - padding: 7px 27px 7px 11px - width: 100% - - &:not(:last-child) - theme('border-bottom', '%s solid $uiBorderColorDark' % $uiBorderThickness) - - & > .wrapperText - display: block - font-weight: bold - line-height: 15px - margin: 10px 2px 8px - - .control-label - font-size: 14px - font-weight: 100 - display: inline-block - padding: 5px - - .select2 - margin-bottom: 8px - margin-left: 3px - margin-top: 5px - - .group-radio - height: 30px - margin-bottom: 15px - - label - display: inline-block - float: left - font-size: 14px - font-weight: 100 - height: 30px - line-height: 30px - width: 109px - - .disease-regions + .select2 - width: 100% !important - - .bone-lesions + .select2 - width: auto !important - - .buttonSection - cursor: pointer - height: 90px - theme('color', '$defaultColor') - - &:hover - theme('color', '$hoverColor') - - .svgContainer - svg - theme('fill', '$hoverColor') - - &:active - theme('color', '$activeColor') - - .svgContainer - svg - theme('fill', '$activeColor') - - div - float: left - display: inline-block - height: 92px - - .buttonLabel - line-height: 92px - padding: 0 12px - - .svgContainer - padding: 25px 14px - - svg - width: 36px - height: 36px - theme('fill', '$textPrimaryColor') diff --git a/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.html b/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.html deleted file mode 100644 index 74a152193..000000000 --- a/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.js b/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.js deleted file mode 100644 index f55229704..000000000 --- a/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.js +++ /dev/null @@ -1,32 +0,0 @@ -Template.conformanceCheckFeedback.helpers({ - validationErrors: function() { - // Return validation errors sorted by last added Target - var errors = ValidationErrors.find({}, { - sort: { - prefix: -1, - type: 1 - } - }); - - Template.instance().validationErrors.set(errors.fetch()); - return errors; - } -}); - -Template.conformanceCheckFeedback.events({ - 'mouseenter #conformanceCheckFeedback': function(e, template) { - if (template.validationErrors.get().length > 0) { - $(e.currentTarget).addClass("conformanceHover"); - } - }, - 'mouseleave #conformanceCheckFeedback': function(e, template) { - var conformanceDiv = e.currentTarget; - if ($(conformanceDiv).hasClass("conformanceHover")) { - $(conformanceDiv).removeClass("conformanceHover"); - } - } -}); - -Template.conformanceCheckFeedback.onCreated(function() { - this.validationErrors = new ReactiveVar([]); -}); \ No newline at end of file diff --git a/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.styl b/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.styl deleted file mode 100644 index fe6f86d16..000000000 --- a/Packages/lesiontracker/client/components/conformanceCheckFeedback/conformanceCheckFeedback.styl +++ /dev/null @@ -1,19 +0,0 @@ -#conformanceCheckFeedback - position: absolute - right: 10px - color: darkorange - cursor: pointer - background: black - - width: 30% - height: 30px - overflow: hidden - - p - margin: 5px - text-align: center - -.conformanceHover - overflow: auto !important - height: 200px !important - z-index: 200 \ No newline at end of file diff --git a/Packages/lesiontracker/client/components/flexboxLayout/flexboxLayout.html b/Packages/lesiontracker/client/components/flexboxLayout/flexboxLayout.html deleted file mode 100644 index 72f43a487..000000000 --- a/Packages/lesiontracker/client/components/flexboxLayout/flexboxLayout.html +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/Packages/lesiontracker/client/components/lesionTable/lesionTable.html b/Packages/lesiontracker/client/components/lesionTable/lesionTable.html deleted file mode 100644 index 39bcb5f32..000000000 --- a/Packages/lesiontracker/client/components/lesionTable/lesionTable.html +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/Packages/lesiontracker/client/components/lesionTableHUD/lesionTableHUD.js b/Packages/lesiontracker/client/components/lesionTableHUD/lesionTableHUD.js deleted file mode 100644 index 9667faa47..000000000 --- a/Packages/lesiontracker/client/components/lesionTableHUD/lesionTableHUD.js +++ /dev/null @@ -1,48 +0,0 @@ -Template.lesionTableHUD.onCreated(() => { - const instance = Template.instance(); - - instance.data.timepoints = new ReactiveVar(instance.data.timepointApi.currentAndPrior()); -}); - -Template.lesionTableHUD.onRendered(() => { - const instance = Template.instance(); - instance.$('#lesionTableHUD').resizable().draggable(); -}); - -Template.lesionTableHUD.events({ - 'click .buttonClose'(event, instance) { - Session.set('lesionTableHudOpen', false); - } -}); - -Template.lesionTableHUD.helpers({ - hudHidden() { - return Session.get('lesionTableHudOpen') ? 'dialog-open' : 'dialog-closed'; - }, - toolbarButtons() { - var buttonData = []; - - buttonData.push({ - id: 'bidirectional', - title: 'Target', - classes: 'imageViewerTool', - svgLink: '/packages/viewerbase/assets/icons.svg#icon-tools-measure-target' - }); - - buttonData.push({ - id: 'nonTarget', - title: 'Non-Target', - classes: 'imageViewerTool toolbarSectionButton', - svgLink: '/packages/viewerbase/assets/icons.svg#icon-tools-measure-non-target' - }); - - buttonData.push({ - id: 'length', - title: 'Temp', - classes: 'imageViewerTool toolbarSectionButton', - svgLink: '/packages/viewerbase/assets/icons.svg#icon-tools-measure-temp' - }); - - return buttonData; - } -}); diff --git a/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.html b/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.html deleted file mode 100644 index bef8e048a..000000000 --- a/Packages/lesiontracker/client/components/lesionTableHeaderRow/lesionTableHeaderRow.html +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.html b/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.html deleted file mode 100644 index b54cd10d9..000000000 --- a/Packages/lesiontracker/client/components/lesionTableTimepointCell/lesionTableTimepointCell.html +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js b/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js deleted file mode 100644 index a6910a59f..000000000 --- a/Packages/lesiontracker/client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js +++ /dev/null @@ -1,39 +0,0 @@ -Template.lesionTableTimepointHeader.helpers({ - 'timepointName': function() { - var timepoint = this; - return getTimepointName(timepoint); - }, - isLoaded: function() { - Session.get('NewSeriesLoaded'); - - log.info('ViewerData changed, check for displayed timepoints'); - - var timepoint = this; - - var isLoaded = false; - var viewports = $('.imageViewerViewport').not('.empty'); - viewports.each(function(index, element) { - var enabledElement = cornerstone.getEnabledElement(element); - if (!enabledElement || !enabledElement.image) { - return; - } - - var study = cornerstoneTools.metaData.get('study', enabledElement.image.imageId); - - var currentTimepoint = Timepoints.findOne({ - studyInstanceUids: { - $in: [study.studyInstanceUid] - } - }); - - if (currentTimepoint && currentTimepoint._id === timepoint._id) { - isLoaded = true; - - // Break the loop - return false; - } - }); - - return isLoaded; - } -}); \ No newline at end of file diff --git a/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.html b/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.html deleted file mode 100644 index 3e727add5..000000000 --- a/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.html +++ /dev/null @@ -1,29 +0,0 @@ - diff --git a/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.js b/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.js deleted file mode 100644 index 6eab8fb4c..000000000 --- a/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.js +++ /dev/null @@ -1,23 +0,0 @@ -import { MeasurementApi } from 'meteor/lesiontracker/client/api/measurement'; - -Template.lesionTableView.helpers({ - targets() { - const withPriors = true; - return MeasurementApi.targets(withPriors); - }, - - nonTargets() { - const withPriors = true; - return MeasurementApi.nonTargets(withPriors); - }, - - newLesions() { - return MeasurementApi.newLesions(); - }, - - isFollowup() { - const instance = Template.instance(); - const current = instance.data.timepointApi.current(); - return (current && current.timepointType === 'followup'); - } -}); diff --git a/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html b/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html deleted file mode 100644 index 8ee6c76d9..000000000 --- a/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html +++ /dev/null @@ -1,42 +0,0 @@ - diff --git a/Packages/lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js b/Packages/lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js deleted file mode 100644 index 70d9e848d..000000000 --- a/Packages/lesiontracker/client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js +++ /dev/null @@ -1,103 +0,0 @@ -// Use Aldeed's meteor-template-extension package to replace the -// default WorklistStudy template. -// See https://github.com/aldeed/meteor-template-extension -var defaultTemplate = 'worklistStudy'; -Template.lesionTrackerWorklistStudy.replaces(defaultTemplate); - -// Add the TimepointName helper to the default template. The -// HTML of this template is replaced with that of lesionTrackerWorklistStudy -Template[defaultTemplate].helpers({ - timepointName: function() { - var data = this; - var study = Studies.findOne({ - studyInstanceUid: data.studyInstanceUid - }); - - if (!study) { - return; - } - - var timepoint = Timepoints.findOne({ - timepointId: study.timepointId - }); - - if (!timepoint) { - return; - } - - return getTimepointName(timepoint); - }, - reviewerTip: function() { - var data = this; - var study = Studies.findOne({ - studyInstanceUid: data.studyInstanceUid - }); - - if (!study) { - return; - } - - var timepoint = Timepoints.findOne({ - timepointId: study.timepointId - }); - - if (!timepoint) { - return; - } - - var timepointReviewers = Reviewers.findOne({ - timepointId: timepoint.timepointId - }); - - if (!timepointReviewers) { - return; - } - - return getReviewerTipText(timepointReviewers.reviewers); - } -}); - -function getReviewerTipText(reviewers) { - if (!reviewers || reviewers.length === 0) { - return; - } - - var newReviewers = reviewers.filter(function(reviewer) { - return reviewer.userId !== Meteor.userId(); - }); - - if (newReviewers.length === 0) { - return; - } - - var tipText = 'The study is being reviewed by '; - newReviewers.forEach(function(reviewer, index) { - if (reviewer.userId === Meteor.userId()) { - return; - } - - if (index > 0) { - tipText += ','; - } - - tipText += reviewer.userName; - - }); - - return tipText; -} - -// Observe changes on WorklistTabs -// remove the current user from Reviewers if tab is removed -WorklistTabs.find().observe({ - removed: function(tab) { - var contentId = tab.contentid; - var timepointIds = ViewerData[contentId].timepointIds; - if (timepointIds && timepointIds.length > 0) { - timepointIds.forEach(function(timepointId) { - // Remove the current user from Reviewers - Meteor.call('removeReviewer', timepointId); - }); - } - } -}); diff --git a/Packages/lesiontracker/client/components/viewer/viewer.js b/Packages/lesiontracker/client/components/viewer/viewer.js deleted file mode 100644 index 11e452114..000000000 --- a/Packages/lesiontracker/client/components/viewer/viewer.js +++ /dev/null @@ -1,262 +0,0 @@ -import { OHIF } from 'meteor/ohif:core'; -import { TimepointApi } from 'meteor/lesiontracker/client/api/timepoint'; -import { MeasurementApi } from 'meteor/lesiontracker/client/api/measurement'; - -OHIF.viewer = OHIF.viewer || {}; -OHIF.viewer.loadIndicatorDelay = 3000; -OHIF.viewer.defaultTool = 'wwwc'; -OHIF.viewer.refLinesEnabled = true; -OHIF.viewer.cine = { - framesPerSecond: 24, - loop: true -}; - -Session.setDefault('activeViewport', false); -Session.setDefault('leftSidebar', null); -Session.setDefault('rightSidebar', null); - -Template.viewer.onCreated(() => { - const instance = Template.instance(); - - ValidationErrors.remove({}); - - instance.data.state = new ReactiveDict(); - 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; - - OHIF.viewer.functionList = $.extend(OHIF.viewer.functionList, { - toggleLesionTrackerTools: toggleLesionTrackerTools, - clearTools: clearTools, - bidirectional: () => { - // Used for hotkeys - toolManager.setActiveTool('bidirectional'); - }, - nonTarget: () => { - // Used for hotkeys - toolManager.setActiveTool('nonTarget'); - } - }); - - // The hotkey can also be an array (e.g. ["NUMPAD0", "0"]) - OHIF.viewer.defaultHotkeys = OHIF.viewer.defaultHotkeys || {}; - OHIF.viewer.defaultHotkeys.toggleLesionTrackerTools = 'O'; - OHIF.viewer.defaultHotkeys.bidirectional = 'T'; // Target - OHIF.viewer.defaultHotkeys.nonTarget = 'N'; // Non-target - - if (ViewerData[contentId].loadedSeriesData) { - log.info('Reloading previous loadedSeriesData'); - OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData; - - } else { - log.info('Setting default ViewerData'); - OHIF.viewer.loadedSeriesData = {}; - ViewerData[contentId].loadedSeriesData = {}; - Session.set('ViewerData', ViewerData); - } - - Session.set('activeViewport', ViewerData[contentId].activeViewport || false); - - // Set lesion tool buttons as disabled if pixel spacing is not available for active element - instance.autorun(pixelSpacingAutorunCheck); - - // Update the ViewerStudies collection with the loaded studies - ViewerStudies.remove({}); - - instance.data.studies.forEach(study => { - study.selected = true; - study.displaySets = createStacks(study); - ViewerStudies.insert(study); - }); - - const patientId = instance.data.studies[0].patientId; - Session.set('patientId', patientId); - - instance.autorun(() => { - const dataContext = Template.currentData(); - 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); - instance.subscribe('singlePatientAdditionalFindings', dataContext.studies[0].patientId); - - if (instance.subscriptionsReady()) { - // Set buttons as enabled/disabled when Timepoints collection is ready - timepointAutoCheck(dataContext); - - // Wait until the Timepoint subscription is ready to initialize the TimepointApi - instance.data.timepointApi = new TimepointApi(); - instance.data.timepointApi.currentTimepointId = instance.data.currentTimepointId; - - // Provide the necessary data to the Measurement API - MeasurementApi.currentTimepointId = instance.data.currentTimepointId; - const prior = instance.data.timepointApi.prior(); - if (prior) { - MeasurementApi.priorTimepointId = prior.timepointId; - } - - TrialResponseCriteria.validateAllDelayed(); - - ViewerStudies.find().observe({ - added: study => { - // Find the relevant timepoint given the newly added study - const timepoint = Timepoints.findOne({ - studyInstanceUids: { - $in: [study.studyInstanceUid] - } - }); - - if (!timepoint) { - log.warn('Study added to Viewer has not been associated!'); - return; - } - - // Update the added document with its related timepointId - ViewerStudies.update(study._id, { - $set: { - timepointId: timepoint.timepointId - } - }); - } - }); - - ImageMeasurements.find().observe({ - added: data => { - if (data.clientId === ClientId) { - return; - } - - syncImageMeasurementAndToolData(data); - - // Update each displayed viewport - updateAllViewports(); - }, - changed: data => { - if (data.clientId === ClientId) { - return; - } - - syncImageMeasurementAndToolData(data); - - // Update each displayed viewport - updateAllViewports(); - }, - removed: data => { - if (data.clientId === ClientId) { - return; - } - - removeToolDataWithMeasurementId(data.imageId, data.toolType, data.id); - - // Update each displayed viewport - updateAllViewports(); - } - }); - - Measurements.find().observe({ - added: data => { - if (data.clientId === ClientId) { - TrialResponseCriteria.validateAllDelayed(); - return; - } - - log.info('Measurement added'); - - // This is used to re-add tools from the database into the - // Cornerstone ToolData structure - syncMeasurementAndToolData(data); - - // Update each displayed viewport - updateAllViewports(); - }, - changed: data => { - if (data.clientId === ClientId) { - TrialResponseCriteria.validateAllDelayed(); - return; - } - - log.info('Measurement changed'); - - // This is used to update changed tools from the database - // in the Cornerstone ToolData structure - syncMeasurementAndToolData(data); - - // Update each displayed viewport - updateAllViewports(); - - TrialResponseCriteria.validateAllDelayed(); - }, - removed: data => { - log.info('Measurement removed'); - - // Check that this Measurement actually contains timepoint data - if (!data || !data.timepoints) { - return; - } - - // Get the Measurement ID and relevant tool so we can remove - // tool data for this Measurement - const measurementId = data._id; - const toolType = data.toolType; - - // Remove the measurement from all the imageIds on which it exists - // as toolData - Object.keys(data.timepoints).forEach(timepointId => { - // Clear the toolData for this timepoint - const imageId = data.timepoints[timepointId].imageId; - removeToolDataWithMeasurementId(imageId, toolType, measurementId); - - // Set reviewer for this timepoint - if (data.timepoints[timepointId].studyInstanceUid) { - Meteor.call('setReviewer', data.timepoints[timepointId].studyInstanceUid); - } - }); - - // Sync database data with toolData for all the measurements - // that have just been updated - - // Note that here we need to use greater than and equals to - // find the Measurements, whereas on the server it's - // only "greater than", since inside this callback the - // Measurements have already been decremented. - const measurements = Measurements.find({ - patientId: data.patientId, - lesionNumberAbsolute: { - $gte: data.lesionNumberAbsolute - } - }); - - measurements.forEach(measurement => { - syncMeasurementAndToolData(measurement); - }); - - // Update each displayed viewport - updateAllViewports(); - - ValidationErrors.remove({ - measurementId: data._id - }); - - TrialResponseCriteria.validateAll(); - } - }); - } - }); -}); - -Template.viewer.events({ - 'CornerstoneToolsMeasurementAdded .imageViewerViewport'(event, instance, eventData) { - handleMeasurementAdded(event, eventData); - }, - 'CornerstoneToolsMeasurementModified .imageViewerViewport'(event, instance, eventData) { - handleMeasurementModified(event, eventData); - }, - 'CornerstoneToolsMeasurementRemoved .imageViewerViewport'(event, instance, eventData) { - handleMeasurementRemoved(event, eventData); - } -}); diff --git a/Packages/lesiontracker/lib/LesionManager.js b/Packages/lesiontracker/lib/LesionManager.js deleted file mode 100644 index 0d5263e91..000000000 --- a/Packages/lesiontracker/lib/LesionManager.js +++ /dev/null @@ -1,210 +0,0 @@ -measurementValuesByType = { - bidirectional: [ - 'shortestDiameter', - 'longestDiameter' - ], - nonTarget: ['response'], - crTool: ['response'], - exTool: ['response'], - unTool: ['response'], - length: ['length'], - ellipticalRoi: [ - 'area', - 'mean', - 'stdev' - ] - -}; - -/** - * Update the Timepoint object for a specific Measurement. - * If no measurement exists yet, one will be created. - * - * Input is toolData from the lesion or nonTarget tool - * - * @param lesionData - */ -function updateLesionData(lesionData) { - var study = Studies.findOne({ - studyInstanceUid: lesionData.studyInstanceUid - }); - - if (!study) { - log.warn('Study is not associated with a timepoint'); - return; - } - - var timepoint = Timepoints.findOne({ - timepointId: study.timepointId - }); - - if (!timepoint) { - log.warn('Timepoint in an image is not present in the Timepoints Collection?'); - return; - } - - // Find the specific lesion to be updated - var existingMeasurement; - if (lesionData.id && lesionData.id !== 'notready') { - existingMeasurement = Measurements.findOne(lesionData.id); - } else { - existingMeasurement = Measurements.findOne({ - lesionNumber: lesionData.lesionNumber, - isTarget: lesionData.isTarget - }); - } - - // Create a structure for the timepointData based - // on this Lesion's toolData - var timepointData = { - seriesInstanceUid: lesionData.seriesInstanceUid, - studyInstanceUid: lesionData.studyInstanceUid, - sopInstanceUid: lesionData.sopInstanceUid, - handles: lesionData.handles, - imageId: lesionData.imageId - }; - - if (!lesionData.toolType) { - // For debugging, might want to switch to measurement types later - lesionData.toolType = lesionData.isTarget ? 'bidirectional' : 'nonTarget'; - } - - // Populate this timepoint's data with whichever values - // are stored for this Measurement type - var values = measurementValuesByType[lesionData.toolType]; - values.forEach(function(valueName) { - timepointData[valueName] = lesionData[valueName]; - }); - - // If no such lesion exists, we need to add one - if (!existingMeasurement) { - // Create a data structure for the Measurement - // based on the current tool data - var measurement = { - lesionNumber: lesionData.lesionNumber, - isTarget: lesionData.isTarget, - patientId: lesionData.patientId, - id: lesionData.id, - toolType: lesionData.toolType - }; - if (lesionData.toolType) { - measurement.toolType = lesionData.toolType; - } - - // Retrieve the location name given the locationUID - if (lesionData.locationUID !== undefined) { - var locationObj = LesionLocations.findOne({ - locationUID: lesionData.locationUID - }); - - measurement.location = locationObj.location; - measurement.isNodal = locationObj.isNodal; - } - - // Add toolData parameters to the Measurement at this Timepoint - measurement.timepoints = {}; - measurement.timepoints[timepoint.timepointId] = timepointData; - - // Set a flag to prevent duplication of toolData - measurement.clientId = ClientId; - - // Increment and store the absolute Lesion Number for this Measurement - measurement.lesionNumberAbsolute = Measurements.find().count() + 1; - - // Insert this into the Measurements Collection - // Save the ID into the toolData (not sure if this works?) - log.info('LesionManager inserting Measurement'); - measurement.id = Measurements.insert(measurement); - } else { - lesionData.id = existingMeasurement._id; - lesionData.isNodal = existingMeasurement.isNodal; - - if (_.isEqual(existingMeasurement.timepoints[timepoint.timepointId], timepointData)) { - return; - } - - // Update timepoints from lesion data - existingMeasurement.timepoints[timepoint.timepointId] = timepointData; - - log.info('LesionManager updating Measurement'); - Measurements.update(existingMeasurement._id, { - $set: { - timepoints: existingMeasurement.timepoints, - clientId: ClientId - } - }); - } -} - -/** - * Returns new lesion number according to timepointId - * @param timepointId - * @param isTarget - * @returns {*} - */ -function getNewLesionNumber(timepointId, isTarget) { - // Get all current lesion measurements - var numMeasurements = Measurements.find({ - isTarget: isTarget - }).count(); - - // If no measurements exist yet, start at 1 - if (!numMeasurements) { - return 1; - } - - // Find related measurements (i.e. target or non-target) - var measurements = Measurements.find({ - isTarget: isTarget - }, { - sort: { - lesionNumber: 1 - } - }).fetch(); - - // If measurements exist, find the last lesion number - // from the given timepoint - var lesionNumberCounter = 1; - - // Search through every Measurement to see which ones - // already have data for this Timepoint, if we find one that - // doesn't have data, we will stop there and use that as the - // current Measurement - measurements.every(function(measurement) { - // If this measurement has no data for this Timepoint, - // use this as the current Measurement - if (!measurement.timepoints[timepointId]) { - lesionNumberCounter = measurement.lesionNumber; - return false; - } - - lesionNumberCounter++; - return true; - }); - return lesionNumberCounter; -} - -/** - * If the current Lesion Number already exists - * for any other timepoint, returns lesion locationUID - * @param lesionData - * @returns {*} - */ -function lesionNumberExists(lesionData) { - var measurement = Measurements.findOne({ - lesionNumber: lesionData.lesionNumber, - isTarget: lesionData.isTarget - }); - - if (!measurement) { - return; - } - - return measurement.locationId; -} - -LesionManager = { - updateLesionData: updateLesionData, - getNewLesionNumber: getNewLesionNumber, - lesionNumberExists: lesionNumberExists -}; diff --git a/Packages/lesiontracker/lib/calculateTotalLesionBurden.js b/Packages/lesiontracker/lib/calculateTotalLesionBurden.js deleted file mode 100644 index 691544f8f..000000000 --- a/Packages/lesiontracker/lib/calculateTotalLesionBurden.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Calculates total lesion burden given the Trial Criteria Type. - * Supports RECIST 1.1 and irRC at present, defaults to RECIST. - * - * @param criteriaType Either 'RECIST' or 'irRC' - * @returns {*} - */ -calculateTotalLesionBurden = function(criteriaType) { - var totalBurden; - var measurements = Measurements.find({ - isTarget: true - }); - - switch (criteriaType) { - default: - case 'RECIST': - // - Time Point Measurement Total = - // Sum of long axis measurements for extranodal target lesion + - // short axis measurements for nodal lesions - var sumLongAxisExtranodal = 0, - sumShortAxisNodal = 0; - - measurements.forEach(function(measurement) { - var LD = parseFloat(measurement.longestDiameter); - var SD = parseFloat(measurement.shortestDiameter); - - if (measurement.nodal === true) { - sumShortAxisNodal += SD; - } else { - sumLongAxisExtranodal += LD; - } - }); - - totalBurden = sumLongAxisExtranodal + sumShortAxisNodal; - break; - case 'irRC': - // - Time Point Measurement Total = SPD target lesions + SPD new lesions - // (SPD = sum of product of long axis and short axis diameters) - var sumProductLesions = 0, - sumProductNewLesions = 0; - - measurements.forEach(function(measurement) { - var LD = parseFloat(measurement.longestDiameter); - var SD = parseFloat(measurement.shortestDiameter); - var product = LD * SD; - - if (measurement.newLesion === true) { - sumProductNewLesions += product; - } else { - sumProductLesions += product; - } - }); - - totalBurden = sumProductLesions + sumProductNewLesions; - break; - } - - return totalBurden; -}; diff --git a/Packages/lesiontracker/lib/clearMeasurementTimepointData.js b/Packages/lesiontracker/lib/clearMeasurementTimepointData.js deleted file mode 100644 index aa34adc01..000000000 --- a/Packages/lesiontracker/lib/clearMeasurementTimepointData.js +++ /dev/null @@ -1,36 +0,0 @@ -clearMeasurementTimepointData = function(measurementId, timepointId) { - var data = Measurements.findOne(measurementId); - - // Check that this Measurement actually contains data for this timepoint - if (!data || !data.timepoints[timepointId]) { - return; - } - - // Clear the Measurement data for this timepoint - var imageId = data.timepoints[timepointId].imageId; - var toolType = data.toolType; - removeToolDataWithMeasurementId(imageId, toolType, measurementId); - - // Update any viewports that are currently displaying this imageId - var enabledElements = cornerstone.getEnabledElementsByImageId(imageId); - enabledElements.forEach(function(enabledElement) { - cornerstone.updateImage(enabledElement.element); - }); - - delete data.timepoints[timepointId]; - - if (!Object.keys(data.timepoints).length) { - Meteor.call('removeMeasurement', measurementId, function(error, response) { - if (error) { - log.warn(error); - } - }); - } else { - // Update the Timepoint object of the Measurement document - Measurements.update(measurementId, { - $set: { - timepoints: data.timepoints - } - }); - } -}; diff --git a/Packages/lesiontracker/lib/clearTools.js b/Packages/lesiontracker/lib/clearTools.js deleted file mode 100644 index 70c0787c5..000000000 --- a/Packages/lesiontracker/lib/clearTools.js +++ /dev/null @@ -1,58 +0,0 @@ -clearTools = function() { - var patientId = Session.get('patientId'); - var toolTypes = [ 'bidirectional', 'nonTarget', 'length', 'ellipticalRoi', 'crTool', 'unTool', 'exTool' ]; - var toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.toolState; - var toolStateKeys = Object.keys(toolState).slice(0); - - var viewportElements = $('.imageViewerViewport').not('.empty'); - var seriesInstanceUids = []; // Holds seriesInstanceUid of imageViewerViewport elements - viewportElements.each(function(index, element) { - var enabledElement = cornerstone.getEnabledElement(element); - var study = cornerstoneTools.metaData.get('study', enabledElement.image.imageId); - if (!study) { - return; - } - // Set reviewer for this timepoint - if (study.studyInstanceUid) { - Meteor.call('setReviewer',study.studyInstanceUid); - } - var series = cornerstoneTools.metaData.get('series', enabledElement.image.imageId); - if (!series) { - return; - } - - seriesInstanceUids.push(series.seriesInstanceUid); - }); - - // Set null array for toolState data found by imageId and toolType - toolStateKeys.forEach(function(imageId) { - toolTypes.forEach(function(toolType) { - var toolTypeData = toolState[imageId][toolType]; - if (toolTypeData && toolTypeData.data.length > 0) { - var series = cornerstoneTools.metaData.get('series', imageId); - if (!series) { - return; - } - - // If seriesInstanceUid is found in seriesInstanceUids, set toolState data as null - if (seriesInstanceUids.indexOf(series.seriesInstanceUid) > -1) { - toolState[imageId][toolType] = { - data: [] - }; - } - } - }); - }); - - // Update imageViewerViewport elements to remove lesions on current image - viewportElements.each(function(index, element) { - cornerstone.updateImage(element); - }); - - // Remove patient's measurements - Meteor.call('removeMeasurementsByPatientId', patientId); - Meteor.call('removeImageMeasurementsByPatientId', patientId); - - // Clear all validation errors - ValidationErrors.remove({}); -}; diff --git a/Packages/lesiontracker/lib/handleMeasurementAdded.js b/Packages/lesiontracker/lib/handleMeasurementAdded.js deleted file mode 100644 index 342b05994..000000000 --- a/Packages/lesiontracker/lib/handleMeasurementAdded.js +++ /dev/null @@ -1,41 +0,0 @@ -handleMeasurementAdded = function(e, eventData) { - var measurementData = eventData.measurementData; - switch (measurementData.toolType) { - case 'nonTarget': - case 'bidirectional': - case 'crTool': - case 'unTool': - case 'exTool': - log.info('CornerstoneToolsMeasurementAdded'); - LesionManager.updateLesionData(measurementData); - TrialResponseCriteria.validateDelayed(measurementData); - // Set reviewer for this timepoint - if (measurementData.studyInstanceUid) { - Meteor.call('setReviewer', measurementData.studyInstanceUid); - } - - break; - case 'ellipticalRoi': - case 'length': - var enabledElement = cornerstone.getEnabledElement(eventData.element); - var imageId = enabledElement.image.imageId; - - // Get the studyInstanceUid and series metaData - var study = cornerstoneTools.metaData.get('study', imageId); - var series = cornerstoneTools.metaData.get('series', imageId); - - // Add the relevant metaData to this ImageMeasurement's toolData - measurementData.clientId = ClientId; - measurementData.imageId = imageId; - measurementData.toolType = eventData.toolType; - measurementData.patientId = study.patientId; - measurementData.studyInstanceUid = study.studyInstanceUid; - measurementData.seriesInstanceUid = series.seriesInstanceUid; - - // Create the ImageMeasurement in the database - measurementData._id = ImageMeasurements.insert(measurementData); - - break; - } - -}; diff --git a/Packages/lesiontracker/lib/handleMeasurementModified.js b/Packages/lesiontracker/lib/handleMeasurementModified.js deleted file mode 100644 index 9e3092f95..000000000 --- a/Packages/lesiontracker/lib/handleMeasurementModified.js +++ /dev/null @@ -1,44 +0,0 @@ -handleMeasurementModified = function(e, eventData) { - var measurementData = eventData.measurementData; - switch (measurementData.toolType) { - case 'nonTarget': - case 'bidirectional': - case 'crTool': - case 'unTool': - case 'exTool': - log.info('CornerstoneToolsMeasurementModified'); - LesionManager.updateLesionData(measurementData); - TrialResponseCriteria.validateDelayed(measurementData); - // Set reviewer for this timepoint - if (measurementData.studyInstanceUid) { - Meteor.call('setReviewer',measurementData.studyInstanceUid); - } - break; - case 'ellipticalRoi': - case 'length': - var enabledElement = cornerstone.getEnabledElement(eventData.element); - var imageId = enabledElement.image.imageId; - - // Get the studyInstanceUid and series metaData - var study = cornerstoneTools.metaData.get('study', imageId); - var series = cornerstoneTools.metaData.get('series', imageId); - - // Add the relevant metaData to this ImageMeasurement's toolData - measurementData.clientId = ClientId; - measurementData.imageId = imageId; - measurementData.toolType = eventData.toolType; - measurementData.patientId = study.patientId; - measurementData.studyInstanceUid = study.studyInstanceUid; - measurementData.seriesInstanceUid = series.seriesInstanceUid; - var toUpdate = $.extend({}, measurementData); - - // Remove the Mongo _id otherwise it will complain when we try to 'mod' it. - delete toUpdate._id; - - // Update the ImageMeasurement in the database - ImageMeasurements.update(measurementData._id, { - $set: toUpdate - }); - break; - } -}; \ No newline at end of file diff --git a/Packages/lesiontracker/lib/handleMeasurementRemoved.js b/Packages/lesiontracker/lib/handleMeasurementRemoved.js deleted file mode 100644 index 90ef525e7..000000000 --- a/Packages/lesiontracker/lib/handleMeasurementRemoved.js +++ /dev/null @@ -1,27 +0,0 @@ -handleMeasurementRemoved = function(e, eventData) { - var measurementData = eventData.measurementData; - - switch (eventData.toolType) { - case 'nonTarget': - case 'bidirectional': - case 'crTool': - case 'unTool': - case 'exTool': - log.info('CornerstoneToolsMeasurementRemoved'); - - var measurement = Measurements.findOne(measurementData.id, { - reactive: false - }); - - if (!measurement) { - return; - } - // Set reviewer for this timepoint - if (measurementData.studyInstanceUid) { - Meteor.call('setReviewer', measurementData.studyInstanceUid); - } - - clearMeasurementTimepointData(measurement._id, measurementData.timepointId); - break; - } -}; diff --git a/Packages/lesiontracker/lib/syncImageMeasurementAndToolData.js b/Packages/lesiontracker/lib/syncImageMeasurementAndToolData.js deleted file mode 100644 index c2b21ed9a..000000000 --- a/Packages/lesiontracker/lib/syncImageMeasurementAndToolData.js +++ /dev/null @@ -1,59 +0,0 @@ -syncImageMeasurementAndToolData = function(measurement) { - // TODO: Refactor this to merge it with syncMeasurementAndToolData somehow - log.info('syncImageMeasurementAndToolData'); - - var toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.toolState; - - var imageId = measurement.imageId; - var toolType = measurement.toolType; - - // If no tool state exists for this imageId, create an empty object to store it - if (!toolState[imageId]) { - toolState[imageId] = {}; - } - - // Check if we already have toolData for this imageId and toolType - if (toolState[imageId][toolType] && - toolState[imageId][toolType].data && - toolState[imageId][toolType].data.length) { - // If we have toolData, we should search it for any toolData - // related to the current ImageMeasurement - var toolData = toolState[imageId][toolType].data; - - // Create a flag so we know if we have successfully updated - // this ImageMeasurement's timepoint data in the toolData - var alreadyExists = false; - - // Loop through the toolData to search for this ImageMeasurement - toolData.forEach(function(tool) { - // Break the loop if this isn't the ImageMeasurement we are looking for - if (tool._id !== measurement._id) { - return; - } - - // If we find the ImageMeasurement, set the flag to True - alreadyExists = true; - - // Update the toolData from the ImageMeasurement data - $.extend(tool, measurement); - return false; - }); - - // If we found the ImageMeasurement we intended to update, we can stop - // this function here - if (alreadyExists === true) { - return; - } - } else { - // If no toolData exists for this toolType, create an empty array to hold some - toolState[imageId][toolType] = { - data: [] - }; - } - - // If we have reached this point, it means we haven't found the ImageMeasurement we are - // looking for in the current toolData. This means we need to add it. - - // Add the ImageMeasurementData into the toolData for this imageId - toolState[imageId][toolType].data.push(measurement); -}; \ No newline at end of file diff --git a/Packages/lesiontracker/lib/syncMeasurementAndToolData.js b/Packages/lesiontracker/lib/syncMeasurementAndToolData.js deleted file mode 100644 index f1b5686a9..000000000 --- a/Packages/lesiontracker/lib/syncMeasurementAndToolData.js +++ /dev/null @@ -1,90 +0,0 @@ -syncMeasurementAndToolData = function(measurement) { - log.info('syncMeasurementAndToolData'); - - // Check what toolType we should be adding this to, based on the isTarget value - // of the stored Measurement - var toolType = measurement.toolType; - - // Loop through the timepoint data for this measurement - Object.keys(measurement.timepoints).forEach(function(key) { - var timepointData = measurement.timepoints[key]; - var imageId = timepointData.imageId; - - // Sync the Cornerstone ToolData with this Measurement's timepoint-specific data - syncTimepointDataWithToolData(measurement, timepointData, imageId, toolType); - }); -}; - -function syncTimepointDataWithToolData(measurement, timepointData, imageId, toolType) { - // Get the global imageId-specific toolState from Cornerstone Tools - var toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.toolState; - - // If no tool state exists for this imageId, create an empty object to store it - if (!toolState[imageId]) { - toolState[imageId] = {}; - } - - // Check if we already have toolData for this imageId and toolType - if (toolState[imageId][toolType] && - toolState[imageId][toolType].data && - toolState[imageId][toolType].data.length) { - - // If we have toolData, we should search it for any toolData - // related to the current Measurement - var toolData = toolState[imageId][toolType].data; - - // Create a flag so we know if we have successfully updated - // this Measurement's timepoint data in the toolData - var alreadyExists = false; - - // Loop through the toolData to search for this Measurement's - // timepoint data - toolData.forEach(function(tool) { - // Break the loop if this isn't the Measurement we are looking for - if (tool.id !== measurement._id) { - return; - } - - // If we find the Measurement, set the flag to True - alreadyExists = true; - - // Update the toolData from the Measurement data and - // timepoint-specific data from this Measurement - tool.lesionNumber = measurement.lesionNumber; - tool.isTarget = measurement.isTarget; - tool.active = timepointData.active; - tool.visible = timepointData.visible; - tool.isDeleted = timepointData.isDeleted; - tool.handles = timepointData.handles; - tool.toolType = measurement.toolType; - return false; - }); - - // If we found the Measurement we intended to update, we can stop - // this function here - if (alreadyExists === true) { - return; - } - } else { - // If no toolData exists for this toolType, create an empty array to hold some - toolState[imageId][toolType] = { - data: [] - }; - } - - // If we have reached this point, it means we haven't found the Measurement we are - // looking for in the current toolData. This means we need to add it. - - // First, create the measurementData structure based on the lesion data at this timepoint. - var tool = timepointData; - tool.lesionNumber = measurement.lesionNumber; - tool.isTarget = measurement.isTarget; - tool.location = measurement.location; - tool.locationUID = measurement.locationUID; - tool.patientId = measurement.patientId; - tool.id = measurement._id; - tool.toolType = measurement.toolType; - - // Add the measurementData into the toolData for this imageId - toolState[imageId][toolType].data.push(tool); -} diff --git a/Packages/lesiontracker/lib/timepointAutoCheck.js b/Packages/lesiontracker/lib/timepointAutoCheck.js deleted file mode 100644 index 959aee768..000000000 --- a/Packages/lesiontracker/lib/timepointAutoCheck.js +++ /dev/null @@ -1,42 +0,0 @@ -// If timepoint is baseline, sets lesion tool as active tool -setTimepointTools = function(timepoint) { - if (!timepoint) { - return; - } - - var disabledBaselineTools = ["crunexTools"]; - var states = toolManager.getToolDefaultStates(); - var disabledToolButtons = states.disabledToolButtons; - - if (timepoint.timepointType === "baseline") { - // Set active tool as lesion tool - toolManager.setActiveTool('bidirectional'); - disabledBaselineTools.forEach(function(tool) { - var index = disabledToolButtons.indexOf(tool); - if (index === -1) { - disabledToolButtons.push(tool); - } - }); - } else { - toolManager.setActiveTool(toolManager.getDefaultTool()); - // Remove disabled baseline tools - disabledBaselineTools.forEach(function(tool) { - var index = disabledToolButtons.indexOf(tool); - if (index !== -1) { - disabledToolButtons.splice(index, 1); - } - }); - } - - states.disabledToolButtons = disabledToolButtons; - toolManager.setToolDefaultStates(states); -}; - -timepointAutoCheck = function(templateData) { - if (templateData && templateData.timepointIds) { - templateData.timepointIds.forEach(function(timepointId) { - var timepoint = Timepoints.findOne({timepointId: timepointId}); - setTimepointTools(timepoint); - }); - } -}; \ No newline at end of file diff --git a/Packages/lesiontracker/lib/updateRelatedElements.js b/Packages/lesiontracker/lib/updateRelatedElements.js deleted file mode 100644 index b80e88d06..000000000 --- a/Packages/lesiontracker/lib/updateRelatedElements.js +++ /dev/null @@ -1,13 +0,0 @@ -updateRelatedElements = function(imageId) { - // Get all on-screen elements with this imageId - var enabledElements = cornerstone.getEnabledElementsByImageId(imageId); - - // TODO=Check original event to prevent duplicate updateImage calls - - // Loop through these elements - enabledElements.forEach(function(enabledElement) { - // Update the display so the tool is removed - var element = enabledElement.element; - cornerstone.updateImage(element); - }); -}; diff --git a/Packages/lesiontracker/lib/worklist/worklistModification.js b/Packages/lesiontracker/lib/worklist/worklistModification.js deleted file mode 100644 index 4cb81162c..000000000 --- a/Packages/lesiontracker/lib/worklist/worklistModification.js +++ /dev/null @@ -1,73 +0,0 @@ -Meteor.startup(function() { - Worklist.subscriptions = ['studies', 'timepoints']; - Worklist.callbacks['dblClickOnStudy'] = dblClickOnStudy; - Worklist.callbacks['middleClickOnStudy'] = dblClickOnStudy; -}); - -/** - * Lesion Tracker method including Timepoints / other studies - */ -function dblClickOnStudy(data) { - // Use the formatPN template helper to clean up the patient name - var title = formatPN(data.patientName); - var study = Studies.findOne({ - studyInstanceUid: data.studyInstanceUid - }); - - // 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 - open(data.studyInstanceUid, title); - return; - } - - // Find the relevant timepoint given the clicked-on study - var timepoint = Timepoints.findOne({ - studyInstanceUids: { - $in: [data.studyInstanceUid] - } - }); - - if (!timepoint) { - open(data.studyInstanceUid, title); - return; - } - - // Add the Timepoint name to the Patient name to create the tab title - title += ' ' + getTimepointName(timepoint); - - openNewTabWithTimepoint(timepoint.timepointId, title); -} - -/** - * 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 - console.log('open'); - switchToTab(contentid); -} diff --git a/Packages/lesiontracker/package.js b/Packages/lesiontracker/package.js deleted file mode 100644 index 30217d1ca..000000000 --- a/Packages/lesiontracker/package.js +++ /dev/null @@ -1,293 +0,0 @@ -Package.describe({ - name: 'lesiontracker', - summary: 'OHIF Lesion Tracker Tools', - version: '0.0.1' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.4'); - - api.use('ecmascript'); - api.use('standard-app-packages'); - api.use('jquery'); - api.use('stylus'); - api.use('design'); - - api.use('validatejs'); - - // Schema for Data Models - api.use('aldeed:simple-schema'); - - // Control over logging - api.use('practicalmeteor:loglevel'); - - // Unique IDs - api.use('rwatts:uuid'); - - // Template overriding - api.use('aldeed:template-extension@4.0.0'); - - // Our custom packages - api.use('ohif:core'); - api.use('worklist'); - api.use('cornerstone'); - - api.addFiles('log.js', [ 'client', 'server' ]); - - // Schema - api.addFiles('both/schema/additionalFindings.js', [ 'client', 'server' ]); - - // Client-side collections - api.addFiles('client/collections/LesionLocations.js', 'client'); - 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/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.addFiles('client/tools.js', '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/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/lesionTracker/lesionTracker.html', 'client'); - api.addFiles('client/components/lesionTracker/lesionTracker.styl', 'client'); - api.addFiles('client/components/lesionTracker/lesionTracker.js', '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'); - - 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'); - api.addFiles('client/components/associationModal/associationModal.js', 'client'); - - api.addFiles('client/components/activeEntry/activeEntry.styl', 'client'); - api.addFiles('client/components/activeEntry/activeEntry.js', 'client'); - - api.addFiles('client/components/activeEntry/activeEntrySignIn/activeEntrySignIn.js', 'client'); - - api.addFiles('client/components/hipaaLogPage/hipaaLogPage.styl', 'client'); - api.addFiles('client/components/hipaaLogPage/hipaaLogPage.js', 'client'); - - api.addFiles('client/components/optionsModal/optionsModal.html', 'client'); - api.addFiles('client/components/optionsModal/optionsModal.styl', 'client'); - api.addFiles('client/components/optionsModal/optionsModal.js', 'client'); - - api.addFiles('client/components/recistDescription/recistDescription.html', 'client'); - api.addFiles('client/components/irRCDescription/irRCDescription.html', 'client'); - - 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/lesionTableView/lesionTableView.html', 'client'); - api.addFiles('client/components/lesionTableView/lesionTableView.styl', 'client'); - api.addFiles('client/components/lesionTableView/lesionTableView.js', '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/lesionTableHUD/lesionTableHUD.html', 'client'); - api.addFiles('client/components/lesionTableHUD/lesionTableHUD.styl', 'client'); - api.addFiles('client/components/lesionTableHUD/lesionTableHUD.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'); - - api.addFiles('client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html', 'client'); - api.addFiles('client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.styl', 'client'); - api.addFiles('client/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js', 'client'); - - api.addFiles('client/components/nonTargetLesionDialog/nonTargetLesionDialog.html', 'client'); - api.addFiles('client/components/nonTargetLesionDialog/nonTargetLesionDialog.styl', 'client'); - api.addFiles('client/components/nonTargetLesionDialog/nonTargetLesionDialog.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'); - - api.addFiles('client/components/nonTargetResponseDialog/nonTargetResponseDialog.html', 'client'); - api.addFiles('client/components/nonTargetResponseDialog/nonTargetResponseDialog.styl', 'client'); - api.addFiles('client/components/nonTargetResponseDialog/nonTargetResponseDialog.js', 'client'); - - api.addFiles('client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.html', 'client'); - api.addFiles('client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.styl', 'client'); - api.addFiles('client/components/lesionTrackerWorklistStudy/lesionTrackerWorklistStudy.js', 'client'); - - api.addFiles('client/components/measureFlow/measureFlow.html', 'client'); - api.addFiles('client/components/measureFlow/measureFlow.styl', 'client'); - api.addFiles('client/components/measureFlow/measureFlow.js', 'client'); - - api.addFiles('client/components/timeoutCountdownDialog/timeoutCountdownDialog.html', 'client'); - api.addFiles('client/components/timeoutCountdownDialog/timeoutCountdownDialog.styl', 'client'); - api.addFiles('client/components/timeoutCountdownDialog/timeoutCountdownDialog.js', 'client'); - - api.addFiles('client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html', 'client'); - api.addFiles('client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.js', 'client'); - - api.addFiles('client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.html', 'client'); - api.addFiles('client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.js', 'client'); - - api.addFiles('client/components/userAccountMenu/userAccountMenu.html', 'client'); - api.addFiles('client/components/userAccountMenu/userAccountMenu.styl', 'client'); - api.addFiles('client/components/userAccountMenu/userAccountMenu.js', 'client'); - - api.addFiles('client/components/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.html', 'client'); - api.addFiles('client/components/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.js', 'client'); - - api.addFiles('client/components/lastLoginModal/lastLoginModal.html', 'client'); - - api.addFiles('client/components/emailVerification/emailVerification.html', 'client'); - api.addFiles('client/components/emailVerification/emailVerification.styl', 'client'); - api.addFiles('client/components/emailVerification/emailVerification.js', 'client'); - - // Server functions - api.addFiles('server/publications.js', 'server'); - api.addFiles('server/methods.js', [ 'server' ]); - api.addFiles('server/reviewers.js', [ 'server' ]); - api.addFiles('server/createDemoUser.js', [ 'server' ]); - - // Both client and server functions - api.addFiles('both/collections.js', [ 'client', 'server' ]); - - // Worklist-related functions - api.addFiles('lib/worklist/openNewTabWithTimepoint.js', 'client'); - api.addFiles('lib/worklist/worklistModification.js', 'client'); - - // Library functions - api.addFiles('lib/TrialCriteriaConstraints.js', 'client'); - api.addFiles('lib/TrialResponseCriteria.js', 'client'); - api.addFiles('lib/LesionManager.js', 'client'); - api.addFiles('lib/pixelSpacingAutorunCheck.js', 'client'); - api.addFiles('lib/toggleLesionTrackerTools.js', 'client'); - api.addFiles('lib/clearMeasurementTimepointData.js', 'client'); - api.addFiles('lib/removeToolDataWithMeasurementId.js', 'client'); - api.addFiles('lib/getTimepointObject.js', 'client'); - api.addFiles('lib/getTimepointName.js', 'client'); - api.addFiles('lib/activateMeasurements.js', 'client'); - api.addFiles('lib/activateLesion.js', 'client'); - api.addFiles('lib/deactivateAllToolData.js', 'client'); - api.addFiles('lib/clearTools.js', 'client'); - api.addFiles('lib/calculateTotalLesionBurden.js', 'client'); - api.addFiles('lib/convertToNonTarget.js', 'client'); - api.addFiles('lib/convertNonTarget.js', 'client'); - api.addFiles('lib/timepointAutoCheck.js', 'client'); - - api.addFiles('lib/syncMeasurementAndToolData.js', 'client'); - api.addFiles('lib/syncImageMeasurementAndToolData.js', 'client'); - api.addFiles('lib/updateRelatedElements.js', 'client'); - - api.addFiles('lib/handleMeasurementAdded.js', 'client'); - api.addFiles('lib/handleMeasurementModified.js', 'client'); - api.addFiles('lib/handleMeasurementRemoved.js', 'client'); - - // API classes - api.addFiles('client/api/timepoint.js'); - api.addFiles('client/api/measurement.js'); - - // Export global functions - api.export('pixelSpacingAutorunCheck', 'client'); - api.export('handleMeasurementAdded', 'client'); - api.export('handleMeasurementModified', 'client'); - api.export('handleMeasurementRemoved', 'client'); - api.export('syncMeasurementAndToolData', 'client'); - api.export('syncImageMeasurementAndToolData', 'client'); - api.export('updateRelatedElements', 'client'); - api.export('openNewTabWithTimepoint', 'client'); - api.export('activateLesion', 'client'); - api.export('activateMeasurements', 'client'); - api.export('deactivateAllToolData', 'client'); - api.export('toggleLesionTrackerTools', 'client'); - api.export('clearMeasurementTimepointData', 'client'); - api.export('removeToolDataWithMeasurementId', 'client'); - api.export('getTimepointObject', 'client'); - api.export('clearTools', 'client'); - api.export('getTimepointName', 'client'); - api.export('getTrialCriteriaConstraints', 'client'); - api.export('calculateTotalLesionBurden', 'client'); - api.export('convertToNonTarget', 'client'); - api.export('convertNonTarget', 'client'); - api.export('timepointAutoCheck', 'client'); - - // Export global objects - api.export('TrialResponseCriteria', 'client'); - api.export('TrialCriteriaConstraints', 'client'); - api.export('LesionManager', 'client'); - - // Export client-side collections - api.export('ValidationErrors', 'client'); - api.export('LesionLocations', 'client'); - api.export('LocationResponses', 'client'); - api.export('TrialCriteriaTypes', 'client'); - - // Export collections spanning both client and server - api.export('AdditionalFindings', [ 'client', 'server' ]); - api.export('ImageMeasurements', [ 'client', 'server' ]); - api.export('Measurements', [ 'client', 'server' ]); - api.export('Studies', [ 'client', 'server' ]); - api.export('Timepoints', [ 'client', 'server' ]); - api.export('Reviewers', [ 'client', 'server' ]); - - // Export utility classes - api.export('FormUtils', 'client'); -}); diff --git a/Packages/lesiontracker/server/methods.js b/Packages/lesiontracker/server/methods.js deleted file mode 100644 index fb80164d4..000000000 --- a/Packages/lesiontracker/server/methods.js +++ /dev/null @@ -1,61 +0,0 @@ -Meteor.methods({ - removeMeasurement: function(id) { - var lesionData = Measurements.findOne(id); - - // Update all Measurements to decrement the lesion numbers for those - // that were created after the current lesion by 1 - - // TODO: Update this when we have more criteria than patientId - // Decrement the absolute lesion number of all lesions with - // absolute lesion numbers greater than the current lesion by 1 - Measurements.update({ - patientId: lesionData.patientId, - lesionNumberAbsolute: { - $gt: lesionData.lesionNumberAbsolute - } - }, { - $inc: { - lesionNumberAbsolute: -1 - } - }, { - multi: true - }); - - // Decrement the lesion number of all related (i.e. target or non-target) - // lesions with lesion numbers greater than the current lesion by 1 - Measurements.update({ - patientId: lesionData.patientId, - lesionNumber: { - $gt: lesionData.lesionNumber - }, - isTarget: lesionData.isTarget - }, { - $inc: { - lesionNumber: -1 - } - }, { - multi: true - }); - - Measurements.remove(id); - }, - removeMeasurementsByPatientId: function(patientId) { - Measurements.remove({ - patientId: patientId - }); - }, - removeImageMeasurementsByPatientId: function(patientId) { - ImageMeasurements.remove({ - patientId: patientId - }); - }, - clearAllTimepoints: function() { - Timepoints.remove({}); - }, - removeTimepoint: function(id) { - Timepoints.remove(id); - }, - removeAssociatedStudy: function(id) { - Studies.remove(id); - } -}); diff --git a/Packages/cornerstone/client/cornerstone.js b/Packages/ohif-cornerstone/client/cornerstone.js similarity index 100% rename from Packages/cornerstone/client/cornerstone.js rename to Packages/ohif-cornerstone/client/cornerstone.js diff --git a/Packages/cornerstone/client/cornerstoneMath.js b/Packages/ohif-cornerstone/client/cornerstoneMath.js similarity index 100% rename from Packages/cornerstone/client/cornerstoneMath.js rename to Packages/ohif-cornerstone/client/cornerstoneMath.js diff --git a/Packages/cornerstone/client/cornerstoneTools.js b/Packages/ohif-cornerstone/client/cornerstoneTools.js similarity index 99% rename from Packages/cornerstone/client/cornerstoneTools.js rename to Packages/ohif-cornerstone/client/cornerstoneTools.js index 31d2a7893..35447759c 100644 --- a/Packages/cornerstone/client/cornerstoneTools.js +++ b/Packages/ohif-cornerstone/client/cornerstoneTools.js @@ -1,4 +1,4 @@ -/*! cornerstoneTools - v0.7.8 - 2016-08-05 | (c) 2014 Chris Hafey | https://github.com/chafey/cornerstoneTools */ +/*! cornerstoneTools - v0.7.9 - 2016-09-18 | (c) 2014 Chris Hafey | https://github.com/chafey/cornerstoneTools */ // Begin Source: src/header.js if (typeof cornerstone === 'undefined') { cornerstone = {}; @@ -22,39 +22,64 @@ if (typeof cornerstoneTools === 'undefined') { 'use strict'; + var scrollTimeout; + var scrollTimeoutDelay = 1; + function mouseWheel(e) { - // !!!HACK/NOTE/WARNING!!! - // for some reason I am getting mousewheel and DOMMouseScroll events on my - // mac os x mavericks system when middle mouse button dragging. - // I couldn't find any info about this so this might break other systems - // webkit hack - if (e.originalEvent.type === 'mousewheel' && e.originalEvent.wheelDeltaY === 0) { - return; - } - // firefox hack - if (e.originalEvent.type === 'DOMMouseScroll' && e.originalEvent.axis === 1) { - return; - } + clearTimeout(scrollTimeout); - var element = e.currentTarget; - var startingCoords = cornerstone.pageToPixel(element, e.pageX || e.originalEvent.pageX, e.pageY || e.originalEvent.pageY); + scrollTimeout = setTimeout(function() { + // !!!HACK/NOTE/WARNING!!! + // for some reason I am getting mousewheel and DOMMouseScroll events on my + // mac os x mavericks system when middle mouse button dragging. + // I couldn't find any info about this so this might break other systems + // webkit hack + if (e.originalEvent.type === 'mousewheel' && e.originalEvent.wheelDeltaY === 0) { + return; + } + // firefox hack + if (e.originalEvent.type === 'DOMMouseScroll' && e.originalEvent.axis === 1) { + return; + } - e = window.event || e; // old IE support - var wheelDelta = e.wheelDelta || -e.detail || -e.originalEvent.detail; - var direction = Math.max(-1, Math.min(1, (wheelDelta))); + var element = e.currentTarget; - var mouseWheelData = { - element: element, - viewport: cornerstone.getViewport(element), - image: cornerstone.getEnabledElement(element).image, - direction: direction, - pageX: e.pageX || e.originalEvent.pageX, - pageY: e.pageY || e.originalEvent.pageY, - imageX: startingCoords.x, - imageY: startingCoords.y - }; + var x; + var y; - $(element).trigger('CornerstoneToolsMouseWheel', mouseWheelData); + if (e.pageX !== undefined && e.pageY !== undefined) { + x = e.pageX; + y = e.pageY; + } else if (e.originalEvent && + e.originalEvent.pageX !== undefined && + e.originalEvent.pageY !== undefined) { + x = e.originalEvent.pageX; + y = e.originalEvent.pageY; + } else { + // IE9 & IE10 + x = e.x; + y = e.y; + } + + var startingCoords = cornerstone.pageToPixel(element, x, y); + + e = window.event || e; // old IE support + var wheelDelta = e.wheelDelta || -e.detail || -e.originalEvent.detail || -e.originalEvent.deltaY; + var direction = Math.max(-1, Math.min(1, (wheelDelta))); + + var mouseWheelData = { + element: element, + viewport: cornerstone.getViewport(element), + image: cornerstone.getEnabledElement(element).image, + direction: direction, + pageX: x, + pageY: y, + imageX: startingCoords.x, + imageY: startingCoords.y + }; + + $(element).trigger('CornerstoneToolsMouseWheel', mouseWheelData); + }, scrollTimeoutDelay); } var mouseWheelEvents = 'mousewheel DOMMouseScroll'; @@ -798,6 +823,7 @@ if (typeof cornerstoneTools === 'undefined') { // we want to detect both the same time pinch.recognizeWith(pan); pinch.recognizeWith(rotate); + rotate.recognizeWith(pan); var doubleTap = new Hammer.Tap({ event: 'doubletap', @@ -2113,6 +2139,7 @@ if (typeof cornerstoneTools === 'undefined') { $(mouseEventData.element).on('CornerstoneToolsMouseMove', eventData, cornerstoneTools.arrowAnnotate.mouseMoveCallback); $(mouseEventData.element).on('CornerstoneToolsMouseDown', eventData, cornerstoneTools.arrowAnnotate.mouseDownCallback); $(mouseEventData.element).on('CornerstoneToolsMouseDownActivate', eventData, cornerstoneTools.arrowAnnotate.mouseDownActivateCallback); + $(mouseEventData.element).on('CornerstoneToolsMouseDoubleClick', eventData, cornerstoneTools.arrowAnnotate.mouseDoubleClickCallback); } // associate this data with this imageId so we can render it and manipulate it @@ -2123,6 +2150,7 @@ if (typeof cornerstoneTools === 'undefined') { $(mouseEventData.element).off('CornerstoneToolsMouseMove', cornerstoneTools.arrowAnnotate.mouseMoveCallback); $(mouseEventData.element).off('CornerstoneToolsMouseDown', cornerstoneTools.arrowAnnotate.mouseDownCallback); $(mouseEventData.element).off('CornerstoneToolsMouseDownActivate', cornerstoneTools.arrowAnnotate.mouseDownActivateCallback); + $(mouseEventData.element).off('CornerstoneToolsMouseDoubleClick', cornerstoneTools.arrowAnnotate.mouseDoubleClickCallback); cornerstone.updateImage(mouseEventData.element); cornerstoneTools.moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function() { @@ -3295,6 +3323,14 @@ if (typeof cornerstoneTools === 'undefined') { // Set the invalidated flag to false so that this data won't automatically be recalculated data.invalidated = false; + + var eventType = 'CornerstoneToolsMeasurementModified'; + var modifiedEventData = { + toolType: toolType, + element: element, + measurementData: data + }; + $(element).trigger(eventType, modifiedEventData); } // Define an array to store the rows of text for the textbox @@ -3386,7 +3422,7 @@ if (typeof cornerstoneTools === 'undefined') { }; // First we calculate the ellipse points (top, left, right, and bottom) - var ellipsePoints = [{ + var ellipsePoints = [ { // Top middle point of ellipse x: leftCanvas + widthCanvas / 2, y: topCanvas @@ -3402,14 +3438,14 @@ if (typeof cornerstoneTools === 'undefined') { // Right middle point of ellipse x: leftCanvas + widthCanvas, y: topCanvas + heightCanvas / 2 - }]; + } ]; // We obtain the link starting point by finding the closest point on the ellipse to the // center of the textbox link.start = cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end); // Next we calculate the corners of the textbox bounding box - var boundingBoxPoints = [{ + var boundingBoxPoints = [ { // Top middle point of bounding box x: boundingBox.left + boundingBox.width / 2, y: boundingBox.top @@ -3435,7 +3471,7 @@ if (typeof cornerstoneTools === 'undefined') { context.beginPath(); context.strokeStyle = color; context.lineWidth = lineWidth; - context.setLineDash([2, 3]); + context.setLineDash([ 2, 3 ]); context.moveTo(link.start.x, link.start.y); context.lineTo(link.end.x, link.end.y); context.stroke(); @@ -3460,7 +3496,8 @@ if (typeof cornerstoneTools === 'undefined') { toolType: toolType }); -})($, cornerstone, cornerstoneMath, cornerstoneTools); +})($, cornerstone, cornerstoneMath, cornerstoneTools); + // End Source; src/imageTools/ellipticalRoi.js // Begin Source: src/imageTools/freehand.js @@ -4325,6 +4362,7 @@ if (typeof cornerstoneTools === 'undefined') { function mouseUpCallback(e, eventData) { $(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); $(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); + $(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); hideTool(eventData); } @@ -4339,6 +4377,7 @@ if (typeof cornerstoneTools === 'undefined') { if (cornerstoneTools.isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { $(eventData.element).on('CornerstoneToolsMouseDrag', eventData, dragCallback); $(eventData.element).on('CornerstoneToolsMouseUp', eventData, mouseUpCallback); + $(eventData.element).on('CornerstoneToolsMouseClick', eventData, mouseUpCallback); drawMagnificationTool(eventData); return false; // false = causes jquery to preventDefault() and stopPropagation() this event } @@ -4975,12 +5014,20 @@ if (typeof cornerstoneTools === 'undefined') { var lineWidth = cornerstoneTools.toolStyle.getToolWidth(); var font = cornerstoneTools.textStyle.getFont(); var fontHeight = cornerstoneTools.textStyle.getFontSize(); + var config = cornerstoneTools.rectangleRoi.getConfiguration(); for (var i = 0; i < toolData.data.length; i++) { context.save(); var data = toolData.data[i]; - + + // Apply any shadow settings defined in the tool configuration + if (config && config.shadow) { + context.shadowColor = config.shadowColor || '#000000'; + context.shadowOffsetX = config.shadowOffsetX || 1; + context.shadowOffsetY = config.shadowOffsetY || 1; + } + //differentiate the color of activation tool if (data.active) { color = cornerstoneTools.toolColors.getActiveColor(); @@ -5606,7 +5653,8 @@ if (typeof cornerstoneTools === 'undefined') { x: mouseEventData.currentPoints.image.x, y: mouseEventData.currentPoints.image.y, highlight: true, - active: true + active: true, + hasBoundingBox: true } } }; @@ -5655,12 +5703,13 @@ if (typeof cornerstoneTools === 'undefined') { ///////// BEGIN IMAGE RENDERING /////// function pointNearTool(element, data, coords) { - if (!data.textBoundingBox) { + if (!data.handles.end.boundingBox) { return; } - var distanceToPoint = cornerstoneMath.rect.distanceToPoint(data.textBoundingBox, coords); - return (distanceToPoint < 10); + var distanceToPoint = cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords); + var insideBoundingBox = cornerstoneTools.pointInsideBoundingBox(data.handles.end, coords); + return (distanceToPoint < 10) || insideBoundingBox; } function onImageRendered(e, eventData) { @@ -5707,7 +5756,7 @@ if (typeof cornerstoneTools === 'undefined') { }; var boundingBox = cornerstoneTools.drawTextBox(context, data.text, textCoords.x, textCoords.y - 10, color, options); - data.textBoundingBox = boundingBox; + data.handles.end.boundingBox = boundingBox; context.restore(); } @@ -8423,7 +8472,7 @@ Display scroll progress bar across bottom of image. // When the user has scrolled to a new image clearTimeout(resetPrefetchTimeout); resetPrefetchTimeout = setTimeout(function() { - var element = e.currentTarget; + var element = e.target; prefetch(element); }, resetPrefetchDelay); } diff --git a/Packages/cornerstone/client/cornerstoneWADOImageLoader.js b/Packages/ohif-cornerstone/client/cornerstoneWADOImageLoader.js similarity index 100% rename from Packages/cornerstone/client/cornerstoneWADOImageLoader.js rename to Packages/ohif-cornerstone/client/cornerstoneWADOImageLoader.js diff --git a/Packages/cornerstone/client/dicomParser.js b/Packages/ohif-cornerstone/client/dicomParser.js similarity index 100% rename from Packages/cornerstone/client/dicomParser.js rename to Packages/ohif-cornerstone/client/dicomParser.js diff --git a/Packages/cornerstone/client/hammer.js b/Packages/ohif-cornerstone/client/hammer.js similarity index 100% rename from Packages/cornerstone/client/hammer.js rename to Packages/ohif-cornerstone/client/hammer.js diff --git a/Packages/cornerstone/client/jquery.hammer.js b/Packages/ohif-cornerstone/client/jquery.hammer.js similarity index 100% rename from Packages/cornerstone/client/jquery.hammer.js rename to Packages/ohif-cornerstone/client/jquery.hammer.js diff --git a/Packages/cornerstone/client/libCharLS.js b/Packages/ohif-cornerstone/client/libCharLS.js similarity index 100% rename from Packages/cornerstone/client/libCharLS.js rename to Packages/ohif-cornerstone/client/libCharLS.js diff --git a/Packages/cornerstone/client/libopenjpeg.js b/Packages/ohif-cornerstone/client/libopenjpeg.js similarity index 100% rename from Packages/cornerstone/client/libopenjpeg.js rename to Packages/ohif-cornerstone/client/libopenjpeg.js diff --git a/Packages/cornerstone/package.js b/Packages/ohif-cornerstone/package.js similarity index 93% rename from Packages/cornerstone/package.js rename to Packages/ohif-cornerstone/package.js index c6c9a52ad..ecc4f4be4 100644 --- a/Packages/cornerstone/package.js +++ b/Packages/ohif-cornerstone/package.js @@ -1,14 +1,13 @@ Package.describe({ - name: 'cornerstone', + name: 'ohif:cornerstone', summary: 'Cornerstone Web-based Medical Imaging libraries', version: '0.0.1' }); Package.onUse(function(api) { - api.versionsFrom('1.3.5.1'); + api.versionsFrom('1.4'); api.use('jquery'); - api.use('dicomweb'); api.addFiles('client/cornerstone.js', 'client', { bare: true diff --git a/Packages/design/app.styl b/Packages/ohif-design/app.styl similarity index 100% rename from Packages/design/app.styl rename to Packages/ohif-design/app.styl diff --git a/Packages/design/components/roundedButtonGroup/roundedButtonGroup.html b/Packages/ohif-design/components/roundedButtonGroup/roundedButtonGroup.html similarity index 87% rename from Packages/design/components/roundedButtonGroup/roundedButtonGroup.html rename to Packages/ohif-design/components/roundedButtonGroup/roundedButtonGroup.html index 8a7e671cf..3d35648fd 100644 --- a/Packages/design/components/roundedButtonGroup/roundedButtonGroup.html +++ b/Packages/ohif-design/components/roundedButtonGroup/roundedButtonGroup.html @@ -1,7 +1,7 @@