Add simple loading and default state to datasourcewrapper (#1815)

This commit is contained in:
Igor Octaviano 2020-06-26 11:08:16 -03:00 committed by GitHub
parent 1d8f5cfc42
commit 101efa4cf4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 34 deletions

View File

@ -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>
); );

View File

@ -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>
); );
} }

View File

@ -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>
); );
} }