From 8aedb2ec54a0ccf2550f745fed6f0b8aa184a860 Mon Sep 17 00:00:00 2001 From: Jaseel-trenser <108331536+Jaseel-trenser@users.noreply.github.com> Date: Tue, 21 Jan 2025 19:37:30 +0530 Subject: [PATCH] fix: Inconsistent Handling of Patient Name Tag (#4703) --- .../src/utils/formatContentItem.ts | 2 +- .../Overlays/CustomizableViewportOverlay.tsx | 4 ++- .../src/Viewport/Overlays/utils.ts | 25 ------------------- .../default/src/hooks/usePatientInfo.tsx | 3 ++- .../src/components/ViewportOverlay/index.tsx | 5 +++- .../src/components/ViewportOverlay/utils.ts | 22 ---------------- extensions/tmtv/src/commandsModule.ts | 4 ++- platform/core/src/classes/MetadataProvider.ts | 3 ++- platform/core/src/utils/downloadCSVReport.js | 3 ++- .../HeaderPatientInfo/HeaderPatientInfo.tsx | 3 ++- 10 files changed, 19 insertions(+), 55 deletions(-) diff --git a/extensions/cornerstone-dicom-sr/src/utils/formatContentItem.ts b/extensions/cornerstone-dicom-sr/src/utils/formatContentItem.ts index 144607755..064a8a2cc 100644 --- a/extensions/cornerstone-dicom-sr/src/utils/formatContentItem.ts +++ b/extensions/cornerstone-dicom-sr/src/utils/formatContentItem.ts @@ -25,7 +25,7 @@ const contentItemFormatters = { return `${NumericValue} ${CodeValue}`; }, PNAME: contentItem => { - const personName = contentItem.PersonName?.[0]?.Alphabetic; + const personName = contentItem.PersonName?.[0]; return personName ? utils.formatPN(personName) : undefined; }, DATE: contentItem => { diff --git a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx index b459c69cd..769494891 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx +++ b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx @@ -5,12 +5,14 @@ import { metaData, Enums, utilities } from '@cornerstonejs/core'; import type { ImageSliceData } from '@cornerstonejs/core/types'; import { ViewportOverlay } from '@ohif/ui'; import type { InstanceMetadata } from '@ohif/core/src/types'; -import { formatPN, formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils'; +import { formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils'; +import { utils } from '@ohif/core'; import { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService'; import './CustomizableViewportOverlay.css'; const EPSILON = 1e-4; +const { formatPN } = utils; type ViewportData = StackViewportData | VolumeViewportData; diff --git a/extensions/cornerstone/src/Viewport/Overlays/utils.ts b/extensions/cornerstone/src/Viewport/Overlays/utils.ts index d8795f3b3..cd90a095e 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/utils.ts +++ b/extensions/cornerstone/src/Viewport/Overlays/utils.ts @@ -52,31 +52,6 @@ export function formatDICOMTime(time, strFormat = 'HH:mm:ss') { return moment(time, 'HH:mm:ss').format(strFormat); } -/** - * Formats a patient name for display purposes - * - * @param {string} name - * @returns {string} formatted name. - */ -export function formatPN(name) { - if (!name) { - return ''; - } - if (typeof name === 'object') { - name = name.Alphabetic; - if (!name) { - return ''; - } - } - - const cleaned = name - .split('^') - .filter(s => !!s) - .join(', ') - .trim(); - return cleaned === ',' || cleaned === '' ? '' : cleaned; -} - /** * Gets compression type * diff --git a/extensions/default/src/hooks/usePatientInfo.tsx b/extensions/default/src/hooks/usePatientInfo.tsx index ef8773a0d..9af2efc3f 100644 --- a/extensions/default/src/hooks/usePatientInfo.tsx +++ b/extensions/default/src/hooks/usePatientInfo.tsx @@ -36,9 +36,10 @@ function usePatientInfo(servicesManager: AppTypes.ServicesManager) { if (!instance) { return; } + setPatientInfo({ PatientID: instance.PatientID || null, - PatientName: instance.PatientName ? formatPN(instance.PatientName.Alphabetic) : null, + PatientName: instance.PatientName ? formatPN(instance.PatientName ) : null, PatientSex: instance.PatientSex || null, PatientDOB: formatDate(instance.PatientBirthDate) || null, }); diff --git a/extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx b/extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx index 7d04f56d6..7cbc04a51 100644 --- a/extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx +++ b/extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx @@ -3,7 +3,10 @@ import classnames from 'classnames'; import listComponentGenerator from './listComponentGenerator'; import './ViewportOverlay.css'; -import { formatDICOMDate, formatDICOMTime, formatNumberPrecision, formatPN } from './utils'; +import { formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils'; +import { utils } from '@ohif/core'; + +const { formatPN } = utils; interface OverlayItem { id: string; diff --git a/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts b/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts index 9dfa63aef..d47dd14c1 100644 --- a/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts +++ b/extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts @@ -52,28 +52,6 @@ export function formatDICOMTime(time, strFormat = 'HH:mm:ss') { return moment(time, 'HH:mm:ss').format(strFormat); } -/** - * Formats a patient name for display purposes - * - * @param {string} name - * @returns {string} formatted name. - */ -export function formatPN(name) { - if (!name) { - return; - } - - // Convert the first ^ to a ', '. String.replace() only affects - // the first appearance of the character. - const commaBetweenFirstAndLast = name.replace('^', ', '); - - // Replace any remaining '^' characters with spaces - const cleaned = commaBetweenFirstAndLast.replace(/\^/g, ' '); - - // Trim any extraneous whitespace - return cleaned.trim(); -} - /** * Gets compression type * diff --git a/extensions/tmtv/src/commandsModule.ts b/extensions/tmtv/src/commandsModule.ts index 078af64d8..ce9bd7ff9 100644 --- a/extensions/tmtv/src/commandsModule.ts +++ b/extensions/tmtv/src/commandsModule.ts @@ -10,8 +10,10 @@ import dicomRTAnnotationExport from './utils/dicomRTAnnotationExport/RTStructure import { getWebWorkerManager } from '@cornerstonejs/core'; import { Enums } from '@cornerstonejs/tools'; +import { utils } from '@ohif/core'; const { SegmentationRepresentations } = Enums; +const { formatPN } = utils; const metadataProvider = classes.MetadataProvider; const ROI_THRESHOLD_MANUAL_TOOL_IDS = [ @@ -596,7 +598,7 @@ const commandsModule = ({ servicesManager, commandsManager, extensionManager }: report[id] = { ...segReport, PatientID: instance.PatientID ?? '000000', - PatientName: instance.PatientName.Alphabetic, + PatientName: formatPN(instance.PatientName), StudyInstanceUID: instance.StudyInstanceUID, SeriesInstanceUID: instance.SeriesInstanceUID, StudyDate: instance.StudyDate, diff --git a/platform/core/src/classes/MetadataProvider.ts b/platform/core/src/classes/MetadataProvider.ts index 3fccff5e6..0cd466482 100644 --- a/platform/core/src/classes/MetadataProvider.ts +++ b/platform/core/src/classes/MetadataProvider.ts @@ -6,6 +6,7 @@ import DicomMetadataStore from '../services/DicomMetadataStore'; import fetchPaletteColorLookupTableData from '../utils/metadataProvider/fetchPaletteColorLookupTableData'; import toNumber from '../utils/toNumber'; import combineFrameInstance from '../utils/combineFrameInstance'; +import formatPN from '../utils/formatPN'; class MetadataProvider { private readonly imageURIToUIDs: Map = new Map(); @@ -345,7 +346,7 @@ class MetadataProvider { let patientName; if (PatientName) { - patientName = PatientName.Alphabetic; + patientName = formatPN(PatientName); } metadata = { diff --git a/platform/core/src/utils/downloadCSVReport.js b/platform/core/src/utils/downloadCSVReport.js index 4185a7919..70adf9f3b 100644 --- a/platform/core/src/utils/downloadCSVReport.js +++ b/platform/core/src/utils/downloadCSVReport.js @@ -1,4 +1,5 @@ import { DicomMetadataStore } from '../services/DicomMetadataStore/DicomMetadataStore'; +import formatPN from './formatPN'; export default function downloadCSVReport(measurementData) { if (measurementData.length === 0) { @@ -86,7 +87,7 @@ function _getCommonRowItems(measurement, seriesMetadata) { return { 'Patient ID': firstInstance.PatientID, // Patient ID - 'Patient Name': firstInstance.PatientName?.Alphabetic || '', // Patient Name + 'Patient Name': formatPN(firstInstance.PatientName) || '', // Patient Name StudyInstanceUID: measurement.referenceStudyUID, // StudyInstanceUID SeriesInstanceUID: measurement.referenceSeriesUID, // SeriesInstanceUID SOPInstanceUID: measurement.SOPInstanceUID, // SOPInstanceUID diff --git a/platform/ui/src/components/HeaderPatientInfo/HeaderPatientInfo.tsx b/platform/ui/src/components/HeaderPatientInfo/HeaderPatientInfo.tsx index aa6bac784..0376ef3a6 100644 --- a/platform/ui/src/components/HeaderPatientInfo/HeaderPatientInfo.tsx +++ b/platform/ui/src/components/HeaderPatientInfo/HeaderPatientInfo.tsx @@ -46,9 +46,10 @@ function usePatientInfo(servicesManager: AppTypes.ServicesManager) { if (!instance) { return; } + setPatientInfo({ PatientID: instance.PatientID || null, - PatientName: instance.PatientName ? formatPN(instance.PatientName.Alphabetic) : null, + PatientName: instance.PatientName ? formatPN(instance.PatientName) : null, PatientSex: instance.PatientSex || null, PatientDOB: formatDate(instance.PatientBirthDate) || null, });