{"version":3,"file":"953.bundle.49c4cb85e349ab8e47d7.js","mappings":"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","sources":["webpack:///../../../extensions/cornerstone-dicom-sr/src/viewports/OHIFCornerstoneSRViewport.tsx"],"sourcesContent":["import PropTypes from 'prop-types';\nimport React, { useCallback, useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport OHIF, { utils, ServicesManager, ExtensionManager } from '@ohif/core';\nimport { setTrackingUniqueIdentifiersForElement } from '../tools/modules/dicomSRModule';\n\nimport {\n Icon,\n Notification,\n Tooltip,\n useViewportDialog,\n useViewportGrid,\n ViewportActionBar,\n} from '@ohif/ui';\nimport hydrateStructuredReport from '../utils/hydrateStructuredReport';\n\nconst { formatDate } = utils;\n\nconst MEASUREMENT_TRACKING_EXTENSION_ID =\n '@ohif/extension-measurement-tracking';\n\nconst SR_TOOLGROUP_BASE_NAME = 'SRToolGroup';\n\nfunction OHIFCornerstoneSRViewport(props) {\n const {\n children,\n dataSource,\n displaySets,\n viewportIndex,\n viewportOptions,\n viewportLabel,\n servicesManager,\n extensionManager,\n } = props;\n\n const {\n displaySetService,\n cornerstoneViewportService,\n measurementService,\n } = servicesManager.services;\n\n // SR viewport will always have a single display set\n if (displaySets.length > 1) {\n throw new Error('SR viewport should only have a single display set');\n }\n\n const srDisplaySet = displaySets[0];\n\n const [viewportGrid, viewportGridService] = useViewportGrid();\n const [viewportDialogState, viewportDialogApi] = useViewportDialog();\n const [measurementSelected, setMeasurementSelected] = useState(0);\n const [measurementCount, setMeasurementCount] = useState(1);\n const [activeImageDisplaySetData, setActiveImageDisplaySetData] = useState(\n null\n );\n const [\n referencedDisplaySetMetadata,\n setReferencedDisplaySetMetadata,\n ] = useState(null);\n const [isHydrated, setIsHydrated] = useState(srDisplaySet.isHydrated);\n const [element, setElement] = useState(null);\n const { viewports, activeViewportIndex } = viewportGrid;\n\n // Optional hook into tracking extension, if present.\n let trackedMeasurements;\n let sendTrackedMeasurementsEvent;\n\n const hasMeasurementTrackingExtension = extensionManager.registeredExtensionIds.includes(\n MEASUREMENT_TRACKING_EXTENSION_ID\n );\n\n if (hasMeasurementTrackingExtension) {\n const contextModule = extensionManager.getModuleEntry(\n '@ohif/extension-measurement-tracking.contextModule.TrackedMeasurementsContext'\n );\n\n const tracked = useContext(contextModule.context);\n trackedMeasurements = tracked?.[0];\n sendTrackedMeasurementsEvent = tracked?.[1];\n }\n if (!sendTrackedMeasurementsEvent) {\n // if no panels from measurement-tracking extension is used, this code will run\n trackedMeasurements = null;\n sendTrackedMeasurementsEvent = (eventName, { displaySetInstanceUID }) => {\n measurementService.clearMeasurements();\n const { SeriesInstanceUIDs } = hydrateStructuredReport(\n { servicesManager, extensionManager },\n displaySetInstanceUID\n );\n const displaySets = displaySetService.getDisplaySetsForSeries(\n SeriesInstanceUIDs[0]\n );\n if (displaySets.length) {\n viewportGridService.setDisplaySetsForViewport({\n viewportIndex: activeViewportIndex,\n displaySetInstanceUIDs: [displaySets[0].displaySetInstanceUID],\n });\n }\n };\n }\n\n /**\n * Store the tracking identifiers per viewport in order to be able to\n * show the SR measurements on the referenced image on the correct viewport,\n * when multiple viewports are used.\n */\n const setTrackingIdentifiers = useCallback(\n measurementSelected => {\n const { measurements } = srDisplaySet;\n\n setTrackingUniqueIdentifiersForElement(\n element,\n measurements.map(measurement => measurement.TrackingUniqueIdentifier),\n measurementSelected\n );\n },\n [element, measurementSelected, srDisplaySet]\n );\n\n /**\n * OnElementEnabled callback which is called after the cornerstoneExtension\n * has enabled the element. Note: we delegate all the image rendering to\n * cornerstoneExtension, so we don't need to do anything here regarding\n * the image rendering, element enabling etc.\n */\n const onElementEnabled = evt => {\n setElement(evt.detail.element);\n };\n\n const updateViewport = useCallback(\n newMeasurementSelected => {\n const {\n StudyInstanceUID,\n displaySetInstanceUID,\n sopClassUids,\n } = srDisplaySet;\n\n if (!StudyInstanceUID || !displaySetInstanceUID) {\n return;\n }\n\n if (sopClassUids && sopClassUids.length > 1) {\n // Todo: what happens if there are multiple SOP Classes? Why we are\n // not throwing an error?\n console.warn(\n 'More than one SOPClassUID in the same series is not yet supported.'\n );\n }\n\n _getViewportReferencedDisplaySetData(\n srDisplaySet,\n newMeasurementSelected,\n displaySetService\n ).then(({ referencedDisplaySet, referencedDisplaySetMetadata }) => {\n setMeasurementSelected(newMeasurementSelected);\n setActiveImageDisplaySetData(referencedDisplaySet);\n setReferencedDisplaySetMetadata(referencedDisplaySetMetadata);\n\n if (\n referencedDisplaySet.displaySetInstanceUID ===\n activeImageDisplaySetData?.displaySetInstanceUID\n ) {\n const { measurements } = srDisplaySet;\n\n // it means that we have a new referenced display set, and the\n // imageIdIndex will handle it by updating the viewport, but if they\n // are the same we just need to use measurementService to jump to the\n // new measurement\n const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(\n viewportIndex\n );\n\n const csViewport = cornerstoneViewportService.getCornerstoneViewport(\n viewportInfo.getViewportId()\n );\n\n const imageIds = csViewport.getImageIds();\n\n const imageIdIndex = imageIds.indexOf(\n measurements[newMeasurementSelected].imageId\n );\n\n if (imageIdIndex !== -1) {\n csViewport.setImageIdIndex(imageIdIndex);\n }\n }\n });\n },\n [dataSource, srDisplaySet, activeImageDisplaySetData, viewportIndex]\n );\n\n const getCornerstoneViewport = useCallback(() => {\n if (!activeImageDisplaySetData) {\n return null;\n }\n\n const { component: Component } = extensionManager.getModuleEntry(\n '@ohif/extension-cornerstone.viewportModule.cornerstone'\n );\n\n const { measurements } = srDisplaySet;\n const measurement = measurements[measurementSelected];\n\n if (!measurement) {\n return null;\n }\n\n const initialImageIndex = activeImageDisplaySetData.images.findIndex(\n image => image.imageId === measurement.imageId\n );\n\n return (\n \n );\n }, [activeImageDisplaySetData, viewportIndex, measurementSelected]);\n\n const onMeasurementChange = useCallback(\n direction => {\n let newMeasurementSelected = measurementSelected;\n\n if (direction === 'right') {\n newMeasurementSelected++;\n\n if (newMeasurementSelected >= measurementCount) {\n newMeasurementSelected = 0;\n }\n } else {\n newMeasurementSelected--;\n\n if (newMeasurementSelected < 0) {\n newMeasurementSelected = measurementCount - 1;\n }\n }\n\n setTrackingIdentifiers(newMeasurementSelected);\n updateViewport(newMeasurementSelected);\n },\n [\n measurementSelected,\n measurementCount,\n updateViewport,\n setTrackingIdentifiers,\n ]\n );\n\n /**\n Cleanup the SR viewport when the viewport is destroyed\n */\n useEffect(() => {\n const onDisplaySetsRemovedSubscription = displaySetService.subscribe(\n displaySetService.EVENTS.DISPLAY_SETS_REMOVED,\n ({ displaySetInstanceUIDs }) => {\n const activeViewport = viewports[activeViewportIndex];\n if (\n displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)\n ) {\n viewportGridService.setDisplaySetsForViewport({\n viewportIndex: activeViewportIndex,\n displaySetInstanceUIDs: [],\n });\n }\n }\n );\n\n return () => {\n onDisplaySetsRemovedSubscription.unsubscribe();\n };\n }, []);\n\n /**\n * Loading the measurements from the SR viewport, which goes through the\n * isHydratable check, the outcome for the isHydrated state here is always FALSE\n * since we don't do the hydration here. Todo: can't we just set it as false? why\n * we are changing the state here? isHydrated is always false at this stage, and\n * if it is hydrated we don't even use the SR viewport.\n */\n useEffect(() => {\n if (!srDisplaySet.isLoaded) {\n srDisplaySet.load();\n }\n setIsHydrated(srDisplaySet.isHydrated);\n\n const numMeasurements = srDisplaySet.measurements.length;\n setMeasurementCount(numMeasurements);\n }, [srDisplaySet]);\n\n /**\n * Hook to update the tracking identifiers when the selected measurement changes or\n * the element changes\n */\n useEffect(() => {\n if (!element || !srDisplaySet.isLoaded) {\n return;\n }\n setTrackingIdentifiers(measurementSelected);\n }, [measurementSelected, element, setTrackingIdentifiers, srDisplaySet]);\n\n /**\n * Todo: what is this, not sure what it does regarding the react aspect,\n * it is updating a local variable? which is not state.\n */\n let isLocked = trackedMeasurements?.context?.trackedSeries?.length > 0;\n useEffect(() => {\n isLocked = trackedMeasurements?.context?.trackedSeries?.length > 0;\n }, [trackedMeasurements]);\n\n /**\n * Data fetching for the SR displaySet, which updates the measurements and\n * also gets the referenced image displaySet that SR is based on.\n */\n useEffect(() => {\n updateViewport(measurementSelected);\n }, [dataSource, srDisplaySet]);\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n let childrenWithProps = null;\n\n if (!activeImageDisplaySetData || !referencedDisplaySetMetadata) {\n return null;\n }\n\n if (children && children.length) {\n childrenWithProps = children.map((child, index) => {\n return (\n child &&\n React.cloneElement(child, {\n viewportIndex,\n key: index,\n })\n );\n });\n }\n\n const {\n PatientID,\n PatientName,\n PatientSex,\n PatientAge,\n SliceThickness,\n ManufacturerModelName,\n StudyDate,\n SeriesDescription,\n SpacingBetweenSlices,\n SeriesNumber,\n } = referencedDisplaySetMetadata;\n\n // TODO -> disabled double click for now: onDoubleClick={_onDoubleClick}\n return (\n <>\n {\n evt.stopPropagation();\n evt.preventDefault();\n }}\n onArrowsClick={onMeasurementChange}\n getStatusComponent={() =>\n _getStatusComponent({\n srDisplaySet,\n viewportIndex,\n isTracked: false,\n isRehydratable: srDisplaySet.isRehydratable,\n isLocked,\n sendTrackedMeasurementsEvent,\n })\n }\n studyData={{\n label: viewportLabel,\n useAltStyling: true,\n studyDate: formatDate(StudyDate),\n seriesDescription: SeriesDescription || '',\n patientInformation: {\n patientName: PatientName\n ? OHIF.utils.formatPN(PatientName.Alphabetic)\n : '',\n patientSex: PatientSex || '',\n patientAge: PatientAge || '',\n MRN: PatientID || '',\n thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',\n spacing:\n SpacingBetweenSlices !== undefined\n ? `${SpacingBetweenSlices.toFixed(2)}mm`\n : '',\n scanner: ManufacturerModelName || '',\n },\n }}\n />\n\n
\n {getCornerstoneViewport()}\n
\n {viewportDialogState.viewportIndex === viewportIndex && (\n \n )}\n
\n {childrenWithProps}\n
\n \n );\n}\n\nOHIFCornerstoneSRViewport.propTypes = {\n displaySets: PropTypes.arrayOf(PropTypes.object),\n viewportIndex: PropTypes.number.isRequired,\n dataSource: PropTypes.object,\n children: PropTypes.node,\n customProps: PropTypes.object,\n viewportOptions: PropTypes.object,\n servicesManager: PropTypes.instanceOf(ServicesManager).isRequired,\n extensionManager: PropTypes.instanceOf(ExtensionManager).isRequired,\n};\n\nOHIFCornerstoneSRViewport.defaultProps = {\n customProps: {},\n};\n\nasync function _getViewportReferencedDisplaySetData(\n displaySet,\n measurementSelected,\n displaySetService\n) {\n const { measurements } = displaySet;\n const measurement = measurements[measurementSelected];\n\n const { displaySetInstanceUID } = measurement;\n\n const referencedDisplaySet = displaySetService.getDisplaySetByUID(\n displaySetInstanceUID\n );\n\n const image0 = referencedDisplaySet.images[0];\n const referencedDisplaySetMetadata = {\n PatientID: image0.PatientID,\n PatientName: image0.PatientName,\n PatientSex: image0.PatientSex,\n PatientAge: image0.PatientAge,\n SliceThickness: image0.SliceThickness,\n StudyDate: image0.StudyDate,\n SeriesDescription: image0.SeriesDescription,\n SeriesInstanceUID: image0.SeriesInstanceUID,\n SeriesNumber: image0.SeriesNumber,\n ManufacturerModelName: image0.ManufacturerModelName,\n SpacingBetweenSlices: image0.SpacingBetweenSlices,\n };\n\n return { referencedDisplaySetMetadata, referencedDisplaySet };\n}\n\nfunction _getStatusComponent({\n srDisplaySet,\n viewportIndex,\n isRehydratable,\n isLocked,\n sendTrackedMeasurementsEvent,\n}) {\n const handleMouseUp = () => {\n sendTrackedMeasurementsEvent('HYDRATE_SR', {\n displaySetInstanceUID: srDisplaySet.displaySetInstanceUID,\n viewportIndex,\n });\n };\n\n const { t } = useTranslation('Common');\n const loadStr = t('LOAD');\n\n // 1 - Incompatible\n // 2 - Locked\n // 3 - Rehydratable / Open\n const state =\n isRehydratable && !isLocked ? 3 : isRehydratable && isLocked ? 2 : 1;\n let ToolTipMessage = null;\n let StatusIcon = null;\n\n switch (state) {\n case 1:\n StatusIcon = () => ;\n\n ToolTipMessage = () => (\n
\n This structured report is not compatible\n
\n with this application.\n
\n );\n break;\n case 2:\n StatusIcon = () => ;\n\n ToolTipMessage = () => (\n
\n This structured report is currently read-only\n
\n because you are tracking measurements in\n
\n another viewport.\n
\n );\n break;\n case 3:\n StatusIcon = () => ;\n\n ToolTipMessage = () => (\n
{`Click ${loadStr} to restore measurements.`}
\n );\n }\n\n const StatusArea = () => (\n
\n
\n \n SR\n
\n {state === 3 && (\n \n {loadStr}\n
\n )}\n \n );\n\n return (\n <>\n {ToolTipMessage && (\n } position=\"bottom-left\">\n \n \n )}\n {!ToolTipMessage && }\n \n );\n}\n\nexport default OHIFCornerstoneSRViewport;\n"],"names":["formatDate","utils","OHIFCornerstoneSRViewport","props","children","dataSource","displaySets","viewportIndex","viewportOptions","viewportLabel","servicesManager","extensionManager","displaySetService","cornerstoneViewportService","measurementService","services","length","Error","srDisplaySet","viewportGrid","viewportGridService","useViewportGrid","viewportDialogState","viewportDialogApi","useViewportDialog","measurementSelected","setMeasurementSelected","useState","measurementCount","setMeasurementCount","activeImageDisplaySetData","setActiveImageDisplaySetData","referencedDisplaySetMetadata","setReferencedDisplaySetMetadata","isHydrated","setIsHydrated","element","setElement","viewports","activeViewportIndex","trackedMeasurements","sendTrackedMeasurementsEvent","registeredExtensionIds","includes","contextModule","getModuleEntry","tracked","useContext","context","eventName","displaySetInstanceUID","clearMeasurements","SeriesInstanceUIDs","hydrateStructuredReport","getDisplaySetsForSeries","setDisplaySetsForViewport","displaySetInstanceUIDs","setTrackingIdentifiers","useCallback","measurements","setTrackingUniqueIdentifiersForElement","map","measurement","TrackingUniqueIdentifier","onElementEnabled","evt","detail","updateViewport","newMeasurementSelected","StudyInstanceUID","sopClassUids","console","warn","async","displaySet","referencedDisplaySet","getDisplaySetByUID","image0","images","PatientID","PatientName","PatientSex","PatientAge","SliceThickness","StudyDate","SeriesDescription","SeriesInstanceUID","SeriesNumber","ManufacturerModelName","SpacingBetweenSlices","_getViewportReferencedDisplaySetData","then","viewportInfo","getViewportInfoByIndex","csViewport","getCornerstoneViewport","getViewportId","imageIdIndex","getImageIds","indexOf","imageId","setImageIdIndex","component","Component","initialImageIndex","findIndex","image","React","_extends","toolGroupId","onMeasurementChange","direction","useEffect","onDisplaySetsRemovedSubscription","subscribe","EVENTS","DISPLAY_SETS_REMOVED","activeViewport","unsubscribe","isLoaded","load","numMeasurements","isLocked","trackedSeries","childrenWithProps","child","index","key","ViewportActionBar","onDoubleClick","stopPropagation","preventDefault","onArrowsClick","getStatusComponent","isRehydratable","handleMouseUp","t","useTranslation","loadStr","state","ToolTipMessage","StatusIcon","Icon","name","StatusArea","className","onMouseUp","Tooltip","content","position","_getStatusComponent","isTracked","studyData","label","useAltStyling","studyDate","seriesDescription","patientInformation","patientName","OHIF","formatPN","Alphabetic","patientSex","patientAge","MRN","thickness","toFixed","spacing","undefined","scanner","Notification","message","type","actions","onSubmit","onOutsideClick","propTypes","PropTypes","isRequired","customProps","ServicesManager","ExtensionManager","defaultProps"],"sourceRoot":""}