Compare commits

...

6 Commits

Author SHA1 Message Date
ohif-bot
3c2b027e8b chore(version): Update package versions [skip ci] 2025-10-28 13:57:43 +00:00
ohif-bot
5cecb83c10 chore(version): version.json [skip ci] 2025-10-28 13:57:35 +00:00
Joe Boccanfuso
93dabb3805
chore: 3.11 Recovery 1 (#5514) 2025-10-28 09:48:32 -04:00
ohif-bot
522531cc5c chore(version): Update package versions [skip ci] 2025-08-05 13:48:31 +00:00
ohif-bot
8c89d9472c chore(version): version.json [skip ci] 2025-08-05 13:48:23 +00:00
Alireza Sedghi
9d94e26d5d chore: release 3p11 2025-08-05 09:39:33 -04:00
182 changed files with 3611 additions and 6073 deletions

View File

@ -15,22 +15,13 @@ defaults: &defaults
commands: commands:
install_bun: install_bun:
steps: steps:
- restore_cache:
keys:
- bun-cache-v2-{{ arch }}-latest
- run: - run:
name: Install Bun name: Install Bun
command: | command: |
if [ ! -d "$HOME/.bun" ]; then curl -fsSL https://bun.sh/install | bash -s "bun-v1.2.23"
curl -fsSL https://bun.sh/install | bash
fi
echo 'export BUN_INSTALL="$HOME/.bun"' >> $BASH_ENV echo 'export BUN_INSTALL="$HOME/.bun"' >> $BASH_ENV
echo 'export PATH="$BUN_INSTALL/bin:$PATH"' >> $BASH_ENV echo 'export PATH="$BUN_INSTALL/bin:$PATH"' >> $BASH_ENV
source $BASH_ENV source $BASH_ENV
- save_cache:
key: bun-cache-v2-{{ arch }}-latest
paths:
- ~/.bun
jobs: jobs:
UNIT_TESTS: UNIT_TESTS:
@ -121,6 +112,34 @@ jobs:
- checkout - checkout
- attach_workspace: - attach_workspace:
at: ~/repo at: ~/repo
# SECURITY AUDIT
- run:
name: 'Security Audit - High Risk Vulnerabilities'
command: |
echo "🔍 Running bun audit for security vulnerabilities..."
echo "Checking for HIGH-RISK vulnerabilities..."
if bun audit --audit-level high; then
echo "✅ No high-risk vulnerabilities found"
echo "🎉 Security audit passed!"
else
echo ""
echo "❌ HIGH-RISK VULNERABILITIES DETECTED!"
echo "======================================"
echo ""
echo "🔧 To fix these issues:"
echo " 1. Run: bun audit"
echo " 2. Review the vulnerability details"
echo " 3. Update affected packages to secure versions"
echo " 4. Test your changes"
echo " 5. Re-run: bun audit --audit-level high"
echo ""
echo "📋 Full audit report:"
bun audit --audit-level low || true
echo ""
echo "❌ This build cannot proceed until high-risk vulnerabilities are resolved."
exit 1
fi
- run: - run:
name: Install Dependencies name: Install Dependencies
command: bun install --frozen-lockfile command: bun install --frozen-lockfile
@ -455,8 +474,13 @@ workflows:
filters: filters:
branches: branches:
only: master only: master
# - HOLD_FOR_APPROVAL:
# type: approval
# requires:
# - BUILD
- NPM_PUBLISH: - NPM_PUBLISH:
requires: requires:
# - HOLD_FOR_APPROVAL
- BUILD - BUILD
- DOCKER_BETA_PUBLISH: - DOCKER_BETA_PUBLISH:
requires: requires:

View File

@ -23,6 +23,8 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2 - uses: oven-sh/setup-bun@v2
with:
bun-version: 1.2.23
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 20 # Or your desired Node version node-version: 20 # Or your desired Node version

View File

@ -1,7 +1,7 @@
name: Playwright Tests name: Playwright Tests
on: on:
pull_request: pull_request:
branches: [master] branches: [master, release/*]
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
@ -18,6 +18,8 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2 - uses: oven-sh/setup-bun@v2
with:
bun-version: 1.2.23
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}

View File

@ -10,6 +10,6 @@
"deploy": "netlify deploy --prod --dir ./../platform/app/dist" "deploy": "netlify deploy --prod --dir ./../platform/app/dist"
}, },
"devDependencies": { "devDependencies": {
"netlify-cli": "^2.21.0" "netlify-cli": "2.21.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package ohif-monorepo-root
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package ohif-monorepo-root
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)

View File

@ -49,8 +49,8 @@ RUN apt-get update && apt-get install -y build-essential python3
RUN mkdir /usr/src/app RUN mkdir /usr/src/app
WORKDIR /usr/src/app WORKDIR /usr/src/app
RUN npm install -g bun RUN npm install -g bun@1.2.23
# RUN npm install -g lerna@7.4.2 RUN npm install -g lerna@7.4.2
ENV PATH=/usr/src/app/node_modules/.bin:$PATH ENV PATH=/usr/src/app/node_modules/.bin:$PATH
# Do an initial install and then a final install # Do an initial install and then a final install
@ -60,6 +60,7 @@ COPY --parents ./addOns/package.json ./addOns/*/*/package.json ./extensions/*/pa
RUN bun pm cache rm RUN bun pm cache rm
RUN bun install RUN bun install
RUN bun add ajv@8.12.0
# Copy the local directory # Copy the local directory
COPY --link --exclude=yarn.lock --exclude=package.json --exclude=Dockerfile . . COPY --link --exclude=yarn.lock --exclude=package.json --exclude=Dockerfile . .
@ -98,7 +99,7 @@ COPY --from=builder /usr/src/app/platform/app/dist/dicom-microscopy-viewer /usr/
# In entrypoint.sh, app-config.js might be overwritten, so chmod it to be writeable. # In entrypoint.sh, app-config.js might be overwritten, so chmod it to be writeable.
# The nginx user cannot chmod it, so change to root. # The nginx user cannot chmod it, so change to root.
USER root USER root
RUN chown -R nginx:nginx /usr/share/nginx/html RUN chown -R nginx:nginx /usr/share/nginx/html && chmod -R 777 /usr/share/nginx/html
USER nginx USER nginx
ENTRYPOINT ["/usr/src/entrypoint.sh"] ENTRYPOINT ["/usr/src/entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"] CMD ["nginx", "-g", "daemon off;"]

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @externals/devDependencies
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @externals/devDependencies
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @externals/devDependencies **Note:** Version bump only for package @externals/devDependencies

View File

@ -1,7 +1,7 @@
{ {
"name": "@externals/devDependencies", "name": "@externals/devDependencies",
"description": "External dev dependencies - put dev build dependencies here", "description": "External dev dependencies - put dev build dependencies here",
"version": "3.11.0-beta.116", "version": "3.11.1",
"license": "MIT", "license": "MIT",
"private": true, "private": true,
"engines": { "engines": {
@ -9,85 +9,85 @@
"yarn": ">=1.19.1" "yarn": ">=1.19.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@kitware/vtk.js": "32.12.0", "@kitware/vtk.js": "32.12.0",
"clsx": "^2.1.1", "clsx": "2.1.1",
"core-js": "^3.2.1", "core-js": "3.45.1",
"moment": "^2.30.1" "moment": "2.30.1"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1" "react-dom": "18.3.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/eslint-parser": "7.28.0", "@babel/eslint-parser": "7.28.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@pmmmwh/react-refresh-webpack-plugin": "0.5.17",
"@rsbuild/core": "^1.3.16", "@rsbuild/core": "1.5.1",
"@rsbuild/plugin-node-polyfill": "^1.3.0", "@rsbuild/plugin-node-polyfill": "1.4.2",
"@rsbuild/plugin-react": "^1.3.1", "@rsbuild/plugin-react": "1.4.0",
"@svgr/webpack": "^8.1.0", "@svgr/webpack": "8.1.0",
"@swc/helpers": "^0.5.15", "@swc/helpers": "0.5.17",
"@types/jest": "^27.5.0", "@types/jest": "27.5.2",
"@typescript-eslint/eslint-plugin": "^6.3.0", "@typescript-eslint/eslint-plugin": "6.21.0",
"@typescript-eslint/parser": "^6.3.0", "@typescript-eslint/parser": "6.21.0",
"autoprefixer": "^10.4.4", "autoprefixer": "10.4.21",
"babel-loader": "^8.2.4", "babel-loader": "8.4.1",
"babel-plugin-module-resolver": "^5.0.0", "babel-plugin-module-resolver": "5.0.2",
"clean-webpack-plugin": "^3.0.0", "clean-webpack-plugin": "3.0.0",
"copy-webpack-plugin": "^9.0.1", "copy-webpack-plugin": "9.1.0",
"cross-env": "^5.2.0", "cross-env": "7.0.3",
"css-loader": "^6.8.1", "css-loader": "6.11.0",
"dotenv": "^8.1.0", "dotenv": "8.6.0",
"eslint": "^8.39.0", "eslint": "8.57.1",
"eslint-config-prettier": "7.2.0", "eslint-config-prettier": "7.2.0",
"eslint-config-react-app": "^6.0.0", "eslint-config-react-app": "6.0.0",
"eslint-plugin-cypress": "^2.12.1", "eslint-plugin-cypress": "2.15.2",
"eslint-plugin-flowtype": "^7.0.0", "eslint-plugin-flowtype": "7.0.0",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "2.32.0",
"eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-jsx-a11y": "6.10.2",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-prettier": "5.5.1", "eslint-plugin-prettier": "5.5.1",
"eslint-plugin-promise": "^5.2.0", "eslint-plugin-promise": "5.2.0",
"eslint-plugin-react": "^7.29.4", "eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "^4.4.0", "eslint-plugin-react-hooks": "4.6.2",
"eslint-plugin-tsdoc": "^0.2.11", "eslint-plugin-tsdoc": "0.2.17",
"eslint-webpack-plugin": "^2.5.3", "eslint-webpack-plugin": "2.7.0",
"execa": "^8.0.1", "execa": "8.0.1",
"extract-css-chunks-webpack-plugin": "^4.5.4", "extract-css-chunks-webpack-plugin": "4.10.0",
"html-webpack-plugin": "^5.3.2", "html-webpack-plugin": "5.6.3",
"husky": "^3.0.0", "husky": "3.1.0",
"jest": "^29.5.0", "jest": "29.7.0",
"jest-canvas-mock": "^2.1.0", "jest-canvas-mock": "2.5.2",
"jest-environment-jsdom": "^29.5.0", "jest-environment-jsdom": "29.7.0",
"jest-junit": "^6.4.0", "jest-junit": "6.4.0",
"lerna": "^7.2.0", "lerna": "7.4.2",
"lint-staged": "^9.0.2", "lint-staged": "9.5.0",
"mini-css-extract-plugin": "^2.1.0", "mini-css-extract-plugin": "2.9.2",
"optimize-css-assets-webpack-plugin": "^6.0.1", "optimize-css-assets-webpack-plugin": "6.0.1",
"postcss": "^8.3.5", "postcss": "8.5.6",
"postcss-import": "^14.0.2", "postcss-import": "14.1.0",
"postcss-loader": "^6.1.1", "postcss-loader": "6.2.1",
"postcss-preset-env": "^7.4.3", "postcss-preset-env": "7.8.3",
"prettier": "3.6.2", "prettier": "3.6.2",
"prettier-plugin-tailwindcss": "0.6.9", "prettier-plugin-tailwindcss": "0.6.9",
"react-refresh": "^0.14.2", "react-refresh": "0.14.2",
"semver": "^7.5.1", "semver": "7.7.2",
"serve": "^14.2.4", "serve": "14.2.4",
"shader-loader": "^1.3.1", "shader-loader": "1.3.1",
"shx": "^0.3.3", "shx": "0.3.4",
"source-map-loader": "^4.0.1", "source-map-loader": "4.0.2",
"style-loader": "^1.0.0", "style-loader": "1.3.0",
"terser-webpack-plugin": "^5.1.4", "terser-webpack-plugin": "5.3.14",
"typescript": "5.5.4", "typescript": "5.5.4",
"unused-webpack-plugin": "2.4.0", "unused-webpack-plugin": "2.4.0",
"webpack": "^5.94.0", "webpack": "5.95.0",
"webpack-bundle-analyzer": "^4.8.0", "webpack-bundle-analyzer": "4.10.2",
"webpack-cli": "^5.0.1", "webpack-cli": "5.1.4",
"webpack-dev-server": "5.2.2", "webpack-dev-server": "5.2.2",
"webpack-hot-middleware": "^2.25.0", "webpack-hot-middleware": "2.26.1",
"webpack-merge": "^5.7.3", "webpack-merge": "5.10.0",
"workbox-webpack-plugin": "^6.1.5", "workbox-webpack-plugin": "6.6.1",
"worker-loader": "^3.0.8" "worker-loader": "3.0.8"
}, },
"scripts": { "scripts": {
"build": "Included as direct dependency" "build": "Included as direct dependency"

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @externals/dicom-microscopy-viewer
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @externals/dicom-microscopy-viewer
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @externals/dicom-microscopy-viewer **Note:** Version bump only for package @externals/dicom-microscopy-viewer

View File

@ -1,9 +1,9 @@
{ {
"name": "@externals/dicom-microscopy-viewer", "name": "@externals/dicom-microscopy-viewer",
"description": "External reference to dicom-microscopy-viewer", "description": "External reference to dicom-microscopy-viewer",
"version": "3.11.0-beta.116", "version": "3.11.1",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"dicom-microscopy-viewer": "^0.46.1" "dicom-microscopy-viewer": "0.46.1"
} }
} }

View File

@ -22,30 +22,29 @@
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.28.0", "@babel/core": "7.28.0",
"@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-properties": "7.27.1",
"@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-rest-spread": "7.28.0",
"@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-methods": "7.27.1",
"@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "7.27.1",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/plugin-transform-arrow-functions": "^7.16.7", "@babel/plugin-transform-arrow-functions": "7.27.1",
"@babel/plugin-transform-regenerator": "^7.16.7", "@babel/plugin-transform-regenerator": "7.28.1",
"@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-runtime": "7.28.0",
"@babel/plugin-transform-typescript": "^7.28.0", "@babel/plugin-transform-typescript": "7.28.0",
"@babel/preset-env": "7.28.0", "@babel/preset-env": "7.28.0",
"@babel/preset-react": "^7.27.1", "@babel/preset-react": "7.27.1",
"@babel/preset-typescript": "^7.27.1" "@babel/preset-typescript": "7.27.1"
}, },
"resolutions": { "resolutions": {
"**/@babel/runtime": "^7.20.13", "**/@babel/runtime": "7.28.2",
"commander": "8.3.0", "commander": "8.3.0",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicomweb-client": ">=0.10.4", "dicomweb-client": ">=0.10.4",
"nth-check": "^2.1.1", "nth-check": "2.1.1",
"trim-newlines": "^5.0.0", "trim-newlines": "5.0.0",
"glob-parent": "^6.0.2", "glob-parent": "6.0.2",
"trim": "^1.0.0", "trim": "1.0.1",
"package-json": "^8.1.0", "package-json": "8.1.1",
"typescript": "5.5.4", "typescript": "5.5.4"
"sharp": "^0.32.6"
} }
} }

