Use dataSource to query for, and wire up, series data
This commit is contained in:
parent
4dccefb21f
commit
734bd9803d
@ -1,6 +1,6 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import propTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import qs from 'query-string';
|
import qs from 'query-string';
|
||||||
@ -24,7 +24,7 @@ import {
|
|||||||
* TODO:
|
* TODO:
|
||||||
* - debounce `setFilterValues` (150ms?)
|
* - debounce `setFilterValues` (150ms?)
|
||||||
*/
|
*/
|
||||||
function StudyListContainer({ history, data: studies }) {
|
function StudyListContainer({ history, data: studies, dataSource }) {
|
||||||
// ~ Filters
|
// ~ Filters
|
||||||
const query = useQuery();
|
const query = useQuery();
|
||||||
const queryFilterValues = _getQueryFilterValues(query);
|
const queryFilterValues = _getQueryFilterValues(query);
|
||||||
@ -35,6 +35,7 @@ function StudyListContainer({ history, data: studies }) {
|
|||||||
const { resultsPerPage, pageNumber, sortBy, sortDirection } = filterValues;
|
const { resultsPerPage, pageNumber, sortBy, sortDirection } = filterValues;
|
||||||
// ~ Rows & Studies
|
// ~ Rows & Studies
|
||||||
const [expandedRows, setExpandedRows] = useState([]);
|
const [expandedRows, setExpandedRows] = useState([]);
|
||||||
|
const [seriesInStudies, setSeriesInStudies] = useState({});
|
||||||
const numOfStudies = studies.length;
|
const numOfStudies = studies.length;
|
||||||
const totalPages = Math.floor(numOfStudies / resultsPerPage);
|
const totalPages = Math.floor(numOfStudies / resultsPerPage);
|
||||||
|
|
||||||
@ -61,6 +62,7 @@ function StudyListContainer({ history, data: studies }) {
|
|||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
// Sync URL query parameters with filters
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!debouncedFilterValues) {
|
if (!debouncedFilterValues) {
|
||||||
return;
|
return;
|
||||||
@ -98,6 +100,36 @@ function StudyListContainer({ history, data: studies }) {
|
|||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [debouncedFilterValues]);
|
}, [debouncedFilterValues]);
|
||||||
|
|
||||||
|
// Query for series information
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchSeries = async studyInstanceUid => {
|
||||||
|
try {
|
||||||
|
const expandedStudiesSeriesList = {};
|
||||||
|
|
||||||
|
expandedStudiesSeriesList[
|
||||||
|
studyInstanceUid
|
||||||
|
] = await dataSource.query.series.search(studyInstanceUid);
|
||||||
|
|
||||||
|
setSeriesInStudies(
|
||||||
|
Object.assign({}, seriesInStudies, expandedStudiesSeriesList)
|
||||||
|
);
|
||||||
|
} catch (ex) {
|
||||||
|
// TODO: UI Notification Service
|
||||||
|
console.warn(ex);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (let z = 0; z < expandedRows.length; z++) {
|
||||||
|
const studyInstanceUid = studies[z].studyInstanceUid;
|
||||||
|
if (seriesInStudies[studyInstanceUid]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fetchSeries(studyInstanceUid);
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [expandedRows, studies]);
|
||||||
|
|
||||||
const filtersMeta = [
|
const filtersMeta = [
|
||||||
{
|
{
|
||||||
name: 'patientName',
|
name: 'patientName',
|
||||||
@ -206,6 +238,7 @@ function StudyListContainer({ history, data: studies }) {
|
|||||||
const rowKey = key + 1;
|
const rowKey = key + 1;
|
||||||
const isExpanded = expandedRows.some(k => k === rowKey);
|
const isExpanded = expandedRows.some(k => k === rowKey);
|
||||||
const {
|
const {
|
||||||
|
studyInstanceUid,
|
||||||
accession,
|
accession,
|
||||||
modalities,
|
modalities,
|
||||||
instances,
|
instances,
|
||||||
@ -214,25 +247,7 @@ function StudyListContainer({ history, data: studies }) {
|
|||||||
patientName,
|
patientName,
|
||||||
date,
|
date,
|
||||||
time,
|
time,
|
||||||
// ??
|
|
||||||
// TODO: won't have until expanded
|
|
||||||
series = [],
|
|
||||||
} = study;
|
} = study;
|
||||||
const seriesTableColumns = {
|
|
||||||
description: 'Description',
|
|
||||||
seriesNumber: 'Series',
|
|
||||||
modality: 'Modality',
|
|
||||||
Instances: 'Instances',
|
|
||||||
};
|
|
||||||
const seriesTableDataSource = series.map(seriesItem => {
|
|
||||||
const { SeriesNumber, Modality, instances } = seriesItem;
|
|
||||||
return {
|
|
||||||
description: 'Patient Protocol',
|
|
||||||
seriesNumber: SeriesNumber,
|
|
||||||
modality: Modality,
|
|
||||||
Instances: instances.length,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
return {
|
return {
|
||||||
row: [
|
row: [
|
||||||
{
|
{
|
||||||
@ -322,8 +337,24 @@ function StudyListContainer({ history, data: studies }) {
|
|||||||
],
|
],
|
||||||
expandedContent: (
|
expandedContent: (
|
||||||
<StudyListExpandedRow
|
<StudyListExpandedRow
|
||||||
seriesTableColumns={seriesTableColumns}
|
seriesTableColumns={{
|
||||||
seriesTableDataSource={seriesTableDataSource}
|
description: 'Description',
|
||||||
|
seriesNumber: 'Series',
|
||||||
|
modality: 'Modality',
|
||||||
|
instances: 'Instances',
|
||||||
|
}}
|
||||||
|
seriesTableDataSource={
|
||||||
|
seriesInStudies[studyInstanceUid]
|
||||||
|
? seriesInStudies[studyInstanceUid].map(s => {
|
||||||
|
return {
|
||||||
|
description: s.description || '(empty)',
|
||||||
|
seriesNumber: s.seriesNumber || '',
|
||||||
|
modality: s.modality || '',
|
||||||
|
instances: s.numSeriesInstances || '',
|
||||||
|
};
|
||||||
|
})
|
||||||
|
: []
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
rounded="full"
|
rounded="full"
|
||||||
@ -436,14 +467,13 @@ function StudyListContainer({ history, data: studies }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
StudyListContainer.propTypes = {
|
StudyListContainer.propTypes = {
|
||||||
history: propTypes.shape({
|
history: PropTypes.shape({
|
||||||
push: propTypes.func,
|
push: PropTypes.func,
|
||||||
}),
|
}).isRequired,
|
||||||
studies: propTypes.array,
|
data: PropTypes.array.isRequired,
|
||||||
};
|
dataSource: PropTypes.shape({
|
||||||
|
query: PropTypes.object.isRequired,
|
||||||
StudyListContainer.defaultProps = {
|
}).isRequired,
|
||||||
studies: [],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const defaultFilterValues = {
|
const defaultFilterValues = {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user