diff --git a/extensions/default/src/DicomWebDataSource/qido.js b/extensions/default/src/DicomWebDataSource/qido.js index 19d53f27b..a728e442a 100644 --- a/extensions/default/src/DicomWebDataSource/qido.js +++ b/extensions/default/src/DicomWebDataSource/qido.js @@ -37,22 +37,12 @@ const { getString, getName, getModalities } = DICOMWeb; * @returns {Array} An array of Study MetaData objects */ function processResults(qidoStudies) { - debugger; if (!qidoStudies || !qidoStudies.length) { return []; } const studies = []; - // LIST - // AccessionNumber, - // Modalities, - // Instances, - // StudyDescription, - // PatientId, - // PatientName, - // StudyDate, - qidoStudies.forEach(qidoStudy => studies.push({ studyInstanceUid: getString(qidoStudy['0020000D']), @@ -140,10 +130,10 @@ function mapParams(params) { AccessionNumber: params.accessionNumber, StudyDescription: params.studyDescription, ModalitiesInStudy: params.modalitiesInStudy, - limit: params.limit, - offset: params.offset, - fuzzymatching: params.fuzzymatching, - includefield: serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all', + limit: params.limit || 101, + offset: params.offset || 0, + fuzzymatching: params.fuzzymatching === undefined ? false : true, + includefield: commaSeparatedFields, // serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all', }; // build the StudyDate range parameter @@ -162,14 +152,14 @@ function mapParams(params) { } // Clean query params of undefined values. - // const params = {}; + const final = {}; Object.keys(parameters).forEach(key => { if (parameters[key] !== undefined && parameters[key] !== '') { - params[key] = parameters[key]; + final[key] = parameters[key]; } }); - return params; + return final; } /** diff --git a/platform/viewer/src/routes/DataSourceWrapper.jsx b/platform/viewer/src/routes/DataSourceWrapper.jsx index 55b33058e..53c262a26 100644 --- a/platform/viewer/src/routes/DataSourceWrapper.jsx +++ b/platform/viewer/src/routes/DataSourceWrapper.jsx @@ -4,6 +4,7 @@ import PropTypes from 'prop-types'; import { MODULE_TYPES } from '@ohif/core'; // import { appConfig, extensionManager } from '../App.js'; +import { useQuery } from './../hooks'; /** * Uses route properties to determine the data source that should be passed @@ -15,6 +16,9 @@ import { appConfig, extensionManager } from '../App.js'; */ function DataSourceWrapper(props) { const { children: LayoutTemplate, ...rest } = props; + const query = useQuery(); + const queryFilterValues = _getQueryFilterValues(query); + // TODO: Fetch by type, name, etc? const dataSourceModules = extensionManager.modules[MODULE_TYPES.DATA_SOURCE]; // TODO: Good usecase for flatmap? @@ -44,16 +48,28 @@ function DataSourceWrapper(props) { // studies.processResults --> // But only for LayoutTemplate type of 'list'? // Or no data fetching here, and just hand down my source - - debugger; const [data, setData] = useState(); useEffect(() => { + + // 204: no content async function getData() { - const searchResult = await dataSource.query.studies.search(); + const searchResult = await dataSource.query.studies.search({ + patientName: queryFilterValues.patientName, + }); setData(searchResult); } - getData(); - }, [dataSource.query.studies]); + + try { + getData(); + } catch (ex) { + console.warn(ex); + + } + console.log('DataSourceWrapper: useEffect'); + }, []); + // queryFilterValues + + console.log(rest); return ( @@ -68,3 +84,62 @@ DataSourceWrapper.propTypes = { }; export default DataSourceWrapper; + +/** + * Duplicated in `studyListContainer` + * Need generic that can be shared? Isn't this what qs is for? + * @param {*} query + */ +function _getQueryFilterValues(query) { + const queryFilterValues = { + patientName: query.get('patientName'), + // mrn: query.get('mrn'), patientId? + studyDate: _tryParseDates(query.get('studyDate'), undefined), + studyDescription: query.get('description'), + modalitiesInStudy: _tryParseJson(query.get('modality'), undefined), + accessionNumber: query.get('accession'), + sortBy: query.get('soryBy'), + sortDirection: query.get('sortDirection'), + page: _tryParseInt(query.get('page'), undefined), + resultsPerPage: _tryParseInt(query.get('resultsPerPage'), undefined), + }; + + // Delete null/undefined keys + Object.keys(queryFilterValues).forEach( + key => queryFilterValues[key] == null && delete queryFilterValues[key] + ); + + return queryFilterValues; + + function _tryParseInt(str, defaultValue) { + var retValue = defaultValue; + if (str !== null) { + if (str.length > 0) { + if (!isNaN(str)) { + retValue = parseInt(str); + } + } + } + return retValue; + } + + function _tryParseJson(str, defaultValue) { + return str ? JSON.parse(str) : defaultValue; + } + + function _tryParseDates(str, defaultValue) { + const studyDateObject = _tryParseJson(str, defaultValue); + + if (studyDateObject) { + studyDateObject.startDate = studyDateObject.startDate + ? moment(new Date(studyDateObject.startDate)) + : undefined; + + studyDateObject.endDate = studyDateObject.endDate + ? moment(new Date(studyDateObject.endDate)) + : undefined; + } + + return studyDateObject; + } +}