2473
bun.lock

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
35bc074a53bd8c804dba44830145a6633302f11d 93dabb380574e96fc9d2495978f1ee75acaa6f02

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-pmap
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-pmap
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-pmap **Note:** Version bump only for package @ohif/extension-cornerstone-dicom-pmap

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-cornerstone-dicom-pmap", "name": "@ohif/extension-cornerstone-dicom-pmap",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "DICOM Parametric Map read workflow", "description": "DICOM Parametric Map read workflow",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -33,22 +33,22 @@
"start": "yarn run dev" "start": "yarn run dev"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/i18n": "3.11.0-beta.116", "@ohif/i18n": "3.11.1",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-i18next": "^12.2.2", "react-i18next": "12.3.1",
"react-router": "^6.8.1", "react-router": "6.30.1",
"react-router-dom": "^6.8.1" "react-router-dom": "6.30.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "^3.32.5", "@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@kitware/vtk.js": "32.12.0", "@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3" "react-color": "2.19.3"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt **Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-cornerstone-dicom-rt", "name": "@ohif/extension-cornerstone-dicom-rt",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "DICOM RT read workflow", "description": "DICOM RT read workflow",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -33,19 +33,19 @@
"start": "yarn run dev" "start": "yarn run dev"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/i18n": "3.11.0-beta.116", "@ohif/i18n": "3.11.1",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-i18next": "^10.11.0", "react-i18next": "12.3.1",
"react-router": "^6.23.1", "react-router": "6.30.1",
"react-router-dom": "^6.23.1" "react-router-dom": "6.30.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"react-color": "^2.19.3" "react-color": "2.19.3"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg **Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-cornerstone-dicom-seg", "name": "@ohif/extension-cornerstone-dicom-seg",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "DICOM SEG read workflow", "description": "DICOM SEG read workflow",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -33,22 +33,22 @@
"start": "yarn run dev" "start": "yarn run dev"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/i18n": "3.11.0-beta.116", "@ohif/i18n": "3.11.1",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-i18next": "^12.2.2", "react-i18next": "12.3.1",
"react-router": "^6.23.1", "react-router": "6.30.1",
"react-router-dom": "^6.23.1" "react-router-dom": "6.30.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "^3.32.5", "@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@kitware/vtk.js": "32.12.0", "@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3" "react-color": "2.19.3"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr **Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-cornerstone-dicom-sr", "name": "@ohif/extension-cornerstone-dicom-sr",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF extension for an SR Cornerstone Viewport", "description": "OHIF extension for an SR Cornerstone Viewport",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -34,21 +34,21 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-measurement-tracking": "3.11.0-beta.116", "@ohif/extension-measurement-tracking": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicom-parser": "^1.8.9", "dicom-parser": "1.8.21",
"hammerjs": "^2.0.8", "hammerjs": "2.0.8",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1" "react": "18.3.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "^3.32.5", "@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "^3.32.5", "@cornerstonejs/tools": "4.5.13",
"classnames": "^2.3.2" "classnames": "2.5.1"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-cornerstone-dynamic-volume
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dynamic-volume
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone-dynamic-volume **Note:** Version bump only for package @ohif/extension-cornerstone-dynamic-volume

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-cornerstone-dynamic-volume", "name": "@ohif/extension-cornerstone-dynamic-volume",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF extension for 4D volumes data", "description": "OHIF extension for 4D volumes data",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -29,21 +29,21 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/i18n": "3.11.0-beta.116", "@ohif/i18n": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicom-parser": "^1.8.21", "dicom-parser": "1.8.21",
"hammerjs": "^2.0.8", "hammerjs": "2.0.8",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1" "react": "18.3.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "^3.32.5", "@cornerstonejs/tools": "4.5.13",
"classnames": "^2.3.2" "classnames": "2.5.1"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-cornerstone
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-cornerstone **Note:** Version bump only for package @ohif/extension-cornerstone

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-cornerstone", "name": "@ohif/extension-cornerstone",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF extension for Cornerstone", "description": "OHIF extension for Cornerstone",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -31,41 +31,43 @@
"dev:cornerstone": "yarn run dev", "dev:cornerstone": "yarn run dev",
"build": "cross-env NODE_ENV=production webpack --progress --config .webpack/webpack.prod.js", "build": "cross-env NODE_ENV=production webpack --progress --config .webpack/webpack.prod.js",
"build:package-1": "yarn run build", "build:package-1": "yarn run build",
"start": "yarn run dev" "start": "yarn run dev",
"test:unit": "jest --watchAll",
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-charls": "1.2.3",
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjpeg": "1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5", "@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "^3.32.5", "@cornerstonejs/dicom-image-loader": "4.5.13",
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicom-parser": "^1.8.21", "dicom-parser": "1.8.21",
"hammerjs": "^2.0.8", "hammerjs": "2.0.8",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-resize-detector": "^10.0.1" "react-resize-detector": "10.0.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/adapters": "^3.32.5", "@cornerstonejs/adapters": "4.5.13",
"@cornerstonejs/ai": "^3.32.5", "@cornerstonejs/ai": "4.5.13",
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@cornerstonejs/labelmap-interpolation": "^3.32.5", "@cornerstonejs/labelmap-interpolation": "4.5.13",
"@cornerstonejs/polymorphic-segmentation": "^3.32.5", "@cornerstonejs/polymorphic-segmentation": "4.5.13",
"@cornerstonejs/tools": "^3.32.5", "@cornerstonejs/tools": "4.5.13",
"@itk-wasm/morphological-contour-interpolation": "1.1.0", "@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0", "@kitware/vtk.js": "32.12.0",
"html2canvas": "^1.4.1", "html2canvas": "1.4.1",
"lodash.compact": "^3.0.1", "lodash.compact": "3.0.1",
"lodash.debounce": "^4.0.8", "lodash.debounce": "4.0.8",
"lodash.flatten": "^4.4.0", "lodash.flatten": "4.4.0",
"lodash.merge": "^4.6.2", "lodash.merge": "4.6.2",
"lodash.zip": "^4.2.0", "lodash.zip": "4.2.0",
"shader-loader": "^1.3.1", "shader-loader": "1.3.1",
"worker-loader": "^3.0.8" "worker-loader": "3.0.8"
} }
} }

View File

