From 2358a73c3cd24953430064480fb9e66bfe36ea69 Mon Sep 17 00:00:00 2001 From: Ghadeer Albattarni <165973963+GhadeerAlbattarni@users.noreply.github.com> Date: Wed, 4 Mar 2026 15:28:41 -0500 Subject: [PATCH] fix(microscopy): rename measurement in microscopy mode (#5866) --- .../dicom-microscopy/src/getCommandsModule.ts | 21 ++++++++---- .../src/components/DataRow/DataRow.tsx | 2 ++ tests/MicroscopyPanel.spec.ts | 33 +++++++++++++++++++ tests/pages/MainToolbarPageObject.ts | 16 ++++++++- tests/pages/RightPanelPageObject.ts | 22 +++++++++++++ 5 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 tests/MicroscopyPanel.spec.ts diff --git a/extensions/dicom-microscopy/src/getCommandsModule.ts b/extensions/dicom-microscopy/src/getCommandsModule.ts index 0d4855c69..4052dbdf1 100644 --- a/extensions/dicom-microscopy/src/getCommandsModule.ts +++ b/extensions/dicom-microscopy/src/getCommandsModule.ts @@ -1,6 +1,7 @@ import { CommandsManager, ExtensionManager } from '@ohif/core'; import { callInputDialog } from '@ohif/extension-default'; import styles from './utils/styles'; +import i18n from '@ohif/i18n'; export default function getCommandsModule({ servicesManager, @@ -24,16 +25,22 @@ export default function getCommandsModule({ } }, - setLabel: ({ uid }) => { + setLabel: async ({ uid }) => { const roiAnnotation = microscopyService.getAnnotation(uid); - callInputDialog({ + if (!roiAnnotation) { + return; + } + const value = await callInputDialog({ uiDialogService, - defaultValue: '', - onSave: (value: string) => { - roiAnnotation.setLabel(value); - microscopyService.triggerRelabel(roiAnnotation); - }, + title: i18n.t('Tools:Edit Measurement Label'), + placeholder: roiAnnotation.label || i18n.t('Tools:Enter new label'), + defaultValue: roiAnnotation.label, }); + + if (value != null) { + roiAnnotation.setLabel(value); + microscopyService.triggerRelabel(roiAnnotation); + } }, setToolActive: ({ toolName, toolGroupId = 'MICROSCOPY' }) => { diff --git a/platform/ui-next/src/components/DataRow/DataRow.tsx b/platform/ui-next/src/components/DataRow/DataRow.tsx index a75b3621a..82458e42d 100644 --- a/platform/ui-next/src/components/DataRow/DataRow.tsx +++ b/platform/ui-next/src/components/DataRow/DataRow.tsx @@ -280,6 +280,7 @@ const DataRowComponent = React.forwardRef( ( ) : ( { + const studyInstanceUID = '1.2.276.0.7230010.3.1.2.296485376.1.1665793212.499772'; + const mode = 'microscopy'; + await visitStudy(page, studyInstanceUID, mode, 5000); +}); +test('should rename a microscopy measurement label', async ({ + page, + mainToolbarPageObject, + DOMOverlayPageObject, + rightPanelPageObject, + viewportPageObject, +}) => { + const newLabel = 'Renamed Measurement'; + + await mainToolbarPageObject.measurementTools.line.click(); + + await viewportPageObject.active.clickAt([{ x: 400, y: 200 }]); + await page.waitForTimeout(200); + await viewportPageObject.active.clickAt([{ x: 550, y: 250 }]); + + const measurementRow = rightPanelPageObject.microscopyPanel.nthMeasurement(0); + await expect(measurementRow.locator).toBeVisible(); + + await expect(measurementRow.title).toHaveText('(empty)'); + + await measurementRow.actions.rename(newLabel); + + await expect(DOMOverlayPageObject.dialog.input.locator).toBeHidden(); + + await expect(measurementRow.title).toHaveText(newLabel); +}); diff --git a/tests/pages/MainToolbarPageObject.ts b/tests/pages/MainToolbarPageObject.ts index f783d71c9..001649d82 100644 --- a/tests/pages/MainToolbarPageObject.ts +++ b/tests/pages/MainToolbarPageObject.ts @@ -194,7 +194,6 @@ export class MainToolbarPageObject { }, }; }, - get freehandROI() { const button = page.getByTestId('PlanarFreehandROI'); return { @@ -205,6 +204,21 @@ export class MainToolbarPageObject { }, }; }, + /* microscopy specific tools */ + // `.last()` targets the menu item inside the dropdown, not the active-tool + // indicator inside the split-button primary + // because both share the same data-cy value (e.g. "line") + // Other microscopy tools might follow the same pattern + get line() { + const button = page.getByTestId('line').last(); + return { + button, + async click() { + await measurementTools.click(); + await button.click(); + }, + }; + }, }; } diff --git a/tests/pages/RightPanelPageObject.ts b/tests/pages/RightPanelPageObject.ts index 9b863db65..3a7def123 100644 --- a/tests/pages/RightPanelPageObject.ts +++ b/tests/pages/RightPanelPageObject.ts @@ -46,6 +46,9 @@ export class RightPanelPageObject { get actions() { return getActionsMenu(row); }, + get title() { + return row.getByTestId('data-row-title'); + }, click: async () => { await row.click(); }, @@ -323,4 +326,23 @@ export class RightPanelPageObject { }, }; } + + get microscopyPanel() { + const page = this.page; + const getMeasurementByIdx = (index: number) => this.getPanelRowByIdx(index); + const getMeasurementByText = (text: string) => this.getPanelRowByText(text); + + return { + locator: page.getByTestId('measurements-panel'), + getMeasurementCount: async () => { + return await page.getByTestId('data-row').count(); + }, + nthMeasurement(index: number) { + return getMeasurementByIdx(index); + }, + measurementByText(text: string) { + return getMeasurementByText(text); + }, + }; + } }