fix(segmentation): Display "No description S:{series number} {modality}" for segmentations with no label. (#5874)

* Bump CS3D dependency to get the fallbackLabel field additions.
This commit is contained in:
Joe Boccanfuso 2026-03-12 18:39:14 -04:00 committed by GitHub
parent 15f14e34e4
commit 7b5d0ce40e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 349 additions and 228 deletions

330
bun.lock
View File

@ -50,7 +50,7 @@
},
"addOns/externals/devDependencies": {
"name": "@externals/devDependencies",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@kitware/vtk.js": "34.15.1",
@ -131,22 +131,22 @@
},
"addOns/externals/dicom-microscopy-viewer": {
"name": "@externals/dicom-microscopy-viewer",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"dicom-microscopy-viewer": "0.48.17",
},
},
"extensions/cornerstone": {
"name": "@ohif/extension-cornerstone",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.18.2",
"@cornerstonejs/ai": "4.18.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/labelmap-interpolation": "4.18.2",
"@cornerstonejs/polymorphic-segmentation": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/adapters": "4.19.0",
"@cornerstonejs/ai": "4.19.0",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/labelmap-interpolation": "4.19.0",
"@cornerstonejs/polymorphic-segmentation": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"@icr/polyseg-wasm": "0.4.0",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "34.15.1",
@ -164,9 +164,9 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.3.0",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "4.18.2",
"@ohif/core": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@cornerstonejs/dicom-image-loader": "4.19.0",
"@ohif/core": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"dcmjs": "0.49.4",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -178,18 +178,18 @@
},
"extensions/cornerstone-dicom-pmap": {
"name": "@ohif/extension-cornerstone-dicom-pmap",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.18.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/adapters": "4.19.0",
"@cornerstonejs/core": "4.19.0",
"@kitware/vtk.js": "34.15.1",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/i18n": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/i18n": "3.13.0-beta.37",
"prop-types": "15.8.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -200,15 +200,15 @@
},
"extensions/cornerstone-dicom-rt": {
"name": "@ohif/extension-cornerstone-dicom-rt",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/i18n": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/i18n": "3.13.0-beta.37",
"prop-types": "15.8.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -219,18 +219,18 @@
},
"extensions/cornerstone-dicom-seg": {
"name": "@ohif/extension-cornerstone-dicom-seg",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.18.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/adapters": "4.19.0",
"@cornerstonejs/core": "4.19.0",
"@kitware/vtk.js": "34.15.1",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/i18n": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/i18n": "3.13.0-beta.37",
"prop-types": "15.8.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -241,19 +241,19 @@
},
"extensions/cornerstone-dicom-sr": {
"name": "@ohif/extension-cornerstone-dicom-sr",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.18.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/adapters": "4.19.0",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-measurement-tracking": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-measurement-tracking": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"dcmjs": "0.49.4",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -263,19 +263,19 @@
},
"extensions/cornerstone-dynamic-volume": {
"name": "@ohif/extension-cornerstone-dynamic-volume",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/i18n": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/i18n": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"dcmjs": "0.49.4",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -285,7 +285,7 @@
},
"extensions/default": {
"name": "@ohif/extension-default",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/calculate-suv": "1.1.0",
@ -294,8 +294,8 @@
"react-color": "2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/i18n": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/i18n": "3.13.0-beta.37",
"dcmjs": "0.49.4",
"dicomweb-client": "0.10.4",
"prop-types": "15.8.1",
@ -309,7 +309,7 @@
},
"extensions/dicom-microscopy": {
"name": "@ohif/extension-dicom-microscopy",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/codec-charls": "1.2.3",
@ -320,10 +320,10 @@
"mathjs": "12.4.3",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/i18n": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/i18n": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"prop-types": "15.8.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -334,14 +334,14 @@
},
"extensions/dicom-pdf": {
"name": "@ohif/extension-dicom-pdf",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"dcmjs": "0.49.4",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -351,14 +351,14 @@
},
"extensions/dicom-video": {
"name": "@ohif/extension-dicom-video",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"dcmjs": "0.49.4",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -368,20 +368,20 @@
},
"extensions/measurement-tracking": {
"name": "@ohif/extension-measurement-tracking",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@ohif/ui": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.37",
"@xstate/react": "3.2.2",
"xstate": "4.38.3",
},
"peerDependencies": {
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"classnames": "2.5.1",
"dcmjs": "0.49.4",
"lodash.debounce": "4.0.8",
@ -394,14 +394,14 @@
},
"extensions/test-extension": {
"name": "@ohif/extension-test",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"dcmjs": "0.49.4",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -411,7 +411,7 @@
},
"extensions/tmtv": {
"name": "@ohif/extension-tmtv",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"classnames": "2.5.1",
@ -428,16 +428,16 @@
},
"extensions/usAnnotation": {
"name": "@ohif/extension-ultrasound-pleura-bline",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/i18n": "3.13.0-beta.36",
"@ohif/ui-next": "3.13.0-beta.36",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/i18n": "3.13.0-beta.37",
"@ohif/ui-next": "3.13.0-beta.37",
},
"devDependencies": {
"@babel/core": "7.28.0",
@ -476,7 +476,7 @@
},
"modes/basic": {
"name": "@ohif/mode-basic",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
},
@ -485,19 +485,19 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/extension-dicom-pdf": "3.13.0-beta.36",
"@ohif/extension-dicom-video": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/extension-dicom-pdf": "3.13.0-beta.37",
"@ohif/extension-dicom-video": "3.13.0-beta.37",
},
},
"modes/basic-dev-mode": {
"name": "@ohif/mode-basic-dev-mode",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -507,17 +507,17 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/extension-dicom-pdf": "3.13.0-beta.36",
"@ohif/extension-dicom-video": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/extension-dicom-pdf": "3.13.0-beta.37",
"@ohif/extension-dicom-video": "3.13.0-beta.37",
},
},
"modes/basic-test-mode": {
"name": "@ohif/mode-test",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -527,19 +527,19 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/extension-dicom-pdf": "3.13.0-beta.36",
"@ohif/extension-dicom-video": "3.13.0-beta.36",
"@ohif/extension-measurement-tracking": "3.13.0-beta.36",
"@ohif/extension-test": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/extension-dicom-pdf": "3.13.0-beta.37",
"@ohif/extension-dicom-video": "3.13.0-beta.37",
"@ohif/extension-measurement-tracking": "3.13.0-beta.37",
"@ohif/extension-test": "3.13.0-beta.37",
},
},
"modes/longitudinal": {
"name": "@ohif/mode-longitudinal",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -549,33 +549,33 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/extension-dicom-pdf": "3.13.0-beta.36",
"@ohif/extension-dicom-video": "3.13.0-beta.36",
"@ohif/extension-measurement-tracking": "3.13.0-beta.36",
"@ohif/mode-basic": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/extension-dicom-pdf": "3.13.0-beta.37",
"@ohif/extension-dicom-video": "3.13.0-beta.37",
"@ohif/extension-measurement-tracking": "3.13.0-beta.37",
"@ohif/mode-basic": "3.13.0-beta.37",
},
},
"modes/microscopy": {
"name": "@ohif/mode-microscopy",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
},
"peerDependencies": {
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-dicom-microscopy": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-dicom-microscopy": "3.13.0-beta.37",
},
},
"modes/preclinical-4d": {
"name": "@ohif/mode-preclinical-4d",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
},
@ -594,7 +594,7 @@
},
"modes/segmentation": {
"name": "@ohif/mode-segmentation",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -636,7 +636,7 @@
},
"modes/tmtv": {
"name": "@ohif/mode-tmtv",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -657,14 +657,14 @@
},
"modes/usAnnotation": {
"name": "@ohif/mode-ultrasound-pleura-bline",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.36",
"@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.36",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.37",
"i18next": "17.3.1",
},
"devDependencies": {
@ -693,34 +693,34 @@
},
"platform/app": {
"name": "@ohif/app",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/codec-charls": "1.2.3",
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.3.0",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "4.18.2",
"@cornerstonejs/dicom-image-loader": "4.19.0",
"@emotion/serialize": "1.3.3",
"@ohif/core": "3.13.0-beta.36",
"@ohif/extension-cornerstone": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.36",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.36",
"@ohif/extension-default": "3.13.0-beta.36",
"@ohif/extension-dicom-microscopy": "3.13.0-beta.36",
"@ohif/extension-dicom-pdf": "3.13.0-beta.36",
"@ohif/extension-dicom-video": "3.13.0-beta.36",
"@ohif/extension-test": "3.13.0-beta.36",
"@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.36",
"@ohif/i18n": "3.13.0-beta.36",
"@ohif/mode-basic-dev-mode": "3.13.0-beta.36",
"@ohif/mode-longitudinal": "3.13.0-beta.36",
"@ohif/mode-microscopy": "3.13.0-beta.36",
"@ohif/mode-test": "3.13.0-beta.36",
"@ohif/mode-ultrasound-pleura-bline": "3.13.0-beta.36",
"@ohif/ui": "3.13.0-beta.36",
"@ohif/ui-next": "3.13.0-beta.36",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",
"@ohif/extension-dicom-microscopy": "3.13.0-beta.37",
"@ohif/extension-dicom-pdf": "3.13.0-beta.37",
"@ohif/extension-dicom-video": "3.13.0-beta.37",
"@ohif/extension-test": "3.13.0-beta.37",
"@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.37",
"@ohif/i18n": "3.13.0-beta.37",
"@ohif/mode-basic-dev-mode": "3.13.0-beta.37",
"@ohif/mode-longitudinal": "3.13.0-beta.37",
"@ohif/mode-microscopy": "3.13.0-beta.37",
"@ohif/mode-test": "3.13.0-beta.37",
"@ohif/mode-ultrasound-pleura-bline": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"@ohif/ui-next": "3.13.0-beta.37",
"@svgr/webpack": "8.1.0",
"@types/react": "18.3.23",
"classnames": "2.5.1",
@ -772,7 +772,7 @@
},
"platform/cli": {
"name": "@ohif/cli",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"bin": {
"ohif-cli": "src/index.js",
},
@ -796,7 +796,7 @@
},
"platform/core": {
"name": "@ohif/core",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"dcmjs": "0.49.4",
@ -821,16 +821,16 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.3.0",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/dicom-image-loader": "4.18.2",
"@ohif/ui": "3.13.0-beta.36",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/dicom-image-loader": "4.19.0",
"@ohif/ui": "3.13.0-beta.37",
"cornerstone-math": "0.1.9",
"dicom-parser": "1.8.21",
},
},
"platform/i18n": {
"name": "@ohif/i18n",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next-locize-backend": "2.2.2",
@ -855,7 +855,7 @@
},
"platform/ui": {
"name": "@ohif/ui",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@testing-library/react": "13.4.0",
"browser-detect": "0.2.28",
@ -905,7 +905,7 @@
},
"platform/ui-next": {
"name": "@ohif/ui-next",
"version": "3.13.0-beta.36",
"version": "3.13.0-beta.37",
"dependencies": {
"@radix-ui/react-accordion": "1.2.11",
"@radix-ui/react-checkbox": "1.3.2",
@ -1239,9 +1239,9 @@
"@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="],
"@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.18.2", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.49.4", "gl-matrix": "3.4.3", "ndarray": "1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "4.18.2", "@cornerstonejs/tools": "4.18.2" } }, "sha512-8TnZuNIxKATEU+tii/bRbuYZFp4zZoZ18e/kT9ACN3SubnweJuJUK6U+ZRE+AElJQO5JsOZPn/hzlEzUq/uR4g=="],
"@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.19.0", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.49.4", "gl-matrix": "3.4.3", "ndarray": "1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "4.19.0", "@cornerstonejs/tools": "4.19.0" } }, "sha512-321AA/3CNwe4bE7NHtKz1agTr6ckvxga1iM8ohIDPHL5GLc0Ooj4kRJMjEatTe+WmeDa4lug3VhV2FxmqCPjTg=="],
"@cornerstonejs/ai": ["@cornerstonejs/ai@4.18.2", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.49.4", "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": "4.18.2", "@cornerstonejs/tools": "4.18.2" } }, "sha512-/RDRWl4Id2IxeHosZW3jf3Tk6GkMk79iIAMrPEMo7KS1J/l7wKPcB7ayKT6rY3+RdPWU0MYDZGc+6k1tScG3wg=="],
"@cornerstonejs/ai": ["@cornerstonejs/ai@4.19.0", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.49.4", "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": "4.19.0", "@cornerstonejs/tools": "4.19.0" } }, "sha512-BWIbvUDLzmB0SEZhvFmhrhGEXdXplZkY5qEUfXCsbVcrUs9KsOrFrxLzTCRnTTnIX+Ybad9KoZWrwISmmMI3PQ=="],
"@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="],
@ -1253,15 +1253,15 @@
"@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="],
"@cornerstonejs/core": ["@cornerstonejs/core@4.18.2", "", { "dependencies": { "@kitware/vtk.js": "34.15.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-7+71R3g9KT4MqCQvG49vXp4EACbaTMh+aZ73kAG0dW7mItShLqni5IglodzM/jKHh/qoVbeX6zzaWn8Eq9OnOQ=="],
"@cornerstonejs/core": ["@cornerstonejs/core@4.19.0", "", { "dependencies": { "@kitware/vtk.js": "34.15.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-t8v1JStDS+TJc50UA82BOCD0D9U4SD0VHuofRCXfPVd/LfDcLyUmcmoDuEeHTMCHGFm16j+nc3a/tqBiC0ZOxA=="],
"@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.18.2", "", { "dependencies": { "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", "comlink": "4.4.2", "dicom-parser": "1.8.21", "jpeg-lossless-decoder-js": "2.1.2", "pako": "2.1.0", "uuid": "9.0.1" }, "peerDependencies": { "@cornerstonejs/core": "4.18.2" } }, "sha512-wcV7NLU5WLwHah7x/b9PkfAuBjbNpE6/nZaC4PWcB8yX0gKuznU1B6bNn42XErB/WlPgFduKL0FKy37ys01tvg=="],
"@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.19.0", "", { "dependencies": { "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", "comlink": "4.4.2", "dicom-parser": "1.8.21", "jpeg-lossless-decoder-js": "2.1.2", "pako": "2.1.0", "uuid": "9.0.1" }, "peerDependencies": { "@cornerstonejs/core": "4.19.0" } }, "sha512-aW7tNpYAnLZcrx6x9pPs2lDm/K00/1vzlca7CBZ8ihTZcHb2qPpzEsIPZ3F48udzy/Onl/pcw8IDEWTGWDnRzg=="],
"@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.18.2", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.18.2", "@cornerstonejs/tools": "4.18.2", "@kitware/vtk.js": "34.15.1" } }, "sha512-MyD4dHouYu7eu0u8sS5+cUuRwpINouUD+c0GZCamEDJ37PSUslhz1gMkQCL7B61NMpx6cAEP0OVlyfVbd7YPmw=="],
"@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.19.0", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.19.0", "@cornerstonejs/tools": "4.19.0", "@kitware/vtk.js": "34.15.1" } }, "sha512-nQgZhNACFsi1frS7kpFf8+wywweHZFQjYRZ27OuaILUhcd4c5Rcz+4t3mfnzdqTuxtg3+ewPG+7oKyCFIUMrgw=="],
"@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.18.2", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.18.2", "@cornerstonejs/tools": "4.18.2", "@kitware/vtk.js": "34.15.1" } }, "sha512-lwdcyUflm4tDZEUc2Eq8ot7C9tEnKDJnLk6oKClk9/32ExUIqnItWbKfxwF0yvBiFzVhvdnAsjXvsO1itaD+LA=="],
"@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.19.0", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.19.0", "@cornerstonejs/tools": "4.19.0", "@kitware/vtk.js": "34.15.1" } }, "sha512-WmB938EDefT21YBYDC2rZReJyyI0fS9QsIoc9FkJOEky6GdDWbpFRulqz1X0XGbsr2jbAQUh9p1KJaraEtXkIw=="],
"@cornerstonejs/tools": ["@cornerstonejs/tools@4.18.2", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.18.2", "@kitware/vtk.js": "34.15.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", "d3-array": "3.2.4", "d3-interpolate": "3.0.1", "gl-matrix": "3.4.3" } }, "sha512-dWbi29k/Y62TVBeK7zaU3mis9+UPjhr0nMGeG+C1PA7jYW07bLWFAL8vEk1oI1hGPOGKWU+Crpc9oRrOyzZkfw=="],
"@cornerstonejs/tools": ["@cornerstonejs/tools@4.19.0", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.19.0", "@kitware/vtk.js": "34.15.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", "d3-array": "3.2.4", "d3-interpolate": "3.0.1", "gl-matrix": "3.4.3" } }, "sha512-yDK3I3U4tYDUWhZh3/NNBWWwqBd5X5qAfkn6tba5KMwKMLtjSm11s+Wg5O4BWOooW/XRflwj28VtE+Kgivlsag=="],
"@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.18.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/adapters": "4.19.0",
"@cornerstonejs/core": "4.19.0",
"@kitware/vtk.js": "34.15.1"
}
}

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.18.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/adapters": "4.19.0",
"@cornerstonejs/core": "4.19.0",
"@kitware/vtk.js": "34.15.1"
}
}

