2020-04-02 21:32:27 +02:00
|
|
|
import React, { useState } from 'react';
|
2020-03-13 03:27:48 +01:00
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
|
import classnames from 'classnames';
|
|
|
|
|
|
2020-03-05 22:11:25 +01:00
|
|
|
import Header from './components/Header';
|
|
|
|
|
import StudyListFilter from './components/StudyListFilter';
|
|
|
|
|
import StudyListTable from './components/StudyListTable';
|
|
|
|
|
import StudyListPagination from './components/StudyListPagination';
|
|
|
|
|
|
2020-03-13 16:02:04 +01:00
|
|
|
const filtersMeta = [
|
|
|
|
|
{
|
|
|
|
|
name: 'patientName',
|
|
|
|
|
displayName: 'Patient Name',
|
2020-03-27 20:28:36 +01:00
|
|
|
inputType: 'Text',
|
2020-03-13 16:02:04 +01:00
|
|
|
isSortable: true,
|
|
|
|
|
gridCol: 4,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'mrn',
|
|
|
|
|
displayName: 'MRN',
|
2020-03-27 20:28:36 +01:00
|
|
|
inputType: 'Text',
|
2020-03-13 16:02:04 +01:00
|
|
|
isSortable: true,
|
|
|
|
|
gridCol: 2,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'studyDate',
|
|
|
|
|
displayName: 'Study date',
|
2020-03-27 20:28:36 +01:00
|
|
|
inputType: 'DateRange',
|
2020-03-13 16:02:04 +01:00
|
|
|
isSortable: true,
|
2020-03-19 23:58:13 +01:00
|
|
|
gridCol: 5,
|
2020-03-13 16:02:04 +01:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'description',
|
|
|
|
|
displayName: 'Description',
|
2020-03-27 20:28:36 +01:00
|
|
|
inputType: 'Text',
|
2020-03-13 16:02:04 +01:00
|
|
|
isSortable: true,
|
2020-03-19 23:58:13 +01:00
|
|
|
gridCol: 4,
|
2020-03-13 16:02:04 +01:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'modality',
|
|
|
|
|
displayName: 'Modality',
|
2020-03-27 20:28:36 +01:00
|
|
|
inputType: 'MultiSelect',
|
|
|
|
|
inputProps: {
|
|
|
|
|
options: [
|
|
|
|
|
{ value: 'SEG', label: 'SEG' },
|
|
|
|
|
{ value: 'CT', label: 'CT' },
|
|
|
|
|
{ value: 'MR', label: 'MR' },
|
|
|
|
|
{ value: 'SR', label: 'SR' },
|
|
|
|
|
],
|
|
|
|
|
},
|
2020-03-13 16:02:04 +01:00
|
|
|
isSortable: true,
|
|
|
|
|
gridCol: 3,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'accession',
|
|
|
|
|
displayName: 'Accession',
|
2020-03-27 20:28:36 +01:00
|
|
|
inputType: 'Text',
|
2020-03-13 16:02:04 +01:00
|
|
|
isSortable: true,
|
|
|
|
|
gridCol: 4,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'instances',
|
|
|
|
|
displayName: 'Instances',
|
2020-03-27 20:28:36 +01:00
|
|
|
inputType: 'None',
|
|
|
|
|
isSortable: true,
|
2020-03-19 23:58:13 +01:00
|
|
|
gridCol: 2,
|
2020-03-13 16:02:04 +01:00
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
2020-04-02 21:32:27 +02:00
|
|
|
const defaultFilterValues = {
|
2020-03-27 20:28:36 +01:00
|
|
|
patientName: '',
|
|
|
|
|
mrn: '',
|
|
|
|
|
studyDate: {
|
|
|
|
|
startDate: null,
|
|
|
|
|
endDate: null,
|
|
|
|
|
},
|
|
|
|
|
description: '',
|
|
|
|
|
modality: undefined,
|
|
|
|
|
accession: '',
|
|
|
|
|
sortBy: '',
|
|
|
|
|
sortDirection: 'none',
|
|
|
|
|
page: 0,
|
|
|
|
|
resultsPerPage: 25,
|
|
|
|
|
};
|
|
|
|
|
|
2020-04-02 21:32:27 +02:00
|
|
|
const isFiltering = (filterValues, defaultFilterValues) => {
|
|
|
|
|
return Object.keys(defaultFilterValues).some(name => {
|
|
|
|
|
return filterValues[name] !== defaultFilterValues[name];
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2020-03-13 03:27:48 +01:00
|
|
|
const StudyList = ({ studies, perPage }) => {
|
2020-04-02 21:32:27 +02:00
|
|
|
const [filterValues, setFilterValues] = useState(defaultFilterValues);
|
2020-03-13 03:27:48 +01:00
|
|
|
const studiesData = studies.slice(0, perPage);
|
|
|
|
|
const numOfStudies = studies.length;
|
|
|
|
|
const isEmptyStudies = numOfStudies === 0;
|
2020-04-02 21:32:27 +02:00
|
|
|
|
2020-03-05 22:11:25 +01:00
|
|
|
return (
|
2020-03-13 03:27:48 +01:00
|
|
|
<div
|
|
|
|
|
className={classnames('bg-black h-full', {
|
|
|
|
|
'h-screen': isEmptyStudies,
|
|
|
|
|
})}
|
|
|
|
|
>
|
2020-03-16 16:34:01 +01:00
|
|
|
<Header />
|
2020-03-27 20:28:36 +01:00
|
|
|
<StudyListFilter
|
|
|
|
|
numOfStudies={numOfStudies}
|
|
|
|
|
filtersMeta={filtersMeta}
|
2020-04-02 21:32:27 +02:00
|
|
|
filterValues={filterValues}
|
|
|
|
|
setFilterValues={setFilterValues}
|
|
|
|
|
clearFilters={() => setFilterValues(defaultFilterValues)}
|
|
|
|
|
isFiltering={isFiltering(filterValues, defaultFilterValues)}
|
2020-03-27 20:28:36 +01:00
|
|
|
/>
|
2020-03-13 16:02:04 +01:00
|
|
|
<StudyListTable
|
|
|
|
|
studies={studiesData}
|
|
|
|
|
numOfStudies={numOfStudies}
|
|
|
|
|
filtersMeta={filtersMeta}
|
|
|
|
|
/>
|
2020-03-13 03:27:48 +01:00
|
|
|
{!isEmptyStudies && <StudyListPagination />}
|
2020-03-05 22:11:25 +01:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2020-03-13 03:27:48 +01:00
|
|
|
StudyList.defaultProps = {
|
|
|
|
|
studies: [],
|
|
|
|
|
perPage: 25,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
StudyList.propTypes = {
|
|
|
|
|
studies: PropTypes.array,
|
|
|
|
|
perPage: PropTypes.number,
|
|
|
|
|
};
|
|
|
|
|
|
2020-03-05 22:11:25 +01:00
|
|
|
export default StudyList;
|