diff --git a/extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx b/extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx
index 49155ca6a..cd03107aa 100644
--- a/extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx
+++ b/extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx
@@ -1,48 +1,37 @@
-import React, { useState, useEffect, useRef } from 'react';
-import { classes } from '@ohif/core';
-import Range from './Range';
-import DicomTagTable from './DicomTagTable';
import dcmjs from 'dcmjs';
import moment from 'moment';
+import React, { useState, useMemo } from 'react';
+import { classes } from '@ohif/core';
+import DicomTagTable from './DicomTagTable';
import './DicomTagBrowser.css';
-import { Select, Typography } from '@ohif/ui';
+import { InputRange, Select, Typography } from '@ohif/ui';
const { ImageSet } = classes;
const { DicomMetaDictionary } = dcmjs.data;
const { nameMap } = DicomMetaDictionary;
-
-let instanceSelectList = null;
-let instanceSelectTitle = null;
-
const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
const [
- activeDisplaySetInstanceUID,
- setActiveDisplaySetInstanceUID,
+ selectedDisplaySetInstanceUID,
+ setSelectedDisplaySetInstanceUID,
] = useState(displaySetInstanceUID);
- const [activeInstance, setActiveInstance] = useState(1);
- const [tags, setTags] = useState([]);
- const [meta, setMeta] = useState('');
- const [instanceList, setInstanceList] = useState([]);
- const [displaySetList, setDisplaySetList] = useState([]);
- const [isImageStack, setIsImageStack] = useState(false);
- const [selectedDisplaySetValue, setSelectedDisplaySetValue] = useState({}
- );
- const onSeriesSelect = value => {
- console.log(value);
- setActiveDisplaySetInstanceUID(value.value);
- setActiveInstance(1);
- setSelectedDisplaySetValue(value);
+ const [instanceNumber, setInstanceNumber] = useState(1);
+
+ const onSelectChange = value => {
+ setSelectedDisplaySetInstanceUID(value.value);
+ setInstanceNumber(1);
};
- useEffect(() => {
- var activeDisplaySet = displaySets.find(
- ds => ds.displaySetInstanceUID === activeDisplaySetInstanceUID
- );
+ const activeDisplaySet = displaySets.find(
+ ds => ds.displaySetInstanceUID === selectedDisplaySetInstanceUID
+ );
+ const isImageStack = _isImageStack(activeDisplaySet);
+ const showInstanceList = isImageStack && activeDisplaySet.images.length > 1;
+
+ const displaySetList = useMemo(() => {
displaySets.sort((a, b) => a.SeriesNumber - b.SeriesNumber);
-
- const newDisplaySetList = displaySets.map(displaySet => {
+ return displaySets.map(displaySet => {
const {
displaySetInstanceUID,
SeriesDate,
@@ -56,123 +45,72 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
const dateStr = `${SeriesDate}:${SeriesTime}`.split('.')[0];
const date = moment(dateStr, 'YYYYMMDD:HHmmss');
const displayDate = date.format('ddd, MMM Do YYYY');
+
return {
value: displaySetInstanceUID,
label: `${SeriesNumber} (${Modality}): ${SeriesDescription}`,
description: displayDate,
- onClick: () => {
- setActiveDisplaySetInstanceUID(displaySetInstanceUID);
- setActiveInstance(1);
-
- //instanceSelectList.props.children.props.value = 1;
- },
};
});
-
- let metadata;
- if (!activeDisplaySet) {
- if (!displaySets || displaySets.length == 0) {
- return;
- } else {
- activeDisplaySet = displaySets[0];
- setActiveDisplaySetInstanceUID(displaySets[0].displaySetInstanceUID);
- setSelectedDisplaySetValue(newDisplaySetList[0]);
- }
-
- } else {
-
- setSelectedDisplaySetValue(newDisplaySetList.find(
- ds => ds.value === activeDisplaySetInstanceUID
- ));
- }
- const isImageStack =
- activeDisplaySet instanceof ImageSet; /*&&
- activeDisplaySet.isSOPClassUIDSupported === true*/;
-
- let instanceList;
- if (isImageStack) {
- const { images } = activeDisplaySet;
- const image = images[activeInstance - 1];
- instanceList = images.map((image, index) => {
- // const metadata = image.getData().metadata;
-
- const { InstanceNumber } = image;
-
- return {
- value: index,
- title: `Instance Number: ${InstanceNumber}`,
- description: '',
- onClick: () => {
- setActiveInstance(index);
- },
- };
- });
- metadata = image;
- } else {
- metadata = activeDisplaySet;
- }
-
-
- if (isImageStack) {
- instanceSelectTitle = (
-
- Instance Number
-
- )
- instanceSelectList = (
-
-
-
+
+
Series
- {instanceSelectTitle}
-
-
-
+ {showInstanceList && (
+
+ Instance Number
+
+ )}
+
+
+
- {instanceSelectList}
-
-
-
-
+ value={displaySetList.find(
+ ds => ds.value === selectedDisplaySetInstanceUID
+ )}
+ className="text-white"
+ />
+
+ {showInstanceList ? (
+
+ {
+ setInstanceNumber(parseInt(value));
+ }}
+ minValue={1}
+ maxValue={activeDisplaySet.images.length}
+ step={1}
+ />
+
+ ) : null}
+
);
};
+function getFormattedRowsFromTags(displaySet, instanceNumber) {
+ const isImageStack = _isImageStack(displaySet);
-function getFormattedRowsFromTags(tags, meta) {
+ let metadata;
+
+ if (isImageStack) {
+ metadata = displaySet.images[instanceNumber - 1];
+ } else {
+ metadata = displaySet;
+ }
+
+ const tags = getSortedTags(metadata);
const rows = [];
tags.forEach(tagInfo => {
@@ -205,7 +143,6 @@ function getFormattedRowsFromTags(tags, meta) {
meta.StudyInstanceUID
);*/
// console.log(dataset);
-
// const tag = dcmjs.data.Tag.fromPString(tagInfo.tag).toCleanString();
// const originalTagInfo = dataset[tag];
// tagInfo.vr = originalTagInfo.vr;
@@ -220,10 +157,9 @@ function getFormattedRowsFromTags(tags, meta) {
`${tagInfo.tagIndent}${tagInfo.tag}`,
tagInfo.vr,
tagInfo.keyword,
- tagInfo.value
+ tagInfo.value,
]);
} else {
-
rows.push([
`${tagInfo.tagIndent}${tagInfo.tag}`,
tagInfo.vr,
@@ -353,7 +289,7 @@ function getRows(metadata, depth = 0) {
});
} else {
// skip properties without hex tag numbers
- var regex = /[0-9A-Fa-f]{6}/g;
+ const regex = /[0-9A-Fa-f]{6}/g;
if (keyword.match(regex)) {
const tag = `(${keyword.substring(0, 4)},${keyword.substring(4, 8)})`;
rows.push({
@@ -370,6 +306,10 @@ function getRows(metadata, depth = 0) {
return rows;
}
+function _isImageStack(displaySet) {
+ return displaySet instanceof ImageSet;
+}
+
function toArray(objectOrArray) {
return Array.isArray(objectOrArray) ? objectOrArray : [objectOrArray];
}
diff --git a/extensions/default/src/DicomTagBrowser/DicomTagTable.tsx b/extensions/default/src/DicomTagBrowser/DicomTagTable.tsx
index b63b4781a..5a67bbae9 100644
--- a/extensions/default/src/DicomTagBrowser/DicomTagTable.tsx
+++ b/extensions/default/src/DicomTagBrowser/DicomTagTable.tsx
@@ -1,55 +1,99 @@
import React from 'react';
function ColumnHeaders() {
- return (
-
-
-
-
-
-
-
-
-
)
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
}
function DicomTagTable({ rows }) {
+ return (
+
+ {ColumnHeaders()}
+
+
+
+ {rows.map((row, index) => {
+ const className = row.className ? row.className : null;
- return ({ColumnHeaders()}
-
-
-
-
- {rows.map((row, index) => {
- const className = row.className ? row.className : null;
-
- return (
-
- |
-
- |
-
-
- |
-
-
- |
-
-
- |
-
- );
- })}
-
-
+ return (
+
+ |
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+ );
+ })}
+
+
+
+
);
}
diff --git a/extensions/default/src/DicomTagBrowser/Range.css b/extensions/default/src/DicomTagBrowser/Range.css
deleted file mode 100644
index 0e18f32d1..000000000
--- a/extensions/default/src/DicomTagBrowser/Range.css
+++ /dev/null
@@ -1,65 +0,0 @@
-.range {
- margin: 0;
- width: 100%;
- -webkit-appearance: none;
- background-color: transparent;
-}
-
-.range:focus {
- outline: none;
-}
-
-.range::-webkit-slider-runnable-track {
- width: 100%;
- height: 2px;
- cursor: pointer;
- box-shadow: none;
- background-color: #3C5D80;
- border-radius: 0px;
- border: 0px solid #3C5D80;
-}
-
-.range::-moz-range-track {
- width: 100%;
- height: 2px;
- cursor: pointer;
- box-shadow: none;
- background-color: #3C5D80;
- border-radius: 0px;
- border: 0px solid #3C5D80;
-}
-
-.range::-webkit-slider-thumb {
- box-shadow: none;
- border: 0px solid #20A5D6;
- box-shadow: 0px 10px 10px rgba(0, 0, 0, 0.25);
- height: 21px;
- width: 11px;
- border-radius: 11px;
- background: #20A5D6;
- cursor: pointer;
- -webkit-appearance: none;
- margin-top: -10px;
-}
-
-.range::-moz-range-thumb {
- box-shadow: none;
- border: 0px solid #20A5D6;
- box-shadow: 0px 10px 10px rgba(0, 0, 0, 0.25);
- height: 21px;
- width: 11px;
- border-radius: 11px;
- background: #20A5D6;
- cursor: pointer;
- -webkit-appearance: none;
- margin-top: -10px;
-}
-
-.range::-moz-focus-outer {
- border: 0;
-}
-
-.range-example {
- background: black;
- height: 2em;
-}
diff --git a/extensions/default/src/DicomTagBrowser/Range.tsx b/extensions/default/src/DicomTagBrowser/Range.tsx
deleted file mode 100644
index f0462dcba..000000000
--- a/extensions/default/src/DicomTagBrowser/Range.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import './Range.css';
-
-import React, { useState } from 'react';
-import PropTypes from 'prop-types';
-
-function Range(props) {
- const [value, setValue] = useState(props.value);
- const handleChange = event => {
- setValue(event.target.value);
- if (props.onChange) props.onChange(event);
- };
-
-
- return (
- <>
-
- {props.showPercentage &&
{`${value}%`}}
- {props.showValue && (
-
- {props.valueRenderer
- ? props.valueRenderer(props.value)
- : props.value}
-
- )}
- >
- );
-}
-
-Range.propTypes = {
- value: PropTypes.number,
- min: PropTypes.number.isRequired,
- max: PropTypes.number.isRequired,
- step: PropTypes.number,
- id: PropTypes.string,
- valueRenderer: PropTypes.func,
- onChange: PropTypes.func,
- showPercentage: PropTypes.bool,
- showValue: PropTypes.bool,
- ref: PropTypes.any,
-};
-
-Range.defaultProps = {
- showPercentage: false,
- showValue: false,
-};
-
-export default Range;
diff --git a/modes/longitudinal/src/toolbarButtons.js b/modes/longitudinal/src/toolbarButtons.js
index 8daceca1a..c6dcd101f 100644
--- a/modes/longitudinal/src/toolbarButtons.js
+++ b/modes/longitudinal/src/toolbarButtons.js
@@ -377,19 +377,6 @@ const toolbarButtons = [
],
'Reset'
),
- _createActionButton(
- 'TagBrowser',
- 'list-bullets',
- 'Dicom Tag Browser',
- [
- {
- commandName: 'openDICOMTagViewer',
- commandOptions: {},
- context: 'DEFAULT',
- },
- ],
- 'Dicom Tag Browser'
- ),
_createActionButton(
'rotate-right',
'tool-rotate-right',
@@ -535,6 +522,19 @@ const toolbarButtons = [
],
'Rectangle'
),
+ _createActionButton(
+ 'TagBrowser',
+ 'list-bullets',
+ 'Dicom Tag Browser',
+ [
+ {
+ commandName: 'openDICOMTagViewer',
+ commandOptions: {},
+ context: 'DEFAULT',
+ },
+ ],
+ 'Dicom Tag Browser'
+ ),
],
},
},
diff --git a/platform/ui/src/components/index.js b/platform/ui/src/components/index.js
index b88bcefb1..66aeeb874 100644
--- a/platform/ui/src/components/index.js
+++ b/platform/ui/src/components/index.js
@@ -8,7 +8,7 @@ import Dialog from './Dialog';
import Dropdown from './Dropdown';
import EmptyStudies from './EmptyStudies';
import ErrorBoundary from './ErrorBoundary';
-import Icon, { addIcon } from './Icon';
+import Icon from './Icon';
import IconButton from './IconButton';
import Input from './Input';
import InputDateRange from './InputDateRange';
@@ -89,7 +89,6 @@ export {
ExpandableToolbarButton,
ListMenu,
Icon,
- addIcon,
IconButton,
Input,
InputDateRange,
diff --git a/platform/ui/src/index.js b/platform/ui/src/index.js
index e5dca106c..54814bb7d 100644
--- a/platform/ui/src/index.js
+++ b/platform/ui/src/index.js
@@ -54,6 +54,7 @@ export {
Icon,
IconButton,
Input,
+ InputRange,
InputDateRange,
InputGroup,
InputLabelWrapper,