fix: Inconsistent Handling of Patient Name Tag (#4703)
This commit is contained in:
parent
cbe926f52b
commit
8aedb2ec54
@ -25,7 +25,7 @@ const contentItemFormatters = {
|
|||||||
return `${NumericValue} ${CodeValue}`;
|
return `${NumericValue} ${CodeValue}`;
|
||||||
},
|
},
|
||||||
PNAME: contentItem => {
|
PNAME: contentItem => {
|
||||||
const personName = contentItem.PersonName?.[0]?.Alphabetic;
|
const personName = contentItem.PersonName?.[0];
|
||||||
return personName ? utils.formatPN(personName) : undefined;
|
return personName ? utils.formatPN(personName) : undefined;
|
||||||
},
|
},
|
||||||
DATE: contentItem => {
|
DATE: contentItem => {
|
||||||
|
|||||||
@ -5,12 +5,14 @@ import { metaData, Enums, utilities } from '@cornerstonejs/core';
|
|||||||
import type { ImageSliceData } from '@cornerstonejs/core/types';
|
import type { ImageSliceData } from '@cornerstonejs/core/types';
|
||||||
import { ViewportOverlay } from '@ohif/ui';
|
import { ViewportOverlay } from '@ohif/ui';
|
||||||
import type { InstanceMetadata } from '@ohif/core/src/types';
|
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 { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService';
|
||||||
|
|
||||||
import './CustomizableViewportOverlay.css';
|
import './CustomizableViewportOverlay.css';
|
||||||
|
|
||||||
const EPSILON = 1e-4;
|
const EPSILON = 1e-4;
|
||||||
|
const { formatPN } = utils;
|
||||||
|
|
||||||
type ViewportData = StackViewportData | VolumeViewportData;
|
type ViewportData = StackViewportData | VolumeViewportData;
|
||||||
|
|
||||||
|
|||||||
@ -52,31 +52,6 @@ export function formatDICOMTime(time, strFormat = 'HH:mm:ss') {
|
|||||||
return moment(time, 'HH:mm:ss').format(strFormat);
|
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
|
* Gets compression type
|
||||||
*
|
*
|
||||||
|
|||||||
@ -36,9 +36,10 @@ function usePatientInfo(servicesManager: AppTypes.ServicesManager) {
|
|||||||
if (!instance) {
|
if (!instance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setPatientInfo({
|
setPatientInfo({
|
||||||
PatientID: instance.PatientID || null,
|
PatientID: instance.PatientID || null,
|
||||||
PatientName: instance.PatientName ? formatPN(instance.PatientName.Alphabetic) : null,
|
PatientName: instance.PatientName ? formatPN(instance.PatientName ) : null,
|
||||||
PatientSex: instance.PatientSex || null,
|
PatientSex: instance.PatientSex || null,
|
||||||
PatientDOB: formatDate(instance.PatientBirthDate) || null,
|
PatientDOB: formatDate(instance.PatientBirthDate) || null,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,7 +3,10 @@ import classnames from 'classnames';
|
|||||||
|
|
||||||
import listComponentGenerator from './listComponentGenerator';
|
import listComponentGenerator from './listComponentGenerator';
|
||||||
import './ViewportOverlay.css';
|
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 {
|
interface OverlayItem {
|
||||||
id: string;
|
id: string;
|
||||||
|
|||||||
@ -52,28 +52,6 @@ export function formatDICOMTime(time, strFormat = 'HH:mm:ss') {
|
|||||||
return moment(time, 'HH:mm:ss').format(strFormat);
|
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
|
* Gets compression type
|
||||||
*
|
*
|
||||||
|
|||||||
@ -10,8 +10,10 @@ import dicomRTAnnotationExport from './utils/dicomRTAnnotationExport/RTStructure
|
|||||||
|
|
||||||
import { getWebWorkerManager } from '@cornerstonejs/core';
|
import { getWebWorkerManager } from '@cornerstonejs/core';
|
||||||
import { Enums } from '@cornerstonejs/tools';
|
import { Enums } from '@cornerstonejs/tools';
|
||||||
|
import { utils } from '@ohif/core';
|
||||||
|
|
||||||
const { SegmentationRepresentations } = Enums;
|
const { SegmentationRepresentations } = Enums;
|
||||||
|
const { formatPN } = utils;
|
||||||
|
|
||||||
const metadataProvider = classes.MetadataProvider;
|
const metadataProvider = classes.MetadataProvider;
|
||||||
const ROI_THRESHOLD_MANUAL_TOOL_IDS = [
|
const ROI_THRESHOLD_MANUAL_TOOL_IDS = [
|
||||||
@ -596,7 +598,7 @@ const commandsModule = ({ servicesManager, commandsManager, extensionManager }:
|
|||||||
report[id] = {
|
report[id] = {
|
||||||
...segReport,
|
...segReport,
|
||||||
PatientID: instance.PatientID ?? '000000',
|
PatientID: instance.PatientID ?? '000000',
|
||||||
PatientName: instance.PatientName.Alphabetic,
|
PatientName: formatPN(instance.PatientName),
|
||||||
StudyInstanceUID: instance.StudyInstanceUID,
|
StudyInstanceUID: instance.StudyInstanceUID,
|
||||||
SeriesInstanceUID: instance.SeriesInstanceUID,
|
SeriesInstanceUID: instance.SeriesInstanceUID,
|
||||||
StudyDate: instance.StudyDate,
|
StudyDate: instance.StudyDate,
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import DicomMetadataStore from '../services/DicomMetadataStore';
|
|||||||
import fetchPaletteColorLookupTableData from '../utils/metadataProvider/fetchPaletteColorLookupTableData';
|
import fetchPaletteColorLookupTableData from '../utils/metadataProvider/fetchPaletteColorLookupTableData';
|
||||||
import toNumber from '../utils/toNumber';
|
import toNumber from '../utils/toNumber';
|
||||||
import combineFrameInstance from '../utils/combineFrameInstance';
|
import combineFrameInstance from '../utils/combineFrameInstance';
|
||||||
|
import formatPN from '../utils/formatPN';
|
||||||
|
|
||||||
class MetadataProvider {
|
class MetadataProvider {
|
||||||
private readonly imageURIToUIDs: Map<string, any> = new Map();
|
private readonly imageURIToUIDs: Map<string, any> = new Map();
|
||||||
@ -345,7 +346,7 @@ class MetadataProvider {
|
|||||||
|
|
||||||
let patientName;
|
let patientName;
|
||||||
if (PatientName) {
|
if (PatientName) {
|
||||||
patientName = PatientName.Alphabetic;
|
patientName = formatPN(PatientName);
|
||||||
}
|
}
|
||||||
|
|
||||||
metadata = {
|
metadata = {
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { DicomMetadataStore } from '../services/DicomMetadataStore/DicomMetadataStore';
|
import { DicomMetadataStore } from '../services/DicomMetadataStore/DicomMetadataStore';
|
||||||
|
import formatPN from './formatPN';
|
||||||
|
|
||||||
export default function downloadCSVReport(measurementData) {
|
export default function downloadCSVReport(measurementData) {
|
||||||
if (measurementData.length === 0) {
|
if (measurementData.length === 0) {
|
||||||
@ -86,7 +87,7 @@ function _getCommonRowItems(measurement, seriesMetadata) {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
'Patient ID': firstInstance.PatientID, // Patient ID
|
'Patient ID': firstInstance.PatientID, // Patient ID
|
||||||
'Patient Name': firstInstance.PatientName?.Alphabetic || '', // Patient Name
|
'Patient Name': formatPN(firstInstance.PatientName) || '', // Patient Name
|
||||||
StudyInstanceUID: measurement.referenceStudyUID, // StudyInstanceUID
|
StudyInstanceUID: measurement.referenceStudyUID, // StudyInstanceUID
|
||||||
SeriesInstanceUID: measurement.referenceSeriesUID, // SeriesInstanceUID
|
SeriesInstanceUID: measurement.referenceSeriesUID, // SeriesInstanceUID
|
||||||
SOPInstanceUID: measurement.SOPInstanceUID, // SOPInstanceUID
|
SOPInstanceUID: measurement.SOPInstanceUID, // SOPInstanceUID
|
||||||
|
|||||||
@ -46,9 +46,10 @@ function usePatientInfo(servicesManager: AppTypes.ServicesManager) {
|
|||||||
if (!instance) {
|
if (!instance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setPatientInfo({
|
setPatientInfo({
|
||||||
PatientID: instance.PatientID || null,
|
PatientID: instance.PatientID || null,
|
||||||
PatientName: instance.PatientName ? formatPN(instance.PatientName.Alphabetic) : null,
|
PatientName: instance.PatientName ? formatPN(instance.PatientName) : null,
|
||||||
PatientSex: instance.PatientSex || null,
|
PatientSex: instance.PatientSex || null,
|
||||||
PatientDOB: formatDate(instance.PatientBirthDate) || null,
|
PatientDOB: formatDate(instance.PatientBirthDate) || null,
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user