fix(segmentation): Lock all rehydrated segmentation segments when panelSegmentation.disableEditing is true. (#5503)

* fix(segmentation): Lock all rehydrated segmentation segments when panelSegmentation.disableEditing is true.

* PR feedback.

* PR feedback.

* Added tests for disableEditing and utilities for simulating drag operations.

* Update bun.lock file after merging master.
This commit is contained in:
Joe Boccanfuso 2025-10-17 22:14:31 -04:00 committed by GitHub
parent 3e1d50c8d2
commit 170e860aa1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 625 additions and 242 deletions

374
bun.lock
View File

@ -52,7 +52,7 @@
},
"addOns/externals/devDependencies": {
"name": "@externals/devDependencies",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@kitware/vtk.js": "32.12.0",
@ -137,22 +137,22 @@
},
"addOns/externals/dicom-microscopy-viewer": {
"name": "@externals/dicom-microscopy-viewer",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"dicom-microscopy-viewer": "0.48.6",
},
},
"extensions/cornerstone": {
"name": "@ohif/extension-cornerstone",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.5.5",
"@cornerstonejs/ai": "4.5.5",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/labelmap-interpolation": "4.5.5",
"@cornerstonejs/polymorphic-segmentation": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/ai": "4.5.13",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/labelmap-interpolation": "4.5.13",
"@cornerstonejs/polymorphic-segmentation": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "1.4.1",
@ -169,9 +169,9 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.2.4",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "4.5.5",
"@ohif/core": "3.12.0-beta.58",
"@ohif/ui": "3.12.0-beta.58",
"@cornerstonejs/dicom-image-loader": "4.5.13",
"@ohif/core": "3.12.0-beta.67",
"@ohif/ui": "3.12.0-beta.67",
"dcmjs": "0.43.1",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -183,19 +183,19 @@
},
"extensions/cornerstone-dicom-pmap": {
"name": "@ohif/extension-cornerstone-dicom-pmap",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.5.5",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/core": "4.5.13",
"@kitware/vtk.js": "32.12.0",
"react-color": "2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/i18n": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/i18n": "3.12.0-beta.64",
"prop-types": "15.8.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -206,16 +206,16 @@
},
"extensions/cornerstone-dicom-rt": {
"name": "@ohif/extension-cornerstone-dicom-rt",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"react-color": "2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/i18n": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/i18n": "3.12.0-beta.64",
"prop-types": "15.8.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -226,19 +226,19 @@
},
"extensions/cornerstone-dicom-seg": {
"name": "@ohif/extension-cornerstone-dicom-seg",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.5.5",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/core": "4.5.13",
"@kitware/vtk.js": "32.12.0",
"react-color": "2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/i18n": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/i18n": "3.12.0-beta.64",
"prop-types": "15.8.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -249,19 +249,19 @@
},
"extensions/cornerstone-dicom-sr": {
"name": "@ohif/extension-cornerstone-dicom-sr",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.5.5",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.58",
"@ohif/extension-cornerstone": "3.12.0-beta.58",
"@ohif/extension-measurement-tracking": "3.12.0-beta.58",
"@ohif/ui": "3.12.0-beta.58",
"@ohif/core": "3.12.0-beta.67",
"@ohif/extension-cornerstone": "3.12.0-beta.67",
"@ohif/extension-measurement-tracking": "3.12.0-beta.67",
"@ohif/ui": "3.12.0-beta.67",
"dcmjs": "0.43.1",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -271,19 +271,19 @@
},
"extensions/cornerstone-dynamic-volume": {
"name": "@ohif/extension-cornerstone-dynamic-volume",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/i18n": "3.12.0-beta.56",
"@ohif/ui": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/i18n": "3.12.0-beta.64",
"@ohif/ui": "3.12.0-beta.64",
"dcmjs": "0.43.1",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -293,7 +293,7 @@
},
"extensions/default": {
"name": "@ohif/extension-default",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/calculate-suv": "1.1.0",
@ -301,8 +301,8 @@
"lodash.uniqby": "4.7.0",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.58",
"@ohif/i18n": "3.12.0-beta.58",
"@ohif/core": "3.12.0-beta.67",
"@ohif/i18n": "3.12.0-beta.67",
"dcmjs": "0.43.1",
"dicomweb-client": "0.10.4",
"prop-types": "15.8.1",
@ -316,7 +316,7 @@
},
"extensions/dicom-microscopy": {
"name": "@ohif/extension-dicom-microscopy",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/codec-charls": "1.2.3",
@ -327,10 +327,10 @@
"mathjs": "12.4.3",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/i18n": "3.12.0-beta.56",
"@ohif/ui": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/i18n": "3.12.0-beta.64",
"@ohif/ui": "3.12.0-beta.64",
"prop-types": "15.8.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -341,14 +341,14 @@
},
"extensions/dicom-pdf": {
"name": "@ohif/extension-dicom-pdf",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/ui": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/ui": "3.12.0-beta.64",
"dcmjs": "0.43.1",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -358,14 +358,14 @@
},
"extensions/dicom-video": {
"name": "@ohif/extension-dicom-video",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/ui": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/ui": "3.12.0-beta.64",
"dcmjs": "0.43.1",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -375,20 +375,20 @@
},
"extensions/measurement-tracking": {
"name": "@ohif/extension-measurement-tracking",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@ohif/ui": "3.12.0-beta.58",
"@ohif/ui": "3.12.0-beta.67",
"@xstate/react": "3.2.2",
"xstate": "4.38.3",
},
"peerDependencies": {
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@ohif/core": "3.12.0-beta.58",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.58",
"@ohif/extension-default": "3.12.0-beta.58",
"@ohif/ui": "3.12.0-beta.58",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.12.0-beta.67",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.67",
"@ohif/extension-default": "3.12.0-beta.67",
"@ohif/ui": "3.12.0-beta.67",
"classnames": "2.5.1",
"dcmjs": "0.43.1",
"lodash.debounce": "4.0.8",
@ -401,14 +401,14 @@
},
"extensions/test-extension": {
"name": "@ohif/extension-test",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/ui": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/ui": "3.12.0-beta.64",
"dcmjs": "0.43.1",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -418,14 +418,14 @@
},
"extensions/tmtv": {
"name": "@ohif/extension-tmtv",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"classnames": "2.5.1",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/ui": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/ui": "3.12.0-beta.64",
"dcmjs": "0.43.1",
"dicom-parser": "1.8.21",
"hammerjs": "2.0.8",
@ -435,16 +435,16 @@
},
"extensions/usAnnotation": {
"name": "@ohif/extension-ultrasound-pleura-bline",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/i18n": "3.12.0-beta.56",
"@ohif/ui-next": "3.12.0-beta.56",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/i18n": "3.12.0-beta.64",
"@ohif/ui-next": "3.12.0-beta.64",
},
"devDependencies": {
"@babel/core": "7.28.0",
@ -487,7 +487,7 @@
},
"modes/basic": {
"name": "@ohif/mode-basic",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
},
@ -496,19 +496,19 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/extension-dicom-pdf": "3.12.0-beta.56",
"@ohif/extension-dicom-video": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/extension-dicom-pdf": "3.12.0-beta.64",
"@ohif/extension-dicom-video": "3.12.0-beta.64",
},
},
"modes/basic-dev-mode": {
"name": "@ohif/mode-basic-dev-mode",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -518,17 +518,17 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/extension-dicom-pdf": "3.12.0-beta.56",
"@ohif/extension-dicom-video": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/extension-dicom-pdf": "3.12.0-beta.64",
"@ohif/extension-dicom-video": "3.12.0-beta.64",
},
},
"modes/basic-test-mode": {
"name": "@ohif/mode-test",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -538,19 +538,19 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/extension-dicom-pdf": "3.12.0-beta.56",
"@ohif/extension-dicom-video": "3.12.0-beta.56",
"@ohif/extension-measurement-tracking": "3.12.0-beta.56",
"@ohif/extension-test": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/extension-dicom-pdf": "3.12.0-beta.64",
"@ohif/extension-dicom-video": "3.12.0-beta.64",
"@ohif/extension-measurement-tracking": "3.12.0-beta.64",
"@ohif/extension-test": "3.12.0-beta.64",
},
},
"modes/longitudinal": {
"name": "@ohif/mode-longitudinal",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -560,32 +560,32 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/extension-dicom-pdf": "3.12.0-beta.56",
"@ohif/extension-dicom-video": "3.12.0-beta.56",
"@ohif/extension-measurement-tracking": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/extension-dicom-pdf": "3.12.0-beta.64",
"@ohif/extension-dicom-video": "3.12.0-beta.64",
"@ohif/extension-measurement-tracking": "3.12.0-beta.64",
},
},
"modes/microscopy": {
"name": "@ohif/mode-microscopy",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-dicom-microscopy": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-dicom-microscopy": "3.12.0-beta.64",
},
},
"modes/preclinical-4d": {
"name": "@ohif/mode-preclinical-4d",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
},
@ -594,17 +594,17 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dynamic-volume": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/extension-tmtv": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dynamic-volume": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/extension-tmtv": "3.12.0-beta.64",
},
},
"modes/segmentation": {
"name": "@ohif/mode-segmentation",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -636,19 +636,19 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/extension-dicom-pdf": "3.12.0-beta.56",
"@ohif/extension-dicom-video": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/extension-dicom-pdf": "3.12.0-beta.64",
"@ohif/extension-dicom-video": "3.12.0-beta.64",
},
},
"modes/tmtv": {
"name": "@ohif/mode-tmtv",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next": "17.3.1",
@ -658,25 +658,25 @@
"webpack-merge": "5.10.0",
},
"peerDependencies": {
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/extension-dicom-pdf": "3.12.0-beta.56",
"@ohif/extension-dicom-video": "3.12.0-beta.56",
"@ohif/extension-measurement-tracking": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/extension-dicom-pdf": "3.12.0-beta.64",
"@ohif/extension-dicom-video": "3.12.0-beta.64",
"@ohif/extension-measurement-tracking": "3.12.0-beta.64",
},
},
"modes/usAnnotation": {
"name": "@ohif/mode-ultrasound-pleura-bline",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.56",
"@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.56",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.64",
"@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.64",
"i18next": "17.3.1",
},
"devDependencies": {
@ -708,34 +708,34 @@
},
"platform/app": {
"name": "@ohif/app",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"@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.7",
"@cornerstonejs/dicom-image-loader": "4.5.5",
"@cornerstonejs/dicom-image-loader": "4.5.13",
"@emotion/serialize": "1.3.3",
"@ohif/core": "3.12.0-beta.56",
"@ohif/extension-cornerstone": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.56",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.56",
"@ohif/extension-default": "3.12.0-beta.56",
"@ohif/extension-dicom-microscopy": "3.12.0-beta.56",
"@ohif/extension-dicom-pdf": "3.12.0-beta.56",
"@ohif/extension-dicom-video": "3.12.0-beta.56",
"@ohif/extension-test": "3.12.0-beta.56",
"@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.56",
"@ohif/i18n": "3.12.0-beta.56",
"@ohif/mode-basic-dev-mode": "3.12.0-beta.56",
"@ohif/mode-longitudinal": "3.12.0-beta.56",
"@ohif/mode-microscopy": "3.12.0-beta.56",
"@ohif/mode-test": "3.12.0-beta.56",
"@ohif/mode-ultrasound-pleura-bline": "3.12.0-beta.56",
"@ohif/ui": "3.12.0-beta.56",
"@ohif/ui-next": "3.12.0-beta.56",
"@ohif/core": "3.12.0-beta.64",
"@ohif/extension-cornerstone": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.64",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.64",
"@ohif/extension-default": "3.12.0-beta.64",
"@ohif/extension-dicom-microscopy": "3.12.0-beta.64",
"@ohif/extension-dicom-pdf": "3.12.0-beta.64",
"@ohif/extension-dicom-video": "3.12.0-beta.64",
"@ohif/extension-test": "3.12.0-beta.64",
"@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.64",
"@ohif/i18n": "3.12.0-beta.64",
"@ohif/mode-basic-dev-mode": "3.12.0-beta.64",
"@ohif/mode-longitudinal": "3.12.0-beta.64",
"@ohif/mode-microscopy": "3.12.0-beta.64",
"@ohif/mode-test": "3.12.0-beta.64",
"@ohif/mode-ultrasound-pleura-bline": "3.12.0-beta.64",
"@ohif/ui": "3.12.0-beta.64",
"@ohif/ui-next": "3.12.0-beta.64",
"@svgr/webpack": "8.1.0",
"@types/react": "18.3.23",
"classnames": "2.5.1",
@ -787,7 +787,7 @@
},
"platform/cli": {
"name": "@ohif/cli",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"bin": {
"ohif-cli": "src/index.js",
},
@ -811,7 +811,7 @@
},
"platform/core": {
"name": "@ohif/core",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"dcmjs": "0.43.1",
@ -836,16 +836,16 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.2.4",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/dicom-image-loader": "4.5.5",
"@ohif/ui": "3.12.0-beta.58",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/dicom-image-loader": "4.5.13",
"@ohif/ui": "3.12.0-beta.67",
"cornerstone-math": "0.1.9",
"dicom-parser": "1.8.21",
},
},
"platform/i18n": {
"name": "@ohif/i18n",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@babel/runtime": "7.28.2",
"i18next-locize-backend": "2.2.2",
@ -870,7 +870,7 @@
},
"platform/ui": {
"name": "@ohif/ui",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@testing-library/react": "13.4.0",
"browser-detect": "0.2.28",
@ -921,7 +921,7 @@
},
"platform/ui-next": {
"name": "@ohif/ui-next",
"version": "3.12.0-beta.58",
"version": "3.12.0-beta.67",
"dependencies": {
"@radix-ui/react-accordion": "1.2.11",
"@radix-ui/react-checkbox": "1.3.2",
@ -1228,9 +1228,9 @@
"@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="],
"@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.5.5", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.43.1", "gl-matrix": "3.4.3", "ndarray": "1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "4.5.5", "@cornerstonejs/tools": "4.5.5" } }, "sha512-tZC8ScqmSouWt5/0t9cUqtsSVW5ObhniyuZuF6QZvXOyWU7I4fkmtNX4RtTUi9cvuqoDA0nckejkEQhp5OjKEw=="],
"@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.5.13", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.43.1", "gl-matrix": "3.4.3", "ndarray": "1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "4.5.13", "@cornerstonejs/tools": "4.5.13" } }, "sha512-qWB32zsY4Ets2/si2fUBqHckBZYrdEYSPK/mya3S4+qLdB5KImZZJQYq4aqVg+gRvZc9aHIKVI1jjZCkxdvV0A=="],
"@cornerstonejs/ai": ["@cornerstonejs/ai@4.5.5", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.43.1", "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.5.5", "@cornerstonejs/tools": "4.5.5" } }, "sha512-31/ARIIr2EyDwyeNsI58XLYpbEikaPqYuR/7tQMFvqwX0plpsaAZx0wQ+ta0YBag9/vAtpuyjg1sGMaqS7v9Yw=="],
"@cornerstonejs/ai": ["@cornerstonejs/ai@4.5.13", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.43.1", "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.5.13", "@cornerstonejs/tools": "4.5.13" } }, "sha512-5eVrkiUuSWcqc8KOWwXzN/1KwbgVzS/9AZjwZ7GJdFYBmRTOkFVhgKlx86VsXecgzuJ6tUSP72ChyPEDgYuh+g=="],
"@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="],
@ -1242,15 +1242,15 @@
"@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="],
"@cornerstonejs/core": ["@cornerstonejs/core@4.5.5", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-fThmbuCEZosLUf46pNxAj0UiNYWpjKYNAj0pJoOLc6Ck3Q6lzsA4lF7Hv2LT9Ek0P9Hdfjwjjfjm4mkLevmZBg=="],
"@cornerstonejs/core": ["@cornerstonejs/core@4.5.13", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-a/cQ16KNxVW32WdIihAjt/ry5SP+O6ffQ8ecf0iNa/cbqyOuvw+R6xSue2ZcTLHm/vC3R7PaocDdAwuvIEVwKw=="],
"@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.5.5", "", { "dependencies": { "@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.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.5.5" } }, "sha512-v6nLkpS8rEFkNK8ROZkKQkiHDhOoGmVvknnKSuK0tWpN3Lpha9tfAfWiZyOJGV/HJcZhmXQcnbk3hR8/QUEs6w=="],
"@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.5.13", "", { "dependencies": { "@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.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.5.13" } }, "sha512-2u5yiS3gObKMWAeABhBl9OpWK5fSclMIWjYVgF9bAu9lNIksRkbRj6U+gpcftAKKXF0gW+uecRIiBqFgEcr2eQ=="],
"@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.5.5", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.5.5", "@cornerstonejs/tools": "4.5.5", "@kitware/vtk.js": "32.12.1" } }, "sha512-76z3uL1J/ASS2d0qBApDVq8JQ3S5mXMD+xZhfrrbqPCkk4X9d9UyLyjylxDgFjlE3QRL+l27/nAyn4yshW6wHA=="],
"@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.5.13", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.5.13", "@cornerstonejs/tools": "4.5.13", "@kitware/vtk.js": "32.12.1" } }, "sha512-DbmdJ4jyaJbXaNL3/jVSzA90JHQpV3Q2qsaTTRJoUfVhklgZs64ehyhv5UxR9C5wJoAyiUUGx7zDITX0R0on2w=="],
"@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.5.5", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.5.5", "@cornerstonejs/tools": "4.5.5", "@kitware/vtk.js": "32.12.1" } }, "sha512-KO6nM/NovzYz3txLKlpAciJDUpIQHI9cga1PpvnqtxGMxdLkXOkaKHeeN506qQD9MAGkTqpy2Z6pYflgRG9PYw=="],
"@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.5.13", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.5.13", "@cornerstonejs/tools": "4.5.13", "@kitware/vtk.js": "32.12.1" } }, "sha512-aQTHy2Sz8svoEVJUiK+bbJ9CTPDAly4qScMuzO5hd72MxEzhqcTWACsAIqGP6nlzBSnytQwapB7Xpbmb+N6rwA=="],
"@cornerstonejs/tools": ["@cornerstonejs/tools@4.5.5", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.5.5", "@kitware/vtk.js": "32.12.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-IruCR6KWYM4Z1opnPod8bNkEtJnnQyfFXr0ilmRNDNHj6jQ1/uWQQX/Ss+eWnkAALCUYAU1Co/6zWL5Nuowp8A=="],
"@cornerstonejs/tools": ["@cornerstonejs/tools@4.5.13", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.5.13", "@kitware/vtk.js": "32.12.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-aAzXwhLc/qNMPQFryu+xJaur9IHKdhxZBDcINLwl0nerMgLpPF2vIbFHvGJQNTl2njzo9Z64MJFDMVnB/rdWtQ=="],
"@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.5.5",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/core": "4.5.13",
"@kitware/vtk.js": "32.12.0",
"react-color": "2.19.3"
}

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.5.5",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/core": "4.5.13",
"@kitware/vtk.js": "32.12.0",
"react-color": "2.19.3"
}

