diff --git a/bun.lock b/bun.lock
index 3bf9468eb..22d42d7dd 100644
--- a/bun.lock
+++ b/bun.lock
@@ -40,7 +40,7 @@
},
"addOns/externals/devDependencies": {
"name": "@externals/devDependencies",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@kitware/vtk.js": "32.12.0",
@@ -127,22 +127,22 @@
},
"addOns/externals/dicom-microscopy-viewer": {
"name": "@externals/dicom-microscopy-viewer",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"dicom-microscopy-viewer": "^0.46.1",
},
},
"extensions/cornerstone": {
"name": "@ohif/extension-cornerstone",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
- "@cornerstonejs/adapters": "^3.12.1",
- "@cornerstonejs/ai": "^3.12.1",
- "@cornerstonejs/core": "^3.12.1",
- "@cornerstonejs/labelmap-interpolation": "^3.12.1",
- "@cornerstonejs/polymorphic-segmentation": "^3.12.1",
- "@cornerstonejs/tools": "^3.12.1",
+ "@cornerstonejs/adapters": "^3.12.2",
+ "@cornerstonejs/ai": "^3.12.2",
+ "@cornerstonejs/core": "^3.12.2",
+ "@cornerstonejs/labelmap-interpolation": "^3.12.2",
+ "@cornerstonejs/polymorphic-segmentation": "^3.12.2",
+ "@cornerstonejs/tools": "^3.12.2",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "^1.4.1",
@@ -159,9 +159,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.12.1",
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
+ "@cornerstonejs/dicom-image-loader": "^3.12.2",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.21",
"hammerjs": "^2.0.8",
@@ -173,19 +173,19 @@
},
"extensions/cornerstone-dicom-pmap": {
"name": "@ohif/extension-cornerstone-dicom-pmap",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
- "@cornerstonejs/adapters": "^3.12.1",
- "@cornerstonejs/core": "^3.12.1",
+ "@cornerstonejs/adapters": "^3.12.2",
+ "@cornerstonejs/core": "^3.12.2",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/i18n": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/i18n": "3.11.0-beta.27",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@@ -196,16 +196,16 @@
},
"extensions/cornerstone-dicom-rt": {
"name": "@ohif/extension-cornerstone-dicom-rt",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"react-color": "^2.19.3",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/i18n": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/i18n": "3.11.0-beta.27",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@@ -216,19 +216,19 @@
},
"extensions/cornerstone-dicom-seg": {
"name": "@ohif/extension-cornerstone-dicom-seg",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
- "@cornerstonejs/adapters": "^3.12.1",
- "@cornerstonejs/core": "^3.12.1",
+ "@cornerstonejs/adapters": "^3.12.2",
+ "@cornerstonejs/core": "^3.12.2",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/i18n": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/i18n": "3.11.0-beta.27",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@@ -239,19 +239,19 @@
},
"extensions/cornerstone-dicom-sr": {
"name": "@ohif/extension-cornerstone-dicom-sr",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
- "@cornerstonejs/adapters": "^3.12.1",
- "@cornerstonejs/core": "^3.12.1",
- "@cornerstonejs/tools": "^3.12.1",
+ "@cornerstonejs/adapters": "^3.12.2",
+ "@cornerstonejs/core": "^3.12.2",
+ "@cornerstonejs/tools": "^3.12.2",
"classnames": "^2.3.2",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-measurement-tracking": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-measurement-tracking": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@@ -261,19 +261,19 @@
},
"extensions/cornerstone-dynamic-volume": {
"name": "@ohif/extension-cornerstone-dynamic-volume",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
- "@cornerstonejs/core": "^3.12.1",
- "@cornerstonejs/tools": "^3.12.1",
+ "@cornerstonejs/core": "^3.12.2",
+ "@cornerstonejs/tools": "^3.12.2",
"classnames": "^2.3.2",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/i18n": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/i18n": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.21",
"hammerjs": "^2.0.8",
@@ -283,7 +283,7 @@
},
"extensions/default": {
"name": "@ohif/extension-default",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/calculate-suv": "^1.1.0",
@@ -291,8 +291,8 @@
"lodash.uniqby": "^4.7.0",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/i18n": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/i18n": "3.11.0-beta.27",
"dcmjs": "*",
"dicomweb-client": "^0.10.4",
"prop-types": "^15.6.2",
@@ -306,7 +306,7 @@
},
"extensions/dicom-microscopy": {
"name": "@ohif/extension-dicom-microscopy",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/codec-charls": "^1.2.3",
@@ -317,10 +317,10 @@
"mathjs": "^12.4.2",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/i18n": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/i18n": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@@ -331,14 +331,14 @@
},
"extensions/dicom-pdf": {
"name": "@ohif/extension-dicom-pdf",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@@ -348,14 +348,14 @@
},
"extensions/dicom-video": {
"name": "@ohif/extension-dicom-video",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@@ -365,20 +365,20 @@
},
"extensions/measurement-tracking": {
"name": "@ohif/extension-measurement-tracking",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
- "@ohif/ui": "3.11.0-beta.24",
+ "@ohif/ui": "3.11.0-beta.27",
"@xstate/react": "^3.2.2",
"xstate": "^4.10.0",
},
"peerDependencies": {
- "@cornerstonejs/core": "^3.12.1",
- "@cornerstonejs/tools": "^3.12.1",
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
+ "@cornerstonejs/core": "^3.12.2",
+ "@cornerstonejs/tools": "^3.12.2",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
"classnames": "^2.3.2",
"dcmjs": "*",
"lodash.debounce": "^4.0.8",
@@ -391,14 +391,14 @@
},
"extensions/test-extension": {
"name": "@ohif/extension-test",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
"dcmjs": "0.38.0",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@@ -408,7 +408,7 @@
},
"extensions/tmtv": {
"name": "@ohif/extension-tmtv",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
@@ -425,7 +425,7 @@
},
"modes/basic-dev-mode": {
"name": "@ohif/mode-basic-dev-mode",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@@ -435,17 +435,17 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/extension-dicom-pdf": "3.11.0-beta.24",
- "@ohif/extension-dicom-video": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/extension-dicom-pdf": "3.11.0-beta.27",
+ "@ohif/extension-dicom-video": "3.11.0-beta.27",
},
},
"modes/basic-test-mode": {
"name": "@ohif/mode-test",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@@ -455,19 +455,19 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/extension-dicom-pdf": "3.11.0-beta.24",
- "@ohif/extension-dicom-video": "3.11.0-beta.24",
- "@ohif/extension-measurement-tracking": "3.11.0-beta.24",
- "@ohif/extension-test": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/extension-dicom-pdf": "3.11.0-beta.27",
+ "@ohif/extension-dicom-video": "3.11.0-beta.27",
+ "@ohif/extension-measurement-tracking": "3.11.0-beta.27",
+ "@ohif/extension-test": "3.11.0-beta.27",
},
},
"modes/longitudinal": {
"name": "@ohif/mode-longitudinal",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@@ -477,32 +477,32 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/extension-dicom-pdf": "3.11.0-beta.24",
- "@ohif/extension-dicom-video": "3.11.0-beta.24",
- "@ohif/extension-measurement-tracking": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/extension-dicom-pdf": "3.11.0-beta.27",
+ "@ohif/extension-dicom-video": "3.11.0-beta.27",
+ "@ohif/extension-measurement-tracking": "3.11.0-beta.27",
},
},
"modes/microscopy": {
"name": "@ohif/mode-microscopy",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
},
"peerDependencies": {
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-dicom-microscopy": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-dicom-microscopy": "3.11.0-beta.27",
},
},
"modes/preclinical-4d": {
"name": "@ohif/mode-preclinical-4d",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
},
@@ -521,7 +521,7 @@
},
"modes/segmentation": {
"name": "@ohif/mode-segmentation",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@@ -565,7 +565,7 @@
},
"modes/tmtv": {
"name": "@ohif/mode-tmtv",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@@ -586,32 +586,32 @@
},
"platform/app": {
"name": "@ohif/app",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"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.12.1",
+ "@cornerstonejs/dicom-image-loader": "^3.12.2",
"@emotion/serialize": "^1.1.3",
- "@ohif/core": "3.11.0-beta.24",
- "@ohif/extension-cornerstone": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.24",
- "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
- "@ohif/extension-default": "3.11.0-beta.24",
- "@ohif/extension-dicom-microscopy": "3.11.0-beta.24",
- "@ohif/extension-dicom-pdf": "3.11.0-beta.24",
- "@ohif/extension-dicom-video": "3.11.0-beta.24",
- "@ohif/extension-test": "3.11.0-beta.24",
- "@ohif/i18n": "3.11.0-beta.24",
- "@ohif/mode-basic-dev-mode": "3.11.0-beta.24",
- "@ohif/mode-longitudinal": "3.11.0-beta.24",
- "@ohif/mode-microscopy": "3.11.0-beta.24",
- "@ohif/mode-test": "3.11.0-beta.24",
- "@ohif/ui": "3.11.0-beta.24",
- "@ohif/ui-next": "3.11.0-beta.24",
+ "@ohif/core": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.27",
+ "@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
+ "@ohif/extension-default": "3.11.0-beta.27",
+ "@ohif/extension-dicom-microscopy": "3.11.0-beta.27",
+ "@ohif/extension-dicom-pdf": "3.11.0-beta.27",
+ "@ohif/extension-dicom-video": "3.11.0-beta.27",
+ "@ohif/extension-test": "3.11.0-beta.27",
+ "@ohif/i18n": "3.11.0-beta.27",
+ "@ohif/mode-basic-dev-mode": "3.11.0-beta.27",
+ "@ohif/mode-longitudinal": "3.11.0-beta.27",
+ "@ohif/mode-microscopy": "3.11.0-beta.27",
+ "@ohif/mode-test": "3.11.0-beta.27",
+ "@ohif/ui": "3.11.0-beta.27",
+ "@ohif/ui-next": "3.11.0-beta.27",
"@svgr/webpack": "^8.1.0",
"@types/react": "^18.3.3",
"classnames": "^2.3.2",
@@ -652,7 +652,7 @@
},
"platform/cli": {
"name": "@ohif/cli",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"bin": {
"ohif-cli": "src/index.js",
},
@@ -676,7 +676,7 @@
},
"platform/core": {
"name": "@ohif/core",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"dcmjs": "*",
@@ -701,16 +701,16 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
- "@cornerstonejs/core": "^3.12.1",
- "@cornerstonejs/dicom-image-loader": "^3.12.1",
- "@ohif/ui": "3.11.0-beta.24",
+ "@cornerstonejs/core": "^3.12.2",
+ "@cornerstonejs/dicom-image-loader": "^3.12.2",
+ "@ohif/ui": "3.11.0-beta.27",
"cornerstone-math": "0.1.9",
"dicom-parser": "^1.8.21",
},
},
"platform/i18n": {
"name": "@ohif/i18n",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next-locize-backend": "^2.0.0",
@@ -735,7 +735,7 @@
},
"platform/ui": {
"name": "@ohif/ui",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@testing-library/react": "^13.1.0",
"browser-detect": "^0.2.28",
@@ -795,7 +795,7 @@
},
"platform/ui-next": {
"name": "@ohif/ui-next",
- "version": "3.11.0-beta.24",
+ "version": "3.11.0-beta.27",
"dependencies": {
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-checkbox": "^1.1.1",
@@ -1106,9 +1106,9 @@
"@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="],
- "@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.12.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.12.1", "@cornerstonejs/tools": "^3.12.1" } }, "sha512-2HrqwpTTE5d7UNzjbp8TDYucf2j36sENfd3gK1k0Ui6na4yfEiHecNZgy6x6y5M5DcKzXofl2a64XvXXYYotzQ=="],
+ "@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.12.2", "", { "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.12.2", "@cornerstonejs/tools": "^3.12.2" } }, "sha512-yKPT9U1/CUtXu/h3xXB8KYX3x3bHgedw3nPX6eOn8oDhynfjuvA+i+4xJxKtO182mi2WnAQwFPnzkgmEVyrSqA=="],
- "@cornerstonejs/ai": ["@cornerstonejs/ai@3.12.1", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "lodash.clonedeep": "^4.5.0", "ndarray": "^1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1", "@cornerstonejs/tools": "^3.12.1" } }, "sha512-tey1CUoufVX+SogsyR9Yaljxhs6mKk0MBX0rAThgbphb74PFlDC3Kl9AcYBFJNjRcIy6K0cIR4e1/RtKFGsPeQ=="],
+ "@cornerstonejs/ai": ["@cornerstonejs/ai@3.12.2", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "lodash.clonedeep": "^4.5.0", "ndarray": "^1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@cornerstonejs/tools": "^3.12.2" } }, "sha512-Btyey9KNcJqzIG7trFqDHo08zJVO3XtVEbfbJiUfRoztwQTKrtxOJ40dsz3pU3+PNQgG0bmTPhe9yRSpcVdwRA=="],
"@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="],
@@ -1120,15 +1120,15 @@
"@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="],
- "@cornerstonejs/core": ["@cornerstonejs/core@3.12.1", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-pWFbobllPu0mjnAbV6/4U+YaRKoY661yNCdw1BUvm0Vs/FVNGz0E61/VVtZfS2L/gatj3SBpYPTw6k6G9wk1AA=="],
+ "@cornerstonejs/core": ["@cornerstonejs/core@3.12.2", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-AKFHr7XF5zKUo1BiclJmUz913yD9NiQgLl3krTmvtlWPuOUhpxoCfipW0De5dMeVuQ86iQDV1F+p7HuWOWfdwg=="],
- "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.12.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.12.1" } }, "sha512-HX4++HYN0Lx8g8fTTVbp7DPsEWJHXRDqO9nuiJzgr9b79nMp1rrybTcP07RIXY38iCsSBr17WIkPWMxdby4nPw=="],
+ "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.12.2", "", { "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.12.2" } }, "sha512-LaKnv5OPMlRPzkuqReVl1Gpa9ERTQJXl/1/Iku9wbWjnGrkzdF4Ef8bG0DseLx57qMOJPJP++PsxeXCaOgXvyw=="],
- "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@3.12.1", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1", "@cornerstonejs/tools": "^3.12.1", "@kitware/vtk.js": "32.12.1" } }, "sha512-ikTaajRrtNgjPrtcwqaac59uRX3JMIttOLLQgHR9qt7UNNs91BrbkoKGZkVER5YL3R+9o7olKUgdgprxVKE/Cw=="],
+ "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@3.12.2", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@cornerstonejs/tools": "^3.12.2", "@kitware/vtk.js": "32.12.1" } }, "sha512-5T2OtNyV2jMy66k2clG/Krk1x4xFOxlS9sGxT1eMOrELClzpY+cL+IuA6f0aD6vTwkp1fFojEIa0IFbwuCK8HQ=="],
- "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@3.12.1", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1", "@cornerstonejs/tools": "^3.12.1", "@kitware/vtk.js": "32.12.1" } }, "sha512-gdDq1Qh3c37IZxaTwE4k9dEQE7CzQ1anfDg9foiJnJkBHVwgWpMiC/ztSa+c22LgN6ksQnWDz5TGIHqJ+ozscQ=="],
+ "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@3.12.2", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@cornerstonejs/tools": "^3.12.2", "@kitware/vtk.js": "32.12.1" } }, "sha512-pmOpmOKUaAM3EIklZLufWJ9IVTRpp54MF+B6cnirGEYYobjFT+uTrLwrExwVC1kEVHi8o4n5X8SJnawtIu/ugA=="],
- "@cornerstonejs/tools": ["@cornerstonejs/tools@3.12.1", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.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-0Yax5NIdX1X6ELMf32rticoTehPFh2k0OTx/znAf3IgMUYdsox4peMe8Lf72MrFvmLeDvtyB45iT0Xk6bjeAvw=="],
+ "@cornerstonejs/tools": ["@cornerstonejs/tools@3.12.2", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@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-Zx9BFl2OAuCQGrr6o+e1tV3fMSoAARC7HlVWprUrGWwDA29LVRxQT+cc+Wo76GjxcKSMo5RuLt1+sgRj0+CsAA=="],
"@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
diff --git a/extensions/cornerstone-dicom-pmap/package.json b/extensions/cornerstone-dicom-pmap/package.json
index a0f3cfd0c..f14960d88 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.12.1",
- "@cornerstonejs/core": "^3.12.1",
+ "@cornerstonejs/adapters": "^3.12.2",
+ "@cornerstonejs/core": "^3.12.2",
"@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 b260aa258..ebed75152 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.12.1",
- "@cornerstonejs/core": "^3.12.1",
+ "@cornerstonejs/adapters": "^3.12.2",
+ "@cornerstonejs/core": "^3.12.2",
"@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 585fcd775..95037f413 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.12.1",
- "@cornerstonejs/core": "^3.12.1",
- "@cornerstonejs/tools": "^3.12.1",
+ "@cornerstonejs/adapters": "^3.12.2",
+ "@cornerstonejs/core": "^3.12.2",
+ "@cornerstonejs/tools": "^3.12.2",
"classnames": "^2.3.2"
}
}
diff --git a/extensions/cornerstone-dynamic-volume/package.json b/extensions/cornerstone-dynamic-volume/package.json
index 2c61e5b9c..3819db8a2 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.12.1",
- "@cornerstonejs/tools": "^3.12.1",
+ "@cornerstonejs/core": "^3.12.2",
+ "@cornerstonejs/tools": "^3.12.2",
"classnames": "^2.3.2"
}
}
diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json
index 77ee9c029..5edb2a523 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.12.1",
+ "@cornerstonejs/dicom-image-loader": "^3.12.2",
"@ohif/core": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
@@ -51,12 +51,12 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
- "@cornerstonejs/adapters": "^3.12.1",
- "@cornerstonejs/ai": "^3.12.1",
- "@cornerstonejs/core": "^3.12.1",
- "@cornerstonejs/labelmap-interpolation": "^3.12.1",
- "@cornerstonejs/polymorphic-segmentation": "^3.12.1",
- "@cornerstonejs/tools": "^3.12.1",
+ "@cornerstonejs/adapters": "^3.12.2",
+ "@cornerstonejs/ai": "^3.12.2",
+ "@cornerstonejs/core": "^3.12.2",
+ "@cornerstonejs/labelmap-interpolation": "^3.12.2",
+ "@cornerstonejs/polymorphic-segmentation": "^3.12.2",
+ "@cornerstonejs/tools": "^3.12.2",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "^1.4.1",
diff --git a/extensions/cornerstone/src/getSopClassHandlerModule.js b/extensions/cornerstone/src/getSopClassHandlerModule.js
index a8accad0c..e5767efb1 100644
--- a/extensions/cornerstone/src/getSopClassHandlerModule.js
+++ b/extensions/cornerstone/src/getSopClassHandlerModule.js
@@ -17,6 +17,7 @@ const SOPClassHandlerId =
'@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler';
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {
+ const dataSource = extensionManager.getActiveDataSource()[0];
// If the series has no instances, stop here
if (!instances || !instances.length) {
throw new Error('No instances were provided');
@@ -33,22 +34,6 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
currentFrames = framesI;
}
}
- let imageIdForThumbnail = null;
- const dataSource = extensionManager.getActiveDataSource()[0];
- if (singleFrameInstance) {
- if (currentFrames == 1) {
- // Not all DICOM server implementations support thumbnail service,
- // So if we have a single-frame image, we will prefer it.
- imageIdForThumbnail = singleFrameInstance.imageId;
- }
- if (!imageIdForThumbnail) {
- // use the thumbnail service provided by DICOM server
- imageIdForThumbnail = dataSource.getImageIdsForInstance({
- instance: singleFrameInstance,
- thumbnail: true,
- });
- }
- }
const {
FrameOfReferenceUID,
@@ -108,11 +93,14 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
instance,
numImageFrames: 0,
numInstances: 1,
- imageIdForThumbnail, // thumbnail image
others: instances, // all other level instances in the image Pyramid
instances,
othersFrameOfReferenceUID,
imageIds: instances.map(instance => instance.imageId),
+ getThumbnailSrc: dataSource.retrieve.getGetThumbnailSrc?.(
+ singleFrameInstance,
+ singleFrameInstance.imageId
+ ),
label: SeriesDescription || `${i18n.t('Series')} ${SeriesNumber} - ${i18n.t('SM')}`,
};
// The microscopy viewer directly accesses the metadata already loaded, and
diff --git a/extensions/default/src/DicomWebDataSource/index.ts b/extensions/default/src/DicomWebDataSource/index.ts
index 77df834fa..8308e8e1f 100644
--- a/extensions/default/src/DicomWebDataSource/index.ts
+++ b/extensions/default/src/DicomWebDataSource/index.ts
@@ -37,7 +37,15 @@ export type DicomWebConfig = {
wadoUri?: string; // - Base URL to use for WADO URI requests
qidoSupportsIncludeField?: boolean; // - Whether QIDO supports the "Include" option to request additional fields in response
imageRendering?: string; // - wadors | ? (unsure of where/how this is used)
- thumbnailRendering?: string; // - wadors | ? (unsure of where/how this is used)
+ thumbnailRendering?: string;
+ /**
+ wadors - render using the wadors fetch. The full image is retrieved and rendered in cornerstone to thumbnail size png and returned as binary data to the src attribute of the image tag.
+ for example,
+ thumbnailDirect - get the direct url endpoint for the thumbnail as the image src (eg not authentication required).
+ for example,
+ thumbnail - render using the thumbnail endpoint on wadors using bulkDataURI, passing authentication params to the url.
+ rendered - should use the rendered endpoint instead of the thumbnail endpoint
+*/
/** Whether the server supports reject calls (i.e. DCM4CHEE) */
supportsReject?: boolean;
/** Request series meta async instead of blocking */
@@ -225,6 +233,71 @@ function createDicomWebApi(dicomWebConfig: DicomWebConfig, servicesManager) {
* @returns an absolute URL to the resource, if the absolute URL can be retrieved as singlepart,
* or is already retrieved, or a promise to a URL for such use if a BulkDataURI
*/
+
+ getGetThumbnailSrc: function (instance, imageId) {
+ if (dicomWebConfig.thumbnailRendering === 'wadors') {
+ return function getThumbnailSrc(options) {
+ if (!imageId) {
+ return null;
+ }
+ if (!options?.getImageSrc) {
+ return null;
+ }
+ return options.getImageSrc(imageId);
+ };
+ }
+ if (dicomWebConfig.thumbnailRendering === 'thumbnailDirect') {
+ return function getThumbnailSrc() {
+ return this.directURL({
+ instance: instance,
+ defaultPath: '/thumbnail',
+ defaultType: 'image/jpeg',
+ singlepart: true,
+ tag: 'Absent',
+ });
+ }.bind(this);
+ }
+
+ if (dicomWebConfig.thumbnailRendering === 'thumbnail') {
+ return async function getThumbnailSrc() {
+ const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;
+ const bulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}/thumbnail?accept=image/jpeg`;
+ return URL.createObjectURL(
+ new Blob(
+ [
+ await this.bulkDataURI({
+ BulkDataURI: bulkDataURI.replace('wadors:', ''),
+ defaultType: 'image/jpeg',
+ mediaTypes: ['image/jpeg'],
+ thumbnail: true,
+ }),
+ ],
+ { type: 'image/jpeg' }
+ )
+ );
+ }.bind(this);
+ }
+ if (dicomWebConfig.thumbnailRendering === 'rendered') {
+ return async function getThumbnailSrc() {
+ const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;
+ const bulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}/rendered?accept=image/jpeg`;
+ return URL.createObjectURL(
+ new Blob(
+ [
+ await this.bulkDataURI({
+ BulkDataURI: bulkDataURI.replace('wadors:', ''),
+ defaultType: 'image/jpeg',
+ mediaTypes: ['image/jpeg'],
+ thumbnail: true,
+ }),
+ ],
+ { type: 'image/jpeg' }
+ )
+ );
+ }.bind(this);
+ }
+ },
+
directURL: params => {
return getDirectURL(
{
diff --git a/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx b/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx
index cac2fa2e0..2ba136673 100644
--- a/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx
+++ b/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx
@@ -10,17 +10,7 @@ import { CallbackCustomization } from 'platform/core/src/types';
const { sortStudyInstances, formatDate, createStudyBrowserTabs } = utils;
-const thumbnailNoImageModalities = [
- 'SR',
- 'SEG',
- 'SM',
- 'RTSTRUCT',
- 'RTPLAN',
- 'RTDOSE',
- 'DOC',
- 'OT',
- 'PMAP',
-];
+const thumbnailNoImageModalities = ['SR', 'SEG', 'RTSTRUCT', 'RTPLAN', 'RTDOSE', 'DOC', 'PMAP'];
/**
* Study Browser component that displays and manages studies and their display sets
@@ -178,7 +168,7 @@ function PanelStudyBrowser({
let currentDisplaySets = displaySetService.activeDisplaySets;
// filter non based on the list of modalities that are supported by cornerstone
currentDisplaySets = currentDisplaySets.filter(
- ds => !thumbnailNoImageModalities.includes(ds.Modality)
+ ds => !thumbnailNoImageModalities.includes(ds.Modality) || ds.thumbnailSrc === null
);
if (!currentDisplaySets.length) {
@@ -188,20 +178,20 @@ function PanelStudyBrowser({
currentDisplaySets.forEach(async dSet => {
const newImageSrcEntry = {};
const displaySet = displaySetService.getDisplaySetByUID(dSet.displaySetInstanceUID);
- const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);
+ const imageIds = dataSource.getImageIdsForDisplaySet(dSet);
const imageId = getImageIdForThumbnail(displaySet, imageIds);
// TODO: Is it okay that imageIds are not returned here for SR displaySets?
- if (!imageId || displaySet?.unsupported) {
+ if (displaySet?.unsupported) {
return;
}
// When the image arrives, render it and store the result in the thumbnailImgSrcMap
let { thumbnailSrc } = displaySet;
if (!thumbnailSrc && displaySet.getThumbnailSrc) {
- thumbnailSrc = await displaySet.getThumbnailSrc();
+ thumbnailSrc = await displaySet.getThumbnailSrc({ getImageSrc });
}
- if (!thumbnailSrc) {
+ if (!thumbnailSrc && imageId) {
const thumbnailSrc = await getImageSrc(imageId);
displaySet.thumbnailSrc = thumbnailSrc;
}
@@ -253,13 +243,11 @@ function PanelStudyBrowser({
const { displaySetsAdded, options } = data;
displaySetsAdded.forEach(async dSet => {
const displaySetInstanceUID = dSet.displaySetInstanceUID;
-
const newImageSrcEntry = {};
const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
if (displaySet?.unsupported) {
return;
}
-
if (options?.madeInClient) {
setJumpToDisplaySet(displaySetInstanceUID);
}
@@ -275,7 +263,7 @@ function PanelStudyBrowser({
// When the image arrives, render it and store the result in the thumbnailImgSrcMap
let { thumbnailSrc } = displaySet;
if (!thumbnailSrc && displaySet.getThumbnailSrc) {
- thumbnailSrc = await displaySet.getThumbnailSrc();
+ thumbnailSrc = await displaySet.getThumbnailSrc({ getImageSrc });
}
if (!thumbnailSrc) {
thumbnailSrc = await getImageSrc(imageId);
@@ -512,7 +500,11 @@ function _mapDisplaySets(displaySets, displaySetLoadingState, thumbnailImageSrcM
}
function _getComponentType(ds) {
- if (thumbnailNoImageModalities.includes(ds.Modality) || ds?.unsupported) {
+ if (
+ thumbnailNoImageModalities.includes(ds.Modality) ||
+ ds?.unsupported ||
+ ds.thumbnailSrc === null
+ ) {
return 'thumbnailNoImage';
}
diff --git a/extensions/default/src/getSopClassHandlerModule.js b/extensions/default/src/getSopClassHandlerModule.js
index 3d2781ecd..0849238cb 100644
--- a/extensions/default/src/getSopClassHandlerModule.js
+++ b/extensions/default/src/getSopClassHandlerModule.js
@@ -5,7 +5,13 @@ import getDisplaySetMessages from './getDisplaySetMessages';
import getDisplaySetsFromUnsupportedSeries from './getDisplaySetsFromUnsupportedSeries';
import { chartHandler } from './SOPClassHandlers/chartSOPClassHandler';
-const { isImage, sopClassDictionary, isDisplaySetReconstructable } = utils;
+const {
+ isImage,
+ sortStudyInstances,
+ instancesSortCriteria,
+ sopClassDictionary,
+ isDisplaySetReconstructable,
+} = utils;
const { ImageSet } = classes;
const DEFAULT_VOLUME_LOADER_SCHEME = 'cornerstoneStreamingImageVolume';
@@ -62,9 +68,12 @@ function getDisplaySetInfo(instances) {
}
const makeDisplaySet = instances => {
+ // Need to sort the instances in order to get a consistent instance/thumbnail
+ sortStudyInstances(instances);
const instance = instances[0];
const imageSet = new ImageSet(instances);
-
+ const { extensionManager } = appContext;
+ const dataSource = extensionManager.getActiveDataSource()[0];
const {
isDynamicVolume,
value: isReconstructable,
@@ -79,6 +88,16 @@ const makeDisplaySet = instances => {
// set appropriate attributes to image set...
const messages = getDisplaySetMessages(instances, isReconstructable, isDynamicVolume);
+ const imageIds = dataSource.getImageIdsForDisplaySet(imageSet);
+ let imageId = imageIds[Math.floor(imageIds.length / 2)];
+ let thumbnailInstance = instances[Math.floor(instances.length / 2)];
+ if (isDynamicVolume) {
+ const timePoints = dynamicVolumeInfo.timePoints;
+ const middleIndex = Math.floor(timePoints.length / 2);
+ const middleTimePointImageIds = timePoints[middleIndex];
+ imageId = middleTimePointImageIds[Math.floor(middleTimePointImageIds.length / 2)];
+ }
+
imageSet.setAttributes({
volumeLoaderSchema,
displaySetInstanceUID: imageSet.uid, // create a local alias for the imageSet UID
@@ -100,6 +119,7 @@ const makeDisplaySet = instances => {
averageSpacingBetweenFrames: averageSpacingBetweenFrames || null,
isDynamicVolume,
dynamicVolumeInfo,
+ getThumbnailSrc: dataSource.retrieve.getGetThumbnailSrc?.(thumbnailInstance, imageId),
supportsWindowLevel: true,
label:
instance.SeriesDescription ||
@@ -107,14 +127,7 @@ const makeDisplaySet = instances => {
FrameOfReferenceUID: instance.FrameOfReferenceUID,
});
- // Sort the images in this series if needed
- const shallSort = true; //!OHIF.utils.ObjectPath.get(Meteor, 'settings.public.ui.sortSeriesByIncomingOrder');
- if (shallSort) {
- imageSet.sortBy((a, b) => {
- // Sort by InstanceNumber (0020,0013)
- return (parseInt(a.InstanceNumber) || 0) - (parseInt(b.InstanceNumber) || 0);
- });
- }
+ imageSet.sortBy(instancesSortCriteria.default);
// Include the first image instance number (after sorted)
/*imageSet.setAttribute(
@@ -178,10 +191,8 @@ function getDisplaySetsFromSeries(instances) {
}
let displaySet;
-
if (isMultiFrame(instance)) {
displaySet = makeDisplaySet([instance]);
-
displaySet.setAttributes({
sopClassUids,
numImageFrames: instance.NumberOfFrames,
diff --git a/extensions/dicom-pdf/src/getSopClassHandlerModule.js b/extensions/dicom-pdf/src/getSopClassHandlerModule.js
index fd16d83bf..d720ccb30 100644
--- a/extensions/dicom-pdf/src/getSopClassHandlerModule.js
+++ b/extensions/dicom-pdf/src/getSopClassHandlerModule.js
@@ -14,7 +14,7 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
const { Modality, SOPInstanceUID } = instance;
const { SeriesDescription = 'PDF', MIMETypeOfEncapsulatedDocument } = instance;
const { SeriesNumber, SeriesDate, SeriesInstanceUID, StudyInstanceUID, SOPClassUID } = instance;
- const pdfUrl = dataSource.retrieve.directURL({
+ const renderedUrl = dataSource.retrieve.directURL({
instance,
tag: 'EncapsulatedDocument',
defaultType: MIMETypeOfEncapsulatedDocument || 'application/pdf',
@@ -35,14 +35,9 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
SOPClassUID,
referencedImages: null,
measurements: null,
- pdfUrl,
+ renderedUrl: renderedUrl,
instances: [instance],
- thumbnailSrc: dataSource.retrieve.directURL({
- instance,
- defaultPath: '/thumbnail',
- defaultType: 'image/jpeg',
- tag: 'Absent',
- }),
+ thumbnailSrc: null,
isDerivedDisplaySet: true,
isLoaded: false,
sopClassUids,
diff --git a/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx b/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx
index 8c60fd92a..e0d62d782 100644
--- a/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx
+++ b/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx
@@ -28,15 +28,15 @@ function OHIFCornerstonePdfViewport({ displaySets }) {
);
}
- const { pdfUrl } = displaySets[0];
+ const { renderedUrl } = displaySets[0];
useEffect(() => {
const load = async () => {
- setUrl(await pdfUrl);
+ setUrl(await renderedUrl);
};
load();
- }, [pdfUrl]);
+ }, [renderedUrl]);
return (