View File

@ -46,9 +46,9 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.18.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/adapters": "4.19.0",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"classnames": "2.5.1"
}
}

View File

@ -42,8 +42,8 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"classnames": "2.5.1"
}
}

View File

@ -40,7 +40,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.3.0",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "4.18.2",
"@cornerstonejs/dicom-image-loader": "4.19.0",
"@ohif/core": "3.13.0-beta.37",
"@ohif/ui": "3.13.0-beta.37",
"dcmjs": "0.49.4",
@ -53,12 +53,12 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.18.2",
"@cornerstonejs/ai": "4.18.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/labelmap-interpolation": "4.18.2",
"@cornerstonejs/polymorphic-segmentation": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/adapters": "4.19.0",
"@cornerstonejs/ai": "4.19.0",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/labelmap-interpolation": "4.19.0",
"@cornerstonejs/polymorphic-segmentation": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"@icr/polyseg-wasm": "0.4.0",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "34.15.1",

View File

@ -9,7 +9,7 @@ import { useSystem } from '@ohif/core';
const excludedModalities = ['SM', 'OT', 'DOC', 'ECG'];
function mapSegmentationToDisplay(segmentation, customizationService) {
const { label, segments } = segmentation;
const { label, segments, fallbackLabel } = segmentation;
// Get the readable text mapping once
const readableTextMap = customizationService.getCustomization('panelSegmentation.readableText');
@ -76,6 +76,7 @@ function mapSegmentationToDisplay(segmentation, customizationService) {
return {
...segmentation,
label,
fallbackLabel,
segments: updatedSegments,
};
}

View File

@ -1120,6 +1120,7 @@ describe('SegmentationService', () => {
isDynamicVolume: false,
SeriesNumber: 1,
SeriesDescription: 'Series Description',
Modality: 'SEG',
} as unknown as AppTypes.DisplaySet;
jest
@ -1145,6 +1146,7 @@ describe('SegmentationService', () => {
info: 'S1: Series Description',
},
label: 'Segmentation 2',
fallbackLabel: 'S:1 SEG',
segments: {
'1': {
active: true,
@ -1175,6 +1177,7 @@ describe('SegmentationService', () => {
dynamicVolumeInfo: {
timePoints: ['timePoint1', 'timePoint2', 'timePoint3'],
},
Modality: 'SEG',
} as unknown as AppTypes.DisplaySet;
jest
@ -1212,6 +1215,7 @@ describe('SegmentationService', () => {
info: 'S1: Series Description',
},
label: 'Segmentation 2',
fallbackLabel: 'S:1 SEG',
segments: {
'1': {
active: true,
@ -1320,6 +1324,8 @@ describe('SegmentationService', () => {
},
SeriesDate: '2025-01-01',
SeriesDescription: 'Series Description',
Modality: 'SEG',
SeriesNumber: 1,
};
const referencedDisplaySet = {
@ -1379,6 +1385,7 @@ describe('SegmentationService', () => {
const expectedSegmentation = {
config: {
label: segDisplaySet.SeriesDescription,
fallbackLabel: 'S:1 SEG',
segments: {
'1': {
active: false,
@ -1534,7 +1541,7 @@ describe('SegmentationService', () => {
it('should create a segmentation for a RTSTRUCT display set', async () => {
const segmentationId = 'segmentationId';
const rtStructDisplaySet = {
modality: 'RTSTRUCT',
Modality: 'RTSTRUCT',
displaySetInstanceUID: 'display-set-uid',
referencedDisplaySetInstanceUID: 'existent-display-set-uid',
SeriesDate: '2025-01-01',
@ -1544,6 +1551,7 @@ describe('SegmentationService', () => {
ROIContours: [{}, {}, {}],
frameOfReferenceUID: 'frameOfReferenceUID',
},
SeriesNumber: 1,
};
const referencedDisplaySet = {
@ -1650,6 +1658,7 @@ describe('SegmentationService', () => {
const expectedSegmentation = {
config: {
label: rtStructDisplaySet.SeriesDescription,
fallbackLabel: 'S:1 RTSTRUCT',
segments: {
'1': {
active: false,

View File

@ -55,6 +55,7 @@ export type SegmentationRepresentation = cstTypes.SegmentationRepresentation & {
viewportId: string;
id: string;
label: string;
fallbackLabel?: string;
styles: cstTypes.RepresentationStyle;
segments: {
[key: number]: SegmentRepresentation;
@ -430,6 +431,7 @@ class SegmentationService extends PubSubService {
},
config: {
label,
fallbackLabel: `S:${displaySet.SeriesNumber} ${displaySet.Modality}`,
segments:
options?.segments && Object.keys(options.segments).length > 0
? options.segments
@ -583,6 +585,7 @@ class SegmentationService extends PubSubService {
},
config: {
label: segDisplaySet.SeriesDescription,
fallbackLabel: `S:${segDisplaySet.SeriesNumber} ${segDisplaySet.Modality}`,
segments,
},
};
@ -664,6 +667,7 @@ class SegmentationService extends PubSubService {
},
config: {
label: rtDisplaySet.SeriesDescription,
fallbackLabel: `S:${rtDisplaySet.SeriesNumber} ${rtDisplaySet.Modality}`,
},
};
@ -1842,6 +1846,7 @@ class SegmentationService extends PubSubService {
id: id,
segmentationId,
label: segmentation.label,
fallbackLabel: segmentation.fallbackLabel,
active,
type,
visible,

View File

@ -32,8 +32,8 @@
"start": "yarn run dev"
},
"peerDependencies": {
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",

View File

@ -42,8 +42,8 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",
"@ohif/extension-default": "3.13.0-beta.37",

View File

@ -34,8 +34,8 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/tools": "4.18.2",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/tools": "4.19.0",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.37",
"@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.37",

View File

@ -54,7 +54,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.3.0",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "4.18.2",
"@cornerstonejs/dicom-image-loader": "4.19.0",
"@emotion/serialize": "1.3.3",
"@ohif/core": "3.13.0-beta.37",
"@ohif/extension-cornerstone": "3.13.0-beta.37",

View File

@ -37,8 +37,8 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.3.0",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/core": "4.18.2",
"@cornerstonejs/dicom-image-loader": "4.18.2",
"@cornerstonejs/core": "4.19.0",
"@cornerstonejs/dicom-image-loader": "4.19.0",
"@ohif/ui": "3.13.0-beta.37",
"cornerstone-math": "0.1.9",
"dicom-parser": "1.8.21"

View File

@ -64,5 +64,6 @@
"Not available on the current viewport": "Not available on the current viewport",
"Add segment to enable this tool": "Add segment to enable this tool",
"Segment Bidirectional": "Segment Bidirectional",
"Draw a segment before using bidirectional measurement": "Draw a segment before using bidirectional measurement"
"Draw a segment before using bidirectional measurement": "Draw a segment before using bidirectional measurement",
"No description": "No description"
}

View File

@ -64,5 +64,6 @@
"Not available on the current viewport": "Test Not available on the current viewport",
"Add segment to enable this tool": "Test Add segment to enable this tool",
"Segment Bidirectional": "Test Segment Bidirectional",
"Draw a segment before using bidirectional measurement": "Test Draw a segment before using bidirectional measurement"
"Draw a segment before using bidirectional measurement": "Test Draw a segment before using bidirectional measurement",
"No description": "Test No description"
}

View File

@ -5,6 +5,7 @@ import {
SegmentationExpandedProvider,
useSegmentationExpanded,
} from './contexts';
import { SegmentationLabel } from './SegmentationLabel';
import { useTranslation } from 'react-i18next';
import {
Button,
@ -56,7 +57,7 @@ const SegmentationCollapsedDropdownMenu = ({ children }: { children: React.React
// Selector component - for the segmentation selection dropdown
const SegmentationCollapsedSelector = () => {
const { t } = useTranslation('SegmentationPanel.HeaderCollapsed');
const { t } = useTranslation('SegmentationPanel');
const { data, onSegmentationClick, segmentationRepresentationTypes } =
useSegmentationTableContext('SegmentationCollapsedSelector');
const { segmentation } = useSegmentationExpanded('SegmentationCollapsedSelector');
@ -74,16 +75,28 @@ const SegmentationCollapsedSelector = () => {
)
.map(seg => ({
id: seg.segmentation.segmentationId,
label: seg.segmentation.label,
segmentation: seg.segmentation,
}));
const dataCyTypeSuffix = segmentationRepresentationTypes
? `-${segmentationRepresentationTypes[0]}`
: '';
return (
<Select
onValueChange={value => onSegmentationClick(value)}
value={segmentation?.segmentationId}
>
<SelectTrigger className="w-full overflow-hidden">
<SelectValue placeholder={t('Select a segmentation')} />
<SelectTrigger
className="w-full overflow-hidden"
data-cy={`segmentation-select${dataCyTypeSuffix}`}
>
<SelectValue
placeholder={t('Select a segmentation')}
data-cy={`segmentation-select-value${dataCyTypeSuffix}`}
>
<SegmentationLabel segmentation={segmentation} />
</SelectValue>
</SelectTrigger>
<SelectContent>
{segmentations.map(seg => (
@ -91,7 +104,7 @@ const SegmentationCollapsedSelector = () => {
key={seg.id}
value={seg.id}
>
{seg.label}
<SegmentationLabel segmentation={seg.segmentation} />
</SelectItem>
))}
</SelectContent>

View File

@ -11,6 +11,7 @@ import { DropdownMenu, DropdownMenuTrigger } from '../DropdownMenu';
import { Tooltip, TooltipTrigger, TooltipContent } from '../Tooltip/Tooltip';
import { ScrollArea } from '../../components';
import { useDynamicMaxHeight } from '../../hooks/useDynamicMaxHeight';
import { SegmentationLabel } from './SegmentationLabel';
// The Header container component
const SegmentationExpandedHeader = ({ children }: { children: React.ReactNode }) => {
@ -53,7 +54,11 @@ const SegmentationExpandedDropdownMenu = ({ children }: { children: React.ReactN
const SegmentationExpandedLabel = () => {
const { segmentation } = useSegmentationExpanded('SegmentationExpandedLabel');
return <div className="pl-1.5">{segmentation.label}</div>;
return (
<div className="pl-1.5">
<SegmentationLabel segmentation={segmentation} />
</div>
);
};
// Info component - for the info tooltip

View File

@ -0,0 +1,27 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
import { Segmentation } from './contexts/SegmentationTableContext';
/**
* Displays the segmentation label. When the label is blank, shows a translated
* "No description" with the series/modality suffix styled in a lighter, muted font.
*/
export const SegmentationLabel = ({ segmentation }: { segmentation: Segmentation }) => {
const { t } = useTranslation('SegmentationPanel');
if (!segmentation) {
return null;
}
if (segmentation.label) {
return <>{segmentation.label}</>;
}
const suffix = segmentation.fallbackLabel;
return (
<>
<span>{t('No description')}</span>
{suffix && <span className="text-muted-foreground text-xxs">&nbsp;&nbsp;{suffix}</span>}
</>
);
};

View File

@ -17,6 +17,7 @@ export interface Segmentation {
segmentationId: string;
label: string;
cachedStats: SegmentStats;
fallbackLabel?: string;
segments: Record<number, Segment>;
}

View File

@ -0,0 +1,29 @@
import { expect, test, visitStudy } from './utils';
test('checks that segmentations created from series with no series description are labelled as "No description S:{series number} {modality}"', async ({
rightPanelPageObject,
leftPanelPageObject,
DOMOverlayPageObject,
page,
}) => {
const studyInstanceUID = '1.3.6.1.4.1.32722.99.99.62087908186665265759322018723889952421';
const mode = 'segmentation'; // To also test add/remove
await visitStudy(page, studyInstanceUID, mode, 2000);
const segmentationPanel = rightPanelPageObject.contourSegmentationPanel.menuButton;
// Switch to contour tab.
await segmentationPanel.click();
await leftPanelPageObject.loadSeriesByModality('RTSTRUCT');
await page.waitForTimeout(5000);
await DOMOverlayPageObject.viewport.segmentationHydration.yes.click();
expect(rightPanelPageObject.contourSegmentationPanel.segmentationSelect.selectedValue).toHaveText(
'No description S:4 RTSTRUCT'
);
expect(
await rightPanelPageObject.contourSegmentationPanel.segmentationSelect.nthSegmentation(0)
).toHaveText('No description S:4 RTSTRUCT');
});

View File

@ -126,6 +126,31 @@ export class RightPanelPageObject {
};
}
private getSegmentationSelect(type: string) {
const page = this.page;
const suffix = type ? `-${type}` : '';
const locator = page.getByTestId(`segmentation-select${suffix}`);
const selectedValue = page.getByTestId(`segmentation-select-value${suffix}`);
const nthSegmentation = async (n: number) => {
await locator.click();
return page.getByRole('option').nth(n);
};
return {
/** The SelectTrigger button element */
locator,
/** The span showing the currently selected segmentation label */
selectedValue,
/** Opens the dropdown and returns a locator for the nth option (0-based) */
nthSegmentation,
/** Opens the dropdown and clicks the nth segmentation (0-based) */
selectNthSegmentation: async (n: number) => {
await (await nthSegmentation(n)).click();
},
};
}
private get addSegmentationButton() {
const button = this.page.getByTestId('addSegmentation');
return {
@ -163,11 +188,13 @@ export class RightPanelPageObject {
const addSegmentationButton = this.addSegmentationButton;
const panel = this.getSegmentationPanel('Contour');
const menuButton = page.getByTestId('panelSegmentationWithToolsContour-btn');
const segmentationSelect = this.getSegmentationSelect('Contour');
return {
addSegmentationButton,
menuButton,
panel,
segmentationSelect,
select: async () => {
await menuButton.click();
},
@ -178,11 +205,13 @@ export class RightPanelPageObject {
const addSegmentationButton = this.addSegmentationButton;
const panel = this.getSegmentationPanel('Labelmap');
const menuButton = page.getByTestId('panelSegmentationWithToolsLabelMap-btn');
const segmentationSelect = this.getSegmentationSelect('Labelmap');
return {
addSegmentationButton,
menuButton,
panel,
segmentationSelect,
select: async () => {
await menuButton.click();
},

View File

@ -1946,10 +1946,10 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@cornerstonejs/adapters@4.18.2":
version "4.18.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.18.2.tgz#e18c8d1304e41430a7e1782fe6c8d6c71f5e360f"
integrity sha512-8TnZuNIxKATEU+tii/bRbuYZFp4zZoZ18e/kT9ACN3SubnweJuJUK6U+ZRE+AElJQO5JsOZPn/hzlEzUq/uR4g==
"@cornerstonejs/adapters@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.19.0.tgz#6e1035a0617ddcb6938eaf6100ef5f86e7df398b"
integrity sha512-321AA/3CNwe4bE7NHtKz1agTr6ckvxga1iM8ohIDPHL5GLc0Ooj4kRJMjEatTe+WmeDa4lug3VhV2FxmqCPjTg==
dependencies:
"@babel/runtime-corejs2" "7.26.10"
buffer "6.0.3"
@ -1957,10 +1957,10 @@
gl-matrix "3.4.3"
ndarray "1.0.19"
"@cornerstonejs/ai@4.18.2":
version "4.18.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.18.2.tgz#c5e2a0486f59e3d8cdd1c59aad0737a651f1db69"
integrity sha512-/RDRWl4Id2IxeHosZW3jf3Tk6GkMk79iIAMrPEMo7KS1J/l7wKPcB7ayKT6rY3+RdPWU0MYDZGc+6k1tScG3wg==
"@cornerstonejs/ai@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.19.0.tgz#04d44c620632c095fda5987c7a5d07e2c26a9389"
integrity sha512-BWIbvUDLzmB0SEZhvFmhrhGEXdXplZkY5qEUfXCsbVcrUs9KsOrFrxLzTCRnTTnIX+Ybad9KoZWrwISmmMI3PQ==
dependencies:
"@babel/runtime-corejs2" "7.26.10"
buffer "6.0.3"
@ -1996,20 +1996,20 @@
resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.7.tgz#784394d05d8cf735640e9c3baa206535ee8e0376"
integrity sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w==
"@cornerstonejs/core@4.18.2":
version "4.18.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.18.2.tgz#1e215790566f7def9a4a1a3eae8c4664192811b1"
integrity sha512-7+71R3g9KT4MqCQvG49vXp4EACbaTMh+aZ73kAG0dW7mItShLqni5IglodzM/jKHh/qoVbeX6zzaWn8Eq9OnOQ==
"@cornerstonejs/core@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.19.0.tgz#45406e3ae5dfb07727b090f9e33b234c035b31c9"
integrity sha512-t8v1JStDS+TJc50UA82BOCD0D9U4SD0VHuofRCXfPVd/LfDcLyUmcmoDuEeHTMCHGFm16j+nc3a/tqBiC0ZOxA==
dependencies:
"@kitware/vtk.js" "34.15.1"
comlink "4.4.2"
gl-matrix "3.4.3"
loglevel "1.9.2"
"@cornerstonejs/dicom-image-loader@4.18.2":
version "4.18.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.18.2.tgz#e43e10271a7adbfd4e5eb257714da94b53730957"
integrity sha512-wcV7NLU5WLwHah7x/b9PkfAuBjbNpE6/nZaC4PWcB8yX0gKuznU1B6bNn42XErB/WlPgFduKL0FKy37ys01tvg==
"@cornerstonejs/dicom-image-loader@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.19.0.tgz#426d65626d1c68208ab22d85763da528a16c118e"
integrity sha512-aW7tNpYAnLZcrx6x9pPs2lDm/K00/1vzlca7CBZ8ihTZcHb2qPpzEsIPZ3F48udzy/Onl/pcw8IDEWTGWDnRzg==
dependencies:
"@cornerstonejs/codec-charls" "1.2.3"
"@cornerstonejs/codec-libjpeg-turbo-8bit" "1.2.2"
@ -2021,25 +2021,25 @@
pako "2.1.0"
uuid "9.0.1"
"@cornerstonejs/labelmap-interpolation@4.18.2":
version "4.18.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.18.2.tgz#ad9dec8d51db1520535625d5d7da5c1fbb0e1e5d"
integrity sha512-MyD4dHouYu7eu0u8sS5+cUuRwpINouUD+c0GZCamEDJ37PSUslhz1gMkQCL7B61NMpx6cAEP0OVlyfVbd7YPmw==
"@cornerstonejs/labelmap-interpolation@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.19.0.tgz#101cb6f7f7eb64ee9a2933cfe2ef71af66abfa05"
integrity sha512-nQgZhNACFsi1frS7kpFf8+wywweHZFQjYRZ27OuaILUhcd4c5Rcz+4t3mfnzdqTuxtg3+ewPG+7oKyCFIUMrgw==
dependencies:
"@itk-wasm/morphological-contour-interpolation" "1.1.0"
itk-wasm "1.0.0-b.165"
"@cornerstonejs/polymorphic-segmentation@4.18.2":
version "4.18.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.18.2.tgz#744e0349ec84edbd3e341bc217f4d2b4e2c62ac5"
integrity sha512-lwdcyUflm4tDZEUc2Eq8ot7C9tEnKDJnLk6oKClk9/32ExUIqnItWbKfxwF0yvBiFzVhvdnAsjXvsO1itaD+LA==
"@cornerstonejs/polymorphic-segmentation@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.19.0.tgz#79491ee8293c53008973286b59bc38b88426ebba"
integrity sha512-WmB938EDefT21YBYDC2rZReJyyI0fS9QsIoc9FkJOEky6GdDWbpFRulqz1X0XGbsr2jbAQUh9p1KJaraEtXkIw==
dependencies:
"@icr/polyseg-wasm" "0.4.0"
"@cornerstonejs/tools@4.18.2":
version "4.18.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.18.2.tgz#7be4a08b76b73fa3cea9839d879c5826f5d4bf34"
integrity sha512-dWbi29k/Y62TVBeK7zaU3mis9+UPjhr0nMGeG+C1PA7jYW07bLWFAL8vEk1oI1hGPOGKWU+Crpc9oRrOyzZkfw==
"@cornerstonejs/tools@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.19.0.tgz#1db6bd62988c6fd4fb2497bedadffdbe16109c04"
integrity sha512-yDK3I3U4tYDUWhZh3/NNBWWwqBd5X5qAfkn6tba5KMwKMLtjSm11s+Wg5O4BWOooW/XRflwj28VtE+Kgivlsag==
dependencies:
"@types/offscreencanvas" "2019.7.3"
comlink "4.4.2"