From 54fded554e934f2f75e00d456ebad7692d561225 Mon Sep 17 00:00:00 2001 From: nithin-trenser <107548822+nithin-trenser@users.noreply.github.com> Date: Fri, 4 Apr 2025 21:32:13 +0530 Subject: [PATCH] feat: Automate tracking prompts for a less disruptive annotation workflow (#4822) Co-authored-by: Devu Jayalekshmi --- .../src/utils/promptHydrateRT.ts | 12 +- .../src/utils/promptHydrateSEG.ts | 12 +- .../AccordionGroup/AccordionGroup.tsx | 5 +- .../MeasurementsOrAdditionalFindings.tsx | 3 +- .../components/StudyMeasurementsActions.tsx | 4 + .../cornerstone/src/initMeasurementService.ts | 22 +- .../Panels/StudyBrowser/PanelStudyBrowser.tsx | 5 +- .../notificationCustomization.ts | 24 ++ .../default/src/utils/callInputDialog.tsx | 6 +- .../default/src/utils/promptSaveReport.tsx | 2 + .../TrackedMeasurementsContext.tsx | 88 +++++- .../measurementTrackingMachine.js | 57 +++- .../promptBeginTracking.js | 26 +- .../promptHasDirtyAnnotations.ts | 81 +++++ .../promptHydrateStructuredReport.js | 16 +- .../promptTrackNewSeries.js | 26 +- .../promptTrackNewStudy.ts | 30 +- .../promptWrapperFunctions.ts | 83 +++++ .../measurementTrackingPrompts.tsx | 16 + .../studyBrowserCustomization.ts | 64 ++++ .../src/getCustomizationModule.ts | 10 + extensions/measurement-tracking/src/index.tsx | 20 +- .../panels/PanelMeasurementTableTracking.tsx | 31 +- .../PanelStudyBrowserTracking.tsx | 31 +- .../untrackSeriesModal.tsx | 4 +- platform/app/src/appInit.js | 1 + platform/app/src/components/ViewportGrid.tsx | 3 +- .../MeasurementService/MeasurementService.ts | 21 ++ .../ViewportGridService.ts | 5 + platform/core/src/types/AppTypes.ts | 1 + .../assets/img/promptAddSeriesContent.png | Bin 0 -> 17259 bytes .../assets/img/promptBeginTrackingContent.png | Bin 0 -> 11921 bytes .../assets/img/promptDiscardDirtyContent.png | Bin 0 -> 14837 bytes .../assets/img/promptDiscardSeriesContent.png | Bin 0 -> 16334 bytes .../assets/img/promptDiscardStudyContent.png | Bin 0 -> 23596 bytes .../docs/assets/img/promptRtstructContent.png | Bin 0 -> 17550 bytes .../assets/img/promptSRTrackingContent.png | Bin 0 -> 11902 bytes .../assets/img/promptTrackStudyContent.png | Bin 0 -> 11921 bytes .../assets/img/promptsegmentationContent.png | Bin 0 -> 11259 bytes .../docs/configuration/configurationFiles.md | 2 +- .../sampleCustomizations.tsx | 299 ++++++++++++++++++ .../src/locales/en-US/MeasurementTable.json | 8 +- 42 files changed, 948 insertions(+), 70 deletions(-) create mode 100644 extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHasDirtyAnnotations.ts create mode 100644 extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptWrapperFunctions.ts create mode 100644 extensions/measurement-tracking/src/customizations/measurementTrackingPrompts.tsx create mode 100644 extensions/measurement-tracking/src/customizations/studyBrowserCustomization.ts create mode 100644 extensions/measurement-tracking/src/getCustomizationModule.ts create mode 100644 platform/docs/docs/assets/img/promptAddSeriesContent.png create mode 100644 platform/docs/docs/assets/img/promptBeginTrackingContent.png create mode 100644 platform/docs/docs/assets/img/promptDiscardDirtyContent.png create mode 100644 platform/docs/docs/assets/img/promptDiscardSeriesContent.png create mode 100644 platform/docs/docs/assets/img/promptDiscardStudyContent.png create mode 100644 platform/docs/docs/assets/img/promptRtstructContent.png create mode 100644 platform/docs/docs/assets/img/promptSRTrackingContent.png create mode 100644 platform/docs/docs/assets/img/promptTrackStudyContent.png create mode 100644 platform/docs/docs/assets/img/promptsegmentationContent.png diff --git a/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts b/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts index 89abd66df..8799aa4ad 100644 --- a/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts +++ b/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts @@ -13,13 +13,13 @@ function promptHydrateRT({ preHydrateCallbacks, hydrateRTDisplaySet, }: withAppTypes) { - const { uiViewportDialogService } = servicesManager.services; + const { uiViewportDialogService, customizationService } = servicesManager.services; const extensionManager = servicesManager._extensionManager; const appConfig = extensionManager._appConfig; return new Promise(async function (resolve, reject) { const promptResult = appConfig?.disableConfirmationPrompts ? RESPONSE.HYDRATE_SEG - : await _askHydrate(uiViewportDialogService, viewportId); + : await _askHydrate(uiViewportDialogService, customizationService, viewportId); if (promptResult === RESPONSE.HYDRATE_SEG) { preHydrateCallbacks?.forEach(callback => { @@ -37,9 +37,13 @@ function promptHydrateRT({ }); } -function _askHydrate(uiViewportDialogService: AppTypes.UIViewportDialogService, viewportId) { +function _askHydrate( + uiViewportDialogService: AppTypes.UIViewportDialogService, + customizationService: AppTypes.CustomizationService, + viewportId +) { return new Promise(function (resolve, reject) { - const message = 'Do you want to open this Segmentation?'; + const message = customizationService.getCustomization('viewportNotification.hydrateRTMessage'); const actions = [ { id: 'no-hydrate', diff --git a/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts b/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts index 9d3a8c8b6..b6aa263d3 100644 --- a/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts +++ b/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts @@ -13,14 +13,14 @@ function promptHydrateSEG({ preHydrateCallbacks, hydrateCallback, }: withAppTypes) { - const { uiViewportDialogService } = servicesManager.services; + const { uiViewportDialogService, customizationService } = servicesManager.services; const extensionManager = servicesManager._extensionManager; const appConfig = extensionManager._appConfig; return new Promise(async function (resolve, reject) { const promptResult = appConfig?.disableConfirmationPrompts ? RESPONSE.HYDRATE_SEG - : await _askHydrate(uiViewportDialogService, viewportId); + : await _askHydrate(uiViewportDialogService, customizationService, viewportId); if (promptResult === RESPONSE.HYDRATE_SEG) { preHydrateCallbacks?.forEach(callback => { @@ -39,9 +39,13 @@ function promptHydrateSEG({ }); } -function _askHydrate(uiViewportDialogService, viewportId) { +function _askHydrate( + uiViewportDialogService: AppTypes.UIViewportDialogService, + customizationService: AppTypes.CustomizationService, + viewportId +) { return new Promise(function (resolve, reject) { - const message = 'Do you want to open this Segmentation?'; + const message = customizationService.getCustomization('viewportNotification.hydrateSEGMessage'); const actions = [ { id: 'no-hydrate', diff --git a/extensions/cornerstone/src/components/AccordionGroup/AccordionGroup.tsx b/extensions/cornerstone/src/components/AccordionGroup/AccordionGroup.tsx index 2091089a8..337614a29 100644 --- a/extensions/cornerstone/src/components/AccordionGroup/AccordionGroup.tsx +++ b/extensions/cornerstone/src/components/AccordionGroup/AccordionGroup.tsx @@ -179,7 +179,10 @@ function Trigger(props) { >
{React.cloneElement(children, childProps)} - +
); diff --git a/extensions/cornerstone/src/components/MeasurementsOrAdditionalFindings.tsx b/extensions/cornerstone/src/components/MeasurementsOrAdditionalFindings.tsx index a420dc0d3..f1fff2306 100644 --- a/extensions/cornerstone/src/components/MeasurementsOrAdditionalFindings.tsx +++ b/extensions/cornerstone/src/components/MeasurementsOrAdditionalFindings.tsx @@ -54,7 +54,7 @@ export const groupByNamedSets = (items, grouping) => { }; export function MeasurementsOrAdditionalFindings(props): React.ReactNode { - const { items, children, grouping = {}, customHeader, group } = props; + const { items, children, grouping = {}, customHeader, group, actions } = props; return ( diff --git a/extensions/cornerstone/src/components/StudyMeasurementsActions.tsx b/extensions/cornerstone/src/components/StudyMeasurementsActions.tsx index 08f151234..c3cdcbdda 100644 --- a/extensions/cornerstone/src/components/StudyMeasurementsActions.tsx +++ b/extensions/cornerstone/src/components/StudyMeasurementsActions.tsx @@ -53,6 +53,10 @@ export function StudyMeasurementsActions({ items, StudyInstanceUID, measurementF className="pl-0.5" onClick={e => { e.stopPropagation(); + if (actions?.onDelete) { + actions.onDelete(); + return; + } commandsManager.runCommand('clearMeasurements', { measurementFilter, }); diff --git a/extensions/cornerstone/src/initMeasurementService.ts b/extensions/cornerstone/src/initMeasurementService.ts index 156f1e705..f1567e5f8 100644 --- a/extensions/cornerstone/src/initMeasurementService.ts +++ b/extensions/cornerstone/src/initMeasurementService.ts @@ -7,7 +7,11 @@ import { toolNames } from './initCornerstoneTools'; import { onCompletedCalibrationLine } from './tools/CalibrationLineTool'; import measurementServiceMappingsFactory from './utils/measurementServiceMappings/measurementServiceMappingsFactory'; import getSOPInstanceAttributes from './utils/measurementServiceMappings/utils/getSOPInstanceAttributes'; -import { triggerAnnotationRenderForViewportIds } from '@cornerstonejs/tools/utilities'; +import { + setAnnotationLabel, + triggerAnnotationRenderForViewportIds, +} from '@cornerstonejs/tools/utilities'; +import getActiveViewportEnabledElement from './utils/getActiveViewportEnabledElement'; const { CORNERSTONE_3D_TOOLS_SOURCE_NAME, CORNERSTONE_3D_TOOLS_SOURCE_VERSION } = CSExtensionEnums; const { removeAnnotation } = annotation.state; @@ -190,6 +194,7 @@ const connectToolsToMeasurementService = (servicesManager: AppTypes.ServicesMana displaySetService, cornerstoneViewportService, customizationService, + viewportGridService, } = servicesManager.services; const csTools3DVer1MeasurementSource = initMeasurementService( measurementService, @@ -197,7 +202,11 @@ const connectToolsToMeasurementService = (servicesManager: AppTypes.ServicesMana cornerstoneViewportService, customizationService ); - connectMeasurementServiceToTools(measurementService, cornerstoneViewportService); + connectMeasurementServiceToTools( + measurementService, + cornerstoneViewportService, + viewportGridService + ); const { annotationToMeasurement, remove } = csTools3DVer1MeasurementSource; // @@ -323,7 +332,11 @@ const connectToolsToMeasurementService = (servicesManager: AppTypes.ServicesMana return csTools3DVer1MeasurementSource; }; -const connectMeasurementServiceToTools = (measurementService, cornerstoneViewportService) => { +const connectMeasurementServiceToTools = ( + measurementService, + cornerstoneViewportService, + viewportGridService +) => { const { MEASUREMENT_REMOVED, MEASUREMENTS_CLEARED, MEASUREMENT_UPDATED, RAW_MEASUREMENT_ADDED } = measurementService.EVENTS; @@ -366,7 +379,8 @@ const connectMeasurementServiceToTools = (measurementService, cornerstoneViewpor } if (data.label !== label) { - data.label = label; + const element = getActiveViewportEnabledElement(viewportGridService)?.viewport.element; + setAnnotationLabel(sourceAnnotation, element, label); } if (metadata.toolName === 'ArrowAnnotate') { diff --git a/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx b/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx index a885f6f8c..c8add4e50 100644 --- a/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx +++ b/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx @@ -34,8 +34,9 @@ function PanelStudyBrowser({ dataSource, customMapDisplaySets, onClickUntrack, + onDoubleClickThumbnailHandlerCallBack, }) { - const { servicesManager, commandsManager } = useSystem(); + const { servicesManager, commandsManager, extensionManager } = useSystem(); const { displaySetService, customizationService } = servicesManager.services; const navigate = useNavigate(); const studyMode = customizationService.getCustomization('studyBrowser.studyMode') || 'all'; @@ -93,6 +94,7 @@ function PanelStudyBrowser({ commandsManager, servicesManager, isHangingProtocolLayout, + appConfig: extensionManager._appConfig, }; const handlers = customHandler?.callbacks.map(callback => callback(setupArgs)); @@ -100,6 +102,7 @@ function PanelStudyBrowser({ for (const handler of handlers) { await handler(displaySetInstanceUID); } + onDoubleClickThumbnailHandlerCallBack?.(displaySetInstanceUID); }, [ activeViewportId, diff --git a/extensions/default/src/customizations/notificationCustomization.ts b/extensions/default/src/customizations/notificationCustomization.ts index 6bff2ded7..360e1d267 100644 --- a/extensions/default/src/customizations/notificationCustomization.ts +++ b/extensions/default/src/customizations/notificationCustomization.ts @@ -1,5 +1,29 @@ +import i18n from '@ohif/i18n'; import { Notification } from '@ohif/ui'; +const beginTrackingMessage = i18n.t('MeasurementTable:Track measurements for this series?'); +const trackNewSeriesMessage = i18n.t('Do you want to add this measurement to the existing report?'); +const discardSeriesMessage = i18n.t( + 'You have existing tracked measurements. What would you like to do with your existing tracked measurements?' +); +const trackNewStudyMessage = i18n.t('MeasurementTable:Track measurements for this series?'); +const discardStudyMessage = i18n.t( + 'Measurements cannot span across multiple studies. Do you want to save your tracked measurements?' +); +const hydrateSRMessage = i18n.t('Do you want to continue tracking measurements for this study?'); +const hydrateRTMessage = i18n.t('Do you want to open this Segmentation?'); +const hydrateSEGMessage = i18n.t('Do you want to open this Segmentation?'); +const discardDirtyMessage = i18n.t('There are unsaved measurements. Do you want to save it?'); + export default { 'ui.notificationComponent': Notification, + 'viewportNotification.beginTrackingMessage': beginTrackingMessage, + 'viewportNotification.trackNewSeriesMessage': trackNewSeriesMessage, + 'viewportNotification.discardSeriesMessage': discardSeriesMessage, + 'viewportNotification.trackNewStudyMessage': trackNewStudyMessage, + 'viewportNotification.discardStudyMessage': discardStudyMessage, + 'viewportNotification.hydrateSRMessage': hydrateSRMessage, + 'viewportNotification.hydrateRTMessage': hydrateRTMessage, + 'viewportNotification.hydrateSEGMessage': hydrateSEGMessage, + 'viewportNotification.discardDirtyMessage': discardDirtyMessage, }; diff --git a/extensions/default/src/utils/callInputDialog.tsx b/extensions/default/src/utils/callInputDialog.tsx index 089a911bd..65c2e41ac 100644 --- a/extensions/default/src/utils/callInputDialog.tsx +++ b/extensions/default/src/utils/callInputDialog.tsx @@ -1,4 +1,6 @@ import React from 'react'; +import { setAnnotationLabel } from '@cornerstonejs/tools/utilities'; +import { annotation } from '@cornerstonejs/tools'; import { LabellingFlow } from '@ohif/ui'; import { InputDialog } from '@ohif/ui-next'; @@ -89,6 +91,7 @@ export async function callInputDialogAutoComplete({ uiDialogService, labelConfig, renderContent = LabellingFlow, + element, }) { const exclusive = labelConfig ? labelConfig.exclusive : false; const dropDownItems = labelConfig ? labelConfig.items : []; @@ -97,7 +100,8 @@ export async function callInputDialogAutoComplete({ const labellingDoneCallback = newValue => { uiDialogService.hide('select-annotation'); if (measurement && typeof newValue === 'string') { - measurement.label = newValue; + const sourceAnnotation = annotation.state.getAnnotation(measurement.uid); + setAnnotationLabel(sourceAnnotation, element, newValue); } resolve(newValue); }; diff --git a/extensions/default/src/utils/promptSaveReport.tsx b/extensions/default/src/utils/promptSaveReport.tsx index 874d79986..22b2905fc 100644 --- a/extensions/default/src/utils/promptSaveReport.tsx +++ b/extensions/default/src/utils/promptSaveReport.tsx @@ -18,6 +18,7 @@ async function promptSaveReport({ servicesManager, commandsManager, extensionMan const isBackupSave = evt.isBackupSave === undefined ? evt.data.isBackupSave : evt.isBackupSave; const StudyInstanceUID = evt?.data?.StudyInstanceUID || ctx.trackedStudy; const SeriesInstanceUID = evt?.data?.SeriesInstanceUID; + const { displaySetInstanceUID } = evt.data ?? evt; const { trackedSeries, @@ -76,6 +77,7 @@ async function promptSaveReport({ servicesManager, commandsManager, extensionMan SeriesInstanceUID, viewportId, isBackupSave, + displaySetInstanceUID, }; } catch (error) { console.warn('Unable to save report', error); diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx index 73696fdf2..6290d3cdd 100644 --- a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx @@ -3,14 +3,19 @@ import PropTypes from 'prop-types'; import { Machine } from 'xstate'; import { useMachine } from '@xstate/react'; import { useViewportGrid } from '@ohif/ui-next'; -import { promptLabelAnnotation, promptSaveReport } from '@ohif/extension-default'; import { machineConfiguration, defaultOptions, RESPONSE } from './measurementTrackingMachine'; -import promptBeginTracking from './promptBeginTracking'; -import promptTrackNewSeries from './promptTrackNewSeries'; -import promptTrackNewStudy from './promptTrackNewStudy'; -import promptHydrateStructuredReport from './promptHydrateStructuredReport'; +import { measurementTrackingMode } from './promptBeginTracking'; import hydrateStructuredReport from './hydrateStructuredReport'; import { useAppConfig } from '@state'; +import { + promptBeginTrackingWrapper, + promptHydrateStructuredReportWrapper, + promptTrackNewSeriesWrapper, + promptTrackNewStudyWrapper, + promptLabelAnnotationWrapper, + promptSaveReportWrapper, + promptHasDirtyAnnotationsWrapper, +} from './promptWrapperFunctions'; const TrackedMeasurementsContext = React.createContext(); TrackedMeasurementsContext.displayName = 'TrackedMeasurementsContext'; @@ -35,7 +40,8 @@ function TrackedMeasurementsContextProvider( const machineOptions = Object.assign({}, defaultOptions); machineOptions.actions = Object.assign({}, machineOptions.actions, { jumpToFirstMeasurementInActiveViewport: (ctx, evt) => { - const { trackedStudy, trackedSeries, activeViewportId } = ctx; + const { trackedStudy, trackedSeries } = ctx; + const { viewportId: activeViewportId } = evt.data; const measurements = measurementService.getMeasurements(); const trackedMeasurements = measurements.filter( m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID) @@ -82,7 +88,8 @@ function TrackedMeasurementsContextProvider( }, jumpToSameImageInActiveViewport: (ctx, evt) => { - const { trackedStudy, trackedSeries, activeViewportId } = ctx; + const { trackedStudy, trackedSeries } = ctx; + const { viewportId: activeViewportId } = evt.data; const measurements = measurementService.getMeasurements(); const trackedMeasurements = measurements.filter( m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID) @@ -143,31 +150,64 @@ function TrackedMeasurementsContextProvider( for (let i = 0; i < measurementIds.length; i++) { measurementService.remove(measurementIds[i]); } + measurementService.setIsMeasurementDeletedIndividually(false); + }, + clearDisplaySetHydratedState: (ctx, evt) => { + const { displaySetInstanceUID } = evt.data ?? evt; + + const displaysets = displaySetService.getActiveDisplaySets(); + displaysets?.forEach(displayset => { + if ( + displayset.Modality === 'SR' && + displayset.displaySetInstanceUID !== displaySetInstanceUID && + displayset.isHydrated + ) { + displayset.isHydrated = false; + displayset.isLoaded = false; + } + }); + }, + updatedViewports: (ctx, evt) => { + const { hangingProtocolService } = servicesManager.services; + const { displaySetInstanceUID, viewportId } = evt.data ?? evt; + + const updatedViewports = hangingProtocolService.getViewportsRequireUpdate( + viewportId, + displaySetInstanceUID + ); + + viewportGridService.setDisplaySetsForViewports(updatedViewports); }, }); machineOptions.services = Object.assign({}, machineOptions.services, { - promptBeginTracking: promptBeginTracking.bind(null, { + promptBeginTracking: promptBeginTrackingWrapper.bind(null, { servicesManager, extensionManager, appConfig, }), - promptTrackNewSeries: promptTrackNewSeries.bind(null, { + promptTrackNewSeries: promptTrackNewSeriesWrapper.bind(null, { servicesManager, extensionManager, appConfig, }), - promptTrackNewStudy: promptTrackNewStudy.bind(null, { + promptTrackNewStudy: promptTrackNewStudyWrapper.bind(null, { servicesManager, extensionManager, appConfig, }), - promptSaveReport: promptSaveReport.bind(null, { + promptSaveReport: promptSaveReportWrapper.bind(null, { servicesManager, commandsManager, extensionManager, appConfig, }), - promptHydrateStructuredReport: promptHydrateStructuredReport.bind(null, { + promptHydrateStructuredReport: promptHydrateStructuredReportWrapper.bind(null, { + servicesManager, + extensionManager, + commandsManager, + appConfig, + }), + promptHasDirtyAnnotations: promptHasDirtyAnnotationsWrapper.bind(null, { servicesManager, extensionManager, commandsManager, @@ -179,7 +219,7 @@ function TrackedMeasurementsContextProvider( commandsManager, appConfig, }), - promptLabelAnnotation: promptLabelAnnotation.bind(null, { + promptLabelAnnotation: promptLabelAnnotationWrapper.bind(null, { servicesManager, extensionManager, commandsManager, @@ -194,6 +234,25 @@ function TrackedMeasurementsContextProvider( const labelConfig = customizationService.getCustomization('measurementLabels'); return evt.data && evt.data.userResponse === RESPONSE.NO_NEVER && labelConfig?.labelOnMeasure; }, + isSimplifiedConfig: (ctx, evt, condMeta) => { + return appConfig?.measurementTrackingMode === measurementTrackingMode.SIMPLIFIED; + }, + simplifiedAndLoadSR: (ctx, evt, condMeta) => { + return ( + appConfig?.measurementTrackingMode === measurementTrackingMode.SIMPLIFIED && + evt.data.isBackupSave === false + ); + }, + hasDirtyAndSimplified: (ctx, evt, condMeta) => { + const measurements = measurementService.getMeasurements(); + const hasDirtyMeasurements = + measurements.some(measurement => measurement.isDirty) || + (measurements.length && measurementService.getIsMeasurementDeletedIndividually()); + return ( + appConfig?.measurementTrackingMode === measurementTrackingMode.SIMPLIFIED && + hasDirtyMeasurements + ); + }, }); // TODO: IMPROVE @@ -266,7 +325,8 @@ function TrackedMeasurementsContextProvider( // load function added by our sopClassHandler module if ( displaySet.SOPClassHandlerId === SR_SOPCLASSHANDLERID && - displaySet.isRehydratable === true + displaySet.isRehydratable === true && + !displaySet.isHydrated ) { const params = { displaySetInstanceUID: displaySet.displaySetInstanceUID, diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/measurementTrackingMachine.js b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/measurementTrackingMachine.js index 9a48439ce..b84040c73 100644 --- a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/measurementTrackingMachine.js +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/measurementTrackingMachine.js @@ -122,13 +122,27 @@ const machineConfiguration = { UNTRACK_SERIES: [ { target: 'tracking', - actions: ['removeTrackedSeries', 'setIsDirty'], + actions: ['removeTrackedSeries', 'setIsDirty', 'clearDisplaySetHydratedState'], cond: 'hasRemainingTrackedSeries', }, { target: 'idle', }, ], + UNTRACK_ALL: [ + { + target: 'tracking', + actions: [ + 'clearContext', + 'setIsDirtyToClean', + 'clearDisplaySetHydratedState', + 'clearAllMeasurements', + ], + }, + { + target: 'idle', + }, + ], SET_TRACKED_SERIES: [ { target: 'tracking', @@ -146,6 +160,15 @@ const machineConfiguration = { target: 'tracking', }, ], + CHECK_DIRTY: { + target: 'promptHasDirtyAnnotations', + cond: 'hasDirtyAndSimplified', + }, + PROMPT_HYDRATE_SR: { + target: 'promptHydrateStructuredReport', + cond: 'isSimplifiedConfig', + actions: ['clearAllMeasurements', 'clearDisplaySetHydratedState'], + }, }, }, promptTrackNewSeries: { @@ -214,6 +237,16 @@ const machineConfiguration = { invoke: { src: 'promptSaveReport', onDone: [ + { + target: 'tracking', + actions: [ + 'clearAllMeasurements', + 'clearDisplaySetHydratedState', + 'setIsDirty', + 'updatedViewports', + ], + cond: 'simplifiedAndLoadSR', + }, // "clicked the save button" // - should clear all measurements // - show DICOM SR @@ -312,6 +345,28 @@ const machineConfiguration = { ], }, }, + promptHasDirtyAnnotations: { + invoke: { + src: 'promptHasDirtyAnnotations', + onDone: [ + { + target: 'tracking', + actions: [ + 'clearAllMeasurements', + 'clearDisplaySetHydratedState', + 'setIsDirty', + 'updatedViewports', + ], + cond: 'shouldSetStudyAndSeries', + }, + { + target: 'promptSaveReport', + cond: 'shouldPromptSaveReport', + }, + { target: 'tracking' }, + ], + }, + }, }, strict: true, }; diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptBeginTracking.js b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptBeginTracking.js index 2638206e6..756d642eb 100644 --- a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptBeginTracking.js +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptBeginTracking.js @@ -9,17 +9,29 @@ const RESPONSE = { SET_STUDY_AND_SERIES: 3, }; +export const measurementTrackingMode = { + STANDARD: 'standard', + SIMPLIFIED: 'simplified', + NONE: 'none', +}; + function promptBeginTracking({ servicesManager, extensionManager }, ctx, evt) { - const { uiViewportDialogService } = servicesManager.services; + const { uiViewportDialogService, customizationService } = servicesManager.services; const appConfig = extensionManager._appConfig; // When the state change happens after a promise, the state machine sends the retult in evt.data; // In case of direct transition to the state, the state machine sends the data in evt; const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt.data || evt; return new Promise(async function (resolve, reject) { - let promptResult = appConfig?.disableConfirmationPrompts - ? RESPONSE.SET_STUDY_AND_SERIES - : await _askTrackMeasurements(uiViewportDialogService, viewportId); + const standardMode = appConfig?.measurementTrackingMode === measurementTrackingMode.STANDARD; + const noTrackingMode = appConfig?.measurementTrackingMode === measurementTrackingMode.NONE; + let promptResult; + + promptResult = noTrackingMode + ? RESPONSE.NO_NEVER + : standardMode + ? await _askTrackMeasurements(uiViewportDialogService, customizationService, viewportId) + : RESPONSE.SET_STUDY_AND_SERIES; resolve({ userResponse: promptResult, @@ -30,9 +42,11 @@ function promptBeginTracking({ servicesManager, extensionManager }, ctx, evt) { }); } -function _askTrackMeasurements(uiViewportDialogService, viewportId) { +function _askTrackMeasurements(uiViewportDialogService, customizationService, viewportId) { return new Promise(function (resolve, reject) { - const message = i18n.t('MeasurementTable:Track measurements for this series?'); + const message = customizationService.getCustomization( + 'viewportNotification.beginTrackingMessage' + ); const actions = [ { id: 'prompt-begin-tracking-cancel', diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHasDirtyAnnotations.ts b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHasDirtyAnnotations.ts new file mode 100644 index 000000000..7f4a3acc5 --- /dev/null +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHasDirtyAnnotations.ts @@ -0,0 +1,81 @@ +const RESPONSE = { + NO_NEVER: -1, + CANCEL: 0, + CREATE_REPORT: 1, + ADD_SERIES: 2, + SET_STUDY_AND_SERIES: 3, + NO_NOT_FOR_SERIES: 4, +}; + +function promptHasDirtyAnnotations({ servicesManager }: withAppTypes, ctx, evt) { + const { viewportId, displaySetInstanceUID } = evt.data || evt; + + return new Promise(async function (resolve, reject) { + const { uiViewportDialogService, customizationService } = servicesManager.services; + + const promptResult = await _askSaveDiscardOrCancel( + uiViewportDialogService, + customizationService, + viewportId + ); + + resolve({ + displaySetInstanceUID, + userResponse: promptResult, + viewportId, + isBackupSave: false, + }); + }); +} + +function _askSaveDiscardOrCancel( + UIViewportDialogService: AppTypes.UIViewportDialogService, + customizationService: AppTypes.CustomizationService, + viewportId +) { + return new Promise(function (resolve, reject) { + const message = customizationService.getCustomization( + 'viewportNotification.discardDirtyMessage' + ); + const actions = [ + { id: 'cancel', type: 'cancel', text: 'Cancel', value: RESPONSE.CANCEL }, + { + id: 'discard-existing', + type: 'secondary', + text: 'No, discard existing', + value: RESPONSE.SET_STUDY_AND_SERIES, + }, + { + id: 'save-existing', + type: 'primary', + text: 'Yes', + value: RESPONSE.CREATE_REPORT, + }, + ]; + const onSubmit = result => { + UIViewportDialogService.hide(); + resolve(result); + }; + + UIViewportDialogService.show({ + viewportId, + id: 'measurement-tracking-prompt-dirty-measurement', + type: 'info', + message, + actions, + onSubmit, + onOutsideClick: () => { + UIViewportDialogService.hide(); + resolve(RESPONSE.CANCEL); + }, + onKeyPress: event => { + if (event.key === 'Enter') { + const action = actions.find(action => action.id === 'save-existing'); + onSubmit(action.value); + } + }, + }); + }); +} + +export default promptHasDirtyAnnotations; diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js index 4fd6640f7..0c1ea2602 100644 --- a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js @@ -1,5 +1,6 @@ import { hydrateStructuredReport } from '@ohif/extension-cornerstone-dicom-sr'; import { ButtonEnums } from '@ohif/ui'; +import { measurementTrackingMode } from './promptBeginTracking'; const RESPONSE = { NO_NEVER: -1, @@ -16,13 +17,16 @@ function promptHydrateStructuredReport( ctx, evt ) { - const { uiViewportDialogService, displaySetService } = servicesManager.services; + const { uiViewportDialogService, displaySetService, customizationService } = + servicesManager.services; const { viewportId, displaySetInstanceUID } = evt; const srDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); return new Promise(async function (resolve, reject) { - const promptResult = appConfig?.disableConfirmationPrompts - ? RESPONSE.HYDRATE_REPORT - : await _askTrackMeasurements(uiViewportDialogService, viewportId); + const standardMode = appConfig?.measurementTrackingMode === measurementTrackingMode.STANDARD; + + const promptResult = standardMode + ? await _askTrackMeasurements(uiViewportDialogService, customizationService, viewportId) + : RESPONSE.HYDRATE_REPORT; // Need to do action here... So we can set state... let StudyInstanceUID, SeriesInstanceUIDs; @@ -49,9 +53,9 @@ function promptHydrateStructuredReport( }); } -function _askTrackMeasurements(uiViewportDialogService, viewportId) { +function _askTrackMeasurements(uiViewportDialogService, customizationService, viewportId) { return new Promise(function (resolve, reject) { - const message = 'Do you want to continue tracking measurements for this study?'; + const message = customizationService.getCustomization('viewportNotification.hydrateSRMessage'); const actions = [ { id: 'no-hydrate', diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewSeries.js b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewSeries.js index d5e5575c5..1a430549d 100644 --- a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewSeries.js +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewSeries.js @@ -1,4 +1,5 @@ import { ButtonEnums } from '@ohif/ui'; +import { measurementTrackingMode } from './promptBeginTracking'; const RESPONSE = { NO_NEVER: -1, @@ -10,17 +11,22 @@ const RESPONSE = { }; function promptTrackNewSeries({ servicesManager, extensionManager }, ctx, evt) { - const { UIViewportDialogService } = servicesManager.services; + const { UIViewportDialogService, customizationService } = servicesManager.services; // When the state change happens after a promise, the state machine sends the retult in evt.data; // In case of direct transition to the state, the state machine sends the data in evt; const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt.data || evt; return new Promise(async function (resolve, reject) { - let promptResult = await _askShouldAddMeasurements(UIViewportDialogService, viewportId); + const appConfig = extensionManager._appConfig; + + const showPrompt = appConfig?.measurementTrackingMode === measurementTrackingMode.STANDARD; + let promptResult = showPrompt + ? await _askShouldAddMeasurements(UIViewportDialogService, customizationService, viewportId) + : RESPONSE.ADD_SERIES; if (promptResult === RESPONSE.CREATE_REPORT) { promptResult = ctx.isDirty - ? await _askSaveDiscardOrCancel(UIViewportDialogService, viewportId) + ? await _askSaveDiscardOrCancel(UIViewportDialogService, customizationService, viewportId) : RESPONSE.SET_STUDY_AND_SERIES; } @@ -34,9 +40,11 @@ function promptTrackNewSeries({ servicesManager, extensionManager }, ctx, evt) { }); } -function _askShouldAddMeasurements(uiViewportDialogService, viewportId) { +function _askShouldAddMeasurements(uiViewportDialogService, customizationService, viewportId) { return new Promise(function (resolve, reject) { - const message = 'Do you want to add this measurement to the existing report?'; + const message = customizationService.getCustomization( + 'viewportNotification.trackNewSeriesMessage' + ); const actions = [ { type: ButtonEnums.type.secondary, @@ -73,10 +81,12 @@ function _askShouldAddMeasurements(uiViewportDialogService, viewportId) { }); } -function _askSaveDiscardOrCancel(UIViewportDialogService, viewportId) { +function _askSaveDiscardOrCancel(UIViewportDialogService, customizationService, viewportId) { return new Promise(function (resolve, reject) { - const message = - 'You have existing tracked measurements. What would you like to do with your existing tracked measurements?'; + const message = customizationService.getCustomization( + 'viewportNotification.discardSeriesMessage' + ); + const actions = [ { type: 'cancel', text: 'Cancel', value: RESPONSE.CANCEL }, { diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewStudy.ts b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewStudy.ts index 1ce586999..954d9146a 100644 --- a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewStudy.ts +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewStudy.ts @@ -1,4 +1,5 @@ import i18n from 'i18next'; +import { measurementTrackingMode } from './promptBeginTracking'; const RESPONSE = { NO_NEVER: -1, @@ -10,18 +11,26 @@ const RESPONSE = { }; function promptTrackNewStudy({ servicesManager, extensionManager }: withAppTypes, ctx, evt) { - const { uiViewportDialogService } = servicesManager.services; + const { uiViewportDialogService, customizationService } = servicesManager.services; // When the state change happens after a promise, the state machine sends the retult in evt.data; // In case of direct transition to the state, the state machine sends the data in evt; const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt.data || evt; return new Promise(async function (resolve, reject) { - let promptResult = await _askTrackMeasurements(uiViewportDialogService, viewportId); + const appConfig = extensionManager._appConfig; + + const standardMode = appConfig?.measurementTrackingMode === measurementTrackingMode.STANDARD; + const simplifiedMode = + appConfig?.measurementTrackingMode === measurementTrackingMode.SIMPLIFIED; + let promptResult = standardMode + ? await _askTrackMeasurements(uiViewportDialogService, customizationService, viewportId) + : RESPONSE.SET_STUDY_AND_SERIES; if (promptResult === RESPONSE.SET_STUDY_AND_SERIES) { - promptResult = ctx.isDirty - ? await _askSaveDiscardOrCancel(uiViewportDialogService, viewportId) - : RESPONSE.SET_STUDY_AND_SERIES; + promptResult = + ctx.isDirty && (standardMode || simplifiedMode) + ? await _askSaveDiscardOrCancel(uiViewportDialogService, customizationService, viewportId) + : RESPONSE.SET_STUDY_AND_SERIES; } resolve({ @@ -36,10 +45,13 @@ function promptTrackNewStudy({ servicesManager, extensionManager }: withAppTypes function _askTrackMeasurements( UIViewportDialogService: AppTypes.UIViewportDialogService, + customizationService: AppTypes.CustomizationService, viewportId ) { return new Promise(function (resolve, reject) { - const message = i18n.t('MeasurementTable:Track measurements for this series?'); + const message = customizationService.getCustomization( + 'viewportNotification.trackNewStudyMessage' + ); const actions = [ { type: 'cancel', text: i18n.t('MeasurementTable:No'), value: RESPONSE.CANCEL }, { @@ -80,11 +92,13 @@ function _askTrackMeasurements( function _askSaveDiscardOrCancel( UIViewportDialogService: AppTypes.UIViewportDialogService, + customizationService: AppTypes.CustomizationService, viewportId ) { return new Promise(function (resolve, reject) { - const message = - 'Measurements cannot span across multiple studies. Do you want to save your tracked measurements?'; + const message = customizationService.getCustomization( + 'viewportNotification.discardStudyMessage' + ); const actions = [ { type: 'cancel', text: 'Cancel', value: RESPONSE.CANCEL }, { diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptWrapperFunctions.ts b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptWrapperFunctions.ts new file mode 100644 index 000000000..47682772d --- /dev/null +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptWrapperFunctions.ts @@ -0,0 +1,83 @@ +const promptBeginTrackingWrapper = ({ servicesManager, extensionManager }, ctx, evt) => { + const { customizationService } = servicesManager.services; + const promptBeginTracking = customizationService.getCustomization( + 'measurement.promptBeginTracking' + ); + return promptBeginTracking({ servicesManager, extensionManager }, ctx, evt); +}; + +const promptHydrateStructuredReportWrapper = ( + { servicesManager, extensionManager, commandsManager, appConfig }, + ctx, + evt +) => { + const { customizationService } = servicesManager.services; + const promptHydrateStructuredReport = customizationService.getCustomization( + 'measurement.promptHydrateStructuredReport' + ); + return promptHydrateStructuredReport( + { servicesManager, extensionManager, commandsManager, appConfig }, + ctx, + evt + ); +}; + +const promptTrackNewSeriesWrapper = ({ servicesManager, extensionManager }, ctx, evt) => { + const { customizationService } = servicesManager.services; + const promptTrackNewSeries = customizationService.getCustomization( + 'measurement.promptTrackNewSeries' + ); + return promptTrackNewSeries({ servicesManager, extensionManager }, ctx, evt); +}; + +const promptTrackNewStudyWrapper = ({ servicesManager, extensionManager }, ctx, evt) => { + const { customizationService } = servicesManager.services; + const promptTrackNewStudy = customizationService.getCustomization( + 'measurement.promptTrackNewStudy' + ); + return promptTrackNewStudy({ servicesManager, extensionManager }, ctx, evt); +}; + +const promptLabelAnnotationWrapper = ({ servicesManager }, ctx, evt) => { + const { customizationService } = servicesManager.services; + const promptLabelAnnotation = customizationService.getCustomization( + 'measurement.promptLabelAnnotation' + ); + return promptLabelAnnotation({ servicesManager }, ctx, evt); +}; + +const promptSaveReportWrapper = ( + { servicesManager, commandsManager, extensionManager }, + ctx, + evt +) => { + const { customizationService } = servicesManager.services; + const promptSaveReport = customizationService.getCustomization('measurement.promptSaveReport'); + return promptSaveReport({ servicesManager, commandsManager, extensionManager }, ctx, evt); +}; + +const promptHasDirtyAnnotationsWrapper = ( + { servicesManager, commandsManager, extensionManager }, + ctx, + evt +) => { + const { customizationService } = servicesManager.services; + const promptHasDirtyAnnotations = customizationService.getCustomization( + 'measurement.promptHasDirtyAnnotations' + ); + return promptHasDirtyAnnotations( + { servicesManager, commandsManager, extensionManager }, + ctx, + evt + ); +}; + +export { + promptBeginTrackingWrapper, + promptHydrateStructuredReportWrapper, + promptTrackNewSeriesWrapper, + promptTrackNewStudyWrapper, + promptLabelAnnotationWrapper, + promptSaveReportWrapper, + promptHasDirtyAnnotationsWrapper, +}; diff --git a/extensions/measurement-tracking/src/customizations/measurementTrackingPrompts.tsx b/extensions/measurement-tracking/src/customizations/measurementTrackingPrompts.tsx new file mode 100644 index 000000000..25d780ddf --- /dev/null +++ b/extensions/measurement-tracking/src/customizations/measurementTrackingPrompts.tsx @@ -0,0 +1,16 @@ +import promptBeginTracking from '../contexts/TrackedMeasurementsContext/promptBeginTracking'; +import promptHasDirtyAnnotations from '../contexts/TrackedMeasurementsContext/promptHasDirtyAnnotations'; +import promptHydrateStructuredReport from '../contexts/TrackedMeasurementsContext/promptHydrateStructuredReport'; +import promptTrackNewSeries from '../contexts/TrackedMeasurementsContext/promptTrackNewSeries'; +import promptTrackNewStudy from '../contexts/TrackedMeasurementsContext/promptTrackNewStudy'; +import { promptLabelAnnotation, promptSaveReport } from '@ohif/extension-default'; + +export default { + 'measurement.promptBeginTracking': promptBeginTracking, + 'measurement.promptHydrateStructuredReport': promptHydrateStructuredReport, + 'measurement.promptTrackNewSeries': promptTrackNewSeries, + 'measurement.promptTrackNewStudy': promptTrackNewStudy, + 'measurement.promptLabelAnnotation': promptLabelAnnotation, + 'measurement.promptSaveReport': promptSaveReport, + 'measurement.promptHasDirtyAnnotations': promptHasDirtyAnnotations, +}; diff --git a/extensions/measurement-tracking/src/customizations/studyBrowserCustomization.ts b/extensions/measurement-tracking/src/customizations/studyBrowserCustomization.ts new file mode 100644 index 000000000..f0da10982 --- /dev/null +++ b/extensions/measurement-tracking/src/customizations/studyBrowserCustomization.ts @@ -0,0 +1,64 @@ +import { measurementTrackingMode } from '../contexts/TrackedMeasurementsContext/promptBeginTracking'; + +type CheckHasDirtyAndSimplifiedModeProps = { + servicesManager: AppTypes.ServicesManager; + appConfig: AppTypes.Config; + displaySetInstanceUID: string; +}; + +const onDoubleClickHandler = { + callbacks: [ + ({ activeViewportId, servicesManager, isHangingProtocolLayout, appConfig }) => + async displaySetInstanceUID => { + const { hangingProtocolService, viewportGridService, uiNotificationService } = + servicesManager.services; + let updatedViewports = []; + const viewportId = activeViewportId; + const haveDirtyMeasurementsInSimplifiedMode = checkHasDirtyAndSimplifiedMode({ + servicesManager, + appConfig, + displaySetInstanceUID, + }); + + try { + if (!haveDirtyMeasurementsInSimplifiedMode) { + updatedViewports = hangingProtocolService.getViewportsRequireUpdate( + viewportId, + displaySetInstanceUID, + isHangingProtocolLayout + ); + viewportGridService.setDisplaySetsForViewports(updatedViewports); + } + } catch (error) { + console.warn(error); + uiNotificationService.show({ + title: 'Thumbnail Double Click', + message: 'The selected display sets could not be added to the viewport.', + type: 'error', + duration: 3000, + }); + } + }, + ], +}; + +const customOnDropHandlerCallback = async props => { + const handled = checkHasDirtyAndSimplifiedMode(props); + return Promise.resolve({ handled }); +}; + +const checkHasDirtyAndSimplifiedMode = (props: CheckHasDirtyAndSimplifiedModeProps) => { + const { servicesManager, appConfig, displaySetInstanceUID } = props; + const simplifiedMode = appConfig.measurementTrackingMode === measurementTrackingMode.SIMPLIFIED; + const { measurementService, displaySetService } = servicesManager.services; + const measurements = measurementService.getMeasurements(); + const haveDirtyMeasurements = + measurements.some(m => m.isDirty) || + (measurements.length && measurementService.getIsMeasurementDeletedIndividually()); + const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); + const hasDirtyAndSimplifiedMode = + displaySet.Modality === 'SR' && simplifiedMode && haveDirtyMeasurements; + return hasDirtyAndSimplifiedMode; +}; + +export { onDoubleClickHandler, customOnDropHandlerCallback }; diff --git a/extensions/measurement-tracking/src/getCustomizationModule.ts b/extensions/measurement-tracking/src/getCustomizationModule.ts new file mode 100644 index 000000000..d2bd35775 --- /dev/null +++ b/extensions/measurement-tracking/src/getCustomizationModule.ts @@ -0,0 +1,10 @@ +import measurementTrackingPrompts from './customizations/measurementTrackingPrompts'; + +export default function getCustomizationModule() { + return [ + { + name: 'default', + value: { ...measurementTrackingPrompts }, + }, + ]; +} diff --git a/extensions/measurement-tracking/src/index.tsx b/extensions/measurement-tracking/src/index.tsx index 3cced774b..7f87c7519 100644 --- a/extensions/measurement-tracking/src/index.tsx +++ b/extensions/measurement-tracking/src/index.tsx @@ -6,6 +6,12 @@ import getViewportModule from './getViewportModule'; import { id } from './id.js'; import { ViewportActionButton } from '@ohif/ui'; import i18n from '@ohif/i18n'; +import { measurementTrackingMode } from './contexts/TrackedMeasurementsContext/promptBeginTracking'; +import getCustomizationModule from './getCustomizationModule'; +import { + onDoubleClickHandler, + customOnDropHandlerCallback, +} from './customizations/studyBrowserCustomization'; const measurementTrackingExtension = { /** @@ -18,8 +24,15 @@ const measurementTrackingExtension = { getViewportModule, onModeEnter({ servicesManager }) { - const { toolbarService } = servicesManager.services; - + const { toolbarService, customizationService } = servicesManager.services; + customizationService.setCustomizations({ + 'studyBrowser.thumbnailDoubleClickCallback': { + $set: onDoubleClickHandler, + }, + customOnDropHandler: { + $set: customOnDropHandlerCallback, + }, + }); toolbarService.addButtons( [ { @@ -38,6 +51,9 @@ const measurementTrackingExtension = { true // replace the button if it is already defined ); }, + getCustomizationModule, }; export default measurementTrackingExtension; + +export { measurementTrackingMode }; diff --git a/extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx b/extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx index 900c528f7..956e6a37b 100644 --- a/extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx +++ b/extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { Dialog, ButtonEnums } from '@ohif/ui'; import { utils } from '@ohif/core'; import { AccordionTrigger, MeasurementTable, useViewportGrid } from '@ohif/ui-next'; import { @@ -11,18 +12,40 @@ import { } from '@ohif/extension-cornerstone'; import { useTrackedMeasurements } from '../getContextModule'; +import { UntrackSeriesModal } from './PanelStudyBrowserTracking/untrackSeriesModal'; const { filterAnd, filterPlanarMeasurement, filterMeasurementsBySeriesUID } = utils.MeasurementFilters; function PanelMeasurementTableTracking(props) { const [viewportGrid] = useViewportGrid(); + const { measurementService, uiModalService } = props.servicesManager.services; const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements(); const { trackedStudy, trackedSeries } = trackedMeasurements.context; const measurementFilter = trackedStudy ? filterAnd(filterPlanarMeasurement, filterMeasurementsBySeriesUID(trackedSeries)) : filterPlanarMeasurement; + const onUntrackConfirm = () => { + sendTrackedMeasurementsEvent('UNTRACK_ALL', {}); + }; + + const onDelete = () => { + const hasDirtyMeasurements = measurementService + .getMeasurements() + .some(measurement => measurement.isDirty); + hasDirtyMeasurements + ? uiModalService.show({ + title: 'Untrack Study', + content: UntrackSeriesModal, + contentProps: { + onConfirm: onUntrackConfirm, + message: 'Are you sure you want to untrack study and delete all measurements?', + }, + }) + : onUntrackConfirm(); + }; + const EmptyComponent = () => (
( @@ -51,7 +75,10 @@ function PanelMeasurementTableTracking(props) { className="px-0" >
- +
); @@ -68,7 +95,7 @@ function PanelMeasurementTableTracking(props) { key="trackingMeasurementsHeader" asChild={true} > -
+
{ + const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); + if (displaySet.Modality === 'SR') { + const activeViewportId = viewportGridService.getActiveViewportId(); + sendTrackedMeasurementsEvent('CHECK_DIRTY', { + viewportId: activeViewportId, + displaySetInstanceUID: displaySetInstanceUID, + }); + } + }; + + useEffect(() => { + const subscriptionOndropFired = viewportGridService.subscribe( + viewportGridService.EVENTS.VIEWPORT_ONDROP_HANDLED, + ({ eventData }) => { + checkDirtyMeasurements(eventData.displaySetInstanceUID); + } + ); + + return () => { + subscriptionOndropFired.unsubscribe(); + }; + }, []); const onClickUntrack = displaySetInstanceUID => { const onConfirm = () => { const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); @@ -50,6 +75,7 @@ export default function PanelStudyBrowserTracking({ content: UntrackSeriesModal, contentProps: { onConfirm, + message: 'Are you sure you want to untrack this series?', }, }); }; @@ -115,6 +141,7 @@ export default function PanelStudyBrowserTracking({ dataSource={dataSource} customMapDisplaySets={mapDisplaySetsWithTracking} onClickUntrack={onClickUntrack} + onDoubleClickThumbnailHandlerCallBack={checkDirtyMeasurements} /> ); } diff --git a/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/untrackSeriesModal.tsx b/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/untrackSeriesModal.tsx index 5b7091c84..bb7d1ccb2 100644 --- a/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/untrackSeriesModal.tsx +++ b/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/untrackSeriesModal.tsx @@ -1,11 +1,11 @@ import React from 'react'; import { FooterAction } from '@ohif/ui-next'; -export function UntrackSeriesModal({ hide, onConfirm }) { +export function UntrackSeriesModal({ hide, onConfirm, message }) { return (
-

Are you sure you want to untrack this series?

+

{message}

This action cannot be undone and will delete all your existing measurements.

diff --git a/platform/app/src/appInit.js b/platform/app/src/appInit.js index db1c54498..b4e510ccc 100644 --- a/platform/app/src/appInit.js +++ b/platform/app/src/appInit.js @@ -47,6 +47,7 @@ async function appInit(appConfigOrFunc, defaultExtensions, defaultModes) { }; // Default the peer import function appConfig.peerImport ||= peerImport; + appConfig.measurementTrackingMode ||= 'standard'; const extensionManager = new ExtensionManager({ commandsManager, diff --git a/platform/app/src/components/ViewportGrid.tsx b/platform/app/src/components/ViewportGrid.tsx index e595a4fe0..0c4561af0 100644 --- a/platform/app/src/components/ViewportGrid.tsx +++ b/platform/app/src/components/ViewportGrid.tsx @@ -257,6 +257,7 @@ function ViewerViewportGrid(props: withAppTypes) { }, [viewports, _getUpdatedViewports]); const onDropHandler = (viewportId, { displaySetInstanceUID }) => { + const { viewportGridService } = servicesManager.services; const customOnDropHandler = customizationService.getCustomization('customOnDropHandler'); const dropHandlerPromise = customOnDropHandler({ ...props, @@ -264,13 +265,13 @@ function ViewerViewportGrid(props: withAppTypes) { displaySetInstanceUID, appConfig, }); - dropHandlerPromise.then(({ handled }) => { if (!handled) { const updatedViewports = _getUpdatedViewports(viewportId, displaySetInstanceUID); viewportGridService.setDisplaySetsForViewports(updatedViewports); } }); + viewportGridService.publishViewportOnDropHandled({ displaySetInstanceUID }); }; // Store previous isReferenceViewable values to avoid infinite loops diff --git a/platform/core/src/services/MeasurementService/MeasurementService.ts b/platform/core/src/services/MeasurementService/MeasurementService.ts index 81d39148b..1683bbba5 100644 --- a/platform/core/src/services/MeasurementService/MeasurementService.ts +++ b/platform/core/src/services/MeasurementService/MeasurementService.ts @@ -64,6 +64,7 @@ const MEASUREMENT_SCHEMA_KEYS = [ 'isSelected', 'textBox', 'referencedImageId', + 'isDirty', ]; const EVENTS = { @@ -92,6 +93,11 @@ const VALUE_TYPES = { ROI_THRESHOLD_MANUAL: 'value_type::roiThresholdManual', }; +enum MeasurementChangeType { + HandlesUpdated = 'HandlesUpdated', + LabelChange = 'LabelChange', +} + export type MeasurementFilter = (measurement) => boolean; /** @@ -121,6 +127,7 @@ class MeasurementService extends PubSubService { private measurements = new Map(); private unmappedMeasurements = new Map(); + private isMeasurementDeletedIndividually: boolean; private sources = {}; private mappings = {}; @@ -543,6 +550,11 @@ class MeasurementService extends PubSubService { uid: internalUID, }; + newMeasurement.isDirty = + sourceAnnotationDetail.changeType === MeasurementChangeType.HandlesUpdated || + sourceAnnotationDetail.changeType === MeasurementChangeType.LabelChange || + oldMeasurement?.isDirty; + if (oldMeasurement) { // TODO: Ultimately, each annotation should have a selected flag right from the source. // For now, it is just added in OHIF here and in setMeasurementSelected. @@ -586,6 +598,7 @@ class MeasurementService extends PubSubService { this.unmappedMeasurements.delete(measurementUID); this.measurements.delete(measurementUID); + this.isMeasurementDeletedIndividually = true; this._broadcastEvent(this.EVENTS.MEASUREMENT_REMOVED, { source, measurement: measurementUID, @@ -839,6 +852,14 @@ class MeasurementService extends PubSubService { notYetUpdatedAtSource: true, }); } + + public setIsMeasurementDeletedIndividually = isDeletedIndividually => { + this.isMeasurementDeletedIndividually = isDeletedIndividually; + }; + + public getIsMeasurementDeletedIndividually = () => { + return this.isMeasurementDeletedIndividually; + }; } export default MeasurementService; diff --git a/platform/core/src/services/ViewportGridService/ViewportGridService.ts b/platform/core/src/services/ViewportGridService/ViewportGridService.ts index ee828b74a..f39fec02b 100644 --- a/platform/core/src/services/ViewportGridService/ViewportGridService.ts +++ b/platform/core/src/services/ViewportGridService/ViewportGridService.ts @@ -7,6 +7,7 @@ class ViewportGridService extends PubSubService { GRID_STATE_CHANGED: 'event::gridStateChanged', GRID_SIZE_CHANGED: 'event::gridSizeChanged', VIEWPORTS_READY: 'event::viewportsReady', + VIEWPORT_ONDROP_HANDLED: 'event::viewportOnDropHandled', }; public static REGISTRATION = { @@ -141,6 +142,10 @@ class ViewportGridService extends PubSubService { this._broadcastEvent(this.EVENTS.VIEWPORTS_READY, {}); } + public publishViewportOnDropHandled(eventData) { + this._broadcastEvent(this.EVENTS.VIEWPORT_ONDROP_HANDLED, { eventData }); + } + public setActiveViewportId(id: string) { if (id === this.getActiveViewportId()) { return; diff --git a/platform/core/src/types/AppTypes.ts b/platform/core/src/types/AppTypes.ts index 826e5de13..16125b04c 100644 --- a/platform/core/src/types/AppTypes.ts +++ b/platform/core/src/types/AppTypes.ts @@ -114,6 +114,7 @@ declare global { days?: number; }; groupEnabledModesFirst?: boolean; + measurementTrackingMode?: 'standard' | 'simplified' | 'none'; disableConfirmationPrompts?: boolean; showPatientInfo?: 'visible' | 'visibleCollapsed' | 'disabled' | 'visibleReadOnly'; requestTransferSyntaxUID?: string; diff --git a/platform/docs/docs/assets/img/promptAddSeriesContent.png b/platform/docs/docs/assets/img/promptAddSeriesContent.png new file mode 100644 index 0000000000000000000000000000000000000000..53c72116045055b138694c66370f5fa663a4c012 GIT binary patch literal 17259 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 C_6!mL literal 0 HcmV?d00001 diff --git a/platform/docs/docs/assets/img/promptBeginTrackingContent.png b/platform/docs/docs/assets/img/promptBeginTrackingContent.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a2aa2613f84b95ed2abe2afa15e2ef3ac74b6e GIT binary patch literal 11921 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 CJW)*m literal 0 HcmV?d00001 diff --git a/platform/docs/docs/assets/img/promptDiscardDirtyContent.png b/platform/docs/docs/assets/img/promptDiscardDirtyContent.png new file mode 100644 index 0000000000000000000000000000000000000000..aedd30e3eafe22ccc6f626d81f2143405bbef75a GIT binary patch literal 14837 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 W^3k`5U!|KY`r0OUtL{8}_WuCWR=bV> literal 0 HcmV?d00001 diff --git a/platform/docs/docs/assets/img/promptDiscardSeriesContent.png b/platform/docs/docs/assets/img/promptDiscardSeriesContent.png new file mode 100644 index 0000000000000000000000000000000000000000..cad7134350e7164c5212dd0e5215e0fb7969b6f4 GIT binary patch literal 16334 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 ZE&eDed+V!*uEEE6p`b2bA!{1=e*n_*D8>K) literal 0 HcmV?d00001 diff --git a/platform/docs/docs/assets/img/promptDiscardStudyContent.png b/platform/docs/docs/assets/img/promptDiscardStudyContent.png new file mode 100644 index 0000000000000000000000000000000000000000..7cbafd216e74d412e103dc9ba94e7a85ffa7e78c GIT binary patch literal 23596 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⋘51W8wpc#nWGpt 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 literal 0 HcmV?d00001 diff --git a/platform/docs/docs/assets/img/promptTrackStudyContent.png b/platform/docs/docs/assets/img/promptTrackStudyContent.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a2aa2613f84b95ed2abe2afa15e2ef3ac74b6e GIT binary patch literal 11921 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 CJW)*m literal 0 HcmV?d00001 diff --git a/platform/docs/docs/assets/img/promptsegmentationContent.png b/platform/docs/docs/assets/img/promptsegmentationContent.png new file mode 100644 index 0000000000000000000000000000000000000000..0091b988bd9a271d042594a9568d4cfdecbb2e5e GIT binary patch literal 11259 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 K4{_J#<^KZIW_4Ns literal 0 HcmV?d00001 diff --git a/platform/docs/docs/configuration/configurationFiles.md b/platform/docs/docs/configuration/configurationFiles.md index d3289dbb0..be6829c74 100644 --- a/platform/docs/docs/configuration/configurationFiles.md +++ b/platform/docs/docs/configuration/configurationFiles.md @@ -125,7 +125,7 @@ Here are a list of some options available: - `investigationalUseDialog`: This should contain an object with `option` value, it can be either `always` which always shows the dialog once per session, `never` which never shows the dialog, or `configure` which shows the dialog once and won't show it again until a set number of days defined by the user, if it's set to configure, you are required to add an additional property `days` which is the number of days to wait before showing the dialog again. - `groupEnabledModesFirst`: boolean, if set to true, all valid modes for the study get grouped together first, then the rest of the modes. If false, all modes are shown in the order they are defined in the configuration. - `experimentalStudyBrowserSort`: boolean, if set to true, you will get the experimental StudyBrowserSort component in the UI, which displays a list of sort functions that the displaySets can be sorted by, the sort reflects in all part of the app including the thumbnail/study panel. These sort functions are defined in the customizationModule and can be expanded by users. -- `disableConfirmationPrompts`: boolean, if set to true, it skips confirmation prompts for measurement tracking and hydration. +- `disableConfirmationPrompts`: boolean, if set to true, it skips confirmation prompts for segmentation related prompts. - `showPatientInfo`: string, if set to 'visible', the patient info header will be shown and its initial state is expanded. If set to 'visibleCollapsed', the patient info header will be shown but it's initial state is collapsed. If set to 'disabled', the patient info header will never be shown, and if set to 'visibleReadOnly', the patient info header will be shown and always expanded. - `requestTransferSyntaxUID` : Request a specific Transfer syntax from dicom web server ex: 1.2.840.10008.1.2.4.80 (applied only if acceptHeader is not set) - `omitQuotationForMultipartRequest`: Some servers (e.g., .NET) require the `multipart/related` request to be sent without quotation marks. Defaults to `false`. If your server doesn't require this, then setting this flag to `true` might improve performance (by removing the need for preflight requests). Also note that diff --git a/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx b/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx index 6a8cefe73..a7dd8c8a5 100644 --- a/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx +++ b/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx @@ -27,6 +27,15 @@ import windowLevelActionMenu from '../../../assets/img/windowLevelActionMenu.png import viewPortNotificationImage from '../../../assets/img/viewport-notification.png'; import captureViewportModal from '../../../assets/img/captureViewportModal.png'; import aboutModal from '../../../assets/img/aboutModal.png'; +import promptBeginTrackingContent from '../../../assets/img/promptBeginTrackingContent.png'; +import promptAddSeriesContent from '../../../assets/img/promptAddSeriesContent.png'; +import promptSRTrackingContent from '../../../assets/img/promptSRTrackingContent.png'; +import promptsegmentationContent from '../../../assets/img/promptsegmentationContent.png'; +import promptRtstructContent from '../../../assets/img/promptRtstructContent.png'; +import promptDiscardStudyContent from '../../../assets/img/promptDiscardStudyContent.png'; +import promptDiscardSeriesContent from '../../../assets/img/promptDiscardSeriesContent.png'; +import promptDiscardDirtyContent from '../../../assets/img/promptDiscardDirtyContent.png'; +import promptTrackStudyContent from '../../../assets/img/promptTrackStudyContent.png'; export const viewportOverlayCustomizations = [ { @@ -952,6 +961,296 @@ window.config = { }; `, }, + { + id: 'viewportNotification.beginTrackingMessage', + description: 'Define the content to be displayed in begin tracking prompt', + default: 'Track measurements for this series?', + image: [promptBeginTrackingContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.beginTrackingMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'viewportNotification.trackNewSeriesMessage', + description: 'Define the content to be displayed in track new series prompt', + default: 'Do you want to add this measurement to the existing report?', + image: [promptAddSeriesContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.trackNewSeriesMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'viewportNotification.discardSeriesMessage', + description: 'Define the content to be displayed in discard series prompt', + default: + 'You have existing tracked measurements. What would you like to do with your existing tracked measurements?', + image: [promptDiscardSeriesContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.discardSeriesMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'viewportNotification.trackNewStudyMessage', + description: 'Define the content to be displayed in track new study prompt', + default: 'Track measurements for this series?', + image: [promptTrackStudyContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.trackNewStudyMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'viewportNotification.discardStudyMessage', + description: 'Define the content to be displayed in discard study prompt', + default: + 'Measurements cannot span across multiple studies. Do you want to save your tracked measurements?', + image: [promptDiscardStudyContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.discardStudyMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'viewportNotification.hydrateSRMessage', + description: 'Define the content to be displayed in hydrate SR prompt', + default: 'Do you want to continue tracking measurements for this study?', + image: [promptSRTrackingContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.hydrateSRMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'viewportNotification.hydrateRTMessage', + description: 'Define the content to be displayed in hydrate RT prompt', + default: 'Do you want to open this Segmentation?', + image: [promptRtstructContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.hydrateRTMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'viewportNotification.hydrateSEGMessage', + description: 'Define the content to be displayed in hydrate SEG prompt', + default: 'Do you want to open this Segmentation?', + image: [promptsegmentationContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.hydrateSEGMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'viewportNotification.discardDirtyMessage', + description: 'Define the content to be displayed in hydrate SR prompt', + default: 'There are unsaved measurements. Do you want to save it?', + image: [promptDiscardDirtyContent], + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'viewportNotification.discardDirtyMessage': { + $set: CustomizedComponent, + }, + }, + ], +}; + `, + }, + { + id: 'measurement.promptBeginTracking', + description: + 'Define the functionality to connect with the measurement tracking machine on begin measurement tracking', + default: 'promptBeginTracking', + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'measurement.promptBeginTracking': { + $set: customFunction, + }, + }, + ], +}; + `, + }, + { + id: 'measurement.promptHydrateStructuredReport', + description: + 'Define the functionality to connect with the measurement tracking machine on hydrate SR', + default: 'promptHydrateStructuredReport', + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'measurement.promptHydrateStructuredReport': { + $set: customFunction, + }, + }, + ], +}; + `, + }, + { + id: 'measurement.promptTrackNewSeries', + description: + 'Define the functionality to connect with the measurement tracking machine on tracking new series', + default: 'promptTrackNewSeries', + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'measurement.promptTrackNewSeries': { + $set: customFunction, + }, + }, + ], +}; + `, + }, + { + id: 'measurement.promptTrackNewStudy', + description: + 'Define the functionality to connect with the measurement tracking machine on tracking new study', + default: 'promptTrackNewStudy', + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'measurement.promptTrackNewStudy': { + $set: customFunction, + }, + }, + ], +}; + `, + }, + { + id: 'measurement.promptLabelAnnotation', + description: + 'Define the functionality to connect with the measurement tracking machine on begin measurement tracking', + default: 'promptLabelAnnotation', + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'measurement.promptLabelAnnotation': { + $set: customFunction, + }, + }, + ], +}; + `, + }, + { + id: 'measurement.promptSaveReport', + description: + 'Define the functionality to connect with the measurement tracking machine on save SR report', + default: 'promptSaveReport', + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'measurement.promptSaveReport': { + $set: customFunction, + }, + }, + ], +}; + `, + }, + { + id: 'measurement.promptHasDirtyAnnotations', + description: + 'Define the functionality to connect with the measurement tracking machine on there are dirty annotations', + default: 'promptHasDirtyAnnotations', + configuration: ` +window.config = { + // rest of window config + customizationService: [ + { + 'measurement.promptHasDirtyAnnotations': { + $set: customFunction, + }, + }, + ], +}; + `, + }, ]; export const segmentationCustomizations = [ diff --git a/platform/i18n/src/locales/en-US/MeasurementTable.json b/platform/i18n/src/locales/en-US/MeasurementTable.json index 008a8c8a4..424317274 100644 --- a/platform/i18n/src/locales/en-US/MeasurementTable.json +++ b/platform/i18n/src/locales/en-US/MeasurementTable.json @@ -8,5 +8,11 @@ "NonTargets": "NonTargets", "Relabel": "Relabel", "Targets": "Targets", - "Track measurements for this series?": "Track measurements for this series?" + "Track measurements for this series?": "Track measurements for this series?", + "Do you want to add this measurement to the existing report?": "Do you want to add this measurement to the existing report?", + "You have existing tracked measurements. What would you like to do with your existing tracked measurements?": "You have existing tracked measurements. What would you like to do with your existing tracked measurements?", + "Measurements cannot span across multiple studies. Do you want to save your tracked measurements?": "Measurements cannot span across multiple studies. Do you want to save your tracked measurements?", + "Do you want to continue tracking measurements for this study?": "Do you want to continue tracking measurements for this study?", + "Do you want to open this Segmentation?": "Do you want to open this Segmentation?", + "There are unsaved measurements. Do you want to save it?": "There are unsaved measurements. Do you want to save it?" }