@ -245,10 +245,35 @@ function commandsModule({
referencedDisplaySetInstanceUID referencedDisplaySetInstanceUID
); );
storePositionPresentation(referencedDisplaySet); storePositionPresentation(referencedDisplaySet);
return commandsManager.runCommand('loadSegmentationDisplaySetsForViewport', {
const results = commandsManager.runCommand('loadSegmentationDisplaySetsForViewport', {
viewportId, viewportId,
displaySetInstanceUIDs: [referencedDisplaySet.displaySetInstanceUID], 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') { } else if (displaySet.Modality === 'SR') {
const results = commandsManager.runCommand('hydrateStructuredReport', { const results = commandsManager.runCommand('hydrateStructuredReport', {
displaySetInstanceUID: displaySet.displaySetInstanceUID, displaySetInstanceUID: displaySet.displaySetInstanceUID,

View File

@ -1754,7 +1754,10 @@ class SegmentationService extends PubSubService {
return `${volumeLoaderSchema}:${displaySet.displaySetInstanceUID}`; return `${volumeLoaderSchema}:${displaySet.displaySetInstanceUID}`;
} }
private _getSegmentCenter(segmentationId, segmentIndex) { private _getSegmentCenter(
segmentationId: string,
segmentIndex: number
): { image?: csTypes.Point3; world: csTypes.Point3 } | undefined {
const segmentation = this.getSegmentation(segmentationId); const segmentation = this.getSegmentation(segmentationId);
if (!segmentation) { if (!segmentation) {
@ -1765,19 +1768,17 @@ class SegmentationService extends PubSubService {
const { cachedStats } = segments[segmentIndex]; const { cachedStats } = segments[segmentIndex];
if (!cachedStats || !cachedStats?.center || !cachedStats?.namedStats?.center) { if (cachedStats?.center) {
return;
}
const { center } = cachedStats; const { center } = cachedStats;
if (!center) { return center as { image: csTypes.Point3; world: csTypes.Point3 };
}
if (cachedStats?.namedStats?.center) {
return { return {
world: cachedStats.namedStats.center.value, world: cachedStats.namedStats.center.value,
}; };
} }
return center;
} }
private _setSegmentLockedStatus(segmentationId: string, segmentIndex: number, isLocked: boolean) { private _setSegmentLockedStatus(segmentationId: string, segmentIndex: number, isLocked: boolean) {

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-default
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-default
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-default **Note:** Version bump only for package @ohif/extension-default

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-default", "name": "@ohif/extension-default",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Common/default features and functionality for basic image viewing", "description": "Common/default features and functionality for basic image viewing",
"author": "OHIF Core Team", "author": "OHIF Core Team",
"license": "MIT", "license": "MIT",
@ -34,22 +34,22 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/i18n": "3.11.0-beta.116", "@ohif/i18n": "3.11.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicomweb-client": "^0.10.4", "dicomweb-client": "0.10.4",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-i18next": "^12.2.2", "react-i18next": "12.3.1",
"react-window": "^1.8.9", "react-window": "1.8.11",
"webpack": "5.89.0", "webpack": "5.89.0",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/calculate-suv": "^1.1.0", "@cornerstonejs/calculate-suv": "1.1.0",
"lodash.get": "^4.4.2", "lodash.get": "4.4.2",
"lodash.uniqby": "^4.7.0" "lodash.uniqby": "4.7.0"
} }
} }

View File

@ -262,9 +262,10 @@ function createDicomJSONApi(dicomJsonConfig) {
const { StudyInstanceUID, SeriesInstanceUID } = displaySet; const { StudyInstanceUID, SeriesInstanceUID } = displaySet;
const study = findStudies('StudyInstanceUID', StudyInstanceUID)[0]; const study = findStudies('StudyInstanceUID', StudyInstanceUID)[0];
const series = study.series.find(s => s.SeriesInstanceUID === SeriesInstanceUID) || []; const series = study.series.find(s => s.SeriesInstanceUID === SeriesInstanceUID) || {};
const instanceMap = new Map(); const instanceMap = new Map();
if (series.instances) {
series.instances.forEach(instance => { series.instances.forEach(instance => {
if (instance?.metadata?.SOPInstanceUID) { if (instance?.metadata?.SOPInstanceUID) {
const { metadata, url } = instance; const { metadata, url } = instance;
@ -273,6 +274,7 @@ function createDicomJSONApi(dicomJsonConfig) {
instanceMap.set(metadata.SOPInstanceUID, existingInstances); instanceMap.set(metadata.SOPInstanceUID, existingInstances);
} }
}); });
}
displaySet.images.forEach(instance => { displaySet.images.forEach(instance => {
const NumberOfFrames = instance.NumberOfFrames || 1; const NumberOfFrames = instance.NumberOfFrames || 1;

View File

@ -65,6 +65,11 @@ const commandsModule = ({
* @param options.removeFirst - Optional flag to remove the display set first if it's already added * @param options.removeFirst - Optional flag to remove the display set first if it's already added
*/ */
addDisplaySetAsLayer: ({ viewportId, displaySetInstanceUID, removeFirst = false }) => { addDisplaySetAsLayer: ({ viewportId, displaySetInstanceUID, removeFirst = false }) => {
if (!viewportId) {
const { activeViewportId } = servicesManager.services.viewportGridService.getState();
viewportId = activeViewportId;
}
if (!viewportId || !displaySetInstanceUID) { if (!viewportId || !displaySetInstanceUID) {
console.warn('Missing required parameters for addDisplaySetAsLayer command'); console.warn('Missing required parameters for addDisplaySetAsLayer command');
return; return;

View File

@ -8,31 +8,13 @@ export default {
id: 'tagBrowser', id: 'tagBrowser',
label: 'Tag Browser', label: 'Tag Browser',
iconName: 'DicomTagBrowser', iconName: 'DicomTagBrowser',
onClick: ({ commandsManager, displaySetInstanceUID }: withAppTypes) => { commands: 'openDICOMTagViewer',
commandsManager.runCommand('openDICOMTagViewer', {
displaySetInstanceUID,
});
},
}, },
{ {
id: 'addAsLayer', id: 'addAsLayer',
label: 'Add as Layer', label: 'Add as Layer',
iconName: 'ViewportViews', iconName: 'ViewportViews',
onClick: ({ commandsManager, displaySetInstanceUID, servicesManager }: withAppTypes) => { commands: 'addDisplaySetAsLayer',
const { viewportGridService } = servicesManager.services;
// Get the active viewport
const { activeViewportId } = viewportGridService.getState();
if (!activeViewportId) {
return;
}
// Use the new command to add the display set as a layer
commandsManager.runCommand('addDisplaySetAsLayer', {
viewportId: activeViewportId,
displaySetInstanceUID,
});
},
}, },
], ],
'studyBrowser.sortFunctions': [ 'studyBrowser.sortFunctions': [

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-dicom-microscopy **Note:** Version bump only for package @ohif/extension-dicom-microscopy

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-microscopy", "name": "@ohif/extension-dicom-microscopy",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF extension for DICOM microscopy", "description": "OHIF extension for DICOM microscopy",
"author": "Bill Wallace, md-prog", "author": "Bill Wallace, md-prog",
"license": "MIT", "license": "MIT",
@ -30,24 +30,24 @@
"start": "yarn run dev" "start": "yarn run dev"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/i18n": "3.11.0-beta.116", "@ohif/i18n": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-i18next": "^10.11.0", "react-i18next": "12.3.1",
"react-router": "^6.23.1", "react-router": "6.30.1",
"react-router-dom": "^6.23.1" "react-router-dom": "6.30.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-charls": "1.2.3",
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjpeg": "1.2.4",
"colormap": "^2.3", "colormap": "2.3.2",
"lodash.debounce": "^4.0.8", "lodash.debounce": "4.0.8",
"mathjs": "^12.4.2" "mathjs": "12.4.3"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-dicom-pdf
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-dicom-pdf
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-dicom-pdf **Note:** Version bump only for package @ohif/extension-dicom-pdf

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-pdf", "name": "@ohif/extension-dicom-pdf",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF extension for PDF display", "description": "OHIF extension for PDF display",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -30,16 +30,16 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicom-parser": "^1.8.9", "dicom-parser": "1.8.21",
"hammerjs": "^2.0.8", "hammerjs": "2.0.8",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1" "react": "18.3.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"classnames": "^2.3.2" "classnames": "2.5.1"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-dicom-video
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-dicom-video
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-dicom-video **Note:** Version bump only for package @ohif/extension-dicom-video

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-video", "name": "@ohif/extension-dicom-video",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF extension for video display", "description": "OHIF extension for video display",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -30,16 +30,16 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicom-parser": "^1.8.9", "dicom-parser": "1.8.21",
"hammerjs": "^2.0.8", "hammerjs": "2.0.8",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1" "react": "18.3.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"classnames": "^2.3.2" "classnames": "2.5.1"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-measurement-tracking
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-measurement-tracking
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-measurement-tracking **Note:** Version bump only for package @ohif/extension-measurement-tracking

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-measurement-tracking", "name": "@ohif/extension-measurement-tracking",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Tracking features and functionality for basic image viewing", "description": "Tracking features and functionality for basic image viewing",
"author": "OHIF Core Team", "author": "OHIF Core Team",
"license": "MIT", "license": "MIT",
@ -32,25 +32,25 @@
"start": "yarn run dev" "start": "yarn run dev"
}, },
"peerDependencies": { "peerDependencies": {
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "^3.32.5", "@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-sr": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"classnames": "^2.3.2", "classnames": "2.5.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"lodash.debounce": "^4.0.8", "lodash.debounce": "4.0.8",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"webpack": "5.89.0", "webpack": "5.89.0",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"@xstate/react": "^3.2.2", "@xstate/react": "3.2.2",
"xstate": "^4.10.0" "xstate": "4.38.3"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-test
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-test
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-test **Note:** Version bump only for package @ohif/extension-test

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-test", "name": "@ohif/extension-test",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF extension used inside e2e testing", "description": "OHIF extension used inside e2e testing",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -30,16 +30,16 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicom-parser": "^1.8.9", "dicom-parser": "1.8.21",
"hammerjs": "^2.0.8", "hammerjs": "2.0.8",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1" "react": "18.3.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"classnames": "^2.3.2" "classnames": "2.5.1"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-tmtv
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-tmtv
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-tmtv **Note:** Version bump only for package @ohif/extension-tmtv

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-tmtv", "name": "@ohif/extension-tmtv",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF extension for Total Metabolic Tumor Volume", "description": "OHIF extension for Total Metabolic Tumor Volume",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -30,16 +30,16 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicom-parser": "^1.8.9", "dicom-parser": "1.8.21",
"hammerjs": "^2.0.8", "hammerjs": "2.0.8",
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1" "react": "18.3.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"classnames": "^2.3.2" "classnames": "2.5.1"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/extension-ultrasound-pleura-bline
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/extension-ultrasound-pleura-bline
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-ultrasound-pleura-bline", "name": "@ohif/extension-ultrasound-pleura-bline",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "", "description": "",
"author": "Rodrigo Basilio", "author": "Rodrigo Basilio",
"license": "MIT", "license": "MIT",
@ -31,51 +31,51 @@
"start": "yarn run dev" "start": "yarn run dev"
}, },
"peerDependencies": { "peerDependencies": {
"prop-types": "^15.6.2", "prop-types": "15.8.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-i18next": "^12.2.2", "react-i18next": "12.3.1",
"react-router": "^6.23.1", "react-router": "6.30.1",
"react-router-dom": "^6.23.1", "react-router-dom": "6.30.1",
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "^3.32.5", "@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/i18n": "3.11.0-beta.116", "@ohif/i18n": "3.11.1",
"@ohif/ui-next": "3.11.0-beta.116" "@ohif/ui-next": "3.11.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.28.0", "@babel/core": "7.28.0",
"@babel/eslint-parser": "7.28.0", "@babel/eslint-parser": "7.28.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/plugin-transform-arrow-functions": "^7.16.7", "@babel/plugin-transform-arrow-functions": "7.27.1",
"@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-properties": "7.27.1",
"@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-rest-spread": "7.28.0",
"@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-methods": "7.27.1",
"@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "7.27.1",
"@babel/plugin-transform-regenerator": "^7.16.7", "@babel/plugin-transform-regenerator": "7.28.1",
"@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-runtime": "7.28.0",
"@babel/plugin-transform-typescript": "^7.28.0", "@babel/plugin-transform-typescript": "7.28.0",
"@babel/preset-env": "7.28.0", "@babel/preset-env": "7.28.0",
"@babel/preset-react": "^7.27.1", "@babel/preset-react": "7.27.1",
"@babel/preset-typescript": "^7.27.1", "@babel/preset-typescript": "7.27.1",
"@svgr/webpack": "^8.1.0", "@svgr/webpack": "8.1.0",
"babel-loader": "^8.2.4", "babel-loader": "8.4.1",
"babel-plugin-module-resolver": "^5.0.0", "babel-plugin-module-resolver": "5.0.2",
"clean-webpack-plugin": "^4.0.0", "clean-webpack-plugin": "3.0.0",
"copy-webpack-plugin": "^10.2.0", "copy-webpack-plugin": "9.1.0",
"cross-env": "^7.0.3", "cross-env": "7.0.3",
"dotenv": "^14.1.0", "dotenv": "8.6.0",
"eslint": "^8.39.0", "eslint": "8.57.1",
"eslint-loader": "^2.0.0", "eslint-loader": "2.2.1",
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-cli": "^5.0.2", "webpack-cli": "5.1.4",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -1,5 +1,5 @@
{ {
"version": "3.11.0-beta.116", "version": "3.11.1",
"packages": ["extensions/*", "platform/*", "modes/*", "addOns/externals/*"], "packages": ["extensions/*", "platform/*", "modes/*", "addOns/externals/*"],
"npmClient": "yarn" "npmClient": "yarn"
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/mode-basic-dev-mode
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-basic-dev-mode
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-basic-dev-mode **Note:** Version bump only for package @ohif/mode-basic-dev-mode

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/mode-basic-dev-mode", "name": "@ohif/mode-basic-dev-mode",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Basic OHIF Viewer Using Cornerstone", "description": "Basic OHIF Viewer Using Cornerstone",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -31,19 +31,19 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-sr": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/extension-dicom-pdf": "3.11.0-beta.116", "@ohif/extension-dicom-pdf": "3.11.1",
"@ohif/extension-dicom-video": "3.11.0-beta.116" "@ohif/extension-dicom-video": "3.11.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"i18next": "^17.0.3" "i18next": "17.3.1"
}, },
"devDependencies": { "devDependencies": {
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/mode-test
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-test
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-test **Note:** Version bump only for package @ohif/mode-test

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/mode-test", "name": "@ohif/mode-test",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Basic mode for testing", "description": "Basic mode for testing",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -34,21 +34,21 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-sr": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/extension-dicom-pdf": "3.11.0-beta.116", "@ohif/extension-dicom-pdf": "3.11.1",
"@ohif/extension-dicom-video": "3.11.0-beta.116", "@ohif/extension-dicom-video": "3.11.1",
"@ohif/extension-measurement-tracking": "3.11.0-beta.116", "@ohif/extension-measurement-tracking": "3.11.1",
"@ohif/extension-test": "3.11.0-beta.116" "@ohif/extension-test": "3.11.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"i18next": "^17.0.3" "i18next": "17.3.1"
}, },
"devDependencies": { "devDependencies": {
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/mode-longitudinal
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-longitudinal
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-longitudinal **Note:** Version bump only for package @ohif/mode-longitudinal

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/mode-longitudinal", "name": "@ohif/mode-longitudinal",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Longitudinal Workflow", "description": "Longitudinal Workflow",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -34,22 +34,22 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-rt": "3.11.1",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-seg": "3.11.1",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-sr": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/extension-dicom-pdf": "3.11.0-beta.116", "@ohif/extension-dicom-pdf": "3.11.1",
"@ohif/extension-dicom-video": "3.11.0-beta.116", "@ohif/extension-dicom-video": "3.11.1",
"@ohif/extension-measurement-tracking": "3.11.0-beta.116" "@ohif/extension-measurement-tracking": "3.11.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"i18next": "^17.0.3" "i18next": "17.3.1"
}, },
"devDependencies": { "devDependencies": {
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/mode-microscopy
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-microscopy
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-microscopy **Note:** Version bump only for package @ohif/mode-microscopy

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/mode-microscopy", "name": "@ohif/mode-microscopy",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF mode for DICOM microscopy", "description": "OHIF mode for DICOM microscopy",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -35,11 +35,11 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-dicom-microscopy": "3.11.0-beta.116" "@ohif/extension-dicom-microscopy": "3.11.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"i18next": "^17.0.3" "i18next": "17.3.1"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/mode-preclinical-4d
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-preclinical-4d
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-preclinical-4d **Note:** Version bump only for package @ohif/mode-preclinical-4d

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/mode-preclinical-4d", "name": "@ohif/mode-preclinical-4d",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "4D Workflow", "description": "4D Workflow",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -33,18 +33,18 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-seg": "3.11.1",
"@ohif/extension-cornerstone-dynamic-volume": "3.11.0-beta.116", "@ohif/extension-cornerstone-dynamic-volume": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/extension-tmtv": "3.11.0-beta.116" "@ohif/extension-tmtv": "3.11.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13" "@babel/runtime": "7.28.2"
}, },
"devDependencies": { "devDependencies": {
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/mode-segmentation
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-segmentation
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-segmentation **Note:** Version bump only for package @ohif/mode-segmentation

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/mode-segmentation", "name": "@ohif/mode-segmentation",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "OHIF segmentation mode which enables labelmap segmentation read/edit/export", "description": "OHIF segmentation mode which enables labelmap segmentation read/edit/export",
"author": "@ohif", "author": "@ohif",
"license": "MIT", "license": "MIT",
@ -35,43 +35,43 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-rt": "3.11.1",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-seg": "3.11.1",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-sr": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/extension-dicom-pdf": "3.11.0-beta.116", "@ohif/extension-dicom-pdf": "3.11.1",
"@ohif/extension-dicom-video": "3.11.0-beta.116" "@ohif/extension-dicom-video": "3.11.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"i18next": "^17.0.3" "i18next": "17.3.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.28.0", "@babel/core": "7.28.0",
"@babel/eslint-parser": "7.28.0", "@babel/eslint-parser": "7.28.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/plugin-transform-arrow-functions": "^7.16.7", "@babel/plugin-transform-arrow-functions": "7.27.1",
"@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-properties": "7.27.1",
"@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-rest-spread": "7.28.0",
"@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-methods": "7.27.1",
"@babel/plugin-transform-regenerator": "^7.16.7", "@babel/plugin-transform-regenerator": "7.28.1",
"@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-runtime": "7.28.0",
"@babel/plugin-transform-typescript": "^7.28.0", "@babel/plugin-transform-typescript": "7.28.0",
"@babel/preset-env": "7.28.0", "@babel/preset-env": "7.28.0",
"@babel/preset-react": "^7.27.1", "@babel/preset-react": "7.27.1",
"@babel/preset-typescript": "^7.27.1", "@babel/preset-typescript": "7.27.1",
"@svgr/webpack": "^8.1.0", "@svgr/webpack": "8.1.0",
"babel-loader": "^8.0.0-beta.4", "babel-loader": "8.4.1",
"clean-webpack-plugin": "^4.0.0", "clean-webpack-plugin": "3.0.0",
"copy-webpack-plugin": "^10.2.0", "copy-webpack-plugin": "9.1.0",
"cross-env": "^7.0.3", "cross-env": "7.0.3",
"dotenv": "^14.1.0", "dotenv": "8.6.0",
"eslint": "^8.39.0", "eslint": "8.57.1",
"eslint-loader": "^2.0.0", "eslint-loader": "2.2.1",
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-cli": "^4.7.2", "webpack-cli": "5.1.4",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/mode-tmtv
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-tmtv
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-tmtv **Note:** Version bump only for package @ohif/mode-tmtv

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/mode-tmtv", "name": "@ohif/mode-tmtv",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Total Metabolic Tumor Volume Workflow", "description": "Total Metabolic Tumor Volume Workflow",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -34,20 +34,20 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-sr": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/extension-dicom-pdf": "3.11.0-beta.116", "@ohif/extension-dicom-pdf": "3.11.1",
"@ohif/extension-dicom-video": "3.11.0-beta.116", "@ohif/extension-dicom-video": "3.11.1",
"@ohif/extension-measurement-tracking": "3.11.0-beta.116" "@ohif/extension-measurement-tracking": "3.11.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"i18next": "^17.0.3" "i18next": "17.3.1"
}, },
"devDependencies": { "devDependencies": {
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/mode-ultrasound-pleura-bline
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/mode-ultrasound-pleura-bline
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/mode-ultrasound-pleura-bline", "name": "@ohif/mode-ultrasound-pleura-bline",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Allows users to annotate ultrasound images with pleura B-line annotations.", "description": "Allows users to annotate ultrasound images with pleura B-line annotations.",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -33,38 +33,38 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@cornerstonejs/tools": "^3.32.5", "@cornerstonejs/tools": "4.5.13",
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-sr": "3.11.1",
"@ohif/extension-ultrasound-pleura-bline": "3.11.0-beta.116", "@ohif/extension-ultrasound-pleura-bline": "3.11.1",
"i18next": "^17.0.3" "i18next": "17.3.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.28.0", "@babel/core": "7.28.0",
"@babel/eslint-parser": "7.28.0", "@babel/eslint-parser": "7.28.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/plugin-transform-arrow-functions": "^7.16.7", "@babel/plugin-transform-arrow-functions": "7.27.1",
"@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-properties": "7.27.1",
"@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-rest-spread": "7.28.0",
"@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-methods": "7.27.1",
"@babel/plugin-transform-regenerator": "^7.16.7", "@babel/plugin-transform-regenerator": "7.28.1",
"@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-runtime": "7.28.0",
"@babel/plugin-transform-typescript": "^7.28.0", "@babel/plugin-transform-typescript": "7.28.0",
"@babel/preset-env": "7.28.0", "@babel/preset-env": "7.28.0",
"@babel/preset-react": "^7.27.1", "@babel/preset-react": "7.27.1",
"@babel/preset-typescript": "^7.27.1", "@babel/preset-typescript": "7.27.1",
"@svgr/webpack": "^8.1.0", "@svgr/webpack": "8.1.0",
"babel-loader": "^8.0.0-beta.4", "babel-loader": "8.4.1",
"clean-webpack-plugin": "^4.0.0", "clean-webpack-plugin": "3.0.0",
"copy-webpack-plugin": "^10.2.0", "copy-webpack-plugin": "9.1.0",
"cross-env": "^7.0.3", "cross-env": "7.0.3",
"dotenv": "^14.1.0", "dotenv": "8.6.0",
"eslint": "^8.39.0", "eslint": "8.57.1",
"eslint-loader": "^2.0.0", "eslint-loader": "2.2.1",
"webpack": "5.95.0", "webpack": "5.95.0",
"webpack-cli": "^5.0.2", "webpack-cli": "5.1.4",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -55,13 +55,13 @@
"test:unit:ci": "lerna run test:unit:ci --parallel --stream", "test:unit:ci": "lerna run test:unit:ci --parallel --stream",
"test:e2e": "lerna run test:e2e --stream", "test:e2e": "lerna run test:e2e --stream",
"test:e2e:coverage": "nyc --reporter=html yarn run test:e2e:ci", "test:e2e:coverage": "nyc --reporter=html yarn run test:e2e:ci",
"test:e2e:ci": "TEST_ENV=true npx playwright test", "test:e2e:ci": "cross-env TEST_ENV=true npx playwright test",
"test:e2e:ui": "TEST_ENV=true npx playwright test --ui", "test:e2e:ui": "cross-env TEST_ENV=true npx playwright test --ui",
"test:e2e:reporter": "TEST_ENV=true npx playwright test --reporter=html", "test:e2e:reporter": "cross-env TEST_ENV=true npx playwright test --reporter=html",
"test:e2e:update": "TEST_ENV=true npx playwright test --reporter=html --update-snapshots -g shouldUpdateThis", "test:e2e:update": "cross-env TEST_ENV=true npx playwright test --reporter=html --update-snapshots -g shouldUpdateThis",
"test:e2e:update:debug": "TEST_ENV=true npx playwright test -g @debug --reporter=html --update-snapshots -g shouldUpdateThis", "test:e2e:update:debug": "cross-env TEST_ENV=true npx playwright test -g @debug --reporter=html --update-snapshots -g shouldUpdateThis",
"test:e2e:headed": "TEST_ENV=true npx playwright test --headed", "test:e2e:headed": "cross-env TEST_ENV=true npx playwright test --headed",
"test:e2e:debug": "TEST_ENV=true npx playwright test --debug", "test:e2e:debug": "cross-env TEST_ENV=true npx playwright test --debug",
"test:e2e:dist": "lerna run test:e2e:dist --stream", "test:e2e:dist": "lerna run test:e2e:dist --stream",
"test:e2e:serve": "yarn test:data && lerna run test:e2e:serve --stream", "test:e2e:serve": "yarn test:data && lerna run test:e2e:serve --stream",
"see-changed": "lerna changed", "see-changed": "lerna changed",
@ -75,39 +75,50 @@
"link-list": "npm ls --depth=0 --link=true" "link-list": "npm ls --depth=0 --link=true"
}, },
"dependencies": { "dependencies": {
"execa": "^8.0.1" "execa": "8.0.1"
}, },
"optionalDependencies": { "optionalDependencies": {
"@percy/cypress": "^3.1.1", "@percy/cypress": "3.1.6",
"@playwright/test": "^1.48.0" "@playwright/test": "1.56.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.28.0", "@babel/core": "7.28.0",
"@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-arrow-functions": "7.27.1",
"@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-class-properties": "7.27.1",
"@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-for-of": "7.27.1",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-object-rest-spread": "7.28.0",
"@babel/plugin-transform-arrow-functions": "^7.16.7", "@babel/plugin-transform-private-methods": "7.27.1",
"@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "7.27.1",
"@babel/plugin-transform-regenerator": "^7.16.7", "@babel/plugin-transform-regenerator": "7.28.1",
"@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-runtime": "7.28.0",
"@babel/plugin-transform-typescript": "^7.28.0", "@babel/plugin-transform-typescript": "7.28.0",
"@babel/preset-env": "7.28.0", "@babel/preset-env": "7.28.0",
"@babel/preset-react": "^7.27.1", "@babel/preset-react": "7.27.1",
"@babel/preset-typescript": "^7.27.1", "@babel/preset-typescript": "7.27.1",
"babel-plugin-istanbul": "^7.0.0", "@istanbuljs/nyc-config-typescript": "1.0.2",
"@istanbuljs/nyc-config-typescript": "^1.0.2", "@pmmmwh/react-refresh-webpack-plugin": "0.5.17",
"babel-loader": "8.4.1",
"babel-plugin-istanbul": "7.0.0",
"babel-plugin-transform-import-meta": "2.3.3",
"cross-env": "7.0.3",
"css-loader": "6.11.0",
"cypress": "14.5.2", "cypress": "14.5.2",
"cypress-file-upload": "^5.0.8", "cypress-file-upload": "5.0.8",
"file-loader": "6.2.0",
"istanbul": "0.4.5", "istanbul": "0.4.5",
"nyc": "^17.1.0", "nyc": "17.1.0",
"patch-package": "^8.0.0", "patch-package": "8.0.0",
"playwright-test-coverage": "^1.2.12", "playwright-test-coverage": "1.2.12",
"prettier": "^3.3.3", "postcss-loader": "6.2.1",
"prettier": "3.6.2",
"prettier-plugin-tailwindcss": "0.6.9", "prettier-plugin-tailwindcss": "0.6.9",
"source-map-support": "^0.5.21", "shader-loader": "1.3.1",
"ts-node": "^10.9.2" "source-map-support": "0.5.21",
"style-loader": "1.3.0",
"terser-webpack-plugin": "5.3.14",
"ts-node": "10.9.2",
"worker-loader": "3.0.8"
}, },
"husky": { "husky": {
"hooks": { "hooks": {
@ -122,17 +133,22 @@
}, },
"resolutions": { "resolutions": {
"commander": "8.3.0", "commander": "8.3.0",
"cross-env": "7.0.3",
"cross-spawn": "7.0.6",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"path-to-regexp": "0.1.12", "path-to-regexp": "0.1.12",
"nth-check": "^2.1.1", "nth-check": "2.1.1",
"trim-newlines": "^5.0.0", "trim-newlines": "5.0.0",
"glob-parent": "^6.0.2", "glob-parent": "6.0.2",
"trim": "^1.0.0", "trim": "1.0.1",
"package-json": "^8.1.0", "package-json": "8.1.1",
"sharp": "^0.32.6",
"rollup": "2.79.2", "rollup": "2.79.2",
"body-parser": "1.20.3", "body-parser": "1.20.3",
"form-data": ">=4.0.4" "form-data": ">=4.0.4",
"axios": "1.12.0",
"core-js": "3.45.1",
"@babel/runtime-corejs2": "7.26.10",
"tapable": "2.2.2"
}, },
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/app
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/app
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/app **Note:** Version bump only for package @ohif/app

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/app", "name": "@ohif/app",
"version": "3.11.0-beta.116", "version": "3.11.1",
"productVersion": "3.4.0", "productVersion": "3.4.0",
"description": "OHIF Viewer", "description": "OHIF Viewer",
"author": "OHIF Contributors", "author": "OHIF Contributors",
@ -48,67 +48,78 @@
"README.md" "README.md"
], ],
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-charls": "1.2.3",
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjpeg": "1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5", "@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/dicom-image-loader": "^3.32.5", "@cornerstonejs/dicom-image-loader": "4.5.13",
"@emotion/serialize": "^1.1.3", "@emotion/serialize": "1.3.3",
"@ohif/core": "3.11.0-beta.116", "@ohif/core": "3.11.1",
"@ohif/extension-cornerstone": "3.11.0-beta.116", "@ohif/extension-cornerstone": "3.11.1",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-rt": "3.11.1",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-seg": "3.11.1",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.116", "@ohif/extension-cornerstone-dicom-sr": "3.11.1",
"@ohif/extension-default": "3.11.0-beta.116", "@ohif/extension-default": "3.11.1",
"@ohif/extension-dicom-microscopy": "3.11.0-beta.116", "@ohif/extension-dicom-microscopy": "3.11.1",
"@ohif/extension-dicom-pdf": "3.11.0-beta.116", "@ohif/extension-dicom-pdf": "3.11.1",
"@ohif/extension-dicom-video": "3.11.0-beta.116", "@ohif/extension-dicom-video": "3.11.1",
"@ohif/extension-test": "3.11.0-beta.116", "@ohif/extension-test": "3.11.1",
"@ohif/extension-ultrasound-pleura-bline": "3.11.0-beta.116", "@ohif/extension-ultrasound-pleura-bline": "3.11.1",
"@ohif/i18n": "3.11.0-beta.116", "@ohif/i18n": "3.11.1",
"@ohif/mode-basic-dev-mode": "3.11.0-beta.116", "@ohif/mode-basic-dev-mode": "3.11.1",
"@ohif/mode-longitudinal": "3.11.0-beta.116", "@ohif/mode-longitudinal": "3.11.1",
"@ohif/mode-microscopy": "3.11.0-beta.116", "@ohif/mode-microscopy": "3.11.1",
"@ohif/mode-test": "3.11.0-beta.116", "@ohif/mode-test": "3.11.1",
"@ohif/mode-ultrasound-pleura-bline": "3.11.0-beta.116", "@ohif/mode-ultrasound-pleura-bline": "3.11.1",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"@ohif/ui-next": "3.11.0-beta.116", "@ohif/ui-next": "3.11.1",
"@svgr/webpack": "^8.1.0", "@svgr/webpack": "8.1.0",
"@types/react": "^18.3.3", "@types/react": "18.3.23",
"classnames": "^2.3.2", "classnames": "2.5.1",
"core-js": "*", "core-js": "3.45.1",
"cornerstone-math": "^0.1.9", "cornerstone-math": "0.1.10",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"detect-gpu": "^4.0.16", "detect-gpu": "4.0.50",
"dicom-parser": "^1.8.9", "dicom-parser": "1.8.21",
"dotenv-webpack": "^1.7.0", "dotenv-webpack": "1.8.0",
"file-loader": "^6.2.0", "file-loader": "6.2.0",
"hammerjs": "^2.0.8", "hammerjs": "2.0.8",
"history": "^5.3.0", "history": "5.3.0",
"i18next": "^17.0.3", "i18next": "17.3.1",
"i18next-browser-languagedetector": "^3.0.1", "i18next-browser-languagedetector": "3.1.1",
"lodash.isequal": "4.5.0", "lodash.isequal": "4.5.0",
"oidc-client": "1.11.5", "oidc-client": "1.11.5",
"oidc-client-ts": "^3.0.1", "oidc-client-ts": "3.3.0",
"prop-types": "^15.7.2", "prop-types": "15.8.1",
"query-string": "^6.12.1", "query-string": "6.14.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-dropzone": "^10.1.7", "react-dropzone": "10.2.2",
"react-i18next": "^12.2.2", "react-i18next": "12.3.1",
"react-resize-detector": "^10.0.1", "react-resize-detector": "10.0.1",
"react-router": "^6.23.1", "react-router": "6.30.1",
"react-router-dom": "^6.8.1", "react-router-dom": "6.30.1",
"react-shepherd": "6.1.1", "react-shepherd": "6.1.1",
"shepherd.js": "13.0.3", "shepherd.js": "13.0.3",
"url-loader": "^4.1.1", "url-loader": "4.1.1",
"zustand": "4.5.5" "zustand": "4.5.5"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-methods": "7.27.1",
"@types/node": "^20.12.12", "@pmmmwh/react-refresh-webpack-plugin": "0.5.17",
"@types/node": "20.19.9",
"clean-webpack-plugin": "4.0.0",
"copy-webpack-plugin": "10.2.4",
"cross-env": "7.0.3",
"extract-css-chunks-webpack-plugin": "4.10.0",
"html-webpack-plugin": "5.6.3",
"identity-obj-proxy": "3.0.x", "identity-obj-proxy": "3.0.x",
"tailwindcss": "3.2.4" "mini-css-extract-plugin": "2.9.2",
"shx": "0.3.4",
"tailwindcss": "3.2.4",
"terser-webpack-plugin": "5.3.14",
"webpack-dev-server": "5.2.2",
"workbox-webpack-plugin": "6.6.1"
} }
} }

View File

@ -25,6 +25,7 @@ window.config = {
// above, the number of requests can be go a lot higher. // above, the number of requests can be go a lot higher.
prefetch: 25, prefetch: 25,
}, },
showErrorDetails: 'always', // 'always', 'dev', 'production'
// filterQueryParam: false, // filterQueryParam: false,
// Defines multi-monitor layouts // Defines multi-monitor layouts
multimonitor: [ multimonitor: [

View File

@ -128,11 +128,17 @@ const createRoutes = ({
]; ];
function RouteWithErrorBoundary({ route, ...rest }) { function RouteWithErrorBoundary({ route, ...rest }) {
const [appConfig] = useAppConfig();
const { showErrorDetails } = appConfig;
history.navigate = useNavigate(); history.navigate = useNavigate();
// eslint-disable-next-line react/jsx-props-no-spreading // eslint-disable-next-line react/jsx-props-no-spreading
return ( return (
<ErrorBoundary context={`Route ${route.path}`}> <ErrorBoundary
context={`Route ${route.path}`}
showErrorDetails={showErrorDetails}
>
<route.children <route.children
{...rest} {...rest}
{...route.props} {...route.props}

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/cli
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/cli
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/cli **Note:** Version bump only for package @ohif/cli

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/cli", "name": "@ohif/cli",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "A CLI to bootstrap new OHIF extension or mode", "description": "A CLI to bootstrap new OHIF extension or mode",
"type": "module", "type": "module",
"main": "src/index.js", "main": "src/index.js",
@ -21,20 +21,20 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/core": "7.28.0", "@babel/core": "7.28.0",
"axios": "^1.11.0", "axios": "1.12.0",
"chalk": "^5.0.0", "chalk": "5.4.1",
"execa": "^8.0.1", "execa": "8.0.1",
"gitignore": "^0.7.0", "gitignore": "0.7.0",
"inquirer": "^8.2.0", "inquirer": "8.2.6",
"listr": "^0.14.3", "listr": "0.14.3",
"mustache": "^4.2.0", "mustache": "4.2.0",
"ncp": "^2.0.0", "ncp": "2.0.0",
"node-fetch": "^3.1.1", "node-fetch": "3.3.2",
"pkg-install": "^1.0.0", "pkg-install": "1.0.0",
"registry-url": "^6.0.0", "registry-url": "6.0.1",
"spdx-license-list": "^6.4.0", "spdx-license-list": "6.10.0",
"util": "^0.12.4", "util": "0.12.5",
"yarn-programmatic": "^0.1.2" "yarn-programmatic": "0.1.2"
}, },
"files": [ "files": [
"bin/", "bin/",

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/core
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/core
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/core **Note:** Version bump only for package @ohif/core

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/core", "name": "@ohif/core",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Generic business logic for web-based medical imaging applications", "description": "Generic business logic for web-based medical imaging applications",
"author": "OHIF Core Team", "author": "OHIF Core Team",
"license": "MIT", "license": "MIT",
@ -33,33 +33,33 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage" "test:unit:ci": "jest --ci --runInBand --collectCoverage"
}, },
"peerDependencies": { "peerDependencies": {
"@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-charls": "1.2.3",
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjpeg": "1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5", "@cornerstonejs/codec-openjph": "2.4.7",
"@cornerstonejs/core": "^3.32.5", "@cornerstonejs/core": "4.5.13",
"@cornerstonejs/dicom-image-loader": "^3.32.5", "@cornerstonejs/dicom-image-loader": "4.5.13",
"@ohif/ui": "3.11.0-beta.116", "@ohif/ui": "3.11.1",
"cornerstone-math": "0.1.9", "cornerstone-math": "0.1.9",
"dicom-parser": "^1.8.21" "dicom-parser": "1.8.21"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"dcmjs": "0.43.1", "dcmjs": "0.43.1",
"dicomweb-client": "^0.10.4", "dicomweb-client": "0.10.4",
"gl-matrix": "^3.4.3", "gl-matrix": "3.4.3",
"immutability-helper": "^3.1.1", "immutability-helper": "3.1.1",
"isomorphic-base64": "^1.0.2", "isomorphic-base64": "1.0.2",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "4.5.0",
"lodash.isequal": "^4.5.0", "lodash.isequal": "4.5.0",
"moment": "^2.30.1", "moment": "2.30.1",
"object-hash": "2.1.1", "object-hash": "2.1.1",
"query-string": "^6.14.0", "query-string": "6.14.1",
"react-shepherd": "6.1.1", "react-shepherd": "6.1.1",
"shepherd.js": "13.0.3", "shepherd.js": "13.0.3",
"validate.js": "^0.12.0" "validate.js": "0.12.0"
}, },
"devDependencies": { "devDependencies": {
"webpack-merge": "*" "webpack-merge": "5.10.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package ohif-docs
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package ohif-docs
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package ohif-docs **Note:** Version bump only for package ohif-docs

View File

@ -196,6 +196,7 @@ if auth headers are used, a preflight request is required.
- `activateViewportBeforeInteraction`: (default to true), if set to false, tools can be used directly without the need to click and activate the viewport. - `activateViewportBeforeInteraction`: (default to true), if set to false, tools can be used directly without the need to click and activate the viewport.
- `autoPlayCine`: (default to false), if set to true, data sets with the DICOM frame time tag (i.e. (0018,1063)) will auto play when displayed - `autoPlayCine`: (default to false), if set to true, data sets with the DICOM frame time tag (i.e. (0018,1063)) will auto play when displayed
- `addWindowLevelActionMenu`: (default to true), if set to false, the window level action menu item is NOT added to the viewport action corners - `addWindowLevelActionMenu`: (default to true), if set to false, the window level action menu item is NOT added to the viewport action corners
- `showErrorDetails`: determines which runtime environments can display exception and error details caught at the `ErrorBoundary`; acceptable values include: `always`, `dev`, and `production`
- `dangerouslyUseDynamicConfig`: Dynamic config allows user to pass `configUrl` query string. This allows to load config without recompiling application. If the `configUrl` query string is passed, the worklist and modes will load from the referenced json rather than the default .env config. If there is no `configUrl` path provided, the default behaviour is used and there should not be any deviation from current user experience.<br/> - `dangerouslyUseDynamicConfig`: Dynamic config allows user to pass `configUrl` query string. This allows to load config without recompiling application. If the `configUrl` query string is passed, the worklist and modes will load from the referenced json rather than the default .env config. If there is no `configUrl` path provided, the default behaviour is used and there should not be any deviation from current user experience.<br/>
Points to consider while using `dangerouslyUseDynamicConfig`:<br/> Points to consider while using `dangerouslyUseDynamicConfig`:<br/>
- User have to enable this feature by setting `dangerouslyUseDynamicConfig.enabled:true`. By default it is `false`. - User have to enable this feature by setting `dangerouslyUseDynamicConfig.enabled:true`. By default it is `false`.

View File

@ -1,6 +1,6 @@
{ {
"name": "ohif-docs", "name": "ohif-docs",
"version": "3.11.0-beta.116", "version": "3.11.1",
"private": true, "private": true,
"scripts": { "scripts": {
"docusaurus": "docusaurus", "docusaurus": "docusaurus",
@ -48,52 +48,52 @@
"@docusaurus/tsconfig": "3.0.0", "@docusaurus/tsconfig": "3.0.0",
"@docusaurus/types": "3.0.0", "@docusaurus/types": "3.0.0",
"@mdx-js/react": "3.0.1", "@mdx-js/react": "3.0.1",
"@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-accordion": "1.2.11",
"@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-checkbox": "1.3.2",
"@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dialog": "1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-dropdown-menu": "2.1.15",
"@radix-ui/react-hover-card": "^1.1.6", "@radix-ui/react-hover-card": "1.1.14",
"@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-icons": "1.3.2",
"@radix-ui/react-label": "^2.1.0", "@radix-ui/react-label": "2.1.7",
"@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-popover": "1.1.14",
"@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-scroll-area": "1.2.9",
"@radix-ui/react-select": "^2.1.1", "@radix-ui/react-select": "2.2.5",
"@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-separator": "1.1.7",
"@radix-ui/react-slider": "^1.2.0", "@radix-ui/react-slider": "1.3.5",
"@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-slot": "1.2.3",
"@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-switch": "1.2.5",
"@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-tabs": "1.1.12",
"@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle": "1.1.9",
"@radix-ui/react-tooltip": "^1.1.2", "@radix-ui/react-tooltip": "1.2.7",
"@svgr/webpack": "^5.5.0", "@svgr/webpack": "8.1.0",
"@types/react": "^18.2.29", "@types/react": "18.3.23",
"autoprefixer": "^10.4.20", "autoprefixer": "10.4.21",
"class-variance-authority": "^0.7.0", "class-variance-authority": "0.7.1",
"classnames": "^2.3.2", "classnames": "2.5.1",
"clsx": "^1.1.1", "clsx": "2.1.1",
"cmdk": "^1.0.0", "cmdk": "1.1.1",
"date-fns": "^3.6.0", "date-fns": "3.6.0",
"docusaurus-plugin-image-zoom": "^1.0.1", "docusaurus-plugin-image-zoom": "1.0.1",
"file-loader": "^6.2.0", "file-loader": "6.2.0",
"framer-motion": "6.2.4", "framer-motion": "6.2.4",
"glob": "^10.3.10", "glob": "10.4.5",
"lucide-react": "^0.379.0", "lucide-react": "0.379.0",
"next-themes": "^0.3.0", "next-themes": "0.3.0",
"postcss": "^8.4.47", "postcss": "8.5.6",
"postcss-import": "^14.0.2", "postcss-import": "14.1.0",
"postcss-preset-env": "^7.4.3", "postcss-preset-env": "7.8.3",
"prism-react-renderer": "^2.1.0", "prism-react-renderer": "2.1.0",
"react": "^18.3.1", "react": "18.3.1",
"react-day-picker": "^8.10.1", "react-day-picker": "8.10.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-outside-click-handler": "^1.3.0", "react-outside-click-handler": "1.3.0",
"react-shepherd": "6.1.1", "react-shepherd": "6.1.1",
"shepherd.js": "13.0.3", "shepherd.js": "13.0.3",
"sonner": "^1.4.41", "sonner": "1.7.4",
"tailwind-merge": "^2.3.0", "tailwind-merge": "2.6.0",
"tailwindcss": "^3.4.13", "tailwindcss": "3.2.4",
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "1.0.7",
"typescript": "~5.2.2", "typescript": "5.5.4",
"url-loader": "^4.1.1" "url-loader": "4.1.1"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/i18n
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/i18n
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/i18n **Note:** Version bump only for package @ohif/i18n

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/i18n", "name": "@ohif/i18n",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Internationalization library for The OHIF Viewer", "description": "Internationalization library for The OHIF Viewer",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@ -31,24 +31,24 @@
"test:unit:ci": "echo 'platform/i18n: missing unit tests'" "test:unit:ci": "echo 'platform/i18n: missing unit tests'"
}, },
"peerDependencies": { "peerDependencies": {
"i18next": "^17.0.3", "i18next": "17.3.1",
"i18next-browser-languagedetector": "^3.0.1", "i18next-browser-languagedetector": "3.1.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-i18next": "^12.2.2" "react-i18next": "12.3.1"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "7.28.2",
"i18next-locize-backend": "^2.0.0", "i18next-locize-backend": "2.2.2",
"locize-editor": "^2.0.0", "locize-editor": "2.2.2",
"locize-lastused": "^1.1.0" "locize-lastused": "1.1.1"
}, },
"devDependencies": { "devDependencies": {
"i18next": "^17.0.3", "i18next": "17.3.1",
"i18next-browser-languagedetector": "^3.0.1", "i18next-browser-languagedetector": "3.1.1",
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-i18next": "^12.2.2", "react-i18next": "12.3.1",
"webpack-merge": "^5.7.3" "webpack-merge": "5.10.0"
} }
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/ui-next
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/ui-next
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/ui-next **Note:** Version bump only for package @ohif/ui-next

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/ui-next", "name": "@ohif/ui-next",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "Next version of OHIF Viewers UI, more customizable using shadcn/ui", "description": "Next version of OHIF Viewers UI, more customizable using shadcn/ui",
"main": "dist/ohif-ui-next.umd.js", "main": "dist/ohif-ui-next.umd.js",
"module": "src/index.ts", "module": "src/index.ts",
@ -12,7 +12,7 @@
"README.md" "README.md"
], ],
"scripts": { "scripts": {
"clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", "clean": "shx rm -rf dist",
"clean:deep": "yarn run clean && shx rm -rf node_modules", "clean:deep": "yarn run clean && shx rm -rf node_modules",
"start": "yarn run build --watch", "start": "yarn run build --watch",
"dev": "cross-env NODE_ENV=development webpack serve --config .webpack/webpack.playground.js", "dev": "cross-env NODE_ENV=development webpack serve --config .webpack/webpack.playground.js",
@ -27,43 +27,44 @@
".": "./src/index.ts" ".": "./src/index.ts"
}, },
"dependencies": { "dependencies": {
"@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-accordion": "1.2.11",
"@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-checkbox": "1.3.2",
"@radix-ui/react-context-menu": "^2.2.4", "@radix-ui/react-context-menu": "2.2.15",
"@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dialog": "1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-dropdown-menu": "2.1.15",
"@radix-ui/react-hover-card": "^1.1.6", "@radix-ui/react-hover-card": "1.1.14",
"@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-icons": "1.3.2",
"@radix-ui/react-label": "^2.1.0", "@radix-ui/react-label": "2.1.7",
"@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-popover": "1.1.14",
"@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-scroll-area": "1.2.9",
"@radix-ui/react-select": "^2.1.1", "@radix-ui/react-select": "2.2.5",
"@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-separator": "1.1.7",
"@radix-ui/react-slider": "^1.2.0", "@radix-ui/react-slider": "1.3.5",
"@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-slot": "1.2.3",
"@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-switch": "1.2.5",
"@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-tabs": "1.1.12",
"@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle": "1.1.9",
"@radix-ui/react-tooltip": "^1.1.2", "@radix-ui/react-toggle-group": "1.1.10",
"class-variance-authority": "^0.7.0", "@radix-ui/react-tooltip": "1.2.7",
"clsx": "*", "class-variance-authority": "0.7.1",
"cmdk": "^1.0.0", "clsx": "2.1.1",
"date-fns": "^3.6.0", "cmdk": "1.1.1",
"date-fns": "3.6.0",
"framer-motion": "6.2.4", "framer-motion": "6.2.4",
"lucide-react": "^0.379.0", "lucide-react": "0.379.0",
"next-themes": "^0.3.0", "next-themes": "0.3.0",
"react": "^18.3.1", "react": "18.3.1",
"react-day-picker": "^8.10.1", "react-day-picker": "8.10.1",
"react-resizable-panels": "^2.1.7", "react-resizable-panels": "2.1.9",
"react-shepherd": "6.1.1", "react-shepherd": "6.1.1",
"shepherd.js": "13.0.3", "shepherd.js": "13.0.3",
"sonner": "^1.5.0", "sonner": "1.7.4",
"tailwind-merge": "^2.3.0", "tailwind-merge": "2.6.0",
"tailwindcss": "3.2.4", "tailwindcss": "3.2.4",
"tailwindcss-animate": "^1.0.7" "tailwindcss-animate": "1.0.7"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-transform-private-property-in-object": "^7.27.1" "@babel/plugin-transform-private-property-in-object": "7.27.1"
}, },
"keywords": [], "keywords": [],
"author": "OHIF", "author": "OHIF",

View File

@ -1,4 +1,4 @@
import React, { useState, useRef } from 'react'; import React, { useState } from 'react';
import { Button } from '../../components/Button/Button'; import { Button } from '../../components/Button/Button';
import { import {
DropdownMenu, DropdownMenu,
@ -81,7 +81,9 @@ interface DataRowProps {
className?: string; className?: string;
} }
export const DataRow: React.FC<DataRowProps> = ({ const DataRow = React.forwardRef<HTMLDivElement, DataRowProps>(
(
{
number, number,
title, title,
colorHex, colorHex,
@ -97,18 +99,11 @@ export const DataRow: React.FC<DataRowProps> = ({
isVisible = true, isVisible = true,
disableEditing = false, disableEditing = false,
className, className,
}) => { },
ref
) => {
const [isDropdownOpen, setIsDropdownOpen] = useState(false); const [isDropdownOpen, setIsDropdownOpen] = useState(false);
const isTitleLong = title?.length > 25; const isTitleLong = title?.length > 25;
const rowRef = useRef<HTMLDivElement>(null);
// useEffect(() => {
// if (isSelected && rowRef.current) {
// setTimeout(() => {
// rowRef.current?.scrollIntoView({ behavior: 'smooth', block: 'center' });
// }, 200);
// }
// }, [isSelected]);
const handleAction = (action: string, e: React.MouseEvent) => { const handleAction = (action: string, e: React.MouseEvent) => {
e.stopPropagation(); e.stopPropagation();
@ -194,7 +189,7 @@ export const DataRow: React.FC<DataRowProps> = ({
return ( return (
<div <div
ref={rowRef} ref={ref}
className={cn('flex flex-col', !isVisible && 'opacity-60', className)} className={cn('flex flex-col', !isVisible && 'opacity-60', className)}
> >
<div <div
@ -279,7 +274,9 @@ export const DataRow: React.FC<DataRowProps> = ({
</Button> </Button>
{/* Lock Icon (if needed) */} {/* Lock Icon (if needed) */}
{isLocked && !disableEditing && <Icons.Lock className="text-muted-foreground h-6 w-6" />} {isLocked && !disableEditing && (
<Icons.Lock className="text-muted-foreground h-6 w-6" />
)}
{/* Actions Dropdown Menu */} {/* Actions Dropdown Menu */}
{disableEditing && <div className="h-6 w-6"></div>} {disableEditing && <div className="h-6 w-6"></div>}
@ -367,6 +364,8 @@ export const DataRow: React.FC<DataRowProps> = ({
)} )}
</div> </div>
); );
}; }
);
export default DataRow; export default DataRow;
export { DataRow };

View File

@ -112,10 +112,17 @@ interface ErrorBoundaryError extends Error {
stack?: string; stack?: string;
} }
enum ShowErrorDetails {
always = 'always',
dev = 'dev',
production = 'production',
}
interface DefaultFallbackProps extends FallbackProps { interface DefaultFallbackProps extends FallbackProps {
error: ErrorBoundaryError; error: ErrorBoundaryError;
context: string; context: string;
resetErrorBoundary: () => void; resetErrorBoundary: () => void;
showErrorDetails?: ShowErrorDetails;
} }
interface ErrorBoundaryProps { interface ErrorBoundaryProps {
@ -126,13 +133,21 @@ interface ErrorBoundaryProps {
children: React.ReactNode; children: React.ReactNode;
fallbackRoute?: string | null; fallbackRoute?: string | null;
isPage?: boolean; isPage?: boolean;
showErrorDetails?: ShowErrorDetails;
} }
const DefaultFallback = ({ const DefaultFallback = ({
error, error,
context, context,
resetErrorBoundary = () => {}, resetErrorBoundary = () => {},
showErrorDetails,
}: DefaultFallbackProps) => { }: DefaultFallbackProps) => {
const isShowDetailsButtonVisible =
showErrorDetails == null ||
showErrorDetails === ShowErrorDetails.always ||
(showErrorDetails === ShowErrorDetails.dev && !isProduction) ||
(showErrorDetails === ShowErrorDetails.production && isProduction);
const { t } = useTranslation('ErrorBoundary'); const { t } = useTranslation('ErrorBoundary');
const [showDetails, setShowDetails] = useState(false); const [showDetails, setShowDetails] = useState(false);
const { show } = useNotification(); const { show } = useNotification();
@ -165,17 +180,15 @@ const DefaultFallback = ({
type: 'error', type: 'error',
duration: 0, duration: 0,
id: errorId, id: errorId,
action: { action: isShowDetailsButtonVisible
? {
label: t('Show Details'), label: t('Show Details'),
onClick: () => setShowDetails(true), onClick: () => setShowDetails(true),
}, }
: undefined,
}); });
}, [error, errorTitle, subtitle, t, title, show]); }, [error, errorTitle, subtitle, t, title, show]);
if (isProduction) {
return null;
}
return ( return (
<Dialog <Dialog
open={showDetails} open={showDetails}
@ -249,6 +262,7 @@ const ErrorBoundary = ({
onError = _error => {}, onError = _error => {},
fallbackComponent: FallbackComponent = DefaultFallback, fallbackComponent: FallbackComponent = DefaultFallback,
children, children,
showErrorDetails,
}: ErrorBoundaryProps) => { }: ErrorBoundaryProps) => {
const [error, setError] = useState<ErrorBoundaryError | null>(null); const [error, setError] = useState<ErrorBoundaryError | null>(null);
@ -303,6 +317,7 @@ const ErrorBoundary = ({
<FallbackComponent <FallbackComponent
{...props} {...props}
context={context} context={context}
showErrorDetails={showErrorDetails}
/> />
)} )}
onReset={onResetHandler} onReset={onResetHandler}
@ -315,6 +330,7 @@ const ErrorBoundary = ({
error={error} error={error}
context={context} context={context}
resetErrorBoundary={() => setError(null)} resetErrorBoundary={() => setError(null)}
showErrorDetails={showErrorDetails}
/> />
)} )}
</> </>

View File

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

View File

@ -1,4 +1,4 @@
import React from 'react'; import React, { useEffect } from 'react';
import { ScrollArea, DataRow } from '../../components'; import { ScrollArea, DataRow } from '../../components';
import { HoverCard, HoverCardTrigger, HoverCardContent } from '../../components/HoverCard'; import { HoverCard, HoverCardTrigger, HoverCardContent } from '../../components/HoverCard';
import { useSegmentationTableContext, useSegmentationExpanded } from './contexts'; import { useSegmentationTableContext, useSegmentationExpanded } from './contexts';
@ -23,6 +23,11 @@ export const SegmentationSegments = ({ children = null }: { children?: React.Rea
let segmentation; let segmentation;
let representation; let representation;
const activeSegmentRef = React.useRef<{
element: HTMLElement | null;
index: number | null;
}>({ element: null, index: null });
try { try {
// Try to use the SegmentationExpanded context if available // Try to use the SegmentationExpanded context if available
const segmentationInfo = useSegmentationExpanded('SegmentationSegments'); const segmentationInfo = useSegmentationExpanded('SegmentationSegments');
@ -38,23 +43,61 @@ export const SegmentationSegments = ({ children = null }: { children?: React.Rea
} }
const segments = Object.values(representation.segments); const segments = Object.values(representation.segments);
// Find the active segment to scroll to it when it changes
const activeSegment = segments.find(segment => {
if (!segment) {
return false;
}
const segmentFromSegmentation = segmentation.segments[segment.segmentIndex];
return segmentFromSegmentation?.active;
});
const isActiveSegmentation = segmentation.segmentationId === activeSegmentationId; const isActiveSegmentation = segmentation.segmentationId === activeSegmentationId;
const { ref: scrollableContainerRef, maxHeight } = useDynamicMaxHeight(segments); const { ref: scrollableContainerRef, maxHeight } = useDynamicMaxHeight(segments);
useEffect(() => {
const activeSegmentIndex = activeSegmentRef.current.index;
if (!activeSegmentIndex || activeSegmentIndex !== activeSegment?.segmentIndex) {
return;
}
const activeSegmentElement = activeSegmentRef.current.element;
if (!activeSegmentElement) {
return;
}
// Check if the active segment is already visible.
const activeSegmentElementBounds = activeSegmentElement.getBoundingClientRect();
const scrollableContainerRect = scrollableContainerRef.current.getBoundingClientRect();
if (
activeSegmentElementBounds.top > scrollableContainerRect.top &&
activeSegmentElementBounds.bottom < scrollableContainerRect.bottom
) {
// The active segment is already visible, so we don't need to scroll.
return;
}
activeSegmentElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}, [activeSegment?.segmentIndex, scrollableContainerRef]);
if (!representation || !segmentation) { if (!representation || !segmentation) {
return null; return null;
} }
return ( return (
<div ref={scrollableContainerRef}>
<ScrollArea <ScrollArea
className={`bg-bkg-low space-y-px`} className={`bg-bkg-low space-y-px`}
showArrows={true} showArrows={
> scrollableContainerRef?.current
<div ? scrollableContainerRef?.current?.offsetHeight >= parseFloat(maxHeight)
ref={scrollableContainerRef} : false
style={{ maxHeight: maxHeight }} }
> >
<div style={{ maxHeight: maxHeight }}>
{segments.map(segment => { {segments.map(segment => {
if (!segment) { if (!segment) {
return null; return null;
@ -74,8 +117,22 @@ export const SegmentationSegments = ({ children = null }: { children?: React.Rea
const cssColor = `rgb(${color[0]},${color[1]},${color[2]})`; const cssColor = `rgb(${color[0]},${color[1]},${color[2]})`;
const hasStats = segmentFromSegmentation.cachedStats?.namedStats; const hasStats = segmentFromSegmentation.cachedStats?.namedStats;
const segmentRowRef = (element: HTMLElement) => {
if (!active) {
return;
}
if (element) {
activeSegmentRef.current = { element, index: segmentIndex };
} else {
activeSegmentRef.current = { element: null, index: null };
}
};
const DataRowComponent = ( const DataRowComponent = (
<DataRow <DataRow
ref={segmentRowRef}
key={segmentIndex} key={segmentIndex}
number={showSegmentIndex ? segmentIndex : null} number={showSegmentIndex ? segmentIndex : null}
title={label} title={label}
@ -95,7 +152,9 @@ export const SegmentationSegments = ({ children = null }: { children?: React.Rea
representation.type representation.type
) )
} }
onToggleLocked={() => onToggleSegmentLock(segmentation.segmentationId, segmentIndex)} onToggleLocked={() =>
onToggleSegmentLock(segmentation.segmentationId, segmentIndex)
}
onSelect={() => onSegmentClick(segmentation.segmentationId, segmentIndex)} onSelect={() => onSegmentClick(segmentation.segmentationId, segmentIndex)}
onRename={() => onSegmentEdit(segmentation.segmentationId, segmentIndex)} onRename={() => onSegmentEdit(segmentation.segmentationId, segmentIndex)}
onDelete={() => onSegmentDelete(segmentation.segmentationId, segmentIndex)} onDelete={() => onSegmentDelete(segmentation.segmentationId, segmentIndex)}
@ -140,6 +199,7 @@ export const SegmentationSegments = ({ children = null }: { children?: React.Rea
})} })}
</div> </div>
</ScrollArea> </ScrollArea>
</div>
); );
}; };

View File

@ -1,5 +1,29 @@
import { useRef, useState, useEffect, RefObject } from 'react'; import { useRef, useState, useEffect, RefObject } from 'react';
const _getMovementIntersectionObserver = ({
callback,
rootMargin,
threshold,
}: {
callback: () => void;
rootMargin: string;
threshold: number[];
}): IntersectionObserver => {
return new IntersectionObserver(
entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
callback();
}
});
},
{
threshold,
rootMargin,
}
);
};
/** /**
* Calculates the maximum height for an element based on its position * Calculates the maximum height for an element based on its position
* relative to the bottom of the viewport. * relative to the bottom of the viewport.
@ -31,20 +55,49 @@ export function useDynamicMaxHeight(
} }
}; };
// Calculate initially // Two intersection observers to trigger a recalculation when the target element
// Use requestAnimationFrame to ensure layout is stable after initial render // moves up or down. One for moving up and one for moving down.
const rafId = requestAnimationFrame(calculateMaxHeight); // Note that with this approach we don't need to use a resize observer nor
// a window resize listener.
// Recalculate on window resize // The trick is to use a margin for the IntersectionObserver to detect movement.
window.addEventListener('resize', calculateMaxHeight); // See more below.
const rootMarginHeight = maxHeight === '100vh' ? `${window.innerHeight}px` : `${maxHeight}`;
// Note that we use a fine grained threshold because we don't know how
// much it will move and we want any movement to trigger the intersection observer.
const threshold = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0];
// The trick here is to use the calculated maxHeight as the root margin height
// so that any movement of the target element down (i.e. "out of the" viewport)
// will trigger the intersection observer.
const moveDownIntersectionObserver = _getMovementIntersectionObserver({
callback: calculateMaxHeight,
rootMargin: `0px 0px ${rootMarginHeight} 0px`,
threshold,
});
// The trick here is to use the calculated maxHeight as the negative
// root margin height so that any movement of the target element up
// (i.e. "into the" viewport) will trigger the intersection observer.
const moveUpIntersectionObserver = _getMovementIntersectionObserver({
callback: calculateMaxHeight,
rootMargin: `0px 0px -${rootMarginHeight} 0px`,
threshold,
});
if (ref.current) {
moveUpIntersectionObserver.observe(ref.current);
moveDownIntersectionObserver.observe(ref.current);
}
// Cleanup listener and requestAnimationFrame on component unmount // Cleanup listener and requestAnimationFrame on component unmount
return () => { return () => {
window.removeEventListener('resize', calculateMaxHeight); moveUpIntersectionObserver.disconnect();
cancelAnimationFrame(rafId); moveDownIntersectionObserver.disconnect();
}; };
// Dependencies: buffer, minHeight, and data. // Dependencies: buffer, minHeight, and data.
}, [data, buffer, minHeight]); }, [data, buffer, minHeight, maxHeight]);
return { ref, maxHeight }; return { ref, maxHeight };
} }

View File

@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.1](https://github.com/OHIF/Viewers/compare/v3.11.0...v3.11.1) (2025-10-28)
**Note:** Version bump only for package @ohif/ui
# [3.11.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.11.0) (2025-08-05)
**Note:** Version bump only for package @ohif/ui
# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) # [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05)
**Note:** Version bump only for package @ohif/ui **Note:** Version bump only for package @ohif/ui

View File

@ -1,6 +1,6 @@
{ {
"name": "@ohif/ui", "name": "@ohif/ui",
"version": "3.11.0-beta.116", "version": "3.11.1",
"description": "A set of React components for Medical Imaging Viewers", "description": "A set of React components for Medical Imaging Viewers",
"author": "OHIF Contributors", "author": "OHIF Contributors",
"license": "MIT", "license": "MIT",
@ -19,23 +19,20 @@
"README.md" "README.md"
], ],
"scripts": { "scripts": {
"clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", "clean": "shx rm -rf dist",
"clean:deep": "yarn run clean && shx rm -rf node_modules", "clean:deep": "yarn run clean && shx rm -rf node_modules",
"start": "yarn run build --watch", "start": "yarn run build --watch",
"build": "cross-env NODE_ENV=production webpack --config .webpack/webpack.prod.js", "build": "cross-env NODE_ENV=production webpack --config .webpack/webpack.prod.js",
"build:package": "yarn run build", "build:package": "yarn run build"
"storybook": "storybook dev -p 6006",
"dev": "storybook dev -p 6006",
"build-storybook": "storybook build"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^18.3.1", "react": "18.3.1",
"react-dom": "^18.3.1" "react-dom": "18.3.1"
}, },
"dependencies": { "dependencies": {
"@testing-library/react": "^13.1.0", "@testing-library/react": "13.4.0",
"browser-detect": "^0.2.28", "browser-detect": "0.2.28",
"classnames": "^2.3.2", "classnames": "2.5.1",
"d3-array": "3", "d3-array": "3",
"d3-axis": "3", "d3-axis": "3",
"d3-scale": "4", "d3-scale": "4",
@ -43,45 +40,36 @@
"d3-selection": "3", "d3-selection": "3",
"d3-shape": "3", "d3-shape": "3",
"d3-zoom": "3", "d3-zoom": "3",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "4.5.0",
"lodash.debounce": "^4.0.8", "lodash.debounce": "4.0.8",
"lodash.merge": "^4.6.1", "lodash.merge": "4.6.2",
"moment": "^2.30.1", "moment": "2.30.1",
"mousetrap": "^1.6.5", "mousetrap": "1.6.5",
"react": "^18.3.1", "react": "18.3.1",
"react-dates": "^21.8.0", "react-dates": "21.8.0",
"react-dnd": "14.0.2", "react-dnd": "14.0.2",
"react-dnd-html5-backend": "14.0.0", "react-dnd-html5-backend": "14.0.0",
"react-dom": "^18.3.1", "react-dom": "18.3.1",
"react-draggable": "^4.4.6", "react-draggable": "4.5.0",
"react-error-boundary": "^3.1.3", "react-error-boundary": "3.1.4",
"react-modal": "3.11.2", "react-modal": "3.11.2",
"react-outside-click-handler": "^1.3.0", "react-outside-click-handler": "1.3.0",
"react-select": "5.7.4", "react-select": "5.7.4",
"react-test-renderer": "^18.3.1", "react-test-renderer": "18.3.1",
"react-window": "^1.8.9", "react-window": "1.8.11",
"react-with-direction": "^1.3.1", "react-with-direction": "1.4.0",
"swiper": "^8.4.2", "swiper": "8.4.7",
"webpack": "5.95.0" "webpack": "5.95.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.28.0", "@babel/core": "7.28.0",
"@storybook/addon-actions": "^7.6.10", "autoprefixer": "10.4.21",
"@storybook/addon-docs": "^7.6.10", "babel-loader": "8.4.1",
"@storybook/addon-essentials": "^7.6.10", "dotenv-webpack": "1.8.0",
"@storybook/addon-links": "^7.6.10", "postcss": "8.5.6",
"@storybook/cli": "^7.6.10", "postcss-loader": "6.2.1",
"@storybook/react": "^7.6.10", "prop-types": "15.8.1",
"@storybook/react-webpack5": "^7.6.10", "remark-gfm": "3.0.1",
"@storybook/source-loader": "^7.6.10",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
"dotenv-webpack": "^8.0.1",
"postcss": "^8.4.23",
"postcss-loader": "^7.2.4",
"prop-types": "^15.8.1",
"remark-gfm": "^3.0.1",
"storybook": "^7.6.10",
"tailwindcss": "3.2.4" "tailwindcss": "3.2.4"
} }
} }

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
);
});

View File

@ -16,7 +16,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me
await page.getByTestId('MPR').click(); await page.getByTestId('MPR').click();
// Wait 5 seconds for MPR to load. This is necessary in particular when screen shots are added or replaced. // Wait 5 seconds for MPR to load. This is necessary in particular when screen shots are added or replaced.
await page.waitForTimeout(5000); await page.waitForTimeout(10000);
await checkForScreenshot( await checkForScreenshot(
page, page,

View File

@ -10,9 +10,14 @@ test.beforeEach(async ({ page }) => {
test('should hydrate RT reports correctly', async ({ page }) => { test('should hydrate RT reports correctly', async ({ page }) => {
await page.getByTestId('side-panel-header-right').click(); await page.getByTestId('side-panel-header-right').click();
await page.getByTestId('study-browser-thumbnail-no-image').dblclick(); await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
await page.waitForTimeout(5000);
await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPreHydration); await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPreHydration);
await page.getByTestId('yes-hydrate-btn').click(); await page.getByTestId('yes-hydrate-btn').click();
await page.waitForTimeout(5000);
await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPostHydration); await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPostHydration);
await page.getByText('Small Sphere').click(); await page.getByText('Small Sphere').click();
await page.waitForTimeout(5000);
await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtJumpToStructure); await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtJumpToStructure);
}); });

View File

@ -13,7 +13,7 @@ test('should hydrate an RTSTRUCT from MPR', async ({ page }) => {
await page.getByTestId('Layout').click(); await page.getByTestId('Layout').click();
await page.getByTestId('MPR').click(); await page.getByTestId('MPR').click();
await page.waitForTimeout(5000); await page.waitForTimeout(10000);
await checkForScreenshot(page, page, screenShotPaths.rtHydrationFromMPR.mprBeforeRT); await checkForScreenshot(page, page, screenShotPaths.rtHydrationFromMPR.mprBeforeRT);

View File

@ -2,6 +2,7 @@ import { test, expect } from 'playwright-test-coverage';
import { visitStudy, simulateNormalizedClickOnElement } from './utils/index'; import { visitStudy, simulateNormalizedClickOnElement } from './utils/index';
import { viewportLocator } from './utils/locators'; import { viewportLocator } from './utils/locators';
import { downloadAsString } from './utils/download'; import { downloadAsString } from './utils/download';
import toArray from 'extensions/dicom-microscopy/src/utils/toArray';
test('should create and download the TMTV CSV report correctly', async ({ page }) => { test('should create and download the TMTV CSV report correctly', async ({ page }) => {
const studyInstanceUID = '1.2.840.113619.2.290.3.3767434740.226.1600859119.501'; const studyInstanceUID = '1.2.840.113619.2.290.3.3767434740.226.1600859119.501';
@ -26,14 +27,22 @@ test('should create and download the TMTV CSV report correctly', async ({ page }
'202009231_tmtv.csv' '202009231_tmtv.csv'
); );
const tmtvCSVReportContent = await downloadAsString(download); const tmtvCSVReportContent: string = await downloadAsString(download);
const expectedHeaders =
'PatientID,PatientName,SeriesInstanceUID,StudyDate,StudyInstanceUID,center,count,id,kurtosis,label,lesionGlycolysis,max,maxLPS,mean,median,min,minLPS,peakLPS,peakValue,skewness,stdDev,volume';
const tmtvCSVReportHeaders = tmtvCSVReportContent
.substring(0, expectedHeaders.length)
.split(',')
.sort()
.join(',');
expect( expect(
tmtvCSVReportContent, tmtvCSVReportHeaders,
'Expected the file to start with specific column/value headers' 'Expected the file to start with specific column/value headers'
).toMatch( ).toBe(expectedHeaders);
/^id,label,min,max,mean,stdDev,median,skewness,kurtosis,count,maxLPS,minLPS,center,volume,peakValue,peakLPS,lesionGlycolysis,PatientID,PatientName,StudyInstanceUID,SeriesInstanceUID,StudyDate/
);
expect(tmtvCSVReportContent, 'Expected the patient name to be present').toContain( expect(tmtvCSVReportContent, 'Expected the patient name to be present').toContain(
'Water Phantom' 'Water Phantom'
); );

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 KiB

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 289 KiB

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 307 KiB

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 KiB

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 KiB

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Some files were not shown because too many files have changed in this diff Show More