{"version":3,"file":"799.bundle.9a5af7a09599310310c6.js","mappings":"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","sources":["webpack:///../../../extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport OHIF, { utils } from '@ohif/core';\n\nimport {\n Notification,\n ViewportActionBar,\n useViewportDialog,\n Tooltip,\n Icon,\n} from '@ohif/ui';\n\nimport { useTranslation } from 'react-i18next';\n\nimport { annotation } from '@cornerstonejs/tools';\nimport { useTrackedMeasurements } from './../getContextModule';\n\nconst { formatDate } = utils;\n\nfunction TrackedCornerstoneViewport(props) {\n const {\n children,\n displaySets,\n viewportIndex,\n viewportLabel,\n servicesManager,\n extensionManager,\n commandsManager,\n viewportOptions,\n } = props;\n\n const { t } = useTranslation('TrackedViewport');\n\n const {\n measurementService,\n cornerstoneViewportService,\n } = servicesManager.services;\n\n // Todo: handling more than one displaySet on the same viewport\n const displaySet = displaySets[0];\n\n const [trackedMeasurements] = useTrackedMeasurements();\n const [viewportDialogState] = useViewportDialog();\n const [isTracked, setIsTracked] = useState(false);\n const [trackedMeasurementUID, setTrackedMeasurementUID] = useState(null);\n\n const { trackedSeries } = trackedMeasurements.context;\n const viewportId = viewportOptions.viewportId;\n\n const {\n Modality,\n SeriesDate,\n SeriesDescription,\n SeriesInstanceUID,\n SeriesNumber,\n } = displaySet;\n\n const {\n PatientID,\n PatientName,\n PatientSex,\n PatientAge,\n SliceThickness,\n SpacingBetweenSlices,\n ManufacturerModelName,\n } = displaySet.images[0];\n\n useEffect(() => {\n if (isTracked) {\n annotation.config.style.setViewportToolStyles(viewportId, {\n global: {\n lineDash: '',\n },\n });\n\n cornerstoneViewportService\n .getRenderingEngine()\n .renderViewport(viewportId);\n\n return;\n }\n\n annotation.config.style.setViewportToolStyles(`viewport-${viewportIndex}`, {\n global: {\n lineDash: '4,4',\n },\n });\n\n cornerstoneViewportService.getRenderingEngine().renderViewport(viewportId);\n\n return () => {\n annotation.config.style.setViewportToolStyles(viewportId, {});\n };\n }, [isTracked]);\n\n if (trackedSeries.includes(SeriesInstanceUID) !== isTracked) {\n setIsTracked(!isTracked);\n }\n\n function switchMeasurement(direction) {\n const newTrackedMeasurementUID = _getNextMeasurementUID(\n direction,\n servicesManager,\n trackedMeasurementUID,\n trackedMeasurements\n );\n\n if (!newTrackedMeasurementUID) {\n return;\n }\n\n setTrackedMeasurementUID(newTrackedMeasurementUID);\n\n measurementService.jumpToMeasurement(\n viewportIndex,\n newTrackedMeasurementUID\n );\n }\n\n const getCornerstoneViewport = () => {\n const { component: Component } = extensionManager.getModuleEntry(\n '@ohif/extension-cornerstone.viewportModule.cornerstone'\n );\n\n return ;\n };\n\n return (\n <>\n {\n evt.stopPropagation();\n evt.preventDefault();\n }}\n useAltStyling={isTracked}\n onArrowsClick={direction => switchMeasurement(direction)}\n getStatusComponent={() => _getStatusComponent(isTracked)}\n studyData={{\n label: viewportLabel,\n studyDate: formatDate(SeriesDate), // TODO: This is series date. Is that ok?\n currentSeries: SeriesNumber, // TODO - switch entire currentSeries to be UID based or actual position based\n seriesDescription: SeriesDescription,\n patientInformation: {\n patientName: PatientName ? OHIF.utils.formatPN(PatientName) : '',\n patientSex: PatientSex || '',\n patientAge: PatientAge || '',\n MRN: PatientID || '',\n thickness: SliceThickness\n ? `${parseFloat(SliceThickness).toFixed(2)}mm`\n : '',\n spacing:\n SpacingBetweenSlices !== undefined\n ? `${parseFloat(SpacingBetweenSlices).toFixed(2)}mm`\n : '',\n scanner: ManufacturerModelName || '',\n },\n }}\n />\n {/* TODO: Viewport interface to accept stack or layers of content like this? */}\n
\n {getCornerstoneViewport()}\n
\n {viewportDialogState.viewportIndex === viewportIndex && (\n \n )}\n
\n
\n \n );\n}\n\nTrackedCornerstoneViewport.propTypes = {\n displaySets: PropTypes.arrayOf(PropTypes.object.isRequired).isRequired,\n viewportIndex: PropTypes.number.isRequired,\n dataSource: PropTypes.object,\n children: PropTypes.node,\n customProps: PropTypes.object,\n};\n\nTrackedCornerstoneViewport.defaultProps = {\n customProps: {},\n};\n\nfunction _getNextMeasurementUID(\n direction,\n servicesManager,\n trackedMeasurementId,\n trackedMeasurements\n) {\n const { measurementService, viewportGridService } = servicesManager.services;\n const measurements = measurementService.getMeasurements();\n\n const { activeViewportIndex, viewports } = viewportGridService.getState();\n const {\n displaySetInstanceUIDs: activeViewportDisplaySetInstanceUIDs,\n } = viewports[activeViewportIndex];\n\n const { trackedSeries } = trackedMeasurements.context;\n\n // Get the potentially trackable measurements for the series of the\n // active viewport.\n // The measurements to jump between are the same\n // regardless if this series is tracked or not.\n\n const filteredMeasurements = measurements.filter(\n m =>\n trackedSeries.includes(m.referenceSeriesUID) &&\n activeViewportDisplaySetInstanceUIDs.includes(m.displaySetInstanceUID)\n );\n\n if (!filteredMeasurements.length) {\n // No measurements on this series.\n return;\n }\n\n const measurementCount = filteredMeasurements.length;\n\n const uids = filteredMeasurements.map(fm => fm.uid);\n let measurementIndex = uids.findIndex(uid => uid === trackedMeasurementId);\n\n if (measurementIndex === -1) {\n // Not tracking a measurement, or previous measurement now deleted, revert to 0.\n measurementIndex = 0;\n } else {\n if (direction === 'left') {\n measurementIndex--;\n\n if (measurementIndex < 0) {\n measurementIndex = measurementCount - 1;\n }\n } else if (direction === 'right') {\n measurementIndex++;\n\n if (measurementIndex === measurementCount) {\n measurementIndex = 0;\n }\n }\n }\n\n const newTrackedMeasurementId = uids[measurementIndex];\n\n return newTrackedMeasurementId;\n}\n\nfunction _getStatusComponent(isTracked) {\n const trackedIcon = isTracked ? 'status-tracked' : 'status-untracked';\n\n return (\n
\n \n
\n \n
\n
\n \n {isTracked ? (\n <>\n Series is\n tracked and\n can be viewed
in the measurement panel\n \n ) : (\n <>\n Measurements for\n untracked \n series
will not be shown in the
measurements\n panel\n \n )}\n
\n
\n
\n }\n >\n \n \n \n );\n}\n\nexport default TrackedCornerstoneViewport;\n"],"names":["formatDate","utils","TrackedCornerstoneViewport","props","children","displaySets","viewportIndex","viewportLabel","servicesManager","extensionManager","commandsManager","viewportOptions","t","useTranslation","measurementService","cornerstoneViewportService","services","displaySet","trackedMeasurements","useTrackedMeasurements","viewportDialogState","useViewportDialog","isTracked","setIsTracked","useState","trackedMeasurementUID","setTrackedMeasurementUID","trackedSeries","context","viewportId","Modality","SeriesDate","SeriesDescription","SeriesInstanceUID","SeriesNumber","PatientID","PatientName","PatientSex","PatientAge","SliceThickness","SpacingBetweenSlices","ManufacturerModelName","images","useEffect","annotation","setViewportToolStyles","global","lineDash","getRenderingEngine","renderViewport","includes","React","ViewportActionBar","onDoubleClick","evt","stopPropagation","preventDefault","useAltStyling","onArrowsClick","direction","newTrackedMeasurementUID","trackedMeasurementId","viewportGridService","measurements","getMeasurements","activeViewportIndex","viewports","getState","displaySetInstanceUIDs","activeViewportDisplaySetInstanceUIDs","filteredMeasurements","filter","m","referenceSeriesUID","displaySetInstanceUID","length","measurementCount","uids","map","fm","uid","measurementIndex","findIndex","_getNextMeasurementUID","jumpToMeasurement","switchMeasurement","getStatusComponent","trackedIcon","className","Tooltip","position","content","Icon","name","_getStatusComponent","studyData","label","studyDate","currentSeries","seriesDescription","patientInformation","patientName","OHIF","formatPN","patientSex","patientAge","MRN","thickness","parseFloat","toFixed","spacing","undefined","scanner","getCornerstoneViewport","component","Component","getModuleEntry","Notification","id","message","type","actions","onSubmit","onOutsideClick","propTypes","PropTypes","isRequired","dataSource","customProps","defaultProps"],"sourceRoot":""}