diff --git a/bun.lock b/bun.lock index e6f8ee0c1..2e2df38c5 100644 --- a/bun.lock +++ b/bun.lock @@ -33,7 +33,7 @@ }, "addOns/externals/devDependencies": { "name": "@externals/devDependencies", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "@kitware/vtk.js": "32.12.0", @@ -121,21 +121,21 @@ }, "addOns/externals/dicom-microscopy-viewer": { "name": "@externals/dicom-microscopy-viewer", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "dicom-microscopy-viewer": "^0.46.1", }, }, "extensions/cornerstone": { "name": "@ohif/extension-cornerstone", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^3.7.1", - "@cornerstonejs/core": "^3.7.1", - "@cornerstonejs/labelmap-interpolation": "^3.7.1", - "@cornerstonejs/polymorphic-segmentation": "^3.7.1", - "@cornerstonejs/tools": "^3.7.1", + "@cornerstonejs/adapters": "^3.7.5", + "@cornerstonejs/core": "^3.7.5", + "@cornerstonejs/labelmap-interpolation": "^3.7.5", + "@cornerstonejs/polymorphic-segmentation": "^3.7.5", + "@cornerstonejs/tools": "^3.7.5", "@itk-wasm/morphological-contour-interpolation": "1.1.0", "@kitware/vtk.js": "32.12.0", "html2canvas": "^1.4.1", @@ -152,9 +152,9 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^3.7.1", - "@ohif/core": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@cornerstonejs/dicom-image-loader": "^3.7.5", + "@ohif/core": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "dcmjs": "*", "dicom-parser": "^1.8.21", "hammerjs": "^2.0.8", @@ -166,19 +166,19 @@ }, "extensions/cornerstone-dicom-pmap": { "name": "@ohif/extension-cornerstone-dicom-pmap", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^3.7.1", - "@cornerstonejs/core": "^3.7.1", + "@cornerstonejs/adapters": "^3.7.5", + "@cornerstonejs/core": "^3.7.5", "@kitware/vtk.js": "32.12.0", "react-color": "^2.19.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/i18n": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/i18n": "3.10.0-beta.130", "prop-types": "^15.6.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -189,16 +189,16 @@ }, "extensions/cornerstone-dicom-rt": { "name": "@ohif/extension-cornerstone-dicom-rt", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "react-color": "^2.19.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/i18n": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/i18n": "3.10.0-beta.130", "prop-types": "^15.6.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -209,19 +209,19 @@ }, "extensions/cornerstone-dicom-seg": { "name": "@ohif/extension-cornerstone-dicom-seg", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^3.7.1", - "@cornerstonejs/core": "^3.7.1", + "@cornerstonejs/adapters": "^3.7.5", + "@cornerstonejs/core": "^3.7.5", "@kitware/vtk.js": "32.12.0", "react-color": "^2.19.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/i18n": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/i18n": "3.10.0-beta.130", "prop-types": "^15.6.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -232,19 +232,19 @@ }, "extensions/cornerstone-dicom-sr": { "name": "@ohif/extension-cornerstone-dicom-sr", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^3.7.1", - "@cornerstonejs/core": "^3.7.1", - "@cornerstonejs/tools": "^3.7.1", + "@cornerstonejs/adapters": "^3.7.5", + "@cornerstonejs/core": "^3.7.5", + "@cornerstonejs/tools": "^3.7.5", "classnames": "^2.3.2", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-measurement-tracking": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-measurement-tracking": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "dcmjs": "*", "dicom-parser": "^1.8.9", "hammerjs": "^2.0.8", @@ -254,19 +254,19 @@ }, "extensions/cornerstone-dynamic-volume": { "name": "@ohif/extension-cornerstone-dynamic-volume", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/core": "^3.7.1", - "@cornerstonejs/tools": "^3.7.1", + "@cornerstonejs/core": "^3.7.5", + "@cornerstonejs/tools": "^3.7.5", "classnames": "^2.3.2", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/i18n": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/i18n": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "dcmjs": "*", "dicom-parser": "^1.8.21", "hammerjs": "^2.0.8", @@ -276,7 +276,7 @@ }, "extensions/default": { "name": "@ohif/extension-default", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "@cornerstonejs/calculate-suv": "^1.1.0", @@ -284,8 +284,8 @@ "lodash.uniqby": "^4.7.0", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/i18n": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/i18n": "3.10.0-beta.130", "dcmjs": "*", "dicomweb-client": "^0.10.4", "prop-types": "^15.6.2", @@ -299,7 +299,7 @@ }, "extensions/dicom-microscopy": { "name": "@ohif/extension-dicom-microscopy", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "@cornerstonejs/codec-charls": "^1.2.3", @@ -310,10 +310,10 @@ "mathjs": "^12.4.2", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/i18n": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/i18n": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "prop-types": "^15.6.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -324,14 +324,14 @@ }, "extensions/dicom-pdf": { "name": "@ohif/extension-dicom-pdf", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "classnames": "^2.3.2", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "dcmjs": "*", "dicom-parser": "^1.8.9", "hammerjs": "^2.0.8", @@ -341,14 +341,14 @@ }, "extensions/dicom-video": { "name": "@ohif/extension-dicom-video", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "classnames": "^2.3.2", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "dcmjs": "*", "dicom-parser": "^1.8.9", "hammerjs": "^2.0.8", @@ -358,20 +358,20 @@ }, "extensions/measurement-tracking": { "name": "@ohif/extension-measurement-tracking", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", - "@ohif/ui": "3.10.0-beta.128", + "@ohif/ui": "3.10.0-beta.130", "@xstate/react": "^3.2.2", "xstate": "^4.10.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.7.1", - "@cornerstonejs/tools": "^3.7.1", - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@cornerstonejs/core": "^3.7.5", + "@cornerstonejs/tools": "^3.7.5", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "classnames": "^2.3.2", "dcmjs": "*", "lodash.debounce": "^4.0.8", @@ -384,14 +384,14 @@ }, "extensions/test-extension": { "name": "@ohif/extension-test", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "classnames": "^2.3.2", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "dcmjs": "0.38.0", "dicom-parser": "^1.8.9", "hammerjs": "^2.0.8", @@ -401,14 +401,14 @@ }, "extensions/tmtv": { "name": "@ohif/extension-tmtv", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "classnames": "^2.3.2", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", "dcmjs": "*", "dicom-parser": "^1.8.9", "hammerjs": "^2.0.8", @@ -418,7 +418,7 @@ }, "modes/basic-dev-mode": { "name": "@ohif/mode-basic-dev-mode", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "i18next": "^17.0.3", @@ -428,17 +428,17 @@ "webpack-merge": "^5.7.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/extension-dicom-pdf": "3.10.0-beta.128", - "@ohif/extension-dicom-video": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/extension-dicom-pdf": "3.10.0-beta.130", + "@ohif/extension-dicom-video": "3.10.0-beta.130", }, }, "modes/basic-test-mode": { "name": "@ohif/mode-test", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "i18next": "^17.0.3", @@ -448,19 +448,19 @@ "webpack-merge": "^5.7.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/extension-dicom-pdf": "3.10.0-beta.128", - "@ohif/extension-dicom-video": "3.10.0-beta.128", - "@ohif/extension-measurement-tracking": "3.10.0-beta.128", - "@ohif/extension-test": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/extension-dicom-pdf": "3.10.0-beta.130", + "@ohif/extension-dicom-video": "3.10.0-beta.130", + "@ohif/extension-measurement-tracking": "3.10.0-beta.130", + "@ohif/extension-test": "3.10.0-beta.130", }, }, "modes/longitudinal": { "name": "@ohif/mode-longitudinal", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "i18next": "^17.0.3", @@ -470,32 +470,32 @@ "webpack-merge": "^5.7.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-rt": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-seg": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/extension-dicom-pdf": "3.10.0-beta.128", - "@ohif/extension-dicom-video": "3.10.0-beta.128", - "@ohif/extension-measurement-tracking": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-rt": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-seg": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/extension-dicom-pdf": "3.10.0-beta.130", + "@ohif/extension-dicom-video": "3.10.0-beta.130", + "@ohif/extension-measurement-tracking": "3.10.0-beta.130", }, }, "modes/microscopy": { "name": "@ohif/mode-microscopy", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "i18next": "^17.0.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-dicom-microscopy": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-dicom-microscopy": "3.10.0-beta.130", }, }, "modes/preclinical-4d": { "name": "@ohif/mode-preclinical-4d", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", }, @@ -504,17 +504,17 @@ "webpack-merge": "^5.7.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-seg": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dynamic-volume": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/extension-tmtv": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-seg": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dynamic-volume": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/extension-tmtv": "3.10.0-beta.130", }, }, "modes/segmentation": { "name": "@ohif/mode-segmentation", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "i18next": "^17.0.3", @@ -546,19 +546,19 @@ "webpack-merge": "^5.7.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-rt": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-seg": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/extension-dicom-pdf": "3.10.0-beta.128", - "@ohif/extension-dicom-video": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-rt": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-seg": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/extension-dicom-pdf": "3.10.0-beta.130", + "@ohif/extension-dicom-video": "3.10.0-beta.130", }, }, "modes/tmtv": { "name": "@ohif/mode-tmtv", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "i18next": "^17.0.3", @@ -568,43 +568,43 @@ "webpack-merge": "^5.7.3", }, "peerDependencies": { - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/extension-dicom-pdf": "3.10.0-beta.128", - "@ohif/extension-dicom-video": "3.10.0-beta.128", - "@ohif/extension-measurement-tracking": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/extension-dicom-pdf": "3.10.0-beta.130", + "@ohif/extension-dicom-video": "3.10.0-beta.130", + "@ohif/extension-measurement-tracking": "3.10.0-beta.130", }, }, "platform/app": { "name": "@ohif/app", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^3.7.1", + "@cornerstonejs/dicom-image-loader": "^3.7.5", "@emotion/serialize": "^1.1.3", - "@ohif/core": "3.10.0-beta.128", - "@ohif/extension-cornerstone": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-rt": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-seg": "3.10.0-beta.128", - "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.128", - "@ohif/extension-default": "3.10.0-beta.128", - "@ohif/extension-dicom-microscopy": "3.10.0-beta.128", - "@ohif/extension-dicom-pdf": "3.10.0-beta.128", - "@ohif/extension-dicom-video": "3.10.0-beta.128", - "@ohif/extension-test": "3.10.0-beta.128", - "@ohif/i18n": "3.10.0-beta.128", - "@ohif/mode-basic-dev-mode": "3.10.0-beta.128", - "@ohif/mode-longitudinal": "3.10.0-beta.128", - "@ohif/mode-microscopy": "3.10.0-beta.128", - "@ohif/mode-test": "3.10.0-beta.128", - "@ohif/ui": "3.10.0-beta.128", - "@ohif/ui-next": "3.10.0-beta.128", + "@ohif/core": "3.10.0-beta.130", + "@ohif/extension-cornerstone": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-rt": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-seg": "3.10.0-beta.130", + "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.130", + "@ohif/extension-default": "3.10.0-beta.130", + "@ohif/extension-dicom-microscopy": "3.10.0-beta.130", + "@ohif/extension-dicom-pdf": "3.10.0-beta.130", + "@ohif/extension-dicom-video": "3.10.0-beta.130", + "@ohif/extension-test": "3.10.0-beta.130", + "@ohif/i18n": "3.10.0-beta.130", + "@ohif/mode-basic-dev-mode": "3.10.0-beta.130", + "@ohif/mode-longitudinal": "3.10.0-beta.130", + "@ohif/mode-microscopy": "3.10.0-beta.130", + "@ohif/mode-test": "3.10.0-beta.130", + "@ohif/ui": "3.10.0-beta.130", + "@ohif/ui-next": "3.10.0-beta.130", "@svgr/webpack": "^8.1.0", "@types/react": "^18.3.3", "classnames": "^2.3.2", @@ -645,7 +645,7 @@ }, "platform/cli": { "name": "@ohif/cli", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "bin": { "ohif-cli": "src/index.js", }, @@ -669,7 +669,7 @@ }, "platform/core": { "name": "@ohif/core", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "dcmjs": "*", @@ -694,15 +694,15 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^3.7.1", - "@ohif/ui": "3.10.0-beta.128", + "@cornerstonejs/dicom-image-loader": "^3.7.5", + "@ohif/ui": "3.10.0-beta.130", "cornerstone-math": "0.1.9", "dicom-parser": "^1.8.21", }, }, "platform/i18n": { "name": "@ohif/i18n", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@babel/runtime": "^7.20.13", "i18next-locize-backend": "^2.0.0", @@ -727,7 +727,7 @@ }, "platform/ui": { "name": "@ohif/ui", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@testing-library/react": "^13.1.0", "browser-detect": "^0.2.28", @@ -787,7 +787,7 @@ }, "platform/ui-next": { "name": "@ohif/ui-next", - "version": "3.10.0-beta.128", + "version": "3.10.0-beta.130", "dependencies": { "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-checkbox": "^1.1.1", @@ -1095,7 +1095,7 @@ "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], - "@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.7.1", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.1", "@cornerstonejs/tools": "^3.7.1" } }, "sha512-aREkDwxmoIxBT4xJs00i7ghI9kCdKa7hmmDdCxw54lD0kI6aGLAHrwIeeYl+C19suyNH18duwuy1E/GYLfg5pA=="], + "@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.7.5", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.5", "@cornerstonejs/tools": "^3.7.5" } }, "sha512-Pdrlx1dYVe/nakC7geec8QOQwqi4hJaAgTpN18y+/a7Vk3wpzj+/q+vf03lt4BhUygAu9+3t5gAUDm0kzXq02g=="], "@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="], @@ -1107,15 +1107,15 @@ "@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="], - "@cornerstonejs/core": ["@cornerstonejs/core@3.7.1", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-+I6rCCFW+Am5GRJoaFdl2mD8R+Z0UXRZOBUE7hfTs0F6S8+45nOrlUccIK0UJdRq3bUc+h+G2tHW/i04FFs/mg=="], + "@cornerstonejs/core": ["@cornerstonejs/core@3.7.5", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-AMzZrl4nTTcoZejI3qomi5f9LNPr8QkHGconRnNe7aEjuUHUiT9uwX3ieoltJ2IDNmmqhK3wVzJ19EKVqfuESQ=="], - "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.7.1", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.1" } }, "sha512-mfbZ4PjLIGRh9CaMGxw0I4skI0y3sG+z0SlH40m/cwWvfKj18T5iqoLVSovSnYhqCcKdSyljM/ZTAj1t0vfRVQ=="], + "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.7.5", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.5" } }, "sha512-bDm4hx9NagD7tTU//ls+Z+U8duYgunOfLsAiU6SvNfB2vEINOSHVSnz7pAcnzfnE21ObJYnZnmH5aa8/sa/xCg=="], - "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@3.7.1", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.1", "@cornerstonejs/tools": "^3.7.1", "@kitware/vtk.js": "32.12.1" } }, "sha512-D9VwRPeWlIMfbGD9e5R+zPQLiqKmP0sz3kMN6pxEiDbHpJ6QirtgyJyzZRI3+Z68zL2mxUDNLbfw0GbYm9fhEg=="], + "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@3.7.5", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.5", "@cornerstonejs/tools": "^3.7.5", "@kitware/vtk.js": "32.12.1" } }, "sha512-mIdT8qzQpps1my6daRMAQDejhAAj6QGvkZyU4vbcqIHqqEnWezWFdKNWIlZhm6MX52Vy3Jnl7qBlQ8JtPd+5gQ=="], - "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@3.7.1", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.1", "@cornerstonejs/tools": "^3.7.1", "@kitware/vtk.js": "32.12.1" } }, "sha512-CRmSSgngzQqfBIiOmVFLzcM9lmDw2ueH/Co44/RDuo437J8mTG3QfDBmKoRt0VhlkiWy+C/cVMKqHwZ63Xl7Og=="], + "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@3.7.5", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.5", "@cornerstonejs/tools": "^3.7.5", "@kitware/vtk.js": "32.12.1" } }, "sha512-+4T5yKjfd0b4dGqy/Tj/V5biuQgjvJVkUv7qe5xU8L/0f8irvr4XtfYoeX9Hoo/iFrYKxdI5LrC35rsKWJttpQ=="], - "@cornerstonejs/tools": ["@cornerstonejs/tools@3.7.1", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-OVLfmGmQBuR9Ig1ZKy35EjwRLv6zNs6q4hrXf9EoIysMSH/mYB+V4n9/FQsqnlVh4IN0DuBqkwoUmBaGSPkspQ=="], + "@cornerstonejs/tools": ["@cornerstonejs/tools@3.7.5", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.7.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-9GcUI0meHqsO8uzePwv7k99Knr1ta6Q0OCb5AmTKGP6u6ZSEAi1aj2pBSoFZPlG/2vhcXh2NYHkNmeLTYlTP1g=="], "@csstools/postcss-cascade-layers": ["@csstools/postcss-cascade-layers@1.1.1", "", { "dependencies": { "@csstools/selector-specificity": "^2.0.2", "postcss-selector-parser": "^6.0.10" }, "peerDependencies": { "postcss": "^8.2" } }, "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA=="], diff --git a/extensions/cornerstone-dicom-pmap/package.json b/extensions/cornerstone-dicom-pmap/package.json index 25ee7b6c0..095d663e8 100644 --- a/extensions/cornerstone-dicom-pmap/package.json +++ b/extensions/cornerstone-dicom-pmap/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^3.7.1", - "@cornerstonejs/core": "^3.7.1", + "@cornerstonejs/adapters": "^3.7.5", + "@cornerstonejs/core": "^3.7.5", "@kitware/vtk.js": "32.12.0", "react-color": "^2.19.3" } diff --git a/extensions/cornerstone-dicom-seg/package.json b/extensions/cornerstone-dicom-seg/package.json index 3abdabc77..240f6886a 100644 --- a/extensions/cornerstone-dicom-seg/package.json +++ b/extensions/cornerstone-dicom-seg/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^3.7.1", - "@cornerstonejs/core": "^3.7.1", + "@cornerstonejs/adapters": "^3.7.5", + "@cornerstonejs/core": "^3.7.5", "@kitware/vtk.js": "32.12.0", "react-color": "^2.19.3" } diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index 8f7332eec..c0fa93662 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -46,9 +46,9 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^3.7.1", - "@cornerstonejs/core": "^3.7.1", - "@cornerstonejs/tools": "^3.7.1", + "@cornerstonejs/adapters": "^3.7.5", + "@cornerstonejs/core": "^3.7.5", + "@cornerstonejs/tools": "^3.7.5", "classnames": "^2.3.2" } } diff --git a/extensions/cornerstone-dynamic-volume/package.json b/extensions/cornerstone-dynamic-volume/package.json index c31915231..55884a9a8 100644 --- a/extensions/cornerstone-dynamic-volume/package.json +++ b/extensions/cornerstone-dynamic-volume/package.json @@ -42,8 +42,8 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/core": "^3.7.1", - "@cornerstonejs/tools": "^3.7.1", + "@cornerstonejs/core": "^3.7.5", + "@cornerstonejs/tools": "^3.7.5", "classnames": "^2.3.2" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index d48f24e23..5c06ac019 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -38,7 +38,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^3.7.1", + "@cornerstonejs/dicom-image-loader": "^3.7.5", "@ohif/core": "3.10.0-beta.130", "@ohif/ui": "3.10.0-beta.130", "dcmjs": "*", @@ -51,11 +51,11 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^3.7.1", - "@cornerstonejs/core": "^3.7.1", - "@cornerstonejs/labelmap-interpolation": "^3.7.1", - "@cornerstonejs/polymorphic-segmentation": "^3.7.1", - "@cornerstonejs/tools": "^3.7.1", + "@cornerstonejs/adapters": "^3.7.5", + "@cornerstonejs/core": "^3.7.5", + "@cornerstonejs/labelmap-interpolation": "^3.7.5", + "@cornerstonejs/polymorphic-segmentation": "^3.7.5", + "@cornerstonejs/tools": "^3.7.5", "@itk-wasm/morphological-contour-interpolation": "1.1.0", "@kitware/vtk.js": "32.12.0", "html2canvas": "^1.4.1", diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 849335130..2e4558431 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -41,6 +41,23 @@ const toggleSyncFunctions = { voi: toggleVOISliceSync, }; +const getLabelmapTools = ({ toolGroupService }) => { + const labelmapTools = []; + const toolGroupIds = toolGroupService.getToolGroupIds(); + toolGroupIds.forEach(toolGroupId => { + const toolGroup = cornerstoneTools.ToolGroupManager.getToolGroup(toolGroupId); + const tools = toolGroup.getToolInstances(); + // tools is an object with toolName as the key and tool as the value + Object.keys(tools).forEach(toolName => { + const tool = tools[toolName]; + if (tool instanceof cornerstoneTools.LabelmapBaseTool) { + labelmapTools.push(tool); + } + }); + }); + return labelmapTools; +}; + function commandsModule({ servicesManager, commandsManager, @@ -57,6 +74,7 @@ function commandsModule({ colorbarService, hangingProtocolService, syncGroupService, + toolbarService, segmentationService, displaySetService, } = servicesManager.services as AppTypes.Services; @@ -1484,6 +1502,41 @@ function commandsModule({ redo: () => { DefaultHistoryMemo.redo(); }, + toggleSegmentPreviewEdit: ({ toggle }) => { + const labelmapTools = getLabelmapTools({ toolGroupService }); + labelmapTools.forEach(tool => { + tool.configuration = { + ...tool.configuration, + preview: { + ...tool.configuration.preview, + enabled: toggle, + }, + }; + }); + }, + toggleSegmentSelect: ({ toggle }) => { + const toolGroupIds = toolGroupService.getToolGroupIds(); + toolGroupIds.forEach(toolGroupId => { + const toolGroup = cornerstoneTools.ToolGroupManager.getToolGroup(toolGroupId); + if (toggle) { + toolGroup.setToolActive(cornerstoneTools.SegmentSelectTool.toolName); + } else { + toolGroup.setToolDisabled(cornerstoneTools.SegmentSelectTool.toolName); + } + }); + }, + acceptPreview: () => { + const labelmapTools = getLabelmapTools({ toolGroupService }); + labelmapTools.forEach(tool => { + tool.acceptPreview(); + }); + }, + rejectPreview: () => { + const labelmapTools = getLabelmapTools({ toolGroupService }); + labelmapTools.forEach(tool => { + tool.rejectPreview(); + }); + }, }; const definitions = { @@ -1755,6 +1808,10 @@ function commandsModule({ interpolateLabelmap: actions.interpolateLabelmap, runSegmentBidirectional: actions.runSegmentBidirectional, downloadCSVSegmentationReport: actions.downloadCSVSegmentationReport, + toggleSegmentPreviewEdit: actions.toggleSegmentPreviewEdit, + toggleSegmentSelect: actions.toggleSegmentSelect, + acceptPreview: actions.acceptPreview, + rejectPreview: actions.rejectPreview, }; return { diff --git a/extensions/cornerstone/src/customizations/segmentationPanelCustomization.tsx b/extensions/cornerstone/src/customizations/segmentationPanelCustomization.tsx index 23236f701..38c842fa3 100644 --- a/extensions/cornerstone/src/customizations/segmentationPanelCustomization.tsx +++ b/extensions/cornerstone/src/customizations/segmentationPanelCustomization.tsx @@ -1,5 +1,7 @@ import { CustomDropdownMenuContent } from './CustomDropdownMenuContent'; import { CustomSegmentStatisticsHeader } from './CustomSegmentStatisticsHeader'; +import React, { useState } from 'react'; +import { Switch } from '@ohif/ui-next'; export default function getSegmentationPanelCustomization({ commandsManager, servicesManager }) { return { @@ -30,5 +32,40 @@ export default function getSegmentationPanelCustomization({ commandsManager, ser volume: 'Volume', lesionGlycolysis: 'Lesion Glycolysis', }, + 'segmentationToolbox.config': () => { + // Get initial states based on current configuration + const [previewEdits, setPreviewEdits] = useState(false); + const [toggleSegmentEnabled, setToggleSegmentEnabled] = useState(false); + + const handlePreviewEditsChange = checked => { + setPreviewEdits(checked); + commandsManager.run('toggleSegmentPreviewEdit', { toggle: checked }); + }; + + const handleToggleSegmentEnabledChange = checked => { + setToggleSegmentEnabled(checked); + commandsManager.run('toggleSegmentSelect', { toggle: checked }); + }; + + return ( +
+
+ + Preview edits before creating +
+ +
+ + Highlight segments to select +
+
+ ); + }, }; } diff --git a/extensions/cornerstone/src/initCornerstoneTools.js b/extensions/cornerstone/src/initCornerstoneTools.js index cd632559e..7ae4dcdb0 100644 --- a/extensions/cornerstone/src/initCornerstoneTools.js +++ b/extensions/cornerstone/src/initCornerstoneTools.js @@ -37,6 +37,7 @@ import { LivewireContourTool, OrientationMarkerTool, WindowLevelRegionTool, + SegmentSelectTool, } from '@cornerstonejs/tools'; import * as polySeg from '@cornerstonejs/polymorphic-segmentation'; @@ -96,7 +97,7 @@ export default function initCornerstoneTools(configuration = {}) { addTool(OrientationMarkerTool); addTool(WindowLevelRegionTool); addTool(PlanarFreehandContourSegmentationTool); - + addTool(SegmentSelectTool); // Modify annotation tools to use dashed lines on SR const annotationStyle = { textBoxFontSize: '15px', @@ -150,6 +151,7 @@ const toolNames = { WindowLevelRegion: WindowLevelRegionTool.toolName, PlanarFreehandContourSegmentation: PlanarFreehandContourSegmentationTool.toolName, SegmentBidirectional: SegmentBidirectionalTool.toolName, + SegmentSelect: SegmentSelectTool.toolName, }; export { toolNames }; diff --git a/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts b/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts index f328a5ebf..8e487ef05 100644 --- a/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts +++ b/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts @@ -264,10 +264,14 @@ class SegmentationService extends PubSubService { { segmentationId, type, + config, suppressEvents = false, }: { segmentationId: string; type?: csToolsEnums.SegmentationRepresentations; + config?: { + blendMode?: csEnums.BlendModes; + }; suppressEvents?: boolean; } ): Promise { @@ -301,7 +305,8 @@ class SegmentationService extends PubSubService { segmentationId, representationTypeToUse, colorLUTIndex, - isConverted + isConverted, + config ); if (!suppressEvents) { @@ -1349,12 +1354,15 @@ class SegmentationService extends PubSubService { segmentationId: string, representationType: csToolsEnums.SegmentationRepresentations, colorLUTIndex: number, - isConverted: boolean + isConverted: boolean, + config?: { + blendMode?: csEnums.BlendModes; + } ): Promise { const representation = { type: representationType, segmentationId, - config: { colorLUTOrIndex: colorLUTIndex }, + config: { colorLUTOrIndex: colorLUTIndex, ...config }, }; const addRepresentation = () => diff --git a/extensions/cornerstone/src/services/SyncGroupService/createHydrateSegmentationSynchronizer.ts b/extensions/cornerstone/src/services/SyncGroupService/createHydrateSegmentationSynchronizer.ts index 561b95d57..51bb8c404 100644 --- a/extensions/cornerstone/src/services/SyncGroupService/createHydrateSegmentationSynchronizer.ts +++ b/extensions/cornerstone/src/services/SyncGroupService/createHydrateSegmentationSynchronizer.ts @@ -1,4 +1,4 @@ -import { Types, getEnabledElementByViewportId } from '@cornerstonejs/core'; +import { Enums as CoreEnums, Types, getEnabledElementByViewportId } from '@cornerstonejs/core'; import { SynchronizerManager, Synchronizer, @@ -7,7 +7,8 @@ import { } from '@cornerstonejs/tools'; const { createSynchronizer } = SynchronizerManager; -const { SEGMENTATION_REPRESENTATION_ADDED } = Enums.Events; +const { SEGMENTATION_REPRESENTATION_MODIFIED } = Enums.Events; +const { BlendModes } = CoreEnums; export default function createHydrateSegmentationSynchronizer( synchronizerName: string, @@ -15,15 +16,16 @@ export default function createHydrateSegmentationSynchronizer( ): Synchronizer { const stackImageSynchronizer = createSynchronizer( synchronizerName, - SEGMENTATION_REPRESENTATION_ADDED, - (synchronizerInstance, sourceViewport, targetViewport, sourceEvent) => - segmentationRepresentationModifiedCallback( + SEGMENTATION_REPRESENTATION_MODIFIED, + (synchronizerInstance, sourceViewport, targetViewport, sourceEvent) => { + return segmentationRepresentationModifiedCallback( synchronizerInstance, sourceViewport, targetViewport, sourceEvent, { servicesManager, options } - ), + ); + }, { eventSource: 'eventTarget', } @@ -41,8 +43,8 @@ const segmentationRepresentationModifiedCallback = async ( ) => { const event = sourceEvent as ToolsTypes.EventTypes.SegmentationRepresentationModifiedEventType; - const { segmentationId, viewportId } = event.detail; - const { segmentationService, hangingProtocolService } = servicesManager.services; + const { segmentationId } = event.detail; + const { segmentationService } = servicesManager.services; const targetViewportId = targetViewport.viewportId; @@ -75,5 +77,9 @@ const segmentationRepresentationModifiedCallback = async ( await segmentationService.addSegmentationRepresentation(targetViewportId, { segmentationId, type, + config: { + blendMode: + viewport.getBlendMode() === 1 ? BlendModes.LABELMAP_EDGE_PROJECTION_BLEND : undefined, + }, }); }; diff --git a/extensions/default/src/ViewerLayout/ViewerHeader.tsx b/extensions/default/src/ViewerLayout/ViewerHeader.tsx index a3c7b9c0d..65ecce4da 100644 --- a/extensions/default/src/ViewerLayout/ViewerHeader.tsx +++ b/extensions/default/src/ViewerLayout/ViewerHeader.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; -import { Header, useModal } from '@ohif/ui-next'; +import { Button, Header, Icons, useModal } from '@ohif/ui-next'; import { useSystem } from '@ohif/core'; import { Toolbar } from '../Toolbar/Toolbar'; import HeaderPatientInfo from './HeaderPatientInfo'; @@ -10,7 +10,7 @@ import { PatientInfoVisibility } from './HeaderPatientInfo/HeaderPatientInfo'; import { preserveQueryParameters, publicUrl } from '@ohif/app'; function ViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config }>) { - const { servicesManager, extensionManager } = useSystem(); + const { servicesManager, extensionManager, commandsManager } = useSystem(); const { customizationService } = servicesManager.services; const navigate = useNavigate(); @@ -94,6 +94,28 @@ function ViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config } /> ) } + UndoRedo={ +
+ + +
+ } >
diff --git a/extensions/default/src/utils/Toolbox.tsx b/extensions/default/src/utils/Toolbox.tsx index 404c1ca7e..fce26bb8f 100644 --- a/extensions/default/src/utils/Toolbox.tsx +++ b/extensions/default/src/utils/Toolbox.tsx @@ -1,7 +1,8 @@ -import React from 'react'; -import { PanelSection, ToolSettings } from '@ohif/ui-next'; +import React, { useState } from 'react'; +import { Icons, PanelSection, ToolSettings } from '@ohif/ui-next'; import { useSystem, useToolbar } from '@ohif/core'; import classnames from 'classnames'; +import { useTranslation } from 'react-i18next'; interface ButtonProps { isActive?: boolean; @@ -20,7 +21,10 @@ interface ButtonProps { */ export function Toolbox({ buttonSectionId, title }: { buttonSectionId: string; title: string }) { const { servicesManager } = useSystem(); - const { toolbarService } = servicesManager.services; + const { t } = useTranslation(); + + const { toolbarService, customizationService } = servicesManager.services; + const [showConfig, setShowConfig] = useState(false); const { toolbarButtons: toolboxSections, onInteraction } = useToolbar({ servicesManager, @@ -72,12 +76,27 @@ export function Toolbox({ buttonSectionId, title }: { buttonSectionId: string; t onInteraction?.({ itemId }); }; + const CustomConfigComponent = customizationService.getCustomization(`${buttonSectionId}.config`); + return ( - - {title} + + {t(title)} + {CustomConfigComponent && ( +
+ { + e.stopPropagation(); + setShowConfig(!showConfig); + }} + /> +
+ )}
+ + {showConfig && } {toolboxSections.map(section => { const sectionId = section.componentProps.buttonSection; const buttons = toolbarService.getButtonSection(sectionId) as any[]; diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index 97c8d9116..29d2778bc 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -32,8 +32,8 @@ "start": "yarn run dev" }, "peerDependencies": { - "@cornerstonejs/core": "^3.7.1", - "@cornerstonejs/tools": "^3.7.1", + "@cornerstonejs/core": "^3.7.5", + "@cornerstonejs/tools": "^3.7.5", "@ohif/core": "3.10.0-beta.130", "@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.130", "@ohif/extension-default": "3.10.0-beta.130", diff --git a/extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/PanelROIThresholdExport.tsx b/extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/PanelROIThresholdExport.tsx index 9457adba6..8751c040f 100644 --- a/extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/PanelROIThresholdExport.tsx +++ b/extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/PanelROIThresholdExport.tsx @@ -54,7 +54,6 @@ export default function PanelRoiThresholdSegmentation({ // Find the first segmentation with a TMTV value since all of them have the same value const stats = segmentationService.getSegmentationGroupStats(segmentationIds); const tmtvValue = stats?.tmtv; - const tlgValue = stats?.tlg; return (
@@ -65,7 +64,6 @@ export default function PanelRoiThresholdSegmentation({ {'TMTV:'}
{`${tmtvValue?.toFixed(3)} mL`}
-
{`${tlgValue?.toFixed(3)} mL`}
) : null}
diff --git a/modes/preclinical-4d/src/initToolGroups.tsx b/modes/preclinical-4d/src/initToolGroups.tsx index 6f8dd0ef8..956f3a996 100644 --- a/modes/preclinical-4d/src/initToolGroups.tsx +++ b/modes/preclinical-4d/src/initToolGroups.tsx @@ -40,6 +40,7 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager, se ], passive: [ { toolName: toolNames.Length }, + { toolName: toolNames.SegmentBidirectional }, { toolName: toolNames.ArrowAnnotate }, { toolName: toolNames.Bidirectional }, { toolName: toolNames.Probe }, diff --git a/modes/segmentation/src/initToolGroups.ts b/modes/segmentation/src/initToolGroups.ts index 1f4de6ee4..f7ffbdbd8 100644 --- a/modes/segmentation/src/initToolGroups.ts +++ b/modes/segmentation/src/initToolGroups.ts @@ -67,9 +67,6 @@ function createTools(utilityModule) { parentTool: 'Brush', configuration: { activeStrategy: 'THRESHOLD_INSIDE_CIRCLE', - // preview: { - // enabled: true, - // }, threshold: { isDynamic: true, dynamicRadius: 3, @@ -79,14 +76,14 @@ function createTools(utilityModule) { { toolName: toolNames.SegmentBidirectional, }, + { + toolName: toolNames.SegmentSelect, + }, { toolName: 'ThresholdSphereBrushDynamic', parentTool: 'Brush', configuration: { activeStrategy: 'THRESHOLD_INSIDE_SPHERE', - // preview: { - // enabled: true, - // }, threshold: { isDynamic: true, dynamicRadius: 3, diff --git a/modes/tmtv/src/initToolGroups.js b/modes/tmtv/src/initToolGroups.js index 2b39c3f6a..5e64f814b 100644 --- a/modes/tmtv/src/initToolGroups.js +++ b/modes/tmtv/src/initToolGroups.js @@ -28,6 +28,7 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { ], passive: [ { toolName: toolNames.Length }, + { toolName: toolNames.SegmentBidirectional }, { toolName: toolNames.ArrowAnnotate, configuration: { diff --git a/platform/app/package.json b/platform/app/package.json index 05d59730b..810dfec12 100644 --- a/platform/app/package.json +++ b/platform/app/package.json @@ -54,7 +54,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^3.7.1", + "@cornerstonejs/dicom-image-loader": "^3.7.5", "@emotion/serialize": "^1.1.3", "@ohif/core": "3.10.0-beta.130", "@ohif/extension-cornerstone": "3.10.0-beta.130", diff --git a/platform/core/package.json b/platform/core/package.json index ef75c1435..d23e36aff 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -37,7 +37,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^3.7.1", + "@cornerstonejs/dicom-image-loader": "^3.7.5", "@ohif/ui": "3.10.0-beta.130", "cornerstone-math": "0.1.9", "dicom-parser": "^1.8.21" diff --git a/platform/core/src/defaults/hotkeyBindings.ts b/platform/core/src/defaults/hotkeyBindings.ts index 3bc3d9236..c9b818b54 100644 --- a/platform/core/src/defaults/hotkeyBindings.ts +++ b/platform/core/src/defaults/hotkeyBindings.ts @@ -167,6 +167,16 @@ const bindings = [ label: 'Delete Annotation', keys: ['backspace'], }, + { + commandName: 'acceptPreview', + label: 'Accept Preview', + keys: ['enter'], + }, + { + commandName: 'rejectPreview', + label: 'Reject Preview', + keys: ['esc'], + }, // after we have the ui for undo/redo, we can add these back in // { // commandName: 'undo', diff --git a/platform/ui-next/src/components/Header/Header.tsx b/platform/ui-next/src/components/Header/Header.tsx index 02b784099..03a573836 100644 --- a/platform/ui-next/src/components/Header/Header.tsx +++ b/platform/ui-next/src/components/Header/Header.tsx @@ -29,6 +29,7 @@ interface HeaderProps { }; PatientInfo?: ReactNode; Secondary?: ReactNode; + UndoRedo?: ReactNode; } function Header({ @@ -39,11 +40,10 @@ function Header({ isSticky = false, WhiteLabeling, PatientInfo, + UndoRedo, Secondary, ...props }: HeaderProps): ReactNode { - const { t } = useTranslation('Header'); - const onClickReturn = () => { if (isReturnEnabled && onClickReturnButton) { onClickReturnButton(); @@ -76,6 +76,8 @@ function Header({
{children}
+ {UndoRedo} +
{PatientInfo}
diff --git a/platform/ui-next/src/components/SegmentationTable/SegmentationTable.tsx b/platform/ui-next/src/components/SegmentationTable/SegmentationTable.tsx index 9a6e6b2ba..24a150993 100644 --- a/platform/ui-next/src/components/SegmentationTable/SegmentationTable.tsx +++ b/platform/ui-next/src/components/SegmentationTable/SegmentationTable.tsx @@ -1,11 +1,7 @@ import React, { ReactNode, useState, Children, isValidElement } from 'react'; import { useTranslation } from 'react-i18next'; import { PanelSection } from '../PanelSection'; -import { - SegmentationTableProvider, - SegmentationTableContextType, - ViewportSegmentationInfo, -} from './contexts'; +import { SegmentationTableProvider, SegmentationTableContextType } from './contexts'; import { SegmentationSegments } from './SegmentationSegments'; import { SegmentStatistics } from './SegmentStatistics'; import { SegmentationTableConfig } from './SegmentationTableConfig'; diff --git a/yarn.lock b/yarn.lock index 0a07e0528..bea9ec7a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1393,10 +1393,10 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cornerstonejs/adapters@^3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.7.1.tgz#9d5babdd00fc08e54aa57c14a7d36d2854ebd01c" - integrity sha512-aREkDwxmoIxBT4xJs00i7ghI9kCdKa7hmmDdCxw54lD0kI6aGLAHrwIeeYl+C19suyNH18duwuy1E/GYLfg5pA== +"@cornerstonejs/adapters@^3.7.5": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.7.5.tgz#d5199f8aef9f9ba176183f9d123b3a0e32622813" + integrity sha512-Pdrlx1dYVe/nakC7geec8QOQwqi4hJaAgTpN18y+/a7Vk3wpzj+/q+vf03lt4BhUygAu9+3t5gAUDm0kzXq02g== dependencies: "@babel/runtime-corejs2" "^7.17.8" buffer "^6.0.3" @@ -1429,20 +1429,20 @@ resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz#8690b61a86fa53ef38a70eee9d665a79229517c0" integrity sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg== -"@cornerstonejs/core@^3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.7.1.tgz#409fad60fa933219f5b1e5757c9dbaead058338c" - integrity sha512-+I6rCCFW+Am5GRJoaFdl2mD8R+Z0UXRZOBUE7hfTs0F6S8+45nOrlUccIK0UJdRq3bUc+h+G2tHW/i04FFs/mg== +"@cornerstonejs/core@^3.7.5": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.7.5.tgz#16572c18c4cdbf0ffeb6f39675025263ce2099bf" + integrity sha512-AMzZrl4nTTcoZejI3qomi5f9LNPr8QkHGconRnNe7aEjuUHUiT9uwX3ieoltJ2IDNmmqhK3wVzJ19EKVqfuESQ== dependencies: "@kitware/vtk.js" "32.12.1" comlink "^4.4.1" gl-matrix "^3.4.3" loglevel "^1.9.2" -"@cornerstonejs/dicom-image-loader@^3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.7.1.tgz#c6744624387b5a5056f416d2adebafe0fdda8a48" - integrity sha512-mfbZ4PjLIGRh9CaMGxw0I4skI0y3sG+z0SlH40m/cwWvfKj18T5iqoLVSovSnYhqCcKdSyljM/ZTAj1t0vfRVQ== +"@cornerstonejs/dicom-image-loader@^3.7.5": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.7.5.tgz#ad010a5c066f4ae4c118c2ce52625d7ee3ad665e" + integrity sha512-bDm4hx9NagD7tTU//ls+Z+U8duYgunOfLsAiU6SvNfB2vEINOSHVSnz7pAcnzfnE21ObJYnZnmH5aa8/sa/xCg== dependencies: "@cornerstonejs/codec-charls" "^1.2.3" "@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2" @@ -1454,25 +1454,25 @@ pako "^2.0.4" uuid "^9.0.0" -"@cornerstonejs/labelmap-interpolation@^3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.7.1.tgz#e82c887ffb3f2c3cba77c7ad84b26812aecd6a44" - integrity sha512-D9VwRPeWlIMfbGD9e5R+zPQLiqKmP0sz3kMN6pxEiDbHpJ6QirtgyJyzZRI3+Z68zL2mxUDNLbfw0GbYm9fhEg== +"@cornerstonejs/labelmap-interpolation@^3.7.5": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.7.5.tgz#7947d909ff667484abaa484267965c1ad6f91da9" + integrity sha512-mIdT8qzQpps1my6daRMAQDejhAAj6QGvkZyU4vbcqIHqqEnWezWFdKNWIlZhm6MX52Vy3Jnl7qBlQ8JtPd+5gQ== dependencies: "@itk-wasm/morphological-contour-interpolation" "1.1.0" itk-wasm "1.0.0-b.165" -"@cornerstonejs/polymorphic-segmentation@^3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.7.1.tgz#364a25cd10fba06dc1667d6a53b2ccd91250ffc2" - integrity sha512-CRmSSgngzQqfBIiOmVFLzcM9lmDw2ueH/Co44/RDuo437J8mTG3QfDBmKoRt0VhlkiWy+C/cVMKqHwZ63Xl7Og== +"@cornerstonejs/polymorphic-segmentation@^3.7.5": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.7.5.tgz#6c322de19dfb55cee9ca6a813821be906bea9fbb" + integrity sha512-+4T5yKjfd0b4dGqy/Tj/V5biuQgjvJVkUv7qe5xU8L/0f8irvr4XtfYoeX9Hoo/iFrYKxdI5LrC35rsKWJttpQ== dependencies: "@icr/polyseg-wasm" "0.4.0" -"@cornerstonejs/tools@^3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.7.1.tgz#19458b127b4570314f1a35d04081f59850af5bdc" - integrity sha512-OVLfmGmQBuR9Ig1ZKy35EjwRLv6zNs6q4hrXf9EoIysMSH/mYB+V4n9/FQsqnlVh4IN0DuBqkwoUmBaGSPkspQ== +"@cornerstonejs/tools@^3.7.5": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.7.5.tgz#5ecdf5669640e0fc57cbae49650aa841decba313" + integrity sha512-9GcUI0meHqsO8uzePwv7k99Knr1ta6Q0OCb5AmTKGP6u6ZSEAi1aj2pBSoFZPlG/2vhcXh2NYHkNmeLTYlTP1g== dependencies: "@types/offscreencanvas" "2019.7.3" comlink "^4.4.1"