Add simple loading and default state to datasourcewrapper (#1815)
This commit is contained in:
parent
1d8f5cfc42
commit
101efa4cf4
@ -3,12 +3,13 @@ import PropTypes from 'prop-types';
|
|||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import { Icon, Typography } from '@ohif/ui';
|
import { Icon, Typography } from '@ohif/ui';
|
||||||
|
|
||||||
const EmptyStudies = ({ className }) => {
|
// TODO: Add loading spinner to OHIF + use it here.
|
||||||
|
const EmptyStudies = ({ className, isLoading }) => {
|
||||||
return (
|
return (
|
||||||
<div className={classnames('flex-col inline-flex items-center', className)}>
|
<div className={classnames('flex-col inline-flex items-center', className)}>
|
||||||
<Icon name="magnifier" className="mb-4" />
|
<Icon name="magnifier" className="mb-4" />
|
||||||
<Typography className="text-primary-light" variant="h5">
|
<Typography className="text-primary-light" variant="h5">
|
||||||
No studies available
|
{!isLoading ? 'No studies available' : 'Loading...'}
|
||||||
</Typography>
|
</Typography>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -46,14 +46,17 @@ function DataSourceWrapper(props) {
|
|||||||
// studies.processResults --> <LayoutTemplate studies={} />
|
// studies.processResults --> <LayoutTemplate studies={} />
|
||||||
// But only for LayoutTemplate type of 'list'?
|
// But only for LayoutTemplate type of 'list'?
|
||||||
// Or no data fetching here, and just hand down my source
|
// Or no data fetching here, and just hand down my source
|
||||||
const [data, setData] = useState();
|
const [data, setData] = useState([]);
|
||||||
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// 204: no content
|
// 204: no content
|
||||||
async function getData() {
|
async function getData() {
|
||||||
|
setIsLoading(true);
|
||||||
const searchResults = await dataSource.query.studies.search(
|
const searchResults = await dataSource.query.studies.search(
|
||||||
queryFilterValues
|
queryFilterValues
|
||||||
);
|
);
|
||||||
setData(searchResults);
|
setData(searchResults);
|
||||||
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -61,23 +64,19 @@ function DataSourceWrapper(props) {
|
|||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
console.warn(ex);
|
console.warn(ex);
|
||||||
}
|
}
|
||||||
console.log('DataSourceWrapper: useEffect');
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [history.location.search]);
|
}, [history.location.search]);
|
||||||
// queryFilterValues
|
// queryFilterValues
|
||||||
|
|
||||||
// TODO: Better way to pass DataSource?
|
// TODO: Better way to pass DataSource?
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<LayoutTemplate
|
||||||
{data && (
|
{...rest}
|
||||||
<LayoutTemplate
|
history={history}
|
||||||
{...rest}
|
data={data}
|
||||||
history={history}
|
dataSource={dataSource}
|
||||||
data={data}
|
isLoadingData={isLoading}
|
||||||
dataSource={dataSource}
|
/>
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</React.Fragment>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { Suspense, 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';
|
||||||
@ -28,15 +28,13 @@ const seriesInStudiesMap = new Map();
|
|||||||
* TODO:
|
* TODO:
|
||||||
* - debounce `setFilterValues` (150ms?)
|
* - debounce `setFilterValues` (150ms?)
|
||||||
*/
|
*/
|
||||||
function WorkList({ history, data: studies, dataSource }) {
|
function WorkList({ history, data: studies, isLoadingData, dataSource }) {
|
||||||
// ~ Modes
|
// ~ Modes
|
||||||
const [appConfig] = useAppConfig();
|
const [appConfig] = useAppConfig();
|
||||||
// ~ Filters
|
// ~ Filters
|
||||||
const query = useQuery();
|
const query = useQuery();
|
||||||
const queryFilterValues = _getQueryFilterValues(query);
|
const queryFilterValues = _getQueryFilterValues(query);
|
||||||
const [filterValues, _setFilterValues] = useState(
|
const [filterValues, _setFilterValues] = useState({ ...defaultFilterValues, ...queryFilterValues });
|
||||||
Object.assign({}, defaultFilterValues, queryFilterValues)
|
|
||||||
);
|
|
||||||
const debouncedFilterValues = useDebounce(filterValues, 200);
|
const debouncedFilterValues = useDebounce(filterValues, 200);
|
||||||
const { resultsPerPage, pageNumber, sortBy, sortDirection } = filterValues;
|
const { resultsPerPage, pageNumber, sortBy, sortDirection } = filterValues;
|
||||||
|
|
||||||
@ -80,6 +78,7 @@ function WorkList({ history, data: studies, dataSource }) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
// ~ Rows & Studies
|
// ~ Rows & Studies
|
||||||
const [expandedRows, setExpandedRows] = useState([]);
|
const [expandedRows, setExpandedRows] = useState([]);
|
||||||
const [studiesWithSeriesData, setStudiesWithSeriesData] = useState([]);
|
const [studiesWithSeriesData, setStudiesWithSeriesData] = useState([]);
|
||||||
@ -190,6 +189,7 @@ function WorkList({ history, data: studies, dataSource }) {
|
|||||||
return filterValues[name] !== defaultFilterValues[name];
|
return filterValues[name] !== defaultFilterValues[name];
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const tableDataSource = sortedStudies.map((study, key) => {
|
const tableDataSource = sortedStudies.map((study, key) => {
|
||||||
const rowKey = key + 1;
|
const rowKey = key + 1;
|
||||||
const isExpanded = expandedRows.some(k => k === rowKey);
|
const isExpanded = expandedRows.some(k => k === rowKey);
|
||||||
@ -211,8 +211,8 @@ function WorkList({ history, data: studies, dataSource }) {
|
|||||||
content: patientName ? (
|
content: patientName ? (
|
||||||
patientName
|
patientName
|
||||||
) : (
|
) : (
|
||||||
<span className="text-gray-700">(Empty)</span>
|
<span className="text-gray-700">(Empty)</span>
|
||||||
),
|
),
|
||||||
title: patientName,
|
title: patientName,
|
||||||
gridCol: 4,
|
gridCol: 4,
|
||||||
},
|
},
|
||||||
@ -299,13 +299,13 @@ function WorkList({ history, data: studies, dataSource }) {
|
|||||||
seriesTableDataSource={
|
seriesTableDataSource={
|
||||||
seriesInStudiesMap.has(studyInstanceUid)
|
seriesInStudiesMap.has(studyInstanceUid)
|
||||||
? seriesInStudiesMap.get(studyInstanceUid).map(s => {
|
? seriesInStudiesMap.get(studyInstanceUid).map(s => {
|
||||||
return {
|
return {
|
||||||
description: s.description || '(empty)',
|
description: s.description || '(empty)',
|
||||||
seriesNumber: s.seriesNumber || '',
|
seriesNumber: s.seriesNumber || '',
|
||||||
modality: s.modality || '',
|
modality: s.modality || '',
|
||||||
instances: s.numSeriesInstances || '',
|
instances: s.numSeriesInstances || '',
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
: []
|
: []
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
@ -322,7 +322,7 @@ function WorkList({ history, data: studies, dataSource }) {
|
|||||||
<Link
|
<Link
|
||||||
key={i}
|
key={i}
|
||||||
to={`${mode.id}?StudyInstanceUIDs=${studyInstanceUid}`}
|
to={`${mode.id}?StudyInstanceUIDs=${studyInstanceUid}`}
|
||||||
// to={`${mode.id}/dicomweb?StudyInstanceUIDs=${studyInstanceUid}`}
|
// to={`${mode.id}/dicomweb?StudyInstanceUIDs=${studyInstanceUid}`}
|
||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
rounded="full"
|
rounded="full"
|
||||||
@ -368,7 +368,7 @@ function WorkList({ history, data: studies, dataSource }) {
|
|||||||
variant="text"
|
variant="text"
|
||||||
color="inherit"
|
color="inherit"
|
||||||
className="text-primary-active"
|
className="text-primary-active"
|
||||||
onClick={() => {}}
|
onClick={() => { }}
|
||||||
>
|
>
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<Icon name="settings" />
|
<Icon name="settings" />
|
||||||
@ -403,10 +403,10 @@ function WorkList({ history, data: studies, dataSource }) {
|
|||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex flex-col items-center justify-center pt-48">
|
<div className="flex flex-col items-center justify-center pt-48">
|
||||||
<EmptyStudies />
|
<EmptyStudies isLoading={isLoadingData} />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user