basic initial search and passing data to LayoutTemplate for list route
This commit is contained in:
parent
3cf2eb5ed8
commit
6f9c27f10b
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 (
|
||||
<React.Fragment>
|
||||
<LayoutTemplate {...rest} />
|
||||
{data && <LayoutTemplate {...rest} data={data} />}
|
||||
</React.Fragment>
|
||||
);
|
||||
}
|
||||
|
||||
@ -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: (
|
||||
<div>
|
||||
<span className="mr-4">
|
||||
{moment(StudyDate).format('MMM-DD-YYYY')}
|
||||
{moment(studyDate).format('MMM-DD-YYYY')}
|
||||
</span>
|
||||
<span>{moment(StudyDate).format('hh:mm A')}</span>
|
||||
<span>{moment(studyTime).format('hh:mm A')}</span>
|
||||
</div>
|
||||
),
|
||||
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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user