diff --git a/bun.lock b/bun.lock index 123bb7551..6a7853c7e 100644 --- a/bun.lock +++ b/bun.lock @@ -50,7 +50,7 @@ }, "addOns/externals/devDependencies": { "name": "@externals/devDependencies", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "dicom-microscopy-viewer": "0.48.17", }, }, "extensions/cornerstone": { "name": "@ohif/extension-cornerstone", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.21.7", - "@cornerstonejs/ai": "4.21.7", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/labelmap-interpolation": "4.21.7", - "@cornerstonejs/polymorphic-segmentation": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/adapters": "4.22.3", + "@cornerstonejs/ai": "4.22.3", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/labelmap-interpolation": "4.22.3", + "@cornerstonejs/polymorphic-segmentation": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "@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.21.7", - "@ohif/core": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", + "@cornerstonejs/dicom-image-loader": "4.22.3", + "@ohif/core": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.21.7", - "@cornerstonejs/core": "4.21.7", + "@cornerstonejs/adapters": "4.22.3", + "@cornerstonejs/core": "4.22.3", "@kitware/vtk.js": "34.15.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/i18n": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/i18n": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/i18n": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/i18n": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.21.7", - "@cornerstonejs/core": "4.21.7", + "@cornerstonejs/adapters": "4.22.3", + "@cornerstonejs/core": "4.22.3", "@kitware/vtk.js": "34.15.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/i18n": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/i18n": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.21.7", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/adapters": "4.22.3", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-measurement-tracking": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-measurement-tracking": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/i18n": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/i18n": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "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.61", - "@ohif/i18n": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/i18n": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "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.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/i18n": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/i18n": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", - "@ohif/ui": "3.13.0-beta.61", + "@ohif/ui": "3.13.0-beta.64", "@xstate/react": "3.2.2", "xstate": "4.38.3", }, "peerDependencies": { - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/i18n": "3.13.0-beta.61", - "@ohif/ui-next": "3.13.0-beta.61", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/i18n": "3.13.0-beta.64", + "@ohif/ui-next": "3.13.0-beta.64", }, "devDependencies": { "@babel/core": "7.28.0", @@ -476,7 +476,7 @@ }, "modes/basic": { "name": "@ohif/mode-basic", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", }, @@ -485,19 +485,19 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/extension-dicom-pdf": "3.13.0-beta.61", - "@ohif/extension-dicom-video": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/extension-dicom-pdf": "3.13.0-beta.64", + "@ohif/extension-dicom-video": "3.13.0-beta.64", }, }, "modes/basic-dev-mode": { "name": "@ohif/mode-basic-dev-mode", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "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.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/extension-dicom-pdf": "3.13.0-beta.61", - "@ohif/extension-dicom-video": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/extension-dicom-pdf": "3.13.0-beta.64", + "@ohif/extension-dicom-video": "3.13.0-beta.64", }, }, "modes/basic-test-mode": { "name": "@ohif/mode-test", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "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.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/extension-dicom-pdf": "3.13.0-beta.61", - "@ohif/extension-dicom-video": "3.13.0-beta.61", - "@ohif/extension-measurement-tracking": "3.13.0-beta.61", - "@ohif/extension-test": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/extension-dicom-pdf": "3.13.0-beta.64", + "@ohif/extension-dicom-video": "3.13.0-beta.64", + "@ohif/extension-measurement-tracking": "3.13.0-beta.64", + "@ohif/extension-test": "3.13.0-beta.64", }, }, "modes/longitudinal": { "name": "@ohif/mode-longitudinal", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "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.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/extension-dicom-pdf": "3.13.0-beta.61", - "@ohif/extension-dicom-video": "3.13.0-beta.61", - "@ohif/extension-measurement-tracking": "3.13.0-beta.61", - "@ohif/mode-basic": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/extension-dicom-pdf": "3.13.0-beta.64", + "@ohif/extension-dicom-video": "3.13.0-beta.64", + "@ohif/extension-measurement-tracking": "3.13.0-beta.64", + "@ohif/mode-basic": "3.13.0-beta.64", }, }, "modes/microscopy": { "name": "@ohif/mode-microscopy", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-dicom-microscopy": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-dicom-microscopy": "3.13.0-beta.64", }, }, "modes/preclinical-4d": { "name": "@ohif/mode-preclinical-4d", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", }, @@ -594,7 +594,7 @@ }, "modes/segmentation": { "name": "@ohif/mode-segmentation", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.61", - "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.61", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", + "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.64", "i18next": "17.3.1", }, "devDependencies": { @@ -693,34 +693,34 @@ }, "platform/app": { "name": "@ohif/app", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "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.21.7", + "@cornerstonejs/dicom-image-loader": "4.22.3", "@emotion/serialize": "1.3.3", - "@ohif/core": "3.13.0-beta.61", - "@ohif/extension-cornerstone": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.61", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.61", - "@ohif/extension-default": "3.13.0-beta.61", - "@ohif/extension-dicom-microscopy": "3.13.0-beta.61", - "@ohif/extension-dicom-pdf": "3.13.0-beta.61", - "@ohif/extension-dicom-video": "3.13.0-beta.61", - "@ohif/extension-test": "3.13.0-beta.61", - "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.61", - "@ohif/i18n": "3.13.0-beta.61", - "@ohif/mode-basic-dev-mode": "3.13.0-beta.61", - "@ohif/mode-longitudinal": "3.13.0-beta.61", - "@ohif/mode-microscopy": "3.13.0-beta.61", - "@ohif/mode-test": "3.13.0-beta.61", - "@ohif/mode-ultrasound-pleura-bline": "3.13.0-beta.61", - "@ohif/ui": "3.13.0-beta.61", - "@ohif/ui-next": "3.13.0-beta.61", + "@ohif/core": "3.13.0-beta.64", + "@ohif/extension-cornerstone": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.64", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", + "@ohif/extension-default": "3.13.0-beta.64", + "@ohif/extension-dicom-microscopy": "3.13.0-beta.64", + "@ohif/extension-dicom-pdf": "3.13.0-beta.64", + "@ohif/extension-dicom-video": "3.13.0-beta.64", + "@ohif/extension-test": "3.13.0-beta.64", + "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.64", + "@ohif/i18n": "3.13.0-beta.64", + "@ohif/mode-basic-dev-mode": "3.13.0-beta.64", + "@ohif/mode-longitudinal": "3.13.0-beta.64", + "@ohif/mode-microscopy": "3.13.0-beta.64", + "@ohif/mode-test": "3.13.0-beta.64", + "@ohif/mode-ultrasound-pleura-bline": "3.13.0-beta.64", + "@ohif/ui": "3.13.0-beta.64", + "@ohif/ui-next": "3.13.0-beta.64", "@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.61", + "version": "3.13.0-beta.64", "bin": { "ohif-cli": "src/index.js", }, @@ -796,7 +796,7 @@ }, "platform/core": { "name": "@ohif/core", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "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.21.7", - "@cornerstonejs/dicom-image-loader": "4.21.7", - "@ohif/ui": "3.13.0-beta.61", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/dicom-image-loader": "4.22.3", + "@ohif/ui": "3.13.0-beta.64", "cornerstone-math": "0.1.10", "dicom-parser": "1.8.21", }, }, "platform/i18n": { "name": "@ohif/i18n", - "version": "3.13.0-beta.61", + "version": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "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.61", + "version": "3.13.0-beta.64", "dependencies": { "@radix-ui/react-accordion": "1.2.11", "@radix-ui/react-checkbox": "1.3.2", @@ -1242,9 +1242,9 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], - "@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.21.7", "", { "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.21.7", "@cornerstonejs/tools": "4.21.7" } }, "sha512-a9lGNlcLuuk81c8H2F4rotrMxTf9EGursSVIdz7n0cQ8nJmebSZTmp5FWGLDadRxh9pIxMeC52JTcDVd3JR9MQ=="], + "@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.22.3", "", { "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.22.3", "@cornerstonejs/tools": "4.22.3" } }, "sha512-58TaTUl7AmLARnKApfz9c5IWzIaPPewH8sjD0BxKu5PeVHSRSlKX7jH4pv1akapIbDqXBEW6unb45kLmm6u7dg=="], - "@cornerstonejs/ai": ["@cornerstonejs/ai@4.21.7", "", { "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.21.7", "@cornerstonejs/tools": "4.21.7" } }, "sha512-tVXRvGfHsZdE+eODMWD0sAAf6YlCmCRDGbQU/kX4kN27B7TwOwjzK4FFhReO6qf5MFf/7KjLfB0sQhab45t3Lw=="], + "@cornerstonejs/ai": ["@cornerstonejs/ai@4.22.3", "", { "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.22.3", "@cornerstonejs/tools": "4.22.3" } }, "sha512-NhRcQISjcDCp7rWCK9hGmCgsS36XKyT4AsCBgXuG7iU3ghI77j5kt9sUdqi0M4lRYLYZ1XMrFSDjNDCwFP+eYg=="], "@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="], @@ -1256,15 +1256,15 @@ "@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="], - "@cornerstonejs/core": ["@cornerstonejs/core@4.21.7", "", { "dependencies": { "@kitware/vtk.js": "34.15.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-wZkALM/P6TTODtbSeOOZvzWKXjyMRKtsyWJ6NL61BveIlNxATpBbrAIj0dqLVasdF45XcJO5Qn4TiSO/kgKRGA=="], + "@cornerstonejs/core": ["@cornerstonejs/core@4.22.3", "", { "dependencies": { "@kitware/vtk.js": "34.15.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-oxLcg24ER3HHSAEsz3iG7+cb2oHnVSzt7H8EeRtK69e6Ztjl6XkEmXeAbbJypm2QYIkPYb3oJb6zWeYOz1NtYw=="], - "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.21.7", "", { "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.21.7" } }, "sha512-wtfKs/U+FM2M7HHiNTFJwujs8TEU2rBz03Fx4Bc//vpktasUN9bqLl/eQ/9zfmz8Cdi12BewVpORd7l4nUmhtQ=="], + "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.22.3", "", { "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.22.3" } }, "sha512-TVPSc3PUvy2I6+ZnWX8B2uqJZ5onUd/+e+m/BfeEdZC51GMhC4VfTmqOwOjWDNDyO35ZA9j1mqk8iIJzDpqoeA=="], - "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.21.7", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.21.7", "@cornerstonejs/tools": "4.21.7", "@kitware/vtk.js": "34.15.1" } }, "sha512-YJGVLjcpG58joBVOWnjHdw7FKGJimryVVJOoCfjLgNsKuoKEkhneTkOMTXsM29ArpgBNOmMYaBPSyf4ZjNxDRQ=="], + "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.22.3", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3", "@cornerstonejs/tools": "4.22.3", "@kitware/vtk.js": "34.15.1" } }, "sha512-ngschi2EKr+47LWbbTiu6tt3aw4e7yp0mVCDXwJm1Z2eyugemiiAQvOT77EKSBZ//L2fAZR3Edr+qJFzPa5KUw=="], - "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.21.7", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.21.7", "@cornerstonejs/tools": "4.21.7", "@kitware/vtk.js": "34.15.1" } }, "sha512-4qxVMY0LJ+ffJfbzvzFOwe6j1p93pawwMEVcWRZkipE0pgtlW1SWlBvePCNb25yps6GUxNFPEmdUn5x/Lw77VQ=="], + "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.22.3", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3", "@cornerstonejs/tools": "4.22.3", "@kitware/vtk.js": "34.15.1" } }, "sha512-JNmtLbuwY8de3uwFf1YqySp5wt2BCT6kpg9gcoDNMmNxGDo0uT5yph1Muh+24sG7WDaoRwyzAEvG11h9NHgoqw=="], - "@cornerstonejs/tools": ["@cornerstonejs/tools@4.21.7", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.21.7", "@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-p8bWrEKdjeNzzZfN5NI6Wh7tiZyI3/lXqrdLlY+BCD1YRUdv+rybhyrg0JhpodJYEGrS4/wrkhCApOp9j9Evdg=="], + "@cornerstonejs/tools": ["@cornerstonejs/tools@4.22.3", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3", "@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-2XQmUesRWiqWTh3xGnLsQ6qqKI55vSVV4UqGXiPxnMcf6azDfEhcJO8JJCH1VXaDa89jxLBdZUDehUnb0UsIxA=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], diff --git a/extensions/cornerstone-dicom-pmap/package.json b/extensions/cornerstone-dicom-pmap/package.json index 8c792dbad..e42915338 100644 --- a/extensions/cornerstone-dicom-pmap/package.json +++ b/extensions/cornerstone-dicom-pmap/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.21.7", - "@cornerstonejs/core": "4.21.7", + "@cornerstonejs/adapters": "4.22.3", + "@cornerstonejs/core": "4.22.3", "@kitware/vtk.js": "34.15.1" } } diff --git a/extensions/cornerstone-dicom-seg/package.json b/extensions/cornerstone-dicom-seg/package.json index 96fa2a876..8ce57d627 100644 --- a/extensions/cornerstone-dicom-seg/package.json +++ b/extensions/cornerstone-dicom-seg/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.21.7", - "@cornerstonejs/core": "4.21.7", + "@cornerstonejs/adapters": "4.22.3", + "@cornerstonejs/core": "4.22.3", "@kitware/vtk.js": "34.15.1" } } diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index 4b7b2c883..73844a2c4 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -46,9 +46,9 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.21.7", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/adapters": "4.22.3", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "classnames": "2.5.1" } } diff --git a/extensions/cornerstone-dynamic-volume/package.json b/extensions/cornerstone-dynamic-volume/package.json index 6b7eb1395..5c6fab115 100644 --- a/extensions/cornerstone-dynamic-volume/package.json +++ b/extensions/cornerstone-dynamic-volume/package.json @@ -42,8 +42,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "classnames": "2.5.1" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index 5294fa5a8..706717766 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -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.21.7", + "@cornerstonejs/dicom-image-loader": "4.22.3", "@ohif/core": "3.13.0-beta.64", "@ohif/ui": "3.13.0-beta.64", "dcmjs": "0.49.4", @@ -53,12 +53,12 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.21.7", - "@cornerstonejs/ai": "4.21.7", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/labelmap-interpolation": "4.21.7", - "@cornerstonejs/polymorphic-segmentation": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/adapters": "4.22.3", + "@cornerstonejs/ai": "4.22.3", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/labelmap-interpolation": "4.22.3", + "@cornerstonejs/polymorphic-segmentation": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "@icr/polyseg-wasm": "0.4.0", "@itk-wasm/morphological-contour-interpolation": "1.1.0", "@kitware/vtk.js": "34.15.1", diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index 28fe1d3d1..c233a00a4 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -32,8 +32,8 @@ "start": "yarn run dev" }, "peerDependencies": { - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "@ohif/core": "3.13.0-beta.64", "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", "@ohif/extension-default": "3.13.0-beta.64", diff --git a/extensions/usAnnotation/package.json b/extensions/usAnnotation/package.json index 186f3cd1c..4c731ffe6 100644 --- a/extensions/usAnnotation/package.json +++ b/extensions/usAnnotation/package.json @@ -42,8 +42,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "@ohif/core": "3.13.0-beta.64", "@ohif/extension-cornerstone": "3.13.0-beta.64", "@ohif/extension-default": "3.13.0-beta.64", diff --git a/modes/usAnnotation/package.json b/modes/usAnnotation/package.json index ed7d31030..a31c61ac4 100644 --- a/modes/usAnnotation/package.json +++ b/modes/usAnnotation/package.json @@ -34,8 +34,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.21.7", - "@cornerstonejs/tools": "4.21.7", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/tools": "4.22.3", "@ohif/core": "3.13.0-beta.64", "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.64", "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.64", diff --git a/platform/app/package.json b/platform/app/package.json index e01f82480..523c3a0ea 100644 --- a/platform/app/package.json +++ b/platform/app/package.json @@ -54,7 +54,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.21.7", + "@cornerstonejs/dicom-image-loader": "4.22.3", "@emotion/serialize": "1.3.3", "@ohif/core": "3.13.0-beta.64", "@ohif/extension-cornerstone": "3.13.0-beta.64", diff --git a/platform/core/package.json b/platform/core/package.json index bfa309bcb..122c9fbbc 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -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.21.7", - "@cornerstonejs/dicom-image-loader": "4.21.7", + "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/dicom-image-loader": "4.22.3", "@ohif/ui": "3.13.0-beta.64", "cornerstone-math": "0.1.10", "dicom-parser": "1.8.21" diff --git a/tests/ZoomIn.spec.ts b/tests/ZoomIn.spec.ts new file mode 100644 index 000000000..66146a02e --- /dev/null +++ b/tests/ZoomIn.spec.ts @@ -0,0 +1,34 @@ +import { checkForScreenshot, screenShotPaths, test, visitStudy } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.12.2.1107.5.2.32.35162.30000015050317233592200000046'; + const mode = 'viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should render the magnified region with the same horizontal flip as the source viewport', async ({ + page, + mainToolbarPageObject, + viewportPageObject, +}) => { + await mainToolbarPageObject.moreTools.flipHorizontal.click(); + + const activeViewport = await viewportPageObject.active; + + await activeViewport.sliceNavigation.toSlice(61); + + await mainToolbarPageObject.moreTools.magnify.click(); + + await activeViewport.magnifyGlass.drag({ + start: { x: 0.78, y: 0.91 }, + mouseUp: false, + }); + + await checkForScreenshot( + page, + activeViewport.magnifyGlass.locator, + screenShotPaths.zoomIn.magnifyViewportDisplayedCorrectly + ); + + await activeViewport.magnifyGlass.stopDrag(); +}); diff --git a/tests/pages/MagnifyGlassPageObject.ts b/tests/pages/MagnifyGlassPageObject.ts new file mode 100644 index 000000000..76b6c4045 --- /dev/null +++ b/tests/pages/MagnifyGlassPageObject.ts @@ -0,0 +1,48 @@ +import { Locator, Page } from '@playwright/test'; +import { simulateNormalizedDragOnElement } from '../utils'; + +type MagnifyDragParams = { + start: { x: number; y: number }; + end?: { x: number; y: number }; + mouseUp?: boolean; + button?: 'left' | 'right' | 'middle'; + delay?: number; + steps?: number; +}; + +export class MagnifyGlassPageObject { + readonly page: Page; + readonly viewport: Locator; + + constructor(page: Page, viewport: Locator) { + this.page = page; + this.viewport = viewport; + } + + get locator(): Locator { + return this.viewport.locator('.magnifyTool'); + } + + async drag({ + start, + end, + button, + delay, + steps, + mouseUp = true, + }: MagnifyDragParams): Promise { + await simulateNormalizedDragOnElement({ + locator: this.viewport, + start, + end: end ?? start, + button, + delay, + steps, + mouseUp, + }); + } + + async stopDrag(): Promise { + await this.page.mouse.up(); + } +} diff --git a/tests/pages/MainToolbarPageObject.ts b/tests/pages/MainToolbarPageObject.ts index 42e7c106e..91a855edb 100644 --- a/tests/pages/MainToolbarPageObject.ts +++ b/tests/pages/MainToolbarPageObject.ts @@ -326,6 +326,16 @@ export class MainToolbarPageObject { }, }; }, + get magnify() { + const button = page.getByTestId('Magnify'); + return { + button, + async click() { + await moreTools.click(); + await button.click(); + }, + }; + }, }; } diff --git a/tests/pages/ViewportPageObject.ts b/tests/pages/ViewportPageObject.ts index ec0e4fb52..e62da5fc2 100644 --- a/tests/pages/ViewportPageObject.ts +++ b/tests/pages/ViewportPageObject.ts @@ -8,6 +8,7 @@ import { } from '../utils'; import { DataOverlayPageObject } from './DataOverlayPageObject'; import { DOMOverlayPageObject } from './DOMOverlayPageObject'; +import { MagnifyGlassPageObject } from './MagnifyGlassPageObject'; type SvgInnerElement = 'circle' | 'path' | 'd'; @@ -91,6 +92,13 @@ export interface IViewportPageObject { click: () => Promise; }; }; + sliceNavigation: { + toSlice: (sliceIndex: number) => Promise; + toFirstSlice: () => Promise; + toLastSlice: () => Promise; + scrollBy: (delta: number) => Promise; + }; + magnifyGlass: MagnifyGlassPageObject; } export class ViewportPageObject { @@ -200,6 +208,59 @@ export class ViewportPageObject { }; } + /** + * Note: awaiting the returned methods (toSlice, toFirstSlice, toLastSlice, scrollBy) + * does not guarantee the viewport has finished rendering. Follow up with + * `waitForViewportsRendered` if you need pixel-stable state. + */ + private getSliceNavigation(viewport: Locator) { + const page = this.page; + + const jumpToImage = async (imageIndex: number) => { + const viewportId = await this.getViewportId(viewport); + await page.evaluate( + ({ commandsManager, viewportId, imageIndex }) => { + return commandsManager.runCommand('jumpToImage', { + imageIndex, + viewport: { id: viewportId }, + }); + }, + { + viewportId, + imageIndex, + commandsManager: await page.evaluateHandle('window.commandsManager'), + } + ); + }; + + const scrollBy = async (delta: number) => { + const viewportId = await this.getViewportId(viewport); + await page.evaluate( + ({ services, viewportId, delta }) => { + const cornerstoneViewport = ( + services as any + ).cornerstoneViewportService.getCornerstoneViewport(viewportId); + if (!cornerstoneViewport) { + return; + } + return cornerstoneViewport.scroll(delta); + }, + { + viewportId, + delta, + services: await page.evaluateHandle('window.services'), + } + ); + }; + + return { + toSlice: jumpToImage, + toFirstSlice: () => jumpToImage(0), + toLastSlice: () => jumpToImage(-1), + scrollBy, + }; + } + private async viewportPageObjectFactory(viewport: Locator): Promise { return { nthAnnotation: (nth: number) => this.getAnnotation(viewport, nth), @@ -244,6 +305,8 @@ export class ViewportPageObject { return this.getSvg(viewport, innerElement); }, navigationArrows: this.getNavigationArrows(viewport), + sliceNavigation: this.getSliceNavigation(viewport), + magnifyGlass: new MagnifyGlassPageObject(this.page, viewport), }; } diff --git a/tests/pages/index.ts b/tests/pages/index.ts index 4976a9bd8..de771a76b 100644 --- a/tests/pages/index.ts +++ b/tests/pages/index.ts @@ -5,6 +5,7 @@ import { RightPanelPageObject } from './RightPanelPageObject'; import { ViewportPageObject } from './ViewportPageObject'; import { NotFoundStudyPageObject } from './NotFoundStudyPageObject'; import { DicomTagBrowserPageObject } from './DicomTagBrowserPageObject'; +import { MagnifyGlassPageObject } from './MagnifyGlassPageObject'; export { DOMOverlayPageObject, @@ -14,4 +15,5 @@ export { ViewportPageObject, NotFoundStudyPageObject, DicomTagBrowserPageObject, + MagnifyGlassPageObject, }; diff --git a/tests/screenshots/chromium/ZoomIn.spec.ts/magnifyViewportDisplayedCorrectly.png b/tests/screenshots/chromium/ZoomIn.spec.ts/magnifyViewportDisplayedCorrectly.png new file mode 100644 index 000000000..909c553a3 Binary files /dev/null and b/tests/screenshots/chromium/ZoomIn.spec.ts/magnifyViewportDisplayedCorrectly.png differ diff --git a/tests/utils/screenShotPaths.ts b/tests/utils/screenShotPaths.ts index 2946b73d6..65f209550 100644 --- a/tests/utils/screenShotPaths.ts +++ b/tests/utils/screenShotPaths.ts @@ -97,6 +97,9 @@ const screenShotPaths = { reset: { resetDisplayedCorrectly: 'resetDisplayedCorrectly.png', }, + zoomIn: { + magnifyViewportDisplayedCorrectly: 'magnifyViewportDisplayedCorrectly.png', + }, rtDataOverlayForUnreferencedDisplaySetNoHydration: { overlayFirstImage: 'overlayFirstImage.png', overlayMiddleImage: 'overlayMiddleImage.png', diff --git a/tests/utils/simulateDragOnElement.ts b/tests/utils/simulateDragOnElement.ts index 3a57e00fe..ac67e2336 100644 --- a/tests/utils/simulateDragOnElement.ts +++ b/tests/utils/simulateDragOnElement.ts @@ -17,6 +17,7 @@ export async function simulateNormalizedDragOnElement({ button = 'left', delay = 50, steps = 10, + mouseUp = true, }: { locator: Locator; start: { x: number; y: number }; @@ -24,6 +25,7 @@ export async function simulateNormalizedDragOnElement({ button?: 'left' | 'right' | 'middle'; delay?: number; steps?: number; + mouseUp?: boolean; }) { const bBox = await locator.boundingBox(); if (!bBox) { @@ -42,7 +44,7 @@ export async function simulateNormalizedDragOnElement({ // Get the page from the locator context const page = locator.page(); - page.mouse.move(startPosition.x, startPosition.y); + await page.mouse.move(startPosition.x, startPosition.y); // Start drag await page.mouse.down({ button }); @@ -63,5 +65,7 @@ export async function simulateNormalizedDragOnElement({ } // End drag - await page.mouse.up({ button }); + if (mouseUp) { + await page.mouse.up({ button }); + } } diff --git a/yarn.lock b/yarn.lock index b57814bf6..fec63bc11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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.21.7": - version "4.21.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.21.7.tgz#21ecebec3759eb06f0aabdbe9768bb63e672acf9" - integrity sha512-a9lGNlcLuuk81c8H2F4rotrMxTf9EGursSVIdz7n0cQ8nJmebSZTmp5FWGLDadRxh9pIxMeC52JTcDVd3JR9MQ== +"@cornerstonejs/adapters@4.22.3": + version "4.22.3" + resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.22.3.tgz#8d2d9246706fa7b9f72e2472b9a2fc9419d700ed" + integrity sha512-58TaTUl7AmLARnKApfz9c5IWzIaPPewH8sjD0BxKu5PeVHSRSlKX7jH4pv1akapIbDqXBEW6unb45kLmm6u7dg== 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.21.7": - version "4.21.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.21.7.tgz#d42801cbd5bee3974e57a878f1a6b71ea0f09930" - integrity sha512-tVXRvGfHsZdE+eODMWD0sAAf6YlCmCRDGbQU/kX4kN27B7TwOwjzK4FFhReO6qf5MFf/7KjLfB0sQhab45t3Lw== +"@cornerstonejs/ai@4.22.3": + version "4.22.3" + resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.22.3.tgz#a8f7d8ae05cef79dd9d8bafbfcc789e2f5dbc893" + integrity sha512-NhRcQISjcDCp7rWCK9hGmCgsS36XKyT4AsCBgXuG7iU3ghI77j5kt9sUdqi0M4lRYLYZ1XMrFSDjNDCwFP+eYg== 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.21.7": - version "4.21.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.21.7.tgz#3f838717e66add85abfe091aace45bf9beaac5e9" - integrity sha512-wZkALM/P6TTODtbSeOOZvzWKXjyMRKtsyWJ6NL61BveIlNxATpBbrAIj0dqLVasdF45XcJO5Qn4TiSO/kgKRGA== +"@cornerstonejs/core@4.22.3": + version "4.22.3" + resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.22.3.tgz#0532a7ffba163a8738c289d044ce04bc950479e3" + integrity sha512-oxLcg24ER3HHSAEsz3iG7+cb2oHnVSzt7H8EeRtK69e6Ztjl6XkEmXeAbbJypm2QYIkPYb3oJb6zWeYOz1NtYw== 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.21.7": - version "4.21.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.21.7.tgz#302f88a1195525df607bf4eefddbbe0e94641c62" - integrity sha512-wtfKs/U+FM2M7HHiNTFJwujs8TEU2rBz03Fx4Bc//vpktasUN9bqLl/eQ/9zfmz8Cdi12BewVpORd7l4nUmhtQ== +"@cornerstonejs/dicom-image-loader@4.22.3": + version "4.22.3" + resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.22.3.tgz#f3d91191cb27d840a9aa49b6c78d0b1f3634acc0" + integrity sha512-TVPSc3PUvy2I6+ZnWX8B2uqJZ5onUd/+e+m/BfeEdZC51GMhC4VfTmqOwOjWDNDyO35ZA9j1mqk8iIJzDpqoeA== 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.21.7": - version "4.21.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.21.7.tgz#9af7d693ccf0da6dfd45a79d280208000ed59d55" - integrity sha512-YJGVLjcpG58joBVOWnjHdw7FKGJimryVVJOoCfjLgNsKuoKEkhneTkOMTXsM29ArpgBNOmMYaBPSyf4ZjNxDRQ== +"@cornerstonejs/labelmap-interpolation@4.22.3": + version "4.22.3" + resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.22.3.tgz#7c01448cb0c02f47ca7e95db836153c0169d0200" + integrity sha512-ngschi2EKr+47LWbbTiu6tt3aw4e7yp0mVCDXwJm1Z2eyugemiiAQvOT77EKSBZ//L2fAZR3Edr+qJFzPa5KUw== dependencies: "@itk-wasm/morphological-contour-interpolation" "1.1.0" itk-wasm "1.0.0-b.165" -"@cornerstonejs/polymorphic-segmentation@4.21.7": - version "4.21.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.21.7.tgz#e6a52477d1756b99f83e5a70fbd2b152819113c3" - integrity sha512-4qxVMY0LJ+ffJfbzvzFOwe6j1p93pawwMEVcWRZkipE0pgtlW1SWlBvePCNb25yps6GUxNFPEmdUn5x/Lw77VQ== +"@cornerstonejs/polymorphic-segmentation@4.22.3": + version "4.22.3" + resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.22.3.tgz#41f3eb0848a03de4ec4a4034be7f2989c543b94d" + integrity sha512-JNmtLbuwY8de3uwFf1YqySp5wt2BCT6kpg9gcoDNMmNxGDo0uT5yph1Muh+24sG7WDaoRwyzAEvG11h9NHgoqw== dependencies: "@icr/polyseg-wasm" "0.4.0" -"@cornerstonejs/tools@4.21.7": - version "4.21.7" - resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.21.7.tgz#0346501bd635fda857716e134a2ce50bc58804dd" - integrity sha512-p8bWrEKdjeNzzZfN5NI6Wh7tiZyI3/lXqrdLlY+BCD1YRUdv+rybhyrg0JhpodJYEGrS4/wrkhCApOp9j9Evdg== +"@cornerstonejs/tools@4.22.3": + version "4.22.3" + resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.22.3.tgz#45e2f7bb60c29fc545da525765f8708dac5202a6" + integrity sha512-2XQmUesRWiqWTh3xGnLsQ6qqKI55vSVV4UqGXiPxnMcf6azDfEhcJO8JJCH1VXaDa89jxLBdZUDehUnb0UsIxA== dependencies: "@types/offscreencanvas" "2019.7.3" comlink "4.4.2"