feat(thumbnails): Enhance DICOM Thumbnail Rendering with different strategies (#5004)
Co-authored-by: Martin Bellehumeur, M. Eng. <23396581+mbellehumeur@users.noreply.github.com>
278
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=="],
|
||||
|
||||
|
||||
@ -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"
|
||||
}
|
||||
|
||||
@ -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"
|
||||
}
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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, <img src=data:image/png;base64,sdlfk;adkfadfk....asldfjkl;asdkf>
|
||||
thumbnailDirect - get the direct url endpoint for the thumbnail as the image src (eg not authentication required).
|
||||
for example, <img src=http://server:port/wadors/studies/1.2.3/thumbnail?accept=image/jpeg>
|
||||
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(
|
||||
{
|
||||
|
||||
@ -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';
|
||||
}
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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 (
|
||||
<div
|
||||
|
||||
@ -32,6 +32,8 @@ const supportedTransferSyntaxUIDs = Object.values(SupportedTransferSyntaxes);
|
||||
|
||||
const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager) => {
|
||||
const dataSource = extensionManager.getActiveDataSource()[0];
|
||||
const thumbnailSrc = null;
|
||||
console.warn('dataSource=', dataSource);
|
||||
return instances
|
||||
.filter(metadata => {
|
||||
const tsuid =
|
||||
@ -75,16 +77,9 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
|
||||
referencedImages: null,
|
||||
measurements: null,
|
||||
viewportType: csEnums.ViewportType.VIDEO,
|
||||
// The videoUrl is deprecated, the preferred URL is renderedUrl
|
||||
videoUrl,
|
||||
renderedUrl: videoUrl,
|
||||
instances: [instance],
|
||||
thumbnailSrc: dataSource.retrieve.directURL({
|
||||
instance,
|
||||
defaultPath: '/thumbnail',
|
||||
defaultType: 'image/jpeg',
|
||||
tag: 'Absent',
|
||||
}),
|
||||
getThumbnailSrc: dataSource.retrieve.getGetThumbnailSrc?.(instance),
|
||||
thumbnailSrc,
|
||||
imageIds: [imageId],
|
||||
isDerivedDisplaySet: true,
|
||||
isLoaded: false,
|
||||
|
||||
@ -32,8 +32,8 @@
|
||||
"start": "yarn run dev"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@cornerstonejs/core": "^3.12.1",
|
||||
"@cornerstonejs/tools": "^3.12.1",
|
||||
"@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",
|
||||
|
||||
@ -5,17 +5,7 @@ import PanelStudyBrowser from '@ohif/extension-default/src/Panels/StudyBrowser/P
|
||||
import { UntrackSeriesModal } from './untrackSeriesModal';
|
||||
import { useTrackedMeasurements } from '../../getContextModule';
|
||||
|
||||
const thumbnailNoImageModalities = [
|
||||
'SR',
|
||||
'SEG',
|
||||
'SM',
|
||||
'RTSTRUCT',
|
||||
'RTPLAN',
|
||||
'RTDOSE',
|
||||
'DOC',
|
||||
'OT',
|
||||
'PMAP',
|
||||
];
|
||||
const thumbnailNoImageModalities = ['SR', 'SEG', 'RTSTRUCT', 'RTPLAN', 'RTDOSE', 'PMAP'];
|
||||
|
||||
/**
|
||||
* Panel component for the Study Browser with tracking capabilities
|
||||
@ -126,7 +116,11 @@ export default function PanelStudyBrowserTracking({
|
||||
|
||||
// Override component type to use tracking specific components
|
||||
const getComponentType = ds => {
|
||||
if (thumbnailNoImageModalities.includes(ds.Modality) || ds?.unsupported) {
|
||||
if (
|
||||
thumbnailNoImageModalities.includes(ds.Modality) ||
|
||||
ds.unsupported ||
|
||||
ds.thumbnailSrc === null
|
||||
) {
|
||||
return 'thumbnailNoImage';
|
||||
}
|
||||
return 'thumbnailTracked';
|
||||
|
||||
@ -57,8 +57,9 @@
|
||||
"test:e2e:coverage": "nyc --reporter=html yarn run test:e2e:ci",
|
||||
"test:e2e:ci": "TEST_ENV=true npx playwright test",
|
||||
"test:e2e:ui": "TEST_ENV=true npx playwright test --ui",
|
||||
"test:e2e:reporter": "TEST_ENV=true npx playwright test --reporter=html -g @debug",
|
||||
"test:e2e:update": "TEST_ENV=true npx playwright test --reporter=html -g @debug --update-snapshots",
|
||||
"test:e2e:reporter": "TEST_ENV=true npx playwright test --reporter=html",
|
||||
"test:e2e:update": "TEST_ENV=true npx playwright test --reporter=html --update-snapshots",
|
||||
"test:e2e:update:debug": "TEST_ENV=true npx playwright test -g @debug --reporter=html --update-snapshots ",
|
||||
"test:e2e:headed": "TEST_ENV=true npx playwright test --headed",
|
||||
"test:e2e:debug": "TEST_ENV=true npx playwright test --debug",
|
||||
"test:e2e:dist": "lerna run test:e2e:dist --stream",
|
||||
|
||||
@ -5,11 +5,11 @@ describe('OHIF Video Display', function () {
|
||||
});
|
||||
|
||||
it('checks if series thumbnails are being displayed', function () {
|
||||
cy.get('[data-cy="study-browser-thumbnail-no-image"]').its('length').should('be.gt', 1);
|
||||
cy.get('[data-cy="study-browser-thumbnail-no-image"]').its('length').should('be.eq', 1);
|
||||
});
|
||||
|
||||
it('performs double-click to load thumbnail in active viewport', () => {
|
||||
cy.get('[data-cy="study-browser-thumbnail-no-image"]:nth-child(2)').dblclick();
|
||||
cy.get('[data-cy="study-browser-thumbnail-no-image"]:nth-child(1)').dblclick();
|
||||
|
||||
//const expectedText = 'Ser: 3';
|
||||
//cy.get('@viewportInfoBottomLeft').should('contains.text', expectedText);
|
||||
|
||||
@ -53,7 +53,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",
|
||||
"@emotion/serialize": "^1.1.3",
|
||||
"@ohif/core": "3.11.0-beta.27",
|
||||
"@ohif/extension-cornerstone": "3.11.0-beta.27",
|
||||
|
||||
@ -138,7 +138,7 @@ window.config = {
|
||||
supportsReject: true,
|
||||
supportsStow: true,
|
||||
imageRendering: 'wadors',
|
||||
thumbnailRendering: 'wadors',
|
||||
thumbnailRendering: 'thumbnail',
|
||||
enableStudyLazyLoad: true,
|
||||
supportsFuzzyMatching: false,
|
||||
supportsWildcard: true,
|
||||
|
||||
@ -136,7 +136,7 @@ window.config = {
|
||||
supportsReject: true,
|
||||
supportsStow: true,
|
||||
imageRendering: 'wadors',
|
||||
thumbnailRendering: 'wadors',
|
||||
thumbnailRendering: 'thumbnail',
|
||||
enableStudyLazyLoad: true,
|
||||
supportsFuzzyMatching: false,
|
||||
supportsWildcard: true,
|
||||
|
||||
@ -37,8 +37,8 @@
|
||||
"@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",
|
||||
"@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"
|
||||
|
||||
@ -18,10 +18,21 @@ export type DisplaySet = {
|
||||
isOverlayDisplaySet?: boolean;
|
||||
|
||||
// Details about how to display:
|
||||
/** A URL that can be used to display the thumbnail. Typically a data url */
|
||||
/**
|
||||
* A URL that can be used to display the thumbnail. Typically a data url
|
||||
* This can be set to null to avoid trying to display a thumbnail, eg for
|
||||
* display sets without a thumbnail.
|
||||
*/
|
||||
thumbnailSrc?: string;
|
||||
/** A fetch method to get the thumbnail */
|
||||
getThumbnailSrc?(imageId?: string): Promise<string>;
|
||||
|
||||
/**
|
||||
* A fetch URL to display the content. This is used for content such as
|
||||
* pdf display.
|
||||
*/
|
||||
renderedUrl?: string;
|
||||
|
||||
SeriesDate?: string;
|
||||
SeriesTime?: string;
|
||||
instance?: InstanceMetadata;
|
||||
|
||||
@ -35,6 +35,7 @@ import {
|
||||
sortStudyInstances,
|
||||
sortingCriteria,
|
||||
seriesSortCriteria,
|
||||
instancesSortCriteria,
|
||||
} from './sortStudy';
|
||||
import { splitComma, getSplitParam } from './splitComma';
|
||||
import { createStudyBrowserTabs } from './createStudyBrowserTabs';
|
||||
@ -56,6 +57,7 @@ const utils = {
|
||||
sortStudyInstances,
|
||||
sortingCriteria,
|
||||
seriesSortCriteria,
|
||||
instancesSortCriteria,
|
||||
writeScript,
|
||||
formatDate,
|
||||
formatTime,
|
||||
|
||||
@ -42,7 +42,19 @@ const seriesSortCriteria = {
|
||||
};
|
||||
|
||||
const instancesSortCriteria = {
|
||||
default: (a, b) => parseInt(a.InstanceNumber) - parseInt(b.InstanceNumber),
|
||||
default: (a, b) => {
|
||||
// Sort by InstanceNumber (0020,0013)
|
||||
const aInstance = parseInt(a.InstanceNumber) || 0;
|
||||
const bInstance = parseInt(b.InstanceNumber) || 0;
|
||||
if (aInstance !== bInstance) {
|
||||
return (parseInt(a.InstanceNumber) || 0) - (parseInt(b.InstanceNumber) || 0);
|
||||
}
|
||||
// Fallback rule to enable consistent sorting
|
||||
if (a.SOPInstanceUID === b.SOPInstanceUID) {
|
||||
return 0;
|
||||
}
|
||||
return a.SOPInstanceUID < b.SOPInstanceUID ? -1 : 1;
|
||||
},
|
||||
};
|
||||
|
||||
const sortingCriteria = {
|
||||
@ -116,4 +128,11 @@ export default function sortStudy(
|
||||
return study;
|
||||
}
|
||||
|
||||
export { sortStudy, sortStudySeries, sortStudyInstances, sortingCriteria, seriesSortCriteria };
|
||||
export {
|
||||
sortStudy,
|
||||
sortStudySeries,
|
||||
sortStudyInstances,
|
||||
sortingCriteria,
|
||||
seriesSortCriteria,
|
||||
instancesSortCriteria,
|
||||
};
|
||||
|
||||
@ -8,14 +8,15 @@ summary: Guide to writing and running end-to-end tests for OHIF Viewer using Pla
|
||||
|
||||
|
||||
:::note
|
||||
You might need to run the `yarn playwright install ` for the first time if you have not
|
||||
You might need to run the `bun playwright install ` for the first time if you have not
|
||||
:::
|
||||
|
||||
# Running the tests
|
||||
|
||||
```bash
|
||||
#
|
||||
# run the tests
|
||||
yarn test:e2e:ui
|
||||
bun test:e2e:ui
|
||||
```
|
||||
|
||||
|
||||
|
||||
@ -67,12 +67,12 @@ const Thumbnail = ({
|
||||
)}
|
||||
>
|
||||
<div className="h-[114px] w-[128px]">
|
||||
<div className="relative">
|
||||
<div className="relative bg-black">
|
||||
{imageSrc ? (
|
||||
<img
|
||||
src={imageSrc}
|
||||
alt={imageAltText}
|
||||
className="h-[114px] w-[128px] rounded"
|
||||
className="h-[114px] w-[128px] rounded object-contain"
|
||||
crossOrigin="anonymous"
|
||||
/>
|
||||
) : (
|
||||
|
||||
@ -105,6 +105,8 @@ test.describe('Crosshairs Test', async () => {
|
||||
|
||||
await page.getByTestId('study-browser-thumbnail').nth(1).dblclick();
|
||||
|
||||
await page.waitForTimeout(5000);
|
||||
|
||||
await checkForScreenshot(page, page, screenShotPaths.crosshairs.crosshairsNewDisplayset);
|
||||
});
|
||||
});
|
||||
|
||||
@ -12,11 +12,14 @@ test('should properly display MPR for MR', async ({ page }) => {
|
||||
await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
|
||||
|
||||
await page.getByTestId('yes-hydrate-btn').click();
|
||||
|
||||
await page.waitForTimeout(5000);
|
||||
await checkForScreenshot(page, page, screenShotPaths.segHydrationThenMPR.segPostHydration);
|
||||
|
||||
await page.getByTestId('Layout').click();
|
||||
await page.getByTestId('Axial Primary').click();
|
||||
|
||||
await page.waitForTimeout(5000);
|
||||
await checkForScreenshot(
|
||||
page,
|
||||
page,
|
||||
|
||||
@ -5,7 +5,7 @@ test.beforeEach(async ({ page }) => {
|
||||
const studyInstanceUID =
|
||||
'1.3.12.2.1107.5.2.32.35162.30000015050317233592200000046&hangingprotocolid=mpr';
|
||||
const mode = 'viewer';
|
||||
await visitStudy(page, studyInstanceUID, mode, 2000);
|
||||
await visitStudy(page, studyInstanceUID, mode, 10000);
|
||||
});
|
||||
|
||||
test('should properly display MPR for MR', async ({ page }) => {
|
||||
|
||||
|
Before Width: | Height: | Size: 327 KiB After Width: | Height: | Size: 323 KiB |
|
Before Width: | Height: | Size: 294 KiB After Width: | Height: | Size: 289 KiB |
|
Before Width: | Height: | Size: 306 KiB After Width: | Height: | Size: 304 KiB |
|
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 298 KiB |
|
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 320 KiB After Width: | Height: | Size: 316 KiB |
|
Before Width: | Height: | Size: 257 KiB After Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 215 KiB After Width: | Height: | Size: 210 KiB |
|
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 207 KiB |
|
Before Width: | Height: | Size: 215 KiB After Width: | Height: | Size: 209 KiB |
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 261 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 252 KiB After Width: | Height: | Size: 247 KiB |
|
Before Width: | Height: | Size: 277 KiB After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 207 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 241 KiB After Width: | Height: | Size: 235 KiB |
|
Before Width: | Height: | Size: 221 KiB |
|
Before Width: | Height: | Size: 250 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 223 KiB After Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 261 KiB |
|
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 298 KiB After Width: | Height: | Size: 297 KiB |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 213 KiB |
|
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 217 KiB |
|
Before Width: | Height: | Size: 297 KiB After Width: | Height: | Size: 296 KiB |
|
Before Width: | Height: | Size: 279 KiB After Width: | Height: | Size: 282 KiB |
|
Before Width: | Height: | Size: 293 KiB After Width: | Height: | Size: 296 KiB |
|
Before Width: | Height: | Size: 217 KiB After Width: | Height: | Size: 217 KiB |
|
Before Width: | Height: | Size: 258 KiB After Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 212 KiB |
|
Before Width: | Height: | Size: 306 KiB After Width: | Height: | Size: 302 KiB |
56
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.12.1":
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.12.1.tgz#e5d546802c78981f9de6fbf2702517d9fcafb592"
|
||||
integrity sha512-2HrqwpTTE5d7UNzjbp8TDYucf2j36sENfd3gK1k0Ui6na4yfEiHecNZgy6x6y5M5DcKzXofl2a64XvXXYYotzQ==
|
||||
"@cornerstonejs/adapters@^3.12.2":
|
||||
version "3.12.2"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.12.2.tgz#835ed61cfc26257af4a37f03023f539eaeca59d1"
|
||||
integrity sha512-yKPT9U1/CUtXu/h3xXB8KYX3x3bHgedw3nPX6eOn8oDhynfjuvA+i+4xJxKtO182mi2WnAQwFPnzkgmEVyrSqA==
|
||||
dependencies:
|
||||
"@babel/runtime-corejs2" "^7.17.8"
|
||||
buffer "^6.0.3"
|
||||
@ -1404,10 +1404,10 @@
|
||||
gl-matrix "^3.4.3"
|
||||
ndarray "^1.0.19"
|
||||
|
||||
"@cornerstonejs/ai@^3.12.1":
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.12.1.tgz#b8b351a9da574dccd54acc9805ed40455733926e"
|
||||
integrity sha512-tey1CUoufVX+SogsyR9Yaljxhs6mKk0MBX0rAThgbphb74PFlDC3Kl9AcYBFJNjRcIy6K0cIR4e1/RtKFGsPeQ==
|
||||
"@cornerstonejs/ai@^3.12.2":
|
||||
version "3.12.2"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.12.2.tgz#8e55d96f15941218f0c3b5af0c992806b9a2f2d7"
|
||||
integrity sha512-Btyey9KNcJqzIG7trFqDHo08zJVO3XtVEbfbJiUfRoztwQTKrtxOJ40dsz3pU3+PNQgG0bmTPhe9yRSpcVdwRA==
|
||||
dependencies:
|
||||
"@babel/runtime-corejs2" "^7.17.8"
|
||||
buffer "^6.0.3"
|
||||
@ -1443,20 +1443,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.12.1":
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.12.1.tgz#3b165d0fa2e12bc6a60f5b2e306b8d53f6c9cad8"
|
||||
integrity sha512-pWFbobllPu0mjnAbV6/4U+YaRKoY661yNCdw1BUvm0Vs/FVNGz0E61/VVtZfS2L/gatj3SBpYPTw6k6G9wk1AA==
|
||||
"@cornerstonejs/core@^3.12.2":
|
||||
version "3.12.2"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.12.2.tgz#eeba299b27cca3664e760a9a83aa58dd0d6dc305"
|
||||
integrity sha512-AKFHr7XF5zKUo1BiclJmUz913yD9NiQgLl3krTmvtlWPuOUhpxoCfipW0De5dMeVuQ86iQDV1F+p7HuWOWfdwg==
|
||||
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.12.1":
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.12.1.tgz#8d650c1574dea90420dfe49d5aa0a305b0dd6aa7"
|
||||
integrity sha512-HX4++HYN0Lx8g8fTTVbp7DPsEWJHXRDqO9nuiJzgr9b79nMp1rrybTcP07RIXY38iCsSBr17WIkPWMxdby4nPw==
|
||||
"@cornerstonejs/dicom-image-loader@^3.12.2":
|
||||
version "3.12.2"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.12.2.tgz#ebf0915baed75ed37d38285f06c1a8e3cba7372d"
|
||||
integrity sha512-LaKnv5OPMlRPzkuqReVl1Gpa9ERTQJXl/1/Iku9wbWjnGrkzdF4Ef8bG0DseLx57qMOJPJP++PsxeXCaOgXvyw==
|
||||
dependencies:
|
||||
"@cornerstonejs/codec-charls" "^1.2.3"
|
||||
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"
|
||||
@ -1468,25 +1468,25 @@
|
||||
pako "^2.0.4"
|
||||
uuid "^9.0.0"
|
||||
|
||||
"@cornerstonejs/labelmap-interpolation@^3.12.1":
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.12.1.tgz#74f3583634c3150cb38dd81d9be1a4668bf1e64f"
|
||||
integrity sha512-ikTaajRrtNgjPrtcwqaac59uRX3JMIttOLLQgHR9qt7UNNs91BrbkoKGZkVER5YL3R+9o7olKUgdgprxVKE/Cw==
|
||||
"@cornerstonejs/labelmap-interpolation@^3.12.2":
|
||||
version "3.12.2"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.12.2.tgz#e1682f97592b09a5246e33b4ab110a694b2f281b"
|
||||
integrity sha512-5T2OtNyV2jMy66k2clG/Krk1x4xFOxlS9sGxT1eMOrELClzpY+cL+IuA6f0aD6vTwkp1fFojEIa0IFbwuCK8HQ==
|
||||
dependencies:
|
||||
"@itk-wasm/morphological-contour-interpolation" "1.1.0"
|
||||
itk-wasm "1.0.0-b.165"
|
||||
|
||||
"@cornerstonejs/polymorphic-segmentation@^3.12.1":
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.12.1.tgz#b80d133c533c5e93a680521c618d5521efb37645"
|
||||
integrity sha512-gdDq1Qh3c37IZxaTwE4k9dEQE7CzQ1anfDg9foiJnJkBHVwgWpMiC/ztSa+c22LgN6ksQnWDz5TGIHqJ+ozscQ==
|
||||
"@cornerstonejs/polymorphic-segmentation@^3.12.2":
|
||||
version "3.12.2"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.12.2.tgz#80be77b1d46ff5c6edd8346099d239cf6504298a"
|
||||
integrity sha512-pmOpmOKUaAM3EIklZLufWJ9IVTRpp54MF+B6cnirGEYYobjFT+uTrLwrExwVC1kEVHi8o4n5X8SJnawtIu/ugA==
|
||||
dependencies:
|
||||
"@icr/polyseg-wasm" "0.4.0"
|
||||
|
||||
"@cornerstonejs/tools@^3.12.1":
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.12.1.tgz#476b457c303d2e37a064acf0a09d1d203bfec5b0"
|
||||
integrity sha512-0Yax5NIdX1X6ELMf32rticoTehPFh2k0OTx/znAf3IgMUYdsox4peMe8Lf72MrFvmLeDvtyB45iT0Xk6bjeAvw==
|
||||
"@cornerstonejs/tools@^3.12.2":
|
||||
version "3.12.2"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.12.2.tgz#6db5e1ea6cc986a8a647fd64bea05e3dcb15fb46"
|
||||
integrity sha512-Zx9BFl2OAuCQGrr6o+e1tV3fMSoAARC7HlVWprUrGWwDA29LVRxQT+cc+Wo76GjxcKSMo5RuLt1+sgRj0+CsAA==
|
||||
dependencies:
|
||||
"@types/offscreencanvas" "2019.7.3"
|
||||
comlink "^4.4.1"
|
||||
|
||||