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 { 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,
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user