diff --git a/extensions/default/src/DicomWebDataSource/index.js b/extensions/default/src/DicomWebDataSource/index.js index 0999e6651..a25181556 100644 --- a/extensions/default/src/DicomWebDataSource/index.js +++ b/extensions/default/src/DicomWebDataSource/index.js @@ -1,5 +1,5 @@ import { api } from 'dicomweb-client'; -import { mapParams, search, processResults } from './qido.js'; +import { mapParams, search as qidoSearch, processResults } from './qido.js'; import { IWebApiDataSource } from '@ohif/core'; /** @@ -26,12 +26,24 @@ function createDicomWebApi(dicomWebConfig) { query: { studies: { mapParams: mapParams.bind(), - search: search.bind(undefined, dicomWebClient, null, null), + search: async function(origParams) { + const { studyInstanceUid, seriesInstanceUid, ...mappedParams } = + mapParams(origParams) || {}; + + const results = await qidoSearch( + dicomWebClient, + studyInstanceUid, + seriesInstanceUid, + mappedParams + ); + + return processResults(results); + }, processResults: processResults.bind(), }, instances: { search: (studyInstanceUid, queryParamaters) => - search.call( + qidoSearch.call( undefined, dicomWebClient, studyInstanceUid, diff --git a/extensions/default/src/DicomWebDataSource/qido.js b/extensions/default/src/DicomWebDataSource/qido.js index 8de52caca..19d53f27b 100644 --- a/extensions/default/src/DicomWebDataSource/qido.js +++ b/extensions/default/src/DicomWebDataSource/qido.js @@ -22,7 +22,7 @@ * | limit | {number} | * | offset | {number} | */ -import DICOMWeb from '@ohif/core'; +import { DICOMWeb } from '@ohif/core'; const { getString, getName, getModalities } = DICOMWeb; @@ -37,26 +37,36 @@ 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']), studyDate: getString(qidoStudy['00080020']), studyTime: getString(qidoStudy['00080030']), accessionNumber: getString(qidoStudy['00080050']), - referringPhysicianName: getString(qidoStudy['00080090']), + // referringPhysicianName: getString(qidoStudy['00080090']), patientName: getName(qidoStudy['00100010']), patientId: getString(qidoStudy['00100020']), - patientBirthdate: getString(qidoStudy['00100030']), - patientSex: getString(qidoStudy['00100040']), - studyId: getString(qidoStudy['00200010']), - numberOfStudyRelatedSeries: getString(qidoStudy['00201206']), - numberOfStudyRelatedInstances: getString(qidoStudy['00201208']), + // patientBirthdate: getString(qidoStudy['00100030']), + // patientSex: getString(qidoStudy['00100040']), + // studyId: getString(qidoStudy['00200010']), // mrn? + // numberOfStudyRelatedSeries: getString(qidoStudy['00201206']), + instances: getString(qidoStudy['00201208']), studyDescription: getString(qidoStudy['00081030']), modalities: getString( getModalities(qidoStudy['00080060'], qidoStudy['00080061']) @@ -82,13 +92,13 @@ function search( seriesInstanceUid, queryParamaters ) { - const requestFn = studyInstanceUid - ? dicomWebClient.searchForInstances - : dicomWebClient.searchForStudies; + // const requestFn = studyInstanceUid + // ? dicomWebClient.searchForInstances + // : dicomWebClient.searchForStudies; // TODO: Current version does not apply query Params for `searchForInstances` call? // Just sets `studyInstanceUid` in options... - return requestFn({ + return dicomWebClient.searchForStudies({ studyInstanceUid, queryParams: queryParamaters, }); @@ -115,6 +125,9 @@ export default function searchStudies(server, filter) { * @returns {string} The URL with encoded filter query data */ function mapParams(params) { + if (!params) { + return; + } const commaSeparatedFields = [ '00081030', // Study Description '00080060', // Modality @@ -122,27 +135,27 @@ function mapParams(params) { ].join(','); const parameters = { - PatientName: filter.patientName, - PatientID: filter.patientId, - AccessionNumber: filter.accessionNumber, - StudyDescription: filter.studyDescription, - ModalitiesInStudy: filter.modalitiesInStudy, - limit: filter.limit, - offset: filter.offset, - fuzzymatching: filter.fuzzymatching, + PatientName: params.patientName, + PatientID: params.patientId, + AccessionNumber: params.accessionNumber, + StudyDescription: params.studyDescription, + ModalitiesInStudy: params.modalitiesInStudy, + limit: params.limit, + offset: params.offset, + fuzzymatching: params.fuzzymatching, includefield: serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all', }; // build the StudyDate range parameter - if (filter.studyDateFrom || filter.studyDateTo) { - const dateFrom = _dateToString(new Date(filter.studyDateFrom)); - const dateTo = _dateToString(new Date(filter.studyDateTo)); + if (params.studyDateFrom || params.studyDateTo) { + const dateFrom = _dateToString(new Date(params.studyDateFrom)); + const dateTo = _dateToString(new Date(params.studyDateTo)); parameters.StudyDate = `${dateFrom}-${dateTo}`; } // Build the StudyInstanceUID parameter - if (filter.studyInstanceUid) { - let studyUids = filter.studyInstanceUid; + if (params.studyInstanceUid) { + let studyUids = params.studyInstanceUid; studyUids = Array.isArray(studyUids) ? studyUids.join() : studyUids; studyUids = studyUids.replace(/[^0-9.]+/g, '\\'); parameters.StudyInstanceUID = studyUids; diff --git a/platform/viewer/src/routes/DataSourceWrapper.jsx b/platform/viewer/src/routes/DataSourceWrapper.jsx index 00f949272..55b33058e 100644 --- a/platform/viewer/src/routes/DataSourceWrapper.jsx +++ b/platform/viewer/src/routes/DataSourceWrapper.jsx @@ -1,5 +1,5 @@ /* eslint-disable react/jsx-props-no-spreading */ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { MODULE_TYPES } from '@ohif/core'; // @@ -45,13 +45,19 @@ function DataSourceWrapper(props) { // But only for LayoutTemplate type of 'list'? // Or no data fetching here, and just hand down my source - // const studies = dataSource.query.studies.search(); - - // console.log(studies); + debugger; + const [data, setData] = useState(); + useEffect(() => { + async function getData() { + const searchResult = await dataSource.query.studies.search(); + setData(searchResult); + } + getData(); + }, [dataSource.query.studies]); return ( - + {data && } ); } diff --git a/platform/viewer/src/routes/StudyListContainer/StudyListContainer.jsx b/platform/viewer/src/routes/StudyListContainer/StudyListContainer.jsx index 5a74cb1cb..93fd4571f 100644 --- a/platform/viewer/src/routes/StudyListContainer/StudyListContainer.jsx +++ b/platform/viewer/src/routes/StudyListContainer/StudyListContainer.jsx @@ -24,7 +24,7 @@ import { * TODO: * - debounce `setFilterValues` (150ms?) */ -function StudyListContainer({ history, studies }) { +function StudyListContainer({ history, data: studies }) { // ~ Filters const query = useQuery(); const queryFilterValues = _getQueryFilterValues(query); @@ -132,14 +132,17 @@ function StudyListContainer({ history, studies }) { const rowKey = key + 1; const isExpanded = expandedRows.some(k => k === rowKey); const { - AccessionNumber, - Modalities, - Instances, - StudyDescription, - PatientId, - PatientName, - StudyDate, - series, + accessionNumber, + modalities, + instances, + studyDescription, + patientId, + patientName, + studyDate, + studyTime, + // ?? + // TODO: won't have until expanded + series = [], } = study; const seriesTableColumns = { description: 'Description', @@ -166,14 +169,14 @@ function StudyListContainer({ history, studies }) { name={isExpanded ? 'chevron-down' : 'chevron-right'} className="mr-4" /> - {PatientName} + {patientName} ), gridCol: 4, }, { key: 'mrn', - content: PatientId, + content: patientId, gridCol: 2, }, { @@ -181,26 +184,26 @@ function StudyListContainer({ history, studies }) { content: (
- {moment(StudyDate).format('MMM-DD-YYYY')} + {moment(studyDate).format('MMM-DD-YYYY')} - {moment(StudyDate).format('hh:mm A')} + {moment(studyTime).format('hh:mm A')}
), gridCol: 5, }, { key: 'description', - content: StudyDescription, + content: studyDescription, gridCol: 4, }, { key: 'modality', - content: Modalities, + content: modalities, gridCol: 3, }, { key: 'accession', - content: AccessionNumber, + content: accessionNumber, gridCol: 4, }, { @@ -214,7 +217,7 @@ function StudyListContainer({ history, studies }) { 'text-secondary-light': !isExpanded, })} /> - {Instances} + {instances} ), gridCol: 4,