From 9045ddaedca2eb852d8e0652dc6c403db12ce05b Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 1 Sep 2023 16:19:39 -0400 Subject: [PATCH] chore(prettier): full repo linting and code reformatting once and for all (#3627) --- .circleci/config.yml | 13 +- .eslintrc.json | 7 +- .github/ISSUE_TEMPLATE/bug-report.yml | 12 +- .github/ISSUE_TEMPLATE/feature-request.yml | 8 +- .github/stale.yml | 5 +- .netlify/www/index.html | 36 +- .prettierrc | 6 +- .webpack/helpers/excludeNodeModulesExcept.js | 4 +- .webpack/rules/cssToJavaScript.js | 4 +- .webpack/webpack.base.js | 28 +- babel.config.js | 6 +- extensions/_example/src/index.js | 6 +- .../.webpack/webpack.prod.js | 11 +- .../cornerstone-dicom-rt/babel.config.js | 6 +- .../src/getSopClassHandlerModule.js | 26 +- extensions/cornerstone-dicom-rt/src/index.tsx | 4 +- .../cornerstone-dicom-rt/src/loadRTStruct.js | 76 +- .../src/utils/_hydrateRT.ts | 13 +- .../src/utils/initRTToolGroup.ts | 9 +- .../src/utils/promptHydrateRT.ts | 4 +- .../viewports/OHIFCornerstoneRTViewport.tsx | 58 +- .../src/viewports/_getStatusComponent.tsx | 20 +- .../.webpack/webpack.prod.js | 8 +- .../cornerstone-dicom-seg/babel.config.js | 6 +- .../src/getSopClassHandlerModule.js | 60 +- .../cornerstone-dicom-seg/src/index.tsx | 14 +- .../src/panels/PanelSegmentation.tsx | 73 +- .../src/panels/callInputDialog.tsx | 2 +- .../src/utils/_hydrateSEG.ts | 7 +- .../src/utils/dicomlabToRGB.ts | 4 +- .../src/utils/initSEGToolGroup.ts | 9 +- .../src/utils/promptHydrateSEG.ts | 11 +- .../viewports/OHIFCornerstoneSEGViewport.tsx | 58 +- .../src/viewports/_getStatusComponent.tsx | 20 +- .../.webpack/webpack.prod.js | 8 +- .../src/commandsModule.js | 41 +- .../src/getSopClassHandlerModule.ts | 228 +- extensions/cornerstone-dicom-sr/src/index.tsx | 8 +- extensions/cornerstone-dicom-sr/src/init.ts | 4 +- .../src/tools/DICOMSRDisplayTool.ts | 72 +- .../src/tools/modules/dicomSRModule.js | 8 +- .../src/utils/addMeasurement.ts | 46 +- .../src/utils/addToolInstance.ts | 6 +- .../utils/createReferencedImageDisplaySet.ts | 16 +- .../findInstanceMetadataBySopInstanceUid.js | 3 +- .../utils/findMostRecentStructuredReport.js | 10 +- .../utils/getFilteredCornerstoneToolState.ts | 21 +- .../getLabelFromDCMJSImportedToolData.js | 4 +- .../src/utils/hydrateStructuredReport.js | 72 +- .../src/utils/isRehydratable.js | 16 +- .../viewports/OHIFCornerstoneSRViewport.tsx | 89 +- .../cornerstone/.webpack/webpack.prod.js | 8 +- .../src/Viewport/OHIFCornerstoneViewport.tsx | 133 +- .../Overlays/CustomizableViewportOverlay.tsx | 69 +- .../Overlays/ViewportImageScrollbar.tsx | 32 +- .../ViewportImageSliceLoadingIndicator.tsx | 28 +- .../Overlays/ViewportOrientationMarkers.tsx | 34 +- .../src/Viewport/Overlays/ViewportOverlay.tsx | 28 +- .../src/Viewport/Overlays/utils.ts | 12 +- extensions/cornerstone/src/commandsModule.ts | 87 +- .../src/components/CinePlayer/CinePlayer.tsx | 12 +- .../components/DicomUpload/DicomUpload.css | 23 +- .../components/DicomUpload/DicomUpload.tsx | 35 +- .../DicomUpload/DicomUploadProgress.tsx | 136 +- .../DicomUpload/DicomUploadProgressItem.tsx | 33 +- extensions/cornerstone/src/index.tsx | 15 +- extensions/cornerstone/src/init.tsx | 107 +- extensions/cornerstone/src/initContextMenu.ts | 23 +- extensions/cornerstone/src/initDoubleClick.ts | 18 +- .../cornerstone/src/initMeasurementService.js | 36 +- .../cornerstone/src/initWADOImageLoader.js | 14 +- .../CornerstoneCacheService.ts | 54 +- .../RTSTRUCT/mapROIContoursToRTStructData.ts | 43 +- .../SegmentationService.ts | 423 +- .../SyncGroupService/SyncGroupService.ts | 33 +- .../ToolGroupService/ToolGroupService.ts | 34 +- .../CornerstoneViewportService.ts | 141 +- .../ViewportService/IViewportService.ts | 6 +- .../src/services/ViewportService/Viewport.ts | 48 +- extensions/cornerstone/src/state.ts | 6 +- .../src/tools/CalibrationLineTool.ts | 20 +- extensions/cornerstone/src/types/index.ts | 7 +- .../utils/CornerstoneViewportDownloadForm.tsx | 79 +- .../src/utils/DicomFileUploader.ts | 30 +- .../cornerstone/src/utils/callInputDialog.tsx | 8 +- .../src/utils/dicomLoaderService.js | 8 +- .../utils/getActiveViewportEnabledElement.ts | 4 +- .../src/utils/getCornerstoneBlendMode.ts | 4 +- .../src/utils/getCornerstoneOrientation.ts | 4 +- .../src/utils/getCornerstoneViewportType.ts | 8 +- .../cornerstone/src/utils/getNthFrames.js | 14 +- .../src/utils/interleaveCenterLoader.ts | 28 +- .../src/utils/interleaveTopToBottom.ts | 28 +- .../utils/measurementServiceMappings/Angle.ts | 41 +- .../ArrowAnnotate.ts | 22 +- .../Bidirectional.ts | 41 +- .../measurementServiceMappings/CircleROI.ts | 36 +- .../measurementServiceMappings/CobbAngle.ts | 41 +- .../EllipticalROI.ts | 36 +- .../measurementServiceMappings/Length.ts | 40 +- .../PlanarFreehandROI.ts | 20 +- .../RectangleROI.ts | 36 +- .../measurementServiceMappingsFactory.ts | 11 +- .../utils/selection.ts | 14 +- extensions/cornerstone/src/utils/nthLoader.ts | 28 +- ...oveToolGroupSegmentationRepresentations.ts | 4 +- .../calculateViewportRegistrations.ts | 4 +- .../utils/stackSync/toggleStackImageSync.ts | 31 +- extensions/default/.webpack/webpack.dev.js | 1 - extensions/default/.webpack/webpack.prod.js | 8 +- .../default/src/Actions/createReportAsync.tsx | 6 +- .../DataSourceConfigurationComponent.tsx | 28 +- .../DataSourceConfigurationModalComponent.tsx | 47 +- .../src/Components/ItemListComponent.tsx | 39 +- .../ContextMenuController.tsx | 17 +- .../ContextMenuItemsBuilder.test.js | 2 +- .../ContextMenuItemsBuilder.ts | 25 +- .../GoogleCloudDataSourceConfigurationAPI.ts | 21 +- .../default/src/DicomJSONDataSource/index.js | 20 +- .../default/src/DicomLocalDataSource/index.js | 12 +- .../src/DicomTagBrowser/DicomTagBrowser.css | 4 +- .../src/DicomTagBrowser/DicomTagBrowser.tsx | 59 +- .../src/DicomTagBrowser/DicomTagTable.tsx | 61 +- .../src/DicomWebDataSource/dcm4cheeReject.js | 4 +- .../default/src/DicomWebDataSource/index.js | 92 +- .../default/src/DicomWebDataSource/qido.js | 17 +- .../retrieveStudyMetadata.js | 10 +- .../utils/StaticWadoClient.ts | 23 +- .../utils/fixBulkDataURI.ts | 5 +- .../DicomWebDataSource/utils/getImageId.js | 7 +- .../wado/retrieveMetadata.js | 4 +- .../wado/retrieveMetadataLoader.js | 8 +- .../wado/retrieveMetadataLoaderAsync.js | 26 +- .../wado/retrieveMetadataLoaderSync.js | 10 +- .../src/DicomWebProxyDataSource/index.js | 22 +- .../default/src/Panels/ActionButtons.tsx | 10 +- .../default/src/Panels/DataSourceSelector.tsx | 14 +- .../src/Panels/PanelMeasurementTable.tsx | 39 +- .../default/src/Panels/PanelStudyBrowser.tsx | 91 +- .../src/Panels/WrappedPanelStudyBrowser.tsx | 15 +- .../src/Panels/createReportDialogPrompt.tsx | 22 +- extensions/default/src/Panels/debounce.js | 4 +- extensions/default/src/Toolbar/Toolbar.tsx | 5 +- .../default/src/Toolbar/ToolbarDivider.tsx | 4 +- .../src/Toolbar/ToolbarLayoutSelector.tsx | 13 +- extensions/default/src/ViewerLayout/index.tsx | 29 +- extensions/default/src/commandsModule.ts | 142 +- .../default/src/findViewportsByPosition.ts | 14 +- .../default/src/getCustomizationModule.tsx | 17 +- .../default/src/getDisplaySetMessages.ts | 5 +- .../default/src/getLayoutTemplateModule.js | 7 +- .../src/getPTImageIdInstanceMetadata.ts | 50 +- extensions/default/src/getPanelModule.tsx | 6 +- .../default/src/getSopClassHandlerModule.js | 10 +- extensions/default/src/hpCompare.ts | 7 +- extensions/default/src/index.ts | 5 +- extensions/default/src/init.ts | 21 +- .../utils/findSRWithSameSeriesDescription.ts | 14 +- extensions/default/src/utils/getDirectURL.js | 12 +- .../default/src/utils/reuseCachedLayouts.ts | 9 +- .../validations/areAllImageComponentsEqual.ts | 4 +- .../validations/areAllImageDimensionsEqual.ts | 4 +- .../areAllImageOrientationsEqual.ts | 12 +- .../validations/areAllImagePositionsEqual.ts | 20 +- .../validations/areAllImageSpacingEqual.ts | 12 +- .../src/utils/validations/checkMultiframe.ts | 13 +- .../utils/validations/checkSingleFrames.ts | 4 +- extensions/dicom-microscopy/.prettierrc | 6 +- .../dicom-microscopy/.webpack/webpack.dev.js | 1 - extensions/dicom-microscopy/babel.config.js | 6 +- .../src/DicomMicroscopySRSopClassHandler.js | 54 +- .../src/DicomMicroscopySopClassHandler.js | 17 +- .../src/DicomMicroscopyViewport.css | 14 +- .../src/DicomMicroscopyViewport.tsx | 47 +- .../MicroscopyPanel/MicroscopyPanel.tsx | 85 +- .../ViewportOverlay/ViewportOverlay.css | 2 +- .../src/components/ViewportOverlay/index.tsx | 18 +- .../src/components/ViewportOverlay/utils.ts | 15 +- .../dicom-microscopy/src/getCommandsModule.ts | 22 +- extensions/dicom-microscopy/src/index.tsx | 17 +- .../src/services/MicroscopyService.ts | 71 +- .../src/tools/viewerManager.js | 51 +- .../src/utils/RoiAnnotation.js | 16 +- .../src/utils/areaOfPolygon.js | 4 +- .../src/utils/callInputDialog.tsx | 2 +- .../src/utils/cleanDenaturalizedDataset.ts | 24 +- .../dicom-microscopy/src/utils/constructSR.ts | 95 +- .../coordinateFormatScoord3d2Geometry.js | 5 +- .../src/utils/dicomWebClient.ts | 29 +- .../src/utils/getSourceDisplaySet.js | 12 +- .../dicom-microscopy/src/utils/loadSR.js | 49 +- extensions/dicom-pdf/.webpack/webpack.prod.js | 11 +- .../dicom-pdf/src/getSopClassHandlerModule.js | 30 +- extensions/dicom-pdf/src/index.tsx | 8 +- .../viewports/OHIFCornerstonePdfViewport.tsx | 8 +- .../dicom-video/.webpack/webpack.prod.js | 11 +- .../src/getSopClassHandlerModule.js | 46 +- extensions/dicom-video/src/index.tsx | 8 +- .../OHIFCornerstoneVideoViewport.tsx | 14 +- .../.webpack/webpack.prod.js | 11 +- .../src/_shared/createReportAsync.tsx | 6 +- .../src/_shared/createReportDialogPrompt.tsx | 4 +- .../TrackedMeasurementsContext.tsx | 45 +- .../hydrateStructuredReport.tsx | 10 +- .../measurementTrackingMachine.js | 43 +- .../promptBeginTracking.js | 9 +- .../promptHydrateStructuredReport.js | 27 +- .../promptSaveReport.js | 24 +- .../promptTrackNewSeries.js | 14 +- .../promptTrackNewStudy.js | 11 +- .../src/getContextModule.tsx | 15 +- .../src/getPanelModule.tsx | 11 +- .../src/getViewportModule.tsx | 10 +- .../PanelMeasurementTableTracking/index.tsx | 66 +- .../PanelStudyBrowserTracking.tsx | 147 +- .../PanelStudyBrowserTracking/index.tsx | 19 +- .../viewports/TrackedCornerstoneViewport.tsx | 88 +- .../test-extension/.webpack/webpack.dev.js | 1 - .../test-extension/.webpack/webpack.prod.js | 10 +- .../src/custom-attribute/maxNumImageFrames.ts | 4 +- .../src/custom-attribute/sameAs.ts | 13 +- .../contextMenuCodeItem.ts | 2 +- .../src/getCustomizationModule.ts | 6 +- extensions/test-extension/src/hpTestSwitch.ts | 9 +- extensions/tmtv/.webpack/webpack.dev.js | 2 +- extensions/tmtv/.webpack/webpack.prod.js | 11 +- extensions/tmtv/src/Panels/PanelPetSUV.tsx | 34 +- .../ExportReports.tsx | 12 +- .../PanelROIThresholdSegmentation.tsx | 38 +- .../ROIThresholdConfiguration.tsx | 42 +- .../segmentationEditHandler.tsx | 2 +- extensions/tmtv/src/commandsModule.js | 83 +- extensions/tmtv/src/getPanelModule.tsx | 6 +- extensions/tmtv/src/index.tsx | 7 +- extensions/tmtv/src/init.js | 12 +- extensions/tmtv/src/utils/calculateSUVPeak.ts | 36 +- extensions/tmtv/src/utils/calculateTMTV.ts | 10 +- extensions/tmtv/src/utils/colormaps/index.js | 10714 +++------------ .../src/utils/createAndDownloadTMTVReport.js | 9 +- .../RTStructureSet/RTSSReport.js | 45 +- .../measurements/AnnotationToPointData.js | 9 +- .../RectangleROIStartEndThreshold.js | 7 +- .../tmtv/src/utils/getThresholdValue.ts | 12 +- .../RectangleROIStartEndThreshold.js | 12 +- jest.config.js | 2 +- lerna.json | 3 +- modes/basic-dev-mode/.webpack/webpack.dev.js | 1 - modes/basic-dev-mode/.webpack/webpack.prod.js | 9 +- modes/basic-dev-mode/src/index.js | 12 +- modes/basic-test-mode/.webpack/webpack.dev.js | 1 - .../basic-test-mode/.webpack/webpack.prod.js | 8 +- modes/basic-test-mode/src/index.js | 30 +- modes/basic-test-mode/src/initToolGroups.js | 19 +- modes/longitudinal/.webpack/webpack.dev.js | 1 - modes/longitudinal/.webpack/webpack.prod.js | 8 +- modes/longitudinal/src/index.js | 25 +- modes/longitudinal/src/initToolGroups.js | 19 +- modes/microscopy/.prettierrc | 6 +- modes/microscopy/.webpack/webpack.dev.js | 3 - modes/microscopy/.webpack/webpack.prod.js | 8 +- modes/microscopy/babel.config.js | 6 +- modes/microscopy/src/index.tsx | 15 +- modes/tmtv/.webpack/webpack.dev.js | 1 - modes/tmtv/.webpack/webpack.prod.js | 9 +- modes/tmtv/src/index.js | 31 +- modes/tmtv/src/initToolGroups.js | 29 +- modes/tmtv/src/toolbarButtons.js | 7 +- .../src/utils/setCrosshairsConfiguration.js | 4 +- modes/tmtv/src/utils/setFusionActiveVolume.js | 4 +- package.json | 3 +- platform/app/.all-contributorsrc | 46 +- .../config/ohif-keycloak-realm.json | 120 +- .../ohif/login/resources/css/styles.css | 24 +- .../app/.webpack/rules/extractStyleChunks.js | 2 +- platform/app/.webpack/webpack.pwa.js | 8 +- .../app/.webpack/writePluginImportsFile.js | 68 +- platform/app/babel.config.js | 2 +- platform/app/cypress/fixtures/example.json | 2 +- .../cypress/integration/MultiStudy.spec.js | 12 +- .../integration/OHIFPdfDisplay.spec.js | 10 +- .../integration/OHIFVideoDisplay.spec.js | 14 +- .../customization/HangingProtocol.spec.js | 12 +- .../customization/OHIFDoubleClick.spec.js | 16 +- .../OHIFContextMenuCustomization.spec.js | 18 +- .../OHIFCornerstoneHotkeys.spec.js | 8 +- .../OHIFCornerstoneToolbar.spec.js | 16 +- .../OHIFDownloadSnapshotFile.spec.js | 14 +- .../OHIFGeneralViewer.spec.js | 20 +- .../OHIFMeasurementPanel.spec.js | 22 +- .../OHIFStudyBrowser.spec.js | 18 +- .../study-list/OHIFStudyList.spec.js | 16 +- .../cypress/integration/volume/MPR.spec.js | 14 +- platform/app/cypress/plugins/index.js | 2 +- platform/app/cypress/support/DragSimulator.js | 14 +- platform/app/cypress/support/aliases.js | 24 +- platform/app/cypress/support/commands.js | 167 +- platform/app/jestBabelTransform.js | 4 +- platform/app/postcss.config.js | 2 +- .../assets/yandex-browser-manifest.json | 2 +- platform/app/public/config/google.js | 3 +- platform/app/public/config/idc.js | 3 +- platform/app/public/config/local_static.js | 4 +- platform/app/public/es6-shim.min.js | 3571 ++++- platform/app/public/html-templates/index.html | 48 +- .../app/public/html-templates/rollbar.html | 297 +- platform/app/public/init-service-worker.js | 8 +- platform/app/public/oidc-client.min.js | 10896 +++++++++++++++- platform/app/public/polyfill.min.js | 185 +- platform/app/public/silent-refresh.html | 27 +- platform/app/src/App.tsx | 22 +- platform/app/src/__tests__/globalSetup.js | 2 +- platform/app/src/appInit.js | 15 +- platform/app/src/components/ViewportGrid.tsx | 84 +- platform/app/src/index.js | 5 +- platform/app/src/routes/DataSourceWrapper.tsx | 36 +- platform/app/src/routes/Debug.tsx | 35 +- platform/app/src/routes/Local/Local.tsx | 36 +- .../app/src/routes/Local/dicomFileLoader.js | 11 +- .../app/src/routes/Local/filesToStudies.js | 6 +- platform/app/src/routes/Mode/Compose.tsx | 4 +- platform/app/src/routes/Mode/Mode.tsx | 86 +- platform/app/src/routes/Mode/studiesList.ts | 10 +- platform/app/src/routes/NotFound/NotFound.tsx | 7 +- .../src/routes/SignoutCallbackComponent.tsx | 4 +- platform/app/src/routes/WorkList/WorkList.tsx | 52 +- platform/app/src/routes/index.tsx | 27 +- platform/app/src/service-worker.js | 6 +- .../app/src/utils/OpenIdConnectRoutes.tsx | 48 +- platform/app/tailwind.config.js | 323 +- platform/cli/src/commands/addExtension.js | 4 +- platform/cli/src/commands/addExtensions.js | 4 +- platform/cli/src/commands/addMode.js | 10 +- platform/cli/src/commands/createPackage.js | 34 +- platform/cli/src/commands/linkPackage.js | 12 +- platform/cli/src/commands/removeExtension.js | 7 +- platform/cli/src/commands/removeExtensions.js | 4 +- platform/cli/src/commands/unlinkPackage.js | 15 +- .../commands/utils/createDirectoryContents.js | 6 +- ...OhifExtensionsToRemoveAfterRemovingMode.js | 32 +- platform/cli/src/commands/utils/index.js | 5 +- .../private/manipulatePluginConfigFile.js | 4 +- platform/cli/src/commands/utils/validate.js | 28 +- platform/cli/src/index.js | 26 +- platform/cli/templates/extension/.prettierrc | 6 +- .../cli/templates/extension/src/index.tsx | 60 +- platform/cli/templates/mode/.prettierrc | 6 +- platform/cli/templates/mode/babel.config.js | 6 +- platform/cli/templates/mode/src/index.tsx | 6 +- platform/core/.all-contributorsrc | 42 +- platform/core/.webpack/webpack.dev.js | 2 - platform/core/.webpack/webpack.prod.js | 7 +- platform/core/babel.config.js | 2 +- .../core/src/DICOMWeb/getAttribute.test.js | 4 +- .../DICOMWeb/getAuthorizationHeader.test.js | 4 +- .../core/src/DICOMWeb/getModalities.test.js | 8 +- platform/core/src/DICOMWeb/getName.test.js | 7 +- platform/core/src/DICOMWeb/getNumber.test.js | 4 +- platform/core/src/DICOMWeb/getString.test.js | 4 +- platform/core/src/DICOMWeb/index.js | 9 +- .../core/src/__mocks__/dicomweb-client.js | 4 +- .../core/src/classes/CommandsManager.test.js | 25 +- platform/core/src/classes/CommandsManager.ts | 31 +- .../core/src/classes/HotkeysManager.test.js | 21 +- platform/core/src/classes/HotkeysManager.ts | 19 +- platform/core/src/classes/ImageSet.ts | 6 +- platform/core/src/classes/MetadataProvider.js | 51 +- .../src/extensions/ExtensionManager.test.js | 32 +- .../core/src/extensions/ExtensionManager.ts | 53 +- platform/core/src/index.ts | 5 +- .../CustomizationService.test.js | 59 +- .../CustomizationService.ts | 33 +- .../DicomMetadataStore/DicomMetadataStore.ts | 42 +- .../DicomMetadataStore/createStudyMetadata.js | 22 +- .../DisplaySetService/DisplaySetService.ts | 68 +- .../HangingProtocolService/HPMatcher.js | 18 +- .../HangingProtocolService.test.js | 10 +- .../HangingProtocolService.ts | 274 +- .../HangingProtocolService/ProtocolEngine.js | 14 +- .../custom-attribute/isDisplaySetFromUrl.ts | 9 +- .../numberOfDisplaySetsWithImages.ts | 3 +- .../seriesDescriptionsFromDisplaySets.ts | 3 +- .../lib/displayConstraint.js | 3 +- .../HangingProtocolService/lib/validator.js | 61 +- .../lib/validator.test.js | 414 +- .../MeasurementService.test.js | 66 +- .../MeasurementService/MeasurementService.ts | 92 +- .../core/src/services/ServicesManager.test.js | 12 +- platform/core/src/services/ServicesManager.ts | 4 +- .../services/ToolBarService/ToolbarService.ts | 25 +- .../core/src/services/UIModalService/index.ts | 5 +- .../services/UINotificationService/index.ts | 5 +- .../services/UIViewportDialogService/index.js | 15 +- .../UserAuthenticationService.js | 3 +- .../ViewportGridService.ts | 15 +- .../ViewportGridService/getPresentationIds.ts | 16 +- ...Interface.js => pubSubServiceInterface.ts} | 2 +- platform/core/src/services/index.ts | 4 +- platform/core/src/string.js | 5 +- platform/core/src/types/HangingProtocol.ts | 5 +- platform/core/src/types/IPubSub.ts | 5 +- platform/core/src/types/PanelModule.ts | 13 +- platform/core/src/utils/absoluteUrl.test.js | 4 +- .../core/src/utils/combineFrameInstance.ts | 32 +- platform/core/src/utils/debounce.js | 4 +- platform/core/src/utils/downloadCSVReport.js | 16 +- .../core/src/utils/generateAcceptHeader.ts | 3 +- platform/core/src/utils/getImageId.js | 6 +- .../core/src/utils/hierarchicalListUtils.js | 2 +- .../src/utils/hierarchicalListUtils.test.js | 24 +- .../core/src/utils/hotkeys/pausePlugin.js | 6 +- .../core/src/utils/hotkeys/recordPlugin.js | 12 +- platform/core/src/utils/isDicomUid.test.js | 6 +- .../src/utils/isDisplaySetReconstructable.js | 61 +- platform/core/src/utils/isImage.test.js | 108 +- .../core/src/utils/isLowPriorityModality.js | 8 +- .../core/src/utils/isLowPriorityModality.ts | 8 +- platform/core/src/utils/makeCancelable.js | 4 +- platform/core/src/utils/makeDeferred.js | 2 +- .../fetchPaletteColorLookupTableData.js | 28 +- .../getPixelSpacingInformation.js | 17 +- .../utils/metadataProvider/unpackOverlay.js | 3 +- platform/core/src/utils/objectPath.js | 4 +- .../core/src/utils/progressTrackingUtils.js | 28 +- .../src/utils/progressTrackingUtils.test.js | 6 +- platform/core/src/utils/resolveObjectPath.js | 4 +- .../core/src/utils/resolveObjectPath.test.js | 8 +- platform/core/src/utils/sopClassDictionary.js | 39 +- platform/core/src/utils/sortBy.js | 2 +- .../core/src/utils/sortInstancesByPosition.ts | 12 +- platform/core/src/utils/sortStudy.ts | 24 +- platform/core/src/utils/splitComma.ts | 4 +- .../subscribeToNextViewportGridChange.ts | 5 +- platform/docs/docusaurus.config.js | 3 +- platform/docs/pluginOHIFWebpackConfig.js | 2 +- platform/docs/src/css/custom.css | 8 +- platform/docs/src/utils/getMockedStudies.js | 3 +- platform/docs/tailwind.config.js | 383 +- platform/i18n/.webpack/webpack.dev.js | 1 - platform/i18n/.webpack/webpack.prod.js | 2 - platform/i18n/babel.config.js | 2 +- platform/i18n/src/config.js | 14 +- platform/i18n/src/index.js | 2 +- .../src/locales/ar/UserPreferencesModal.json | 2 +- .../i18n/src/locales/en-US/AboutModal.json | 2 +- .../i18n/src/locales/en-US/CineDialog.json | 2 +- .../en-US/DataSourceConfiguration.json | 2 +- .../i18n/src/locales/en-US/DatePicker.json | 2 +- .../src/locales/en-US/MeasurementTable.json | 2 +- .../locales/en-US/UserPreferencesModal.json | 2 +- .../locales/en-US/ViewportDownloadForm.json | 2 +- platform/i18n/src/locales/es/Buttons.json | 2 +- platform/i18n/src/locales/es/CineDialog.json | 2 +- platform/i18n/src/locales/es/Common.json | 2 +- platform/i18n/src/locales/es/Header.json | 2 +- .../src/locales/es/UserPreferencesModal.json | 2 +- platform/i18n/src/locales/fr/Buttons.json | 2 +- platform/i18n/src/locales/fr/CineDialog.json | 2 +- platform/i18n/src/locales/fr/Common.json | 2 +- platform/i18n/src/locales/fr/Header.json | 2 +- .../src/locales/fr/UserPreferencesModal.json | 2 +- platform/i18n/src/locales/ja-JP/Buttons.json | 2 +- .../i18n/src/locales/ja-JP/CineDialog.json | 2 +- platform/i18n/src/locales/ja-JP/Common.json | 2 +- platform/i18n/src/locales/ja-JP/Header.json | 2 +- .../locales/ja-JP/UserPreferencesModal.json | 2 +- platform/i18n/src/locales/nl/Buttons.json | 2 +- platform/i18n/src/locales/nl/Common.json | 2 +- platform/i18n/src/locales/nl/Header.json | 2 +- .../i18n/src/locales/pt-BR/AboutModal.json | 2 +- platform/i18n/src/locales/pt-BR/Buttons.json | 2 +- .../i18n/src/locales/pt-BR/CineDialog.json | 2 +- platform/i18n/src/locales/pt-BR/Common.json | 2 +- .../i18n/src/locales/pt-BR/DatePicker.json | 2 +- platform/i18n/src/locales/pt-BR/Header.json | 2 +- .../locales/pt-BR/UserPreferencesModal.json | 2 +- .../i18n/src/locales/test-LNG/AboutModal.json | 2 +- .../i18n/src/locales/test-LNG/CineDialog.json | 2 +- .../i18n/src/locales/test-LNG/DatePicker.json | 2 +- .../test-LNG/ViewportDownloadForm.json | 2 +- platform/i18n/src/locales/vi/Buttons.json | 2 +- platform/i18n/src/locales/vi/CineDialog.json | 2 +- platform/i18n/src/locales/vi/Common.json | 2 +- platform/i18n/src/locales/vi/Header.json | 2 +- platform/i18n/src/locales/vi/StudyList.json | 2 +- .../src/locales/vi/UserPreferencesModal.json | 2 +- platform/i18n/src/locales/zh/CineDialog.json | 2 +- platform/i18n/src/locales/zh/Common.json | 2 +- platform/i18n/src/locales/zh/Header.json | 2 +- .../i18n/src/locales/zh/MeasurementTable.json | 2 +- platform/i18n/src/locales/zh/StudyList.json | 2 +- .../src/locales/zh/UserPreferencesModal.json | 2 +- platform/ui/.storybook/main.ts | 4 +- platform/ui/.storybook/manager-head.html | 4 +- platform/ui/.storybook/preview.tsx | 8 +- platform/ui/.webpack/webpack.prod.js | 3 +- platform/ui/CHANGELOG.md | 306 +- .../src/components/AboutModal/AboutModal.tsx | 62 +- .../__stories__/aboutModal.stories.mdx | 8 +- platform/ui/src/components/Button/Button.tsx | 9 +- .../Button/__stories__/button.stories.mdx | 35 +- .../components/ButtonGroup/ButtonGroup.tsx | 16 +- .../__stories__/buttonGroup.stories.mdx | 8 +- .../ui/src/components/CheckBox/CheckBox.tsx | 19 +- .../CheckBox/__stories__/checkBox.stories.mdx | 16 +- .../src/components/CinePlayer/CinePlayer.tsx | 10 +- .../components/ContextMenu/ContextMenu.tsx | 11 +- .../__stories__/contextMenu.stories.mdx | 10 +- .../ui/src/components/DateRange/DateRange.css | 24 +- .../ui/src/components/DateRange/DateRange.tsx | 12 +- .../__stories__/dateRange.stories.mdx | 10 +- platform/ui/src/components/Dialog/Dialog.tsx | 18 +- platform/ui/src/components/Dialog/Footer.tsx | 5 +- platform/ui/src/components/Dialog/Header.tsx | 8 +- .../Dialog/__stories__/dialog.stories.mdx | 10 +- .../DisplaySetMessageListTooltip.tsx | 4 +- .../ui/src/components/Dropdown/Dropdown.tsx | 29 +- .../Dropdown/__stories__/dropdown.stories.mdx | 15 +- .../components/EmptyStudies/EmptyStudies.tsx | 12 +- .../ErrorBoundary/ErrorBoundary.tsx | 30 +- .../ExpandableToolbarButton.css | 4 +- .../ExpandableToolbarButton.tsx | 17 +- platform/ui/src/components/Header/Header.tsx | 23 +- .../Header/__stories__/Header.stories.mdx | 10 +- .../components/HotkeyField/HotkeyField.tsx | 9 +- .../HotkeysPreferences/HotkeysPreferences.tsx | 26 +- .../HotkeysPreferences/hotkeysValidators.js | 22 +- .../components/HotkeysPreferences/utils.js | 4 +- .../Icon/__stories__/icon.stories.mdx | 19 +- .../src/components/IconButton/IconButton.tsx | 15 +- .../ImageScrollbar/ImageScrollbar.tsx | 5 +- platform/ui/src/components/Input/Input.tsx | 7 +- .../Input/__stories__/input.stories.mdx | 10 +- .../InputDateRange/InputDateRange.tsx | 3 +- .../InputFilterText/InputFilterText.tsx | 11 +- .../_stories_/inputFilterText.stories.mdx | 31 +- .../src/components/InputGroup/InputGroup.tsx | 23 +- .../InputLabelWrapper/InputLabelWrapper.tsx | 13 +- .../InputMultiSelect/InputMultiSelect.tsx | 3 +- .../components/InputNumber/InputNumber.tsx | 15 +- .../__stories__/inputNumber.stories.mdx | 12 +- .../src/components/InputRange/InputRange.tsx | 15 +- .../__stories__/inputRange.stories.mdx | 14 +- .../ui/src/components/InputText/InputText.tsx | 10 +- platform/ui/src/components/Label/Label.tsx | 5 +- .../LayoutSelector/LayoutSelector.tsx | 2 +- .../__stories__/layoutSelector.stories.mdx | 5 +- .../components/LegacyButton/LegacyButton.tsx | 21 +- .../__stories__/legacyButton.stories.mdx | 41 +- .../LegacyCinePlayer/LegacyCinePlayer.tsx | 18 +- .../__stories__/legacyCinePlayer.stories.mdx | 5 +- .../LegacyPatientInfo/LegacyPatientInfo.tsx | 47 +- .../LegacyViewportActionBar.stories.tsx | 2 +- .../LegacyViewportActionBar.tsx | 66 +- .../ui/src/components/ListMenu/ListMenu.tsx | 2 +- .../LoadingIndicatorProgress.tsx | 7 +- .../LoadingIndicatorTotalPercent.tsx | 10 +- .../MeasurementTable/MeasurementItem.tsx | 43 +- .../MeasurementTable/MeasurementTable.tsx | 35 +- .../__stories__/measurementTable.stories.mdx | 11 +- platform/ui/src/components/Modal/Modal.tsx | 13 +- platform/ui/src/components/NavBar/NavBar.tsx | 2 +- .../components/Notification/Notification.tsx | 27 +- .../__stories__/notification.stories.mdx | 5 +- .../components/PatientInfo/PatientInfo.tsx | 44 +- .../ProgressLoadingBar/ProgressLoadingBar.tsx | 4 +- .../SegmentationConfig.tsx | 31 +- .../SegmentationGroup.tsx | 54 +- .../SegmentationGroupSegment.tsx | 34 +- .../SegmentationGroupTable.tsx | 11 +- .../segmentationGroupTable.stories.mdx | 160 +- .../SegmentationTable/SegmentationItem.tsx | 42 +- .../SegmentationTable/SegmentationTable.tsx | 14 +- .../__stories__/segmentationTable.stories.mdx | 7 +- platform/ui/src/components/Select/Select.css | 9 +- platform/ui/src/components/Select/Select.tsx | 21 +- .../ui/src/components/SidePanel/SidePanel.tsx | 61 +- .../__stories__/sidePanel.stories.mdx | 12 +- .../ui/src/components/Snackbar/Snackbar.css | 8 +- .../components/Snackbar/SnackbarContainer.tsx | 8 +- .../src/components/Snackbar/SnackbarItem.tsx | 30 +- .../components/SplitButton/SplitButton.tsx | 44 +- .../__stories__/splitButton.stories.mdx | 7 +- .../components/StudyBrowser/StudyBrowser.tsx | 28 +- .../__stories__/studyBrowser.stories.mdx | 14 +- .../ui/src/components/StudyItem/StudyItem.tsx | 26 +- .../__stories__/studyItem.stories.mdx | 10 +- .../StudyListExpandedRow.tsx | 17 +- .../studyListExpandedRow.stories.mdx | 3 +- .../StudyListFilter/StudyListFilter.tsx | 34 +- .../StudyListPagination.tsx | 21 +- .../StudyListTable/StudyListTable.tsx | 14 +- .../StudyListTable/StudyListTableRow.tsx | 22 +- .../components/StudySummary/StudySummary.tsx | 4 +- platform/ui/src/components/Table/Table.tsx | 6 +- .../ui/src/components/TableBody/TableBody.tsx | 11 +- .../ui/src/components/TableCell/TableCell.tsx | 2 +- .../ui/src/components/TableHead/TableHead.tsx | 8 +- .../ui/src/components/TableRow/TableRow.tsx | 11 +- .../components/ThemeWrapper/ThemeWrapper.tsx | 4 +- .../ui/src/components/Thumbnail/Thumbnail.tsx | 25 +- .../ThumbnailList/ThumbnailList.tsx | 22 +- .../ThumbnailNoImage/ThumbnailNoImage.tsx | 26 +- .../ThumbnailTracked/ThumbnailTracked.tsx | 47 +- .../ToolbarButton/ToolbarButton.tsx | 6 +- .../__stories__/toolbarButton.stories.mdx | 7 +- .../src/components/Tooltip/PortalTooltip.tsx | 16 +- .../components/Tooltip/PortalTooltipCard.tsx | 50 +- .../ui/src/components/Tooltip/Tooltip.tsx | 28 +- .../__stories__/toolbarButton.stories.mdx | 32 +- .../ui/src/components/Tooltip/tooltip.css | 20 +- .../TooltipClipboard/TooltipClipboard.tsx | 9 +- .../src/components/Typography/Typography.tsx | 3 +- .../__stories__/typography.stories.mdx | 150 +- .../UserPreferences/UserPreferences.tsx | 16 +- .../ui/src/components/Viewport/Viewport.tsx | 14 +- .../Viewport/__stories__/Viewport.stories.mdx | 12 +- .../ViewportActionBar/ViewportActionBar.tsx | 38 +- .../ViewportDownloadForm.tsx | 60 +- .../ViewportOverlay/ViewportOverlay.tsx | 8 +- .../components/ViewportPane/ViewportPane.tsx | 8 +- .../WindowLevelMenuItem.tsx | 14 +- .../ui/src/contextProviders/CineProvider.tsx | 21 +- .../src/contextProviders/DialogProvider.tsx | 60 +- .../contextProviders/DragAndDropProvider.tsx | 8 +- .../contextProviders/ImageViewerProvider.tsx | 13 +- .../ui/src/contextProviders/ModalProvider.tsx | 37 +- .../src/contextProviders/SnackbarProvider.tsx | 26 +- .../UserAuthenticationProvider.tsx | 24 +- .../ViewportDialogProvider.tsx | 19 +- .../contextProviders/ViewportGridProvider.tsx | 47 +- platform/ui/src/contextProviders/index.js | 36 +- platform/ui/src/hooks/useResizeObserver.ts | 5 +- .../ui/src/pages/Colors/BackgroundColor.tsx | 2 +- platform/ui/src/storybook/color/color.tsx | 7 +- platform/ui/src/storybook/colors.stories.mdx | 79 +- .../storybook/components/footer/footer.tsx | 6 +- .../storybook/components/heading/heading.tsx | 6 +- .../ui/src/storybook/components/index.tsx | 9 +- .../link-component/link-component.tsx | 7 +- .../components/section-name/section-name.tsx | 15 +- .../ui/src/storybook/contribute.stories.mdx | 62 +- .../functions/create-component-story.tsx | 6 +- platform/ui/src/storybook/header/header.tsx | 5 +- platform/ui/src/storybook/welcome.stories.mdx | 47 +- platform/ui/src/types/ThumbnailType.ts | 6 +- .../src/views/StudyList/components/Header.js | 9 +- platform/ui/src/views/Viewer/Viewer.js | 8 +- .../ui/src/views/Viewer/components/Header.js | 15 +- platform/ui/tailwind.config.js | 314 +- postcss.config.js | 2 +- publish-package.mjs | 14 +- publish-version.mjs | 25 +- tsconfig.json | 6 +- version.json | 2 +- version.mjs | 32 +- yarn.lock | 1452 +- 656 files changed, 21737 insertions(+), 20628 deletions(-) rename platform/core/src/services/_shared/{pubSubServiceInterface.js => pubSubServiceInterface.ts} (99%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9aa3bc95c..6bf4b7692 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -269,8 +269,7 @@ jobs: git config --global user.name "ohif-bot" - run: name: Authenticate with NPM registry - command: - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc + command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc - run: name: Increase the event emitter limit command: | @@ -289,8 +288,7 @@ jobs: node ./publish-version.mjs - run: name: Again set the NPM registry (was deleted in the version script) - command: - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc + command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc - run: name: publish package dist command: | @@ -337,8 +335,7 @@ jobs: - setup_remote_docker: docker_layer_caching: false - run: - name: - Build and push Docker image from the master branch (beta releases) + name: Build and push Docker image from the master branch (beta releases) command: | echo $(ls -l) @@ -417,8 +414,8 @@ workflows: store_artifacts: false working_directory: platform/app build: - yarn test:data && npx cross-env QUICK_BUILD=true - APP_CONFIG=config/dicomweb-server.js yarn run build + yarn test:data && npx cross-env QUICK_BUILD=true APP_CONFIG=config/dicomweb-server.js + yarn run build # start server --> verify running --> percy + chrome + cypress command: yarn run test:e2e:dist cache-key: 'yarn-packages-{{ checksum "yarn.lock" }}' diff --git a/.eslintrc.json b/.eslintrc.json index eecd3d057..bc37a7dcf 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,10 +1,5 @@ { - "plugins": [ - "@typescript-eslint", - "import", - "eslint-plugin-tsdoc", - "prettier" - ], + "plugins": ["@typescript-eslint", "import", "eslint-plugin-tsdoc", "prettier"], "extends": [ "react-app", "eslint:recommended", diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 5a2907b18..847fc6cdf 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -39,8 +39,7 @@ body: attributes: label: The current behavior description: - 'A clear and concise description of what happens instead of the expected - behavior.' + 'A clear and concise description of what happens instead of the expected behavior.' validations: required: true @@ -48,8 +47,7 @@ body: id: expected_behavior attributes: label: The expected behavior - description: - 'A clear and concise description of what you expected to happen.' + description: 'A clear and concise description of what you expected to happen.' validations: required: true @@ -81,6 +79,6 @@ body: - type: markdown attributes: value: > - > :warning: Reports we cannot reproduce are at risk of being marked - stale and > closed. The more information you can provide, the more - likely we are to look > into and address your issue. + > :warning: Reports we cannot reproduce are at risk of being marked stale and > closed. The + more information you can provide, the more likely we are to look > into and address your + issue. diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index e03e8d9af..0331ba9bf 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -20,17 +20,15 @@ body: attributes: label: 'What feature or change would you like to see made?' description: - 'Please include as much detail as possible including possibly mock up - screen shots, workflow or logic flow diagrams etc.' + 'Please include as much detail as possible including possibly mock up screen shots, workflow + or logic flow diagrams etc.' placeholder: '...' validations: required: true - type: textarea attributes: label: 'Why should we prioritize this feature?' - description: - 'Discuss if and how the requested feature interacts with existing - features.' + description: 'Discuss if and how the requested feature interacts with existing features.' placeholder: '...' validations: required: true diff --git a/.github/stale.yml b/.github/stale.yml index 4d6cdd4e3..28535cca6 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -19,8 +19,7 @@ exemptLabels: staleLabel: 'Stale :baguette_bread:' # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. + This issue has been automatically marked as stale because it has not had recent activity. It will + be closed if no further activity occurs. Thank you for your contributions. # Comment to post when closing a stale issue. Set to `false` to disable closeComment: false diff --git a/.netlify/www/index.html b/.netlify/www/index.html index 3d889be82..c817960c5 100644 --- a/.netlify/www/index.html +++ b/.netlify/www/index.html @@ -1,23 +1,21 @@ + + OHIF Viewer: Deploy Preview + - - OHIF Viewer: Deploy Preview - - - -

Index of Previews

- - - + +

Index of Previews

+ + diff --git a/.prettierrc b/.prettierrc index 6a64b74e2..c7142c21b 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,9 +1,11 @@ { + "plugins": ["prettier-plugin-tailwindcss"], "trailingComma": "es5", - "printWidth": 80, + "printWidth": 100, "proseWrap": "always", "tabWidth": 2, "semi": true, "singleQuote": true, - "arrowParens": "avoid" + "arrowParens": "avoid", + "singleAttributePerLine": true } diff --git a/.webpack/helpers/excludeNodeModulesExcept.js b/.webpack/helpers/excludeNodeModulesExcept.js index f7234de1a..ce4d3c3e2 100644 --- a/.webpack/helpers/excludeNodeModulesExcept.js +++ b/.webpack/helpers/excludeNodeModulesExcept.js @@ -5,11 +5,11 @@ function excludeNodeModulesExcept(modules) { if (pathSep == '\\') // must be quoted for use in a regexp: pathSep = '\\\\'; - var moduleRegExps = modules.map(function(modName) { + var moduleRegExps = modules.map(function (modName) { return new RegExp('node_modules' + pathSep + modName); }); - return function(modulePath) { + return function (modulePath) { if (/node_modules/.test(modulePath)) { for (var i = 0; i < moduleRegExps.length; i++) if (moduleRegExps[i].test(modulePath)) return false; diff --git a/.webpack/rules/cssToJavaScript.js b/.webpack/rules/cssToJavaScript.js index 05365d31b..0cd60e909 100644 --- a/.webpack/rules/cssToJavaScript.js +++ b/.webpack/rules/cssToJavaScript.js @@ -1,9 +1,7 @@ const autoprefixer = require('autoprefixer'); const path = require('path'); const tailwindcss = require('tailwindcss'); -const tailwindConfigPath = path.resolve( - '../../platform/app/tailwind.config.js' -); +const tailwindConfigPath = path.resolve('../../platform/app/tailwind.config.js'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const devMode = process.env.NODE_ENV !== 'production'; diff --git a/.webpack/webpack.base.js b/.webpack/webpack.base.js index 5de575af8..88a009c21 100644 --- a/.webpack/webpack.base.js +++ b/.webpack/webpack.base.js @@ -7,8 +7,7 @@ const fs = require('fs'); const webpack = require('webpack'); // ~~ PLUGINS -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin; +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const TerserJSPlugin = require('terser-webpack-plugin'); // ~~ PackageJSON @@ -26,11 +25,9 @@ const QUICK_BUILD = process.env.QUICK_BUILD; const BUILD_NUM = process.env.CIRCLE_BUILD_NUM || '0'; // read from ../version.txt -const VERSION_NUMBER = - fs.readFileSync(path.join(__dirname, '../version.txt'), 'utf8') || ''; +const VERSION_NUMBER = fs.readFileSync(path.join(__dirname, '../version.txt'), 'utf8') || ''; -const COMMIT_HASH = - fs.readFileSync(path.join(__dirname, '../commit.txt'), 'utf8') || ''; +const COMMIT_HASH = fs.readFileSync(path.join(__dirname, '../commit.txt'), 'utf8') || ''; // dotenv.config(); @@ -105,10 +102,7 @@ module.exports = (env, argv, { SRC_DIR, ENTRY }) => { alias: { // Viewer project '@': path.resolve(__dirname, '../platform/app/src'), - '@components': path.resolve( - __dirname, - '../platform/app/src/components' - ), + '@components': path.resolve(__dirname, '../platform/app/src/components'), '@hooks': path.resolve(__dirname, '../platform/app/src/hooks'), '@routes': path.resolve(__dirname, '../platform/app/src/routes'), '@state': path.resolve(__dirname, '../platform/app/src/state'), @@ -135,7 +129,7 @@ module.exports = (env, argv, { SRC_DIR, ENTRY }) => { fs: false, path: false, zlib: false, - "buffer": require.resolve("buffer") + buffer: require.resolve('buffer'), }, }, plugins: [ @@ -150,15 +144,9 @@ module.exports = (env, argv, { SRC_DIR, ENTRY }) => { 'process.env.COMMIT_HASH': JSON.stringify(COMMIT_HASH), /* i18n */ 'process.env.USE_LOCIZE': JSON.stringify(process.env.USE_LOCIZE || ''), - 'process.env.LOCIZE_PROJECTID': JSON.stringify( - process.env.LOCIZE_PROJECTID || '' - ), - 'process.env.LOCIZE_API_KEY': JSON.stringify( - process.env.LOCIZE_API_KEY || '' - ), - 'process.env.REACT_APP_I18N_DEBUG': JSON.stringify( - process.env.REACT_APP_I18N_DEBUG || '' - ), + 'process.env.LOCIZE_PROJECTID': JSON.stringify(process.env.LOCIZE_PROJECTID || ''), + 'process.env.LOCIZE_API_KEY': JSON.stringify(process.env.LOCIZE_API_KEY || ''), + 'process.env.REACT_APP_I18N_DEBUG': JSON.stringify(process.env.REACT_APP_I18N_DEBUG || ''), }), new webpack.ProvidePlugin({ Buffer: ['buffer', 'Buffer'], diff --git a/babel.config.js b/babel.config.js index 1b20bbf6b..b55cbfdfa 100644 --- a/babel.config.js +++ b/babel.config.js @@ -3,11 +3,7 @@ const { extendDefaultPlugins } = require('svgo'); module.exports = { babelrcRoots: ['./platform/*', './extensions/*', './modes/*'], - presets: [ - '@babel/preset-env', - '@babel/preset-react', - '@babel/preset-typescript', - ], + presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript'], plugins: [ [ 'inline-react-svg', diff --git a/extensions/_example/src/index.js b/extensions/_example/src/index.js index 12c027cb8..08b3da836 100644 --- a/extensions/_example/src/index.js +++ b/extensions/_example/src/index.js @@ -54,11 +54,7 @@ const getCommandsModule = () => ({ const ExampleContext = React.createContext(); function ExampleContextProvider({ children }) { - return ( - - {children} - - ); + return {children}; } const getContextModule = () => [ diff --git a/extensions/cornerstone-dicom-rt/.webpack/webpack.prod.js b/extensions/cornerstone-dicom-rt/.webpack/webpack.prod.js index 5182c4a6a..4ee5cc9fc 100644 --- a/extensions/cornerstone-dicom-rt/.webpack/webpack.prod.js +++ b/extensions/cornerstone-dicom-rt/.webpack/webpack.prod.js @@ -3,8 +3,7 @@ const { merge } = require('webpack-merge'); const path = require('path'); const webpackCommon = require('./../../../.webpack/webpack.base.js'); const pkg = require('./../package.json'); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin; +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const ROOT_DIR = path.join(__dirname, './..'); const SRC_DIR = path.join(__dirname, '../src'); @@ -38,13 +37,7 @@ module.exports = (env, argv) => { libraryTarget: 'umd', filename: pkg.main, }, - externals: [ - /\b(vtk.js)/, - /\b(dcmjs)/, - /\b(gl-matrix)/, - /^@ohif/, - /^@cornerstonejs/, - ], + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], plugins: [ new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, diff --git a/extensions/cornerstone-dicom-rt/babel.config.js b/extensions/cornerstone-dicom-rt/babel.config.js index 92fbbdeaf..a38ddda21 100644 --- a/extensions/cornerstone-dicom-rt/babel.config.js +++ b/extensions/cornerstone-dicom-rt/babel.config.js @@ -10,7 +10,7 @@ module.exports = { modules: 'commonjs', debug: false, }, - "@babel/preset-typescript", + '@babel/preset-typescript', ], '@babel/preset-react', ], @@ -26,7 +26,7 @@ module.exports = { // WebPack handles ES6 --> Target Syntax ['@babel/preset-env', { modules: false }], '@babel/preset-react', - "@babel/preset-typescript", + '@babel/preset-typescript', ], ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'], }, @@ -35,7 +35,7 @@ module.exports = { // WebPack handles ES6 --> Target Syntax ['@babel/preset-env', { modules: false }], '@babel/preset-react', - "@babel/preset-typescript", + '@babel/preset-typescript', ], plugins: ['react-hot-loader/babel'], ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'], diff --git a/extensions/cornerstone-dicom-rt/src/getSopClassHandlerModule.js b/extensions/cornerstone-dicom-rt/src/getSopClassHandlerModule.js index 81ba6aab9..a7a232f19 100644 --- a/extensions/cornerstone-dicom-rt/src/getSopClassHandlerModule.js +++ b/extensions/cornerstone-dicom-rt/src/getSopClassHandlerModule.js @@ -7,11 +7,7 @@ const sopClassUids = ['1.2.840.10008.5.1.4.1.1.481.3']; let loadPromises = {}; -function _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager -) { +function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { const instance = instances[0]; const { @@ -56,10 +52,7 @@ function _getDisplaySetsFromSeries( }; let referencedSeriesSequence = instance.ReferencedSeriesSequence; - if ( - instance.ReferencedFrameOfReferenceSequence && - !instance.ReferencedSeriesSequence - ) { + if (instance.ReferencedFrameOfReferenceSequence && !instance.ReferencedSeriesSequence) { instance.ReferencedSeriesSequence = _deriveReferencedSeriesSequenceFromFrameOfReferenceSequence( instance.ReferencedFrameOfReferenceSequence ); @@ -72,8 +65,7 @@ function _getDisplaySetsFromSeries( const referencedSeries = referencedSeriesSequence[0]; - displaySet.referencedImages = - instance.ReferencedSeriesSequence.ReferencedInstanceSequence; + displaySet.referencedImages = instance.ReferencedSeriesSequence.ReferencedInstanceSequence; displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID; displaySet.getReferenceDisplaySet = () => { @@ -88,14 +80,12 @@ function _getDisplaySetsFromSeries( const referencedDisplaySet = referencedDisplaySets[0]; - displaySet.referencedDisplaySetInstanceUID = - referencedDisplaySet.displaySetInstanceUID; + displaySet.referencedDisplaySetInstanceUID = referencedDisplaySet.displaySetInstanceUID; return referencedDisplaySet; }; - displaySet.load = ({ headers }) => - _load(displaySet, servicesManager, extensionManager, headers); + displaySet.load = ({ headers }) => _load(displaySet, servicesManager, extensionManager, headers); return [displaySet]; } @@ -194,11 +184,7 @@ function getSopClassHandlerModule({ servicesManager, extensionManager }) { name: 'dicom-rt', sopClassUids, getDisplaySetsFromSeries: instances => { - return _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager - ); + return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager); }, }, ]; diff --git a/extensions/cornerstone-dicom-rt/src/index.tsx b/extensions/cornerstone-dicom-rt/src/index.tsx index e444b0708..a8541a303 100644 --- a/extensions/cornerstone-dicom-rt/src/index.tsx +++ b/extensions/cornerstone-dicom-rt/src/index.tsx @@ -5,9 +5,7 @@ import getSopClassHandlerModule from './getSopClassHandlerModule'; import hydrateRTDisplaySet from './utils/_hydrateRT'; const Component = React.lazy(() => { - return import( - /* webpackPrefetch: true */ './viewports/OHIFCornerstoneRTViewport' - ); + return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstoneRTViewport'); }); const OHIFCornerstoneRTViewport = props => { diff --git a/extensions/cornerstone-dicom-rt/src/loadRTStruct.js b/extensions/cornerstone-dicom-rt/src/loadRTStruct.js index 253781700..cf58eb40a 100644 --- a/extensions/cornerstone-dicom-rt/src/loadRTStruct.js +++ b/extensions/cornerstone-dicom-rt/src/loadRTStruct.js @@ -25,23 +25,13 @@ async function checkAndLoadContourData(instance, datasource) { if (Array.isArray(contourData)) { promisesMap.has(referencedROINumber) - ? promisesMap - .get(referencedROINumber) - .push(Promise.resolve(contourData)) - : promisesMap.set(referencedROINumber, [ - Promise.resolve(contourData), - ]); + ? promisesMap.get(referencedROINumber).push(Promise.resolve(contourData)) + : promisesMap.set(referencedROINumber, [Promise.resolve(contourData)]); } else if (contourData && contourData.BulkDataURI) { const bulkDataURI = contourData.BulkDataURI; - if ( - !datasource || - !datasource.retrieve || - !datasource.retrieve.bulkDataURI - ) { - return Promise.reject( - 'Invalid datasource object or retrieve function' - ); + if (!datasource || !datasource.retrieve || !datasource.retrieve.bulkDataURI) { + return Promise.reject('Invalid datasource object or retrieve function'); } const bulkDataPromise = datasource.retrieve.bulkDataURI({ @@ -74,10 +64,7 @@ async function checkAndLoadContourData(instance, datasource) { ROIContour.ContourSequence.forEach((Contour, index) => { const promise = resolvedPromises[index]; if (promise.status === 'fulfilled') { - if ( - Array.isArray(promise.value) && - promise.value.every(Number.isFinite) - ) { + if (Array.isArray(promise.value) && promise.value.every(Number.isFinite)) { // If promise.value is already an array of numbers, use it directly Contour.ContourData = promise.value; } else { @@ -85,13 +72,8 @@ async function checkAndLoadContourData(instance, datasource) { const uint8Array = new Uint8Array(promise.value); const textDecoder = new TextDecoder(); const dataUint8Array = textDecoder.decode(uint8Array); - if ( - typeof dataUint8Array === 'string' && - dataUint8Array.includes('\\') - ) { - Contour.ContourData = dataUint8Array - .split('\\') - .map(parseFloat); + if (typeof dataUint8Array === 'string' && dataUint8Array.includes('\\')) { + Contour.ContourData = dataUint8Array.split('\\').map(parseFloat); } else { Contour.ContourData = []; } @@ -120,9 +102,8 @@ export default async function loadRTStruct( const { bulkDataURI } = dataSource.getConfig?.() || {}; const { dicomLoaderService } = utilityModule.exports; - const imageIdSopInstanceUidPairs = _getImageIdSopInstanceUidPairsForDisplaySet( - referencedDisplaySet - ); + const imageIdSopInstanceUidPairs = + _getImageIdSopInstanceUidPairsForDisplaySet(referencedDisplaySet); // Set here is loading is asynchronous. // If this function throws its set back to false. @@ -137,20 +118,14 @@ export default async function loadRTStruct( ); const dicomData = DicomMessage.readFile(segArrayBuffer); - const rtStructDataset = DicomMetaDictionary.naturalizeDataset( - dicomData.dict - ); + const rtStructDataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict); rtStructDataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta); instance = rtStructDataset; } else { await checkAndLoadContourData(instance, dataSource); } - const { - StructureSetROISequence, - ROIContourSequence, - RTROIObservationsSequence, - } = instance; + const { StructureSetROISequence, ROIContourSequence, RTROIObservationsSequence } = instance; // Define our structure set entry and add it to the rtstruct module state. const structureSet = { @@ -174,12 +149,8 @@ export default async function loadRTStruct( const contourPoints = []; for (let c = 0; c < ContourSequenceArray.length; c++) { - const { - ContourImageSequence, - ContourData, - NumberOfContourPoints, - ContourGeometricType, - } = ContourSequenceArray[c]; + const { ContourImageSequence, ContourData, NumberOfContourPoints, ContourGeometricType } = + ContourSequenceArray[c]; let isSupported = false; @@ -229,9 +200,7 @@ const _getImageId = (imageIdSopInstanceUidPairs, sopInstanceUID) => { imageIdSopInstanceUidPairsEntry.sopInstanceUID === sopInstanceUID ); - return imageIdSopInstanceUidPairsEntry - ? imageIdSopInstanceUidPairsEntry.imageId - : null; + return imageIdSopInstanceUidPairsEntry ? imageIdSopInstanceUidPairsEntry.imageId : null; }; function _getImageIdSopInstanceUidPairsForDisplaySet(referencedDisplaySet) { @@ -252,8 +221,7 @@ function _setROIContourMetadata( isSupported ) { const StructureSetROI = StructureSetROISequence.find( - structureSetROI => - structureSetROI.ROINumber === ROIContour.ReferencedROINumber + structureSetROI => structureSetROI.ROINumber === ROIContour.ReferencedROINumber ); const ROIContourData = { @@ -293,23 +261,15 @@ function _setROIContourDataColor(ROIContour, ROIContourData) { } } -function _setROIContourRTROIObservations( - ROIContourData, - RTROIObservationsSequence, - ROINumber -) { +function _setROIContourRTROIObservations(ROIContourData, RTROIObservationsSequence, ROINumber) { const RTROIObservations = RTROIObservationsSequence.find( RTROIObservations => RTROIObservations.ReferencedROINumber === ROINumber ); if (RTROIObservations) { // Deep copy so we don't keep the reference to the dcmjs dataset entry. - const { - ObservationNumber, - ROIObservationDescription, - RTROIInterpretedType, - ROIInterpreter, - } = RTROIObservations; + const { ObservationNumber, ROIObservationDescription, RTROIInterpretedType, ROIInterpreter } = + RTROIObservations; ROIContourData.RTROIObservations = { ObservationNumber, diff --git a/extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts b/extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts index f1b106c08..d61e9e186 100644 --- a/extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts +++ b/extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts @@ -1,13 +1,6 @@ -async function _hydrateRTDisplaySet({ - rtDisplaySet, - viewportId, - servicesManager, -}) { - const { - segmentationService, - hangingProtocolService, - viewportGridService, - } = servicesManager.services; +async function _hydrateRTDisplaySet({ rtDisplaySet, viewportId, servicesManager }) { + const { segmentationService, hangingProtocolService, viewportGridService } = + servicesManager.services; const displaySetInstanceUID = rtDisplaySet.referencedDisplaySetInstanceUID; diff --git a/extensions/cornerstone-dicom-rt/src/utils/initRTToolGroup.ts b/extensions/cornerstone-dicom-rt/src/utils/initRTToolGroup.ts index 826e3b9a6..aaa27c28f 100644 --- a/extensions/cornerstone-dicom-rt/src/utils/initRTToolGroup.ts +++ b/extensions/cornerstone-dicom-rt/src/utils/initRTToolGroup.ts @@ -1,10 +1,5 @@ -function createRTToolGroupAndAddTools( - ToolGroupService, - customizationService, - toolGroupId -) { - const { tools } = - customizationService.get('cornerstone.overlayViewportTools') ?? {}; +function createRTToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) { + const { tools } = customizationService.get('cornerstone.overlayViewportTools') ?? {}; return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {}); } diff --git a/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts b/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts index b48bca363..c6069abc1 100644 --- a/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts +++ b/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts @@ -16,7 +16,7 @@ function promptHydrateRT({ }) { const { uiViewportDialogService } = servicesManager.services; - return new Promise(async function(resolve, reject) { + return new Promise(async function (resolve, reject) { const promptResult = await _askHydrate(uiViewportDialogService, viewportId); if (promptResult === RESPONSE.HYDRATE_SEG) { @@ -37,7 +37,7 @@ function promptHydrateRT({ } function _askHydrate(uiViewportDialogService, viewportId) { - return new Promise(function(resolve, reject) { + return new Promise(function (resolve, reject) { const message = 'Do you want to open this Segmentation?'; const actions = [ { diff --git a/extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx b/extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx index 473d77480..3dd9588d7 100644 --- a/extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx +++ b/extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx @@ -1,11 +1,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import OHIF, { utils } from '@ohif/core'; -import { - ViewportActionBar, - useViewportGrid, - LoadingIndicatorTotalPercent, -} from '@ohif/ui'; +import { ViewportActionBar, useViewportGrid, LoadingIndicatorTotalPercent } from '@ohif/ui'; import _hydrateRTdisplaySet from '../utils/_hydrateRT'; import promptHydrateRT from '../utils/promptHydrateRT'; @@ -71,9 +67,7 @@ function OHIFCornerstoneRTViewport(props) { const { viewports, activeViewportId } = viewportGrid; const referencedDisplaySet = rtDisplaySet.getReferenceDisplaySet(); - const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata( - referencedDisplaySet - ); + const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet); referencedDisplaySetRef.current = { displaySet: referencedDisplaySet, @@ -106,9 +100,7 @@ function OHIFCornerstoneRTViewport(props) { '@ohif/extension-cornerstone.viewportModule.cornerstone' ); - const { - displaySet: referencedDisplaySet, - } = referencedDisplaySetRef.current; + const { displaySet: referencedDisplaySet } = referencedDisplaySetRef.current; // Todo: jump to the center of the first segment return ( @@ -146,11 +138,7 @@ function OHIFCornerstoneRTViewport(props) { newSelectedSegmentIndex = numberOfSegments - 1; } - segmentationService.jumpToSegmentCenter( - segmentationId, - newSelectedSegmentIndex, - toolGroupId - ); + segmentationService.jumpToSegmentCenter(segmentationId, newSelectedSegmentIndex, toolGroupId); setSelectedSegment(newSelectedSegmentIndex); }, [selectedSegment] @@ -177,18 +165,14 @@ function OHIFCornerstoneRTViewport(props) { const { unsubscribe } = segmentationService.subscribe( segmentationService.EVENTS.SEGMENTATION_LOADING_COMPLETE, evt => { - if ( - evt.rtDisplaySet.displaySetInstanceUID === - rtDisplaySet.displaySetInstanceUID - ) { + if (evt.rtDisplaySet.displaySetInstanceUID === rtDisplaySet.displaySetInstanceUID) { setRtIsLoading(false); } if (evt.overlappingSegments) { uiNotificationService.show({ title: 'Overlapping Segments', - message: - 'Overlapping segments detected which is not currently supported', + message: 'Overlapping segments detected which is not currently supported', type: 'warning', }); } @@ -224,9 +208,7 @@ function OHIFCornerstoneRTViewport(props) { displaySetService.EVENTS.DISPLAY_SETS_REMOVED, ({ displaySetInstanceUIDs }) => { const activeViewport = viewports.get(activeViewportId); - if ( - displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID) - ) { + if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) { viewportGridService.setDisplaySetsForViewport({ viewportId: activeViewportId, displaySetInstanceUIDs: [], @@ -247,19 +229,13 @@ function OHIFCornerstoneRTViewport(props) { return; } - toolGroup = createRTToolGroupAndAddTools( - toolGroupService, - customizationService, - toolGroupId - ); + toolGroup = createRTToolGroupAndAddTools(toolGroupService, customizationService, toolGroupId); setToolGroupCreated(true); return () => { // remove the segmentation representations if seg displayset changed - segmentationService.removeSegmentationRepresentationFromToolGroup( - toolGroupId - ); + segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId); toolGroupService.destroyToolGroup(toolGroupId); }; @@ -270,9 +246,7 @@ function OHIFCornerstoneRTViewport(props) { return () => { // remove the segmentation representations if seg displayset changed - segmentationService.removeSegmentationRepresentationFromToolGroup( - toolGroupId - ); + segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId); referencedDisplaySetRef.current = null; }; }, [rtDisplaySet]); @@ -351,26 +325,22 @@ function OHIFCornerstoneRTViewport(props) { currentSeries: SeriesNumber, seriesDescription: `RT Viewport ${SeriesDescription}`, patientInformation: { - patientName: PatientName - ? OHIF.utils.formatPN(PatientName.Alphabetic) - : '', + patientName: PatientName ? OHIF.utils.formatPN(PatientName.Alphabetic) : '', patientSex: PatientSex || '', patientAge: PatientAge || '', MRN: PatientID || '', thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '', spacing: - SpacingBetweenSlices !== undefined - ? `${SpacingBetweenSlices.toFixed(2)}mm` - : '', + SpacingBetweenSlices !== undefined ? `${SpacingBetweenSlices.toFixed(2)}mm` : '', scanner: ManufacturerModelName || '', }, }} /> -
+
{rtIsLoading && ( ; - ToolTipMessage = () => ( -
This Segmentation is loaded in the segmentation panel
- ); + ToolTipMessage = () =>
This Segmentation is loaded in the segmentation panel
; break; case false: StatusIcon = () => ( - + ); ToolTipMessage = () =>
Click LOAD to load RTSTRUCT.
; } const StatusArea = () => ( -
-
+
+
RTSTRUCT
{!isHydrated && (
@@ -46,7 +47,10 @@ export default function _getStatusComponent({ isHydrated, onStatusClick }) { return ( <> {ToolTipMessage && ( - } position="bottom-left"> + } + position="bottom-left" + > )} diff --git a/extensions/cornerstone-dicom-seg/.webpack/webpack.prod.js b/extensions/cornerstone-dicom-seg/.webpack/webpack.prod.js index 017e4bbf0..6b6a4f71d 100644 --- a/extensions/cornerstone-dicom-seg/.webpack/webpack.prod.js +++ b/extensions/cornerstone-dicom-seg/.webpack/webpack.prod.js @@ -40,13 +40,7 @@ module.exports = (env, argv) => { libraryTarget: 'umd', filename: pkg.main, }, - externals: [ - /\b(vtk.js)/, - /\b(dcmjs)/, - /\b(gl-matrix)/, - /^@ohif/, - /^@cornerstonejs/, - ], + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], plugins: [ new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, diff --git a/extensions/cornerstone-dicom-seg/babel.config.js b/extensions/cornerstone-dicom-seg/babel.config.js index 92fbbdeaf..a38ddda21 100644 --- a/extensions/cornerstone-dicom-seg/babel.config.js +++ b/extensions/cornerstone-dicom-seg/babel.config.js @@ -10,7 +10,7 @@ module.exports = { modules: 'commonjs', debug: false, }, - "@babel/preset-typescript", + '@babel/preset-typescript', ], '@babel/preset-react', ], @@ -26,7 +26,7 @@ module.exports = { // WebPack handles ES6 --> Target Syntax ['@babel/preset-env', { modules: false }], '@babel/preset-react', - "@babel/preset-typescript", + '@babel/preset-typescript', ], ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'], }, @@ -35,7 +35,7 @@ module.exports = { // WebPack handles ES6 --> Target Syntax ['@babel/preset-env', { modules: false }], '@babel/preset-react', - "@babel/preset-typescript", + '@babel/preset-typescript', ], plugins: ['react-hot-loader/babel'], ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'], diff --git a/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.js b/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.js index b46b56e36..33a4b523a 100644 --- a/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.js +++ b/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.js @@ -1,10 +1,5 @@ import { utils } from '@ohif/core'; -import { - metaData, - cache, - triggerEvent, - eventTarget, -} from '@cornerstonejs/core'; +import { metaData, cache, triggerEvent, eventTarget } from '@cornerstonejs/core'; import { adaptersSEG, Enums } from '@cornerstonejs/adapters'; import { SOPClassHandlerId } from './id'; @@ -14,11 +9,7 @@ const sopClassUids = ['1.2.840.10008.5.1.4.1.1.66.4']; let loadPromises = {}; -function _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager -) { +function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { const instance = instances[0]; const { @@ -71,8 +62,7 @@ function _getDisplaySetsFromSeries( const referencedSeries = referencedSeriesSequence[0]; - displaySet.referencedImages = - instance.ReferencedSeriesSequence.ReferencedInstanceSequence; + displaySet.referencedImages = instance.ReferencedSeriesSequence.ReferencedInstanceSequence; displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID; displaySet.getReferenceDisplaySet = () => { @@ -87,8 +77,7 @@ function _getDisplaySetsFromSeries( const referencedDisplaySet = referencedDisplaySets[0]; - displaySet.referencedDisplaySetInstanceUID = - referencedDisplaySet.displaySetInstanceUID; + displaySet.referencedDisplaySetInstanceUID = referencedDisplaySet.displaySetInstanceUID; // Todo: this needs to be able to work with other reference volumes (other than streaming) such as nifti, etc. displaySet.referencedVolumeURI = referencedDisplaySet.displaySetInstanceUID; @@ -121,10 +110,7 @@ function _load(segDisplaySet, servicesManager, extensionManager, headers) { // We don't want to fire multiple loads, so we'll wait for the first to finish // and also return the same promise to any other callers. loadPromises[SOPInstanceUID] = new Promise(async (resolve, reject) => { - if ( - !segDisplaySet.segments || - Object.keys(segDisplaySet.segments).length === 0 - ) { + if (!segDisplaySet.segments || Object.keys(segDisplaySet.segments).length === 0) { await _loadSegments({ extensionManager, servicesManager, @@ -149,12 +135,7 @@ function _load(segDisplaySet, servicesManager, extensionManager, headers) { return loadPromises[SOPInstanceUID]; } -async function _loadSegments({ - extensionManager, - servicesManager, - segDisplaySet, - headers, -}) { +async function _loadSegments({ extensionManager, servicesManager, segDisplaySet, headers }) { const utilityModule = extensionManager.getModuleEntry( '@ohif/extension-cornerstone.utilityModule.common' ); @@ -162,15 +143,9 @@ async function _loadSegments({ const { segmentationService } = servicesManager.services; const { dicomLoaderService } = utilityModule.exports; - const arrayBuffer = await dicomLoaderService.findDicomDataPromise( - segDisplaySet, - null, - headers - ); + const arrayBuffer = await dicomLoaderService.findDicomDataPromise(segDisplaySet, null, headers); - const cachedReferencedVolume = cache.getVolume( - segDisplaySet.referencedVolumeId - ); + const cachedReferencedVolume = cache.getVolume(segDisplaySet.referencedVolumeId); if (!cachedReferencedVolume) { throw new Error( @@ -186,12 +161,9 @@ async function _loadSegments({ eventTarget.addEventListener(Enums.Events.SEGMENTATION_LOAD_PROGRESS, evt => { const { percentComplete } = evt.detail; - segmentationService._broadcastEvent( - segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, - { - percentComplete, - } - ); + segmentationService._broadcastEvent(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, { + percentComplete, + }); }); const results = await adaptersSEG.Cornerstone3D.Segmentation.generateToolState( @@ -212,18 +184,12 @@ async function _loadSegments({ function _segmentationExists(segDisplaySet, segmentationService) { // This should be abstracted with the CornerstoneCacheService - return segmentationService.getSegmentation( - segDisplaySet.displaySetInstanceUID - ); + return segmentationService.getSegmentation(segDisplaySet.displaySetInstanceUID); } function getSopClassHandlerModule({ servicesManager, extensionManager }) { const getDisplaySetsFromSeries = instances => { - return _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager - ); + return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager); }; return [ diff --git a/extensions/cornerstone-dicom-seg/src/index.tsx b/extensions/cornerstone-dicom-seg/src/index.tsx index c05426007..48d75202d 100644 --- a/extensions/cornerstone-dicom-seg/src/index.tsx +++ b/extensions/cornerstone-dicom-seg/src/index.tsx @@ -9,9 +9,7 @@ import getHangingProtocolModule from './getHangingProtocolModule'; import hydrateSEGDisplaySet from './utils/_hydrateSEG'; const Component = React.lazy(() => { - return import( - /* webpackPrefetch: true */ './viewports/OHIFCornerstoneSEGViewport' - ); + return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstoneSEGViewport'); }); const OHIFCornerstoneSEGViewport = props => { @@ -38,11 +36,7 @@ const extension = { * iconName, iconLabel, label, component} object. Example of a panel module * is the StudyBrowserPanel that is provided by the default extension in OHIF. */ - getPanelModule: ({ - servicesManager, - commandsManager, - extensionManager, - }): Types.Panel[] => { + getPanelModule: ({ servicesManager, commandsManager, extensionManager }): Types.Panel[] => { const wrappedPanelSegmentation = () => { return ( - segmentationService.getSegmentations() - ); + const [segmentations, setSegmentations] = useState(() => segmentationService.getSegmentations()); const [isMinimized, setIsMinimized] = useState({}); @@ -78,32 +73,20 @@ export default function PanelSegmentation({ }; const getToolGroupIds = segmentationId => { - const toolGroupIds = segmentationService.getToolGroupIdsWithSegmentation( - segmentationId - ); + const toolGroupIds = segmentationService.getToolGroupIdsWithSegmentation(segmentationId); return toolGroupIds; }; const onSegmentClick = (segmentationId, segmentIndex) => { - segmentationService.setActiveSegmentForSegmentation( - segmentationId, - segmentIndex - ); + segmentationService.setActiveSegmentForSegmentation(segmentationId, segmentIndex); const toolGroupIds = getToolGroupIds(segmentationId); toolGroupIds.forEach(toolGroupId => { // const toolGroupId = - segmentationService.setActiveSegmentationForToolGroup( - segmentationId, - toolGroupId - ); - segmentationService.jumpToSegmentCenter( - segmentationId, - segmentIndex, - toolGroupId - ); + segmentationService.setActiveSegmentationForToolGroup(segmentationId, toolGroupId); + segmentationService.jumpToSegmentCenter(segmentationId, segmentIndex, toolGroupId); }); }; @@ -118,11 +101,7 @@ export default function PanelSegmentation({ return; } - segmentationService.setSegmentLabelForSegmentation( - segmentationId, - segmentIndex, - label - ); + segmentationService.setSegmentLabelForSegmentation(segmentationId, segmentIndex, label); }); }; @@ -191,7 +170,7 @@ export default function PanelSegmentation({ ); return ( -
+
{/* show segmentation table */} {segmentations?.length ? ( - _setSegmentationConfiguration( - selectedSegmentationId, - 'renderOutline', - value - ) + _setSegmentationConfiguration(selectedSegmentationId, 'renderOutline', value) } setOutlineOpacityActive={value => - _setSegmentationConfiguration( - selectedSegmentationId, - 'outlineOpacity', - value - ) + _setSegmentationConfiguration(selectedSegmentationId, 'outlineOpacity', value) } setRenderFill={value => - _setSegmentationConfiguration( - selectedSegmentationId, - 'renderFill', - value - ) + _setSegmentationConfiguration(selectedSegmentationId, 'renderFill', value) } setRenderInactiveSegmentations={value => _setSegmentationConfiguration( @@ -241,25 +208,13 @@ export default function PanelSegmentation({ ) } setOutlineWidthActive={value => - _setSegmentationConfiguration( - selectedSegmentationId, - 'outlineWidthActive', - value - ) + _setSegmentationConfiguration(selectedSegmentationId, 'outlineWidthActive', value) } setFillAlpha={value => - _setSegmentationConfiguration( - selectedSegmentationId, - 'fillAlpha', - value - ) + _setSegmentationConfiguration(selectedSegmentationId, 'fillAlpha', value) } setFillAlphaInactive={value => - _setSegmentationConfiguration( - selectedSegmentationId, - 'fillAlphaInactive', - value - ) + _setSegmentationConfiguration(selectedSegmentationId, 'fillAlphaInactive', value) } /> ) : null} diff --git a/extensions/cornerstone-dicom-seg/src/panels/callInputDialog.tsx b/extensions/cornerstone-dicom-seg/src/panels/callInputDialog.tsx index 6909d93fc..6de2470d8 100644 --- a/extensions/cornerstone-dicom-seg/src/panels/callInputDialog.tsx +++ b/extensions/cornerstone-dicom-seg/src/panels/callInputDialog.tsx @@ -39,7 +39,7 @@ function callInputDialog(uiDialogService, label, callback) { label="Enter the segment label" labelClassName="text-white text-[14px] leading-[1.2]" autoFocus - className="bg-black border-primary-main" + className="border-primary-main bg-black" type="text" value={value.label} onChange={event => { diff --git a/extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts b/extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts index f028ce9f3..84d075f97 100644 --- a/extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts +++ b/extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts @@ -3,11 +3,8 @@ async function _hydrateSEGDisplaySet({ viewportId: targetViewportId, servicesManager, }) { - const { - segmentationService, - hangingProtocolService, - viewportGridService, - } = servicesManager.services; + const { segmentationService, hangingProtocolService, viewportGridService } = + servicesManager.services; const displaySetInstanceUID = segDisplaySet.referencedDisplaySetInstanceUID; diff --git a/extensions/cornerstone-dicom-seg/src/utils/dicomlabToRGB.ts b/extensions/cornerstone-dicom-seg/src/utils/dicomlabToRGB.ts index a8668cf12..34ce1e54f 100644 --- a/extensions/cornerstone-dicom-seg/src/utils/dicomlabToRGB.ts +++ b/extensions/cornerstone-dicom-seg/src/utils/dicomlabToRGB.ts @@ -6,9 +6,7 @@ import dcmjs from 'dcmjs'; * @returns The RGB color as an array of three integers between 0 and 255. */ function dicomlabToRGB(cielab: number[]): number[] { - const rgb = dcmjs.data.Colors.dicomlab2RGB(cielab).map(x => - Math.round(x * 255) - ); + const rgb = dcmjs.data.Colors.dicomlab2RGB(cielab).map(x => Math.round(x * 255)); return rgb; } diff --git a/extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts b/extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts index e032542f1..f4fe36ca7 100644 --- a/extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts +++ b/extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts @@ -1,10 +1,5 @@ -function createSEGToolGroupAndAddTools( - ToolGroupService, - customizationService, - toolGroupId -) { - const { tools } = - customizationService.get('cornerstone.overlayViewportTools') ?? {}; +function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) { + const { tools } = customizationService.get('cornerstone.overlayViewportTools') ?? {}; return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {}); } diff --git a/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts b/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts index d6cdf23d7..65f92c743 100644 --- a/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts +++ b/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts @@ -7,15 +7,10 @@ const RESPONSE = { HYDRATE_SEG: 5, }; -function promptHydrateSEG({ - servicesManager, - segDisplaySet, - viewportId, - preHydrateCallbacks, -}) { +function promptHydrateSEG({ servicesManager, segDisplaySet, viewportId, preHydrateCallbacks }) { const { uiViewportDialogService } = servicesManager.services; - return new Promise(async function(resolve, reject) { + return new Promise(async function (resolve, reject) { const promptResult = await _askHydrate(uiViewportDialogService, viewportId); if (promptResult === RESPONSE.HYDRATE_SEG) { @@ -35,7 +30,7 @@ function promptHydrateSEG({ } function _askHydrate(uiViewportDialogService, viewportId) { - return new Promise(function(resolve, reject) { + return new Promise(function (resolve, reject) { const message = 'Do you want to open this Segmentation?'; const actions = [ { diff --git a/extensions/cornerstone-dicom-seg/src/viewports/OHIFCornerstoneSEGViewport.tsx b/extensions/cornerstone-dicom-seg/src/viewports/OHIFCornerstoneSEGViewport.tsx index 88feed10f..7e4d39778 100644 --- a/extensions/cornerstone-dicom-seg/src/viewports/OHIFCornerstoneSEGViewport.tsx +++ b/extensions/cornerstone-dicom-seg/src/viewports/OHIFCornerstoneSEGViewport.tsx @@ -2,11 +2,7 @@ import PropTypes from 'prop-types'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import OHIF, { utils } from '@ohif/core'; -import { - LoadingIndicatorTotalPercent, - useViewportGrid, - ViewportActionBar, -} from '@ohif/ui'; +import { LoadingIndicatorTotalPercent, useViewportGrid, ViewportActionBar } from '@ohif/ui'; import createSEGToolGroupAndAddTools from '../utils/initSEGToolGroup'; import promptHydrateSEG from '../utils/promptHydrateSEG'; import hydrateSEGDisplaySet from '../utils/_hydrateSEG'; @@ -106,9 +102,7 @@ function OHIFCornerstoneSEGViewport(props) { '@ohif/extension-cornerstone.viewportModule.cornerstone' ); - const { - displaySet: referencedDisplaySet, - } = referencedDisplaySetRef.current; + const { displaySet: referencedDisplaySet } = referencedDisplaySetRef.current; // Todo: jump to the center of the first segment return ( @@ -148,11 +142,7 @@ function OHIFCornerstoneSEGViewport(props) { newSelectedSegmentIndex = numberOfSegments - 1; } - segmentationService.jumpToSegmentCenter( - segmentationId, - newSelectedSegmentIndex, - toolGroupId - ); + segmentationService.jumpToSegmentCenter(segmentationId, newSelectedSegmentIndex, toolGroupId); setSelectedSegment(newSelectedSegmentIndex); }, [selectedSegment] @@ -179,18 +169,14 @@ function OHIFCornerstoneSEGViewport(props) { const { unsubscribe } = segmentationService.subscribe( segmentationService.EVENTS.SEGMENTATION_LOADING_COMPLETE, evt => { - if ( - evt.segDisplaySet.displaySetInstanceUID === - segDisplaySet.displaySetInstanceUID - ) { + if (evt.segDisplaySet.displaySetInstanceUID === segDisplaySet.displaySetInstanceUID) { setSegIsLoading(false); } if (evt.overlappingSegments) { uiNotificationService.show({ title: 'Overlapping Segments', - message: - 'Overlapping segments detected which is not currently supported', + message: 'Overlapping segments detected which is not currently supported', type: 'warning', }); } @@ -226,9 +212,7 @@ function OHIFCornerstoneSEGViewport(props) { displaySetService.EVENTS.DISPLAY_SETS_REMOVED, ({ displaySetInstanceUIDs }) => { const activeViewport = viewports.get(activeViewportId); - if ( - displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID) - ) { + if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) { viewportGridService.setDisplaySetsForViewport({ viewportId: activeViewportId, displaySetInstanceUIDs: [], @@ -251,17 +235,11 @@ function OHIFCornerstoneSEGViewport(props) { // This creates a custom tool group which has the lifetime of this view // only, and does NOT interfere with currently displayed segmentations. - toolGroup = createSEGToolGroupAndAddTools( - toolGroupService, - customizationService, - toolGroupId - ); + toolGroup = createSEGToolGroupAndAddTools(toolGroupService, customizationService, toolGroupId); return () => { // remove the segmentation representations if seg displayset changed - segmentationService.removeSegmentationRepresentationFromToolGroup( - toolGroupId - ); + segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId); // Only destroy the viewport specific implementation toolGroupService.destroyToolGroup(toolGroupId); @@ -273,9 +251,7 @@ function OHIFCornerstoneSEGViewport(props) { return () => { // remove the segmentation representations if seg displayset changed - segmentationService.removeSegmentationRepresentationFromToolGroup( - toolGroupId - ); + segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId); referencedDisplaySetRef.current = null; }; }, [segDisplaySet]); @@ -351,29 +327,23 @@ function OHIFCornerstoneSEGViewport(props) { studyDate: formatDate(StudyDate), seriesDescription: `SEG Viewport ${SeriesDescription}`, patientInformation: { - patientName: PatientName - ? OHIF.utils.formatPN(PatientName.Alphabetic) - : '', + patientName: PatientName ? OHIF.utils.formatPN(PatientName.Alphabetic) : '', patientSex: PatientSex || '', patientAge: PatientAge || '', MRN: PatientID || '', - thickness: SliceThickness - ? utils.roundNumber(SliceThickness, 2) - : '', + thickness: SliceThickness ? utils.roundNumber(SliceThickness, 2) : '', thicknessUnits: SliceThickness !== undefined ? 'mm' : '', spacing: - SpacingBetweenSlices !== undefined - ? utils.roundNumber(SpacingBetweenSlices, 2) - : '', + SpacingBetweenSlices !== undefined ? utils.roundNumber(SpacingBetweenSlices, 2) : '', scanner: ManufacturerModelName || '', }, }} /> -
+
{segIsLoading && ( ; - ToolTipMessage = () => ( -
This Segmentation is loaded in the segmentation panel
- ); + ToolTipMessage = () =>
This Segmentation is loaded in the segmentation panel
; break; case false: StatusIcon = () => ( - + ); ToolTipMessage = () =>
Click LOAD to load segmentation.
; } const StatusArea = () => ( -
-
+
+
SEG
{!isHydrated && (
@@ -46,7 +47,10 @@ export default function _getStatusComponent({ isHydrated, onStatusClick }) { return ( <> {ToolTipMessage && ( - } position="bottom-left"> + } + position="bottom-left" + > )} diff --git a/extensions/cornerstone-dicom-sr/.webpack/webpack.prod.js b/extensions/cornerstone-dicom-sr/.webpack/webpack.prod.js index 76dcd9ecf..9e07dd8ac 100644 --- a/extensions/cornerstone-dicom-sr/.webpack/webpack.prod.js +++ b/extensions/cornerstone-dicom-sr/.webpack/webpack.prod.js @@ -41,13 +41,7 @@ module.exports = (env, argv) => { libraryTarget: 'umd', filename: pkg.main, }, - externals: [ - /\b(vtk.js)/, - /\b(dcmjs)/, - /\b(gl-matrix)/, - /^@ohif/, - /^@cornerstonejs/, - ], + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], plugins: [ new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, diff --git a/extensions/cornerstone-dicom-sr/src/commandsModule.js b/extensions/cornerstone-dicom-sr/src/commandsModule.js index f8c9459e4..ec68cabb9 100644 --- a/extensions/cornerstone-dicom-sr/src/commandsModule.js +++ b/extensions/cornerstone-dicom-sr/src/commandsModule.js @@ -17,11 +17,7 @@ const { log } = OHIF; * @param options Naturalized DICOM JSON headers to merge into the displaySet. * */ -const _generateReport = ( - measurementData, - additionalFindingTypes, - options = {} -) => { +const _generateReport = (measurementData, additionalFindingTypes, options = {}) => { const filteredToolState = getFilteredCornerstoneToolState( measurementData, additionalFindingTypes @@ -54,16 +50,8 @@ const commandsModule = ({}) => { * as opposed to Finding Sites. * that you wish to serialize. */ - downloadReport: ({ - measurementData, - additionalFindingTypes, - options = {}, - }) => { - const srDataset = actions.generateReport( - measurementData, - additionalFindingTypes, - options - ); + downloadReport: ({ measurementData, additionalFindingTypes, options = {} }) => { + const srDataset = actions.generateReport(measurementData, additionalFindingTypes, options); const reportBlob = dcmjs.data.datasetToBlob(srDataset); //Create a URL for the binary. @@ -91,28 +79,19 @@ const commandsModule = ({}) => { log.info('[DICOMSR] storeMeasurements'); if (!dataSource || !dataSource.store || !dataSource.store.dicom) { - log.error( - '[DICOMSR] datasource has no dataSource.store.dicom endpoint!' - ); + log.error('[DICOMSR] datasource has no dataSource.store.dicom endpoint!'); return Promise.reject({}); } try { - const naturalizedReport = _generateReport( - measurementData, - additionalFindingTypes, - options - ); + const naturalizedReport = _generateReport(measurementData, additionalFindingTypes, options); const { StudyInstanceUID, ContentSequence } = naturalizedReport; // The content sequence has 5 or more elements, of which // the `[4]` element contains the annotation data, so this is // checking that there is some annotation data present. if (!ContentSequence?.[4].ContentSequence?.length) { - console.log( - 'naturalizedReport missing imaging content', - naturalizedReport - ); + console.log('naturalizedReport missing imaging content', naturalizedReport); throw new Error('Invalid report, no content'); } @@ -130,12 +109,8 @@ const commandsModule = ({}) => { return naturalizedReport; } catch (error) { console.warn(error); - log.error( - `[DICOMSR] Error while saving the measurements: ${error.message}` - ); - throw new Error( - error.message || 'Error while saving the measurements.' - ); + log.error(`[DICOMSR] Error while saving the measurements: ${error.message}`); + throw new Error(error.message || 'Error while saving the measurements.'); } }, }; diff --git a/extensions/cornerstone-dicom-sr/src/getSopClassHandlerModule.ts b/extensions/cornerstone-dicom-sr/src/getSopClassHandlerModule.ts index 9601acb0b..5cdf455f6 100644 --- a/extensions/cornerstone-dicom-sr/src/getSopClassHandlerModule.ts +++ b/extensions/cornerstone-dicom-sr/src/getSopClassHandlerModule.ts @@ -29,9 +29,7 @@ const validateSameStudyUID = (uid: string, instances): void => { instances.forEach(it => { if (it.StudyInstanceUID !== uid) { console.warn('Not all instances have the same UID', uid, it); - throw new Error( - `Instances ${it.SOPInstanceUID} does not belong to ${uid}` - ); + throw new Error(`Instances ${it.SOPInstanceUID} does not belong to ${uid}`); } }); }; @@ -51,10 +49,7 @@ const CodeNameCodeSequenceValues = { const CodingSchemeDesignators = { SRT: 'SRT', - CornerstoneCodeSchemes: [ - Cornerstone3DCodeScheme.CodingSchemeDesignator, - 'CST4', - ], + CornerstoneCodeSchemes: [Cornerstone3DCodeScheme.CodingSchemeDesignator, 'CST4'], }; const RELATIONSHIP_TYPE = { @@ -71,10 +66,7 @@ const CORNERSTONE_FREETEXT_CODE_VALUE = 'CORNERSTONEFREETEXT'; * @param instances is a list of instances from THIS series that are not * in this DICOM SR Display Set already. */ -function addInstances( - instances: InstanceMetadata[], - displaySetService: DisplaySetService -) { +function addInstances(instances: InstanceMetadata[], displaySetService: DisplaySetService) { this.instances.push(...instances); utils.sortStudyInstances(this.instances); // The last instance is the newest one, so is the one most interesting. @@ -93,11 +85,7 @@ function addInstances( * @param servicesManager is the services that can be used for creating * @returns The list of display sets created for the given instances object */ -function _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager -) { +function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { // If the series has no instances, stop here if (!instances || !instances.length) { throw new Error('No instances were provided'); @@ -123,8 +111,7 @@ function _getDisplaySetsFromSeries( if ( !ConceptNameCodeSequence || - ConceptNameCodeSequence.CodeValue !== - CodeNameCodeSequenceValues.ImagingMeasurementReport + ConceptNameCodeSequence.CodeValue !== CodeNameCodeSequenceValues.ImagingMeasurementReport ) { servicesManager.services.uiNotificationService.show({ title: 'DICOM SR', @@ -184,36 +171,21 @@ function _load(displaySet, servicesManager, extensionManager) { // Check currently added displaySets and add measurements if the sources exist. displaySetService.activeDisplaySets.forEach(activeDisplaySet => { - _checkIfCanAddMeasurementsToDisplaySet( - displaySet, - activeDisplaySet, - dataSource - ); + _checkIfCanAddMeasurementsToDisplaySet(displaySet, activeDisplaySet, dataSource); }); // Subscribe to new displaySets as the source may come in after. - displaySetService.subscribe( - displaySetService.EVENTS.DISPLAY_SETS_ADDED, - data => { - const { displaySetsAdded } = data; - // If there are still some measurements that have not yet been loaded into cornerstone, - // See if we can load them onto any of the new displaySets. - displaySetsAdded.forEach(newDisplaySet => { - _checkIfCanAddMeasurementsToDisplaySet( - displaySet, - newDisplaySet, - dataSource - ); - }); - } - ); + displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_ADDED, data => { + const { displaySetsAdded } = data; + // If there are still some measurements that have not yet been loaded into cornerstone, + // See if we can load them onto any of the new displaySets. + displaySetsAdded.forEach(newDisplaySet => { + _checkIfCanAddMeasurementsToDisplaySet(displaySet, newDisplaySet, dataSource); + }); + }); } -function _checkIfCanAddMeasurementsToDisplaySet( - srDisplaySet, - newDisplaySet, - dataSource -) { +function _checkIfCanAddMeasurementsToDisplaySet(srDisplaySet, newDisplaySet, dataSource) { let unloadedMeasurements = srDisplaySet.measurements.filter( measurement => measurement.loaded === false ); @@ -248,8 +220,7 @@ function _checkIfCanAddMeasurementsToDisplaySet( const { coords } = measurement; coords.forEach(coord => { - const SOPInstanceUID = - coord.ReferencedSOPSequence.ReferencedSOPInstanceUID; + const SOPInstanceUID = coord.ReferencedSOPSequence.ReferencedSOPInstanceUID; if (!SOPInstanceUIDs.includes(SOPInstanceUID)) { SOPInstanceUIDs.push(SOPInstanceUID); @@ -257,9 +228,7 @@ function _checkIfCanAddMeasurementsToDisplaySet( }); }); - const imageIdsForDisplaySet = dataSource.getImageIdsForDisplaySet( - newDisplaySet - ); + const imageIdsForDisplaySet = dataSource.getImageIdsForDisplaySet(newDisplaySet); for (const imageId of imageIdsForDisplaySet) { if (!unloadedMeasurements.length) { @@ -267,25 +236,13 @@ function _checkIfCanAddMeasurementsToDisplaySet( return; } - const { SOPInstanceUID, frameNumber } = metadataProvider.getUIDsFromImageID( - imageId - ); + const { SOPInstanceUID, frameNumber } = metadataProvider.getUIDsFromImageID(imageId); if (SOPInstanceUIDs.includes(SOPInstanceUID)) { for (let j = unloadedMeasurements.length - 1; j >= 0; j--) { const measurement = unloadedMeasurements[j]; - if ( - _measurementReferencesSOPInstanceUID( - measurement, - SOPInstanceUID, - frameNumber - ) - ) { - addMeasurement( - measurement, - imageId, - newDisplaySet.displaySetInstanceUID - ); + if (_measurementReferencesSOPInstanceUID(measurement, SOPInstanceUID, frameNumber)) { + addMeasurement(measurement, imageId, newDisplaySet.displaySetInstanceUID); unloadedMeasurements.splice(j, 1); } @@ -294,11 +251,7 @@ function _checkIfCanAddMeasurementsToDisplaySet( } } -function _measurementReferencesSOPInstanceUID( - measurement, - SOPInstanceUID, - frameNumber -) { +function _measurementReferencesSOPInstanceUID(measurement, SOPInstanceUID, frameNumber) { const { coords } = measurement; // NOTE: The ReferencedFrameNumber can be multiple values according to the DICOM @@ -324,11 +277,7 @@ function _measurementReferencesSOPInstanceUID( function getSopClassHandlerModule({ servicesManager, extensionManager }) { const getDisplaySetsFromSeries = instances => { - return _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager - ); + return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager); }; return [ @@ -343,30 +292,22 @@ function getSopClassHandlerModule({ servicesManager, extensionManager }) { function _getMeasurements(ImagingMeasurementReportContentSequence) { const ImagingMeasurements = ImagingMeasurementReportContentSequence.find( item => - item.ConceptNameCodeSequence.CodeValue === - CodeNameCodeSequenceValues.ImagingMeasurements + item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.ImagingMeasurements ); - const MeasurementGroups = _getSequenceAsArray( - ImagingMeasurements.ContentSequence - ).filter( - item => - item.ConceptNameCodeSequence.CodeValue === - CodeNameCodeSequenceValues.MeasurementGroup + const MeasurementGroups = _getSequenceAsArray(ImagingMeasurements.ContentSequence).filter( + item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.MeasurementGroup ); - const mergedContentSequencesByTrackingUniqueIdentifiers = _getMergedContentSequencesByTrackingUniqueIdentifiers( - MeasurementGroups - ); + const mergedContentSequencesByTrackingUniqueIdentifiers = + _getMergedContentSequencesByTrackingUniqueIdentifiers(MeasurementGroups); const measurements = []; Object.keys(mergedContentSequencesByTrackingUniqueIdentifiers).forEach( trackingUniqueIdentifier => { const mergedContentSequence = - mergedContentSequencesByTrackingUniqueIdentifiers[ - trackingUniqueIdentifier - ]; + mergedContentSequencesByTrackingUniqueIdentifiers[trackingUniqueIdentifier]; const measurement = _processMeasurement(mergedContentSequence); @@ -379,15 +320,11 @@ function _getMeasurements(ImagingMeasurementReportContentSequence) { return measurements; } -function _getMergedContentSequencesByTrackingUniqueIdentifiers( - MeasurementGroups -) { +function _getMergedContentSequencesByTrackingUniqueIdentifiers(MeasurementGroups) { const mergedContentSequencesByTrackingUniqueIdentifiers = {}; MeasurementGroups.forEach(MeasurementGroup => { - const ContentSequence = _getSequenceAsArray( - MeasurementGroup.ContentSequence - ); + const ContentSequence = _getSequenceAsArray(MeasurementGroup.ContentSequence); const TrackingUniqueIdentifierItem = ContentSequence.find( item => @@ -396,22 +333,16 @@ function _getMergedContentSequencesByTrackingUniqueIdentifiers( ); if (!TrackingUniqueIdentifierItem) { - console.warn( - 'No Tracking Unique Identifier, skipping ambiguous measurement.' - ); + console.warn('No Tracking Unique Identifier, skipping ambiguous measurement.'); } const trackingUniqueIdentifier = TrackingUniqueIdentifierItem.UID; - if ( - mergedContentSequencesByTrackingUniqueIdentifiers[ - trackingUniqueIdentifier - ] === undefined - ) { + if (mergedContentSequencesByTrackingUniqueIdentifiers[trackingUniqueIdentifier] === undefined) { // Add the full ContentSequence - mergedContentSequencesByTrackingUniqueIdentifiers[ - trackingUniqueIdentifier - ] = [...ContentSequence]; + mergedContentSequencesByTrackingUniqueIdentifiers[trackingUniqueIdentifier] = [ + ...ContentSequence, + ]; } else { // Add the ContentSequence minus the tracking identifier, as we have this // Information in the merged ContentSequence anyway. @@ -420,9 +351,7 @@ function _getMergedContentSequencesByTrackingUniqueIdentifiers( item.ConceptNameCodeSequence.CodeValue !== CodeNameCodeSequenceValues.TrackingUniqueIdentifier ) { - mergedContentSequencesByTrackingUniqueIdentifiers[ - trackingUniqueIdentifier - ].push(item); + mergedContentSequencesByTrackingUniqueIdentifiers[trackingUniqueIdentifier].push(item); } }); } @@ -447,18 +376,12 @@ function _processTID1410Measurement(mergedContentSequence) { // Need to deal with TID 1410 style measurements, which will have a SCOORD or SCOORD3D at the top level, // And non-geometric representations where each NUM has "INFERRED FROM" SCOORD/SCOORD3D - const graphicItem = mergedContentSequence.find( - group => group.ValueType === 'SCOORD' - ); + const graphicItem = mergedContentSequence.find(group => group.ValueType === 'SCOORD'); - const UIDREFContentItem = mergedContentSequence.find( - group => group.ValueType === 'UIDREF' - ); + const UIDREFContentItem = mergedContentSequence.find(group => group.ValueType === 'UIDREF'); const TrackingIdentifierContentItem = mergedContentSequence.find( - item => - item.ConceptNameCodeSequence.CodeValue === - CodeNameCodeSequenceValues.TrackingIdentifier + item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.TrackingIdentifier ); if (!graphicItem) { @@ -468,9 +391,7 @@ function _processTID1410Measurement(mergedContentSequence) { return; } - const NUMContentItems = mergedContentSequence.filter( - group => group.ValueType === 'NUM' - ); + const NUMContentItems = mergedContentSequence.filter(group => group.ValueType === 'NUM'); const measurement = { loaded: false, @@ -485,10 +406,7 @@ function _processTID1410Measurement(mergedContentSequence) { if (MeasuredValueSequence) { measurement.labels.push( - _getLabelFromMeasuredValueSequence( - ConceptNameCodeSequence, - MeasuredValueSequence - ) + _getLabelFromMeasuredValueSequence(ConceptNameCodeSequence, MeasuredValueSequence) ); } }); @@ -497,32 +415,22 @@ function _processTID1410Measurement(mergedContentSequence) { } function _processNonGeometricallyDefinedMeasurement(mergedContentSequence) { - const NUMContentItems = mergedContentSequence.filter( - group => group.ValueType === 'NUM' - ); + const NUMContentItems = mergedContentSequence.filter(group => group.ValueType === 'NUM'); - const UIDREFContentItem = mergedContentSequence.find( - group => group.ValueType === 'UIDREF' - ); + const UIDREFContentItem = mergedContentSequence.find(group => group.ValueType === 'UIDREF'); const TrackingIdentifierContentItem = mergedContentSequence.find( - item => - item.ConceptNameCodeSequence.CodeValue === - CodeNameCodeSequenceValues.TrackingIdentifier + item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.TrackingIdentifier ); const finding = mergedContentSequence.find( - item => - item.ConceptNameCodeSequence.CodeValue === - CodeNameCodeSequenceValues.Finding + item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.Finding ); const findingSites = mergedContentSequence.filter( item => - item.ConceptNameCodeSequence.CodingSchemeDesignator === - CodingSchemeDesignators.SRT && - item.ConceptNameCodeSequence.CodeValue === - CodeNameCodeSequenceValues.FindingSite + item.ConceptNameCodeSequence.CodingSchemeDesignator === CodingSchemeDesignators.SRT && + item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.FindingSite ); const measurement = { @@ -538,8 +446,7 @@ function _processNonGeometricallyDefinedMeasurement(mergedContentSequence) { CodingSchemeDesignators.CornerstoneCodeSchemes.includes( finding.ConceptCodeSequence.CodingSchemeDesignator ) && - finding.ConceptCodeSequence.CodeValue === - CodeNameCodeSequenceValues.CornerstoneFreeText + finding.ConceptCodeSequence.CodeValue === CodeNameCodeSequenceValues.CornerstoneFreeText ) { measurement.labels.push({ label: CORNERSTONE_FREETEXT_CODE_VALUE, @@ -554,8 +461,7 @@ function _processNonGeometricallyDefinedMeasurement(mergedContentSequence) { CodingSchemeDesignators.CornerstoneCodeSchemes.includes( FindingSite.ConceptCodeSequence.CodingSchemeDesignator ) && - FindingSite.ConceptCodeSequence.CodeValue === - CodeNameCodeSequenceValues.CornerstoneFreeText + FindingSite.ConceptCodeSequence.CodeValue === CodeNameCodeSequenceValues.CornerstoneFreeText ); if (cornerstoneFreeTextFindingSite) { @@ -567,18 +473,12 @@ function _processNonGeometricallyDefinedMeasurement(mergedContentSequence) { } NUMContentItems.forEach(item => { - const { - ConceptNameCodeSequence, - ContentSequence, - MeasuredValueSequence, - } = item; + const { ConceptNameCodeSequence, ContentSequence, MeasuredValueSequence } = item; const { ValueType } = ContentSequence; if (!ValueType === 'SCOORD') { - console.warn( - `Graphic ${ValueType} not currently supported, skipping annotation.` - ); + console.warn(`Graphic ${ValueType} not currently supported, skipping annotation.`); return; } @@ -591,10 +491,7 @@ function _processNonGeometricallyDefinedMeasurement(mergedContentSequence) { if (MeasuredValueSequence) { measurement.labels.push( - _getLabelFromMeasuredValueSequence( - ConceptNameCodeSequence, - MeasuredValueSequence - ) + _getLabelFromMeasuredValueSequence(ConceptNameCodeSequence, MeasuredValueSequence) ); } }); @@ -634,17 +531,12 @@ function _getCoordsFromSCOORDOrSCOORD3D(item) { return coords; } -function _getLabelFromMeasuredValueSequence( - ConceptNameCodeSequence, - MeasuredValueSequence -) { +function _getLabelFromMeasuredValueSequence(ConceptNameCodeSequence, MeasuredValueSequence) { const { CodeMeaning } = ConceptNameCodeSequence; const { NumericValue, MeasurementUnitsCodeSequence } = MeasuredValueSequence; const { CodeValue } = MeasurementUnitsCodeSequence; - const formatedNumericValue = NumericValue - ? Number(NumericValue).toFixed(2) - : ''; + const formatedNumericValue = NumericValue ? Number(NumericValue).toFixed(2) : ''; return { label: CodeMeaning, @@ -654,17 +546,11 @@ function _getLabelFromMeasuredValueSequence( function _getReferencedImagesList(ImagingMeasurementReportContentSequence) { const ImageLibrary = ImagingMeasurementReportContentSequence.find( - item => - item.ConceptNameCodeSequence.CodeValue === - CodeNameCodeSequenceValues.ImageLibrary + item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.ImageLibrary ); - const ImageLibraryGroup = _getSequenceAsArray( - ImageLibrary.ContentSequence - ).find( - item => - item.ConceptNameCodeSequence.CodeValue === - CodeNameCodeSequenceValues.ImageLibraryGroup + const ImageLibraryGroup = _getSequenceAsArray(ImageLibrary.ContentSequence).find( + item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.ImageLibraryGroup ); const referencedImages = []; diff --git a/extensions/cornerstone-dicom-sr/src/index.tsx b/extensions/cornerstone-dicom-sr/src/index.tsx index 9b87ea98c..72829f2b7 100644 --- a/extensions/cornerstone-dicom-sr/src/index.tsx +++ b/extensions/cornerstone-dicom-sr/src/index.tsx @@ -1,8 +1,6 @@ import React from 'react'; import getSopClassHandlerModule from './getSopClassHandlerModule'; -import getHangingProtocolModule, { - srProtocol, -} from './getHangingProtocolModule'; +import getHangingProtocolModule, { srProtocol } from './getHangingProtocolModule'; import onModeEnter from './onModeEnter'; import getCommandsModule from './commandsModule'; import preRegistration from './init'; @@ -12,9 +10,7 @@ import hydrateStructuredReport from './utils/hydrateStructuredReport'; import createReferencedImageDisplaySet from './utils/createReferencedImageDisplaySet'; const Component = React.lazy(() => { - return import( - /* webpackPrefetch: true */ './viewports/OHIFCornerstoneSRViewport' - ); + return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstoneSRViewport'); }); const OHIFCornerstoneSRViewport = props => { diff --git a/extensions/cornerstone-dicom-sr/src/init.ts b/extensions/cornerstone-dicom-sr/src/init.ts index 84cbcaf37..1ab3300d7 100644 --- a/extensions/cornerstone-dicom-sr/src/init.ts +++ b/extensions/cornerstone-dicom-sr/src/init.ts @@ -18,9 +18,7 @@ import toolNames from './tools/toolNames'; /** * @param {object} configuration */ -export default function init({ - configuration = {}, -}: Types.Extensions.ExtensionParams): void { +export default function init({ configuration = {} }: Types.Extensions.ExtensionParams): void { addTool(DICOMSRDisplayTool); addToolInstance(toolNames.SRLength, LengthTool, {}); addToolInstance(toolNames.SRBidirectional, BidirectionalTool); diff --git a/extensions/cornerstone-dicom-sr/src/tools/DICOMSRDisplayTool.ts b/extensions/cornerstone-dicom-sr/src/tools/DICOMSRDisplayTool.ts index 8b656e972..8160ea650 100644 --- a/extensions/cornerstone-dicom-sr/src/tools/DICOMSRDisplayTool.ts +++ b/extensions/cornerstone-dicom-sr/src/tools/DICOMSRDisplayTool.ts @@ -40,49 +40,32 @@ export default class DICOMSRDisplayTool extends AnnotationTool { isPointNearTool = () => null; getHandleNearImagePoint = () => null; - renderAnnotation = ( - enabledElement: Types.IEnabledElement, - svgDrawingHelper: any - ): void => { + renderAnnotation = (enabledElement: Types.IEnabledElement, svgDrawingHelper: any): void => { const { viewport } = enabledElement; const { element } = viewport; - let annotations = annotation.state.getAnnotations( - this.getToolName(), - element - ); + let annotations = annotation.state.getAnnotations(this.getToolName(), element); // Todo: We don't need this anymore, filtering happens in triggerAnnotationRender if (!annotations?.length) { return; } - annotations = this.filterInteractableAnnotationsForElement( - element, - annotations - ); + annotations = this.filterInteractableAnnotationsForElement(element, annotations); if (!annotations?.length) { return; } - const trackingUniqueIdentifiersForElement = getTrackingUniqueIdentifiersForElement( - element - ); + const trackingUniqueIdentifiersForElement = getTrackingUniqueIdentifiersForElement(element); - const { - activeIndex, - trackingUniqueIdentifiers, - } = trackingUniqueIdentifiersForElement; + const { activeIndex, trackingUniqueIdentifiers } = trackingUniqueIdentifiersForElement; - const activeTrackingUniqueIdentifier = - trackingUniqueIdentifiers[activeIndex]; + const activeTrackingUniqueIdentifier = trackingUniqueIdentifiers[activeIndex]; // Filter toolData to only render the data for the active SR. const filteredAnnotations = annotations.filter(annotation => - trackingUniqueIdentifiers.includes( - annotation.data?.cachedStats?.TrackingUniqueIdentifier - ) + trackingUniqueIdentifiers.includes(annotation.data?.cachedStats?.TrackingUniqueIdentifier) ); if (!viewport._actors?.size) { @@ -138,8 +121,7 @@ export default class DICOMSRDisplayTool extends AnnotationTool { break; case SCOORD_TYPES.ELLIPSE: renderMethod = this.renderEllipse; - canvasCoordinatesAdapter = - utilities.math.ellipse.getCanvasEllipseCorners; + canvasCoordinatesAdapter = utilities.math.ellipse.getCanvasEllipseCorners; break; default: throw new Error(`Unsupported GraphicType: ${GraphicType}`); @@ -221,15 +203,9 @@ export default class DICOMSRDisplayTool extends AnnotationTool { renderableData.map((data, index) => { canvasCoordinates = data.map(p => viewport.worldToCanvas(p)); const handleGroupUID = '0'; - drawing.drawHandles( - svgDrawingHelper, - annotationUID, - handleGroupUID, - canvasCoordinates, - { - color: options.color, - } - ); + drawing.drawHandles(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, { + color: options.color, + }); }); } @@ -248,10 +224,7 @@ export default class DICOMSRDisplayTool extends AnnotationTool { canvasCoordinates.push(viewport.worldToCanvas(point)); // We get the other point for the arrow by using the image size - const imagePixelModule = metaData.get( - 'imagePixelModule', - referencedImageId - ); + const imagePixelModule = metaData.get('imagePixelModule', referencedImageId); let xOffset = 10; let yOffset = 10; @@ -309,9 +282,7 @@ export default class DICOMSRDisplayTool extends AnnotationTool { const rotation = viewport.getRotation(); - canvasCoordinates = ellipsePointsWorld.map(p => - viewport.worldToCanvas(p) - ); + canvasCoordinates = ellipsePointsWorld.map(p => viewport.worldToCanvas(p)); let canvasCorners; if (rotation == 90 || rotation == 270) { canvasCorners = utilities.math.ellipse.getCanvasEllipseCorners([ @@ -366,23 +337,14 @@ export default class DICOMSRDisplayTool extends AnnotationTool { adaptedCanvasCoordinates = canvasCoordinatesAdapter(canvasCoordinates); } const textLines = this._getTextBoxLinesFromLabels(label); - const canvasTextBoxCoords = utilities.drawing.getTextBoxCoordsCanvas( - adaptedCanvasCoordinates - ); + const canvasTextBoxCoords = utilities.drawing.getTextBoxCoordsCanvas(adaptedCanvasCoordinates); - annotation.data.handles.textBox.worldPosition = viewport.canvasToWorld( - canvasTextBoxCoords - ); + annotation.data.handles.textBox.worldPosition = viewport.canvasToWorld(canvasTextBoxCoords); - const textBoxPosition = viewport.worldToCanvas( - annotation.data.handles.textBox.worldPosition - ); + const textBoxPosition = viewport.worldToCanvas(annotation.data.handles.textBox.worldPosition); const textBoxUID = '1'; - const textBoxOptions = this.getLinkedTextBoxStyle( - styleSpecifier, - annotation - ); + const textBoxOptions = this.getLinkedTextBoxStyle(styleSpecifier, annotation); const boundingBox = drawing.drawLinkedTextBox( svgDrawingHelper, diff --git a/extensions/cornerstone-dicom-sr/src/tools/modules/dicomSRModule.js b/extensions/cornerstone-dicom-sr/src/tools/modules/dicomSRModule.js index f359e3d27..5636e6563 100644 --- a/extensions/cornerstone-dicom-sr/src/tools/modules/dicomSRModule.js +++ b/extensions/cornerstone-dicom-sr/src/tools/modules/dicomSRModule.js @@ -27,15 +27,11 @@ function setTrackingUniqueIdentifiersForElement( }; } -function setActiveTrackingUniqueIdentifierForElement( - element, - TrackingUniqueIdentifier -) { +function setActiveTrackingUniqueIdentifierForElement(element, TrackingUniqueIdentifier) { const enabledElement = getEnabledElement(element); const { viewport } = enabledElement; - const trackingIdentifiersForElement = - state.trackingIdentifiersByViewportId[viewport.id]; + const trackingIdentifiersForElement = state.trackingIdentifiersByViewportId[viewport.id]; if (trackingIdentifiersForElement) { const activeIndex = trackingIdentifiersForElement.trackingUniqueIdentifiers.findIndex( diff --git a/extensions/cornerstone-dicom-sr/src/utils/addMeasurement.ts b/extensions/cornerstone-dicom-sr/src/utils/addMeasurement.ts index ac8e43003..e78b3c7f1 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/addMeasurement.ts +++ b/extensions/cornerstone-dicom-sr/src/utils/addMeasurement.ts @@ -8,11 +8,7 @@ const EPSILON = 1e-4; const supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0']; -export default function addMeasurement( - measurement, - imageId, - displaySetInstanceUID -) { +export default function addMeasurement(measurement, imageId, displaySetInstanceUID) { // TODO -> Render rotated ellipse . const toolName = toolNames.DICOMSRDisplay; @@ -31,12 +27,7 @@ export default function addMeasurement( } measurementData.renderableData[GraphicType].push( - _getRenderableData( - GraphicType, - GraphicData, - imageId, - measurement.TrackingIdentifier - ) + _getRenderableData(GraphicType, GraphicData, imageId, measurement.TrackingIdentifier) ); }); @@ -86,12 +77,7 @@ export default function addMeasurement( delete measurement.coords; } -function _getRenderableData( - GraphicType, - GraphicData, - imageId, - TrackingIdentifier -) { +function _getRenderableData(GraphicType, GraphicData, imageId, TrackingIdentifier) { const [cornerstoneTag, toolName] = TrackingIdentifier.split(':'); let renderableData: csTypes.Point3[]; @@ -207,38 +193,22 @@ function _getRenderableData( throw new Error('imageId does not have imagePlaneModule metadata'); } - const { - columnCosines, - }: { columnCosines: csTypes.Point3 } = imagePlaneModule; + const { columnCosines }: { columnCosines: csTypes.Point3 } = imagePlaneModule; // find which axis is parallel to the columnCosines const columnCosinesVec = vec3.fromValues(...columnCosines); - const projectedMajorAxisOnColVec = Math.abs( - vec3.dot(columnCosinesVec, majorAxisVec) - ); - const projectedMinorAxisOnColVec = Math.abs( - vec3.dot(columnCosinesVec, minorAxisVec) - ); + const projectedMajorAxisOnColVec = Math.abs(vec3.dot(columnCosinesVec, majorAxisVec)); + const projectedMinorAxisOnColVec = Math.abs(vec3.dot(columnCosinesVec, minorAxisVec)); const absoluteOfMajorDotProduct = Math.abs(projectedMajorAxisOnColVec); const absoluteOfMinorDotProduct = Math.abs(projectedMinorAxisOnColVec); renderableData = []; if (Math.abs(absoluteOfMajorDotProduct - 1) < EPSILON) { - renderableData = [ - pointsWorld[0], - pointsWorld[1], - pointsWorld[2], - pointsWorld[3], - ]; + renderableData = [pointsWorld[0], pointsWorld[1], pointsWorld[2], pointsWorld[3]]; } else if (Math.abs(absoluteOfMinorDotProduct - 1) < EPSILON) { - renderableData = [ - pointsWorld[2], - pointsWorld[3], - pointsWorld[0], - pointsWorld[1], - ]; + renderableData = [pointsWorld[2], pointsWorld[3], pointsWorld[0], pointsWorld[1]]; } else { console.warn('OBLIQUE ELLIPSE NOT YET SUPPORTED'); } diff --git a/extensions/cornerstone-dicom-sr/src/utils/addToolInstance.ts b/extensions/cornerstone-dicom-sr/src/utils/addToolInstance.ts index 889926d81..bd4cf2d1e 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/addToolInstance.ts +++ b/extensions/cornerstone-dicom-sr/src/utils/addToolInstance.ts @@ -1,10 +1,6 @@ import { addTool } from '@cornerstonejs/tools'; -export default function addToolInstance( - name: string, - toolClass, - configuration? -): void { +export default function addToolInstance(name: string, toolClass, configuration?): void { class InstanceClass extends toolClass { static toolName = name; } diff --git a/extensions/cornerstone-dicom-sr/src/utils/createReferencedImageDisplaySet.ts b/extensions/cornerstone-dicom-sr/src/utils/createReferencedImageDisplaySet.ts index bc39b8080..724164165 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/createReferencedImageDisplaySet.ts +++ b/extensions/cornerstone-dicom-sr/src/utils/createReferencedImageDisplaySet.ts @@ -3,13 +3,8 @@ import { DisplaySetService, classes } from '@ohif/core'; const ImageSet = classes.ImageSet; const findInstance = (measurement, displaySetService: DisplaySetService) => { - const { - displaySetInstanceUID, - ReferencedSOPInstanceUID: sopUid, - } = measurement; - const referencedDisplaySet = displaySetService.getDisplaySetByUID( - displaySetInstanceUID - ); + const { displaySetInstanceUID, ReferencedSOPInstanceUID: sopUid } = measurement; + const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); if (!referencedDisplaySet.images) { return; } @@ -20,10 +15,7 @@ const findInstance = (measurement, displaySetService: DisplaySetService) => { * contained within the provided display set. * @return an array of instances referenced. */ -const findReferencedInstances = ( - displaySetService: DisplaySetService, - displaySet -) => { +const findReferencedInstances = (displaySetService: DisplaySetService, displaySet) => { const instances = []; const instanceById = {}; for (const measurement of displaySet.measurements) { @@ -58,7 +50,7 @@ const findReferencedInstances = ( const createReferencedImageDisplaySet = (displaySetService, displaySet) => { const instances = findReferencedInstances(displaySetService, displaySet); // This will be a member function of the created image set - const updateInstances = function() { + const updateInstances = function () { this.images.splice( 0, this.images.length, diff --git a/extensions/cornerstone-dicom-sr/src/utils/findInstanceMetadataBySopInstanceUid.js b/extensions/cornerstone-dicom-sr/src/utils/findInstanceMetadataBySopInstanceUid.js index 0e40ebb58..30e681576 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/findInstanceMetadataBySopInstanceUid.js +++ b/extensions/cornerstone-dicom-sr/src/utils/findInstanceMetadataBySopInstanceUid.js @@ -14,8 +14,7 @@ const findInstanceMetadataBySopInstanceUID = (displaySets, SOPInstanceUID) => { } instanceFound = displaySet.images.find( - instanceMetadata => - instanceMetadata.getSOPInstanceUID() === SOPInstanceUID + instanceMetadata => instanceMetadata.getSOPInstanceUID() === SOPInstanceUID ); return !!instanceFound; diff --git a/extensions/cornerstone-dicom-sr/src/utils/findMostRecentStructuredReport.js b/extensions/cornerstone-dicom-sr/src/utils/findMostRecentStructuredReport.js index 9f8a3129a..7b860c84c 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/findMostRecentStructuredReport.js +++ b/extensions/cornerstone-dicom-sr/src/utils/findMostRecentStructuredReport.js @@ -18,10 +18,7 @@ const findMostRecentStructuredReport = studies => { } if (isStructuredReportSeries(series)) { - if ( - !mostRecentStructuredReport || - compareSeriesDate(series, mostRecentStructuredReport) - ) { + if (!mostRecentStructuredReport || compareSeriesDate(series, mostRecentStructuredReport)) { mostRecentStructuredReport = series; } } @@ -38,10 +35,7 @@ const findMostRecentStructuredReport = studies => { * @returns {boolean} */ const isStructuredReportSeries = series => { - const supportedSopClassUIDs = [ - '1.2.840.10008.5.1.4.1.1.88.22', - '1.2.840.10008.5.1.4.1.1.11.1', - ]; + const supportedSopClassUIDs = ['1.2.840.10008.5.1.4.1.1.88.22', '1.2.840.10008.5.1.4.1.1.11.1']; const firstInstance = series.getFirstInstance(); const SOPClassUID = firstInstance.getData().metadata.SOPClassUID; diff --git a/extensions/cornerstone-dicom-sr/src/utils/getFilteredCornerstoneToolState.ts b/extensions/cornerstone-dicom-sr/src/utils/getFilteredCornerstoneToolState.ts index 18c5b8465..2c28311d5 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/getFilteredCornerstoneToolState.ts +++ b/extensions/cornerstone-dicom-sr/src/utils/getFilteredCornerstoneToolState.ts @@ -2,17 +2,12 @@ import OHIF from '@ohif/core'; import { annotation } from '@cornerstonejs/tools'; const { log } = OHIF; -function getFilteredCornerstoneToolState( - measurementData, - additionalFindingTypes -) { +function getFilteredCornerstoneToolState(measurementData, additionalFindingTypes) { const filteredToolState = {}; function addToFilteredToolState(annotation, toolType) { if (!annotation.metadata?.referencedImageId) { - log.warn( - `[DICOMSR] No referencedImageId found for ${toolType} ${annotation.id}` - ); + log.warn(`[DICOMSR] No referencedImageId found for ${toolType} ${annotation.id}`); return; } @@ -30,9 +25,7 @@ function getFilteredCornerstoneToolState( }; } - const measurementDataI = measurementData.find( - md => md.uid === annotation.annotationUID - ); + const measurementDataI = measurementData.find(md => md.uid === annotation.annotationUID); const toolData = imageIdSpecificToolState[toolType].data; let { finding } = measurementDataI; @@ -77,9 +70,7 @@ function getFilteredCornerstoneToolState( for (let i = 0; i < framesOfReference.length; i++) { const frameOfReference = framesOfReference[i]; - const frameOfReferenceAnnotations = annotationManager.getAnnotations( - frameOfReference - ); + const frameOfReferenceAnnotations = annotationManager.getAnnotations(frameOfReference); const toolTypes = Object.keys(frameOfReferenceAnnotations); @@ -91,9 +82,7 @@ function getFilteredCornerstoneToolState( if (annotations) { for (let k = 0; k < annotations.length; k++) { const annotation = annotations[k]; - const uidIndex = uids.findIndex( - uid => uid === annotation.annotationUID - ); + const uidIndex = uids.findIndex(uid => uid === annotation.annotationUID); if (uidIndex !== -1) { addToFilteredToolState(annotation, toolType); diff --git a/extensions/cornerstone-dicom-sr/src/utils/getLabelFromDCMJSImportedToolData.js b/extensions/cornerstone-dicom-sr/src/utils/getLabelFromDCMJSImportedToolData.js index 18a2ad1f5..1fa18ee9c 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/getLabelFromDCMJSImportedToolData.js +++ b/extensions/cornerstone-dicom-sr/src/utils/getLabelFromDCMJSImportedToolData.js @@ -9,9 +9,7 @@ export default function getLabelFromDCMJSImportedToolData(toolData) { const { findingSites = [], finding } = toolData; - let freeTextLabel = findingSites.find( - fs => fs.CodeValue === 'CORNERSTONEFREETEXT' - ); + let freeTextLabel = findingSites.find(fs => fs.CodeValue === 'CORNERSTONEFREETEXT'); if (freeTextLabel) { return freeTextLabel.CodeMeaning; diff --git a/extensions/cornerstone-dicom-sr/src/utils/hydrateStructuredReport.js b/extensions/cornerstone-dicom-sr/src/utils/hydrateStructuredReport.js index fbe06c922..17216a844 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/hydrateStructuredReport.js +++ b/extensions/cornerstone-dicom-sr/src/utils/hydrateStructuredReport.js @@ -49,19 +49,10 @@ export default function hydrateStructuredReport( const annotationManager = CsAnnotation.state.getAnnotationManager(); const disableEditing = appConfig?.disableEditing; const dataSource = extensionManager.getActiveDataSource()[0]; - const { - measurementService, - displaySetService, - customizationService, - } = servicesManager.services; + const { measurementService, displaySetService, customizationService } = servicesManager.services; - const codingValues = customizationService.getCustomization( - 'codingValues', - {} - ); - const displaySet = displaySetService.getDisplaySetByUID( - displaySetInstanceUID - ); + const codingValues = customizationService.getCustomization('codingValues', {}); + const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); // TODO -> We should define a strict versioning somewhere. const mappings = measurementService.getSourceMappings( @@ -125,16 +116,14 @@ export default function hydrateStructuredReport( // TODO: notification if no hydratable? Object.keys(hydratableMeasurementsInSR).forEach(annotationType => { - const toolDataForAnnotationType = - hydratableMeasurementsInSR[annotationType]; + const toolDataForAnnotationType = hydratableMeasurementsInSR[annotationType]; toolDataForAnnotationType.forEach(toolData => { // Add the measurement to toolState // dcmjs and Cornerstone3D has structural defect in supporting multi-frame // files, and looking up the imageId from sopInstanceUIDToImageId results // in the wrong value. - const frameNumber = - (toolData.annotation.data && toolData.annotation.data.frameNumber) || 1; + const frameNumber = (toolData.annotation.data && toolData.annotation.data.frameNumber) || 1; const imageId = imageIdsForToolState[toolData.sopInstanceUid][frameNumber] || sopInstanceUIDToImageId[toolData.sopInstanceUid]; @@ -150,10 +139,7 @@ export default function hydrateStructuredReport( for (let i = 0; i < imageIds.length; i++) { const imageId = imageIds[i]; - const { SeriesInstanceUID, StudyInstanceUID } = metaData.get( - 'instance', - imageId - ); + const { SeriesInstanceUID, StudyInstanceUID } = metaData.get('instance', imageId); if (!SeriesInstanceUIDs.includes(SeriesInstanceUID)) { SeriesInstanceUIDs.push(SeriesInstanceUID); @@ -162,23 +148,19 @@ export default function hydrateStructuredReport( if (!targetStudyInstanceUID) { targetStudyInstanceUID = StudyInstanceUID; } else if (targetStudyInstanceUID !== StudyInstanceUID) { - console.warn( - 'NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES.' - ); + console.warn('NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES.'); } } Object.keys(hydratableMeasurementsInSR).forEach(annotationType => { - const toolDataForAnnotationType = - hydratableMeasurementsInSR[annotationType]; + const toolDataForAnnotationType = hydratableMeasurementsInSR[annotationType]; toolDataForAnnotationType.forEach(toolData => { // Add the measurement to toolState // dcmjs and Cornerstone3D has structural defect in supporting multi-frame // files, and looking up the imageId from sopInstanceUIDToImageId results // in the wrong value. - const frameNumber = - (toolData.annotation.data && toolData.annotation.data.frameNumber) || 1; + const frameNumber = (toolData.annotation.data && toolData.annotation.data.frameNumber) || 1; const imageId = imageIdsForToolState[toolData.sopInstanceUid][frameNumber] || sopInstanceUIDToImageId[toolData.sopInstanceUid]; @@ -208,19 +190,11 @@ export default function hydrateStructuredReport( CORNERSTONE_3D_TOOLS_SOURCE_VERSION ); annotation.data.label = getLabelFromDCMJSImportedToolData(toolData); - annotation.data.finding = convertCode( - codingValues, - toolData.finding?.[0] - ); - annotation.data.findingSites = convertSites( - codingValues, - toolData.findingSites - ); + annotation.data.finding = convertCode(codingValues, toolData.finding?.[0]); + annotation.data.findingSites = convertSites(codingValues, toolData.findingSites); annotation.data.site = annotation.data.findingSites?.[0]; - const matchingMapping = mappings.find( - m => m.annotationType === annotationType - ); + const matchingMapping = mappings.find(m => m.annotationType === annotationType); const newAnnotationUID = measurementService.addRawMeasurement( source, @@ -231,9 +205,7 @@ export default function hydrateStructuredReport( ); if (disableEditing) { - const addedAnnotation = annotationManager.getAnnotation( - newAnnotationUID - ); + const addedAnnotation = annotationManager.getAnnotation(newAnnotationUID); locking.setAnnotationLocked(addedAnnotation, true); } @@ -262,15 +234,14 @@ function _mapLegacyDataSet(dataset) { ); // Retrieve the Measurements themselves - const measurementGroups = toArray( - imagingMeasurementContent.ContentSequence - ).filter(codeMeaningEquals(GROUP)); + const measurementGroups = toArray(imagingMeasurementContent.ContentSequence).filter( + codeMeaningEquals(GROUP) + ); // For each of the supported measurement types, compute the measurement data const measurementData = {}; - const cornerstoneToolClasses = - MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE; + const cornerstoneToolClasses = MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE; const registeredToolClasses = []; @@ -280,13 +251,10 @@ function _mapLegacyDataSet(dataset) { }); measurementGroups.forEach((measurementGroup, index) => { - const measurementGroupContentSequence = toArray( - measurementGroup.ContentSequence - ); + const measurementGroupContentSequence = toArray(measurementGroup.ContentSequence); const TrackingIdentifierGroup = measurementGroupContentSequence.find( - contentItem => - contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER + contentItem => contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER ); const TrackingIdentifier = TrackingIdentifierGroup.TextValue; @@ -304,7 +272,7 @@ function _mapLegacyDataSet(dataset) { return dataset; } -const toArray = function(x) { +const toArray = function (x) { return Array.isArray(x) ? x : [x]; }; diff --git a/extensions/cornerstone-dicom-sr/src/utils/isRehydratable.js b/extensions/cornerstone-dicom-sr/src/utils/isRehydratable.js index 41602dd25..d6f6a7484 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/isRehydratable.js +++ b/extensions/cornerstone-dicom-sr/src/utils/isRehydratable.js @@ -1,8 +1,7 @@ import { adaptersSR } from '@cornerstonejs/adapters'; const cornerstoneAdapters = - adaptersSR.Cornerstone3D.MeasurementReport - .CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE; + adaptersSR.Cornerstone3D.MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE; const supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0']; const CORNERSTONE_3D_TAG = cornerstoneAdapters.CORNERSTONE_3D_TAG; @@ -24,8 +23,7 @@ export default function isRehydratable(displaySet, mappings) { const adapterKeys = Object.keys(cornerstoneAdapters).filter( adapterKey => - typeof cornerstoneAdapters[adapterKey] - .isValidCornerstoneTrackingIdentifier === 'function' + typeof cornerstoneAdapters[adapterKey].isValidCornerstoneTrackingIdentifier === 'function' ); const adapters = []; @@ -48,19 +46,13 @@ export default function isRehydratable(displaySet, mappings) { const mappedTrackingIdentifier = `${cornerstoneTag}:${toolName}`; - return adapter.isValidCornerstoneTrackingIdentifier( - mappedTrackingIdentifier - ); + return adapter.isValidCornerstoneTrackingIdentifier(mappedTrackingIdentifier); }); if (hydratable) { return true; } - console.log( - 'Measurement is not rehydratable', - TrackingIdentifier, - measurements[i] - ); + console.log('Measurement is not rehydratable', TrackingIdentifier, measurements[i]); } console.log('No measurements found which were rehydratable'); diff --git a/extensions/cornerstone-dicom-sr/src/viewports/OHIFCornerstoneSRViewport.tsx b/extensions/cornerstone-dicom-sr/src/viewports/OHIFCornerstoneSRViewport.tsx index 0555694d8..3089056b6 100644 --- a/extensions/cornerstone-dicom-sr/src/viewports/OHIFCornerstoneSRViewport.tsx +++ b/extensions/cornerstone-dicom-sr/src/viewports/OHIFCornerstoneSRViewport.tsx @@ -11,8 +11,7 @@ import { useAppConfig } from '@state'; const { formatDate } = utils; -const MEASUREMENT_TRACKING_EXTENSION_ID = - '@ohif/extension-measurement-tracking'; +const MEASUREMENT_TRACKING_EXTENSION_ID = '@ohif/extension-measurement-tracking'; const SR_TOOLGROUP_BASE_NAME = 'SRToolGroup'; @@ -29,11 +28,8 @@ function OHIFCornerstoneSRViewport(props) { const [appConfig] = useAppConfig(); - const { - displaySetService, - cornerstoneViewportService, - measurementService, - } = servicesManager.services; + const { displaySetService, cornerstoneViewportService, measurementService } = + servicesManager.services; const viewportId = viewportOptions.viewportId; @@ -47,13 +43,8 @@ function OHIFCornerstoneSRViewport(props) { const [viewportGrid, viewportGridService] = useViewportGrid(); const [measurementSelected, setMeasurementSelected] = useState(0); const [measurementCount, setMeasurementCount] = useState(1); - const [activeImageDisplaySetData, setActiveImageDisplaySetData] = useState( - null - ); - const [ - referencedDisplaySetMetadata, - setReferencedDisplaySetMetadata, - ] = useState(null); + const [activeImageDisplaySetData, setActiveImageDisplaySetData] = useState(null); + const [referencedDisplaySetMetadata, setReferencedDisplaySetMetadata] = useState(null); const [element, setElement] = useState(null); const { viewports, activeViewportId } = viewportGrid; @@ -83,9 +74,7 @@ function OHIFCornerstoneSRViewport(props) { { servicesManager, extensionManager, appConfig }, displaySetInstanceUID ); - const displaySets = displaySetService.getDisplaySetsForSeries( - SeriesInstanceUIDs[0] - ); + const displaySets = displaySetService.getDisplaySetsForSeries(SeriesInstanceUIDs[0]); if (displaySets.length) { viewportGridService.setDisplaySetsForViewports([ { @@ -127,11 +116,7 @@ function OHIFCornerstoneSRViewport(props) { const updateViewport = useCallback( newMeasurementSelected => { - const { - StudyInstanceUID, - displaySetInstanceUID, - sopClassUids, - } = srDisplaySet; + const { StudyInstanceUID, displaySetInstanceUID, sopClassUids } = srDisplaySet; if (!StudyInstanceUID || !displaySetInstanceUID) { return; @@ -140,9 +125,7 @@ function OHIFCornerstoneSRViewport(props) { if (sopClassUids && sopClassUids.length > 1) { // Todo: what happens if there are multiple SOP Classes? Why we are // not throwing an error? - console.warn( - 'More than one SOPClassUID in the same series is not yet supported.' - ); + console.warn('More than one SOPClassUID in the same series is not yet supported.'); } _getViewportReferencedDisplaySetData( @@ -164,15 +147,11 @@ function OHIFCornerstoneSRViewport(props) { // imageIdIndex will handle it by updating the viewport, but if they // are the same we just need to use measurementService to jump to the // new measurement - const csViewport = cornerstoneViewportService.getCornerstoneViewport( - viewportId - ); + const csViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const imageIds = csViewport.getImageIds(); - const imageIdIndex = imageIds.indexOf( - measurements[newMeasurementSelected].imageId - ); + const imageIdIndex = imageIds.indexOf(measurements[newMeasurementSelected].imageId); if (imageIdIndex !== -1) { csViewport.setImageIdIndex(imageIdIndex); @@ -251,12 +230,7 @@ function OHIFCornerstoneSRViewport(props) { setTrackingIdentifiers(newMeasurementSelected); updateViewport(newMeasurementSelected); }, - [ - measurementSelected, - measurementCount, - updateViewport, - setTrackingIdentifiers, - ] + [measurementSelected, measurementCount, updateViewport, setTrackingIdentifiers] ); /** @@ -267,9 +241,7 @@ function OHIFCornerstoneSRViewport(props) { displaySetService.EVENTS.DISPLAY_SETS_REMOVED, ({ displaySetInstanceUIDs }) => { const activeViewport = viewports[activeViewportId]; - if ( - displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID) - ) { + if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) { viewportGridService.setDisplaySetsForViewport({ viewportId: activeViewportId, displaySetInstanceUIDs: [], @@ -384,23 +356,19 @@ function OHIFCornerstoneSRViewport(props) { currentSeries: SeriesNumber, seriesDescription: SeriesDescription || '', patientInformation: { - patientName: PatientName - ? OHIF.utils.formatPN(PatientName.Alphabetic) - : '', + patientName: PatientName ? OHIF.utils.formatPN(PatientName.Alphabetic) : '', patientSex: PatientSex || '', patientAge: PatientAge || '', MRN: PatientID || '', thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '', spacing: - SpacingBetweenSlices !== undefined - ? `${SpacingBetweenSlices.toFixed(2)}mm` - : '', + SpacingBetweenSlices !== undefined ? `${SpacingBetweenSlices.toFixed(2)}mm` : '', scanner: ManufacturerModelName || '', }, }} /> -
+
{getCornerstoneViewport()} {childrenWithProps}
@@ -435,9 +403,7 @@ async function _getViewportReferencedDisplaySetData( const { displaySetInstanceUID } = measurement; - const referencedDisplaySet = displaySetService.getDisplaySetByUID( - displaySetInstanceUID - ); + const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); const image0 = referencedDisplaySet.images[0]; const referencedDisplaySetMetadata = { @@ -477,8 +443,7 @@ function _getStatusComponent({ // 1 - Incompatible // 2 - Locked // 3 - Rehydratable / Open - const state = - isRehydratable && !isLocked ? 3 : isRehydratable && isLocked ? 2 : 1; + const state = isRehydratable && !isLocked ? 3 : isRehydratable && isLocked ? 2 : 1; let ToolTipMessage = null; let StatusIcon = null; @@ -509,23 +474,24 @@ function _getStatusComponent({ break; case 3: StatusIcon = () => ( - + ); - ToolTipMessage = () => ( -
{`Click ${loadStr} to restore measurements.`}
- ); + ToolTipMessage = () =>
{`Click ${loadStr} to restore measurements.`}
; } const StatusArea = () => ( -
-
+
+
SR
{state === 3 && (
@@ -538,7 +504,10 @@ function _getStatusComponent({ return ( <> {ToolTipMessage && ( - } position="bottom-left"> + } + position="bottom-left" + > )} diff --git a/extensions/cornerstone/.webpack/webpack.prod.js b/extensions/cornerstone/.webpack/webpack.prod.js index 74868eb44..c23590e69 100644 --- a/extensions/cornerstone/.webpack/webpack.prod.js +++ b/extensions/cornerstone/.webpack/webpack.prod.js @@ -40,13 +40,7 @@ module.exports = (env, argv) => { libraryTarget: 'umd', filename: pkg.main, }, - externals: [ - /\b(vtk.js)/, - /\b(dcmjs)/, - /\b(gl-matrix)/, - /^@ohif/, - /^@cornerstonejs/, - ], + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], plugins: [ new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, diff --git a/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx b/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx index d14263425..3de29dfd6 100644 --- a/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx +++ b/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx @@ -11,10 +11,7 @@ import { } from '@cornerstonejs/core'; import { MeasurementService } from '@ohif/core'; import { Notification, useViewportDialog } from '@ohif/ui'; -import { - IStackViewport, - IVolumeViewport, -} from '@cornerstonejs/core/dist/esm/types'; +import { IStackViewport, IVolumeViewport } from '@cornerstonejs/core/dist/esm/types'; import { setEnabledElement } from '../state'; @@ -42,24 +39,15 @@ function areEqual(prevProps, nextProps) { return false; } - if ( - prevProps.viewportOptions.orientation !== - nextProps.viewportOptions.orientation - ) { + if (prevProps.viewportOptions.orientation !== nextProps.viewportOptions.orientation) { return false; } - if ( - prevProps.viewportOptions.toolGroupId !== - nextProps.viewportOptions.toolGroupId - ) { + if (prevProps.viewportOptions.toolGroupId !== nextProps.viewportOptions.toolGroupId) { return false; } - if ( - prevProps.viewportOptions.viewportType !== - nextProps.viewportOptions.viewportType - ) { + if (prevProps.viewportOptions.viewportType !== nextProps.viewportOptions.viewportType) { return false; } @@ -79,8 +67,7 @@ function areEqual(prevProps, nextProps) { const foundDisplaySet = nextDisplaySets.find( nextDisplaySet => - nextDisplaySet.displaySetInstanceUID === - prevDisplaySet.displaySetInstanceUID + nextDisplaySet.displaySetInstanceUID === prevDisplaySet.displaySetInstanceUID ); if (!foundDisplaySet) { @@ -95,9 +82,7 @@ function areEqual(prevProps, nextProps) { // check if their imageIds are the same if (foundDisplaySet.images?.length) { for (let j = 0; j < foundDisplaySet.images.length; j++) { - if ( - foundDisplaySet.images[j].imageId !== prevDisplaySet.images[j].imageId - ) { + if (foundDisplaySet.images[j].imageId !== prevDisplaySet.images[j].imageId) { return false; } } @@ -163,16 +148,9 @@ const OHIFCornerstoneViewport = React.memo(props => { const renderingEngineId = viewportInfo.getRenderingEngineId(); const syncGroups = viewportInfo.getSyncGroups(); - toolGroupService.removeViewportFromToolGroup( - viewportId, - renderingEngineId - ); + toolGroupService.removeViewportFromToolGroup(viewportId, renderingEngineId); - syncGroupService.removeViewportFromSyncGroup( - viewportId, - renderingEngineId, - syncGroups - ); + syncGroupService.removeViewportFromSyncGroup(viewportId, renderingEngineId, syncGroups); }, [viewportId] ); @@ -185,9 +163,7 @@ const OHIFCornerstoneViewport = React.memo(props => { } const { viewportId, element } = evt.detail; - const viewportInfo = cornerstoneViewportService.getViewportInfo( - viewportId - ); + const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); setEnabledElement(viewportId, element); setEnabledVPElement(element); @@ -195,17 +171,9 @@ const OHIFCornerstoneViewport = React.memo(props => { const toolGroupId = viewportInfo.getToolGroupId(); const syncGroups = viewportInfo.getSyncGroups(); - toolGroupService.addViewportToToolGroup( - viewportId, - renderingEngineId, - toolGroupId - ); + toolGroupService.addViewportToToolGroup(viewportId, renderingEngineId, toolGroupId); - syncGroupService.addViewportToSyncGroup( - viewportId, - renderingEngineId, - syncGroups - ); + syncGroupService.addViewportToSyncGroup(viewportId, renderingEngineId, syncGroups); if (onElementEnabled) { onElementEnabled(evt); @@ -218,17 +186,12 @@ const OHIFCornerstoneViewport = React.memo(props => { useEffect(() => { cornerstoneViewportService.enableViewport(viewportId, elementRef.current); - eventTarget.addEventListener( - Enums.Events.ELEMENT_ENABLED, - elementEnabledHandler - ); + eventTarget.addEventListener(Enums.Events.ELEMENT_ENABLED, elementEnabledHandler); setImageScrollBarHeight(); return () => { - const viewportInfo = cornerstoneViewportService.getViewportInfo( - viewportId - ); + const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); if (!viewportInfo) { return; @@ -241,10 +204,7 @@ const OHIFCornerstoneViewport = React.memo(props => { onElementDisabled(viewportInfo); } - eventTarget.removeEventListener( - Enums.Events.ELEMENT_ENABLED, - elementEnabledHandler - ); + eventTarget.removeEventListener(Enums.Events.ELEMENT_ENABLED, elementEnabledHandler); }; }, []); @@ -267,9 +227,7 @@ const OHIFCornerstoneViewport = React.memo(props => { return; } - const viewportInfo = cornerstoneViewportService.getViewportInfo( - viewportId - ); + const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); if (viewportInfo.hasDisplaySet(invalidatedDisplaySetInstanceUID)) { const viewportData = viewportInfo.getViewportData(); @@ -281,11 +239,7 @@ const OHIFCornerstoneViewport = React.memo(props => { ); const keepCamera = true; - cornerstoneViewportService.updateViewport( - viewportId, - newViewportData, - keepCamera - ); + cornerstoneViewportService.updateViewport(viewportId, newViewportData, keepCamera); } } ); @@ -311,16 +265,11 @@ const OHIFCornerstoneViewport = React.memo(props => { // The presentation state will have been stored previously by closing // a viewport. Otherwise, this viewport will be unchanged and the // presentation information will be directly carried over. - const { - lutPresentationStore, - positionPresentationStore, - } = stateSyncService.getState(); + const { lutPresentationStore, positionPresentationStore } = stateSyncService.getState(); const { presentationIds } = viewportOptions; const presentations = { - positionPresentation: - positionPresentationStore[presentationIds?.positionPresentationId], - lutPresentation: - lutPresentationStore[presentationIds?.lutPresentationId], + positionPresentation: positionPresentationStore[presentationIds?.positionPresentationId], + lutPresentation: lutPresentationStore[presentationIds?.lutPresentationId], }; let measurement; if (cacheJumpToMeasurementEvent?.viewportId === viewportId) { @@ -459,11 +408,12 @@ function _subscribeToJumpToMeasurementEvents( } if (cacheJumpToMeasurementEvent.cornerstoneViewport === undefined) { // Decide on which viewport should handle this - cacheJumpToMeasurementEvent.cornerstoneViewport = cornerstoneViewportService.getViewportIdToJump( - jumpId, - measurement.displaySetInstanceUID, - { referencedImageId: measurement.referencedImageId } - ); + cacheJumpToMeasurementEvent.cornerstoneViewport = + cornerstoneViewportService.getViewportIdToJump( + jumpId, + measurement.displaySetInstanceUID, + { referencedImageId: measurement.referencedImageId } + ); } if (cacheJumpToMeasurementEvent.cornerstoneViewport !== viewportId) { return; @@ -500,9 +450,7 @@ function _checkForCachedJumpToMeasurementEvents( cacheJumpToMeasurementEvent = null; return; } - const displaysUIDs = displaySets.map( - displaySet => displaySet.displaySetInstanceUID - ); + const displaysUIDs = displaySets.map(displaySet => displaySet.displaySetInstanceUID); if (!displaysUIDs?.length) { return; } @@ -541,9 +489,7 @@ function _jumpToMeasurement( return; } - const referencedDisplaySet = displaySetService.getDisplaySetByUID( - displaySetInstanceUID - ); + const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); // Todo: setCornerstoneMeasurementActive should be handled by the toolGroupManager // to set it properly @@ -555,9 +501,7 @@ function _jumpToMeasurement( if (enabledElement) { // See how the jumpToSlice() of Cornerstone3D deals with imageIdx param. - const viewport = enabledElement.viewport as - | IStackViewport - | IVolumeViewport; + const viewport = enabledElement.viewport as IStackViewport | IVolumeViewport; let imageIdIndex = 0; let viewportCameraDirectionMatch = true; @@ -565,14 +509,9 @@ function _jumpToMeasurement( if (viewport instanceof StackViewport) { const imageIds = viewport.getImageIds(); imageIdIndex = imageIds.findIndex(imageId => { - const { - SOPInstanceUID: aSOPInstanceUID, - frameNumber: aFrameNumber, - } = getSOPInstanceAttributes(imageId); - return ( - aSOPInstanceUID === SOPInstanceUID && - (!frameNumber || frameNumber === aFrameNumber) - ); + const { SOPInstanceUID: aSOPInstanceUID, frameNumber: aFrameNumber } = + getSOPInstanceAttributes(imageId); + return aSOPInstanceUID === SOPInstanceUID && (!frameNumber || frameNumber === aFrameNumber); }); } else { // for volume viewport we can't rely on the imageIdIndex since it can be @@ -587,10 +526,7 @@ function _jumpToMeasurement( // should compare abs for both planes since the direction can be flipped if ( measurementViewPlane && - !csUtils.isEqual( - measurementViewPlane.map(Math.abs), - viewportViewPlane.map(Math.abs) - ) + !csUtils.isEqual(measurementViewPlane.map(Math.abs), viewportViewPlane.map(Math.abs)) ) { viewportCameraDirectionMatch = false; } @@ -629,10 +565,7 @@ OHIFCornerstoneViewport.propTypes = { // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation // of the imageData in the OHIFCornerstoneViewport. This prop is used // to set the initial state of the viewport's first image to render - initialImageIdOrIndex: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.number, - ]), + initialImageIdOrIndex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), }; export default OHIFCornerstoneViewport; diff --git a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx index 9e778c1eb..8745fdec7 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx +++ b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx @@ -3,12 +3,7 @@ import { vec3 } from 'gl-matrix'; import PropTypes from 'prop-types'; import { metaData, Enums, utilities } from '@cornerstonejs/core'; import { ViewportOverlay } from '@ohif/ui'; -import { - formatPN, - formatDICOMDate, - formatDICOMTime, - formatNumberPrecision, -} from './utils'; +import { formatPN, formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils'; import { InstanceMetadata } from 'platform/core/src/types'; import { ServicesManager } from '@ohif/core'; import { ImageSliceData } from '@cornerstonejs/core/dist/esm/types'; @@ -55,13 +50,9 @@ function VOIOverlayItem({ voi, customization }: OverlayItemProps) { style={{ color: (customization && customization.color) || undefined }} > W: - - {windowWidth.toFixed(0)} - + {windowWidth.toFixed(0)} L: - - {windowCenter.toFixed(0)} - + {windowCenter.toFixed(0)}
); } @@ -116,11 +107,8 @@ function CustomizableViewportOverlay({ viewportId, servicesManager, }) { - const { - toolbarService, - cornerstoneViewportService, - customizationService, - } = servicesManager.services; + const { toolbarService, cornerstoneViewportService, customizationService } = + servicesManager.services; const [voi, setVOI] = useState({ windowCenter: null, windowWidth: null }); const [scale, setScale] = useState(1); const [activeTools, setActiveTools] = useState([]); @@ -149,12 +137,7 @@ function CustomizableViewportOverlay({ const instanceNumber = useMemo(() => { if (viewportData != null) { - return _getInstanceNumber( - viewportData, - viewportId, - imageIndex, - cornerstoneViewportService - ); + return _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService); } return null; }, [viewportData, viewportId, imageIndex, cornerstoneViewportService]); @@ -178,10 +161,7 @@ function CustomizableViewportOverlay({ } const { lower, upper } = range; - const { windowWidth, windowCenter } = utilities.windowLevel.toWindowLevel( - lower, - upper - ); + const { windowWidth, windowCenter } = utilities.windowLevel.toWindowLevel(lower, upper); setVOI({ windowCenter, windowWidth }); }; @@ -204,9 +184,7 @@ function CustomizableViewportOverlay({ previousCamera.parallelScale !== camera.parallelScale || previousCamera.scale !== camera.scale ) { - const viewport = cornerstoneViewportService.getCornerstoneViewport( - viewportId - ); + const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); if (!viewport) { return; @@ -225,8 +203,7 @@ function CustomizableViewportOverlay({ const { spacing } = imageData; // convert parallel scale to scale - const scale = - (element.clientHeight * spacing[0] * 0.5) / camera.parallelScale; + const scale = (element.clientHeight * spacing[0] * 0.5) / camera.parallelScale; setScale(scale); } }; @@ -342,9 +319,7 @@ function CustomizableViewportOverlay({ return ( <> {items.map((item, i) => ( -
- {_renderOverlayItem(item)} -
+
{_renderOverlayItem(item)}
))} ); @@ -355,9 +330,7 @@ function CustomizableViewportOverlay({ return ( <> {items.map((item, i) => ( -
- {_renderOverlayItem(item)} -
+
{_renderOverlayItem(item)}
))} ); @@ -387,12 +360,7 @@ function _getViewportInstance(viewportData, imageIndex) { return imageId ? metaData.get('instance', imageId) || {} : {}; } -function _getInstanceNumber( - viewportData, - viewportId, - imageIndex, - cornerstoneViewportService -) { +function _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService) { let instanceNumber; if (viewportData.viewportType === Enums.ViewportType.STACK) { @@ -435,11 +403,7 @@ function _getInstanceNumberFromStack(viewportData, imageIndex) { // Since volume viewports can be in any view direction, they can render // a reconstructed image which don't have imageIds; therefore, no instance and instanceNumber // Here we check if viewport is in the acquisition direction and if so, we get the instanceNumber -function _getInstanceNumberFromVolume( - viewportData, - viewportId, - cornerstoneViewportService -) { +function _getInstanceNumberFromVolume(viewportData, viewportId, cornerstoneViewportService) { const volumes = viewportData.volumes; // Todo: support fusion of acquisition plane which has instanceNumber @@ -450,9 +414,7 @@ function _getInstanceNumberFromVolume( const volume = volumes[0]; const { direction, imageIds } = volume; - const cornerstoneViewport = cornerstoneViewportService.getCornerstoneViewport( - viewportId - ); + const cornerstoneViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); if (!cornerstoneViewport) { return; @@ -475,8 +437,7 @@ function _getInstanceNumberFromVolume( return {}; } - const { instanceNumber } = - metaData.get('generalImageModule', imageId) || {}; + const { instanceNumber } = metaData.get('generalImageModule', imageId) || {}; return parseInt(instanceNumber); } } diff --git a/extensions/cornerstone/src/Viewport/Overlays/ViewportImageScrollbar.tsx b/extensions/cornerstone/src/Viewport/Overlays/ViewportImageScrollbar.tsx index 26fe32e01..2f7b71a45 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/ViewportImageScrollbar.tsx +++ b/extensions/cornerstone/src/Viewport/Overlays/ViewportImageScrollbar.tsx @@ -14,15 +14,10 @@ function CornerstoneImageScrollbar({ scrollbarHeight, servicesManager, }) { - const { - cineService, - cornerstoneViewportService, - } = (servicesManager as ServicesManger).services; + const { cineService, cornerstoneViewportService } = (servicesManager as ServicesManger).services; const onImageScrollbarChange = (imageIndex, viewportId) => { - const viewport = cornerstoneViewportService.getCornerstoneViewport( - viewportId - ); + const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const { isCineEnabled } = cineService.getState(); @@ -43,9 +38,7 @@ function CornerstoneImageScrollbar({ return; } - const viewport = cornerstoneViewportService.getCornerstoneViewport( - viewportId - ); + const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); if (!viewport) { return; @@ -90,16 +83,10 @@ function CornerstoneImageScrollbar({ }); }; - element.addEventListener( - Enums.Events.STACK_VIEWPORT_SCROLL, - updateStackIndex - ); + element.addEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, updateStackIndex); return () => { - element.removeEventListener( - Enums.Events.STACK_VIEWPORT_SCROLL, - updateStackIndex - ); + element.removeEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, updateStackIndex); }; }, [viewportData, element]); @@ -117,19 +104,14 @@ function CornerstoneImageScrollbar({ element.addEventListener(Enums.Events.VOLUME_NEW_IMAGE, updateVolumeIndex); return () => { - element.removeEventListener( - Enums.Events.VOLUME_NEW_IMAGE, - updateVolumeIndex - ); + element.removeEventListener(Enums.Events.VOLUME_NEW_IMAGE, updateVolumeIndex); }; }, [viewportData, element]); return ( onImageScrollbarChange(evt, viewportId)} - max={ - imageSliceData.numberOfSlices ? imageSliceData.numberOfSlices - 1 : 0 - } + max={imageSliceData.numberOfSlices ? imageSliceData.numberOfSlices - 1 : 0} height={scrollbarHeight} value={imageSliceData.imageIndex} /> diff --git a/extensions/cornerstone/src/Viewport/Overlays/ViewportImageSliceLoadingIndicator.tsx b/extensions/cornerstone/src/Viewport/Overlays/ViewportImageSliceLoadingIndicator.tsx index fc483b5f4..70e03e534 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/ViewportImageSliceLoadingIndicator.tsx +++ b/extensions/cornerstone/src/Viewport/Overlays/ViewportImageSliceLoadingIndicator.tsx @@ -33,26 +33,14 @@ function ViewportImageSliceLoadingIndicator({ viewportData, element }) { }; useEffect(() => { - element.addEventListener( - Enums.Events.STACK_VIEWPORT_SCROLL, - setLoadingState - ); + element.addEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, setLoadingState); element.addEventListener(Enums.Events.IMAGE_LOAD_ERROR, setErrorState); - element.addEventListener( - Enums.Events.STACK_NEW_IMAGE, - setFinishLoadingState - ); + element.addEventListener(Enums.Events.STACK_NEW_IMAGE, setFinishLoadingState); return () => { - element.removeEventListener( - Enums.Events.STACK_VIEWPORT_SCROLL, - setLoadingState - ); + element.removeEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, setLoadingState); - element.removeEventListener( - Enums.Events.STACK_NEW_IMAGE, - setFinishLoadingState - ); + element.removeEventListener(Enums.Events.STACK_NEW_IMAGE, setFinishLoadingState); element.removeEventListener(Enums.Events.IMAGE_LOAD_ERROR, setErrorState); }; @@ -61,8 +49,8 @@ function ViewportImageSliceLoadingIndicator({ viewportData, element }) { if (error) { return ( <> -
-
+
+

Error Loading Image

An error has occurred.

@@ -78,8 +66,8 @@ function ViewportImageSliceLoadingIndicator({ viewportData, element }) { return ( // IMPORTANT: we need to use the pointer-events-none class to prevent the loading indicator from // interacting with the mouse, since scrolling should propagate to the viewport underneath -
-
+
+

Loading...

diff --git a/extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx b/extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx index d0ba9550a..2f33456a4 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx +++ b/extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx @@ -13,10 +13,7 @@ import { vec3 } from 'gl-matrix'; import './ViewportOrientationMarkers.css'; -const { - getOrientationStringLPS, - invertOrientationStringLPS, -} = utilities.orientation; +const { getOrientationStringLPS, invertOrientationStringLPS } = utilities.orientation; function ViewportOrientationMarkers({ element, @@ -33,9 +30,7 @@ function ViewportOrientationMarkers({ const { cornerstoneViewportService } = servicesManager.services; useEffect(() => { - const cameraModifiedListener = ( - evt: Types.EventTypes.CameraModifiedEvent - ) => { + const cameraModifiedListener = (evt: Types.EventTypes.CameraModifiedEvent) => { const { rotation, previousCamera, camera } = evt.detail; if (rotation !== undefined) { @@ -57,16 +52,10 @@ function ViewportOrientationMarkers({ } }; - element.addEventListener( - Enums.Events.CAMERA_MODIFIED, - cameraModifiedListener - ); + element.addEventListener(Enums.Events.CAMERA_MODIFIED, cameraModifiedListener); return () => { - element.removeEventListener( - Enums.Events.CAMERA_MODIFIED, - cameraModifiedListener - ); + element.removeEventListener(Enums.Events.CAMERA_MODIFIED, cameraModifiedListener); }; }, []); @@ -85,8 +74,7 @@ function ViewportOrientationMarkers({ return false; } - ({ rowCosines, columnCosines } = - metaData.get('imagePlaneModule', imageId) || {}); + ({ rowCosines, columnCosines } = metaData.get('imagePlaneModule', imageId) || {}); } else { if (!element || !getEnabledElement(element)) { return ''; @@ -124,9 +112,7 @@ function ViewportOrientationMarkers({ // Todo: probably this can be done in a better way in which we identify bright // background - const isLight = backgroundColor - ? csUtils.isEqual(backgroundColor, [1, 1, 1]) - : false; + const isLight = backgroundColor ? csUtils.isEqual(backgroundColor, [1, 1, 1]) : false; return orientationMarkers.map((m, index) => (
{ - const viewportInfo = cornerstoneViewportService.getViewportInfo( - viewportId - ); + const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); if (!viewportInfo) { console.warn('No viewport found for viewportId:', viewportId); return; @@ -249,9 +230,7 @@ function commandsModule({ const { isCineEnabled } = cineService.getState(); cineService.setIsCineEnabled(!isCineEnabled); toolbarService.setButton('Cine', { props: { isActive: !isCineEnabled } }); - viewports.forEach((_, index) => - cineService.setCine({ id: index, isPlaying: false }) - ); + viewports.forEach((_, index) => cineService.setCine({ id: index, isPlaying: false })); }, setWindowLevel({ window, level, toolGroupId }) { // convert to numbers @@ -259,9 +238,7 @@ function commandsModule({ const windowCenterNum = Number(level); const { viewportId } = _getActiveViewportEnabledElement(); - const viewportToolGroupId = toolGroupService.getToolGroupForViewport( - viewportId - ); + const viewportToolGroupId = toolGroupService.getToolGroupForViewport(viewportId); if (toolGroupId && toolGroupId !== viewportToolGroupId) { return; @@ -271,10 +248,7 @@ function commandsModule({ const renderingEngine = cornerstoneViewportService.getRenderingEngine(); const viewport = renderingEngine.getViewport(viewportId); - const { lower, upper } = csUtils.windowLevel.toLowHighRange( - windowWidthNum, - windowCenterNum - ); + const { lower, upper } = csUtils.windowLevel.toLowHighRange(windowWidthNum, windowCenterNum); viewport.setProperties({ voiRange: { @@ -323,11 +297,9 @@ function commandsModule({ return; } - const filteredViewports = Array.from(viewports.values()).filter( - viewport => { - return toolGroupViewportIds.includes(viewport.viewportId); - } - ); + const filteredViewports = Array.from(viewports.values()).filter(viewport => { + return toolGroupViewportIds.includes(viewport.viewportId); + }); if (!filteredViewports.length) { return; @@ -367,9 +339,7 @@ function commandsModule({ showDownloadViewportModal: () => { const { activeViewportId } = viewportGridService.getState(); - if ( - !cornerstoneViewportService.getCornerstoneViewport(activeViewportId) - ) { + if (!cornerstoneViewportService.getCornerstoneViewport(activeViewportId)) { // Cannot download a non-cornerstone viewport (image). uiNotificationService.show({ title: 'Download Image', @@ -508,9 +478,7 @@ function commandsModule({ } viewport = enabledElement.viewport; } else { - viewport = cornerstoneViewportService.getCornerstoneViewport( - gridViewport.id - ); + viewport = cornerstoneViewportService.getCornerstoneViewport(gridViewport.id); } // Get number of slices @@ -520,14 +488,12 @@ function commandsModule({ if (viewport instanceof StackViewport) { numberOfSlices = viewport.getImageIds().length; } else if (viewport instanceof VolumeViewport) { - numberOfSlices = csUtils.getImageSliceDataForVolumeViewport(viewport) - .numberOfSlices; + numberOfSlices = csUtils.getImageSliceDataForVolumeViewport(viewport).numberOfSlices; } else { throw new Error('Unsupported viewport type'); } - const jumpIndex = - imageIndex < 0 ? numberOfSlices + imageIndex : imageIndex; + const jumpIndex = imageIndex < 0 ? numberOfSlices + imageIndex : imageIndex; if (jumpIndex >= numberOfSlices || jumpIndex < 0) { throw new Error(`Can't jump to ${imageIndex}`); } @@ -548,15 +514,8 @@ function commandsModule({ cstUtils.scroll(viewport, options); }, - setViewportColormap: ({ - viewportId, - displaySetInstanceUID, - colormap, - immediate = false, - }) => { - const viewport = cornerstoneViewportService.getCornerstoneViewport( - viewportId - ); + setViewportColormap: ({ viewportId, displaySetInstanceUID, colormap, immediate = false }) => { + const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const actorEntries = viewport.getActors(); @@ -578,9 +537,7 @@ function commandsModule({ const currentIndex = viewportIds.indexOf(activeViewportId); const nextViewportIndex = (currentIndex + direction + viewportIds.length) % viewportIds.length; - viewportGridService.setActiveViewportId( - viewportIds[nextViewportIndex] as string - ); + viewportGridService.setActiveViewportId(viewportIds[nextViewportIndex] as string); }, toggleStackImageSync: ({ toggledState }) => { @@ -592,9 +549,7 @@ function commandsModule({ }, toggleReferenceLines: ({ toggledState }) => { const { activeViewportId } = viewportGridService.getState(); - const viewportInfo = cornerstoneViewportService.getViewportInfo( - activeViewportId - ); + const viewportInfo = cornerstoneViewportService.getViewportInfo(activeViewportId); const viewportId = viewportInfo.getViewportId(); const toolGroup = toolGroupService.getToolGroupForViewport(viewportId); diff --git a/extensions/cornerstone/src/components/CinePlayer/CinePlayer.tsx b/extensions/cornerstone/src/components/CinePlayer/CinePlayer.tsx index d39f3bab0..e4e080422 100644 --- a/extensions/cornerstone/src/components/CinePlayer/CinePlayer.tsx +++ b/extensions/cornerstone/src/components/CinePlayer/CinePlayer.tsx @@ -46,17 +46,11 @@ function WrappedCinePlayer({ enabledVPElement, viewportId, servicesManager }) { }; useEffect(() => { - eventTarget.addEventListener( - Enums.Events.STACK_VIEWPORT_NEW_STACK, - cineHandler - ); + eventTarget.addEventListener(Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler); return () => { cineService.setCine({ id: viewportId, isPlaying: false }); - eventTarget.removeEventListener( - Enums.Events.STACK_VIEWPORT_NEW_STACK, - cineHandler - ); + eventTarget.removeEventListener(Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler); }; }, [enabledVPElement]); @@ -80,7 +74,7 @@ function WrappedCinePlayer({ enabledVPElement, viewportId, servicesManager }) { return ( isCineEnabled && ( diff --git a/extensions/cornerstone/src/components/DicomUpload/DicomUpload.css b/extensions/cornerstone/src/components/DicomUpload/DicomUpload.css index 55ddf7922..d37d2a6a6 100644 --- a/extensions/cornerstone/src/components/DicomUpload/DicomUpload.css +++ b/extensions/cornerstone/src/components/DicomUpload/DicomUpload.css @@ -1,6 +1,23 @@ .dicom-upload-drop-area-border-dash { - background-image: repeating-linear-gradient(to right, #7BB2CE 0%, #7BB2CE 50%, transparent 50%, transparent 100%), repeating-linear-gradient(to right, #7BB2CE 0%, #7BB2CE 50%, transparent 50%, transparent 100%), repeating-linear-gradient(to bottom, #7BB2CE 0%, #7BB2CE 50%, transparent 50%, transparent 100%), repeating-linear-gradient(to bottom, #7BB2CE 0%, #7BB2CE 50%, transparent 50%, transparent 100%); - background-position: left top, left bottom, left top, right top; + background-image: repeating-linear-gradient( + to right, + #7bb2ce 0%, + #7bb2ce 50%, + transparent 50%, + transparent 100% + ), + repeating-linear-gradient(to right, #7bb2ce 0%, #7bb2ce 50%, transparent 50%, transparent 100%), + repeating-linear-gradient(to bottom, #7bb2ce 0%, #7bb2ce 50%, transparent 50%, transparent 100%), + repeating-linear-gradient(to bottom, #7bb2ce 0%, #7bb2ce 50%, transparent 50%, transparent 100%); + background-position: + left top, + left bottom, + left top, + right top; background-repeat: repeat-x, repeat-x, repeat-y, repeat-y; - background-size: 20px 3px, 20px 3px, 3px 20px, 3px 20px; + background-size: + 20px 3px, + 20px 3px, + 3px 20px, + 3px 20px; } diff --git a/extensions/cornerstone/src/components/DicomUpload/DicomUpload.tsx b/extensions/cornerstone/src/components/DicomUpload/DicomUpload.tsx index e90728cb3..8284ee070 100644 --- a/extensions/cornerstone/src/components/DicomUpload/DicomUpload.tsx +++ b/extensions/cornerstone/src/components/DicomUpload/DicomUpload.tsx @@ -14,19 +14,13 @@ type DicomUploadProps = { onStarted: () => void; }; -function DicomUpload({ - dataSource, - onComplete, - onStarted, -}: DicomUploadProps): ReactElement { +function DicomUpload({ dataSource, onComplete, onStarted }: DicomUploadProps): ReactElement { const baseClassNames = 'min-h-[480px] flex flex-col bg-black select-none'; const [dicomFileUploaderArr, setDicomFileUploaderArr] = useState([]); const onDrop = useCallback(async acceptedFiles => { onStarted(); - setDicomFileUploaderArr( - acceptedFiles.map(file => new DicomFileUploader(file, dataSource)) - ); + setDicomFileUploaderArr(acceptedFiles.map(file => new DicomFileUploader(file, dataSource))); }, []); const getDropZoneComponent = (): ReactElement => { @@ -40,20 +34,29 @@ function DicomUpload({ {({ getRootProps }) => (
- + {({ getRootProps, getInputProps }) => (
-
)}
- + {({ getRootProps, getInputProps }) => (
or drag images or folders here
-
- (DICOM files supported) -
+
(DICOM files supported)
)} @@ -92,9 +93,7 @@ function DicomUpload({ />
) : ( -
- {getDropZoneComponent()} -
+
{getDropZoneComponent()}
)} ); diff --git a/extensions/cornerstone/src/components/DicomUpload/DicomUploadProgress.tsx b/extensions/cornerstone/src/components/DicomUpload/DicomUploadProgress.tsx index 6fd14823a..c09d96988 100644 --- a/extensions/cornerstone/src/components/DicomUpload/DicomUploadProgress.tsx +++ b/extensions/cornerstone/src/components/DicomUpload/DicomUploadProgress.tsx @@ -1,10 +1,4 @@ -import React, { - useCallback, - useEffect, - useRef, - useState, - ReactElement, -} from 'react'; +import React, { useCallback, useEffect, useRef, useState, ReactElement } from 'react'; import PropTypes from 'prop-types'; import { Button, Icon, ProgressLoadingBar } from '@ohif/ui'; import DicomFileUploader, { @@ -39,18 +33,14 @@ const BASE_INTERVAL_TIME = 15000; // calculate the upload rate. const UPLOAD_RATE_THRESHOLD = 75; -const NO_WRAP_ELLIPSIS_CLASS_NAMES = - 'text-ellipsis whitespace-nowrap overflow-hidden'; +const NO_WRAP_ELLIPSIS_CLASS_NAMES = 'text-ellipsis whitespace-nowrap overflow-hidden'; function DicomUploadProgress({ dicomFileUploaderArr, onComplete, }: DicomUploadProgressProps): ReactElement { const [totalUploadSize] = useState( - dicomFileUploaderArr.reduce( - (acc, fileUploader) => acc + fileUploader.getFileSize(), - 0 - ) + dicomFileUploaderArr.reduce((acc, fileUploader) => acc + fileUploader.getFileSize(), 0) ); const currentUploadSizeRef = useRef(0); @@ -83,15 +73,13 @@ function DicomUploadProgress({ let intervalStartTime = Date.now(); const setUploadRateRef = () => { - const uploadSizeFromStartOfInterval = - currentUploadSizeRef.current - intervalStartUploadSize; + const uploadSizeFromStartOfInterval = currentUploadSizeRef.current - intervalStartUploadSize; const now = Date.now(); const timeSinceStartOfInterval = now - intervalStartTime; // Calculate and set the upload rate (ref) - uploadRateRef.current = - uploadSizeFromStartOfInterval / timeSinceStartOfInterval; + uploadRateRef.current = uploadSizeFromStartOfInterval / timeSinceStartOfInterval; // Reset the interval starting values. intervalStartUploadSize = currentUploadSizeRef.current; @@ -134,28 +122,19 @@ function DicomUploadProgress({ const updateProgress = (percentComplete: number) => { const previousFileUploadSize = currentFileUploadSize; - currentFileUploadSize = Math.round( - (percentComplete / 100) * fileUploader.getFileSize() - ); + currentFileUploadSize = Math.round((percentComplete / 100) * fileUploader.getFileSize()); currentUploadSizeRef.current = Math.min( totalUploadSize, - currentUploadSizeRef.current - - previousFileUploadSize + - currentFileUploadSize + currentUploadSizeRef.current - previousFileUploadSize + currentFileUploadSize ); - setPercentComplete( - (currentUploadSizeRef.current / totalUploadSize) * 100 - ); + setPercentComplete((currentUploadSizeRef.current / totalUploadSize) * 100); if (uploadRateRef.current !== 0) { - const uploadSizeRemaining = - totalUploadSize - currentUploadSizeRef.current; + const uploadSizeRemaining = totalUploadSize - currentUploadSizeRef.current; - const timeRemaining = Math.round( - uploadSizeRemaining / uploadRateRef.current - ); + const timeRemaining = Math.round(uploadSizeRemaining / uploadRateRef.current); if (currentTimeRemaining === null) { currentTimeRemaining = timeRemaining; @@ -168,9 +147,7 @@ function DicomUploadProgress({ // due to rounding, inaccuracies in the estimate and slight variations // in upload rates over time. if (timeRemaining < ONE_MINUTE) { - const currentSecondsRemaining = Math.ceil( - currentTimeRemaining / ONE_SECOND - ); + const currentSecondsRemaining = Math.ceil(currentTimeRemaining / ONE_SECOND); const secondsRemaining = Math.ceil(timeRemaining / ONE_SECOND); const delta = secondsRemaining - currentSecondsRemaining; if (delta < 0 || delta > 2) { @@ -181,9 +158,7 @@ function DicomUploadProgress({ } if (timeRemaining < ONE_HOUR) { - const currentMinutesRemaining = Math.ceil( - currentTimeRemaining / ONE_MINUTE - ); + const currentMinutesRemaining = Math.ceil(currentTimeRemaining / ONE_MINUTE); const minutesRemaining = Math.ceil(timeRemaining / ONE_MINUTE); const delta = minutesRemaining - currentMinutesRemaining; if (delta < 0 || delta > 2) { @@ -199,9 +174,7 @@ function DicomUploadProgress({ } }; - const progressCallback = ( - progressEvent: DicomFileUploaderProgressEvent - ) => { + const progressCallback = (progressEvent: DicomFileUploaderProgressEvent) => { updateProgress(progressEvent.percentComplete); }; @@ -249,16 +222,12 @@ function DicomUploadProgress({ if (timeRemaining < ONE_MINUTE) { const secondsRemaining = Math.ceil(timeRemaining / ONE_SECOND); - return `${secondsRemaining} ${ - secondsRemaining === 1 ? 'second' : 'seconds' - }`; + return `${secondsRemaining} ${secondsRemaining === 1 ? 'second' : 'seconds'}`; } if (timeRemaining < ONE_HOUR) { const minutesRemaining = Math.ceil(timeRemaining / ONE_MINUTE); - return `${minutesRemaining} ${ - minutesRemaining === 1 ? 'minute' : 'minutes' - }`; + return `${minutesRemaining} ${minutesRemaining === 1 ? 'minute' : 'minutes'}`; } const hoursRemaining = Math.ceil(timeRemaining / ONE_HOUR); @@ -278,9 +247,7 @@ function DicomUploadProgress({ const showInfiniteProgressBar = useCallback((): boolean => { return ( getPercentCompleteRounded() < 1 && - (progressBarContainerRef?.current?.offsetWidth ?? 0) * - (percentComplete / 100) < - 1 + (progressBarContainerRef?.current?.offsetWidth ?? 0) * (percentComplete / 100) < 1 ); }, [getPercentCompleteRounded, percentComplete]); @@ -300,15 +267,17 @@ function DicomUploadProgress({ const getNumCompletedAndTimeRemainingComponent = (): ReactElement => { return ( -
+
{numFilesCompleted === dicomFileUploaderArr.length ? ( <> - {`${ - dicomFileUploaderArr.length - } ${ + {`${dicomFileUploaderArr.length} ${ dicomFileUploaderArr.length > 1 ? 'files' : 'file' } completed.`} - @@ -320,18 +289,14 @@ function DicomUploadProgress({ > {`${numFilesCompleted} of ${dicomFileUploaderArr.length}`}  + {' files completed.'}  - {' files completed.'}  - - - {timeRemaining - ? `Less than ${getFormattedTimeRemaining()} remaining. ` - : ''} + {timeRemaining ? `Less than ${getFormattedTimeRemaining()} remaining. ` : ''} @@ -345,14 +310,13 @@ function DicomUploadProgress({ const getShowFailedOnlyIconComponent = (): ReactElement => { return ( -
+
{numFails > 0 && ( -
- setShowFailedOnly(currentShowFailedOnly => !currentShowFailedOnly) - } - > - +
setShowFailedOnly(currentShowFailedOnly => !currentShowFailedOnly)}> +
)}
@@ -361,31 +325,28 @@ function DicomUploadProgress({ const getPercentCompleteComponent = (): ReactElement => { return ( -
-
+
+
{numFilesCompleted === dicomFileUploaderArr.length ? ( <> -
+
{numFails > 0 - ? `Completed with ${numFails} ${ - numFails > 1 ? 'errors' : 'error' - }!` + ? `Completed with ${numFails} ${numFails > 1 ? 'errors' : 'error'}!` : 'Completed!'}
{getShowFailedOnlyIconComponent()} ) : ( <> -
+
-
+
{`${getPercentCompleteRounded()}%`}
{getShowFailedOnlyIconComponent()}
@@ -397,16 +358,15 @@ function DicomUploadProgress({ }; return ( -
+
{getNumCompletedAndTimeRemainingComponent()} -
+
{getPercentCompleteComponent()} -
+
{dicomFileUploaderArr .filter( dicomFileUploader => - !showFailedOnly || - dicomFileUploader.getStatus() === UploadStatus.Failed + !showFailedOnly || dicomFileUploader.getStatus() === UploadStatus.Failed ) .map(dicomFileUploader => ( { - const [percentComplete, setPercentComplete] = useState( - dicomFileUploader.getPercentComplete() - ); + const [percentComplete, setPercentComplete] = useState(dicomFileUploader.getPercentComplete()); const [failedReason, setFailedReason] = useState(''); const [status, setStatus] = useState(dicomFileUploader.getStatus()); @@ -62,7 +54,10 @@ const DicomUploadProgressItem = memo( switch (dicomFileUploader.getStatus()) { case UploadStatus.Success: return ( - + ); case UploadStatus.InProgress: return ; @@ -76,27 +71,25 @@ const DicomUploadProgressItem = memo( }; return ( -
-
+
+
-
- {getStatusIcon()} -
-
+
{getStatusIcon()}
+
{dicomFileUploader.getFileName()}
{failedReason &&
{failedReason}
}
-
+
{!isComplete() && ( <> {dicomFileUploader.getStatus() === UploadStatus.InProgress && (
{percentComplete}%
)} -
+
diff --git a/extensions/cornerstone/src/index.tsx b/extensions/cornerstone/src/index.tsx index 96f0f5a67..d766776e6 100644 --- a/extensions/cornerstone/src/index.tsx +++ b/extensions/cornerstone/src/index.tsx @@ -31,9 +31,7 @@ import { measurementMappingUtils } from './utils/measurementServiceMappings'; import type { PublicViewportOptions } from './services/ViewportService/Viewport'; const Component = React.lazy(() => { - return import( - /* webpackPrefetch: true */ './Viewport/OHIFCornerstoneViewport' - ); + return import(/* webpackPrefetch: true */ './Viewport/OHIFCornerstoneViewport'); }); const OHIFCornerstoneViewport = props => { @@ -69,9 +67,7 @@ const cornerstoneExtension: Types.Extensions.Extension = { * * @param configuration.csToolsConfig - Passed directly to `initCornerstoneTools` */ - preRegistration: function ( - props: Types.Extensions.ExtensionParams - ): Promise { + preRegistration: function (props: Types.Extensions.ExtensionParams): Promise { const { servicesManager } = props; servicesManager.registerService(CornerstoneViewportService.REGISTRATION); servicesManager.registerService(ToolGroupService.REGISTRATION); @@ -139,5 +135,10 @@ const cornerstoneExtension: Types.Extensions.Extension = { }; export type { PublicViewportOptions }; -export { measurementMappingUtils, CornerstoneExtensionTypes, toolNames , getActiveViewportEnabledElement}; +export { + measurementMappingUtils, + CornerstoneExtensionTypes, + toolNames, + getActiveViewportEnabledElement, +}; export default cornerstoneExtension; diff --git a/extensions/cornerstone/src/init.tsx b/extensions/cornerstone/src/init.tsx index 3938189b2..6be18b363 100644 --- a/extensions/cornerstone/src/init.tsx +++ b/extensions/cornerstone/src/init.tsx @@ -49,8 +49,7 @@ export default async function init({ ...cornerstone.getConfiguration(), rendering: { ...cornerstone.getConfiguration().rendering, - strictZSpacingForVolumeViewport: - appConfig.strictZSpacingForVolumeViewport, + strictZSpacingForVolumeViewport: appConfig.strictZSpacingForVolumeViewport, }, }); @@ -62,10 +61,7 @@ export default async function init({ initCornerstoneTools(); - Settings.getRuntimeSettings().set( - 'useCursors', - Boolean(appConfig.useCursors) - ); + Settings.getRuntimeSettings().set('useCursors', Boolean(appConfig.useCursors)); const { userAuthenticationService, @@ -84,22 +80,15 @@ export default async function init({ window.extensionManager = extensionManager; window.commandsManager = commandsManager; - if ( - appConfig.showWarningMessageForCrossOrigin && - !window.crossOriginIsolated - ) { + if (appConfig.showWarningMessageForCrossOrigin && !window.crossOriginIsolated) { uiNotificationService.show({ title: 'Cross Origin Isolation', - message: - 'Cross Origin Isolation is not enabled, volume rendering will not work (e.g., MPR)', + message: 'Cross Origin Isolation is not enabled, volume rendering will not work (e.g., MPR)', type: 'warning', }); } - if ( - appConfig.showCPUFallbackMessage && - cornerstone.getShouldUseCPURendering() - ) { + if (appConfig.showCPUFallbackMessage && cornerstone.getShouldUseCPURendering()) { _showCPURenderingModal(uiModalService, hangingProtocolService); } @@ -119,18 +108,14 @@ export default async function init({ clearOnModeExit: true, }); - const labelmapRepresentation = - cornerstoneTools.Enums.SegmentationRepresentations.Labelmap; + const labelmapRepresentation = cornerstoneTools.Enums.SegmentationRepresentations.Labelmap; - cornerstoneTools.segmentation.config.setGlobalRepresentationConfig( - labelmapRepresentation, - { - fillAlpha: 0.3, - fillAlphaInactive: 0.2, - outlineOpacity: 1, - outlineOpacityInactive: 0.65, - } - ); + cornerstoneTools.segmentation.config.setGlobalRepresentationConfig(labelmapRepresentation, { + fillAlpha: 0.3, + fillAlphaInactive: 0.2, + outlineOpacity: 1, + outlineOpacityInactive: 0.65, + }); const metadataProvider = OHIF.classes.MetadataProvider; @@ -139,14 +124,8 @@ export default async function init({ cornerstoneStreamingImageVolumeLoader ); - hangingProtocolService.registerImageLoadStrategy( - 'interleaveCenter', - interleaveCenterLoader - ); - hangingProtocolService.registerImageLoadStrategy( - 'interleaveTopToBottom', - interleaveTopToBottom - ); + hangingProtocolService.registerImageLoadStrategy('interleaveCenter', interleaveCenterLoader); + hangingProtocolService.registerImageLoadStrategy('interleaveTopToBottom', interleaveTopToBottom); hangingProtocolService.registerImageLoadStrategy('nth', nthLoader); // add metadata providers @@ -166,9 +145,7 @@ export default async function init({ initWADOImageLoader(userAuthenticationService, appConfig, extensionManager); /* Measurement Service */ - this.measurementServiceSource = connectToolsToMeasurementService( - servicesManager - ); + this.measurementServiceSource = connectToolsToMeasurementService(servicesManager); initCineService(cineService); @@ -178,31 +155,18 @@ export default async function init({ volumeInputArrayMap => { for (const entry of volumeInputArrayMap.entries()) { const [viewportId, volumeInputArray] = entry; - const viewport = cornerstoneViewportService.getCornerstoneViewport( - viewportId - ); + const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); - const ohifViewport = cornerstoneViewportService.getViewportInfo( - viewportId - ); + const ohifViewport = cornerstoneViewportService.getViewportInfo(viewportId); - const { - lutPresentationStore, - positionPresentationStore, - } = stateSyncService.getState(); + const { lutPresentationStore, positionPresentationStore } = stateSyncService.getState(); const { presentationIds } = ohifViewport.getViewportOptions(); const presentations = { - positionPresentation: - positionPresentationStore[presentationIds?.positionPresentationId], - lutPresentation: - lutPresentationStore[presentationIds?.lutPresentationId], + positionPresentation: positionPresentationStore[presentationIds?.positionPresentationId], + lutPresentation: lutPresentationStore[presentationIds?.lutPresentationId], }; - cornerstoneViewportService.setVolumesForViewport( - viewport, - volumeInputArray, - presentations - ); + cornerstoneViewportService.setVolumesForViewport(viewport, volumeInputArray, presentations); } } ); @@ -225,9 +189,7 @@ export default async function init({ const resetCrosshairs = evt => { const { element } = evt.detail; - const { viewportId, renderingEngineId } = cornerstone.getEnabledElement( - element - ); + const { viewportId, renderingEngineId } = cornerstone.getEnabledElement(element); const toolGroup = cornerstoneTools.ToolGroupManager.getToolGroupForViewport( viewportId, @@ -253,10 +215,7 @@ export default async function init({ const { element } = evt.detail; element.addEventListener(EVENTS.CAMERA_RESET, resetCrosshairs); - eventTarget.addEventListener( - EVENTS.STACK_VIEWPORT_NEW_STACK, - newStackCallback - ); + eventTarget.addEventListener(EVENTS.STACK_VIEWPORT_NEW_STACK, newStackCallback); } function elementDisabledHandler(evt) { @@ -271,15 +230,9 @@ export default async function init({ // ); } - eventTarget.addEventListener( - EVENTS.ELEMENT_ENABLED, - elementEnabledHandler.bind(null) - ); + eventTarget.addEventListener(EVENTS.ELEMENT_ENABLED, elementEnabledHandler.bind(null)); - eventTarget.addEventListener( - EVENTS.ELEMENT_DISABLED, - elementDisabledHandler.bind(null) - ); + eventTarget.addEventListener(EVENTS.ELEMENT_DISABLED, elementDisabledHandler.bind(null)); viewportGridService.subscribe( viewportGridService.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED, @@ -292,8 +245,7 @@ export default async function init({ // check if reference lines are active const referenceLinesEnabled = - toolGroup._toolInstances['ReferenceLines'].mode === - Enums.ToolModes.Enabled; + toolGroup._toolInstances['ReferenceLines'].mode === Enums.ToolModes.Enabled; if (!referenceLinesEnabled) { return; @@ -318,10 +270,9 @@ function CPUModal() { return (

- Your computer does not have enough GPU power to support the default GPU - rendering mode. OHIF has switched to CPU rendering mode. Please note - that CPU rendering does not support all features such as Volume - Rendering, Multiplanar Reconstruction, and Segmentation Overlays. + Your computer does not have enough GPU power to support the default GPU rendering mode. OHIF + has switched to CPU rendering mode. Please note that CPU rendering does not support all + features such as Volume Rendering, Multiplanar Reconstruction, and Segmentation Overlays.

); diff --git a/extensions/cornerstone/src/initContextMenu.ts b/extensions/cornerstone/src/initContextMenu.ts index 48a5c19a3..60e166824 100644 --- a/extensions/cornerstone/src/initContextMenu.ts +++ b/extensions/cornerstone/src/initContextMenu.ts @@ -60,8 +60,7 @@ function initContextMenu({ */ const cornerstoneViewportHandleEvent = (name, evt) => { const customizations = - customizationService.get('cornerstoneViewportClickCommands') || - DEFAULT_CONTEXT_MENU_CLICKS; + customizationService.get('cornerstoneViewportClickCommands') || DEFAULT_CONTEXT_MENU_CLICKS; const toRun = customizations[name]; const options = { nearbyToolData: findNearbyToolData(commandsManager, evt), @@ -84,30 +83,18 @@ function initContextMenu({ // TODO check update upstream setEnabledElement(viewportId, element); - element.addEventListener( - cs3DToolsEvents.MOUSE_CLICK, - cornerstoneViewportHandleClick - ); + element.addEventListener(cs3DToolsEvents.MOUSE_CLICK, cornerstoneViewportHandleClick); } function elementDisabledHandler(evt) { const { element } = evt.detail; - element.removeEventListener( - cs3DToolsEvents.MOUSE_CLICK, - cornerstoneViewportHandleClick - ); + element.removeEventListener(cs3DToolsEvents.MOUSE_CLICK, cornerstoneViewportHandleClick); } - eventTarget.addEventListener( - EVENTS.ELEMENT_ENABLED, - elementEnabledHandler.bind(null) - ); + eventTarget.addEventListener(EVENTS.ELEMENT_ENABLED, elementEnabledHandler.bind(null)); - eventTarget.addEventListener( - EVENTS.ELEMENT_DISABLED, - elementDisabledHandler.bind(null) - ); + eventTarget.addEventListener(EVENTS.ELEMENT_DISABLED, elementDisabledHandler.bind(null)); } export default initContextMenu; diff --git a/extensions/cornerstone/src/initDoubleClick.ts b/extensions/cornerstone/src/initDoubleClick.ts index 14f80c775..049d72cbe 100644 --- a/extensions/cornerstone/src/initDoubleClick.ts +++ b/extensions/cornerstone/src/initDoubleClick.ts @@ -39,10 +39,7 @@ export type initDoubleClickArgs = { commandsManager: CommandsManager; }; -function initDoubleClick({ - customizationService, - commandsManager, -}: initDoubleClickArgs): void { +function initDoubleClick({ customizationService, commandsManager }: initDoubleClickArgs): void { const cornerstoneViewportHandleDoubleClick = (evt: CustomEvent) => { // Do not allow double click on a tool. const nearbyToolData = findNearbyToolData(commandsManager, evt); @@ -54,8 +51,7 @@ function initDoubleClick({ // Allows for the customization of the double click on a viewport. const customizations = - customizationService.get('cornerstoneViewportClickCommands') || - DEFAULT_DOUBLE_CLICK; + customizationService.get('cornerstoneViewportClickCommands') || DEFAULT_DOUBLE_CLICK; const toRun = customizations[eventName]; @@ -84,15 +80,9 @@ function initDoubleClick({ ); } - eventTarget.addEventListener( - EVENTS.ELEMENT_ENABLED, - elementEnabledHandler.bind(null) - ); + eventTarget.addEventListener(EVENTS.ELEMENT_ENABLED, elementEnabledHandler.bind(null)); - eventTarget.addEventListener( - EVENTS.ELEMENT_DISABLED, - elementDisabledHandler.bind(null) - ); + eventTarget.addEventListener(EVENTS.ELEMENT_DISABLED, elementDisabledHandler.bind(null)); } export default initDoubleClick; diff --git a/extensions/cornerstone/src/initMeasurementService.js b/extensions/cornerstone/src/initMeasurementService.js index 3a883cc79..2ab5cce55 100644 --- a/extensions/cornerstone/src/initMeasurementService.js +++ b/extensions/cornerstone/src/initMeasurementService.js @@ -127,11 +127,8 @@ const initMeasurementService = ( }; const connectToolsToMeasurementService = servicesManager => { - const { - measurementService, - displaySetService, - cornerstoneViewportService, - } = servicesManager.services; + const { measurementService, displaySetService, cornerstoneViewportService } = + servicesManager.services; const csTools3DVer1MeasurementSource = initMeasurementService( measurementService, displaySetService, @@ -153,10 +150,7 @@ const connectToolsToMeasurementService = servicesManager => { } = annotationAddedEventDetail; const { toolName } = metadata; - if ( - csToolsEvent.type === completedEvt && - toolName === toolNames.CalibrationLine - ) { + if (csToolsEvent.type === completedEvt && toolName === toolNames.CalibrationLine) { // show modal to input the measurement (mm) onCompletedCalibrationLine(servicesManager, csToolsEvent) .then( @@ -212,10 +206,8 @@ const connectToolsToMeasurementService = servicesManager => { try { const annotationSelectionEventDetail = csToolsEvent.detail; - const { - added: addedSelectedAnnotationUIDs, - removed: removedSelectedAnnotationUIDs, - } = annotationSelectionEventDetail; + const { added: addedSelectedAnnotationUIDs, removed: removedSelectedAnnotationUIDs } = + annotationSelectionEventDetail; if (removedSelectedAnnotationUIDs) { removedSelectedAnnotationUIDs.forEach(annotationUID => @@ -283,12 +275,8 @@ const connectMeasurementServiceToTools = ( cornerstoneViewportService, measurementSource ) => { - const { - MEASUREMENT_REMOVED, - MEASUREMENTS_CLEARED, - MEASUREMENT_UPDATED, - RAW_MEASUREMENT_ADDED, - } = measurementService.EVENTS; + const { MEASUREMENT_REMOVED, MEASUREMENTS_CLEARED, MEASUREMENT_UPDATED, RAW_MEASUREMENT_ADDED } = + measurementService.EVENTS; const csTools3DVer1MeasurementSource = measurementService.getSource( CORNERSTONE_3D_TOOLS_SOURCE_NAME, @@ -351,11 +339,7 @@ const connectMeasurementServiceToTools = ( return; } - const { - referenceSeriesUID, - referenceStudyUID, - SOPInstanceUID, - } = measurement; + const { referenceSeriesUID, referenceStudyUID, SOPInstanceUID } = measurement; const instance = DicomMetadataStore.getInstance( referenceStudyUID, @@ -368,9 +352,7 @@ const connectMeasurementServiceToTools = ( if (measurement?.metadata?.referencedImageId) { imageId = measurement.metadata.referencedImageId; - frameNumber = getSOPInstanceAttributes( - measurement.metadata.referencedImageId - ).frameNumber; + frameNumber = getSOPInstanceAttributes(measurement.metadata.referencedImageId).frameNumber; } else { imageId = dataSource.getImageIdsForInstance({ instance }); } diff --git a/extensions/cornerstone/src/initWADOImageLoader.js b/extensions/cornerstone/src/initWADOImageLoader.js index 8b2aec1cc..1df82f1c9 100644 --- a/extensions/cornerstone/src/initWADOImageLoader.js +++ b/extensions/cornerstone/src/initWADOImageLoader.js @@ -1,9 +1,7 @@ import * as cornerstone from '@cornerstonejs/core'; import { volumeLoader } from '@cornerstonejs/core'; import { cornerstoneStreamingImageVolumeLoader } from '@cornerstonejs/streaming-image-volume-loader'; -import dicomImageLoader, { - webWorkerManager, -} from '@cornerstonejs/dicom-image-loader'; +import dicomImageLoader, { webWorkerManager } from '@cornerstonejs/dicom-image-loader'; import dicomParser from 'dicom-parser'; import { errorHandler, utils } from '@ohif/core'; @@ -41,10 +39,7 @@ export default function initWADOImageLoader( dicomImageLoader.external.cornerstone = cornerstone; dicomImageLoader.external.dicomParser = dicomParser; - registerVolumeLoader( - 'cornerstoneStreamingImageVolume', - cornerstoneStreamingImageVolumeLoader - ); + registerVolumeLoader('cornerstoneStreamingImageVolume', cornerstoneStreamingImageVolumeLoader); dicomImageLoader.configure({ decodeConfig: { @@ -55,10 +50,9 @@ export default function initWADOImageLoader( // we should set this flag to false. convertFloatPixelDataToInt: false, }, - beforeSend: function(xhr) { + beforeSend: function (xhr) { //TODO should be removed in the future and request emitted by DicomWebDataSource - const sourceConfig = - extensionManager.getActiveDataSource()?.[0].getConfig() ?? {}; + const sourceConfig = extensionManager.getActiveDataSource()?.[0].getConfig() ?? {}; const headers = userAuthenticationService.getAuthorizationHeader(); const acceptHeader = utils.generateAcceptHeader( sourceConfig.acceptHeader, diff --git a/extensions/cornerstone/src/services/CornerstoneCacheService/CornerstoneCacheService.ts b/extensions/cornerstone/src/services/CornerstoneCacheService/CornerstoneCacheService.ts index 31ea90cb2..8d573f564 100644 --- a/extensions/cornerstone/src/services/CornerstoneCacheService/CornerstoneCacheService.ts +++ b/extensions/cornerstone/src/services/CornerstoneCacheService/CornerstoneCacheService.ts @@ -1,16 +1,8 @@ import { ServicesManager, Types } from '@ohif/core'; -import { - cache as cs3DCache, - Enums, - volumeLoader, - utilities as utils, -} from '@cornerstonejs/core'; +import { cache as cs3DCache, Enums, volumeLoader, utilities as utils } from '@cornerstonejs/core'; import getCornerstoneViewportType from '../../utils/getCornerstoneViewportType'; -import { - StackViewportData, - VolumeViewportData, -} from '../../types/CornerstoneCacheService'; +import { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService'; const VOLUME_LOADER_SCHEME = 'cornerstoneStreamingImageVolume'; @@ -18,9 +10,7 @@ class CornerstoneCacheService { static REGISTRATION = { name: 'cornerstoneCacheService', altName: 'CornerstoneCacheService', - create: ({ - servicesManager, - }: Types.Extensions.ExtensionParams): CornerstoneCacheService => { + create: ({ servicesManager }: Types.Extensions.ExtensionParams): CornerstoneCacheService => { return new CornerstoneCacheService(servicesManager); }, }; @@ -77,11 +67,7 @@ class CornerstoneCacheService { cs3DViewportType === Enums.ViewportType.ORTHOGRAPHIC || cs3DViewportType === Enums.ViewportType.VOLUME_3D ) { - viewportData = await this._getVolumeViewportData( - dataSource, - displaySets, - cs3DViewportType - ); + viewportData = await this._getVolumeViewportData(dataSource, displaySets, cs3DViewportType); } viewportData.viewportType = cs3DViewportType; @@ -134,20 +120,14 @@ class CornerstoneCacheService { // For Stack Viewport we don't have fusion currently const displaySet = displaySets[0]; - let stackImageIds = this.stackImageIds.get( - displaySet.displaySetInstanceUID - ); + let stackImageIds = this.stackImageIds.get(displaySet.displaySetInstanceUID); if (!stackImageIds) { stackImageIds = this._getCornerstoneStackImageIds(displaySet, dataSource); this.stackImageIds.set(displaySet.displaySetInstanceUID, stackImageIds); } - const { - displaySetInstanceUID, - StudyInstanceUID, - isCompositeStack, - } = displaySet; + const { displaySetInstanceUID, StudyInstanceUID, isCompositeStack } = displaySet; const StackViewportData: StackViewportData = { viewportType, @@ -196,31 +176,22 @@ class CornerstoneCacheService { continue; } - const volumeLoaderSchema = - displaySet.volumeLoaderSchema ?? VOLUME_LOADER_SCHEME; + const volumeLoaderSchema = displaySet.volumeLoaderSchema ?? VOLUME_LOADER_SCHEME; const volumeId = `${volumeLoaderSchema}:${displaySet.displaySetInstanceUID}`; - let volumeImageIds = this.volumeImageIds.get( - displaySet.displaySetInstanceUID - ); + let volumeImageIds = this.volumeImageIds.get(displaySet.displaySetInstanceUID); let volume = cs3DCache.getVolume(volumeId); if (!volumeImageIds || !volume) { - volumeImageIds = this._getCornerstoneVolumeImageIds( - displaySet, - dataSource - ); + volumeImageIds = this._getCornerstoneVolumeImageIds(displaySet, dataSource); volume = await volumeLoader.createAndCacheVolume(volumeId, { imageIds: volumeImageIds, }); - this.volumeImageIds.set( - displaySet.displaySetInstanceUID, - volumeImageIds - ); + this.volumeImageIds.set(displaySet.displaySetInstanceUID, volumeImageIds); } volumeData.push({ @@ -268,10 +239,7 @@ class CornerstoneCacheService { } private _getCornerstoneVolumeImageIds(displaySet, dataSource): string[] { - const stackImageIds = this._getCornerstoneStackImageIds( - displaySet, - dataSource - ); + const stackImageIds = this._getCornerstoneStackImageIds(displaySet, dataSource); return stackImageIds; } diff --git a/extensions/cornerstone/src/services/SegmentationService/RTSTRUCT/mapROIContoursToRTStructData.ts b/extensions/cornerstone/src/services/SegmentationService/RTSTRUCT/mapROIContoursToRTStructData.ts index f17ec5c70..b61307412 100644 --- a/extensions/cornerstone/src/services/SegmentationService/RTSTRUCT/mapROIContoursToRTStructData.ts +++ b/extensions/cornerstone/src/services/SegmentationService/RTSTRUCT/mapROIContoursToRTStructData.ts @@ -7,32 +7,27 @@ * @returns An array of object that includes data, id, segmentIndex, color * and geometry Id */ -export function mapROIContoursToRTStructData( - structureSet: unknown, - rtDisplaySetUID: unknown -) { - return structureSet.ROIContours.map( - ({ contourPoints, ROINumber, ROIName, colorArray }) => { - const data = contourPoints.map(({ points, ...rest }) => { - const newPoints = points.map(({ x, y, z }) => { - return [x, y, z]; - }); - - return { - ...rest, - points: newPoints, - }; +export function mapROIContoursToRTStructData(structureSet: unknown, rtDisplaySetUID: unknown) { + return structureSet.ROIContours.map(({ contourPoints, ROINumber, ROIName, colorArray }) => { + const data = contourPoints.map(({ points, ...rest }) => { + const newPoints = points.map(({ x, y, z }) => { + return [x, y, z]; }); - const id = ROIName || ROINumber; - return { - data, - id, - segmentIndex: ROINumber, - color: colorArray, - geometryId: `${rtDisplaySetUID}:${id}:segmentIndex-${ROINumber}`, + ...rest, + points: newPoints, }; - } - ); + }); + + const id = ROIName || ROINumber; + + return { + data, + id, + segmentIndex: ROINumber, + color: colorArray, + geometryId: `${rtDisplaySetUID}:${id}:segmentIndex-${ROINumber}`, + }; + }); } diff --git a/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts b/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts index 03a4e8461..8ea071e5a 100644 --- a/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts +++ b/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts @@ -21,11 +21,7 @@ import { import isEqual from 'lodash.isequal'; import { Types as ohifTypes } from '@ohif/core'; import { easeInOutBell, reverseEaseInOutBell } from '../../utils/transitions'; -import { - Segment, - Segmentation, - SegmentationConfig, -} from './SegmentationServiceTypes'; +import { Segment, Segmentation, SegmentationConfig } from './SegmentationServiceTypes'; import { mapROIContoursToRTStructData } from './RTSTRUCT/mapROIContoursToRTStructData'; const { COLOR_LUT } = cstConstants; @@ -42,8 +38,7 @@ const EVENTS = { // fired when the segmentation is removed SEGMENTATION_REMOVED: 'event::segmentation_removed', // fired when the configuration for the segmentation is changed (e.g., brush size, render fill, outline thickness, etc.) - SEGMENTATION_CONFIGURATION_CHANGED: - 'event::segmentation_configuration_changed', + SEGMENTATION_CONFIGURATION_CHANGED: 'event::segmentation_configuration_changed', // fired when the active segment is loaded in SEG or RTSTRUCT SEGMENT_LOADING_COMPLETE: 'event::segment_loading_complete', // for all segments @@ -64,9 +59,7 @@ class SegmentationService extends PubSubService { static REGISTRATION = { name: 'segmentationService', altName: 'SegmentationService', - create: ({ - servicesManager, - }: OhifTypes.Extensions.ExtensionParams): SegmentationService => { + create: ({ servicesManager }: OhifTypes.Extensions.ExtensionParams): SegmentationService => { return new SegmentationService({ servicesManager }); }, }; @@ -138,10 +131,10 @@ class SegmentationService extends PubSubService { toolGroupId = toolGroupId ?? this._getFirstToolGroupId(); - const { - segmentationRepresentationUID, - segmentation, - } = this._getSegmentationInfo(segmentationId, toolGroupId); + const { segmentationRepresentationUID, segmentation } = this._getSegmentationInfo( + segmentationId, + toolGroupId + ); if (this._getSegmentInfo(segmentation, segmentIndex)) { throw new Error(`Segment ${segmentIndex} already exists`); @@ -166,32 +159,14 @@ class SegmentationService extends PubSubService { const suppressEvents = true; if (properties !== undefined) { - const { - color: newColor, - opacity, - isLocked, - visibility, - active, - } = properties; + const { color: newColor, opacity, isLocked, visibility, active } = properties; if (newColor !== undefined) { - this._setSegmentColor( - segmentationId, - segmentIndex, - newColor, - toolGroupId, - suppressEvents - ); + this._setSegmentColor(segmentationId, segmentIndex, newColor, toolGroupId, suppressEvents); } if (opacity !== undefined) { - this._setSegmentOpacity( - segmentationId, - segmentIndex, - opacity, - toolGroupId, - suppressEvents - ); + this._setSegmentOpacity(segmentationId, segmentIndex, opacity, toolGroupId, suppressEvents); } if (visibility !== undefined) { @@ -209,12 +184,7 @@ class SegmentationService extends PubSubService { } if (isLocked !== undefined) { - this._setSegmentLocked( - segmentationId, - segmentIndex, - isLocked, - suppressEvents - ); + this._setSegmentLocked(segmentationId, segmentIndex, isLocked, suppressEvents); } } @@ -285,9 +255,7 @@ class SegmentationService extends PubSubService { if (segmentation.activeSegmentIndex === segmentIndex) { const segmentIndices = Object.keys(segmentation.segments); - const newActiveSegmentIndex = segmentIndices.length - ? Number(segmentIndices[0]) - : 1; + const newActiveSegmentIndex = segmentIndices.length ? Number(segmentIndices[0]) : 1; this._setActiveSegment(segmentationId, newActiveSegmentIndex, true); } @@ -319,19 +287,10 @@ class SegmentationService extends PubSubService { isLocked: boolean ): void { const suppressEvents = false; - this._setSegmentLocked( - segmentationId, - segmentIndex, - isLocked, - suppressEvents - ); + this._setSegmentLocked(segmentationId, segmentIndex, isLocked, suppressEvents); } - public setSegmentLabel( - segmentationId: string, - segmentIndex: number, - segmentLabel: string - ): void { + public setSegmentLabel(segmentationId: string, segmentIndex: number, segmentLabel: string): void { this._setSegmentLabel(segmentationId, segmentIndex, segmentLabel); } @@ -387,24 +346,14 @@ class SegmentationService extends PubSubService { this._setSegmentOpacity(segmentationId, segmentIndex, opacity, toolGroupId); } - public setActiveSegmentationForToolGroup( - segmentationId: string, - toolGroupId?: string - ): void { + public setActiveSegmentationForToolGroup(segmentationId: string, toolGroupId?: string): void { toolGroupId = toolGroupId ?? this._getFirstToolGroupId(); const suppressEvents = false; - this._setActiveSegmentationForToolGroup( - segmentationId, - toolGroupId, - suppressEvents - ); + this._setActiveSegmentationForToolGroup(segmentationId, toolGroupId, suppressEvents); } - public setActiveSegmentForSegmentation( - segmentationId: string, - segmentIndex: number - ): void { + public setActiveSegmentForSegmentation(segmentationId: string, segmentIndex: number): void { this._setActiveSegment(segmentationId, segmentIndex, false); } @@ -420,9 +369,7 @@ class SegmentationService extends PubSubService { * @return Array of segmentations */ - public getSegmentations( - filterNonHydratedSegmentations = true - ): Segmentation[] { + public getSegmentations(filterNonHydratedSegmentations = true): Segmentation[] { const segmentations = this._getSegmentations(); return ( @@ -435,10 +382,7 @@ class SegmentationService extends PubSubService { private _getSegmentations(): Segmentation[] { const segmentations = this.arrayOfObjects(this.segmentations); - return ( - segmentations && - segmentations.map(m => this.segmentations[Object.keys(m)[0]]) - ); + return segmentations && segmentations.map(m => this.segmentations[Object.keys(m)[0]]); } /** @@ -477,8 +421,7 @@ class SegmentationService extends PubSubService { } const representationType = segmentation.type; - const representationData = - segmentation.representationData[representationType]; + const representationData = segmentation.representationData[representationType]; cstSegmentation.addSegmentations([ { segmentationId, @@ -566,9 +509,7 @@ class SegmentationService extends PubSubService { const { labelmapBufferArray, referencedVolumeId } = segDisplaySet; if (!labelmapBufferArray || !referencedVolumeId) { - throw new Error( - 'No labelmapBufferArray or referencedVolumeId found for the SEG displaySet' - ); + throw new Error('No labelmapBufferArray or referencedVolumeId found for the SEG displaySet'); } // if the labelmap doesn't exist, we need to create it first from the @@ -576,23 +517,18 @@ class SegmentationService extends PubSubService { const referencedVolume = cache.getVolume(referencedVolumeId); if (!referencedVolume) { - throw new Error( - `No volume found for referencedVolumeId: ${referencedVolumeId}` - ); + throw new Error(`No volume found for referencedVolumeId: ${referencedVolumeId}`); } // Force use of a Uint8Array SharedArrayBuffer for the segmentation to save space and so // it is easily compressible in worker thread. - const derivedVolume = await volumeLoader.createAndCacheDerivedVolume( - referencedVolumeId, - { - volumeId: segmentationId, - targetBuffer: { - type: 'Uint8Array', - sharedArrayBuffer: true, - }, - } - ); + const derivedVolume = await volumeLoader.createAndCacheDerivedVolume(referencedVolumeId, { + volumeId: segmentationId, + targetBuffer: { + type: 'Uint8Array', + sharedArrayBuffer: true, + }, + }); const derivedVolumeScalarData = derivedVolume.getScalarData(); const segmentsInfo = segDisplaySet.segMetadata.data; @@ -680,10 +616,7 @@ class SegmentationService extends PubSubService { const defaultScheme = this._getDefaultSegmentationScheme(); const rtDisplaySetUID = rtDisplaySet.displaySetInstanceUID; - const allRTStructData = mapROIContoursToRTStructData( - structureSet, - rtDisplaySetUID - ); + const allRTStructData = mapROIContoursToRTStructData(structureSet, rtDisplaySetUID); // sort by segmentIndex allRTStructData.sort((a, b) => a.segmentIndex - b.segmentIndex); @@ -726,19 +659,16 @@ class SegmentationService extends PubSubService { // catch error instead of failing to allow loading to continue try { - const geometry = await geometryLoader.createAndCacheGeometry( - geometryId, - { - geometryData: { - data, - id, - color, - frameOfReferenceUID: structureSet.frameOfReferenceUID, - segmentIndex, - }, - type: csEnums.GeometryType.CONTOUR, - } - ); + const geometry = await geometryLoader.createAndCacheGeometry(geometryId, { + geometryData: { + data, + id, + color, + frameOfReferenceUID: structureSet.frameOfReferenceUID, + segmentIndex, + }, + type: csEnums.GeometryType.CONTOUR, + }); const contourSet = geometry.data; const centroid = contourSet.getCentroid(); @@ -758,9 +688,7 @@ class SegmentationService extends PubSubService { const numInitialized = Object.keys(segmentsCachedStats).length; // Calculate percentage completed - const percentComplete = Math.round( - (numInitialized / allRTStructData.length) * 100 - ); + const percentComplete = Math.round((numInitialized / allRTStructData.length) * 100); this._broadcastEvent(EVENTS.SEGMENT_LOADING_COMPLETE, { percentComplete, @@ -824,8 +752,7 @@ class SegmentationService extends PubSubService { const { world } = center; // todo: generalize - toolGroupId = - toolGroupId || this._getToolGroupIdsWithSegmentation(segmentationId); + toolGroupId = toolGroupId || this._getToolGroupIdsWithSegmentation(segmentationId); const toolGroups = []; @@ -842,10 +769,7 @@ class SegmentationService extends PubSubService { // @ts-ignore for (const { viewportId, renderingEngineId } of viewportsInfo) { - const { viewport } = getEnabledElementByIds( - viewportId, - renderingEngineId - ); + const { viewport } = getEnabledElementByIds(viewportId, renderingEngineId); cstUtils.viewport.jumpToWorld(viewport, world); } @@ -888,9 +812,7 @@ class SegmentationService extends PubSubService { const { segments } = segmentation; const highlightFn = - type === LABELMAP - ? this._highlightLabelmap.bind(this) - : this._highlightContour.bind(this); + type === LABELMAP ? this._highlightLabelmap.bind(this) : this._highlightContour.bind(this); const adjustedAlpha = type === LABELMAP ? alpha : 1 - alpha; @@ -914,9 +836,7 @@ class SegmentationService extends PubSubService { ): Promise => { const { displaySetService } = this.servicesManager.services; - const displaySet = displaySetService.getDisplaySetByUID( - displaySetInstanceUID - ); + const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); // Todo: we currently only support labelmap for segmentation for a displaySet const representationType = LABELMAP; @@ -977,9 +897,7 @@ class SegmentationService extends PubSubService { const segmentation = this.getSegmentation(segmentationId); if (!segmentation) { - throw new Error( - `Segmentation with segmentationId ${segmentationId} not found.` - ); + throw new Error(`Segmentation with segmentationId ${segmentationId} not found.`); } if (hydrateSegmentation) { @@ -1019,34 +937,16 @@ class SegmentationService extends PubSubService { continue; } - const { - segmentIndex, - color, - isLocked, - isVisible: visibility, - opacity, - } = segment; + const { segmentIndex, color, isLocked, isVisible: visibility, opacity } = segment; const suppressEvents = true; if (color !== undefined) { - this._setSegmentColor( - segmentationId, - segmentIndex, - color, - toolGroupId, - suppressEvents - ); + this._setSegmentColor(segmentationId, segmentIndex, color, toolGroupId, suppressEvents); } if (opacity !== undefined) { - this._setSegmentOpacity( - segmentationId, - segmentIndex, - opacity, - toolGroupId, - suppressEvents - ); + this._setSegmentOpacity(segmentationId, segmentIndex, opacity, toolGroupId, suppressEvents); } if (visibility !== undefined) { @@ -1060,12 +960,7 @@ class SegmentationService extends PubSubService { } if (isLocked !== undefined) { - this._setSegmentLocked( - segmentationId, - segmentIndex, - isLocked, - suppressEvents - ); + this._setSegmentLocked(segmentationId, segmentIndex, isLocked, suppressEvents); } } }; @@ -1102,25 +997,16 @@ class SegmentationService extends PubSubService { }); }; - public getToolGroupIdsWithSegmentation = ( - segmentationId: string - ): string[] => { - const toolGroupIds = cstSegmentation.state.getToolGroupIdsWithSegmentation( - segmentationId - ); + public getToolGroupIdsWithSegmentation = (segmentationId: string): string[] => { + const toolGroupIds = cstSegmentation.state.getToolGroupIdsWithSegmentation(segmentationId); return toolGroupIds; }; - public hydrateSegmentation = ( - segmentationId: string, - suppressEvents = false - ): void => { + public hydrateSegmentation = (segmentationId: string, suppressEvents = false): void => { const segmentation = this.getSegmentation(segmentationId); if (!segmentation) { - throw new Error( - `Segmentation with segmentationId ${segmentationId} not found.` - ); + throw new Error(`Segmentation with segmentationId ${segmentationId} not found.`); } this._setDisplaySetIsHydrated(segmentationId, true); @@ -1134,13 +1020,8 @@ class SegmentationService extends PubSubService { } }; - private _setDisplaySetIsHydrated( - displaySetUID: string, - isHydrated: boolean - ): void { - const { - DisplaySetService: displaySetService, - } = this.servicesManager.services; + private _setDisplaySetIsHydrated(displaySetUID: string, isHydrated: boolean): void { + const { DisplaySetService: displaySetService } = this.servicesManager.services; const displaySet = displaySetService.getDisplaySetByUID(displaySetUID); displaySet.isHydrated = isHydrated; displaySetService.setDisplaySetMetadataInvalidated(displaySetUID, false); @@ -1259,17 +1140,13 @@ class SegmentationService extends PubSubService { ): void { const uids = segmentationRepresentationUIDsIds || []; if (!uids.length) { - const representations = cstSegmentation.state.getSegmentationRepresentations( - toolGroupId - ); + const representations = cstSegmentation.state.getSegmentationRepresentations(toolGroupId); if (!representations || !representations.length) { return; } - uids.push( - ...representations.map(rep => rep.segmentationRepresentationUID) - ); + uids.push(...representations.map(rep => rep.segmentationRepresentationUID)); } cstSegmentation.removeSegmentationsFromToolGroup(toolGroupId, uids); @@ -1285,9 +1162,7 @@ class SegmentationService extends PubSubService { const wasActive = segmentation.isActive; if (!segmentationId || !segmentation) { - console.warn( - `No segmentationId provided, or unable to find segmentation by id.` - ); + console.warn(`No segmentationId provided, or unable to find segmentation by id.`); return; } @@ -1309,11 +1184,7 @@ class SegmentationService extends PubSubService { if (remainingSegmentations.length) { const { id } = remainingSegmentations[0]; - this._setActiveSegmentationForToolGroup( - id, - this._getFirstToolGroupId(), - false - ); + this._setActiveSegmentationForToolGroup(id, this._getFirstToolGroupId(), false); } } @@ -1337,9 +1208,8 @@ class SegmentationService extends PubSubService { // toolGroupId // ); - const segmentationRepresentations = this.getSegmentationRepresentationsForToolGroup( - toolGroupId - ); + const segmentationRepresentations = + this.getSegmentationRepresentationsForToolGroup(toolGroupId); const typeToUse = segmentationRepresentations?.[0]?.type || LABELMAP; @@ -1397,11 +1267,7 @@ class SegmentationService extends PubSubService { setConfigValueIfDefined('outlineOpacity', outlineOpacity, v => v / 100); setConfigValueIfDefined('fillAlpha', fillAlpha, v => v / 100); setConfigValueIfDefined('renderFill', renderFill); - setConfigValueIfDefined( - 'fillAlphaInactive', - fillAlphaInactive, - v => v / 100 - ); + setConfigValueIfDefined('fillAlphaInactive', fillAlphaInactive, v => v / 100); setConfigValueIfDefined('outlineOpacityInactive', fillAlphaInactive, v => Math.max(0.75, v / 100) ); @@ -1435,10 +1301,7 @@ class SegmentationService extends PubSubService { // }); // } - this._broadcastEvent( - this.EVENTS.SEGMENTATION_CONFIGURATION_CHANGED, - this.getConfiguration() - ); + this._broadcastEvent(this.EVENTS.SEGMENTATION_CONFIGURATION_CHANGED, this.getConfiguration()); }; public getLabelmapVolume = (segmentationId: string) => { @@ -1472,9 +1335,7 @@ class SegmentationService extends PubSubService { const segmentInfo = segmentation.segments[segmentIndex]; if (segmentInfo === undefined) { - throw new Error( - `Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}` - ); + throw new Error(`Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}`); } segmentInfo.label = label; @@ -1487,14 +1348,8 @@ class SegmentationService extends PubSubService { } } - public shouldRenderSegmentation( - viewportDisplaySetInstanceUIDs, - segDisplaySetInstanceUID - ) { - if ( - !viewportDisplaySetInstanceUIDs || - !viewportDisplaySetInstanceUIDs.length - ) { + public shouldRenderSegmentation(viewportDisplaySetInstanceUIDs, segDisplaySetInstanceUID) { + if (!viewportDisplaySetInstanceUIDs || !viewportDisplaySetInstanceUIDs.length) { return false; } @@ -1502,20 +1357,14 @@ class SegmentationService extends PubSubService { let shouldDisplaySeg = false; - const segDisplaySet = displaySetService.getDisplaySetByUID( - segDisplaySetInstanceUID - ); + const segDisplaySet = displaySetService.getDisplaySetByUID(segDisplaySetInstanceUID); - const segFrameOfReferenceUID = this._getFrameOfReferenceUIDForSeg( - segDisplaySet - ); + const segFrameOfReferenceUID = this._getFrameOfReferenceUIDForSeg(segDisplaySet); // check if the displaySet is sharing the same frameOfReferenceUID // with the new segmentation for (const displaySetInstanceUID of viewportDisplaySetInstanceUIDs) { - const displaySet = displaySetService.getDisplaySetByUID( - displaySetInstanceUID - ); + const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); // Todo: this might not be ideal for use cases such as 4D, since we // don't want to show the segmentation for all the frames @@ -1563,10 +1412,7 @@ class SegmentationService extends PubSubService { segmentation.isActive = segmentation.id === segmentationId; }); - const representation = this._getSegmentationRepresentation( - segmentationId, - toolGroupId - ); + const representation = this._getSegmentationRepresentation(segmentationId, toolGroupId); cstSegmentation.activeSegmentation.setActiveSegmentationRepresentation( toolGroupId, @@ -1580,16 +1426,11 @@ class SegmentationService extends PubSubService { } } - private _toggleSegmentationVisibility = ( - segmentationId: string, - suppressEvents = false - ) => { + private _toggleSegmentationVisibility = (segmentationId: string, suppressEvents = false) => { const segmentation = this.segmentations[segmentationId]; if (!segmentation) { - throw new Error( - `Segmentation with segmentationId ${segmentationId} not found.` - ); + throw new Error(`Segmentation with segmentationId ${segmentationId} not found.`); } segmentation.isVisible = !segmentation.isVisible; @@ -1603,21 +1444,14 @@ class SegmentationService extends PubSubService { } }; - private _setActiveSegment( - segmentationId: string, - segmentIndex: number, - suppressEvents = false - ) { + private _setActiveSegment(segmentationId: string, segmentIndex: number, suppressEvents = false) { const segmentation = this.getSegmentation(segmentationId); if (segmentation === undefined) { throw new Error(`no segmentation for segmentationId: ${segmentationId}`); } - cstSegmentation.segmentIndex.setActiveSegmentIndex( - segmentationId, - segmentIndex - ); + cstSegmentation.segmentIndex.setActiveSegmentIndex(segmentationId, segmentIndex); segmentation.activeSegmentIndex = segmentIndex; @@ -1641,8 +1475,7 @@ class SegmentationService extends PubSubService { } private _getVolumeIdForDisplaySet(displaySet) { - const volumeLoaderSchema = - displaySet.volumeLoaderSchema ?? VOLUME_LOADER_SCHEME; + const volumeLoaderSchema = displaySet.volumeLoaderSchema ?? VOLUME_LOADER_SCHEME; return `${volumeLoaderSchema}:${displaySet.displaySetInstanceUID}`; } @@ -1663,9 +1496,7 @@ class SegmentationService extends PubSubService { const segmentInfo = this._getSegmentInfo(segmentation, segmentIndex); if (segmentInfo === undefined) { - throw new Error( - `Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}` - ); + throw new Error(`Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}`); } toolGroupId = toolGroupId ?? this._getFirstToolGroupId(); @@ -1676,9 +1507,7 @@ class SegmentationService extends PubSubService { ); if (!segmentationRepresentation) { - throw new Error( - 'Must add representation to toolgroup before setting segments' - ); + throw new Error('Must add representation to toolgroup before setting segments'); } const { segmentationRepresentationUID } = segmentationRepresentation; @@ -1743,18 +1572,12 @@ class SegmentationService extends PubSubService { const segmentInfo = this._getSegmentInfo(segmentation, segmentIndex); if (segmentInfo === undefined) { - throw new Error( - `Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}` - ); + throw new Error(`Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}`); } segmentInfo.isLocked = isLocked; - cstSegmentation.segmentLocking.setSegmentIndexLocked( - segmentationId, - segmentIndex, - isLocked - ); + cstSegmentation.segmentLocking.setSegmentIndexLocked(segmentationId, segmentIndex, isLocked); if (suppressEvents === false) { this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED, { @@ -1772,10 +1595,10 @@ class SegmentationService extends PubSubService { ) { toolGroupId = toolGroupId ?? this._getFirstToolGroupId(); - const { - segmentationRepresentationUID, - segmentation, - } = this._getSegmentationInfo(segmentationId, toolGroupId); + const { segmentationRepresentationUID, segmentation } = this._getSegmentationInfo( + segmentationId, + toolGroupId + ); if (segmentation === undefined) { throw new Error(`no segmentation for segmentationId: ${segmentationId}`); @@ -1784,9 +1607,7 @@ class SegmentationService extends PubSubService { const segmentInfo = this._getSegmentInfo(segmentation, segmentIndex); if (segmentInfo === undefined) { - throw new Error( - `Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}` - ); + throw new Error(`Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}`); } segmentInfo.isVisible = isVisible; @@ -1828,9 +1649,7 @@ class SegmentationService extends PubSubService { const segmentInfo = this._getSegmentInfo(segmentation, segmentIndex); if (segmentInfo === undefined) { - throw new Error( - `Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}` - ); + throw new Error(`Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}`); } toolGroupId = toolGroupId ?? this._getFirstToolGroupId(); @@ -1841,9 +1660,7 @@ class SegmentationService extends PubSubService { ); if (!segmentationRepresentation) { - throw new Error( - 'Must add representation to toolgroup before setting segments' - ); + throw new Error('Must add representation to toolgroup before setting segments'); } const { segmentationRepresentationUID } = segmentationRepresentation; @@ -1884,9 +1701,7 @@ class SegmentationService extends PubSubService { const segmentInfo = this._getSegmentInfo(segmentation, segmentIndex); if (segmentInfo === undefined) { - throw new Error( - `Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}` - ); + throw new Error(`Segment ${segmentIndex} not yet added to segmentation: ${segmentationId}`); } segmentInfo.label = segmentLabel; @@ -1899,9 +1714,8 @@ class SegmentationService extends PubSubService { } private _getSegmentationRepresentation(segmentationId, toolGroupId) { - const segmentationRepresentations = this.getSegmentationRepresentationsForToolGroup( - toolGroupId - ); + const segmentationRepresentations = + this.getSegmentationRepresentationsForToolGroup(toolGroupId); if (segmentationRepresentations.length === 0) { return; @@ -1974,21 +1788,13 @@ class SegmentationService extends PubSubService { return; } - const segmentationState = cstSegmentation.state.getSegmentation( - segmentationId - ); + const segmentationState = cstSegmentation.state.getSegmentation(segmentationId); if (!segmentationState) { return; } - const { - activeSegmentIndex, - cachedStats, - segmentsLocked, - label, - type, - } = segmentationState; + const { activeSegmentIndex, cachedStats, segmentsLocked, label, type } = segmentationState; if (![LABELMAP, CONTOUR].includes(type)) { throw new Error( @@ -2018,10 +1824,7 @@ class SegmentationService extends PubSubService { try { this.addOrUpdateSegmentation(segmentationSchema); } catch (error) { - console.warn( - `Failed to add/update segmentation ${segmentationId}`, - error - ); + console.warn(`Failed to add/update segmentation ${segmentationId}`, error); } }; @@ -2037,9 +1840,7 @@ class SegmentationService extends PubSubService { ); if (!segmentationRepresentation) { - throw new Error( - 'Must add representation to toolgroup before setting segments' - ); + throw new Error('Must add representation to toolgroup before setting segments'); } const { segmentationRepresentationUID } = segmentationRepresentation; @@ -2057,14 +1858,11 @@ class SegmentationService extends PubSubService { return; } - const toolGroupIds = segmentationState.getToolGroupIdsWithSegmentation( - segmentationId - ); + const toolGroupIds = segmentationState.getToolGroupIdsWithSegmentation(segmentationId); toolGroupIds.forEach(toolGroupId => { - const segmentationRepresentations = segmentationState.getSegmentationRepresentations( - toolGroupId - ); + const segmentationRepresentations = + segmentationState.getSegmentationRepresentations(toolGroupId); const UIDsToRemove = []; segmentationRepresentations.forEach(representation => { @@ -2089,17 +1887,12 @@ class SegmentationService extends PubSubService { } } - private _updateCornerstoneSegmentations({ - segmentationId, - notYetUpdatedAtSource, - }) { + private _updateCornerstoneSegmentations({ segmentationId, notYetUpdatedAtSource }) { if (notYetUpdatedAtSource === false) { return; } const segmentationState = cstSegmentation.state; - const sourceSegmentation = segmentationState.getSegmentation( - segmentationId - ); + const sourceSegmentation = segmentationState.getSegmentation(segmentationId); const segmentation = this.segmentations[segmentationId]; const { label, cachedStats } = segmentation; @@ -2115,14 +1908,11 @@ class SegmentationService extends PubSubService { private _updateCornerstoneSegmentationVisibility = segmentationId => { const segmentationState = cstSegmentation.state; - const toolGroupIds = segmentationState.getToolGroupIdsWithSegmentation( - segmentationId - ); + const toolGroupIds = segmentationState.getToolGroupIdsWithSegmentation(segmentationId); toolGroupIds.forEach(toolGroupId => { - const segmentationRepresentations = cstSegmentation.state.getSegmentationRepresentations( - toolGroupId - ); + const segmentationRepresentations = + cstSegmentation.state.getSegmentationRepresentations(toolGroupId); if (segmentationRepresentations.length === 0) { return; @@ -2146,10 +1936,7 @@ class SegmentationService extends PubSubService { ); // update segments visibility - const { segmentation } = this._getSegmentationInfo( - segmentationId, - toolGroupId - ); + const { segmentation } = this._getSegmentationInfo(segmentationId, toolGroupId); const segments = segmentation.segments.filter(Boolean); @@ -2161,9 +1948,7 @@ class SegmentationService extends PubSubService { private _getToolGroupIdsWithSegmentation(segmentationId: string) { const segmentationState = cstSegmentation.state; - const toolGroupIds = segmentationState.getToolGroupIdsWithSegmentation( - segmentationId - ); + const toolGroupIds = segmentationState.getToolGroupIdsWithSegmentation(segmentationId); return toolGroupIds; } diff --git a/extensions/cornerstone/src/services/SyncGroupService/SyncGroupService.ts b/extensions/cornerstone/src/services/SyncGroupService/SyncGroupService.ts index 56a760d5f..0b1c22fb2 100644 --- a/extensions/cornerstone/src/services/SyncGroupService/SyncGroupService.ts +++ b/extensions/cornerstone/src/services/SyncGroupService/SyncGroupService.ts @@ -1,8 +1,4 @@ -import { - synchronizers, - SynchronizerManager, - Synchronizer, -} from '@cornerstonejs/tools'; +import { synchronizers, SynchronizerManager, Synchronizer } from '@cornerstonejs/tools'; import { pubSubServiceInterface, Types, ServicesManager } from '@ohif/core'; @@ -14,10 +10,7 @@ const EVENTS = { * @params options - are an optional set of options associated with the first * sync group declared. */ -export type SyncCreator = ( - id: string, - options?: Record -) => Synchronizer; +export type SyncCreator = (id: string, options?: Record) => Synchronizer; export type SyncGroup = { type: string; @@ -40,9 +33,7 @@ export default class SyncGroupService { static REGISTRATION = { name: 'syncGroupService', altName: 'SyncGroupService', - create: ({ - servicesManager, - }: Types.Extensions.ExtensionParams): SyncGroupService => { + create: ({ servicesManager }: Types.Extensions.ExtensionParams): SyncGroupService => { return new SyncGroupService(servicesManager); }, }; @@ -65,11 +56,7 @@ export default class SyncGroupService { Object.assign(this, pubSubServiceInterface); } - private _createSynchronizer( - type: string, - id: string, - options - ): Synchronizer | undefined { + private _createSynchronizer(type: string, id: string, options): Synchronizer | undefined { const syncCreator = this.synchronizerCreators[type.toLowerCase()]; if (syncCreator) { return syncCreator(id, options); @@ -109,19 +96,11 @@ export default class SyncGroupService { return; } - const syncGroupsArray = Array.isArray(syncGroups) - ? syncGroups - : [syncGroups]; + const syncGroupsArray = Array.isArray(syncGroups) ? syncGroups : [syncGroups]; syncGroupsArray.forEach(syncGroup => { const syncGroupObj = asSyncGroup(syncGroup); - const { - type, - target = true, - source = true, - options = {}, - id = type, - } = syncGroupObj; + const { type, target = true, source = true, options = {}, id = type } = syncGroupObj; const synchronizer = this._getOrCreateSynchronizer(type, id, options); synchronizer.setOptions(viewportId, options); diff --git a/extensions/cornerstone/src/services/ToolGroupService/ToolGroupService.ts b/extensions/cornerstone/src/services/ToolGroupService/ToolGroupService.ts index b8f6c9709..fc3d6c86c 100644 --- a/extensions/cornerstone/src/services/ToolGroupService/ToolGroupService.ts +++ b/extensions/cornerstone/src/services/ToolGroupService/ToolGroupService.ts @@ -24,9 +24,7 @@ export default class ToolGroupService { public static REGISTRATION = { name: 'toolGroupService', altName: 'ToolGroupService', - create: ({ - servicesManager, - }: OhifTypes.Extensions.ExtensionParams): ToolGroupService => { + create: ({ servicesManager }: OhifTypes.Extensions.ExtensionParams): ToolGroupService => { return new ToolGroupService(servicesManager); }, }; @@ -40,10 +38,7 @@ export default class ToolGroupService { EVENTS: { [key: string]: string }; constructor(serviceManager) { - const { - cornerstoneViewportService, - viewportGridService, - } = serviceManager.services; + const { cornerstoneViewportService, viewportGridService } = serviceManager.services; this.cornerstoneViewportService = cornerstoneViewportService; this.viewportGridService = viewportGridService; this.listeners = {}; @@ -66,19 +61,14 @@ export default class ToolGroupService { if (!toolGroupIdToUse) { // Use the active viewport's tool group if no tool group id is provided - const enabledElement = getActiveViewportEnabledElement( - this.viewportGridService - ); + const enabledElement = getActiveViewportEnabledElement(this.viewportGridService); if (!enabledElement) { return; } const { renderingEngineId, viewportId } = enabledElement; - const toolGroup = ToolGroupManager.getToolGroupForViewport( - viewportId, - renderingEngineId - ); + const toolGroup = ToolGroupManager.getToolGroupForViewport(viewportId, renderingEngineId); if (!toolGroup) { console.warn( @@ -103,10 +93,7 @@ export default class ToolGroupService { public getToolGroupForViewport(viewportId: string): Types.IToolGroup | void { const renderingEngine = this.cornerstoneViewportService.getRenderingEngine(); - return ToolGroupManager.getToolGroupForViewport( - viewportId, - renderingEngine.id - ); + return ToolGroupManager.getToolGroupForViewport(viewportId, renderingEngine.id); } public getActiveToolForViewport(viewportId: string): string { @@ -133,10 +120,7 @@ export default class ToolGroupService { renderingEngineId: string, deleteToolGroupIfEmpty?: boolean ): void { - const toolGroup = ToolGroupManager.getToolGroupForViewport( - viewportId, - renderingEngineId - ); + const toolGroup = ToolGroupManager.getToolGroupForViewport(viewportId, renderingEngineId); if (!toolGroup) { return; @@ -193,11 +177,7 @@ export default class ToolGroupService { return toolGroup; } - public addToolsToToolGroup( - toolGroupId: string, - tools: Array, - configs: any = {} - ): void { + public addToolsToToolGroup(toolGroupId: string, tools: Array, configs: any = {}): void { const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); // this.changeConfigurationIfNecessary(toolGroup, volumeId); this._addTools(toolGroup, tools, configs); diff --git a/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts b/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts index 6ee00b8ec..29ffe0d39 100644 --- a/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts +++ b/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts @@ -12,10 +12,7 @@ import { Enums as csEnums, } from '@cornerstonejs/core'; -import { - utilities as csToolsUtils, - Enums as csToolsEnums, -} from '@cornerstonejs/tools'; +import { utilities as csToolsUtils, Enums as csToolsEnums } from '@cornerstonejs/tools'; import { IViewportService } from './IViewportService'; import { RENDERING_ENGINE_ID } from './constants'; import ViewportInfo, { @@ -23,25 +20,20 @@ import ViewportInfo, { DisplaySetOptions, PublicViewportOptions, } from './Viewport'; -import { - StackViewportData, - VolumeViewportData, -} from '../../types/CornerstoneCacheService'; +import { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService'; import { Presentation, Presentations } from '../../types/Presentation'; import JumpPresets from '../../utils/JumpPresets'; const EVENTS = { - VIEWPORT_DATA_CHANGED: - 'event::cornerstoneViewportService:viewportDataChanged', + VIEWPORT_DATA_CHANGED: 'event::cornerstoneViewportService:viewportDataChanged', }; /** * Handles cornerstone viewport logic including enabling, disabling, and * updating the viewport. */ -class CornerstoneViewportService extends PubSubService - implements IViewportService { +class CornerstoneViewportService extends PubSubService implements IViewportService { static REGISTRATION = { name: 'cornerstoneViewportService', altName: 'CornerstoneViewportService', @@ -182,8 +174,7 @@ class CornerstoneViewportService extends PubSubService const camera = csViewport.getCamera(); return { presentationIds, - viewportType: - !viewportType || viewportType === 'stack' ? 'stack' : 'volume', + viewportType: !viewportType || viewportType === 'stack' ? 'stack' : 'volume', properties, initialImageIndex, camera, @@ -202,10 +193,7 @@ class CornerstoneViewportService extends PubSubService if (!presentation || !presentation.presentationIds) { return; } - const { - lutPresentationStore, - positionPresentationStore, - } = stateSyncService.getState(); + const { lutPresentationStore, positionPresentationStore } = stateSyncService.getState(); const { presentationIds } = presentation; const { lutPresentationId, positionPresentationId } = presentationIds || {}; const storeState = {}; @@ -258,12 +246,8 @@ class CornerstoneViewportService extends PubSubService // override the viewportOptions and displaySetOptions with the public ones // since those are the newly set ones, we set them here so that it handles defaults - const displaySetOptions = viewportInfo.setPublicDisplaySetOptions( - publicDisplaySetOptions - ); - const viewportOptions = viewportInfo.setPublicViewportOptions( - publicViewportOptions - ); + const displaySetOptions = viewportInfo.setPublicDisplaySetOptions(publicDisplaySetOptions); + const viewportOptions = viewportInfo.setPublicViewportOptions(publicViewportOptions); const element = viewportInfo.getElement(); const type = viewportInfo.getViewportType(); @@ -317,11 +301,7 @@ class CornerstoneViewportService extends PubSubService ): Types.IStackViewport | Types.IVolumeViewport | null { const viewportInfo = this.getViewportInfo(viewportId); - if ( - !viewportInfo || - !this.renderingEngine || - this.renderingEngine.hasBeenDestroyed - ) { + if (!viewportInfo || !this.renderingEngine || this.renderingEngine.hasBeenDestroyed) { return null; } @@ -342,24 +322,15 @@ class CornerstoneViewportService extends PubSubService ): void { const displaySetOptions = viewportInfo.getDisplaySetOptions(); - const { - imageIds, - initialImageIndex, - displaySetInstanceUID, - } = viewportData.data; + const { imageIds, initialImageIndex, displaySetInstanceUID } = viewportData.data; this.viewportsDisplaySets.set(viewport.id, [displaySetInstanceUID]); let initialImageIndexToUse = - presentations?.positionPresentation?.initialImageIndex ?? - initialImageIndex; + presentations?.positionPresentation?.initialImageIndex ?? initialImageIndex; - if ( - initialImageIndexToUse === undefined || - initialImageIndexToUse === null - ) { - initialImageIndexToUse = - this._getInitialImageIndexForViewport(viewportInfo, imageIds) || 0; + if (initialImageIndexToUse === undefined || initialImageIndexToUse === null) { + initialImageIndexToUse = this._getInitialImageIndexForViewport(viewportInfo, imageIds) || 0; } const properties = { ...presentations.lutPresentation?.properties }; @@ -404,12 +375,8 @@ class CornerstoneViewportService extends PubSubService if (viewportType === csEnums.ViewportType.STACK) { numberOfSlices = imageIds.length; } else if (viewportType === csEnums.ViewportType.ORTHOGRAPHIC) { - const viewport = this.getCornerstoneViewport( - viewportInfo.getViewportId() - ); - const imageSliceData = csUtils.getImageSliceDataForVolumeViewport( - viewport - ); + const viewport = this.getCornerstoneViewport(viewportInfo.getViewportId()); + const imageSliceData = csUtils.getImageSliceDataForVolumeViewport(viewport); if (!imageSliceData) { return; @@ -423,11 +390,7 @@ class CornerstoneViewportService extends PubSubService return this._getInitialImageIndex(numberOfSlices, index, preset); } - _getInitialImageIndex( - numberOfSlices: number, - imageIndex?: number, - preset?: JumpPresets - ): number { + _getInitialImageIndex(numberOfSlices: number, imageIndex?: number, preset?: JumpPresets): number { const lastSliceIndex = numberOfSlices - 1; if (imageIndex !== undefined) { @@ -449,9 +412,7 @@ class CornerstoneViewportService extends PubSubService // it will jump to a different slice than the middle one which // was the initial slice, and we have some tools such as Crosshairs // which rely on a relative camera modifications and those will break. - return lastSliceIndex % 2 === 0 - ? lastSliceIndex / 2 - : (lastSliceIndex + 1) / 2; + return lastSliceIndex % 2 === 0 ? lastSliceIndex / 2 : (lastSliceIndex + 1) / 2; } return 0; @@ -521,22 +482,11 @@ class CornerstoneViewportService extends PubSubService }); // This returns the async continuation only - return this.setVolumesForViewport( - viewport, - volumeInputArray, - presentations - ); + return this.setVolumesForViewport(viewport, volumeInputArray, presentations); } - public async setVolumesForViewport( - viewport, - volumeInputArray, - presentations - ) { - const { - displaySetService, - toolGroupService, - } = this.servicesManager.services; + public async setVolumesForViewport(viewport, volumeInputArray, presentations) { + const { displaySetService, toolGroupService } = this.servicesManager.services; const viewportInfo = this.getViewportInfo(viewport.id); const displaySetOptions = viewportInfo.getDisplaySetOptions(); @@ -594,10 +544,7 @@ class CornerstoneViewportService extends PubSubService // associated with the primary displaySet // get segmentations only returns the hydrated segmentations - this._addSegmentationRepresentationToToolGroupIfNecessary( - displaySetInstanceUIDs, - viewport - ); + this._addSegmentationRepresentationToToolGroupIfNecessary(displaySetInstanceUIDs, viewport); } const toolGroup = toolGroupService.getToolGroupForViewport(viewport.id); @@ -618,10 +565,7 @@ class CornerstoneViewportService extends PubSubService displaySetInstanceUIDs: string[], viewport: any ) { - const { - segmentationService, - toolGroupService, - } = this.servicesManager.services; + const { segmentationService, toolGroupService } = this.servicesManager.services; const toolGroup = toolGroupService.getToolGroupForViewport(viewport.id); @@ -630,9 +574,7 @@ class CornerstoneViewportService extends PubSubService for (const segmentation of segmentations) { const toolGroupSegmentationRepresentations = - segmentationService.getSegmentationRepresentationsForToolGroup( - toolGroup.id - ) || []; + segmentationService.getSegmentationRepresentationsForToolGroup(toolGroup.id) || []; // if there is already a segmentation representation for this segmentation // for this toolGroup, don't bother at all @@ -647,16 +589,12 @@ class CornerstoneViewportService extends PubSubService // otherwise, check if the hydrated segmentations are in the same FOR // as the primary displaySet, if so add the representation (since it was not there) const { id: segDisplaySetInstanceUID, type } = segmentation; - const segFrameOfReferenceUID = this._getFrameOfReferenceUID( - segDisplaySetInstanceUID - ); + const segFrameOfReferenceUID = this._getFrameOfReferenceUID(segDisplaySetInstanceUID); let shouldDisplaySeg = false; for (const displaySetInstanceUID of displaySetInstanceUIDs) { - const primaryFrameOfReferenceUID = this._getFrameOfReferenceUID( - displaySetInstanceUID - ); + const primaryFrameOfReferenceUID = this._getFrameOfReferenceUID(displaySetInstanceUID); if (segFrameOfReferenceUID === primaryFrameOfReferenceUID) { shouldDisplaySeg = true; @@ -677,14 +615,8 @@ class CornerstoneViewportService extends PubSubService } } - private addOverlayRepresentationForDisplaySet( - displaySet: any, - viewport: any - ) { - const { - segmentationService, - toolGroupService, - } = this.servicesManager.services; + private addOverlayRepresentationForDisplaySet(displaySet: any, viewport: any) { + const { segmentationService, toolGroupService } = this.servicesManager.services; const { referencedVolumeId } = displaySet; const segmentationId = displaySet.displaySetInstanceUID; @@ -711,10 +643,7 @@ class CornerstoneViewportService extends PubSubService const viewport = this.getCornerstoneViewport(viewportId); const viewportCamera = viewport.getCamera(); - if ( - viewport instanceof VolumeViewport || - viewport instanceof VolumeViewport3D - ) { + if (viewport instanceof VolumeViewport || viewport instanceof VolumeViewport3D) { this._setVolumeViewport(viewport, viewportData, viewportInfo).then(() => { if (keepCamera) { viewport.setCamera(viewportCamera); @@ -744,10 +673,7 @@ class CornerstoneViewportService extends PubSubService viewportInfo, presentations ); - } else if ( - viewport instanceof VolumeViewport || - viewport instanceof VolumeViewport3D - ) { + } else if (viewport instanceof VolumeViewport || viewport instanceof VolumeViewport3D) { this._setVolumeViewport( viewport, viewportData as VolumeViewportData, @@ -770,10 +696,7 @@ class CornerstoneViewportService extends PubSubService _getSlabThickness(displaySetOptions, volumeId) { const { blendMode } = displaySetOptions; - if ( - blendMode === undefined || - displaySetOptions.slabThickness === undefined - ) { + if (blendMode === undefined || displaySetOptions.slabThickness === undefined) { return; } @@ -799,9 +722,7 @@ class CornerstoneViewportService extends PubSubService _getFrameOfReferenceUID(displaySetInstanceUID) { const { displaySetService } = this.servicesManager.services; - const displaySet = displaySetService.getDisplaySetByUID( - displaySetInstanceUID - ); + const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); if (!displaySet) { return; diff --git a/extensions/cornerstone/src/services/ViewportService/IViewportService.ts b/extensions/cornerstone/src/services/ViewportService/IViewportService.ts index 82f6d2058..e96a7d702 100644 --- a/extensions/cornerstone/src/services/ViewportService/IViewportService.ts +++ b/extensions/cornerstone/src/services/ViewportService/IViewportService.ts @@ -1,10 +1,6 @@ import { Types } from '@cornerstonejs/core'; import { StackData, VolumeData } from '../../types/CornerstoneCacheService'; -import { - DisplaySetOptions, - PublicViewportOptions, - ViewportOptions, -} from './Viewport'; +import { DisplaySetOptions, PublicViewportOptions, ViewportOptions } from './Viewport'; /** * Handles cornerstone viewport logic including enabling, disabling, and diff --git a/extensions/cornerstone/src/services/ViewportService/Viewport.ts b/extensions/cornerstone/src/services/ViewportService/Viewport.ts index d27f2129f..42fa56046 100644 --- a/extensions/cornerstone/src/services/ViewportService/Viewport.ts +++ b/extensions/cornerstone/src/services/ViewportService/Viewport.ts @@ -1,9 +1,6 @@ import { Types, Enums } from '@cornerstonejs/core'; import { Types as UITypes } from '@ohif/ui'; -import { - StackViewportData, - VolumeViewportData, -} from '../../types/CornerstoneCacheService'; +import { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService'; import getCornerstoneBlendMode from '../../utils/getCornerstoneBlendMode'; import getCornerstoneOrientation from '../../utils/getCornerstoneOrientation'; import getCornerstoneViewportType from '../../utils/getCornerstoneViewportType'; @@ -90,11 +87,7 @@ const DEFAULT_TOOLGROUP_ID = 'default'; // Return true if the data contains the given display set UID OR the imageId // if it is a composite object. -const dataContains = ( - data, - displaySetUID: string, - imageId?: string -): boolean => { +const dataContains = (data, displaySetUID: string, imageId?: string): boolean => { if (data.displaySetInstanceUID === displaySetUID) { return true; } @@ -128,9 +121,7 @@ class ViewportInfo { } if (this.viewportData.data.length) { - return !!this.viewportData.data.find(data => - dataContains(data, displaySetUID, imageId) - ); + return !!this.viewportData.data.find(data => dataContains(data, displaySetUID, imageId)); } return dataContains(this.viewportData.data, displaySetUID, imageId); } @@ -158,9 +149,7 @@ class ViewportInfo { this.element = element; } - public setViewportData( - viewportData: StackViewportData | VolumeViewportData - ): void { + public setViewportData(viewportData: StackViewportData | VolumeViewportData): void { this.viewportData = viewportData; } @@ -168,7 +157,6 @@ class ViewportInfo { return this.viewportData; } - public getElement(): HTMLDivElement { return this.element; } @@ -181,13 +169,11 @@ class ViewportInfo { publicDisplaySetOptions: PublicDisplaySetOptions[] | DisplaySetSelector[] ): Array { // map the displaySetOptions and check if they are undefined then set them to default values - const displaySetOptions = this.mapDisplaySetOptions( - publicDisplaySetOptions - ); + const displaySetOptions = this.mapDisplaySetOptions(publicDisplaySetOptions); this.setDisplaySetOptions(displaySetOptions); - return this.displaySetOptions + return this.displaySetOptions; } public hasDisplaySet(displaySetInstanceUID: string): boolean { @@ -196,8 +182,9 @@ class ViewportInfo { // via cornerstoneViewportService let viewportData = this.getViewportData(); - if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC || - viewportData.viewportType === Enums.ViewportType.VOLUME_3D + if ( + viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC || + viewportData.viewportType === Enums.ViewportType.VOLUME_3D ) { viewportData = viewportData as VolumeViewportData; return viewportData.data.some( @@ -209,22 +196,15 @@ class ViewportInfo { return viewportData.data.displaySetInstanceUID === displaySetInstanceUID; } - public setPublicViewportOptions( - viewportOptionsEntry: PublicViewportOptions - ): ViewportOptions { + public setPublicViewportOptions(viewportOptionsEntry: PublicViewportOptions): ViewportOptions { let viewportType = viewportOptionsEntry.viewportType; - const { - toolGroupId = DEFAULT_TOOLGROUP_ID, - presentationIds, - } = viewportOptionsEntry; + const { toolGroupId = DEFAULT_TOOLGROUP_ID, presentationIds } = viewportOptionsEntry; let orientation; if (!viewportType) { viewportType = getCornerstoneViewportType(STACK); } else { - viewportType = getCornerstoneViewportType( - viewportOptionsEntry.viewportType - ); + viewportType = getCornerstoneViewportType(viewportOptionsEntry.viewportType); } // map SAGITTAL, AXIAL, CORONAL orientation to be used by cornerstone @@ -256,9 +236,7 @@ class ViewportInfo { return this.viewportOptions; } - public setDisplaySetOptions( - displaySetOptions: Array - ): void { + public setDisplaySetOptions(displaySetOptions: Array): void { this.displaySetOptions = displaySetOptions; } diff --git a/extensions/cornerstone/src/state.ts b/extensions/cornerstone/src/state.ts index 821078c1d..4af81e7de 100644 --- a/extensions/cornerstone/src/state.ts +++ b/extensions/cornerstone/src/state.ts @@ -9,11 +9,7 @@ const state = { * @param {HTMLElement} dom Active viewport element. * @return void */ -const setEnabledElement = ( - viewportId: string, - element: HTMLElement, - context?: string -): void => { +const setEnabledElement = (viewportId: string, element: HTMLElement, context?: string): void => { const targetContext = context || state.DEFAULT_CONTEXT; state.enabledElements[viewportId] = { diff --git a/extensions/cornerstone/src/tools/CalibrationLineTool.ts b/extensions/cornerstone/src/tools/CalibrationLineTool.ts index 1db404034..ae914019b 100644 --- a/extensions/cornerstone/src/tools/CalibrationLineTool.ts +++ b/extensions/cornerstone/src/tools/CalibrationLineTool.ts @@ -25,8 +25,7 @@ class CalibrationLineTool extends LengthTool { this._renderingViewport.worldToCanvas(p) ); // for display, round to 2 decimal points - const lengthPx = - Math.round(calculateLength2(canvasPoint1, canvasPoint2) * 100) / 100; + const lengthPx = Math.round(calculateLength2(canvasPoint1, canvasPoint2) * 100) / 100; const textLines = [`${lengthPx}px`]; @@ -64,17 +63,11 @@ export function onCompletedCalibrationLine(servicesManager, csToolsEvent) { const length = Math.round( - calculateLength3( - annotationData.handles.points[0], - annotationData.handles.points[1] - ) * 100 + calculateLength3(annotationData.handles.points[0], annotationData.handles.points[1]) * 100 ) / 100; // calculate the currently applied pixel spacing on the viewport - const calibratedPixelSpacing = metaData.get( - 'calibratedPixelSpacing', - imageId - ); + const calibratedPixelSpacing = metaData.get('calibratedPixelSpacing', imageId); const imagePlaneModule = metaData.get('imagePlaneModule', imageId); const currentRowPixelSpacing = calibratedPixelSpacing?.[0] || imagePlaneModule?.rowPixelSpacing || 1; @@ -87,12 +80,7 @@ export function onCompletedCalibrationLine(servicesManager, csToolsEvent) { const colSpacing = spacingScale * currentColumnPixelSpacing; // trigger resize of the viewport to adjust the world/pixel mapping - calibrateImageSpacing( - imageId, - viewport.getRenderingEngine(), - rowSpacing, - colSpacing - ); + calibrateImageSpacing(imageId, viewport.getRenderingEngine(), rowSpacing, colSpacing); }; return new Promise((resolve, reject) => { diff --git a/extensions/cornerstone/src/types/index.ts b/extensions/cornerstone/src/types/index.ts index 6c729817d..c8db85fb7 100644 --- a/extensions/cornerstone/src/types/index.ts +++ b/extensions/cornerstone/src/types/index.ts @@ -1,7 +1,4 @@ -import * as CornerstoneCacheService from './CornerstoneCacheService' +import * as CornerstoneCacheService from './CornerstoneCacheService'; import CornerstoneServices from './CornerstoneServices'; -export type { - CornerstoneCacheService, - CornerstoneServices, -} +export type { CornerstoneCacheService, CornerstoneServices }; diff --git a/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx b/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx index b9971059b..048c6d008 100644 --- a/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx +++ b/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx @@ -27,31 +27,22 @@ const CornerstoneViewportDownloadForm = ({ const activeViewportElement = enabledElement?.element; const activeViewportEnabledElement = getEnabledElement(activeViewportElement); - const { - viewportId: activeViewportId, - renderingEngineId, - } = activeViewportEnabledElement; + const { viewportId: activeViewportId, renderingEngineId } = activeViewportEnabledElement; - const toolGroup = ToolGroupManager.getToolGroupForViewport( - activeViewportId, - renderingEngineId - ); + const toolGroup = ToolGroupManager.getToolGroupForViewport(activeViewportId, renderingEngineId); - const toolModeAndBindings = Object.keys(toolGroup.toolOptions).reduce( - (acc, toolName) => { - const tool = toolGroup.toolOptions[toolName]; - const { mode, bindings } = tool; + const toolModeAndBindings = Object.keys(toolGroup.toolOptions).reduce((acc, toolName) => { + const tool = toolGroup.toolOptions[toolName]; + const { mode, bindings } = tool; - return { - ...acc, - [toolName]: { - mode, - bindings, - }, - }; - }, - {} - ); + return { + ...acc, + [toolName]: { + mode, + bindings, + }, + }; + }, {}); useEffect(() => { return () => { @@ -64,9 +55,7 @@ const CornerstoneViewportDownloadForm = ({ const enableViewport = viewportElement => { if (viewportElement) { - const { renderingEngine, viewport } = getEnabledElement( - activeViewportElement - ); + const { renderingEngine, viewport } = getEnabledElement(activeViewportElement); const viewportInput = { viewportId: VIEWPORT_ID, @@ -91,11 +80,7 @@ const CornerstoneViewportDownloadForm = ({ } }; - const updateViewportPreview = ( - downloadViewportElement, - internalCanvas, - fileType - ) => + const updateViewportPreview = (downloadViewportElement, internalCanvas, fileType) => new Promise(resolve => { const enabledElement = getEnabledElement(downloadViewportElement); @@ -133,10 +118,7 @@ const CornerstoneViewportDownloadForm = ({ resolve({ dataUrl, width: newWidth, height: newHeight }); - downloadViewportElement.removeEventListener( - Enums.Events.IMAGE_RENDERED, - updateViewport - ); + downloadViewportElement.removeEventListener(Enums.Events.IMAGE_RENDERED, updateViewport); } ); }); @@ -144,9 +126,7 @@ const CornerstoneViewportDownloadForm = ({ const loadImage = (activeViewportElement, viewportElement, width, height) => new Promise(resolve => { if (activeViewportElement && viewportElement) { - const activeViewportEnabledElement = getEnabledElement( - activeViewportElement - ); + const activeViewportEnabledElement = getEnabledElement(activeViewportElement); if (!activeViewportEnabledElement) { return; @@ -165,10 +145,7 @@ const CornerstoneViewportDownloadForm = ({ downloadViewport.setProperties(properties); const newWidth = Math.min(width || image.width, MAX_TEXTURE_SIZE); - const newHeight = Math.min( - height || image.height, - MAX_TEXTURE_SIZE - ); + const newHeight = Math.min(height || image.height, MAX_TEXTURE_SIZE); resolve({ width: newWidth, height: newHeight }); }); @@ -190,31 +167,19 @@ const CornerstoneViewportDownloadForm = ({ } }); - const toggleAnnotations = ( - toggle, - viewportElement, - activeViewportElement - ) => { - const activeViewportEnabledElement = getEnabledElement( - activeViewportElement - ); + const toggleAnnotations = (toggle, viewportElement, activeViewportElement) => { + const activeViewportEnabledElement = getEnabledElement(activeViewportElement); const downloadViewportElement = getEnabledElement(viewportElement); - const { - viewportId: activeViewportId, - renderingEngineId, - } = activeViewportEnabledElement; + const { viewportId: activeViewportId, renderingEngineId } = activeViewportEnabledElement; const { viewportId: downloadViewportId } = downloadViewportElement; if (!activeViewportEnabledElement || !downloadViewportElement) { return; } - const toolGroup = ToolGroupManager.getToolGroupForViewport( - activeViewportId, - renderingEngineId - ); + const toolGroup = ToolGroupManager.getToolGroupForViewport(activeViewportId, renderingEngineId); // add the viewport to the toolGroup toolGroup.addViewport(downloadViewportId, renderingEngineId); diff --git a/extensions/cornerstone/src/utils/DicomFileUploader.ts b/extensions/cornerstone/src/utils/DicomFileUploader.ts index 45a6c9e94..cfbad0745 100644 --- a/extensions/cornerstone/src/utils/DicomFileUploader.ts +++ b/extensions/cornerstone/src/utils/DicomFileUploader.ts @@ -98,22 +98,13 @@ export default class DicomFileUploader extends PubSubService { }); }, timeout: () => { - this._reject( - reject, - new UploadRejection(UploadStatus.Failed, 'The request timed out.') - ); + this._reject(reject, new UploadRejection(UploadStatus.Failed, 'The request timed out.')); }, abort: () => { - this._reject( - reject, - new UploadRejection(UploadStatus.Cancelled, 'Cancelled') - ); + this._reject(reject, new UploadRejection(UploadStatus.Cancelled, 'Cancelled')); }, error: () => { - this._reject( - reject, - new UploadRejection(UploadStatus.Failed, 'The request failed.') - ); + this._reject(reject, new UploadRejection(UploadStatus.Failed, 'The request failed.')); }, }; @@ -122,10 +113,7 @@ export default class DicomFileUploader extends PubSubService { .loadFileRequest(this._fileId) .then(dicomFile => { if (this._abortController.signal.aborted) { - this._reject( - reject, - new UploadRejection(UploadStatus.Cancelled, 'Cancelled') - ); + this._reject(reject, new UploadRejection(UploadStatus.Cancelled, 'Cancelled')); return; } @@ -133,10 +121,7 @@ export default class DicomFileUploader extends PubSubService { // The file is not DICOM this._reject( reject, - new UploadRejection( - UploadStatus.Failed, - 'Not a valid DICOM file.' - ) + new UploadRejection(UploadStatus.Failed, 'Not a valid DICOM file.') ); return; } @@ -164,10 +149,7 @@ export default class DicomFileUploader extends PubSubService { } private _isRejected(): boolean { - return ( - this._status === UploadStatus.Failed || - this._status === UploadStatus.Cancelled - ); + return this._status === UploadStatus.Failed || this._status === UploadStatus.Cancelled; } private _reject(reject: (reason?: any) => void, reason: any) { diff --git a/extensions/cornerstone/src/utils/callInputDialog.tsx b/extensions/cornerstone/src/utils/callInputDialog.tsx index dc35d6266..37d5021c5 100644 --- a/extensions/cornerstone/src/utils/callInputDialog.tsx +++ b/extensions/cornerstone/src/utils/callInputDialog.tsx @@ -21,11 +21,7 @@ function callInputDialog( dialogConfig: any = {} ) { const dialogId = 'dialog-enter-annotation'; - const label = data - ? isArrowAnnotateInputDialog - ? data.text - : data.label - : ''; + const label = data ? (isArrowAnnotateInputDialog ? data.text : data.label) : ''; const { dialogTitle = 'Annotation', inputLabel = 'Enter your annotation', @@ -69,7 +65,7 @@ function callInputDialog( return ( { return; } - return typeof imageObj.getImageId === 'function' - ? imageObj.getImageId() - : imageObj.url; + return typeof imageObj.getImageId === 'function' ? imageObj.getImageId() : imageObj.url; }; const findImageIdOnStudies = (studies, displaySetInstanceUID) => { @@ -163,9 +161,7 @@ class DicomLoaderService { getDicomDataMethod = fetchIt.bind(this, imageId); break; default: - throw new Error( - `Unsupported image type: ${loaderType} for imageId: ${imageId}` - ); + throw new Error(`Unsupported image type: ${loaderType} for imageId: ${imageId}`); } return getDicomDataMethod(); diff --git a/extensions/cornerstone/src/utils/getActiveViewportEnabledElement.ts b/extensions/cornerstone/src/utils/getActiveViewportEnabledElement.ts index d067622e0..e63e85f79 100644 --- a/extensions/cornerstone/src/utils/getActiveViewportEnabledElement.ts +++ b/extensions/cornerstone/src/utils/getActiveViewportEnabledElement.ts @@ -3,9 +3,7 @@ import { IEnabledElement } from '@cornerstonejs/core/dist/esm/types'; import { getEnabledElement as OHIFgetEnabledElement } from '../state'; -export default function getActiveViewportEnabledElement( - viewportGridService -): IEnabledElement { +export default function getActiveViewportEnabledElement(viewportGridService): IEnabledElement { const { activeViewportId } = viewportGridService.getState(); const { element } = OHIFgetEnabledElement(activeViewportId) || {}; const enabledElement = getEnabledElement(element); diff --git a/extensions/cornerstone/src/utils/getCornerstoneBlendMode.ts b/extensions/cornerstone/src/utils/getCornerstoneBlendMode.ts index 4bc7cb449..37dca4c10 100644 --- a/extensions/cornerstone/src/utils/getCornerstoneBlendMode.ts +++ b/extensions/cornerstone/src/utils/getCornerstoneBlendMode.ts @@ -2,9 +2,7 @@ import { Enums } from '@cornerstonejs/core'; const MIP = 'mip'; -export default function getCornerstoneBlendMode( - blendMode: string -): Enums.BlendModes { +export default function getCornerstoneBlendMode(blendMode: string): Enums.BlendModes { if (!blendMode) { return Enums.BlendModes.COMPOSITE; } diff --git a/extensions/cornerstone/src/utils/getCornerstoneOrientation.ts b/extensions/cornerstone/src/utils/getCornerstoneOrientation.ts index 8ac7b2cb5..6e47fe807 100644 --- a/extensions/cornerstone/src/utils/getCornerstoneOrientation.ts +++ b/extensions/cornerstone/src/utils/getCornerstoneOrientation.ts @@ -4,9 +4,7 @@ const AXIAL = 'axial'; const SAGITTAL = 'sagittal'; const CORONAL = 'coronal'; -export default function getCornerstoneOrientation( - orientation: string -): Enums.OrientationAxis { +export default function getCornerstoneOrientation(orientation: string): Enums.OrientationAxis { if (orientation) { switch (orientation.toLowerCase()) { case AXIAL: diff --git a/extensions/cornerstone/src/utils/getCornerstoneViewportType.ts b/extensions/cornerstone/src/utils/getCornerstoneViewportType.ts index 47a5ede85..9a5dd71de 100644 --- a/extensions/cornerstone/src/utils/getCornerstoneViewportType.ts +++ b/extensions/cornerstone/src/utils/getCornerstoneViewportType.ts @@ -5,9 +5,7 @@ const VOLUME = 'volume'; const ORTHOGRAPHIC = 'orthographic'; const VOLUME_3D = 'volume3d'; -export default function getCornerstoneViewportType( - viewportType: string -): Enums.ViewportType { +export default function getCornerstoneViewportType(viewportType: string): Enums.ViewportType { const lowerViewportType = viewportType.toLowerCase(); if (lowerViewportType === STACK) { return Enums.ViewportType.STACK; @@ -21,7 +19,5 @@ export default function getCornerstoneViewportType( return Enums.ViewportType.VOLUME_3D; } - throw new Error( - `Invalid viewport type: ${viewportType}. Valid types are: stack, volume` - ); + throw new Error(`Invalid viewport type: ${viewportType}. Valid types are: stack, volume`); } diff --git a/extensions/cornerstone/src/utils/getNthFrames.js b/extensions/cornerstone/src/utils/getNthFrames.js index 09bfc0b1e..38df66d95 100644 --- a/extensions/cornerstone/src/utils/getNthFrames.js +++ b/extensions/cornerstone/src/utils/getNthFrames.js @@ -19,11 +19,7 @@ export default function getNthFrames(imageIds) { const centerEnd = centerStart + 6; for (let i = 0; i < imageIds.length; i++) { - if ( - i < 2 || - i > imageIds.length - 4 || - (i > centerStart && i < centerEnd) - ) { + if (i < 2 || i > imageIds.length - 4 || (i > centerStart && i < centerEnd)) { frames[0].push(imageIds[i]); } else if (i % 7 === 2) { frames[1].push(imageIds[i]); @@ -33,12 +29,6 @@ export default function getNthFrames(imageIds) { frames[(i % 2) + 3].push(imageIds[i]); } } - const ret = [ - ...frames[0], - ...frames[1], - ...frames[2], - ...frames[3], - ...frames[4], - ]; + const ret = [...frames[0], ...frames[1], ...frames[2], ...frames[3], ...frames[4]]; return ret; } diff --git a/extensions/cornerstone/src/utils/interleaveCenterLoader.ts b/extensions/cornerstone/src/utils/interleaveCenterLoader.ts index 0047f0ac0..d8f64b5d8 100644 --- a/extensions/cornerstone/src/utils/interleaveCenterLoader.ts +++ b/extensions/cornerstone/src/utils/interleaveCenterLoader.ts @@ -105,9 +105,7 @@ export default function interleaveCenterLoader({ const { imageId } = request; AllRequests.forEach(volumeRequests => { - const volumeImageIdRequest = volumeRequests.find( - req => req.imageId === imageId - ); + const volumeImageIdRequest = volumeRequests.find(req => req.imageId === imageId); if (volumeImageIdRequest) { finalRequests.push(volumeImageIdRequest); } @@ -117,31 +115,17 @@ export default function interleaveCenterLoader({ const requestType = Enums.RequestType.Prefetch; const priority = 0; - finalRequests.forEach( - ({ callLoadImage, additionalDetails, imageId, imageIdIndex, options }) => { - const callLoadImageBound = callLoadImage.bind( - null, - imageId, - imageIdIndex, - options - ); + finalRequests.forEach(({ callLoadImage, additionalDetails, imageId, imageIdIndex, options }) => { + const callLoadImageBound = callLoadImage.bind(null, imageId, imageIdIndex, options); - imageLoadPoolManager.addRequest( - callLoadImageBound, - requestType, - additionalDetails, - priority - ); - } - ); + imageLoadPoolManager.addRequest(callLoadImageBound, requestType, additionalDetails, priority); + }); // clear the volumeIdMapsToLoad volumeIdMapsToLoad.clear(); // copy the viewportIdVolumeInputArrayMap - const viewportIdVolumeInputArrayMapCopy = new Map( - viewportIdVolumeInputArrayMap - ); + const viewportIdVolumeInputArrayMapCopy = new Map(viewportIdVolumeInputArrayMap); // reset the viewportIdVolumeInputArrayMap viewportIdVolumeInputArrayMap.clear(); diff --git a/extensions/cornerstone/src/utils/interleaveTopToBottom.ts b/extensions/cornerstone/src/utils/interleaveTopToBottom.ts index 162bb5588..0caf40372 100644 --- a/extensions/cornerstone/src/utils/interleaveTopToBottom.ts +++ b/extensions/cornerstone/src/utils/interleaveTopToBottom.ts @@ -94,9 +94,7 @@ export default function interleaveTopToBottom({ const { imageId } = request; AllRequests.forEach(volumeRequests => { - const volumeImageIdRequest = volumeRequests.find( - req => req.imageId === imageId - ); + const volumeImageIdRequest = volumeRequests.find(req => req.imageId === imageId); if (volumeImageIdRequest) { finalRequests.push(volumeImageIdRequest); } @@ -106,31 +104,17 @@ export default function interleaveTopToBottom({ const requestType = Enums.RequestType.Prefetch; const priority = 0; - finalRequests.forEach( - ({ callLoadImage, additionalDetails, imageId, imageIdIndex, options }) => { - const callLoadImageBound = callLoadImage.bind( - null, - imageId, - imageIdIndex, - options - ); + finalRequests.forEach(({ callLoadImage, additionalDetails, imageId, imageIdIndex, options }) => { + const callLoadImageBound = callLoadImage.bind(null, imageId, imageIdIndex, options); - imageLoadPoolManager.addRequest( - callLoadImageBound, - requestType, - additionalDetails, - priority - ); - } - ); + imageLoadPoolManager.addRequest(callLoadImageBound, requestType, additionalDetails, priority); + }); // clear the volumeIdMapsToLoad volumeIdMapsToLoad.clear(); // copy the viewportIdVolumeInputArrayMap - const viewportIdVolumeInputArrayMapCopy = new Map( - viewportIdVolumeInputArrayMap - ); + const viewportIdVolumeInputArrayMapCopy = new Map(viewportIdVolumeInputArrayMap); // reset the viewportIdVolumeInputArrayMap viewportIdVolumeInputArrayMap.clear(); diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/Angle.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/Angle.ts index 767f550d4..40f9c9ef6 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/Angle.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/Angle.ts @@ -32,11 +32,7 @@ const Angle = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, CornerstoneViewportService, viewportId @@ -55,14 +51,10 @@ const Angle = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - displaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, displaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); - const getReport = () => - _getReport(mappedAnnotations, points, FrameOfReferenceUID); + const getReport = () => _getReport(mappedAnnotations, points, FrameOfReferenceUID); return { uid: annotationUID, @@ -99,16 +91,11 @@ function getMappedAnnotations(annotation, DisplaySetService) { const targetStats = cachedStats[targetId]; if (!referencedImageId) { - throw new Error( - 'Non-acquisition plane measurement mapping not supported' - ); + throw new Error('Non-acquisition plane measurement mapping not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - frameNumber, - } = getSOPInstanceAttributes(referencedImageId); + const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = + getSOPInstanceAttributes(referencedImageId); const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, @@ -179,17 +166,9 @@ function getDisplayText(mappedAnnotations, displaySet) { const displayText = []; // Area is the same for all series - const { - angle, - unit, - SeriesNumber, - SOPInstanceUID, - frameNumber, - } = mappedAnnotations[0]; + const { angle, unit, SeriesNumber, SOPInstanceUID, frameNumber } = mappedAnnotations[0]; - const instance = displaySet.images.find( - image => image.SOPInstanceUID === SOPInstanceUID - ); + const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { @@ -202,9 +181,7 @@ function getDisplayText(mappedAnnotations, displaySet) { return displayText; } const roundedAngle = utils.roundNumber(angle, 2); - displayText.push( - `${roundedAngle} ${unit} (S: ${SeriesNumber}${instanceText}${frameText})` - ); + displayText.push(`${roundedAngle} ${unit} (S: ${SeriesNumber}${instanceText}${frameText})`); return displayText; } diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/ArrowAnnotate.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/ArrowAnnotate.ts index 9a6f6e49b..d5a7129da 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/ArrowAnnotate.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/ArrowAnnotate.ts @@ -31,11 +31,7 @@ const Length = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, cornerstoneViewportService, viewportId @@ -54,10 +50,7 @@ const Length = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - displaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, displaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); @@ -91,11 +84,8 @@ function getMappedAnnotations(annotation, displaySetService) { const annotations = []; - const { - SOPInstanceUID, - SeriesInstanceUID, - frameNumber, - } = getSOPInstanceAttributes(referencedImageId); + const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = + getSOPInstanceAttributes(referencedImageId); const displaySet = displaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, @@ -126,9 +116,7 @@ function getDisplayText(mappedAnnotations, displaySet) { // Area is the same for all series const { SeriesNumber, SOPInstanceUID, frameNumber } = mappedAnnotations[0]; - const instance = displaySet.images.find( - image => image.SOPInstanceUID === SOPInstanceUID - ); + const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/Bidirectional.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/Bidirectional.ts index 781a0f909..a1c214e1c 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/Bidirectional.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/Bidirectional.ts @@ -27,11 +27,7 @@ const Bidirectional = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, cornerstoneViewportService, viewportId @@ -50,14 +46,10 @@ const Bidirectional = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - displaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, displaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); - const getReport = () => - _getReport(mappedAnnotations, points, FrameOfReferenceUID); + const getReport = () => _getReport(mappedAnnotations, points, FrameOfReferenceUID); return { uid: annotationUID, @@ -94,16 +86,11 @@ function getMappedAnnotations(annotation, displaySetService) { const targetStats = cachedStats[targetId]; if (!referencedImageId) { - throw new Error( - 'Non-acquisition plane measurement mapping not supported' - ); + throw new Error('Non-acquisition plane measurement mapping not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - frameNumber, - } = getSOPInstanceAttributes(referencedImageId); + const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = + getSOPInstanceAttributes(referencedImageId); const displaySet = displaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, @@ -175,19 +162,11 @@ function getDisplayText(mappedAnnotations, displaySet) { const displayText = []; // Area is the same for all series - const { - length, - width, - SeriesNumber, - SOPInstanceUID, - frameNumber, - } = mappedAnnotations[0]; + const { length, width, SeriesNumber, SOPInstanceUID, frameNumber } = mappedAnnotations[0]; const roundedLength = utils.roundNumber(length, 2); const roundedWidth = utils.roundNumber(width, 2); - const instance = displaySet.images.find( - image => image.SOPInstanceUID === SOPInstanceUID - ); + const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { @@ -197,9 +176,7 @@ function getDisplayText(mappedAnnotations, displaySet) { const instanceText = InstanceNumber ? ` I: ${InstanceNumber}` : ''; const frameText = displaySet.isMultiFrame ? ` F: ${frameNumber}` : ''; - displayText.push( - `L: ${roundedLength} mm (S: ${SeriesNumber}${instanceText}${frameText})` - ); + displayText.push(`L: ${roundedLength} mm (S: ${SeriesNumber}${instanceText}${frameText})`); displayText.push(`W: ${roundedWidth} mm`); return displayText; diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/CircleROI.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/CircleROI.ts index f261ac4ba..ac784878b 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/CircleROI.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/CircleROI.ts @@ -25,11 +25,7 @@ const CircleROI = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, CornerstoneViewportService, viewportId @@ -48,14 +44,10 @@ const CircleROI = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - DisplaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, DisplaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); - const getReport = () => - _getReport(mappedAnnotations, points, FrameOfReferenceUID); + const getReport = () => _getReport(mappedAnnotations, points, FrameOfReferenceUID); return { uid: annotationUID, @@ -93,16 +85,11 @@ function getMappedAnnotations(annotation, DisplaySetService) { if (!referencedImageId) { // Todo: Non-acquisition plane measurement mapping not supported yet - throw new Error( - 'Non-acquisition plane measurement mapping not supported' - ); + throw new Error('Non-acquisition plane measurement mapping not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - frameNumber, - } = getSOPInstanceAttributes(referencedImageId); + const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = + getSOPInstanceAttributes(referencedImageId); const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, @@ -150,12 +137,7 @@ function _getReport(mappedAnnotations, points, FrameOfReferenceUID) { return; } - columns.push( - `max (${unit})`, - `mean (${unit})`, - `std (${unit})`, - `area (mm2)` - ); + columns.push(`max (${unit})`, `mean (${unit})`, `std (${unit})`, `area (mm2)`); values.push(max, mean, stdDev, area); }); @@ -188,9 +170,7 @@ function getDisplayText(mappedAnnotations, displaySet) { // Area is the same for all series const { area, SOPInstanceUID, frameNumber } = mappedAnnotations[0]; - const instance = displaySet.images.find( - image => image.SOPInstanceUID === SOPInstanceUID - ); + const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/CobbAngle.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/CobbAngle.ts index 6e2ebc79c..8c78a377d 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/CobbAngle.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/CobbAngle.ts @@ -32,11 +32,7 @@ const CobbAngle = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, CornerstoneViewportService, viewportId @@ -55,14 +51,10 @@ const CobbAngle = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - displaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, displaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); - const getReport = () => - _getReport(mappedAnnotations, points, FrameOfReferenceUID); + const getReport = () => _getReport(mappedAnnotations, points, FrameOfReferenceUID); return { uid: annotationUID, @@ -99,16 +91,11 @@ function getMappedAnnotations(annotation, DisplaySetService) { const targetStats = cachedStats[targetId]; if (!referencedImageId) { - throw new Error( - 'Non-acquisition plane measurement mapping not supported' - ); + throw new Error('Non-acquisition plane measurement mapping not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - frameNumber, - } = getSOPInstanceAttributes(referencedImageId); + const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = + getSOPInstanceAttributes(referencedImageId); const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, @@ -179,17 +166,9 @@ function getDisplayText(mappedAnnotations, displaySet) { const displayText = []; // Area is the same for all series - const { - angle, - unit, - SeriesNumber, - SOPInstanceUID, - frameNumber, - } = mappedAnnotations[0]; + const { angle, unit, SeriesNumber, SOPInstanceUID, frameNumber } = mappedAnnotations[0]; - const instance = displaySet.images.find( - image => image.SOPInstanceUID === SOPInstanceUID - ); + const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { @@ -202,9 +181,7 @@ function getDisplayText(mappedAnnotations, displaySet) { return displayText; } const roundedAngle = utils.roundNumber(angle, 2); - displayText.push( - `${roundedAngle} ${unit} (S: ${SeriesNumber}${instanceText}${frameText})` - ); + displayText.push(`${roundedAngle} ${unit} (S: ${SeriesNumber}${instanceText}${frameText})`); return displayText; } diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/EllipticalROI.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/EllipticalROI.ts index e20998534..aa7e5f129 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/EllipticalROI.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/EllipticalROI.ts @@ -25,11 +25,7 @@ const EllipticalROI = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, cornerstoneViewportService, viewportId @@ -48,14 +44,10 @@ const EllipticalROI = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - displaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, displaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); - const getReport = () => - _getReport(mappedAnnotations, points, FrameOfReferenceUID); + const getReport = () => _getReport(mappedAnnotations, points, FrameOfReferenceUID); return { uid: annotationUID, @@ -93,16 +85,11 @@ function getMappedAnnotations(annotation, displaySetService) { if (!referencedImageId) { // Todo: Non-acquisition plane measurement mapping not supported yet - throw new Error( - 'Non-acquisition plane measurement mapping not supported' - ); + throw new Error('Non-acquisition plane measurement mapping not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - frameNumber, - } = getSOPInstanceAttributes(referencedImageId); + const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = + getSOPInstanceAttributes(referencedImageId); const displaySet = displaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, @@ -150,12 +137,7 @@ function _getReport(mappedAnnotations, points, FrameOfReferenceUID) { return; } - columns.push( - `max (${unit})`, - `mean (${unit})`, - `std (${unit})`, - `area (mm2)` - ); + columns.push(`max (${unit})`, `mean (${unit})`, `std (${unit})`, `area (mm2)`); values.push(max, mean, stdDev, area); }); @@ -188,9 +170,7 @@ function getDisplayText(mappedAnnotations, displaySet) { // Area is the same for all series const { area, SOPInstanceUID, frameNumber } = mappedAnnotations[0]; - const instance = displaySet.images.find( - image => image.SOPInstanceUID === SOPInstanceUID - ); + const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/Length.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/Length.ts index fdc5993ab..249522e84 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/Length.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/Length.ts @@ -32,11 +32,7 @@ const Length = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, cornerstoneViewportService, viewportId @@ -55,14 +51,10 @@ const Length = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - displaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, displaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); - const getReport = () => - _getReport(mappedAnnotations, points, FrameOfReferenceUID); + const getReport = () => _getReport(mappedAnnotations, points, FrameOfReferenceUID); return { uid: annotationUID, @@ -99,16 +91,11 @@ function getMappedAnnotations(annotation, displaySetService) { const targetStats = cachedStats[targetId]; if (!referencedImageId) { - throw new Error( - 'Non-acquisition plane measurement mapping not supported' - ); + throw new Error('Non-acquisition plane measurement mapping not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - frameNumber, - } = getSOPInstanceAttributes(referencedImageId); + const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = + getSOPInstanceAttributes(referencedImageId); const displaySet = displaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, @@ -179,16 +166,9 @@ function getDisplayText(mappedAnnotations, displaySet) { const displayText = []; // Area is the same for all series - const { - length, - SeriesNumber, - SOPInstanceUID, - frameNumber, - } = mappedAnnotations[0]; + const { length, SeriesNumber, SOPInstanceUID, frameNumber } = mappedAnnotations[0]; - const instance = displaySet.images.find( - image => image.SOPInstanceUID === SOPInstanceUID - ); + const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { @@ -202,9 +182,7 @@ function getDisplayText(mappedAnnotations, displaySet) { return displayText; } const roundedLength = utils.roundNumber(length, 2); - displayText.push( - `${roundedLength} mm (S: ${SeriesNumber}${instanceText}${frameText})` - ); + displayText.push(`${roundedLength} mm (S: ${SeriesNumber}${instanceText}${frameText})`); return displayText; } diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/PlanarFreehandROI.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/PlanarFreehandROI.ts index 2b0fd7008..b6db513b6 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/PlanarFreehandROI.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/PlanarFreehandROI.ts @@ -31,11 +31,7 @@ const PlanarFreehandROI = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, CornerstoneViewportService, viewportId @@ -54,14 +50,10 @@ const PlanarFreehandROI = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - DisplaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, DisplaySetService); const displayText = getDisplayText(mappedAnnotations); - const getReport = () => - _getReport(mappedAnnotations, points, FrameOfReferenceUID); + const getReport = () => _getReport(mappedAnnotations, points, FrameOfReferenceUID); return { uid: annotationUID, @@ -96,10 +88,8 @@ function getMappedAnnotations(annotationData, DisplaySetService) { const annotations = []; - const { - SOPInstanceUID: _SOPInstanceUID, - SeriesInstanceUID: _SeriesInstanceUID, - } = getSOPInstanceAttributes(referencedImageId) || {}; + const { SOPInstanceUID: _SOPInstanceUID, SeriesInstanceUID: _SeriesInstanceUID } = + getSOPInstanceAttributes(referencedImageId) || {}; if (!_SOPInstanceUID || !_SeriesInstanceUID) { return annotations; diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/RectangleROI.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/RectangleROI.ts index 3694f76d0..035b87457 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/RectangleROI.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/RectangleROI.ts @@ -25,11 +25,7 @@ const RectangleROI = { throw new Error('Tool not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - StudyInstanceUID, - } = getSOPInstanceAttributes( + const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, CornerstoneViewportService, viewportId @@ -48,14 +44,10 @@ const RectangleROI = { const { points } = data.handles; - const mappedAnnotations = getMappedAnnotations( - annotation, - DisplaySetService - ); + const mappedAnnotations = getMappedAnnotations(annotation, DisplaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); - const getReport = () => - _getReport(mappedAnnotations, points, FrameOfReferenceUID); + const getReport = () => _getReport(mappedAnnotations, points, FrameOfReferenceUID); return { uid: annotationUID, @@ -93,16 +85,11 @@ function getMappedAnnotations(annotation, DisplaySetService) { if (!referencedImageId) { // Todo: Non-acquisition plane measurement mapping not supported yet - throw new Error( - 'Non-acquisition plane measurement mapping not supported' - ); + throw new Error('Non-acquisition plane measurement mapping not supported'); } - const { - SOPInstanceUID, - SeriesInstanceUID, - frameNumber, - } = getSOPInstanceAttributes(referencedImageId); + const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = + getSOPInstanceAttributes(referencedImageId); const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, @@ -150,12 +137,7 @@ function _getReport(mappedAnnotations, points, FrameOfReferenceUID) { return; } - columns.push( - `max (${unit})`, - `mean (${unit})`, - `std (${unit})`, - `area (mm2)` - ); + columns.push(`max (${unit})`, `mean (${unit})`, `std (${unit})`, `area (mm2)`); values.push(max, mean, stdDev, area); }); @@ -188,9 +170,7 @@ function getDisplayText(mappedAnnotations, displaySet) { // Area is the same for all series const { area, SOPInstanceUID, frameNumber } = mappedAnnotations[0]; - const instance = displaySet.images.find( - image => image.SOPInstanceUID === SOPInstanceUID - ); + const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/measurementServiceMappingsFactory.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/measurementServiceMappingsFactory.ts index 2a4562e7d..e3ccf4e51 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/measurementServiceMappingsFactory.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/measurementServiceMappingsFactory.ts @@ -23,15 +23,8 @@ const measurementServiceMappingsFactory = ( */ const _getValueTypeFromToolType = toolType => { - const { - POLYLINE, - ELLIPSE, - CIRCLE, - RECTANGLE, - BIDIRECTIONAL, - POINT, - ANGLE, - } = MeasurementService.VALUE_TYPES; + const { POLYLINE, ELLIPSE, CIRCLE, RECTANGLE, BIDIRECTIONAL, POINT, ANGLE } = + MeasurementService.VALUE_TYPES; // TODO -> I get why this was attempted, but its not nearly flexible enough. // A single measurement may have an ellipse + a bidirectional measurement, for instances. diff --git a/extensions/cornerstone/src/utils/measurementServiceMappings/utils/selection.ts b/extensions/cornerstone/src/utils/measurementServiceMappings/utils/selection.ts index 156133306..1de09d942 100644 --- a/extensions/cornerstone/src/utils/measurementServiceMappings/utils/selection.ts +++ b/extensions/cornerstone/src/utils/measurementServiceMappings/utils/selection.ts @@ -18,24 +18,16 @@ function setAnnotationSelected(annotationUID: string, selected: boolean): void { const isCurrentSelected = isAnnotationSelected(annotationUID); // branch cut, avoid invoking imaging library unnecessarily. if (isCurrentSelected !== selected) { - cs3dToolAnnotationUtils.selection.setAnnotationSelected( - annotationUID, - selected - ); + cs3dToolAnnotationUtils.selection.setAnnotationSelected(annotationUID, selected); } } function getFirstAnnotationSelected(element) { - const [selectedAnnotationUID] = - cs3dToolAnnotationUtils.selection.getAnnotationsSelected() || []; + const [selectedAnnotationUID] = cs3dToolAnnotationUtils.selection.getAnnotationsSelected() || []; if (selectedAnnotationUID) { return cs3dToolAnnotationUtils.state.getAnnotation(selectedAnnotationUID); } } -export { - isAnnotationSelected, - setAnnotationSelected, - getFirstAnnotationSelected, -}; +export { isAnnotationSelected, setAnnotationSelected, getFirstAnnotationSelected }; diff --git a/extensions/cornerstone/src/utils/nthLoader.ts b/extensions/cornerstone/src/utils/nthLoader.ts index bce0d22f5..90aab65a8 100644 --- a/extensions/cornerstone/src/utils/nthLoader.ts +++ b/extensions/cornerstone/src/utils/nthLoader.ts @@ -51,9 +51,7 @@ export default function interleaveNthLoader({ .map(volume => volume.getImageLoadRequests()) .filter(requests => requests?.[0]?.imageId); - const orderedRequests = originalRequests.map(request => - getNthFrames(request) - ); + const orderedRequests = originalRequests.map(request => getNthFrames(request)); // set the finalRequests to the imageLoadPoolManager const finalRequests = interleave(orderedRequests); @@ -61,31 +59,17 @@ export default function interleaveNthLoader({ const requestType = Enums.RequestType.Prefetch; const priority = 0; - finalRequests.forEach( - ({ callLoadImage, additionalDetails, imageId, imageIdIndex, options }) => { - const callLoadImageBound = callLoadImage.bind( - null, - imageId, - imageIdIndex, - options - ); + finalRequests.forEach(({ callLoadImage, additionalDetails, imageId, imageIdIndex, options }) => { + const callLoadImageBound = callLoadImage.bind(null, imageId, imageIdIndex, options); - imageLoadPoolManager.addRequest( - callLoadImageBound, - requestType, - additionalDetails, - priority - ); - } - ); + imageLoadPoolManager.addRequest(callLoadImageBound, requestType, additionalDetails, priority); + }); // clear the volumeIdMapsToLoad volumeIdMapsToLoad.clear(); // copy the viewportIdVolumeInputArrayMap - const viewportIdVolumeInputArrayMapCopy = new Map( - viewportIdVolumeInputArrayMap - ); + const viewportIdVolumeInputArrayMapCopy = new Map(viewportIdVolumeInputArrayMap); // reset the viewportIdVolumeInputArrayMap viewportIdVolumeInputArrayMap.clear(); diff --git a/extensions/cornerstone/src/utils/removeToolGroupSegmentationRepresentations.ts b/extensions/cornerstone/src/utils/removeToolGroupSegmentationRepresentations.ts index 513321b32..b0f3e5796 100644 --- a/extensions/cornerstone/src/utils/removeToolGroupSegmentationRepresentations.ts +++ b/extensions/cornerstone/src/utils/removeToolGroupSegmentationRepresentations.ts @@ -1,9 +1,7 @@ import { segmentation } from '@cornerstonejs/tools'; function removeToolGroupSegmentationRepresentations(toolGroupId) { - const representations = segmentation.state.getSegmentationRepresentations( - toolGroupId - ); + const representations = segmentation.state.getSegmentationRepresentations(toolGroupId); if (!representations || !representations.length) { return; diff --git a/extensions/cornerstone/src/utils/stackSync/calculateViewportRegistrations.ts b/extensions/cornerstone/src/utils/stackSync/calculateViewportRegistrations.ts index cbb976534..aae2882b0 100644 --- a/extensions/cornerstone/src/utils/stackSync/calculateViewportRegistrations.ts +++ b/extensions/cornerstone/src/utils/stackSync/calculateViewportRegistrations.ts @@ -1,8 +1,6 @@ import { Types, getRenderingEngine, utilities } from '@cornerstonejs/core'; -export default function calculateViewportRegistrations( - viewports: Types.IViewportId[] -) { +export default function calculateViewportRegistrations(viewports: Types.IViewportId[]) { const viewportPairs = _getViewportPairs(viewports); for (const [viewport, nextViewport] of viewportPairs) { diff --git a/extensions/cornerstone/src/utils/stackSync/toggleStackImageSync.ts b/extensions/cornerstone/src/utils/stackSync/toggleStackImageSync.ts index 7f7ce32cc..5e18b6ba4 100644 --- a/extensions/cornerstone/src/utils/stackSync/toggleStackImageSync.ts +++ b/extensions/cornerstone/src/utils/stackSync/toggleStackImageSync.ts @@ -6,28 +6,16 @@ import calculateViewportRegistrations from './calculateViewportRegistrations'; // ]} let STACK_IMAGE_SYNC_GROUPS_INFO = []; -export default function toggleStackImageSync({ - toggledState, - servicesManager, - getEnabledElement, -}) { - const { - syncGroupService, - viewportGridService, - displaySetService, - cornerstoneViewportService, - } = servicesManager.services; +export default function toggleStackImageSync({ toggledState, servicesManager, getEnabledElement }) { + const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } = + servicesManager.services; if (!toggledState) { STACK_IMAGE_SYNC_GROUPS_INFO.forEach(syncGroupInfo => { const { viewports, synchronizerId } = syncGroupInfo; viewports.forEach(({ viewportId, renderingEngineId }) => { - syncGroupService.removeViewportFromSyncGroup( - viewportId, - renderingEngineId, - synchronizerId - ); + syncGroupService.removeViewportFromSyncGroup(viewportId, renderingEngineId, synchronizerId); }); }); @@ -47,9 +35,7 @@ export default function toggleStackImageSync({ const { displaySetInstanceUIDs } = viewport; for (const displaySetInstanceUID of displaySetInstanceUIDs) { - const displaySet = displaySetService.getDisplaySetByUID( - displaySetInstanceUID - ); + const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); return !!displaySet?.isReconstructable; } @@ -64,8 +50,7 @@ export default function toggleStackImageSync({ } const { element } = cornerstoneViewportService.getViewportInfo(viewportId); - const { viewport: csViewport, renderingEngineId } = - getEnabledElement(element); + const { viewport: csViewport, renderingEngineId } = getEnabledElement(element); const { viewPlaneNormal } = csViewport.getCamera(); // Should we round here? I guess so, but not sure how much precision we need @@ -82,9 +67,7 @@ export default function toggleStackImageSync({ // create synchronizer for each group Object.values(viewportsByOrientation).map(viewports => { - let synchronizerId = viewports - .map(({ viewportId }) => viewportId) - .join(','); + let synchronizerId = viewports.map(({ viewportId }) => viewportId).join(','); synchronizerId = `imageSync_${synchronizerId}`; diff --git a/extensions/default/.webpack/webpack.dev.js b/extensions/default/.webpack/webpack.dev.js index 96d68096d..6aea859ca 100644 --- a/extensions/default/.webpack/webpack.dev.js +++ b/extensions/default/.webpack/webpack.dev.js @@ -7,7 +7,6 @@ const ENTRY = { app: `${SRC_DIR}/index.tsx`, }; - module.exports = (env, argv) => { return webpackCommon(env, argv, { SRC_DIR, DIST_DIR, ENTRY }); }; diff --git a/extensions/default/.webpack/webpack.prod.js b/extensions/default/.webpack/webpack.prod.js index ea7b2e5bb..1151efc8b 100644 --- a/extensions/default/.webpack/webpack.prod.js +++ b/extensions/default/.webpack/webpack.prod.js @@ -40,13 +40,7 @@ module.exports = (env, argv) => { libraryTarget: 'umd', filename: pkg.main, }, - externals: [ - /\b(vtk.js)/, - /\b(dcmjs)/, - /\b(gl-matrix)/, - /^@ohif/, - /^@cornerstonejs/, - ], + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], plugins: [ new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, diff --git a/extensions/default/src/Actions/createReportAsync.tsx b/extensions/default/src/Actions/createReportAsync.tsx index 98080288b..af9520917 100644 --- a/extensions/default/src/Actions/createReportAsync.tsx +++ b/extensions/default/src/Actions/createReportAsync.tsx @@ -16,11 +16,7 @@ async function createReportAsync( measurements, options ) { - const { - displaySetService, - uiNotificationService, - uiDialogService, - } = servicesManager.services; + const { displaySetService, uiNotificationService, uiDialogService } = servicesManager.services; const loadingDialogId = uiDialogService.create({ showOverlay: true, isDraggable: false, diff --git a/extensions/default/src/Components/DataSourceConfigurationComponent.tsx b/extensions/default/src/Components/DataSourceConfigurationComponent.tsx index c9606c54e..97896a92c 100644 --- a/extensions/default/src/Components/DataSourceConfigurationComponent.tsx +++ b/extensions/default/src/Components/DataSourceConfigurationComponent.tsx @@ -18,13 +18,10 @@ function DataSourceConfigurationComponent({ const { customizationService } = servicesManager.services; - const [configurationAPI, setConfigurationAPI] = useState< - Types.BaseDataSourceConfigurationAPI - >(); + const [configurationAPI, setConfigurationAPI] = useState(); - const [configuredItems, setConfiguredItems] = useState< - Array - >(); + const [configuredItems, setConfiguredItems] = + useState>(); useEffect(() => { let shouldUpdate = true; @@ -37,9 +34,7 @@ function DataSourceConfigurationComponent({ } const { factory: configurationAPIFactory } = - customizationService.get( - activeDataSourceDef.configuration.configurationAPI - ) ?? {}; + customizationService.get(activeDataSourceDef.configuration.configurationAPI) ?? {}; if (!configurationAPIFactory) { return; @@ -95,24 +90,25 @@ function DataSourceConfigurationComponent({ }, [configurationAPI, configuredItems, showConfigurationModal]); return configuredItems ? ( -
+
{configuredItems.map((item, itemIndex) => { return ( -
+
{item.name}
- {itemIndex !== configuredItems.length - 1 && ( -
|
- )} + {itemIndex !== configuredItems.length - 1 &&
|
}
); })} diff --git a/extensions/default/src/Components/DataSourceConfigurationModalComponent.tsx b/extensions/default/src/Components/DataSourceConfigurationModalComponent.tsx index b10267740..c709a45e1 100644 --- a/extensions/default/src/Components/DataSourceConfigurationModalComponent.tsx +++ b/extensions/default/src/Components/DataSourceConfigurationModalComponent.tsx @@ -5,8 +5,7 @@ import { Icon } from '@ohif/ui'; import { Types } from '@ohif/core'; import ItemListComponent from './ItemListComponent'; -const NO_WRAP_ELLIPSIS_CLASS_NAMES = - 'text-ellipsis whitespace-nowrap overflow-hidden'; +const NO_WRAP_ELLIPSIS_CLASS_NAMES = 'text-ellipsis whitespace-nowrap overflow-hidden'; type DataSourceConfigurationModalComponentProps = { configurationAPI: Types.BaseDataSourceConfigurationAPI; @@ -21,9 +20,7 @@ function DataSourceConfigurationModalComponent({ }: DataSourceConfigurationModalComponentProps) { const { t } = useTranslation('DataSourceConfiguration'); - const [itemList, setItemList] = useState< - Array - >(); + const [itemList, setItemList] = useState>(); const [selectedItems, setSelectedItems] = useState(configuredItems); @@ -104,9 +101,7 @@ function DataSourceConfigurationModalComponent({ itemIndex < selectedItems.length ? classNames( 'bg-black/[.4]', - itemIndex !== itemLabels.length - 1 - ? 'hover:bg-transparent active:bg-secondary-dark' - : '' + itemIndex !== itemLabels.length - 1 ? 'hover:bg-transparent active:bg-secondary-dark' : '' ) : 'bg-transparent'; @@ -118,17 +113,15 @@ function DataSourceConfigurationModalComponent({ : 'border border-dashed border-secondary-light'; const getSelectedItemTextClasses = itemIndex => - itemIndex <= selectedItems.length - ? 'text-primary-light' - : 'text-primary-active'; + itemIndex <= selectedItems.length ? 'text-primary-light' : 'text-primary-active'; const getErrorComponent = (): ReactElement => { return ( -
+
{t(`Error fetching ${itemLabels[selectedItems.length]} list`)}
-
{errorMessage}
+
{errorMessage}
); }; @@ -141,7 +134,7 @@ function DataSourceConfigurationModalComponent({
{ setShowFullConfig(false); - setSelectedItems(theList => - theList.slice(0, itemLabelIndex) - ); + setSelectedItems(theList => theList.slice(0, itemLabelIndex)); } : undefined } > -
+
{itemLabelIndex < selectedItems.length ? ( ) : ( )} -
- {t(itemLabel)} -
+
{t(itemLabel)}
{itemLabelIndex < selectedItems.length ? ( -
+
{selectedItems[itemLabelIndex].name}
) : ( @@ -189,9 +173,9 @@ function DataSourceConfigurationModalComponent({ }; return ( -
+
{getSelectedItemsComponent()} -
+
{errorMessage ? ( getErrorComponent() ) : ( @@ -200,10 +184,7 @@ function DataSourceConfigurationModalComponent({ itemList={itemList} onItemClicked={item => { setShowFullConfig(false); - setSelectedItems(theList => [ - ...theList.slice(0, currentSelectedItemIndex + 1), - item, - ]); + setSelectedItems(theList => [...theList.slice(0, currentSelectedItemIndex + 1), item]); }} > )} diff --git a/extensions/default/src/Components/ItemListComponent.tsx b/extensions/default/src/Components/ItemListComponent.tsx index b2d8525a3..d8c30714f 100644 --- a/extensions/default/src/Components/ItemListComponent.tsx +++ b/extensions/default/src/Components/ItemListComponent.tsx @@ -1,12 +1,7 @@ import classNames from 'classnames'; import React, { ReactElement, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { - Button, - Icon, - InputFilterText, - LoadingIndicatorProgress, -} from '@ohif/ui'; +import { Button, Icon, InputFilterText, LoadingIndicatorProgress } from '@ohif/ui'; import { Types } from '@ohif/core'; type ItemListComponentProps = { @@ -28,37 +23,35 @@ function ItemListComponent({ }, [itemList]); return ( -
-
-
- {t(`Select ${itemLabel}`)} -
+
+
+
{t(`Select ${itemLabel}`)}
-
+
{itemList == null ? ( - + ) : itemList.length === 0 ? ( -
- +
+ {t(`No ${itemLabel} available`)}
) : ( <> -
- {t(itemLabel)} -
-
+
{t(itemLabel)}
+
{itemList .filter( item => - !filterValue || - item.name.toLowerCase().includes(filterValue.toLowerCase()) + !filterValue || item.name.toLowerCase().includes(filterValue.toLowerCase()) ) .map(item => { const border = @@ -66,7 +59,7 @@ function ItemListComponent({ return (
- this.services.uiDialogService.dismiss({ id: 'context-menu' }), + onClickOutside: () => this.services.uiDialogService.dismiss({ id: 'context-menu' }), contentProps: { items, @@ -170,9 +166,7 @@ export default class ContextMenuController { }; static _isValidPosition = (source): boolean => { - return ( - source && typeof source.x === 'number' && typeof source.y === 'number' - ); + return source && typeof source.x === 'number' && typeof source.y === 'number'; }; /** @@ -180,10 +174,7 @@ export default class ContextMenuController { */ static _getDefaultPosition = (canvasPoints, eventDetail, viewerElement) => { function* getPositionIterator() { - yield ContextMenuController._getCanvasPointsPosition( - canvasPoints, - viewerElement - ); + yield ContextMenuController._getCanvasPointsPosition(canvasPoints, viewerElement); yield ContextMenuController._getEventDefaultPosition(eventDetail); yield ContextMenuController._getElementDefaultPosition(viewerElement); yield ContextMenuController.getDefaultPosition(); diff --git a/extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.test.js b/extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.test.js index b5555f71f..00ee469dd 100644 --- a/extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.test.js +++ b/extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.test.js @@ -1,4 +1,4 @@ -import ContextMenuItemsBuilder from "./ContextMenuItemsBuilder"; +import ContextMenuItemsBuilder from './ContextMenuItemsBuilder'; const menus = [ { diff --git a/extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.ts b/extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.ts index 2fe20e8d9..8b8b98532 100644 --- a/extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.ts +++ b/extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.ts @@ -31,16 +31,11 @@ export function findMenuById(menus: Menu[], menuId?: string): Menu { * @param {*} subProps * @returns */ -export function findMenuDefault( - menus: Menu[], - subProps: Record -): Menu { +export function findMenuDefault(menus: Menu[], subProps: Record): Menu { if (!menus) { return null; } - return menus.find( - menu => !menu.selector || menu.selector(subProps.selectorProps) - ); + return menus.find(menu => !menu.selector || menu.selector(subProps.selectorProps)); } /** @@ -53,11 +48,7 @@ export function findMenuDefault( * @param menuIdFilter - menu id identifier (to be considered on selection) * This is intended to support other types of filtering in the future. */ -export function findMenu( - menus: Menu[], - props?: Types.IProps, - menuIdFilter?: string -) { +export function findMenu(menus: Menu[], props?: Types.IProps, menuIdFilter?: string) { const { subMenu } = props; function* findMenuIterator() { @@ -137,10 +128,7 @@ export function getMenuItems( if (!selector || selector(selectorProps)) { if (delegating) { - menuItems = [ - ...menuItems, - ...getMenuItems(selectorProps, event, menus, subMenu), - ]; + menuItems = [...menuItems, ...getMenuItems(selectorProps, event, menus, subMenu)]; } else { const toAdd = adaptItem(item, subProps); menuItems.push(toAdd); @@ -161,10 +149,7 @@ export function getMenuItems( * @returns a MenuItem that is compatible with the base ContextMenu * This requires having a label and set of actions to be called. */ -export function adaptItem( - item: MenuItem, - subProps: ContextMenuProps -): ContextMenuItem { +export function adaptItem(item: MenuItem, subProps: ContextMenuProps): ContextMenuItem { const newItem: ContextMenuItem = { ...item, value: subProps.selectorProps?.value, diff --git a/extensions/default/src/DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI.ts b/extensions/default/src/DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI.ts index 919592379..4e02cafae 100644 --- a/extensions/default/src/DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI.ts +++ b/extensions/default/src/DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI.ts @@ -29,15 +29,15 @@ const initialUrl = 'https://cloudresourcemanager.googleapis.com/v1'; const baseHealthcareUrl = 'https://healthcare.googleapis.com/v1'; class GoogleCloudDataSourceConfigurationAPIItem - implements Types.BaseDataSourceConfigurationAPIItem { + implements Types.BaseDataSourceConfigurationAPIItem +{ id: string; name: string; url: string; itemType: ItemType; } -class GoogleCloudDataSourceConfigurationAPI - implements Types.BaseDataSourceConfigurationAPI { +class GoogleCloudDataSourceConfigurationAPI implements Types.BaseDataSourceConfigurationAPI { private _extensionManager: ExtensionManager; private _fetchOptions: { method: string; headers: unknown }; private _dataSourceName: string; @@ -45,8 +45,7 @@ class GoogleCloudDataSourceConfigurationAPI constructor(dataSourceName, servicesManager, extensionManager) { this._dataSourceName = dataSourceName; this._extensionManager = extensionManager; - const userAuthenticationService = - servicesManager.services.userAuthenticationService; + const userAuthenticationService = servicesManager.services.userAuthenticationService; this._fetchOptions = { method: 'GET', headers: userAuthenticationService.getAuthorizationHeader(), @@ -89,9 +88,7 @@ class GoogleCloudDataSourceConfigurationAPI // Last configurable item, so update the data source configuration. const url = `${googleCloudItem.url}/dicomWeb`; const dataSourceDefCopy = JSON.parse( - JSON.stringify( - this._extensionManager.getDataSourceDefinition(this._dataSourceName) - ) + JSON.stringify(this._extensionManager.getDataSourceDefinition(this._dataSourceName)) ); dataSourceDefCopy.configuration = { ...dataSourceDefCopy.configuration, @@ -136,9 +133,7 @@ class GoogleCloudDataSourceConfigurationAPI return subItems; } - async getConfiguredItems(): Promise< - Array - > { + async getConfiguredItems(): Promise> { const dataSourceDefinition = this._extensionManager.getDataSourceDefinition( this._dataSourceName ); @@ -216,9 +211,7 @@ class GoogleCloudDataSourceConfigurationAPI fetchOptions, fetchSearchParams ); - data[ItemType[fetchItemType]] = data[ItemType[fetchItemType]].concat( - subPageData - ); + data[ItemType[fetchItemType]] = data[ItemType[fetchItemType]].concat(subPageData); } if (data[ItemType[fetchItemType]]) { return data[ItemType[fetchItemType]]; diff --git a/extensions/default/src/DicomJSONDataSource/index.js b/extensions/default/src/DicomJSONDataSource/index.js index 271946c37..15ca386aa 100644 --- a/extensions/default/src/DicomJSONDataSource/index.js +++ b/extensions/default/src/DicomJSONDataSource/index.js @@ -152,15 +152,9 @@ function createDicomJSONApi(dicomJsonConfig) { return getDirectURL(wadoRoot, params); }, series: { - metadata: ({ - StudyInstanceUID, - madeInClient = false, - customSort, - } = {}) => { + metadata: ({ StudyInstanceUID, madeInClient = false, customSort } = {}) => { if (!StudyInstanceUID) { - throw new Error( - 'Unable to query for SeriesMetadata without StudyInstanceUID' - ); + throw new Error('Unable to query for SeriesMetadata without StudyInstanceUID'); } const study = findStudies('StudyInstanceUID', StudyInstanceUID)[0]; @@ -186,16 +180,10 @@ function createDicomJSONApi(dicomJsonConfig) { DicomMetadataStore.addInstances(naturalizedInstances, madeInClient); } - DicomMetadataStore.addSeriesMetadata( - seriesSummaryMetadata, - madeInClient - ); + DicomMetadataStore.addSeriesMetadata(seriesSummaryMetadata, madeInClient); function setSuccessFlag() { - const study = DicomMetadataStore.getStudy( - StudyInstanceUID, - madeInClient - ); + const study = DicomMetadataStore.getStudy(StudyInstanceUID, madeInClient); study.isLoaded = true; } diff --git a/extensions/default/src/DicomLocalDataSource/index.js b/extensions/default/src/DicomLocalDataSource/index.js index aa9949981..712acd057 100644 --- a/extensions/default/src/DicomLocalDataSource/index.js +++ b/extensions/default/src/DicomLocalDataSource/index.js @@ -127,16 +127,11 @@ function createDicomLocalApi(dicomLocalConfig) { series: { metadata: async ({ StudyInstanceUID, madeInClient = false } = {}) => { if (!StudyInstanceUID) { - throw new Error( - 'Unable to query for SeriesMetadata without StudyInstanceUID' - ); + throw new Error('Unable to query for SeriesMetadata without StudyInstanceUID'); } // Instances metadata already added via local upload - const study = DicomMetadataStore.getStudy( - StudyInstanceUID, - madeInClient - ); + const study = DicomMetadataStore.getStudy(StudyInstanceUID, madeInClient); // Series metadata already added via local upload DicomMetadataStore._broadcastEvent(EVENTS.SERIES_ADDED, { @@ -236,8 +231,7 @@ function createDicomLocalApi(dicomLocalConfig) { const { StudyInstanceUIDs: paramsStudyInstanceUIDs } = params; const queryStudyInstanceUIDs = query.getAll('StudyInstanceUIDs'); - const StudyInstanceUIDs = - queryStudyInstanceUIDs || paramsStudyInstanceUIDs; + const StudyInstanceUIDs = queryStudyInstanceUIDs || paramsStudyInstanceUIDs; const StudyInstanceUIDsAsArray = StudyInstanceUIDs && Array.isArray(StudyInstanceUIDs) ? StudyInstanceUIDs diff --git a/extensions/default/src/DicomTagBrowser/DicomTagBrowser.css b/extensions/default/src/DicomTagBrowser/DicomTagBrowser.css index fe6a96096..2845f2f39 100644 --- a/extensions/default/src/DicomTagBrowser/DicomTagBrowser.css +++ b/extensions/default/src/DicomTagBrowser/DicomTagBrowser.css @@ -4,7 +4,7 @@ } .dicom-tag-browser-table-wrapper { -/* height: 500px;*/ + /* height: 500px;*/ /*overflow-y: scroll;*/ overflow-x: scroll; } @@ -45,7 +45,7 @@ padding-left: 10px; padding-right: 10px; text-align: center; - color: "#20A5D6"; + color: '#20A5D6'; } .dicom-tag-browser-table th.dicom-tag-browser-table-left { diff --git a/extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx b/extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx index c616fe022..22eea9bc8 100644 --- a/extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx +++ b/extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx @@ -21,10 +21,8 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => { // 3: Value const excludedColumnIndicesForFilter: Set = new Set([1]); - const [ - selectedDisplaySetInstanceUID, - setSelectedDisplaySetInstanceUID, - ] = useState(displaySetInstanceUID); + const [selectedDisplaySetInstanceUID, setSelectedDisplaySetInstanceUID] = + useState(displaySetInstanceUID); const [instanceNumber, setInstanceNumber] = useState(1); const [filterValue, setFilterValue] = useState(''); @@ -110,27 +108,31 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => { return (
-
-
- +
+
+ Series -
+
option.value === value.dataSourceName - ).placeHolder + dataSourcesOpts.find(option => option.value === value.dataSourceName) + .placeHolder } value={value.dataSourceName} onChange={evt => { @@ -123,7 +117,7 @@ export default function createReportDialogPrompt( autoFocus label="Enter the report name" labelClassName="text-white text-[14px] leading-[1.2]" - className="bg-black border-primary-main" + className="border-primary-main bg-black" type="text" value={value.label} onChange={onChangeHandler} diff --git a/extensions/default/src/Panels/debounce.js b/extensions/default/src/Panels/debounce.js index d71793c0f..7a5b2bdf3 100644 --- a/extensions/default/src/Panels/debounce.js +++ b/extensions/default/src/Panels/debounce.js @@ -4,10 +4,10 @@ // leading edge, instead of the trailing. function debounce(func, wait, immediate) { var timeout; - return function() { + return function () { var context = this, args = arguments; - var later = function() { + var later = function () { timeout = null; if (!immediate) { func.apply(context, args); diff --git a/extensions/default/src/Toolbar/Toolbar.tsx b/extensions/default/src/Toolbar/Toolbar.tsx index e9238791b..51aa20f7c 100644 --- a/extensions/default/src/Toolbar/Toolbar.tsx +++ b/extensions/default/src/Toolbar/Toolbar.tsx @@ -49,7 +49,10 @@ export default function Toolbar({ servicesManager }) { return ( // The margin for separating the tools on the toolbar should go here and NOT in each individual component (button) item. // This allows for the individual items to be included in other UI components where perhaps alternative margins are desired. -
+
- ); + return ; } diff --git a/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx b/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx index b8e3723c9..9db937fec 100644 --- a/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx +++ b/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx @@ -4,19 +4,10 @@ import { LayoutSelector as OHIFLayoutSelector, ToolbarButton } from '@ohif/ui'; import { ServicesManager } from '@ohif/core'; -function LayoutSelector({ - rows, - columns, - className, - servicesManager, - ...rest -}) { +function LayoutSelector({ rows, columns, className, servicesManager, ...rest }) { const [isOpen, setIsOpen] = useState(false); - const { - hangingProtocolService, - toolbarService, - } = (servicesManager as ServicesManager).services; + const { hangingProtocolService, toolbarService } = (servicesManager as ServicesManager).services; const closeOnOutsideClick = () => { if (isOpen) { diff --git a/extensions/default/src/ViewerLayout/index.tsx b/extensions/default/src/ViewerLayout/index.tsx index aafb74bd8..7feb08be4 100644 --- a/extensions/default/src/ViewerLayout/index.tsx +++ b/extensions/default/src/ViewerLayout/index.tsx @@ -14,12 +14,7 @@ import { LoadingIndicatorProgress, } from '@ohif/ui'; import i18n from '@ohif/i18n'; -import { - ServicesManager, - HangingProtocolService, - hotkeys, - CommandsManager, -} from '@ohif/core'; +import { ServicesManager, HangingProtocolService, hotkeys, CommandsManager } from '@ohif/core'; import { useAppConfig } from '@state'; import Toolbar from '../Toolbar/Toolbar'; @@ -76,9 +71,7 @@ function ViewerLayout({ const { t } = useTranslation(); const { show, hide } = useModal(); - const [showLoadingIndicator, setShowLoadingIndicator] = useState( - appConfig.showLoadingIndicator - ); + const [showLoadingIndicator, setShowLoadingIndicator] = useState(appConfig.showLoadingIndicator); const { hangingProtocolService } = servicesManager.services; @@ -105,9 +98,7 @@ function ViewerLayout({ title: t('UserPreferencesModal:User Preferences'), content: UserPreferences, contentProps: { - hotkeyDefaults: hotkeysManager.getValidHotkeyDefinitions( - hotkeyDefaults - ), + hotkeyDefaults: hotkeysManager.getValidHotkeyDefinitions(hotkeyDefaults), hotkeyDefinitions, currentLanguage: currentLanguage(), availableLanguages, @@ -134,9 +125,7 @@ function ViewerLayout({ title: t('Header:Logout'), icon: 'power-off', onClick: async () => { - navigate( - `/logout?redirect_uri=${encodeURIComponent(window.location.href)}` - ); + navigate(`/logout?redirect_uri=${encodeURIComponent(window.location.href)}`); }, }); } @@ -234,13 +223,11 @@ function ViewerLayout({
- {showLoadingIndicator && ( - - )} + {showLoadingIndicator && } {/* LEFT SIDEPANELS */} {leftPanelComponents.length ? ( @@ -253,8 +240,8 @@ function ViewerLayout({ ) : null} {/* TOOLBAR + GRID */} -
-
+
+
command && - (command.commandName === 'setHangingProtocol' || - command.commandName === 'toggleHangingProtocol'); + (command.commandName === 'setHangingProtocol' || command.commandName === 'toggleHangingProtocol'); const commandsModule = ({ servicesManager, @@ -54,10 +50,7 @@ const commandsModule = ({ } = (servicesManager as ServicesManager).services; // Define a context menu controller for use with any context menus - const contextMenuController = new ContextMenuController( - servicesManager, - commandsManager - ); + const contextMenuController = new ContextMenuController(servicesManager, commandsManager); const actions = { /** @@ -95,11 +88,7 @@ const commandsModule = ({ ...selectorProps, }; - contextMenuController.showContextMenu( - optionsToUse, - element, - defaultPointsPosition - ); + contextMenuController.showContextMenu(optionsToUse, element, defaultPointsPosition); }, /** Close a context menu currently displayed */ @@ -187,19 +176,10 @@ const commandsModule = ({ // the activeViewportId const state = viewportGridService.getState(); const hpInfo = hangingProtocolService.getState(); - const { - protocol: oldProtocol, - } = hangingProtocolService.getActiveProtocol(); - const stateSyncReduce = reuseCachedLayouts( - state, - hangingProtocolService, - stateSyncService - ); - const { - hangingProtocolStageIndexMap, - viewportGridStore, - displaySetSelectorMap, - } = stateSyncReduce; + const { protocol: oldProtocol } = hangingProtocolService.getActiveProtocol(); + const stateSyncReduce = reuseCachedLayouts(state, hangingProtocolService, stateSyncService); + const { hangingProtocolStageIndexMap, viewportGridStore, displaySetSelectorMap } = + stateSyncReduce; if (!protocolId) { // Re-use the previous protocol id, and optionally stage @@ -209,8 +189,7 @@ const commandsModule = ({ } } else if (stageIndex === undefined && stageId === undefined) { // Re-set the same stage as was previously used - const hangingId = `${activeStudyUID || - hpInfo.activeStudyUID}:${protocolId}`; + const hangingId = `${activeStudyUID || hpInfo.activeStudyUID}:${protocolId}`; stageIndex = hangingProtocolStageIndexMap[hangingId]?.stageIndex; } @@ -225,9 +204,9 @@ const commandsModule = ({ hangingProtocolService.setActiveStudyUID(activeStudyUID); } - const storedHanging = `${ - hangingProtocolService.getState().activeStudyUID - }:${protocolId}:${useStageIdx || 0}`; + const storedHanging = `${hangingProtocolService.getState().activeStudyUID}:${protocolId}:${ + useStageIdx || 0 + }`; const restoreProtocol = !reset && viewportGridStore[storedHanging]; @@ -285,19 +264,14 @@ const commandsModule = ({ } }, - toggleHangingProtocol: ({ - protocolId, - stageIndex, - }: HangingProtocolParams): boolean => { + toggleHangingProtocol: ({ protocolId, stageIndex }: HangingProtocolParams): boolean => { const { protocol, stageIndex: desiredStageIndex, activeStudy, } = hangingProtocolService.getActiveProtocol(); const { toggleHangingProtocol } = stateSyncService.getState(); - const storedHanging = `${ - activeStudy.StudyInstanceUID - }:${protocolId}:${stageIndex | 0}`; + const storedHanging = `${activeStudy.StudyInstanceUID}:${protocolId}:${stageIndex | 0}`; if ( protocol.id === protocolId && (stageIndex === undefined || stageIndex === desiredStageIndex) @@ -326,10 +300,7 @@ const commandsModule = ({ }, deltaStage: ({ direction }) => { - const { - protocolId, - stageIndex: oldStageIndex, - } = hangingProtocolService.getState(); + const { protocolId, stageIndex: oldStageIndex } = hangingProtocolService.getState(); const { protocol } = hangingProtocolService.getActiveProtocol(); for ( let stageIndex = oldStageIndex + direction; @@ -358,23 +329,14 @@ const commandsModule = ({ const { protocol } = hangingProtocolService.getActiveProtocol(); const onLayoutChange = protocol.callbacks?.onLayoutChange; if (commandsManager.run(onLayoutChange, { numRows, numCols }) === false) { - console.log( - 'setViewportGridLayout running', - onLayoutChange, - numRows, - numCols - ); + console.log('setViewportGridLayout running', onLayoutChange, numRows, numCols); // Don't apply the layout if the run command returns false return; } const completeLayout = () => { const state = viewportGridService.getState(); - const stateReduce = findViewportsByPosition( - state, - { numRows, numCols }, - stateSyncService - ); + const stateReduce = findViewportsByPosition(state, { numRows, numCols }, stateSyncService); const findOrCreateViewport = layoutFindOrCreate.bind( null, hangingProtocolService, @@ -395,11 +357,8 @@ const commandsModule = ({ toggleOneUp() { const viewportGridState = viewportGridService.getState(); const { activeViewportId, viewports, layout } = viewportGridState; - const { - displaySetInstanceUIDs, - displaySetOptions, - viewportOptions, - } = viewports.get(activeViewportId); + const { displaySetInstanceUIDs, displaySetOptions, viewportOptions } = + viewports.get(activeViewportId); if (layout.numCols === 1 && layout.numRows === 1) { // The viewer is in one-up. Check if there is a state to restore/toggle back to. @@ -410,8 +369,7 @@ const commandsModule = ({ } // There is a state to toggle back to. The viewport that was // originally toggled to one up was the former active viewport. - const viewportIdToUpdate = - toggleOneUpViewportGridStore.activeViewportId; + const viewportIdToUpdate = toggleOneUpViewportGridStore.activeViewportId; const updatedViewportsViaHP = displaySetInstanceUIDs.length > 1 @@ -436,23 +394,22 @@ const commandsModule = ({ // the current one up viewport might have a new displaySet dragged and dropped on it // so we should prioritize the current one in the old grid store layout viewports - const newViewports = Array.from( - toggleOneUpViewportGridStore.viewports.values() - ).map(viewport => { - if (viewport.viewportId === currentOneUpViewport.viewportId) { - return { - ...currentOneUpViewport, - }; - } + const newViewports = Array.from(toggleOneUpViewportGridStore.viewports.values()).map( + viewport => { + if (viewport.viewportId === currentOneUpViewport.viewportId) { + return { + ...currentOneUpViewport, + }; + } - return viewport; - }); + return viewport; + } + ); // However, we also need to take into account that the current one up viewport // might have been part of a bigger hanging protocol layout, so going back // from one up we should apply those viewports as well. - return updatedViewportsViaHP.length > 1 && - updatedViewportsViaHP[position] + return updatedViewportsViaHP.length > 1 && updatedViewportsViaHP[position] ? { viewportOptions, displaySetOptions, @@ -509,10 +466,7 @@ const commandsModule = ({ }); }; - subscribeToNextViewportGridChange( - viewportGridService, - clearToggleOneUpViewportGridStore - ); + subscribeToNextViewportGridChange(viewportGridService, clearToggleOneUpViewportGridStore); } }, @@ -574,8 +528,7 @@ const commandsModule = ({ const { activeViewportId, viewports } = viewportGridService.getState(); const activeViewport = viewports.get(activeViewportId); - const activeDisplaySetInstanceUID = - activeViewport.displaySetInstanceUIDs[0]; + const activeDisplaySetInstanceUID = activeViewport.displaySetInstanceUIDs[0]; const thumbnailList = document.querySelector('#ohif-thumbnail-list'); @@ -585,9 +538,7 @@ const commandsModule = ({ const thumbnailListBounds = thumbnailList.getBoundingClientRect(); - const thumbnail = document.querySelector( - `#thumbnail-${activeDisplaySetInstanceUID}` - ); + const thumbnail = document.querySelector(`#thumbnail-${activeDisplaySetInstanceUID}`); if (!thumbnail) { return; @@ -610,14 +561,7 @@ const commandsModule = ({ direction, excludeNonImageModalities, }: UpdateViewportDisplaySetParams) => { - const nonImageModalities = [ - 'SR', - 'SEG', - 'SM', - 'RTSTRUCT', - 'RTPLAN', - 'RTDOSE', - ]; + const nonImageModalities = ['SR', 'SEG', 'SM', 'RTSTRUCT', 'RTPLAN', 'RTDOSE']; // Sort the display sets as per the hanging protocol service viewport/display set scoring system. // The thumbnail list uses the same sorting. @@ -638,30 +582,22 @@ const commandsModule = ({ for ( displaySetIndexToShow = activeDisplaySetIndex + direction; - displaySetIndexToShow > -1 && - displaySetIndexToShow < currentDisplaySets.length; + displaySetIndexToShow > -1 && displaySetIndexToShow < currentDisplaySets.length; displaySetIndexToShow += direction ) { if ( !excludeNonImageModalities || - !nonImageModalities.includes( - currentDisplaySets[displaySetIndexToShow].Modality - ) + !nonImageModalities.includes(currentDisplaySets[displaySetIndexToShow].Modality) ) { break; } } - if ( - displaySetIndexToShow < 0 || - displaySetIndexToShow >= currentDisplaySets.length - ) { + if (displaySetIndexToShow < 0 || displaySetIndexToShow >= currentDisplaySets.length) { return; } - const { displaySetInstanceUID } = currentDisplaySets[ - displaySetIndexToShow - ]; + const { displaySetInstanceUID } = currentDisplaySets[displaySetIndexToShow]; let updatedViewports = []; diff --git a/extensions/default/src/findViewportsByPosition.ts b/extensions/default/src/findViewportsByPosition.ts index c7319bd4a..984a80e4c 100644 --- a/extensions/default/src/findViewportsByPosition.ts +++ b/extensions/default/src/findViewportsByPosition.ts @@ -32,21 +32,13 @@ export const findOrCreateViewport = ( options.inDisplay = [...viewportsByPosition.initialInDisplay]; } // See if there is a default viewport for new views. - const missing = hangingProtocolService.getMissingViewport( - protocolId, - stageIndex, - options - ); + const missing = hangingProtocolService.getMissingViewport(protocolId, stageIndex, options); if (missing) { - const displaySetInstanceUIDs = missing.displaySetsInfo.map( - it => it.displaySetInstanceUID - ); + const displaySetInstanceUIDs = missing.displaySetsInfo.map(it => it.displaySetInstanceUID); options.inDisplay.push(...displaySetInstanceUIDs); return { displaySetInstanceUIDs, - displaySetOptions: missing.displaySetsInfo.map( - it => it.displaySetOptions - ), + displaySetOptions: missing.displaySetsInfo.map(it => it.displaySetOptions), viewportOptions: { ...missing.viewportOptions, }, diff --git a/extensions/default/src/getCustomizationModule.tsx b/extensions/default/src/getCustomizationModule.tsx index 60c7d07f3..1da3f1871 100644 --- a/extensions/default/src/getCustomizationModule.tsx +++ b/extensions/default/src/getCustomizationModule.tsx @@ -13,10 +13,7 @@ import { GoogleCloudDataSourceConfigurationAPI } from './DataSourceConfiguration * custom page for the user to view their profile, or to add a custom * page for login etc. */ -export default function getCustomizationModule({ - servicesManager, - extensionManager, -}) { +export default function getCustomizationModule({ servicesManager, extensionManager }) { return [ { name: 'helloPage', @@ -25,9 +22,7 @@ export default function getCustomizationModule({ routes: [ { path: '/custom', - children: () => ( -

Hello Custom Route

- ), + children: () =>

Hello Custom Route

, }, ], }, @@ -88,7 +83,7 @@ export default function getCustomizationModule({ */ { id: 'ohif.overlayItem', - content: function(props) { + content: function (props) { if (this.condition && !this.condition(props)) { return null; } @@ -110,9 +105,7 @@ export default function getCustomizationModule({ style={{ color: this.color || undefined }} title={this.title || ''} > - {this.label && ( - {this.label} - )} + {this.label && {this.label}} {value} ); @@ -126,7 +119,7 @@ export default function getCustomizationModule({ * This function clones the object and child objects to prevent * changes to the original customization object. */ - transform: function(customizationService: CustomizationService) { + transform: function (customizationService: CustomizationService) { // Don't modify the children, as those are copied by reference const clonedObject = { ...this }; clonedObject.menus = this.menus.map(menu => ({ ...menu })); diff --git a/extensions/default/src/getDisplaySetMessages.ts b/extensions/default/src/getDisplaySetMessages.ts index 18710cd55..e07494464 100644 --- a/extensions/default/src/getDisplaySetMessages.ts +++ b/extensions/default/src/getDisplaySetMessages.ts @@ -30,10 +30,7 @@ export default function getDisplaySetMessages( const isMultiframe = firstInstance.NumberOfFrames > 1; // Can't reconstruct if all instances don't have the ImagePositionPatient. - if ( - !isMultiframe && - !instances.every(instance => instance.ImagePositionPatient) - ) { + if (!isMultiframe && !instances.every(instance => instance.ImagePositionPatient)) { messages.addMessage(DisplaySetMessage.CODES.NO_POSITION_INFORMATION); } diff --git a/extensions/default/src/getLayoutTemplateModule.js b/extensions/default/src/getLayoutTemplateModule.js index 856d8d12a..df89b1076 100644 --- a/extensions/default/src/getLayoutTemplateModule.js +++ b/extensions/default/src/getLayoutTemplateModule.js @@ -5,12 +5,7 @@ import ViewerLayout from './ViewerLayout'; - Init layout based on the displaySets and the objects. */ -export default function({ - servicesManager, - extensionManager, - commandsManager, - hotkeysManager, -}) { +export default function ({ servicesManager, extensionManager, commandsManager, hotkeysManager }) { function ViewerLayoutWithServices(props) { return ViewerLayout({ servicesManager, diff --git a/extensions/default/src/getPTImageIdInstanceMetadata.ts b/extensions/default/src/getPTImageIdInstanceMetadata.ts index 183a92beb..bacad3dbf 100644 --- a/extensions/default/src/getPTImageIdInstanceMetadata.ts +++ b/extensions/default/src/getPTImageIdInstanceMetadata.ts @@ -1,15 +1,10 @@ import OHIF from '@ohif/core'; -import { - InstanceMetadata, - PhilipsPETPrivateGroup, -} from '@cornerstonejs/calculate-suv/src/types'; +import { InstanceMetadata, PhilipsPETPrivateGroup } from '@cornerstonejs/calculate-suv/src/types'; const metadataProvider = OHIF.classes.MetadataProvider; -export default function getPTImageIdInstanceMetadata( - imageId: string -): InstanceMetadata { +export default function getPTImageIdInstanceMetadata(imageId: string): InstanceMetadata { const dicomMetaData = metadataProvider.get('instance', imageId); if (!dicomMetaData) { @@ -22,17 +17,15 @@ export default function getPTImageIdInstanceMetadata( dicomMetaData.CorrectedImage === undefined || dicomMetaData.Units === undefined || !dicomMetaData.RadiopharmaceuticalInformationSequence || - dicomMetaData.RadiopharmaceuticalInformationSequence[0] - .RadionuclideHalfLife === undefined || - dicomMetaData.RadiopharmaceuticalInformationSequence[0] - .RadionuclideTotalDose === undefined || + dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife === undefined || + dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose === undefined || dicomMetaData.DecayCorrection === undefined || dicomMetaData.AcquisitionDate === undefined || dicomMetaData.AcquisitionTime === undefined || - (dicomMetaData.RadiopharmaceuticalInformationSequence[0] - .RadiopharmaceuticalStartDateTime === undefined && - dicomMetaData.RadiopharmaceuticalInformationSequence[0] - .RadiopharmaceuticalStartTime === undefined) + (dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime === + undefined && + dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime === + undefined) ) { throw new Error('required metadata are missing'); } @@ -45,17 +38,13 @@ export default function getPTImageIdInstanceMetadata( CorrectedImage: dicomMetaData.CorrectedImage, Units: dicomMetaData.Units, RadionuclideHalfLife: - dicomMetaData.RadiopharmaceuticalInformationSequence[0] - .RadionuclideHalfLife, + dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife, RadionuclideTotalDose: - dicomMetaData.RadiopharmaceuticalInformationSequence[0] - .RadionuclideTotalDose, + dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose, RadiopharmaceuticalStartDateTime: - dicomMetaData.RadiopharmaceuticalInformationSequence[0] - .RadiopharmaceuticalStartDateTime, + dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime, RadiopharmaceuticalStartTime: - dicomMetaData.RadiopharmaceuticalInformationSequence[0] - .RadiopharmaceuticalStartTime, + dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime, DecayCorrection: dicomMetaData.DecayCorrection, PatientWeight: dicomMetaData.PatientWeight, SeriesDate: dicomMetaData.SeriesDate, @@ -81,17 +70,11 @@ export default function getPTImageIdInstanceMetadata( instanceMetadata.GEPrivatePostInjectionDateTime = dicomMetaData['0009100d']; } - if ( - dicomMetaData.FrameReferenceTime && - dicomMetaData.FrameReferenceTime !== undefined - ) { + if (dicomMetaData.FrameReferenceTime && dicomMetaData.FrameReferenceTime !== undefined) { instanceMetadata.FrameReferenceTime = dicomMetaData.FrameReferenceTime; } - if ( - dicomMetaData.ActualFrameDuration && - dicomMetaData.ActualFrameDuration !== undefined - ) { + if (dicomMetaData.ActualFrameDuration && dicomMetaData.ActualFrameDuration !== undefined) { instanceMetadata.ActualFrameDuration = dicomMetaData.ActualFrameDuration; } @@ -111,10 +94,7 @@ function convertInterfaceTimeToString(time): string { const minutes = `${time.minutes || '00'}`.padStart(2, '0'); const seconds = `${time.seconds || '00'}`.padStart(2, '0'); - const fractionalSeconds = `${time.fractionalSeconds || '000000'}`.padEnd( - 6, - '0' - ); + const fractionalSeconds = `${time.fractionalSeconds || '000000'}`.padEnd(6, '0'); const timeString = `${hours}${minutes}${seconds}.${fractionalSeconds}`; return timeString; diff --git a/extensions/default/src/getPanelModule.tsx b/extensions/default/src/getPanelModule.tsx index 6f733e496..f8e1cbf67 100644 --- a/extensions/default/src/getPanelModule.tsx +++ b/extensions/default/src/getPanelModule.tsx @@ -6,11 +6,7 @@ import { WrappedPanelStudyBrowser, PanelMeasurementTable } from './Panels'; // - cancel promises when component is destroyed // - show errors in UI for thumbnails if promise fails -function getPanelModule({ - commandsManager, - extensionManager, - servicesManager, -}) { +function getPanelModule({ commandsManager, extensionManager, servicesManager }) { const wrappedMeasurementPanel = () => { return ( { const instance = instances[0]; const imageSet = new ImageSet(instances); - const { - value: isReconstructable, - averageSpacingBetweenFrames, - } = isDisplaySetReconstructable(instances); + const { value: isReconstructable, averageSpacingBetweenFrames } = + isDisplaySetReconstructable(instances); // set appropriate attributes to image set... const messages = getDisplaySetMessages(instances, isReconstructable); @@ -48,9 +46,7 @@ const makeDisplaySet = instances => { if (shallSort) { imageSet.sortBy((a, b) => { // Sort by InstanceNumber (0020,0013) - return ( - (parseInt(a.InstanceNumber) || 0) - (parseInt(b.InstanceNumber) || 0) - ); + return (parseInt(a.InstanceNumber) || 0) - (parseInt(b.InstanceNumber) || 0); }); } diff --git a/extensions/default/src/hpCompare.ts b/extensions/default/src/hpCompare.ts index dca48f22b..7bd934be1 100644 --- a/extensions/default/src/hpCompare.ts +++ b/extensions/default/src/hpCompare.ts @@ -163,12 +163,7 @@ const hpMNCompare: Types.HangingProtocol.Protocol = { columns: 2, }, }, - viewports: [ - currentViewport0, - priorViewport0, - currentViewport1, - priorViewport1, - ], + viewports: [currentViewport0, priorViewport0, currentViewport1, priorViewport1], }, { diff --git a/extensions/default/src/index.ts b/extensions/default/src/index.ts index 2b023d415..25c37bc4b 100644 --- a/extensions/default/src/index.ts +++ b/extensions/default/src/index.ts @@ -11,10 +11,7 @@ import getStudiesForPatientByMRN from './Panels/getStudiesForPatientByMRN'; import getCustomizationModule from './getCustomizationModule'; import { id } from './id.js'; import preRegistration from './init'; -import { - ContextMenuController, - CustomizableContextMenuTypes, -} from './CustomizableContextMenu'; +import { ContextMenuController, CustomizableContextMenuTypes } from './CustomizableContextMenu'; import * as dicomWebUtils from './DicomWebDataSource/utils'; const defaultExtension: Types.Extensions.Extension = { diff --git a/extensions/default/src/init.ts b/extensions/default/src/init.ts index b979bb4f6..973ae0722 100644 --- a/extensions/default/src/init.ts +++ b/extensions/default/src/init.ts @@ -13,17 +13,11 @@ const metadataProvider = classes.MetadataProvider; export default function init({ servicesManager, configuration = {} }): void { const { stateSyncService } = servicesManager.services; // Add - DicomMetadataStore.subscribe( - DicomMetadataStore.EVENTS.INSTANCES_ADDED, - handlePETImageMetadata - ); + DicomMetadataStore.subscribe(DicomMetadataStore.EVENTS.INSTANCES_ADDED, handlePETImageMetadata); // If the metadata for PET has changed by the user (e.g. manually changing the PatientWeight) // we need to recalculate the SUV Scaling Factors - DicomMetadataStore.subscribe( - DicomMetadataStore.EVENTS.SERIES_UPDATED, - handlePETImageMetadata - ); + DicomMetadataStore.subscribe(DicomMetadataStore.EVENTS.SERIES_UPDATED, handlePETImageMetadata); // viewportGridStore is a sync state which stores the entire // ViewportGridService getState, by the keys `::` @@ -55,10 +49,7 @@ export default function init({ servicesManager, configuration = {} }): void { } const handlePETImageMetadata = ({ SeriesInstanceUID, StudyInstanceUID }) => { - const { instances } = DicomMetadataStore.getSeries( - StudyInstanceUID, - SeriesInstanceUID - ); + const { instances } = DicomMetadataStore.getSeries(StudyInstanceUID, SeriesInstanceUID); const modality = instances[0].Modality; if (modality !== 'PT') { @@ -90,10 +81,6 @@ const handlePETImageMetadata = ({ SeriesInstanceUID, StudyInstanceUID }) => { } instanceMetadataArray.forEach((instanceMetadata, index) => { - metadataProvider.addCustomMetadata( - imageIds[index], - 'scalingModule', - suvScalingFactors[index] - ); + metadataProvider.addCustomMetadata(imageIds[index], 'scalingModule', suvScalingFactors[index]); }); }; diff --git a/extensions/default/src/utils/findSRWithSameSeriesDescription.ts b/extensions/default/src/utils/findSRWithSameSeriesDescription.ts index d50c76976..af565c9aa 100644 --- a/extensions/default/src/utils/findSRWithSameSeriesDescription.ts +++ b/extensions/default/src/utils/findSRWithSameSeriesDescription.ts @@ -19,20 +19,12 @@ export default function findSRWithSameSeriesDescription( ): Types.SeriesMetadata { const activeDisplaySets = displaySetService.getActiveDisplaySets(); const srDisplaySets = activeDisplaySets.filter(ds => ds.Modality === 'SR'); - const sameSeries = srDisplaySets.find( - ds => ds.SeriesDescription === SeriesDescription - ); + const sameSeries = srDisplaySets.find(ds => ds.SeriesDescription === SeriesDescription); if (sameSeries) { console.log('Storing to same series', sameSeries); const { instance } = sameSeries; - const { - SeriesInstanceUID, - SeriesDescription, - SeriesDate, - SeriesTime, - SeriesNumber, - Modality, - } = instance; + const { SeriesInstanceUID, SeriesDescription, SeriesDate, SeriesTime, SeriesNumber, Modality } = + instance; return { SeriesInstanceUID, SeriesDescription, diff --git a/extensions/default/src/utils/getDirectURL.js b/extensions/default/src/utils/getDirectURL.js index 40b320dfb..a43bdeb45 100644 --- a/extensions/default/src/utils/getDirectURL.js +++ b/extensions/default/src/utils/getDirectURL.js @@ -35,15 +35,10 @@ const getDirectURL = (config, params) => { value.DirectRetrieveURL = URL.createObjectURL(blob); return value.DirectRetrieveURL; } - if ( - !singlepart || - (singlepart !== true && singlepart.indexOf(fetchPart) === -1) - ) { + if (!singlepart || (singlepart !== true && singlepart.indexOf(fetchPart) === -1)) { if (value.retrieveBulkData) { return value.retrieveBulkData().then(arr => { - value.DirectRetrieveURL = URL.createObjectURL( - new Blob([arr], { type: defaultType }) - ); + value.DirectRetrieveURL = URL.createObjectURL(new Blob([arr], { type: defaultType })); return value.DirectRetrieveURL; }); } @@ -58,8 +53,7 @@ const getDirectURL = (config, params) => { const hasQuery = BulkDataURI.indexOf('?') !== -1; const hasAccept = BulkDataURI.indexOf('accept=') !== -1; const acceptUri = - BulkDataURI + - (hasAccept ? '' : (hasQuery ? '&' : '?') + `accept=${defaultType}`); + BulkDataURI + (hasAccept ? '' : (hasQuery ? '&' : '?') + `accept=${defaultType}`); if (tag === 'PixelData' || tag === 'EncapsulatedDocument') { return `${wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}/rendered`; diff --git a/extensions/default/src/utils/reuseCachedLayouts.ts b/extensions/default/src/utils/reuseCachedLayouts.ts index f84c24d3d..f6c2ed1f1 100644 --- a/extensions/default/src/utils/reuseCachedLayouts.ts +++ b/extensions/default/src/utils/reuseCachedLayouts.ts @@ -57,14 +57,13 @@ const reuseCachedLayout = ( continue; } if (viewportId === activeViewportId && i === 0) { - displaySetSelectorMap[ - `${activeStudyUID}:activeDisplaySet:0` - ] = displaySetUID; + displaySetSelectorMap[`${activeStudyUID}:activeDisplaySet:0`] = displaySetUID; } if (displaySetOptions[i]?.id) { displaySetSelectorMap[ - `${activeStudyUID}:${displaySetOptions[i].id}:${displaySetOptions[i] - .matchedDisplaySetsIndex || 0}` + `${activeStudyUID}:${displaySetOptions[i].id}:${ + displaySetOptions[i].matchedDisplaySetsIndex || 0 + }` ] = displaySetUID; } } diff --git a/extensions/default/src/utils/validations/areAllImageComponentsEqual.ts b/extensions/default/src/utils/validations/areAllImageComponentsEqual.ts index 69c7c76d4..97040fbff 100644 --- a/extensions/default/src/utils/validations/areAllImageComponentsEqual.ts +++ b/extensions/default/src/utils/validations/areAllImageComponentsEqual.ts @@ -5,9 +5,7 @@ import toNumber from '@ohif/core/src/utils/toNumber'; * @param {*} instances * @returns */ -export default function areAllImageComponentsEqual( - instances: Array -): boolean { +export default function areAllImageComponentsEqual(instances: Array): boolean { if (!instances?.length) { return false; } diff --git a/extensions/default/src/utils/validations/areAllImageDimensionsEqual.ts b/extensions/default/src/utils/validations/areAllImageDimensionsEqual.ts index b8fe7c179..93a350a89 100644 --- a/extensions/default/src/utils/validations/areAllImageDimensionsEqual.ts +++ b/extensions/default/src/utils/validations/areAllImageDimensionsEqual.ts @@ -5,9 +5,7 @@ import toNumber from '@ohif/core/src/utils/toNumber'; * @param {*} instances * @returns */ -export default function areAllImageDimensionsEqual( - instances: Array -): boolean { +export default function areAllImageDimensionsEqual(instances: Array): boolean { if (!instances?.length) { return false; } diff --git a/extensions/default/src/utils/validations/areAllImageOrientationsEqual.ts b/extensions/default/src/utils/validations/areAllImageOrientationsEqual.ts index 2e0af78a2..310bd8448 100644 --- a/extensions/default/src/utils/validations/areAllImageOrientationsEqual.ts +++ b/extensions/default/src/utils/validations/areAllImageOrientationsEqual.ts @@ -6,24 +6,18 @@ import { _isSameOrientation } from '@ohif/core/src/utils/isDisplaySetReconstruct * @param {*} instances * @returns */ -export default function areAllImageOrientationsEqual( - instances: Array -): boolean { +export default function areAllImageOrientationsEqual(instances: Array): boolean { if (!instances?.length) { return false; } const firstImage = instances[0]; - const firstImageOrientationPatient = toNumber( - firstImage.ImageOrientationPatient - ); + const firstImageOrientationPatient = toNumber(firstImage.ImageOrientationPatient); for (let i = 1; i < instances.length; i++) { const instance = instances[i]; const imageOrientationPatient = toNumber(instance.ImageOrientationPatient); - if ( - !_isSameOrientation(imageOrientationPatient, firstImageOrientationPatient) - ) { + if (!_isSameOrientation(imageOrientationPatient, firstImageOrientationPatient)) { return false; } } diff --git a/extensions/default/src/utils/validations/areAllImagePositionsEqual.ts b/extensions/default/src/utils/validations/areAllImagePositionsEqual.ts index 55df6cb5d..708986a08 100644 --- a/extensions/default/src/utils/validations/areAllImagePositionsEqual.ts +++ b/extensions/default/src/utils/validations/areAllImagePositionsEqual.ts @@ -25,10 +25,7 @@ function _checkSeriesPositionShift( scanAxisNormal, averageSpacingBetweenFrames ); - return ( - vec3.distance(actualPosition, predictedPosition) > - averageSpacingBetweenFrames - ); + return vec3.distance(actualPosition, predictedPosition) > averageSpacingBetweenFrames; } /** @@ -36,24 +33,17 @@ function _checkSeriesPositionShift( * @param {*} instances * @returns */ -export default function areAllImagePositionsEqual( - instances: Array -): boolean { +export default function areAllImagePositionsEqual(instances: Array): boolean { if (!instances?.length) { return false; } - const firstImageOrientationPatient = toNumber( - instances[0].ImageOrientationPatient - ); + const firstImageOrientationPatient = toNumber(instances[0].ImageOrientationPatient); const scanAxisNormal = calculateScanAxisNormal(firstImageOrientationPatient); const firstImagePositionPatient = toNumber(instances[0].ImagePositionPatient); - const lastIpp = toNumber( - instances[instances.length - 1].ImagePositionPatient - ); + const lastIpp = toNumber(instances[instances.length - 1].ImagePositionPatient); const averageSpacingBetweenFrames = - _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / - (instances.length - 1); + _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (instances.length - 1); let previousImagePositionPatient = firstImagePositionPatient; for (let i = 1; i < instances.length; i++) { diff --git a/extensions/default/src/utils/validations/areAllImageSpacingEqual.ts b/extensions/default/src/utils/validations/areAllImageSpacingEqual.ts index 254c258fe..ae95722c7 100644 --- a/extensions/default/src/utils/validations/areAllImageSpacingEqual.ts +++ b/extensions/default/src/utils/validations/areAllImageSpacingEqual.ts @@ -20,13 +20,10 @@ export default function areAllImageSpacingEqual( return; } const firstImagePositionPatient = toNumber(instances[0].ImagePositionPatient); - const lastIpp = toNumber( - instances[instances.length - 1].ImagePositionPatient - ); + const lastIpp = toNumber(instances[instances.length - 1].ImagePositionPatient); const averageSpacingBetweenFrames = - _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / - (instances.length - 1); + _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (instances.length - 1); let previousImagePositionPatient = firstImagePositionPatient; @@ -40,10 +37,7 @@ export default function areAllImageSpacingEqual( previousImagePositionPatient ); - const spacingIssue = _getSpacingIssue( - spacingBetweenFrames, - averageSpacingBetweenFrames - ); + const spacingIssue = _getSpacingIssue(spacingBetweenFrames, averageSpacingBetweenFrames); if (spacingIssue) { const issue = spacingIssue.issue; diff --git a/extensions/default/src/utils/validations/checkMultiframe.ts b/extensions/default/src/utils/validations/checkMultiframe.ts index 60c71b4a6..f4f4a2090 100644 --- a/extensions/default/src/utils/validations/checkMultiframe.ts +++ b/extensions/default/src/utils/validations/checkMultiframe.ts @@ -10,14 +10,9 @@ import { DisplaySetMessage, DisplaySetMessageList } from '@ohif/core'; * @param {*} multiFrameInstance * @param {*} warnings */ -export default function checkMultiFrame( - multiFrameInstance, - messages: DisplaySetMessageList -): void { +export default function checkMultiFrame(multiFrameInstance, messages: DisplaySetMessageList): void { if (!hasPixelMeasurements(multiFrameInstance)) { - messages.addMessage( - DisplaySetMessage.CODES.MULTIFRAME_NO_PIXEL_MEASUREMENTS - ); + messages.addMessage(DisplaySetMessage.CODES.MULTIFRAME_NO_PIXEL_MEASUREMENTS); } if (!hasOrientation(multiFrameInstance)) { @@ -25,8 +20,6 @@ export default function checkMultiFrame( } if (!hasPosition(multiFrameInstance)) { - messages.addMessage( - DisplaySetMessage.CODES.MULTIFRAME_NO_POSITION_INFORMATION - ); + messages.addMessage(DisplaySetMessage.CODES.MULTIFRAME_NO_POSITION_INFORMATION); } } diff --git a/extensions/default/src/utils/validations/checkSingleFrames.ts b/extensions/default/src/utils/validations/checkSingleFrames.ts index fe3f1e472..677d66f84 100644 --- a/extensions/default/src/utils/validations/checkSingleFrames.ts +++ b/extensions/default/src/utils/validations/checkSingleFrames.ts @@ -28,9 +28,7 @@ export default function checkSingleFrames( } if (!areAllImagePositionsEqual(instances)) { - messages.addMessage( - DisplaySetMessage.CODES.INCONSISTENT_POSITION_INFORMATION - ); + messages.addMessage(DisplaySetMessage.CODES.INCONSISTENT_POSITION_INFORMATION); } areAllImageSpacingEqual(instances, messages); } diff --git a/extensions/dicom-microscopy/.prettierrc b/extensions/dicom-microscopy/.prettierrc index b80ec6b34..914020ac7 100644 --- a/extensions/dicom-microscopy/.prettierrc +++ b/extensions/dicom-microscopy/.prettierrc @@ -1,8 +1,10 @@ { + "plugins": ["prettier-plugin-tailwindcss"], "trailingComma": "es5", - "printWidth": 80, + "printWidth": 100, "proseWrap": "always", "tabWidth": 2, "semi": true, - "singleQuote": true + "singleQuote": true, + "arrowParens": "avoid" } diff --git a/extensions/dicom-microscopy/.webpack/webpack.dev.js b/extensions/dicom-microscopy/.webpack/webpack.dev.js index 96d68096d..6aea859ca 100644 --- a/extensions/dicom-microscopy/.webpack/webpack.dev.js +++ b/extensions/dicom-microscopy/.webpack/webpack.dev.js @@ -7,7 +7,6 @@ const ENTRY = { app: `${SRC_DIR}/index.tsx`, }; - module.exports = (env, argv) => { return webpackCommon(env, argv, { SRC_DIR, DIST_DIR, ENTRY }); }; diff --git a/extensions/dicom-microscopy/babel.config.js b/extensions/dicom-microscopy/babel.config.js index 92fbbdeaf..a38ddda21 100644 --- a/extensions/dicom-microscopy/babel.config.js +++ b/extensions/dicom-microscopy/babel.config.js @@ -10,7 +10,7 @@ module.exports = { modules: 'commonjs', debug: false, }, - "@babel/preset-typescript", + '@babel/preset-typescript', ], '@babel/preset-react', ], @@ -26,7 +26,7 @@ module.exports = { // WebPack handles ES6 --> Target Syntax ['@babel/preset-env', { modules: false }], '@babel/preset-react', - "@babel/preset-typescript", + '@babel/preset-typescript', ], ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'], }, @@ -35,7 +35,7 @@ module.exports = { // WebPack handles ES6 --> Target Syntax ['@babel/preset-env', { modules: false }], '@babel/preset-react', - "@babel/preset-typescript", + '@babel/preset-typescript', ], plugins: ['react-hot-loader/babel'], ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'], diff --git a/extensions/dicom-microscopy/src/DicomMicroscopySRSopClassHandler.js b/extensions/dicom-microscopy/src/DicomMicroscopySRSopClassHandler.js index 9f5fb3979..5d05e5335 100644 --- a/extensions/dicom-microscopy/src/DicomMicroscopySRSopClassHandler.js +++ b/extensions/dicom-microscopy/src/DicomMicroscopySRSopClassHandler.js @@ -17,32 +17,21 @@ function _getReferencedFrameOfReferenceUID(naturalizedDataset) { const { ContentSequence } = naturalizedDataset; const imagingMeasurementsContentItem = ContentSequence.find( - ci => - ci.ConceptNameCodeSequence.CodeValue === - DCM_CODE_VALUES.IMAGING_MEASUREMENTS + ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGING_MEASUREMENTS ); const firstMeasurementGroupContentItem = toArray( imagingMeasurementsContentItem.ContentSequence - ).find( - ci => - ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.MEASUREMENT_GROUP - ); + ).find(ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.MEASUREMENT_GROUP); - const imageRegionContentItem = toArray( - firstMeasurementGroupContentItem.ContentSequence - ).find( + const imageRegionContentItem = toArray(firstMeasurementGroupContentItem.ContentSequence).find( ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGE_REGION ); return imageRegionContentItem.ReferencedFrameOfReferenceUID; } -function _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager -) { +function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { // If the series has no instances, stop here if (!instances || !instances.length) { throw new Error('No instances were provided'); @@ -58,9 +47,7 @@ function _getDisplaySetsFromSeries( instance.StudyInstanceUID, instance.SeriesInstanceUID ).instances[0]; - const ReferencedFrameOfReferenceUID = _getReferencedFrameOfReferenceUID( - naturalizedDataset - ); + const ReferencedFrameOfReferenceUID = _getReferencedFrameOfReferenceUID(naturalizedDataset); const { FrameOfReferenceUID, @@ -98,23 +85,19 @@ function _getDisplaySetsFromSeries( loadError: false, }; - displaySet.load = function(referencedDisplaySet) { - return loadSR(microscopyService, displaySet, referencedDisplaySet).catch( - error => { - displaySet.isLoaded = false; - displaySet.loadError = true; - throw new Error(error); - } - ); + displaySet.load = function (referencedDisplaySet) { + return loadSR(microscopyService, displaySet, referencedDisplaySet).catch(error => { + displaySet.isLoaded = false; + displaySet.loadError = true; + throw new Error(error); + }); }; - displaySet.getSourceDisplaySet = function() { + displaySet.getSourceDisplaySet = function () { let allDisplaySets = []; const studyMetadata = DicomMetadataStore.getStudy(StudyInstanceUID); studyMetadata.series.forEach(series => { - const displaySets = displaySetService.getDisplaySetsForSeries( - series.SeriesInstanceUID - ); + const displaySets = displaySetService.getDisplaySetsForSeries(series.SeriesInstanceUID); allDisplaySets = allDisplaySets.concat(displaySets); }); return getSourceDisplaySet(allDisplaySets, displaySet); @@ -123,16 +106,9 @@ function _getDisplaySetsFromSeries( return [displaySet]; } -export default function getDicomMicroscopySRSopClassHandler({ - servicesManager, - extensionManager, -}) { +export default function getDicomMicroscopySRSopClassHandler({ servicesManager, extensionManager }) { const getDisplaySetsFromSeries = instances => { - return _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager - ); + return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager); }; return { diff --git a/extensions/dicom-microscopy/src/DicomMicroscopySopClassHandler.js b/extensions/dicom-microscopy/src/DicomMicroscopySopClassHandler.js index d7c6af93e..36e33fda3 100644 --- a/extensions/dicom-microscopy/src/DicomMicroscopySopClassHandler.js +++ b/extensions/dicom-microscopy/src/DicomMicroscopySopClassHandler.js @@ -9,11 +9,7 @@ const SOP_CLASS_UIDS = { const SOPClassHandlerId = '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler'; -function _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager -) { +function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { // If the series has no instances, stop here if (!instances || !instances.length) { throw new Error('No instances were provided'); @@ -112,16 +108,9 @@ function _getDisplaySetsFromSeries( return [displaySet]; } -export default function getDicomMicroscopySopClassHandler({ - servicesManager, - extensionManager, -}) { +export default function getDicomMicroscopySopClassHandler({ servicesManager, extensionManager }) { const getDisplaySetsFromSeries = instances => { - return _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager - ); + return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager); }; return { diff --git a/extensions/dicom-microscopy/src/DicomMicroscopyViewport.css b/extensions/dicom-microscopy/src/DicomMicroscopyViewport.css index db3ee2455..9ab38920d 100644 --- a/extensions/dicom-microscopy/src/DicomMicroscopyViewport.css +++ b/extensions/dicom-microscopy/src/DicomMicroscopyViewport.css @@ -62,7 +62,8 @@ font-size: 10px; z-index: 11; color: var(--ol-foreground-color); - text-shadow: -1.5px 0 var(--ol-partial-background-color), + text-shadow: + -1.5px 0 var(--ol-partial-background-color), 0 1.5px var(--ol-partial-background-color), 1.5px 0 var(--ol-partial-background-color), 0 -1.5px var(--ol-partial-background-color); @@ -74,7 +75,8 @@ text-align: center; bottom: 25px; color: var(--ol-foreground-color); - text-shadow: -1.5px 0 var(--ol-partial-background-color), + text-shadow: + -1.5px 0 var(--ol-partial-background-color), 0 1.5px var(--ol-partial-background-color), 1.5px 0 var(--ol-partial-background-color), 0 -1.5px var(--ol-partial-background-color); @@ -147,13 +149,17 @@ .DicomMicroscopyViewer .ol-rotate { top: 0.5em; right: 0.5em; - transition: opacity 0.25s linear, visibility 0s linear; + transition: + opacity 0.25s linear, + visibility 0s linear; } .DicomMicroscopyViewer .ol-rotate.ol-hidden { opacity: 0; visibility: hidden; - transition: opacity 0.25s linear, visibility 0s linear 0.25s; + transition: + opacity 0.25s linear, + visibility 0s linear 0.25s; } .DicomMicroscopyViewer .ol-zoom-extent { diff --git a/extensions/dicom-microscopy/src/DicomMicroscopyViewport.tsx b/extensions/dicom-microscopy/src/DicomMicroscopyViewport.tsx index 3be440040..39b487358 100644 --- a/extensions/dicom-microscopy/src/DicomMicroscopyViewport.tsx +++ b/extensions/dicom-microscopy/src/DicomMicroscopyViewport.tsx @@ -103,10 +103,7 @@ class DicomMicroscopyViewport extends Component { // you should only do this once. async installOpenLayersRenderer(container, displaySet) { const loadViewer = async metadata => { - const { - viewer: DicomMicroscopyViewer, - metadata: metadataUtils, - } = await import( + const { viewer: DicomMicroscopyViewer, metadata: metadataUtils } = await import( /* webpackChunkName: "dicom-microscopy-viewer" */ 'dicom-microscopy-viewer' ); const microscopyViewer = DicomMicroscopyViewer.VolumeImageViewer; @@ -163,10 +160,7 @@ class DicomMicroscopyViewport extends Component { metadata.forEach(m => { // NOTE: depending on different data source, image.ImageType sometimes // is a string, not a string array. - m.ImageType = - typeof m.ImageType === 'string' - ? m.ImageType.split('\\') - : m.ImageType; + m.ImageType = typeof m.ImageType === 'string' ? m.ImageType.split('\\') : m.ImageType; const inst = cleanDenaturalizedDataset( dcmjs.data.DicomMetaDictionary.denaturalizeDataset(m), @@ -211,11 +205,7 @@ class DicomMicroscopyViewport extends Component { this.viewer = new microscopyViewer(options); - if ( - this.overlayElement && - this.overlayElement.current && - this.viewer.addViewportOverlay - ) { + if (this.overlayElement && this.overlayElement.current && this.viewer.addViewportOverlay) { this.viewer.addViewportOverlay({ element: this.overlayElement.current, coordinates: [0, 0], // TODO: dicom-microscopy-viewer documentation says this can be false to be automatically, but it is not. @@ -263,22 +253,13 @@ class DicomMicroscopyViewport extends Component { const { viewportId } = viewportOptions; // Todo-rename: this is always getting the 0 const displaySet = displaySets[0]; - this.installOpenLayersRenderer(this.container.current, displaySet).then( - () => { - this.setState({ isLoaded: true }); - } - ); + this.installOpenLayersRenderer(this.container.current, displaySet).then(() => { + this.setState({ isLoaded: true }); + }); } - componentDidUpdate( - prevProps: Readonly<{}>, - prevState: Readonly<{}>, - snapshot?: any - ): void { - if ( - this.managedViewer && - prevProps.displaySets !== this.props.displaySets - ) { + componentDidUpdate(prevProps: Readonly<{}>, prevState: Readonly<{}>, snapshot?: any): void { + if (this.managedViewer && prevProps.displaySets !== this.props.displaySets) { const { displaySets } = this.props; const displaySet = displaySets[0]; @@ -317,9 +298,7 @@ class DicomMicroscopyViewport extends Component { >
-
+
{displaySet && firstInstance.imageId && (
{ReactResizeDetector && ( - + )} {this.state.error ? (

{JSON.stringify(this.state.error)}

@@ -343,7 +318,7 @@ class DicomMicroscopyViewport extends Component {
)} {this.state.isLoaded ? null : ( - + )}
); diff --git a/extensions/dicom-microscopy/src/components/MicroscopyPanel/MicroscopyPanel.tsx b/extensions/dicom-microscopy/src/components/MicroscopyPanel/MicroscopyPanel.tsx index 96dc158e0..51ed6c699 100644 --- a/extensions/dicom-microscopy/src/components/MicroscopyPanel/MicroscopyPanel.tsx +++ b/extensions/dicom-microscopy/src/components/MicroscopyPanel/MicroscopyPanel.tsx @@ -1,11 +1,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; -import { - ServicesManager, - ExtensionManager, - CommandsManager, - DicomMetadataStore, -} from '@ohif/core'; +import { ServicesManager, ExtensionManager, CommandsManager, DicomMetadataStore } from '@ohif/core'; import { MeasurementTable, Icon, ButtonGroup, Button } from '@ohif/ui'; import { withTranslation, WithTranslation } from 'react-i18next'; import { EVENTS as MicroscopyEvents } from '../../services/MicroscopyService'; @@ -73,9 +68,7 @@ interface IMicroscopyPanelProps extends WithTranslation { function MicroscopyPanel(props: IMicroscopyPanelProps) { const { microscopyService } = props.servicesManager.services; - const [studyInstanceUID, setStudyInstanceUID] = useState( - null as string | null - ); + const [studyInstanceUID, setStudyInstanceUID] = useState(null as string | null); const [roiAnnotations, setRoiAnnotations] = useState([] as any[]); const [selectedAnnotation, setSelectedAnnotation] = useState(null as any); const { servicesManager, extensionManager } = props; @@ -85,9 +78,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { useEffect(() => { const viewport = props.viewports[props.activeViewportId]; if (viewport.displaySetInstanceUIDs[0]) { - const displaySet = displaySetService.getDisplaySetByUID( - viewport.displaySetInstanceUIDs[0] - ); + const displaySet = displaySetService.getDisplaySetByUID(viewport.displaySetInstanceUIDs[0]); if (displaySet) { setStudyInstanceUID(displaySet.StudyInstanceUID); } @@ -96,9 +87,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { useEffect(() => { const onAnnotationUpdated = () => { - const roiAnnotations = microscopyService.getAnnotationsForStudy( - studyInstanceUID - ); + const roiAnnotations = microscopyService.getAnnotationsForStudy(studyInstanceUID); setRoiAnnotations(roiAnnotations); }; @@ -111,21 +100,15 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { onAnnotationUpdated(); }; - const { - unsubscribe: unsubscribeAnnotationUpdated, - } = microscopyService.subscribe( + const { unsubscribe: unsubscribeAnnotationUpdated } = microscopyService.subscribe( MicroscopyEvents.ANNOTATION_UPDATED, onAnnotationUpdated ); - const { - unsubscribe: unsubscribeAnnotationSelected, - } = microscopyService.subscribe( + const { unsubscribe: unsubscribeAnnotationSelected } = microscopyService.subscribe( MicroscopyEvents.ANNOTATION_SELECTED, onAnnotationSelected ); - const { - unsubscribe: unsubscribeAnnotationRemoved, - } = microscopyService.subscribe( + const { unsubscribe: unsubscribeAnnotationRemoved } = microscopyService.subscribe( MicroscopyEvents.ANNOTATION_REMOVED, onAnnotationRemoved ); @@ -147,9 +130,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { * @returns */ const promptSave = () => { - const annotations = microscopyService.getAnnotationsForStudy( - studyInstanceUID - ); + const annotations = microscopyService.getAnnotationsForStudy(studyInstanceUID); if (!annotations || saving) { return; @@ -172,9 +153,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { const getAllDisplaySets = (studyMetadata: any) => { let allDisplaySets = [] as any[]; studyMetadata.series.forEach((series: any) => { - const displaySets = displaySetService.getDisplaySetsForSeries( - series.SeriesInstanceUID - ); + const displaySets = displaySetService.getDisplaySetsForSeries(series.SeriesInstanceUID); allDisplaySets = allDisplaySets.concat(displaySets); }); return allDisplaySets; @@ -189,9 +168,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { const saveFunction = async (SeriesDescription: string) => { const dataSource = extensionManager.getActiveDataSource()[0]; const { onSaveComplete } = props; - const annotations = microscopyService.getAnnotationsForStudy( - studyInstanceUID - ); + const annotations = microscopyService.getAnnotationsForStudy(studyInstanceUID); saving = true; @@ -206,10 +183,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { // Get the next available series number after 4700. const dsWithMetadata = displaySets.filter( - ds => - ds.metadata && - ds.metadata.SeriesNumber && - typeof ds.metadata.SeriesNumber === 'number' + ds => ds.metadata && ds.metadata.SeriesNumber && typeof ds.metadata.SeriesNumber === 'number' ); // Generate next series number @@ -220,11 +194,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { const { instance: metadata } = smDisplaySet; // construct SR dataset - const dataset = constructSR( - metadata, - { SeriesDescription, SeriesNumber }, - annotations - ); + const dataset = constructSR(metadata, { SeriesDescription, SeriesNumber }, annotations); // Save in DICOM format try { @@ -271,13 +241,11 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { // TODO: studies? const study = DicomMetadataStore.getStudy(StudyInstanceUID); - const lastDerivedDisplaySet = study.derivedDisplaySets.sort( - (ds1: any, ds2: any) => { - const dateTime1 = Number(`${ds1.SeriesDate}${ds1.SeriesTime}`); - const dateTime2 = Number(`${ds2.SeriesDate}${ds2.SeriesTime}`); - return dateTime1 > dateTime2; - } - )[study.derivedDisplaySets.length - 1]; + const lastDerivedDisplaySet = study.derivedDisplaySets.sort((ds1: any, ds2: any) => { + const dateTime1 = Number(`${ds1.SeriesDate}${ds1.SeriesTime}`); + const dateTime2 = Number(`${ds2.SeriesDate}${ds2.SeriesTime}`); + return dateTime1 > dateTime2; + })[study.derivedDisplaySets.length - 1]; // TODO: use dataSource.reject.dicom() // await DICOMSR.rejectMeasurements( @@ -314,13 +282,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { * Handler for "Edit" action of an annotation item * @param param0 */ - const onMeasurementItemEditHandler = ({ - uid, - isActive, - }: { - uid: string; - isActive: boolean; - }) => { + const onMeasurementItemEditHandler = ({ uid, isActive }: { uid: string; isActive: boolean }) => { props.commandsManager.runCommand('setLabel', { uid }, 'MICROSCOPY'); }; @@ -344,10 +306,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { } else if (length !== undefined) { displayText.push( shortAxisLength - ? `${formatLength(length, 'μm')} x ${formatLength( - shortAxisLength, - 'μm' - )}` + ? `${formatLength(length, 'μm')} x ${formatLength(shortAxisLength, 'μm')}` : `${formatLength(length, 'μm')}` ); } @@ -368,7 +327,7 @@ function MicroscopyPanel(props: IMicroscopyPanelProps) { return ( <>
{ return (props: any) => { const topLeftClass = 'top-viewport left-viewport text-primary-light'; - const topRightClass = - 'top-viewport right-viewport-scrollbar text-primary-light'; - const bottomRightClass = - 'bottom-viewport right-viewport-scrollbar text-primary-light'; + const topRightClass = 'top-viewport right-viewport-scrollbar text-primary-light'; + const bottomRightClass = 'bottom-viewport right-viewport-scrollbar text-primary-light'; const bottomLeftClass = 'bottom-viewport left-viewport text-primary-light'; const overlay = 'absolute pointer-events-none microscopy-viewport-overlay'; return ( <> {topLeft && topLeft.length > 0 && ( -
+
{listComponentGenerator({ ...props, list: topLeft, itemGenerator })}
)} diff --git a/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts b/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts index 81f56ad05..8a467ed2b 100644 --- a/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts +++ b/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts @@ -81,20 +81,13 @@ export function formatPN(name) { * @returns {string} comrpession type. */ export function getCompression(imageId) { - const generalImageModule = - cornerstone.metaData.get('generalImageModule', imageId) || {}; - const { - lossyImageCompression, - lossyImageCompressionRatio, - lossyImageCompressionMethod, - } = generalImageModule; + const generalImageModule = cornerstone.metaData.get('generalImageModule', imageId) || {}; + const { lossyImageCompression, lossyImageCompressionRatio, lossyImageCompressionMethod } = + generalImageModule; if (lossyImageCompression === '01' && lossyImageCompressionRatio !== '') { const compressionMethod = lossyImageCompressionMethod || 'Lossy: '; - const compressionRatio = formatNumberPrecision( - lossyImageCompressionRatio, - 2 - ); + const compressionRatio = formatNumberPrecision(lossyImageCompressionRatio, 2); return compressionMethod + compressionRatio + ' : 1'; } diff --git a/extensions/dicom-microscopy/src/getCommandsModule.ts b/extensions/dicom-microscopy/src/getCommandsModule.ts index cc2133102..756c4fd5c 100644 --- a/extensions/dicom-microscopy/src/getCommandsModule.ts +++ b/extensions/dicom-microscopy/src/getCommandsModule.ts @@ -11,11 +11,7 @@ export default function getCommandsModule({ commandsManager: CommandsManager; extensionManager: ExtensionManager; }) { - const { - viewportGridService, - uiDialogService, - microscopyService, - } = servicesManager.services; + const { viewportGridService, uiDialogService, microscopyService } = servicesManager.services; const actions = { // Measurement tool commands: @@ -63,15 +59,9 @@ export default function getCommandsModule({ }, ]; if ( - [ - 'line', - 'box', - 'circle', - 'point', - 'polygon', - 'freehandpolygon', - 'freehandline', - ].indexOf(toolName) >= 0 + ['line', 'box', 'circle', 'point', 'polygon', 'freehandpolygon', 'freehandline'].indexOf( + toolName + ) >= 0 ) { // TODO: read from configuration const options = { @@ -124,9 +114,7 @@ export default function getCommandsModule({ }, toggleOverlays: () => { // overlay - const overlays = document.getElementsByClassName( - 'microscopy-viewport-overlay' - ); + const overlays = document.getElementsByClassName('microscopy-viewport-overlay'); let onoff = false; // true if this will toggle on for (let i = 0; i < overlays.length; i++) { if (i === 0) { diff --git a/extensions/dicom-microscopy/src/index.tsx b/extensions/dicom-microscopy/src/index.tsx index 98406fe52..a4589ed2d 100644 --- a/extensions/dicom-microscopy/src/index.tsx +++ b/extensions/dicom-microscopy/src/index.tsx @@ -30,15 +30,8 @@ export default { */ id, - async preRegistration({ - servicesManager, - commandsManager, - configuration = {}, - appConfig, - }) { - servicesManager.registerService( - MicroscopyService.REGISTRATION(servicesManager) - ); + async preRegistration({ servicesManager, commandsManager, configuration = {}, appConfig }) { + servicesManager.registerService(MicroscopyService.REGISTRATION(servicesManager)); }, /** @@ -94,11 +87,7 @@ export default { * Each sop class handler is defined by a { name, sopClassUids, getDisplaySetsFromSeries}. * Examples include the default sop class handler provided by the default extension */ - getSopClassHandlerModule({ - servicesManager, - commandsManager, - extensionManager, - }) { + getSopClassHandlerModule({ servicesManager, commandsManager, extensionManager }) { return [ getDicomMicroscopySopClassHandler({ servicesManager, diff --git a/extensions/dicom-microscopy/src/services/MicroscopyService.ts b/extensions/dicom-microscopy/src/services/MicroscopyService.ts index 74d3d84a6..cc761f304 100644 --- a/extensions/dicom-microscopy/src/services/MicroscopyService.ts +++ b/extensions/dicom-microscopy/src/services/MicroscopyService.ts @@ -1,7 +1,5 @@ import ViewerManager, { EVENTS as ViewerEvents } from '../tools/viewerManager'; -import RoiAnnotation, { - EVENTS as AnnotationEvents, -} from '../utils/RoiAnnotation'; +import RoiAnnotation, { EVENTS as AnnotationEvents } from '../utils/RoiAnnotation'; import styles from '../utils/styles'; import { DicomMetadataStore, PubSubService } from '@ohif/core'; @@ -158,10 +156,7 @@ export default class MicroscopyService extends PubSubService { _onRoiUpdated(data) { const { roiGraphic, managedViewer } = data; this.synchronizeViewers(managedViewer); - this._broadcastEvent( - EVENTS.ANNOTATION_UPDATED, - this.getAnnotation(roiGraphic.uid) - ); + this._broadcastEvent(EVENTS.ANNOTATION_UPDATED, this.getAnnotation(roiGraphic.uid)); } /** @@ -175,10 +170,7 @@ export default class MicroscopyService extends PubSubService { _onRoiSelected(data) { const { roiGraphic } = data; const selectedAnnotation = this.getAnnotation(roiGraphic.uid); - if ( - selectedAnnotation && - selectedAnnotation !== this.getSelectedAnnotation() - ) { + if (selectedAnnotation && selectedAnnotation !== this.getSelectedAnnotation()) { if (this.selectedAnnotation) { this.clearSelection(); } @@ -221,16 +213,11 @@ export default class MicroscopyService extends PubSubService { * @param {ViewerManager} managedViewer The viewer being removed */ _removeManagedViewerSubscriptions(managedViewer) { - managedViewer._roiAddedSubscription && - managedViewer._roiAddedSubscription.unsubscribe(); - managedViewer._roiModifiedSubscription && - managedViewer._roiModifiedSubscription.unsubscribe(); - managedViewer._roiRemovedSubscription && - managedViewer._roiRemovedSubscription.unsubscribe(); - managedViewer._roiUpdatedSubscription && - managedViewer._roiUpdatedSubscription.unsubscribe(); - managedViewer._roiSelectedSubscription && - managedViewer._roiSelectedSubscription.unsubscribe(); + managedViewer._roiAddedSubscription && managedViewer._roiAddedSubscription.unsubscribe(); + managedViewer._roiModifiedSubscription && managedViewer._roiModifiedSubscription.unsubscribe(); + managedViewer._roiRemovedSubscription && managedViewer._roiRemovedSubscription.unsubscribe(); + managedViewer._roiUpdatedSubscription && managedViewer._roiUpdatedSubscription.unsubscribe(); + managedViewer._roiSelectedSubscription && managedViewer._roiSelectedSubscription.unsubscribe(); managedViewer._roiAddedSubscription = null; managedViewer._roiModifiedSubscription = null; @@ -264,8 +251,7 @@ export default class MicroscopyService extends PubSubService { * @returns {Array} The managed viewers for the given series UID */ getManagedViewersForStudy(studyInstanceUID) { - const filter = managedViewer => - managedViewer.studyInstanceUID === studyInstanceUID; + const filter = managedViewer => managedViewer.studyInstanceUID === studyInstanceUID; return Array.from(this.managedViewers).filter(filter); } @@ -276,10 +262,7 @@ export default class MicroscopyService extends PubSubService { */ _restoreAnnotations(managedViewer) { const { studyInstanceUID, seriesInstanceUID } = managedViewer; - const annotations = this.getAnnotationsForSeries( - studyInstanceUID, - seriesInstanceUID - ); + const annotations = this.getAnnotationsForSeries(studyInstanceUID, seriesInstanceUID); annotations.forEach(roiAnnotation => { managedViewer.addRoiGraphic(roiAnnotation.roiGraphic); }); @@ -301,13 +284,7 @@ export default class MicroscopyService extends PubSubService { * * @returns {ViewerManager} managed viewer */ - addViewer( - viewer, - viewportId, - container, - studyInstanceUID, - seriesInstanceUID - ) { + addViewer(viewer, viewportId, container, studyInstanceUID, seriesInstanceUID) { const managedViewer = new ViewerManager( viewer, viewportId, @@ -507,9 +484,7 @@ export default class MicroscopyService extends PubSubService { */ toggleOverviewMap(viewportId) { const managedViewers = Array.from(this.managedViewers); - const managedViewer = managedViewers.find( - mv => mv.viewportId === viewportId - ); + const managedViewer = managedViewers.find(mv => mv.viewportId === viewportId); if (managedViewer) { managedViewer.toggleOverviewMap(); } @@ -529,9 +504,7 @@ export default class MicroscopyService extends PubSubService { const managedViewers = Array.from(this.managedViewers).filter(filter); - managedViewers.forEach(managedViewer => - managedViewer.removeRoiGraphic(uid) - ); + managedViewers.forEach(managedViewer => managedViewer.removeRoiGraphic(uid)); if (this.annotations[uid]) { this.roiUids.delete(uid); @@ -570,34 +543,24 @@ export default class MicroscopyService extends PubSubService { */ synchronizeViewers(baseManagedViewer) { const { studyInstanceUID, seriesInstanceUID } = baseManagedViewer; - const managedViewers = this._getManagedViewersForSeries( - studyInstanceUID, - seriesInstanceUID - ); + const managedViewers = this._getManagedViewersForSeries(studyInstanceUID, seriesInstanceUID); // Prevent infinite loops arrising from updates. - managedViewers.forEach(managedViewer => - this._removeManagedViewerSubscriptions(managedViewer) - ); + managedViewers.forEach(managedViewer => this._removeManagedViewerSubscriptions(managedViewer)); managedViewers.forEach(managedViewer => { if (managedViewer === baseManagedViewer) { return; } - const annotations = this.getAnnotationsForSeries( - studyInstanceUID, - seriesInstanceUID - ); + const annotations = this.getAnnotationsForSeries(studyInstanceUID, seriesInstanceUID); managedViewer.clearRoiGraphics(); annotations.forEach(roiAnnotation => { managedViewer.addRoiGraphic(roiAnnotation.roiGraphic); }); }); - managedViewers.forEach(managedViewer => - this._addManagedViewerSubscriptions(managedViewer) - ); + managedViewers.forEach(managedViewer => this._addManagedViewerSubscriptions(managedViewer)); } /** diff --git a/extensions/dicom-microscopy/src/tools/viewerManager.js b/extensions/dicom-microscopy/src/tools/viewerManager.js index 2777affcf..6e9a11834 100644 --- a/extensions/dicom-microscopy/src/tools/viewerManager.js +++ b/extensions/dicom-microscopy/src/tools/viewerManager.js @@ -46,13 +46,7 @@ const EVENTS = { * expose only the features/behaviors that are relevant to the application */ class ViewerManager extends PubSubService { - constructor( - viewer, - viewportId, - container, - studyInstanceUID, - seriesInstanceUID - ) { + constructor(viewer, viewportId, container, studyInstanceUID, seriesInstanceUID) { super(EVENTS); this.viewer = viewer; this.viewportId = viewportId; @@ -119,18 +113,9 @@ class ViewerManager extends PubSubService { */ unregisterEvents() { this.container.removeEventListener(ApiEvents.ROI_ADDED, this.onRoiAdded); - this.container.removeEventListener( - ApiEvents.ROI_MODIFIED, - this.onRoiModified - ); - this.container.removeEventListener( - ApiEvents.ROI_REMOVED, - this.onRoiRemoved - ); - this.container.removeEventListener( - ApiEvents.ROI_SELECTED, - this.onRoiSelected - ); + this.container.removeEventListener(ApiEvents.ROI_MODIFIED, this.onRoiModified); + this.container.removeEventListener(ApiEvents.ROI_REMOVED, this.onRoiRemoved); + this.container.removeEventListener(ApiEvents.ROI_SELECTED, this.onRoiSelected); } /** @@ -327,26 +312,16 @@ class ViewerManager extends PubSubService { */ activateInteractions(interactions) { const interactionsMap = { - draw: activate => - activate ? 'activateDrawInteraction' : 'deactivateDrawInteraction', - modify: activate => - activate ? 'activateModifyInteraction' : 'deactivateModifyInteraction', + draw: activate => (activate ? 'activateDrawInteraction' : 'deactivateDrawInteraction'), + modify: activate => (activate ? 'activateModifyInteraction' : 'deactivateModifyInteraction'), translate: activate => - activate - ? 'activateTranslateInteraction' - : 'deactivateTranslateInteraction', - snap: activate => - activate ? 'activateSnapInteraction' : 'deactivateSnapInteraction', + activate ? 'activateTranslateInteraction' : 'deactivateTranslateInteraction', + snap: activate => (activate ? 'activateSnapInteraction' : 'deactivateSnapInteraction'), dragPan: activate => - activate - ? 'activateDragPanInteraction' - : 'deactivateDragPanInteraction', + activate ? 'activateDragPanInteraction' : 'deactivateDragPanInteraction', dragZoom: activate => - activate - ? 'activateDragZoomInteraction' - : 'deactivateDragZoomInteraction', - select: activate => - activate ? 'activateSelectInteraction' : 'deactivateSelectInteraction', + activate ? 'activateDragZoomInteraction' : 'deactivateDragZoomInteraction', + select: activate => (activate ? 'activateSelectInteraction' : 'deactivateSelectInteraction'), }; const availableInteractionsName = Object.keys(interactionsMap); @@ -355,9 +330,7 @@ class ViewerManager extends PubSubService { interaction => interaction[0] === availableInteractionName ); if (!interaction) { - const deactivateInteractionMethod = interactionsMap[ - availableInteractionName - ](false); + const deactivateInteractionMethod = interactionsMap[availableInteractionName](false); this.viewer[deactivateInteractionMethod](); } else { const [name, config] = interaction; diff --git a/extensions/dicom-microscopy/src/utils/RoiAnnotation.js b/extensions/dicom-microscopy/src/utils/RoiAnnotation.js index e8ca04021..879f18b6d 100644 --- a/extensions/dicom-microscopy/src/utils/RoiAnnotation.js +++ b/extensions/dicom-microscopy/src/utils/RoiAnnotation.js @@ -13,13 +13,7 @@ const EVENTS = { * Represents a single annotation for the Microscopy Viewer */ class RoiAnnotation extends PubSubService { - constructor( - roiGraphic, - studyInstanceUID, - seriesInstanceUID, - label = '', - viewState = null - ) { + constructor(roiGraphic, studyInstanceUID, seriesInstanceUID, label = '', viewState = null) { super(EVENTS); this.uid = roiGraphic.uid; this.roiGraphic = roiGraphic; @@ -34,9 +28,7 @@ class RoiAnnotation extends PubSubService { const roiGraphic = this.roiGraphic; const roiGraphicSymbols = Object.getOwnPropertySymbols(roiGraphic); - const _scoord3d = roiGraphicSymbols.find( - s => String(s) === 'Symbol(scoord3d)' - ); + const _scoord3d = roiGraphicSymbols.find(s => String(s) === 'Symbol(scoord3d)'); return roiGraphic[_scoord3d]; } @@ -45,9 +37,7 @@ class RoiAnnotation extends PubSubService { const scoord3d = this.getScoord3d(); const scoord3dSymbols = Object.getOwnPropertySymbols(scoord3d); - const _coordinates = scoord3dSymbols.find( - s => String(s) === 'Symbol(coordinates)' - ); + const _coordinates = scoord3dSymbols.find(s => String(s) === 'Symbol(coordinates)'); const coordinates = scoord3d[_coordinates]; return coordinates; diff --git a/extensions/dicom-microscopy/src/utils/areaOfPolygon.js b/extensions/dicom-microscopy/src/utils/areaOfPolygon.js index 91a68c9ae..ea07684fe 100644 --- a/extensions/dicom-microscopy/src/utils/areaOfPolygon.js +++ b/extensions/dicom-microscopy/src/utils/areaOfPolygon.js @@ -5,9 +5,7 @@ export default function areaOfPolygon(coordinates) { let j = n - 1; for (let i = 0; i < n; i++) { - area += - (coordinates[j][0] + coordinates[i][0]) * - (coordinates[j][1] - coordinates[i][1]); + area += (coordinates[j][0] + coordinates[i][0]) * (coordinates[j][1] - coordinates[i][1]); j = i; // j is previous vertex to i } diff --git a/extensions/dicom-microscopy/src/utils/callInputDialog.tsx b/extensions/dicom-microscopy/src/utils/callInputDialog.tsx index 5a746b7bd..d36d83657 100644 --- a/extensions/dicom-microscopy/src/utils/callInputDialog.tsx +++ b/extensions/dicom-microscopy/src/utils/callInputDialog.tsx @@ -53,7 +53,7 @@ export default function callInputDialog({ label="Enter your annotation" labelClassName="text-white text-[14px] leading-[1.2]" autoFocus - className="bg-black border-primary-main" + className="border-primary-main bg-black" type="text" value={value.defaultValue} onChange={event => { diff --git a/extensions/dicom-microscopy/src/utils/cleanDenaturalizedDataset.ts b/extensions/dicom-microscopy/src/utils/cleanDenaturalizedDataset.ts index 43abcaf22..93acfb143 100644 --- a/extensions/dicom-microscopy/src/utils/cleanDenaturalizedDataset.ts +++ b/extensions/dicom-microscopy/src/utils/cleanDenaturalizedDataset.ts @@ -35,9 +35,7 @@ export default function cleanDenaturalizedDataset( } ): any { if (Array.isArray(obj)) { - const newAry = obj.map(o => - isPrimitive(o) ? o : cleanDenaturalizedDataset(o, options) - ); + const newAry = obj.map(o => (isPrimitive(o) ? o : cleanDenaturalizedDataset(o, options))); return newAry; } else if (isPrimitive(obj)) { return obj; @@ -47,31 +45,19 @@ export default function cleanDenaturalizedDataset( delete obj[key].Value; } else if (Array.isArray(obj[key].Value) && obj[key].vr) { if (obj[key].Value.length === 1 && obj[key].Value[0].BulkDataURI) { - dicomWebUtils.fixBulkDataURI( - obj[key].Value[0], - options, - options.dataSourceConfig - ); + dicomWebUtils.fixBulkDataURI(obj[key].Value[0], options, options.dataSourceConfig); obj[key].BulkDataURI = obj[key].Value[0].BulkDataURI; // prevent mixed-content blockage - if ( - window.location.protocol === 'https:' && - obj[key].BulkDataURI.startsWith('http:') - ) { - obj[key].BulkDataURI = obj[key].BulkDataURI.replace( - 'http:', - 'https:' - ); + if (window.location.protocol === 'https:' && obj[key].BulkDataURI.startsWith('http:')) { + obj[key].BulkDataURI = obj[key].BulkDataURI.replace('http:', 'https:'); } delete obj[key].Value; } else if (vrNumerics.includes(obj[key].vr)) { obj[key].Value = obj[key].Value.map(v => +v); } else { - obj[key].Value = obj[key].Value.map(entry => - cleanDenaturalizedDataset(entry, options) - ); + obj[key].Value = obj[key].Value.map(entry => cleanDenaturalizedDataset(entry, options)); } } }); diff --git a/extensions/dicom-microscopy/src/utils/constructSR.ts b/extensions/dicom-microscopy/src/utils/constructSR.ts index 604bc6c6b..340e66d1e 100644 --- a/extensions/dicom-microscopy/src/utils/constructSR.ts +++ b/extensions/dicom-microscopy/src/utils/constructSR.ts @@ -9,11 +9,7 @@ import DEVICE_OBSERVER_UID from './DEVICE_OBSERVER_UID'; * * @return Comprehensive3DSR dataset */ -export default function constructSR( - metadata, - { SeriesDescription, SeriesNumber }, - annotations -) { +export default function constructSR(metadata, { SeriesDescription, SeriesNumber }, annotations) { // Handle malformed data if (!metadata.SpecimenDescriptionSequence) { metadata.SpecimenDescriptionSequence = { @@ -31,11 +27,9 @@ export default function constructSR( schemeDesignator: 'DCM', meaning: 'Person', }), - observerIdentifyingAttributes: new dcmjs.sr.templates.PersonObserverIdentifyingAttributes( - { - name: '@ohif/extension-dicom-microscopy', - } - ), + observerIdentifyingAttributes: new dcmjs.sr.templates.PersonObserverIdentifyingAttributes({ + name: '@ohif/extension-dicom-microscopy', + }), }), observerDeviceContext: new dcmjs.sr.templates.ObserverContext({ observerType: new dcmjs.sr.coding.CodedConcept({ @@ -43,11 +37,9 @@ export default function constructSR( schemeDesignator: 'DCM', meaning: 'Device', }), - observerIdentifyingAttributes: new dcmjs.sr.templates.DeviceObserverIdentifyingAttributes( - { - uid: DEVICE_OBSERVER_UID, - } - ), + observerIdentifyingAttributes: new dcmjs.sr.templates.DeviceObserverIdentifyingAttributes({ + uid: DEVICE_OBSERVER_UID, + }), }), subjectContext: new dcmjs.sr.templates.SubjectContext({ subjectClass: new dcmjs.sr.coding.CodedConcept({ @@ -55,28 +47,18 @@ export default function constructSR( schemeDesignator: 'DCM', meaning: 'Specimen', }), - subjectClassSpecificContext: new dcmjs.sr.templates.SubjectContextSpecimen( - { - uid: SpecimenDescriptionSequence.SpecimenUID, - identifier: - SpecimenDescriptionSequence.SpecimenIdentifier || - metadata.SeriesInstanceUID, - containerIdentifier: - metadata.ContainerIdentifier || metadata.SeriesInstanceUID, - } - ), + subjectClassSpecificContext: new dcmjs.sr.templates.SubjectContextSpecimen({ + uid: SpecimenDescriptionSequence.SpecimenUID, + identifier: SpecimenDescriptionSequence.SpecimenIdentifier || metadata.SeriesInstanceUID, + containerIdentifier: metadata.ContainerIdentifier || metadata.SeriesInstanceUID, + }), }), }); const imagingMeasurements = []; for (let i = 0; i < annotations.length; i++) { const { roiGraphic: roi, label } = annotations[i]; - let { - measurements, - evaluations, - marker, - presentationState, - } = roi.properties; + let { measurements, evaluations, marker, presentationState } = roi.properties; console.debug('[SR] storing marker...', marker); console.debug('[SR] storing measurements...', measurements); @@ -97,9 +79,7 @@ export default function constructSR( ? measurement.MeasuredValueSequence[0] : measurement.MeasuredValueSequence; - const MeasuredValueUnits = Array.isArray( - MeasuredValue.MeasurementUnitsCodeSequence - ) + const MeasuredValueUnits = Array.isArray(MeasuredValue.MeasurementUnitsCodeSequence) ? MeasuredValue.MeasurementUnitsCodeSequence[0] : MeasuredValue.MeasurementUnitsCodeSequence; @@ -136,29 +116,27 @@ export default function constructSR( }); const identifier = `ROI #${i + 1}`; - const group = new dcmjs.sr.templates.PlanarROIMeasurementsAndQualitativeEvaluations( - { - trackingIdentifier: new dcmjs.sr.templates.TrackingIdentifier({ - uid: roi.uid, - identifier: presentationState - ? identifier.concat(`(${JSON.stringify(presentationState)})`) - : identifier, - }), - referencedRegion: new dcmjs.sr.contentItems.ImageRegion3D({ - graphicType: roi.scoord3d.graphicType, - graphicData: roi.scoord3d.graphicData, - frameOfReferenceUID: roi.scoord3d.frameOfReferenceUID, - }), - findingType: new dcmjs.sr.coding.CodedConcept({ - value: label, - schemeDesignator: '@ohif/extension-dicom-microscopy', - meaning: 'FREETEXT', - }), - /** Evaluations will conflict with current tracking identifier */ - /** qualitativeEvaluations: evaluations, */ - measurements, - } - ); + const group = new dcmjs.sr.templates.PlanarROIMeasurementsAndQualitativeEvaluations({ + trackingIdentifier: new dcmjs.sr.templates.TrackingIdentifier({ + uid: roi.uid, + identifier: presentationState + ? identifier.concat(`(${JSON.stringify(presentationState)})`) + : identifier, + }), + referencedRegion: new dcmjs.sr.contentItems.ImageRegion3D({ + graphicType: roi.scoord3d.graphicType, + graphicData: roi.scoord3d.graphicData, + frameOfReferenceUID: roi.scoord3d.frameOfReferenceUID, + }), + findingType: new dcmjs.sr.coding.CodedConcept({ + value: label, + schemeDesignator: '@ohif/extension-dicom-microscopy', + meaning: 'FREETEXT', + }), + /** Evaluations will conflict with current tracking identifier */ + /** qualitativeEvaluations: evaluations, */ + measurements, + }); imagingMeasurements.push(...group); } @@ -180,8 +158,7 @@ export default function constructSR( evidence: [metadata], seriesInstanceUID: dcmjs.data.DicomMetaDictionary.uid(), seriesNumber: SeriesNumber, - seriesDescription: - SeriesDescription || 'Whole slide imaging structured report', + seriesDescription: SeriesDescription || 'Whole slide imaging structured report', sopInstanceUID: dcmjs.data.DicomMetaDictionary.uid(), instanceNumber: 1, manufacturer: 'dcmjs-org', diff --git a/extensions/dicom-microscopy/src/utils/coordinateFormatScoord3d2Geometry.js b/extensions/dicom-microscopy/src/utils/coordinateFormatScoord3d2Geometry.js index de5c4771d..e4530b94c 100644 --- a/extensions/dicom-microscopy/src/utils/coordinateFormatScoord3d2Geometry.js +++ b/extensions/dicom-microscopy/src/utils/coordinateFormatScoord3d2Geometry.js @@ -3,10 +3,7 @@ import { inv, multiply } from 'mathjs'; // TODO -> This is pulled out of some internal logic from Dicom Microscopy Viewer, // We should likely just expose this there. -export default function coordinateFormatScoord3d2Geometry( - coordinates, - pyramid -) { +export default function coordinateFormatScoord3d2Geometry(coordinates, pyramid) { let transform = false; if (!Array.isArray(coordinates[0])) { coordinates = [coordinates]; diff --git a/extensions/dicom-microscopy/src/utils/dicomWebClient.ts b/extensions/dicom-microscopy/src/utils/dicomWebClient.ts index bb8b1f2e7..8d6d78462 100644 --- a/extensions/dicom-microscopy/src/utils/dicomWebClient.ts +++ b/extensions/dicom-microscopy/src/utils/dicomWebClient.ts @@ -15,10 +15,7 @@ DICOMwebClient._buildMultipartAcceptHeaderFieldValue = () => { * @param param0 * @returns */ -export default function getDicomWebClient({ - extensionManager, - servicesManager, -}) { +export default function getDicomWebClient({ extensionManager, servicesManager }) { const dataSourceConfig = window.config.dataSources.find( ds => ds.sourceName === extensionManager.activeDataSource ); @@ -55,29 +52,19 @@ export default function getDicomWebClient({ // client.retrieveInstanceFrames = async options => { if (!('studyInstanceUID' in options)) { - throw new Error( - 'Study Instance UID is required for retrieval of instance frames' - ); + throw new Error('Study Instance UID is required for retrieval of instance frames'); } if (!('seriesInstanceUID' in options)) { - throw new Error( - 'Series Instance UID is required for retrieval of instance frames' - ); + throw new Error('Series Instance UID is required for retrieval of instance frames'); } if (!('sopInstanceUID' in options)) { - throw new Error( - 'SOP Instance UID is required for retrieval of instance frames' - ); + throw new Error('SOP Instance UID is required for retrieval of instance frames'); } if (!('frameNumbers' in options)) { - throw new Error( - 'frame numbers are required for retrieval of instance frames' - ); + throw new Error('frame numbers are required for retrieval of instance frames'); } console.log( - `retrieve frames ${options.frameNumbers.toString()} of instance ${ - options.sopInstanceUID - }` + `retrieve frames ${options.frameNumbers.toString()} of instance ${options.sopInstanceUID}` ); const instance = DicomMetadataStore.getInstance( @@ -91,9 +78,7 @@ export default function getDicomWebClient({ : options.frameNumbers.split(','); return frameNumbers.map(fr => - Array.isArray(instance.PixelData) - ? instance.PixelData[+fr - 1] - : instance.PixelData + Array.isArray(instance.PixelData) ? instance.PixelData[+fr - 1] : instance.PixelData ); }; } diff --git a/extensions/dicom-microscopy/src/utils/getSourceDisplaySet.js b/extensions/dicom-microscopy/src/utils/getSourceDisplaySet.js index d1455b639..a2c7439e0 100644 --- a/extensions/dicom-microscopy/src/utils/getSourceDisplaySet.js +++ b/extensions/dicom-microscopy/src/utils/getSourceDisplaySet.js @@ -5,24 +5,18 @@ * @param {*} microscopySRDisplaySet * @returns */ -export default function getSourceDisplaySet( - allDisplaySets, - microscopySRDisplaySet -) { +export default function getSourceDisplaySet(allDisplaySets, microscopySRDisplaySet) { const { ReferencedFrameOfReferenceUID } = microscopySRDisplaySet; const otherDisplaySets = allDisplaySets.filter( - ds => - ds.displaySetInstanceUID !== microscopySRDisplaySet.displaySetInstanceUID + ds => ds.displaySetInstanceUID !== microscopySRDisplaySet.displaySetInstanceUID ); const referencedDisplaySet = otherDisplaySets.find( displaySet => displaySet.Modality === 'SM' && (displaySet.FrameOfReferenceUID === ReferencedFrameOfReferenceUID || // sometimes each depth instance has the different FrameOfReferenceID - displaySet.othersFrameOfReferenceUID.includes( - ReferencedFrameOfReferenceUID - )) + displaySet.othersFrameOfReferenceUID.includes(ReferencedFrameOfReferenceUID)) ); if (!referencedDisplaySet && otherDisplaySets.length >= 1) { diff --git a/extensions/dicom-microscopy/src/utils/loadSR.js b/extensions/dicom-microscopy/src/utils/loadSR.js index c690028bb..9866cbb87 100644 --- a/extensions/dicom-microscopy/src/utils/loadSR.js +++ b/extensions/dicom-microscopy/src/utils/loadSR.js @@ -3,8 +3,7 @@ import dcmjs from 'dcmjs'; import DCM_CODE_VALUES from './dcmCodeValues'; import toArray from './toArray'; -const MeasurementReport = - dcmjs.adapters.DICOMMicroscopyViewer.MeasurementReport; +const MeasurementReport = dcmjs.adapters.DICOMMicroscopyViewer.MeasurementReport; // Define as async so that it returns a promise, expected by the ViewportGrid export default async function loadSR( @@ -16,9 +15,7 @@ export default async function loadSR( const { StudyInstanceUID, FrameOfReferenceUID } = referencedDisplaySet; - const managedViewers = microscopyService.getManagedViewersForStudy( - StudyInstanceUID - ); + const managedViewers = microscopyService.getManagedViewersForStudy(StudyInstanceUID); if (!managedViewers || !managedViewers.length) { return; @@ -26,10 +23,7 @@ export default async function loadSR( microscopySRDisplaySet.isLoaded = true; - const { rois, labels } = await _getROIsFromToolState( - naturalizedDataset, - FrameOfReferenceUID - ); + const { rois, labels } = await _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID); const managedViewer = managedViewers[0]; @@ -58,9 +52,7 @@ async function _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID) { /* webpackChunkName: "dicom-microscopy-viewer" */ 'dicom-microscopy-viewer' ); - const measurementGroupContentItems = _getMeasurementGroups( - naturalizedDataset - ); + const measurementGroupContentItems = _getMeasurementGroups(naturalizedDataset); const rois = []; const labels = []; @@ -71,17 +63,13 @@ async function _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID) { const capsToolType = t.toUpperCase(); - const measurementGroupContentItemsForTool = measurementGroupContentItems.filter( - mg => { - const imageRegionContentItem = toArray(mg.ContentSequence).find( - ci => - ci.ConceptNameCodeSequence.CodeValue === - DCM_CODE_VALUES.IMAGE_REGION - ); + const measurementGroupContentItemsForTool = measurementGroupContentItems.filter(mg => { + const imageRegionContentItem = toArray(mg.ContentSequence).find( + ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGE_REGION + ); - return imageRegionContentItem.GraphicType === capsToolType; - } - ); + return imageRegionContentItem.GraphicType === capsToolType; + }); toolSpecificToolState.forEach((coordinates, index) => { const properties = {}; @@ -109,9 +97,7 @@ async function _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID) { ); const trackingGroup = toArray(measurementGroup.ContentSequence).find( - ci => - ci.ConceptNameCodeSequence.CodeValue === - DCM_CODE_VALUES.TRACKING_UNIQUE_IDENTIFIER + ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.TRACKING_UNIQUE_IDENTIFIER ); /** @@ -138,9 +124,7 @@ async function _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID) { ); let evaluations = toArray(measurementGroup.ContentSequence).filter(ci => - [DCM_CODE_VALUES.TRACKING_UNIQUE_IDENTIFIER].includes( - ci.ConceptNameCodeSequence.CodeValue - ) + [DCM_CODE_VALUES.TRACKING_UNIQUE_IDENTIFIER].includes(ci.ConceptNameCodeSequence.CodeValue) ); /** @@ -191,17 +175,12 @@ function _getMeasurementGroups(naturalizedDataset) { const { ContentSequence } = naturalizedDataset; const imagingMeasurementsContentItem = ContentSequence.find( - ci => - ci.ConceptNameCodeSequence.CodeValue === - DCM_CODE_VALUES.IMAGING_MEASUREMENTS + ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGING_MEASUREMENTS ); const measurementGroupContentItems = toArray( imagingMeasurementsContentItem.ContentSequence - ).filter( - ci => - ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.MEASUREMENT_GROUP - ); + ).filter(ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.MEASUREMENT_GROUP); return measurementGroupContentItems; } diff --git a/extensions/dicom-pdf/.webpack/webpack.prod.js b/extensions/dicom-pdf/.webpack/webpack.prod.js index a653d7b9f..eb47972e1 100644 --- a/extensions/dicom-pdf/.webpack/webpack.prod.js +++ b/extensions/dicom-pdf/.webpack/webpack.prod.js @@ -3,8 +3,7 @@ const { merge } = require('webpack-merge'); const path = require('path'); const webpackCommon = require('./../../../.webpack/webpack.base.js'); const pkg = require('./../package.json'); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin; +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const ROOT_DIR = path.join(__dirname, './..'); const SRC_DIR = path.join(__dirname, '../src'); @@ -38,13 +37,7 @@ module.exports = (env, argv) => { libraryTarget: 'umd', filename: `${pkg.main}`, }, - externals: [ - /\b(vtk.js)/, - /\b(dcmjs)/, - /\b(gl-matrix)/, - /^@ohif/, - /^@cornerstonejs/, - ], + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], plugins: [ new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, diff --git a/extensions/dicom-pdf/src/getSopClassHandlerModule.js b/extensions/dicom-pdf/src/getSopClassHandlerModule.js index 99a9bae80..8e7e90252 100644 --- a/extensions/dicom-pdf/src/getSopClassHandlerModule.js +++ b/extensions/dicom-pdf/src/getSopClassHandlerModule.js @@ -9,25 +9,12 @@ const SOP_CLASS_UIDS = { const sopClassUids = Object.values(SOP_CLASS_UIDS); -const _getDisplaySetsFromSeries = ( - instances, - servicesManager, - extensionManager -) => { +const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager) => { const dataSource = extensionManager.getActiveDataSource()[0]; return instances.map(instance => { const { Modality, SOPInstanceUID, EncapsulatedDocument } = instance; - const { - SeriesDescription = 'PDF', - MIMETypeOfEncapsulatedDocument, - } = instance; - const { - SeriesNumber, - SeriesDate, - SeriesInstanceUID, - StudyInstanceUID, - SOPClassUID, - } = instance; + const { SeriesDescription = 'PDF', MIMETypeOfEncapsulatedDocument } = instance; + const { SeriesNumber, SeriesDate, SeriesInstanceUID, StudyInstanceUID, SOPClassUID } = instance; const pdfUrl = dataSource.retrieve.directURL({ instance, tag: 'EncapsulatedDocument', @@ -68,16 +55,9 @@ const _getDisplaySetsFromSeries = ( }); }; -export default function getSopClassHandlerModule({ - servicesManager, - extensionManager, -}) { +export default function getSopClassHandlerModule({ servicesManager, extensionManager }) { const getDisplaySetsFromSeries = instances => { - return _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager - ); + return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager); }; return [ diff --git a/extensions/dicom-pdf/src/index.tsx b/extensions/dicom-pdf/src/index.tsx index 6c35c4a5f..ab3d33cf4 100644 --- a/extensions/dicom-pdf/src/index.tsx +++ b/extensions/dicom-pdf/src/index.tsx @@ -3,9 +3,7 @@ import getSopClassHandlerModule from './getSopClassHandlerModule'; import { id } from './id.js'; const Component = React.lazy(() => { - return import( - /* webpackPrefetch: true */ './viewports/OHIFCornerstonePdfViewport' - ); + return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstonePdfViewport'); }); const OHIFCornerstonePdfViewport = props => { @@ -41,9 +39,7 @@ const dicomPDFExtension = { ); }; - return [ - { name: 'dicom-pdf', component: ExtendedOHIFCornerstonePdfViewport }, - ]; + return [{ name: 'dicom-pdf', component: ExtendedOHIFCornerstonePdfViewport }]; }, // getCommandsModule({ servicesManager }) { // return { diff --git a/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx b/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx index 9da1904c1..e4e2bac4b 100644 --- a/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx +++ b/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx @@ -21,8 +21,12 @@ function OHIFCornerstonePdfViewport({ displaySets }) { }, [pdfUrl]); return ( -
- +
+
No online PDF viewer installed
diff --git a/extensions/dicom-video/.webpack/webpack.prod.js b/extensions/dicom-video/.webpack/webpack.prod.js index 633be1c44..79c56911f 100644 --- a/extensions/dicom-video/.webpack/webpack.prod.js +++ b/extensions/dicom-video/.webpack/webpack.prod.js @@ -3,8 +3,7 @@ const { merge } = require('webpack-merge'); const path = require('path'); const webpackCommon = require('./../../../.webpack/webpack.base.js'); const pkg = require('./../package.json'); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin; +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const ROOT_DIR = path.join(__dirname, './..'); const SRC_DIR = path.join(__dirname, '../src'); @@ -38,13 +37,7 @@ module.exports = (env, argv) => { libraryTarget: 'umd', filename: pkg.main, }, - externals: [ - /\b(vtk.js)/, - /\b(dcmjs)/, - /\b(gl-matrix)/, - /^@ohif/, - /^@cornerstonejs/, - ], + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], plugins: [ new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, diff --git a/extensions/dicom-video/src/getSopClassHandlerModule.js b/extensions/dicom-video/src/getSopClassHandlerModule.js index f7d28e7bf..50181590f 100644 --- a/extensions/dicom-video/src/getSopClassHandlerModule.js +++ b/extensions/dicom-video/src/getSopClassHandlerModule.js @@ -7,8 +7,7 @@ const SOP_CLASS_UIDS = { VIDEO_ENDOSCOPIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.1.1', /** Need to use fallback, could be video or image */ SECONDARY_CAPTURE_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.7', - MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE: - '1.2.840.10008.5.1.4.1.1.7.4', + MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.7.4', }; const sopClassUids = Object.values(SOP_CLASS_UIDS); @@ -29,49 +28,31 @@ const SupportedTransferSyntaxes = { const supportedTransferSyntaxUIDs = Object.values(SupportedTransferSyntaxes); -const _getDisplaySetsFromSeries = ( - instances, - servicesManager, - extensionManager -) => { +const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager) => { const dataSource = extensionManager.getActiveDataSource()[0]; return instances .filter(metadata => { const tsuid = - metadata.AvailableTransferSyntaxUID || - metadata.TransferSyntaxUID || - metadata['00083002']; + metadata.AvailableTransferSyntaxUID || metadata.TransferSyntaxUID || metadata['00083002']; if (supportedTransferSyntaxUIDs.includes(tsuid)) { return true; } - if ( - metadata.SOPClassUID === SOP_CLASS_UIDS.VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE - ) { + if (metadata.SOPClassUID === SOP_CLASS_UIDS.VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE) { return true; } // Assume that an instance with one of the secondary capture SOPClassUIDs and // with at least 90 frames (i.e. typically 3 seconds of video) is indeed a video. return ( - secondaryCaptureSopClassUids.includes(metadata.SOPClassUID) && - metadata.NumberOfFrames >= 90 + secondaryCaptureSopClassUids.includes(metadata.SOPClassUID) && metadata.NumberOfFrames >= 90 ); }) .map(instance => { - const { - Modality, - SOPInstanceUID, - SeriesDescription = 'VIDEO', - } = instance; - const { - SeriesNumber, - SeriesDate, - SeriesInstanceUID, - StudyInstanceUID, - NumberOfFrames, - } = instance; + const { Modality, SOPInstanceUID, SeriesDescription = 'VIDEO' } = instance; + const { SeriesNumber, SeriesDate, SeriesInstanceUID, StudyInstanceUID, NumberOfFrames } = + instance; const displaySet = { //plugin: id, Modality, @@ -107,16 +88,9 @@ const _getDisplaySetsFromSeries = ( }); }; -export default function getSopClassHandlerModule({ - servicesManager, - extensionManager, -}) { +export default function getSopClassHandlerModule({ servicesManager, extensionManager }) { const getDisplaySetsFromSeries = instances => { - return _getDisplaySetsFromSeries( - instances, - servicesManager, - extensionManager - ); + return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager); }; return [ diff --git a/extensions/dicom-video/src/index.tsx b/extensions/dicom-video/src/index.tsx index 1bc3a3359..a5fcd40d1 100644 --- a/extensions/dicom-video/src/index.tsx +++ b/extensions/dicom-video/src/index.tsx @@ -3,9 +3,7 @@ import getSopClassHandlerModule from './getSopClassHandlerModule'; import { id } from './id'; const Component = React.lazy(() => { - return import( - /* webpackPrefetch: true */ './viewports/OHIFCornerstoneVideoViewport' - ); + return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstoneVideoViewport'); }); const OHIFCornerstoneVideoViewport = props => { @@ -42,9 +40,7 @@ const dicomVideoExtension = { ); }; - return [ - { name: 'dicom-video', component: ExtendedOHIFCornerstoneVideoViewport }, - ]; + return [{ name: 'dicom-video', component: ExtendedOHIFCornerstoneVideoViewport }]; }, // getCommandsModule({ servicesManager }) { // return { diff --git a/extensions/dicom-video/src/viewports/OHIFCornerstoneVideoViewport.tsx b/extensions/dicom-video/src/viewports/OHIFCornerstoneVideoViewport.tsx index 0b9a92d49..8f7e965a8 100644 --- a/extensions/dicom-video/src/viewports/OHIFCornerstoneVideoViewport.tsx +++ b/extensions/dicom-video/src/viewports/OHIFCornerstoneVideoViewport.tsx @@ -22,17 +22,23 @@ function OHIFCornerstoneVideoViewport({ displaySets }) { // Need to copies of the source to fix a firefox bug return ( -
+