ohif-viewer/platform/ui/src/components/StudyBrowser/StudyBrowser.jsx

161 lines
4.7 KiB
React
Raw Normal View History

import React, { useState } from 'react';
2020-04-21 20:12:46 +02:00
import PropTypes from 'prop-types';
import classnames from 'classnames';
import { ButtonGroup, Button, StudyItem, ThumbnailList } from '@ohif/ui';
2020-04-14 00:35:32 +02:00
const buttonClasses = 'text-white text-base border-none bg-black p-2 min-w-18';
const activeButtonClasses = 'bg-primary-main';
const getInitialActiveTab = tabs => {
2020-04-21 20:12:46 +02:00
return tabs && tabs[0] && tabs[0].name;
};
const getTrackedSeries = displaySets => {
let trackedSeries = 0;
displaySets.forEach(displaySet => {
if (displaySet.isTracked) {
trackedSeries++;
}
});
return trackedSeries;
};
2020-05-15 10:05:40 +02:00
const StudyBrowser = ({ tabs, onClickStudy, onClickThumbnail }) => {
2020-04-21 20:12:46 +02:00
const [tabActive, setTabActive] = useState(getInitialActiveTab(tabs));
const [studyActive, setStudyActive] = useState(null);
2020-04-21 20:12:46 +02:00
const getTabContent = () => {
const tabData = tabs.find(tab => tab.name === tabActive);
2020-04-21 20:12:46 +02:00
if (!tabData || !tabData.studies || !Array.isArray(tabData.studies)) {
return;
}
return tabData.studies.map(
({
studyInstanceUid,
studyDate,
studyDescription,
instances,
modalities,
displaySets,
2020-04-21 20:12:46 +02:00
}) => {
const isActive = studyActive === studyInstanceUid;
return (
<React.Fragment key={studyInstanceUid}>
<StudyItem
studyDate={studyDate}
studyDescription={studyDescription}
instances={instances}
modalities={modalities}
trackedSeries={getTrackedSeries(displaySets)}
2020-04-21 20:12:46 +02:00
isActive={isActive}
onClick={() => {
setStudyActive(isActive ? null : studyInstanceUid);
2020-05-15 10:05:40 +02:00
if (onClickStudy) {
onClickStudy(studyInstanceUid);
}
2020-04-21 20:12:46 +02:00
}}
/>
2020-05-15 10:05:40 +02:00
{isActive && displaySets && (
<ThumbnailList
thumbnails={displaySets}
thumbnailActive={thumbnailActive}
onThumbnailClick={thumbnailId => {
setThumbnailActive(
thumbnailId === thumbnailActive ? null : thumbnailId
);
if (onClickThumbnail) {
// TODO: what is thumbnailId? Should pass display set instead
onClickThumbnail(thumbnailId);
}
}}
/>
2020-04-21 20:12:46 +02:00
)}
</React.Fragment>
);
}
);
};
return (
<React.Fragment>
<div className="flex flex-row items-center justify-center border-b w-100 h-16 border-secondary-light p-4 bg-primary-dark">
<ButtonGroup
variant="outlined"
color="inherit"
className="border border-secondary-light rounded-md"
>
{tabs.map(tab => {
2020-04-21 20:12:46 +02:00
const { name, label } = tab;
const isActive = tabActive === name;
return (
<Button
2020-04-21 20:12:46 +02:00
key={name}
className={classnames(
buttonClasses,
isActive && activeButtonClasses
)}
2020-04-14 00:35:32 +02:00
size="initial"
onClick={() => {
2020-04-21 20:12:46 +02:00
setTabActive(name);
setStudyActive(null);
}}
>
2020-04-21 20:12:46 +02:00
{label}
</Button>
);
})}
</ButtonGroup>
</div>
<div className="flex flex-col flex-1 overflow-auto invisible-scrollbar">
2020-04-21 20:12:46 +02:00
{getTabContent()}
</div>
</React.Fragment>
);
};
2020-04-21 20:12:46 +02:00
StudyBrowser.propTypes = {
2020-05-15 10:05:40 +02:00
onClickStudy: PropTypes.func,
onClickThumbnail: PropTypes.func,
2020-04-21 20:12:46 +02:00
tabs: PropTypes.arrayOf(
PropTypes.shape({
name: PropTypes.string.isRequired,
label: PropTypes.string.isRequired,
studies: PropTypes.arrayOf(
PropTypes.shape({
studyInstanceUid: PropTypes.string.isRequired,
date: PropTypes.string,
numInstances: PropTypes.number,
modality: PropTypes.string,
description: PropTypes.string,
displaySets: PropTypes.arrayOf(
PropTypes.shape({
displaySetInstanceUid: PropTypes.string.isRequired,
imageSrc: PropTypes.string,
imageAltText: PropTypes.string,
seriesDate: PropTypes.string,
seriesNumber: PropTypes.number,
numInstances: PropTypes.number,
description: PropTypes.string,
componentType: PropTypes.oneOf([
'thumbnail',
'thumbnailTracked',
'thumbnailNoImage',
]).isRequired,
isTracked: PropTypes.bool,
viewportIdentificator: PropTypes.string,
})
),
})
).isRequired,
})
),
};
export default StudyBrowser;