1 parent
c3ce909434
commit
33307d3cd2
18 files changed
+1377
-245
No files matched your search
@@ -20,6 +20,7 @@ import ui from './ui';
|
||||
import user from './user.js';
|
||||
import errorHandler from './errorHandler.js';
|
||||
import utils, { hotkeys } from './utils/';
|
||||
import str2ab from './utils/str2ab';
|
||||
|
||||
import {
|
||||
UINotificationService,
|
||||
@@ -96,6 +97,8 @@ export {
|
||||
UIDialogService,
|
||||
MeasurementService,
|
||||
LoggerService,
|
||||
|
||||
str2ab,
|
||||
};
|
||||
|
||||
export { OHIF };
|
||||
|
||||
@@ -26,6 +26,7 @@ describe('Top level exports', () => {
|
||||
'cornerstone',
|
||||
'default', //
|
||||
'errorHandler',
|
||||
'str2ab',
|
||||
'string',
|
||||
'ui',
|
||||
'user',
|
||||
|
||||
@@ -9,38 +9,27 @@ import { api } from 'dicomweb-client';
|
||||
*/
|
||||
export default class StaticWadoClient extends api.DICOMwebClient {
|
||||
static filterKeys = {
|
||||
StudyInstanceUID: '0020000D',
|
||||
PatientName: '00100010',
|
||||
PatientID: '00100020',
|
||||
StudyDescription: '00081030',
|
||||
ModalitiesInStudy: '00080061',
|
||||
"StudyInstanceUID": "0020000D",
|
||||
"PatientName": "00100010",
|
||||
"00100020": "mrn",
|
||||
"PatientID": "00100020",
|
||||
"StudyDescription": "00081030",
|
||||
"StudyDate": "00080020",
|
||||
"ModalitiesInStudy": "00080061",
|
||||
AccessionNumber: "00080050",
|
||||
};
|
||||
|
||||
constructor(qidoConfig) {
|
||||
super(qidoConfig);
|
||||
this.staticWado = qidoConfig.staticWado;
|
||||
this.extendMetadataWithInstances = qidoConfig.extendMetadataWithInstances;
|
||||
}
|
||||
|
||||
async retrieveSeriesMetadata(options) {
|
||||
if (!this.extendMetadataWithInstances)
|
||||
return super.retrieveSeriesMetadata(options);
|
||||
const results = await Promise.all([
|
||||
super.retrieveSeriesMetadata(options),
|
||||
this.searchForInstances(options),
|
||||
]);
|
||||
const metadata = results[0];
|
||||
const instances = results[1];
|
||||
return metadata.map(item => {
|
||||
const sopUID = item['00080018'].Value[0];
|
||||
const instance = instances.find(
|
||||
instance => instance['00080018'].Value[0] == sopUID
|
||||
);
|
||||
Object.assign(item, instance);
|
||||
return item;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the search for studies remote query with a local version which
|
||||
* retrieves a complete query list and then sub-selects from it locally.
|
||||
* @param {*} options
|
||||
* @returns
|
||||
*/
|
||||
async searchForStudies(options) {
|
||||
if (!this.staticWado) return super.searchForStudies(options);
|
||||
|
||||
@@ -56,6 +45,62 @@ export default class StaticWadoClient extends api.DICOMwebClient {
|
||||
return filtered;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares values, matching any instance of desired to any instance of
|
||||
* actual by recursively go through the paired set of values. That is,
|
||||
* this is O(m*n) where m is how many items in desired and n is the length of actual
|
||||
* Then, at the individual item node, compares the Alphabetic name if present,
|
||||
* and does a sub-string matching on string values, and otherwise does an
|
||||
* exact match comparison.
|
||||
*
|
||||
* @param {*} desired
|
||||
* @param {*} actual
|
||||
* @returns true if the values match
|
||||
*/
|
||||
compareValues(desired, actual) {
|
||||
if (Array.isArray(desired)) {
|
||||
return desired.find(item => this.compareValues(item, actual));
|
||||
}
|
||||
if (Array.isArray(actual)) {
|
||||
return actual.find(actualItem => this.compareValues(desired, actualItem));
|
||||
}
|
||||
if (actual && actual.Alphabetic) {
|
||||
actual = actual.Alphabetic;
|
||||
}
|
||||
if (typeof (actual) == 'string') {
|
||||
if (actual.length === 0) return true;
|
||||
if (desired.length === 0 || desired === '*') return true;
|
||||
if (desired[0] === '*' && desired[desired.length - 1] === '*') {
|
||||
console.log(`Comparing ${actual} to ${desired.substring(1, desired.length - 1)}`)
|
||||
return actual.indexOf(desired.substring(1, desired.length - 1)) != -1;
|
||||
} else if (desired[desired.length - 1] === '*') {
|
||||
return actual.indexOf(desired.substring(0, desired.length - 1)) != -1;
|
||||
} else if (desired[0] === '*') {
|
||||
return actual.indexOf(desired.substring(1)) === actual.length - desired.length + 1;
|
||||
}
|
||||
}
|
||||
return desired === actual;
|
||||
}
|
||||
|
||||
/** Compares a pair of dates to see if the value is within the range */
|
||||
compareDateRange(range, value) {
|
||||
if (!value) return true;
|
||||
const dash = range.indexOf('-');
|
||||
if (dash === -1) return this.compareValues(range, value);
|
||||
const start = range.substring(0, dash);
|
||||
const end = range.substring(dash + 1);
|
||||
return (!start || value >= start) &&
|
||||
(!end || value <= end);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the return list by the query parameters.
|
||||
*
|
||||
* @param {*} key
|
||||
* @param {*} queryParams
|
||||
* @param {*} study
|
||||
* @returns
|
||||
*/
|
||||
filterItem(key, queryParams, study) {
|
||||
const altKey = StaticWadoClient.filterKeys[key] || key;
|
||||
if (!queryParams) return true;
|
||||
@@ -63,23 +108,8 @@ export default class StaticWadoClient extends api.DICOMwebClient {
|
||||
if (!testValue) return true;
|
||||
const valueElem = study[key] || study[altKey];
|
||||
if (!valueElem) return false;
|
||||
if (valueElem.vr == 'DA') return this.compareDateRange(testValue, valueElem.Value[0]);
|
||||
const value = valueElem.Value;
|
||||
return this.eqItem(testValue, value);
|
||||
}
|
||||
|
||||
eqItem(testValue, value) {
|
||||
if (testValue.filter) {
|
||||
return (
|
||||
testValue.filter(testItem => this.eqItem(testItem, value)).length > 0
|
||||
);
|
||||
}
|
||||
if (value === testValue) return true;
|
||||
if (typeof value == 'string') {
|
||||
return value.indexOf(testValue) != -1;
|
||||
}
|
||||
if (value.Alphabetic) return this.eqItem(testValue, value.Alphabetic);
|
||||
if (value.filter)
|
||||
return value.filter(item => this.eqItem(testValue, item)).length > 0;
|
||||
return false;
|
||||
return this.compareValues(testValue, value) && true;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user