Conditionally show left/right and userinfo for active viewport

This commit is contained in:
dannyrb 2020-06-16 00:56:54 -04:00
parent 27e62949ce
commit 6e65e7eaf5
2 changed files with 127 additions and 92 deletions

View File

@ -27,7 +27,10 @@ function TrackedCornerstoneViewport({
viewportIndex, viewportIndex,
}) { }) {
const [trackedMeasurements] = useTrackedMeasurements(); const [trackedMeasurements] = useTrackedMeasurements();
const [{ viewports }, dispatchViewportGrid] = useViewportGrid(); const [
{ activeViewportIndex, viewports },
dispatchViewportGrid,
] = useViewportGrid();
// viewportIndex, onSubmit // viewportIndex, onSubmit
const [viewportDialogState, viewportDialogApi] = useViewportDialog(); const [viewportDialogState, viewportDialogApi] = useViewportDialog();
const [viewportData, setViewportData] = useState(null); const [viewportData, setViewportData] = useState(null);
@ -132,6 +135,8 @@ function TrackedCornerstoneViewport({
<> <>
<ViewportActionBar <ViewportActionBar
onSeriesChange={direction => alert(`Series ${direction}`)} onSeriesChange={direction => alert(`Series ${direction}`)}
showPatientInfo={viewportIndex === activeViewportIndex}
showNavArrows={viewportIndex === activeViewportIndex}
studyData={{ studyData={{
label: _viewportLabels[firstViewportIndexWithMatchingDisplaySetUid], label: _viewportLabels[firstViewportIndexWithMatchingDisplaySetUid],
isTracked: trackedSeries.includes(SeriesInstanceUID), isTracked: trackedSeries.includes(SeriesInstanceUID),

View File

@ -10,7 +10,12 @@ const classes = {
row: 'flex flex-col ml-4', row: 'flex flex-col ml-4',
}; };
const ViewportActionBar = ({ studyData, onSeriesChange }) => { const ViewportActionBar = ({
studyData,
showNavArrows,
showPatientInfo,
onSeriesChange,
}) => {
const { const {
label, label,
isTracked, isTracked,
@ -106,102 +111,47 @@ const ViewportActionBar = ({ studyData, onSeriesChange }) => {
</div> </div>
</div> </div>
</div> </div>
<div className="ml-2"> {showNavArrows && (
<ButtonGroup> <div className="ml-2">
<Button <ButtonGroup>
size="initial" <Button
className="px-2 py-1" size="initial"
onClick={() => onSeriesChange('left')} className="px-2 py-1"
> onClick={() => onSeriesChange('left')}
<Icon name="chevron-left" className="w-4 text-white" /> >
</Button> <Icon name="chevron-left" className="w-4 text-white" />
<Button </Button>
size="initial" <Button
className="px-2 py-1" size="initial"
onClick={() => onSeriesChange('right')} className="px-2 py-1"
> onClick={() => onSeriesChange('right')}
<Icon name="chevron-right" className="w-4 text-white" /> >
</Button> <Icon name="chevron-right" className="w-4 text-white" />
</ButtonGroup> </Button>
</div> </ButtonGroup>
<div className="flex ml-4 mr-2"> </div>
<Tooltip )}
position="bottom-right" {showPatientInfo && (
content={ <div className="flex ml-4 mr-2">
<div className="flex py-2"> <PatientInfo
<div className="flex pt-1"> patientName={patientName}
<Icon name="info-link" className="w-4 text-primary-main" /> patientSex={patientSex}
</div> patientAge={patientAge}
<div className="flex flex-col ml-2"> MRN={MRN}
<span className="text-base font-bold text-white"> thickness={thickness}
{patientName} spacing={spacing}
</span> scanner={scanner}
<div className="flex pb-4 mt-4 mb-4 border-b border-secondary-main"> />
<div className={classnames(classes.firstRow)}> </div>
<span className={classnames(classes.infoHeader)}>Sex</span> )}
<span className={classnames(classes.infoText)}>
{patientSex}
</span>
</div>
<div className={classnames(classes.row)}>
<span className={classnames(classes.infoHeader)}>Age</span>
<span className={classnames(classes.infoText)}>
{patientAge}
</span>
</div>
<div className={classnames(classes.row)}>
<span className={classnames(classes.infoHeader)}>MRN</span>
<span className={classnames(classes.infoText)}>{MRN}</span>
</div>
</div>
<div className="flex">
<div className={classnames(classes.firstRow)}>
<span className={classnames(classes.infoHeader)}>
Thickness
</span>
<span className={classnames(classes.infoText)}>
{thickness}
</span>
</div>
<div className={classnames(classes.row)}>
<span className={classnames(classes.infoHeader)}>
Spacing
</span>
<span className={classnames(classes.infoText)}>
{spacing}
</span>
</div>
<div className={classnames(classes.row)}>
<span className={classnames(classes.infoHeader)}>
Scanner
</span>
<span className={classnames(classes.infoText)}>
{scanner}
</span>
</div>
</div>
</div>
</div>
}
>
<div className="relative flex justify-end">
<div className="relative">
<Icon name="profile" className="w-5 text-white" />
<Icon
name="info-link"
className="absolute w-5 text-white bg-black"
style={{ right: -7, bottom: -10 }}
/>
</div>
</div>
</Tooltip>
</div>
</div> </div>
); );
}; };
ViewportActionBar.propTypes = { ViewportActionBar.propTypes = {
onSeriesChange: PropTypes.func.isRequired, onSeriesChange: PropTypes.func.isRequired,
showNavArrows: PropTypes.bool,
showPatientInfo: PropTypes.bool,
studyData: PropTypes.shape({ studyData: PropTypes.shape({
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,
isTracked: PropTypes.bool.isRequired, isTracked: PropTypes.bool.isRequired,
@ -222,4 +172,84 @@ ViewportActionBar.propTypes = {
}).isRequired, }).isRequired,
}; };
ViewportActionBar.defaultProps = {
showNavArrows: true,
showPatientInfo: true,
};
function PatientInfo({
patientName,
patientSex,
patientAge,
MRN,
thickness,
spacing,
scanner,
}) {
return (
<Tooltip
position="bottom-right"
content={
<div className="flex py-2">
<div className="flex pt-1">
<Icon name="info-link" className="w-4 text-primary-main" />
</div>
<div className="flex flex-col ml-2">
<span className="text-base font-bold text-white">
{patientName}
</span>
<div className="flex pb-4 mt-4 mb-4 border-b border-secondary-main">
<div className={classnames(classes.firstRow)}>
<span className={classnames(classes.infoHeader)}>Sex</span>
<span className={classnames(classes.infoText)}>
{patientSex}
</span>
</div>
<div className={classnames(classes.row)}>
<span className={classnames(classes.infoHeader)}>Age</span>
<span className={classnames(classes.infoText)}>
{patientAge}
</span>
</div>
<div className={classnames(classes.row)}>
<span className={classnames(classes.infoHeader)}>MRN</span>
<span className={classnames(classes.infoText)}>{MRN}</span>
</div>
</div>
<div className="flex">
<div className={classnames(classes.firstRow)}>
<span className={classnames(classes.infoHeader)}>
Thickness
</span>
<span className={classnames(classes.infoText)}>
{thickness}
</span>
</div>
<div className={classnames(classes.row)}>
<span className={classnames(classes.infoHeader)}>Spacing</span>
<span className={classnames(classes.infoText)}>{spacing}</span>
</div>
<div className={classnames(classes.row)}>
<span className={classnames(classes.infoHeader)}>Scanner</span>
<span className={classnames(classes.infoText)}>{scanner}</span>
</div>
</div>
</div>
</div>
}
>
<div className="relative flex justify-end">
<div className="relative">
<Icon name="profile" className="w-5 text-white" />
<Icon
name="info-link"
className="absolute w-5 text-white bg-black"
style={{ right: -7, bottom: -10 }}
/>
</div>
</div>
</Tooltip>
);
}
export default ViewportActionBar; export default ViewportActionBar;