basic initial search and passing data to LayoutTemplate for list route

This commit is contained in:
dannyrb 2020-05-10 00:25:20 -04:00 committed by James A. Petts
parent 3cf2eb5ed8
commit 6f9c27f10b
4 changed files with 83 additions and 49 deletions

View File

@ -1,5 +1,5 @@
import { api } from 'dicomweb-client'; 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'; import { IWebApiDataSource } from '@ohif/core';
/** /**
@ -26,12 +26,24 @@ function createDicomWebApi(dicomWebConfig) {
query: { query: {
studies: { studies: {
mapParams: mapParams.bind(), 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(), processResults: processResults.bind(),
}, },
instances: { instances: {
search: (studyInstanceUid, queryParamaters) => search: (studyInstanceUid, queryParamaters) =>
search.call( qidoSearch.call(
undefined, undefined,
dicomWebClient, dicomWebClient,
studyInstanceUid, studyInstanceUid,

View File

@ -22,7 +22,7 @@
* | limit | {number} | * | limit | {number} |
* | offset | {number} | * | offset | {number} |
*/ */
import DICOMWeb from '@ohif/core'; import { DICOMWeb } from '@ohif/core';
const { getString, getName, getModalities } = DICOMWeb; const { getString, getName, getModalities } = DICOMWeb;
@ -37,26 +37,36 @@ const { getString, getName, getModalities } = DICOMWeb;
* @returns {Array} An array of Study MetaData objects * @returns {Array} An array of Study MetaData objects
*/ */
function processResults(qidoStudies) { function processResults(qidoStudies) {
debugger;
if (!qidoStudies || !qidoStudies.length) { if (!qidoStudies || !qidoStudies.length) {
return []; return [];
} }
const studies = []; const studies = [];
// LIST
// AccessionNumber,
// Modalities,
// Instances,
// StudyDescription,
// PatientId,
// PatientName,
// StudyDate,
qidoStudies.forEach(qidoStudy => qidoStudies.forEach(qidoStudy =>
studies.push({ studies.push({
studyInstanceUid: getString(qidoStudy['0020000D']), studyInstanceUid: getString(qidoStudy['0020000D']),
studyDate: getString(qidoStudy['00080020']), studyDate: getString(qidoStudy['00080020']),
studyTime: getString(qidoStudy['00080030']), studyTime: getString(qidoStudy['00080030']),
accessionNumber: getString(qidoStudy['00080050']), accessionNumber: getString(qidoStudy['00080050']),
referringPhysicianName: getString(qidoStudy['00080090']), // referringPhysicianName: getString(qidoStudy['00080090']),
patientName: getName(qidoStudy['00100010']), patientName: getName(qidoStudy['00100010']),
patientId: getString(qidoStudy['00100020']), patientId: getString(qidoStudy['00100020']),
patientBirthdate: getString(qidoStudy['00100030']), // patientBirthdate: getString(qidoStudy['00100030']),
patientSex: getString(qidoStudy['00100040']), // patientSex: getString(qidoStudy['00100040']),
studyId: getString(qidoStudy['00200010']), // studyId: getString(qidoStudy['00200010']), // mrn?
numberOfStudyRelatedSeries: getString(qidoStudy['00201206']), // numberOfStudyRelatedSeries: getString(qidoStudy['00201206']),
numberOfStudyRelatedInstances: getString(qidoStudy['00201208']), instances: getString(qidoStudy['00201208']),
studyDescription: getString(qidoStudy['00081030']), studyDescription: getString(qidoStudy['00081030']),
modalities: getString( modalities: getString(
getModalities(qidoStudy['00080060'], qidoStudy['00080061']) getModalities(qidoStudy['00080060'], qidoStudy['00080061'])
@ -82,13 +92,13 @@ function search(
seriesInstanceUid, seriesInstanceUid,
queryParamaters queryParamaters
) { ) {
const requestFn = studyInstanceUid // const requestFn = studyInstanceUid
? dicomWebClient.searchForInstances // ? dicomWebClient.searchForInstances
: dicomWebClient.searchForStudies; // : dicomWebClient.searchForStudies;
// TODO: Current version does not apply query Params for `searchForInstances` call? // TODO: Current version does not apply query Params for `searchForInstances` call?
// Just sets `studyInstanceUid` in options... // Just sets `studyInstanceUid` in options...
return requestFn({ return dicomWebClient.searchForStudies({
studyInstanceUid, studyInstanceUid,
queryParams: queryParamaters, queryParams: queryParamaters,
}); });
@ -115,6 +125,9 @@ export default function searchStudies(server, filter) {
* @returns {string} The URL with encoded filter query data * @returns {string} The URL with encoded filter query data
*/ */
function mapParams(params) { function mapParams(params) {
if (!params) {
return;
}
const commaSeparatedFields = [ const commaSeparatedFields = [
'00081030', // Study Description '00081030', // Study Description
'00080060', // Modality '00080060', // Modality
@ -122,27 +135,27 @@ function mapParams(params) {
].join(','); ].join(',');
const parameters = { const parameters = {
PatientName: filter.patientName, PatientName: params.patientName,
PatientID: filter.patientId, PatientID: params.patientId,
AccessionNumber: filter.accessionNumber, AccessionNumber: params.accessionNumber,
StudyDescription: filter.studyDescription, StudyDescription: params.studyDescription,
ModalitiesInStudy: filter.modalitiesInStudy, ModalitiesInStudy: params.modalitiesInStudy,
limit: filter.limit, limit: params.limit,
offset: filter.offset, offset: params.offset,
fuzzymatching: filter.fuzzymatching, fuzzymatching: params.fuzzymatching,
includefield: serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all', includefield: serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all',
}; };
// build the StudyDate range parameter // build the StudyDate range parameter
if (filter.studyDateFrom || filter.studyDateTo) { if (params.studyDateFrom || params.studyDateTo) {
const dateFrom = _dateToString(new Date(filter.studyDateFrom)); const dateFrom = _dateToString(new Date(params.studyDateFrom));
const dateTo = _dateToString(new Date(filter.studyDateTo)); const dateTo = _dateToString(new Date(params.studyDateTo));
parameters.StudyDate = `${dateFrom}-${dateTo}`; parameters.StudyDate = `${dateFrom}-${dateTo}`;
} }
// Build the StudyInstanceUID parameter // Build the StudyInstanceUID parameter
if (filter.studyInstanceUid) { if (params.studyInstanceUid) {
let studyUids = filter.studyInstanceUid; let studyUids = params.studyInstanceUid;
studyUids = Array.isArray(studyUids) ? studyUids.join() : studyUids; studyUids = Array.isArray(studyUids) ? studyUids.join() : studyUids;
studyUids = studyUids.replace(/[^0-9.]+/g, '\\'); studyUids = studyUids.replace(/[^0-9.]+/g, '\\');
parameters.StudyInstanceUID = studyUids; parameters.StudyInstanceUID = studyUids;

View File

@ -1,5 +1,5 @@
/* eslint-disable react/jsx-props-no-spreading */ /* eslint-disable react/jsx-props-no-spreading */
import React from 'react'; import React, { useEffect, useState } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { MODULE_TYPES } from '@ohif/core'; import { MODULE_TYPES } from '@ohif/core';
// //
@ -45,13 +45,19 @@ function DataSourceWrapper(props) {
// 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 studies = dataSource.query.studies.search(); debugger;
const [data, setData] = useState();
// console.log(studies); useEffect(() => {
async function getData() {
const searchResult = await dataSource.query.studies.search();
setData(searchResult);
}
getData();
}, [dataSource.query.studies]);
return ( return (
<React.Fragment> <React.Fragment>
<LayoutTemplate {...rest} /> {data && <LayoutTemplate {...rest} data={data} />}
</React.Fragment> </React.Fragment>
); );
} }

View File

@ -24,7 +24,7 @@ import {
* TODO: * TODO:
* - debounce `setFilterValues` (150ms?) * - debounce `setFilterValues` (150ms?)
*/ */
function StudyListContainer({ history, studies }) { function StudyListContainer({ history, data: studies }) {
// ~ Filters // ~ Filters
const query = useQuery(); const query = useQuery();
const queryFilterValues = _getQueryFilterValues(query); const queryFilterValues = _getQueryFilterValues(query);
@ -132,14 +132,17 @@ function StudyListContainer({ history, 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 {
AccessionNumber, accessionNumber,
Modalities, modalities,
Instances, instances,
StudyDescription, studyDescription,
PatientId, patientId,
PatientName, patientName,
StudyDate, studyDate,
series, studyTime,
// ??
// TODO: won't have until expanded
series = [],
} = study; } = study;
const seriesTableColumns = { const seriesTableColumns = {
description: 'Description', description: 'Description',
@ -166,14 +169,14 @@ function StudyListContainer({ history, studies }) {
name={isExpanded ? 'chevron-down' : 'chevron-right'} name={isExpanded ? 'chevron-down' : 'chevron-right'}
className="mr-4" className="mr-4"
/> />
{PatientName} {patientName}
</> </>
), ),
gridCol: 4, gridCol: 4,
}, },
{ {
key: 'mrn', key: 'mrn',
content: PatientId, content: patientId,
gridCol: 2, gridCol: 2,
}, },
{ {
@ -181,26 +184,26 @@ function StudyListContainer({ history, studies }) {
content: ( content: (
<div> <div>
<span className="mr-4"> <span className="mr-4">
{moment(StudyDate).format('MMM-DD-YYYY')} {moment(studyDate).format('MMM-DD-YYYY')}
</span> </span>
<span>{moment(StudyDate).format('hh:mm A')}</span> <span>{moment(studyTime).format('hh:mm A')}</span>
</div> </div>
), ),
gridCol: 5, gridCol: 5,
}, },
{ {
key: 'description', key: 'description',
content: StudyDescription, content: studyDescription,
gridCol: 4, gridCol: 4,
}, },
{ {
key: 'modality', key: 'modality',
content: Modalities, content: modalities,
gridCol: 3, gridCol: 3,
}, },
{ {
key: 'accession', key: 'accession',
content: AccessionNumber, content: accessionNumber,
gridCol: 4, gridCol: 4,
}, },
{ {
@ -214,7 +217,7 @@ function StudyListContainer({ history, studies }) {
'text-secondary-light': !isExpanded, 'text-secondary-light': !isExpanded,
})} })}
/> />
{Instances} {instances}
</> </>
), ),
gridCol: 4, gridCol: 4,