View File

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

View File

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

View File

@ -40,7 +40,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.2.4",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "4.5.5",
"@cornerstonejs/dicom-image-loader": "4.5.13",
"@ohif/core": "3.12.0-beta.67",
"@ohif/ui": "3.12.0-beta.67",
"dcmjs": "0.43.1",
@ -53,12 +53,12 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "4.5.5",
"@cornerstonejs/ai": "4.5.5",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/labelmap-interpolation": "4.5.5",
"@cornerstonejs/polymorphic-segmentation": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/ai": "4.5.13",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/labelmap-interpolation": "4.5.13",
"@cornerstonejs/polymorphic-segmentation": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "1.4.1",

View File

@ -266,10 +266,35 @@ function commandsModule({
referencedDisplaySetInstanceUID
);
storePositionPresentation(referencedDisplaySet);
return commandsManager.runCommand('loadSegmentationDisplaySetsForViewport', {
const results = commandsManager.runCommand('loadSegmentationDisplaySetsForViewport', {
viewportId,
displaySetInstanceUIDs: [referencedDisplaySet.displaySetInstanceUID],
});
const disableEditing = customizationService.getCustomization(
'panelSegmentation.disableEditing'
);
if (disableEditing) {
const segmentationRepresentations = segmentationService.getSegmentationRepresentations(
viewportId,
{
segmentationId: displaySet.displaySetInstanceUID,
}
);
segmentationRepresentations.forEach(representation => {
const segmentIndices = Object.keys(representation.segments);
segmentIndices.forEach(segmentIndex => {
segmentationService.setSegmentLocked(
representation.segmentationId,
parseInt(segmentIndex),
true
);
});
});
}
return results;
} else if (displaySet.Modality === 'SR') {
const results = commandsManager.runCommand('hydrateStructuredReport', {
displaySetInstanceUID: displaySet.displaySetInstanceUID,

View File

@ -32,8 +32,8 @@
"start": "yarn run dev"
},
"peerDependencies": {
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.12.0-beta.67",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.67",
"@ohif/extension-default": "3.12.0-beta.67",

View File

@ -42,8 +42,8 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.12.0-beta.67",
"@ohif/extension-cornerstone": "3.12.0-beta.67",
"@ohif/extension-default": "3.12.0-beta.67",

View File

@ -34,8 +34,8 @@
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/tools": "4.5.5",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.12.0-beta.67",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.67",
"@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.67",

View File

@ -53,7 +53,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.2.4",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "4.5.5",
"@cornerstonejs/dicom-image-loader": "4.5.13",
"@emotion/serialize": "1.3.3",
"@ohif/core": "3.12.0-beta.67",
"@ohif/extension-cornerstone": "3.12.0-beta.67",

View File

@ -37,8 +37,8 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "1.2.4",
"@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/core": "4.5.5",
"@cornerstonejs/dicom-image-loader": "4.5.5",
"@cornerstonejs/core": "4.5.13",
"@cornerstonejs/dicom-image-loader": "4.5.13",
"@ohif/ui": "3.12.0-beta.67",
"cornerstone-math": "0.1.9",
"dicom-parser": "1.8.21"

View File

@ -54,7 +54,10 @@ const renderRangeSetting = option => {
key={option.id}
>
<div className="w-1/3 text-[13px]">{option.name}</div>
<div className="w-2/3">
<div
className="w-2/3"
data-cy={option.id}
>
<RowInputRange
minValue={option.min}
maxValue={option.max}

View File

@ -0,0 +1,144 @@
import { test, expect } from 'playwright-test-coverage';
import { visitStudy } from './utils';
import { viewportSVGPathLocator } from './utils/locators';
import { simulateNormalizedDragOnElement } from './utils/simulateDragOnElement';
const studyInstanceUID = '1.2.840.113619.2.290.3.3767434740.226.1600859119.501';
test('should not allow contours to be edited in basic viewer mode', async ({ page }) => {
const mode = 'viewer';
await visitStudy(page, studyInstanceUID, mode, 2000);
await page.getByTestId('side-panel-header-right').click();
await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
// Wait for the segmentation to be loaded.
await page.waitForTimeout(5000);
await page.getByTestId('yes-hydrate-btn').click();
// Wait for the segmentation to hydrate.
await page.waitForTimeout(5000);
const svgPathLocatorPreEdit = viewportSVGPathLocator({ page, viewportId: 'default' });
expect(
await svgPathLocatorPreEdit.count(),
'Expected exactly 1 path element in the viewport'
).toBe(1);
const expectedPathCommands = await svgPathLocatorPreEdit.getAttribute('d');
// Try to drag one of the edges of the rectangular contour.
await simulateNormalizedDragOnElement({
locator: svgPathLocatorPreEdit,
start: { x: 0.1, y: 0 },
end: { x: 0.1, y: -0.2 },
});
const svgPathLocatorPostEdit = viewportSVGPathLocator({ page, viewportId: 'default' });
expect(
await svgPathLocatorPostEdit.getAttribute('d'),
'Expected the path commands to be the same as the pre-edit path commands'
).toBe(expectedPathCommands);
});
test('should not allow contours to be edited when panelSegmentation.disableEditing is true', async ({
page,
}) => {
const mode = 'segmentation';
await visitStudy(page, studyInstanceUID, mode, 2000);
await page.getByTestId('side-panel-header-right').click();
await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
// Wait for the segmentation to be loaded.
await page.waitForTimeout(5000);
// disable editing of segmentations via the customization service
await page.evaluate(() => {
window.services.customizationService.setGlobalCustomization(
'panelSegmentation.disableEditing',
{
$set: true,
}
);
});
await page.getByTestId('yes-hydrate-btn').click();
// Wait for the segmentation to hydrate.
await page.waitForTimeout(5000);
const svgPathLocatorPreEdit = viewportSVGPathLocator({ page, viewportId: 'default' });
expect(
await svgPathLocatorPreEdit.count(),
'Expected exactly 1 path element in the viewport'
).toBe(1);
const expectedPathCommands = await svgPathLocatorPreEdit.getAttribute('d');
// Try to drag one of the edges of the rectangular contour.
await simulateNormalizedDragOnElement({
locator: svgPathLocatorPreEdit,
start: { x: 0.1, y: 0 },
end: { x: 0.1, y: -0.2 },
});
const svgPathLocatorPostEdit = viewportSVGPathLocator({ page, viewportId: 'default' });
expect(
await svgPathLocatorPostEdit.getAttribute('d'),
'Expected the path commands to be the same as the pre-edit path commands'
).toBe(expectedPathCommands);
});
test('should allow contours to be edited when panelSegmentation.disableEditing is false', async ({
page,
}) => {
const mode = 'segmentation';
await visitStudy(page, studyInstanceUID, mode, 2000);
await page.getByTestId('side-panel-header-right').click();
await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
// Wait for the segmentation to be loaded.
await page.waitForTimeout(5000);
// disable editing of segmentations via the customization service
await page.evaluate(() => {
window.services.customizationService.setGlobalCustomization(
'panelSegmentation.disableEditing',
{
$set: false,
}
);
});
await page.getByTestId('yes-hydrate-btn').click();
// Wait for the segmentation to hydrate.
await page.waitForTimeout(5000);
const svgPathLocatorPreEdit = viewportSVGPathLocator({ page, viewportId: 'default' });
expect(
await svgPathLocatorPreEdit.count(),
'Expected exactly 1 path element in the viewport'
).toBe(1);
const preEditPathCommands = await svgPathLocatorPreEdit.getAttribute('d');
// Try to drag one of the edges of the rectangular contour.
await simulateNormalizedDragOnElement({
locator: svgPathLocatorPreEdit,
start: { x: 0.1, y: 0 },
end: { x: 0.1, y: -0.2 },
});
const svgPathLocatorPostEdit = viewportSVGPathLocator({ page, viewportId: 'default' });
expect(
await svgPathLocatorPostEdit.getAttribute('d'),
'Not expecting the path commands to be the same as the pre-edit path commands'
).not.toBe(preEditPathCommands);
});

View File

@ -0,0 +1,118 @@
import { test } from 'playwright-test-coverage';
import { visitStudy, checkForScreenshot, screenShotPaths } from './utils';
import { press } from './utils/keyboardUtils';
import { simulateNormalizedDragOnElement } from './utils/simulateDragOnElement';
import { viewportLocator } from './utils/locators';
test.beforeEach(async ({ page }) => {
const studyInstanceUID = '1.3.6.1.4.1.14519.5.2.1.256467663913010332776401703474716742458';
const mode = 'segmentation';
await visitStudy(page, studyInstanceUID, mode, 2000);
});
test('should prevent editing of label map segmentations when panelSegmentation.disableEditing is true', async ({
page,
}) => {
// disable editing of segmentations via the customization service
await page.evaluate(() => {
window.services.customizationService.setGlobalCustomization(
'panelSegmentation.disableEditing',
{
$set: true,
}
);
});
await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
// Wait for the segmentation to be loaded.
await page.waitForTimeout(5000);
await page.getByTestId('yes-hydrate-btn').click();
// Wait for the segmentation to hydrate.
await page.waitForTimeout(5000);
// navigate to the 12th image and ensure the correct overlay is displayed
await press({ page, key: 'ArrowDown', nTimes: 11 });
await checkForScreenshot(page, page, screenShotPaths.labelMapSegLocking.globalLockedSegPreEdit);
// Attempt to erase the segmentations.
await page.getByTestId('Eraser-btn').click();
// Use the largest eraser radius to help ensure the entire image is erased.
await page.locator(`css=div[data-cy="eraser-radius"] input`).fill('1000');
// Attempt to erase the segmentations by dragging the eraser tool across the image several times.
await simulateNormalizedDragOnElement({
locator: viewportLocator({ page, viewportId: 'default' }),
start: { x: 0.01, y: 0.25 },
end: { x: 1.0, y: 0.25 },
});
await simulateNormalizedDragOnElement({
locator: viewportLocator({ page, viewportId: 'default' }),
start: { x: 0.01, y: 0.5 },
end: { x: 1.0, y: 0.5 },
});
await simulateNormalizedDragOnElement({
locator: viewportLocator({ page, viewportId: 'default' }),
start: { x: 0.01, y: 0.75 },
end: { x: 1.0, y: 0.75 },
});
await checkForScreenshot(page, page, screenShotPaths.labelMapSegLocking.globalLockedSegPostEdit);
});
test('should allow editing of label map segmentations when panelSegmentation.disableEditing is false', async ({
page,
}) => {
// disable editing of segmentations via the customization service
await page.evaluate(() => {
window.services.customizationService.setGlobalCustomization(
'panelSegmentation.disableEditing',
{
$set: false,
}
);
});
await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
// Wait for the segmentation to be loaded.
await page.waitForTimeout(5000);
await page.getByTestId('yes-hydrate-btn').click();
// Wait for the segmentation to hydrate.
await page.waitForTimeout(5000);
// navigate to the 12th image and ensure the correct overlay is displayed
await press({ page, key: 'ArrowDown', nTimes: 11 });
await checkForScreenshot(page, page, screenShotPaths.labelMapSegLocking.globalUnlockedSegPreEdit);
// Attempt to erase the segmentations.
await page.getByTestId('Eraser-btn').click();
// Use the largest eraser radius to help ensure the eraser passes over the entire image.
await page.locator(`css=div[data-cy="eraser-radius"] input`).fill('1000');
// Attempt to erase the segmentations by dragging the eraser tool across the image several times.
await simulateNormalizedDragOnElement({
locator: viewportLocator({ page, viewportId: 'default' }),
start: { x: 0.01, y: 0.25 },
end: { x: 1.0, y: 0.25 },
});
await simulateNormalizedDragOnElement({
locator: viewportLocator({ page, viewportId: 'default' }),
start: { x: 0.01, y: 0.5 },
end: { x: 1.0, y: 0.5 },
});
await simulateNormalizedDragOnElement({
locator: viewportLocator({ page, viewportId: 'default' }),
start: { x: 0.01, y: 0.75 },
end: { x: 1.0, y: 0.75 },
});
await checkForScreenshot(
page,
page,
screenShotPaths.labelMapSegLocking.globalUnlockedSegPostEdit
);
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

View File

@ -9,3 +9,23 @@ export const viewportLocator = ({
}): Locator => {
return page.locator(`css=div[data-viewportid="${viewportId}"]`);
};
export const viewportSVGLocator = ({
page,
viewportId,
}: {
page: Page;
viewportId: string;
}): Locator => {
return page.locator(`css=div[data-viewportid="${viewportId}"] svg`);
};
export const viewportSVGPathLocator = ({
page,
viewportId,
}: {
page: Page;
viewportId: string;
}): Locator => {
return page.locator(`css=div[data-viewportid="${viewportId}"] svg path`);
};

View File

@ -26,6 +26,12 @@ const screenShotPaths = {
ellipse: {
ellipseDisplayedCorrectly: 'ellipseDisplayedCorrectly.png',
},
labelMapSegLocking: {
globalLockedSegPreEdit: 'lockedSegPreEdit.png',
globalLockedSegPostEdit: 'lockedSegPostEdit.png',
globalUnlockedSegPreEdit: 'unlockedSegPreEdit.png',
globalUnlockedSegPostEdit: 'unlockedSegPostEdit.png',
},
length: {
lengthDisplayedCorrectly: 'lengthDisplayedCorrectly.png',
},

View File

@ -0,0 +1,67 @@
import { Locator } from 'playwright';
/**
* Simulates a drag operation on an element using normalized coordinates.
*
* @param locator - The locator to drag on.
* @param start - The start point with x and y coordinates, normalized to the element's bounding box.
* @param end - The end point with x and y coordinates, normalized to the element's bounding box.
* @param button - The mouse button to use for the drag (default is 'left').
* @param delay - Milliseconds between steps (default is 50).
* @param steps - Number of intermediate positions for smooth dragging (default is 5).
*/
export async function simulateNormalizedDragOnElement({
locator,
start,
end,
button = 'left',
delay = 50,
steps = 10,
}: {
locator: Locator;
start: { x: number; y: number };
end: { x: number; y: number };
button?: 'left' | 'right' | 'middle';
delay?: number;
steps?: number;
}) {
const bBox = await locator.boundingBox();
if (!bBox) {
throw new Error('Element bounding box not found');
}
const startPosition = {
x: bBox.x + start.x * bBox.width,
y: bBox.y + start.y * bBox.height,
};
const endPosition = {
x: bBox.x + end.x * bBox.width,
y: bBox.y + end.y * bBox.height,
};
// Get the page from the locator context
const page = locator.page();
page.mouse.move(startPosition.x, startPosition.y);
// Start drag
await page.mouse.down({ button });
// Calculate intermediate positions for smooth dragging
const deltaX = (endPosition.x - startPosition.x) / steps;
const deltaY = (endPosition.y - startPosition.y) / steps;
// Move through intermediate positions
for (let i = 1; i <= steps; i++) {
const currentX = startPosition.x + deltaX * i;
const currentY = startPosition.y + deltaY * i;
// Add delay if specified
if (delay > 0) {
await page.waitForTimeout(delay);
}
await page.mouse.move(currentX, currentY);
}
// End drag
await page.mouse.up({ button });
}

View File

@ -1280,10 +1280,10 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@cornerstonejs/adapters@4.5.5":
version "4.5.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.5.5.tgz#c1efbd5fb9a744ffd7034453ca2d32b754e6b4fc"
integrity sha512-tZC8ScqmSouWt5/0t9cUqtsSVW5ObhniyuZuF6QZvXOyWU7I4fkmtNX4RtTUi9cvuqoDA0nckejkEQhp5OjKEw==
"@cornerstonejs/adapters@4.5.13":
version "4.5.13"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.5.13.tgz#432a5c2a3131ab0ded4a36efebbf971ce3d71e55"
integrity sha512-qWB32zsY4Ets2/si2fUBqHckBZYrdEYSPK/mya3S4+qLdB5KImZZJQYq4aqVg+gRvZc9aHIKVI1jjZCkxdvV0A==
dependencies:
"@babel/runtime-corejs2" "7.26.10"
buffer "6.0.3"
@ -1291,10 +1291,10 @@
gl-matrix "3.4.3"
ndarray "1.0.19"
"@cornerstonejs/ai@4.5.5":
version "4.5.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.5.5.tgz#1fb0dab8dcc4f723b8887d8d6c2d3c412549847f"
integrity sha512-31/ARIIr2EyDwyeNsI58XLYpbEikaPqYuR/7tQMFvqwX0plpsaAZx0wQ+ta0YBag9/vAtpuyjg1sGMaqS7v9Yw==
"@cornerstonejs/ai@4.5.13":
version "4.5.13"
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.5.13.tgz#d2d662344266d0957bd90d154d94113b83a6633d"
integrity sha512-5eVrkiUuSWcqc8KOWwXzN/1KwbgVzS/9AZjwZ7GJdFYBmRTOkFVhgKlx86VsXecgzuJ6tUSP72ChyPEDgYuh+g==
dependencies:
"@babel/runtime-corejs2" "7.26.10"
buffer "6.0.3"
@ -1330,20 +1330,20 @@
resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.7.tgz#784394d05d8cf735640e9c3baa206535ee8e0376"
integrity sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w==
"@cornerstonejs/core@4.5.5":
version "4.5.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.5.5.tgz#0fe82a443810105c742cbc4ed5a8f8f26b4535f9"
integrity sha512-fThmbuCEZosLUf46pNxAj0UiNYWpjKYNAj0pJoOLc6Ck3Q6lzsA4lF7Hv2LT9Ek0P9Hdfjwjjfjm4mkLevmZBg==
"@cornerstonejs/core@4.5.13":
version "4.5.13"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.5.13.tgz#c11ea09bf97ef5af2d85b2569dac3a81233e1143"
integrity sha512-a/cQ16KNxVW32WdIihAjt/ry5SP+O6ffQ8ecf0iNa/cbqyOuvw+R6xSue2ZcTLHm/vC3R7PaocDdAwuvIEVwKw==
dependencies:
"@kitware/vtk.js" "32.12.1"
comlink "4.4.2"
gl-matrix "3.4.3"
loglevel "1.9.2"
"@cornerstonejs/dicom-image-loader@4.5.5":
version "4.5.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.5.5.tgz#441509fa5173f3ee5e7253d741ecca8e718d2f78"
integrity sha512-v6nLkpS8rEFkNK8ROZkKQkiHDhOoGmVvknnKSuK0tWpN3Lpha9tfAfWiZyOJGV/HJcZhmXQcnbk3hR8/QUEs6w==
"@cornerstonejs/dicom-image-loader@4.5.13":
version "4.5.13"
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.5.13.tgz#f79253a818fc31659c9803a35fdda4d5a3eeab84"
integrity sha512-2u5yiS3gObKMWAeABhBl9OpWK5fSclMIWjYVgF9bAu9lNIksRkbRj6U+gpcftAKKXF0gW+uecRIiBqFgEcr2eQ==
dependencies:
"@cornerstonejs/codec-charls" "1.2.3"
"@cornerstonejs/codec-libjpeg-turbo-8bit" "1.2.2"
@ -1355,25 +1355,25 @@
pako "2.1.0"
uuid "9.0.1"
"@cornerstonejs/labelmap-interpolation@4.5.5":
version "4.5.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.5.5.tgz#6d92183e647442966983df56cf371e1e84ad2dc9"
integrity sha512-76z3uL1J/ASS2d0qBApDVq8JQ3S5mXMD+xZhfrrbqPCkk4X9d9UyLyjylxDgFjlE3QRL+l27/nAyn4yshW6wHA==
"@cornerstonejs/labelmap-interpolation@4.5.13":
version "4.5.13"
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.5.13.tgz#a84cffd2ec132444957229495fc356bd5e827894"
integrity sha512-DbmdJ4jyaJbXaNL3/jVSzA90JHQpV3Q2qsaTTRJoUfVhklgZs64ehyhv5UxR9C5wJoAyiUUGx7zDITX0R0on2w==
dependencies:
"@itk-wasm/morphological-contour-interpolation" "1.1.0"
itk-wasm "1.0.0-b.165"
"@cornerstonejs/polymorphic-segmentation@4.5.5":
version "4.5.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.5.5.tgz#c700f76748aa88e8fad6c8d922736d8c143c6109"
integrity sha512-KO6nM/NovzYz3txLKlpAciJDUpIQHI9cga1PpvnqtxGMxdLkXOkaKHeeN506qQD9MAGkTqpy2Z6pYflgRG9PYw==
"@cornerstonejs/polymorphic-segmentation@4.5.13":
version "4.5.13"
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.5.13.tgz#5ddedb7b290213b6012ee65804523306a8d79807"
integrity sha512-aQTHy2Sz8svoEVJUiK+bbJ9CTPDAly4qScMuzO5hd72MxEzhqcTWACsAIqGP6nlzBSnytQwapB7Xpbmb+N6rwA==
dependencies:
"@icr/polyseg-wasm" "0.4.0"
"@cornerstonejs/tools@4.5.5":
version "4.5.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.5.5.tgz#4b2e519873211298f4d82020922d6d363180693d"
integrity sha512-IruCR6KWYM4Z1opnPod8bNkEtJnnQyfFXr0ilmRNDNHj6jQ1/uWQQX/Ss+eWnkAALCUYAU1Co/6zWL5Nuowp8A==
"@cornerstonejs/tools@4.5.13":
version "4.5.13"
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.5.13.tgz#b4d09fca3e0d56792218935f40c480eeb1142131"
integrity sha512-aAzXwhLc/qNMPQFryu+xJaur9IHKdhxZBDcINLwl0nerMgLpPF2vIbFHvGJQNTl2njzo9Z64MJFDMVnB/rdWtQ==
dependencies:
"@types/offscreencanvas" "2019.7.3"
comlink "4.4.2"