diff --git a/extensions/dicom-tag-browser/src/components/DicomTagBrowser.js b/extensions/dicom-tag-browser/src/components/DicomTagBrowser.js
index 4760cff3f..05f0670f8 100644
--- a/extensions/dicom-tag-browser/src/components/DicomTagBrowser.js
+++ b/extensions/dicom-tag-browser/src/components/DicomTagBrowser.js
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
-import { classes } from '@ohif/core';
+import { classes, cornerstone as OHIFCornerstone } from '@ohif/core';
import dcmjs from 'dcmjs';
import DicomBrowserSelect from './DicomBrowserSelect';
import moment from 'moment';
@@ -10,6 +10,8 @@ const { ImageSet } = classes;
const { DicomMetaDictionary } = dcmjs.data;
const { nameMap } = DicomMetaDictionary;
+const { metadataProvider } = OHIFCornerstone;
+
const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
const [
activeDisplaySetInstanceUID,
@@ -17,6 +19,7 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
] = useState(displaySetInstanceUID);
const [activeInstance, setActiveInstance] = useState(0);
const [tags, setTags] = useState([]);
+ const [meta, setMeta] = useState('');
const [instanceList, setInstanceList] = useState([]);
const [displaySetList, setDisplaySetList] = useState([]);
const [isImageStack, setIsImageStack] = useState(false);
@@ -83,6 +86,7 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
}
setTags(getSortedTags(metadata));
+ setMeta(metadata);
setInstanceList(instanceList);
setDisplaySetList(newDisplaySetList);
setIsImageStack(isImageStack);
@@ -114,41 +118,43 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
options={displaySetList}
/>
{instanceSelectList}
-
+
);
};
-function DicomTagTable({ tags }) {
- const rows = getFormattedRowsFromTags(tags);
+function DicomTagTable({ tags, meta }) {
+ const rows = getFormattedRowsFromTags(tags, meta);
return (
-
- | Tag |
- Value Representation |
- Keyword |
- Value |
-
- {rows.map(row => {
- const className = row.className ? row.className : null;
+
+
+ | Tag |
+ Value Representation |
+ Keyword |
+ Value |
+
+ {rows.map((row, index) => {
+ const className = row.className ? row.className : null;
- return (
-
- | {row[0]} |
- {row[1]} |
- {row[2]} |
- {row[3]} |
-
- );
- })}
+ return (
+
+ | {row[0]} |
+ {row[1]} |
+ {row[2]} |
+ {row[3]} |
+
+ );
+ })}
+
);
}
-function getFormattedRowsFromTags(tags) {
+function getFormattedRowsFromTags(tags, meta) {
const rows = [];
tags.forEach(tagInfo => {
@@ -175,6 +181,17 @@ function getFormattedRowsFromTags(tags) {
rows.push(...formatedRowsFromTags);
});
} else {
+ if (tagInfo.vr === 'xs') {
+ try {
+ const dataset = metadataProvider.getStudyDataset(meta.StudyInstanceUID);
+ const tag = dcmjs.data.Tag.fromPString(tagInfo.tag).toCleanString();
+ const originalTagInfo = dataset[tag];
+ tagInfo.vr = originalTagInfo.vr;
+ } catch (error) {
+ console.error(`Failed to parse value representation for tag '${tagInfo.keyword}'`);
+ }
+ }
+
rows.push([
`${tagInfo.tagIndent}${tagInfo.tag}`,
tagInfo.vr,
diff --git a/platform/core/src/classes/MetadataProvider.js b/platform/core/src/classes/MetadataProvider.js
index d633c321f..51a16b6fe 100644
--- a/platform/core/src/classes/MetadataProvider.js
+++ b/platform/core/src/classes/MetadataProvider.js
@@ -20,6 +20,7 @@ class MetadataProvider {
writable: false,
value: new Map(),
});
+ this.datasets = {};
}
async addInstance(dicomJSONDatasetOrP10ArrayBuffer, options = {}) {
@@ -52,6 +53,7 @@ class MetadataProvider {
SOPInstanceUID,
} = naturalizedDataset;
+ this._getAndCacheStudyDataset(StudyInstanceUID, dicomJSONDataset);
const study = this._getAndCacheStudy(StudyInstanceUID);
const series = this._getAndCacheSeriesFromStudy(study, SeriesInstanceUID);
const instance = this._getAndCacheInstanceFromStudy(series, SOPInstanceUID);
@@ -71,6 +73,16 @@ class MetadataProvider {
this.imageIdToUIDs.set(imageId, uids);
}
+ _getAndCacheStudyDataset(StudyInstanceUID, dataset) {
+ if (!this.datasets[StudyInstanceUID]) {
+ this.datasets[StudyInstanceUID] = dataset;
+ }
+ }
+
+ getStudyDataset(StudyInstanceUID) {
+ return this.datasets[StudyInstanceUID];
+ }
+
_getAndCacheStudy(StudyInstanceUID) {
const studies = this.studies;
@@ -83,6 +95,7 @@ class MetadataProvider {
return study;
}
+
_getAndCacheSeriesFromStudy(study, SeriesInstanceUID) {
let series = study.series.get(SeriesInstanceUID);
diff --git a/platform/ui/src/components/errorBoundary/ErrorBoundary.js b/platform/ui/src/components/errorBoundary/ErrorBoundary.js
index d2acec560..642f50be2 100644
--- a/platform/ui/src/components/errorBoundary/ErrorBoundary.js
+++ b/platform/ui/src/components/errorBoundary/ErrorBoundary.js
@@ -15,8 +15,8 @@ const ErrorFallback = ({ error, componentStack, resetErrorBoundary }) => {
const OHIFErrorBoundary = ({
context = 'OHIF',
- onReset = () => {},
- onError = () => {},
+ onReset = () => { },
+ onError = () => { },
fallbackComponent,
children,
}) => {
@@ -45,7 +45,7 @@ OHIFErrorBoundary.propTypes = {
onReset: PropTypes.func,
onError: PropTypes.func,
children: PropTypes.node.isRequired,
- fallbackComponent: PropTypes.element,
+ fallbackComponent: PropTypes.oneOfType([PropTypes.node, PropTypes.func, PropTypes.element]),
};
export default OHIFErrorBoundary;