Files
2025-02-26 14:49:25 +07:00

2301 lines
117 KiB
JavaScript

//////////////////////////////////////////////////////////////////////////
// //
// This is a generated file. You can view the original //
// source in your browser if your browser supports source maps. //
// Source maps are supported by all recent versions of Chrome, Safari, //
// and Firefox, and by Internet Explorer 11. //
// //
//////////////////////////////////////////////////////////////////////////
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var Template = Package['templating-runtime'].Template;
var HTTP = Package.http.HTTP;
var DICOMWeb = Package['ohif:dicomweb-client'].DICOMWeb;
var dialogPolyfill = Package['ohif:viewerbase'].dialogPolyfill;
var WADOProxy = Package['ohif:wadoproxy'].WADOProxy;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
var Symbol = Package['ecmascript-runtime-client'].Symbol;
var Map = Package['ecmascript-runtime-client'].Map;
var Set = Package['ecmascript-runtime-client'].Set;
var Blaze = Package.blaze.Blaze;
var UI = Package.blaze.UI;
var Handlebars = Package.blaze.Handlebars;
var Spacebars = Package.spacebars.Spacebars;
var HTML = Package.htmljs.HTML;
/* Package-scope variables */
var encodeQueryData;
var require = meteorInstall({"node_modules":{"meteor":{"ohif:studies":{"both":{"main.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/both/main.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
OHIF.studies = {};
require('../imports/both');
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}},"client":{"main.js":function(require){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/client/main.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
require('../imports/client');
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}},"imports":{"both":{"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./lib"));
module.watch(require("./services"));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"lib":{"encodeQueryData.js":function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/lib/encodeQueryData.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/**
* Converts the properties to URL query parameters. Based on:
* http://stackoverflow.com/questions/111529/create-query-parameters-in-javascript
*
* @param data
* @returns {string}
*/
encodeQueryData = function (data) {
var ret = [];
for (var d in meteorBabelHelpers.sanitizeForInObject(data)) {
if (data[d]) {
ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
}
}
return ret.join('&');
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/lib/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./encodeQueryData.js"));
module.watch(require("./parseFloatArray.js"));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"parseFloatArray.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/lib/parseFloatArray.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
parseFloatArray: function () {
return parseFloatArray;
}
});
var parseFloatArray = function (obj) {
var result = [];
if (!obj) {
return result;
}
var objs = obj.split("\\");
for (var i = 0; i < objs.length; i++) {
result.push(parseFloat(objs[i]));
}
return result;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}},"services":{"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/services/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./namespace"));
module.watch(require("./qido/instances.js"));
module.watch(require("./qido/studies.js"));
module.watch(require("./wado/retrieveMetadata.js"));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"namespace.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/services/namespace.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
OHIF.studies.services = {
QIDO: {},
WADO: {}
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"qido":{"instances.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/services/qido/instances.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
var DICOMWeb;
module.watch(require("meteor/ohif:dicomweb-client"), {
DICOMWeb: function (v) {
DICOMWeb = v;
}
}, 1);
/**
* Creates a QIDO URL given the server settings and a study instance UID
* @param server
* @param studyInstanceUid
* @returns {string} URL to be used for QIDO calls
*/
function buildUrl(server, studyInstanceUid) {
return server.qidoRoot + '/studies/' + studyInstanceUid + '/instances';
}
/**
* Parses data returned from a QIDO search and transforms it into
* an array of series that are present in the study
*
* @param server The DICOM server
* @param studyInstanceUid
* @param resultData
* @returns {Array} Series List
*/
function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
var seriesMap = {};
var seriesList = [];
resultData.forEach(function (instance) {
// Use seriesMap to cache series data
// If the series instance UID has already been used to
// process series data, continue using that series
var seriesInstanceUid = DICOMWeb.getString(instance['0020000E']);
var series = seriesMap[seriesInstanceUid]; // If no series data exists in the seriesMap cache variable,
// process any available series data
if (!series) {
series = {
seriesInstanceUid: seriesInstanceUid,
seriesNumber: DICOMWeb.getString(instance['00200011']),
instances: []
}; // Save this data in the seriesMap cache variable
seriesMap[seriesInstanceUid] = series;
seriesList.push(series);
} // The uri for the dicomweb
// NOTE: DCM4CHEE seems to return the data zipped
// NOTE: Orthanc returns the data with multi-part mime which cornerstoneWADOImageLoader doesn't
// know how to parse yet
//var uri = DICOMWeb.getString(instance['00081190']);
//uri = uri.replace('wado-rs', 'dicom-web');
// manually create a WADO-URI from the UIDs
// NOTE: Haven't been able to get Orthanc's WADO-URI to work yet - maybe its not configured?
var sopInstanceUid = DICOMWeb.getString(instance['00080018']);
var uri = server.wadoUriRoot + '?requestType=WADO&studyUID=' + studyInstanceUid + '&seriesUID=' + seriesInstanceUid + '&objectUID=' + sopInstanceUid + '&contentType=application%2Fdicom'; // Add this instance to the current series
series.instances.push({
sopClassUid: DICOMWeb.getString(instance['00080016']),
sopInstanceUid: sopInstanceUid,
uri: uri,
instanceNumber: DICOMWeb.getString(instance['00200013'])
});
});
return seriesList;
}
/**
* Retrieve a set of instances using a QIDO call
* @param server
* @param studyInstanceUid
* @throws ECONNREFUSED
* @returns {{wadoUriRoot: String, studyInstanceUid: String, seriesList: Array}}
*/
OHIF.studies.services.QIDO.Instances = function (server, studyInstanceUid) {
var url = buildUrl(server, studyInstanceUid);
try {
var result = DICOMWeb.getJSON(url, server.requestOptions);
return {
wadoUriRoot: server.wadoUriRoot,
studyInstanceUid: studyInstanceUid,
seriesList: resultDataToStudyMetadata(server, studyInstanceUid, result.data)
};
} catch (error) {
OHIF.log.trace();
throw error;
}
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"studies.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/services/qido/studies.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
var DICOMWeb;
module.watch(require("meteor/ohif:dicomweb-client"), {
DICOMWeb: function (v) {
DICOMWeb = v;
}
}, 1);
/**
* Creates a QIDO date string for a date range query
* Assumes the year is positive, at most 4 digits long.
*
* @param date The Date object to be formatted
* @returns {string} The formatted date string
*/
function dateToString(date) {
if (!date) return '';
var year = date.getFullYear().toString();
var month = (date.getMonth() + 1).toString();
var day = date.getDate().toString();
year = '0'.repeat(4 - year.length).concat(year);
month = '0'.repeat(2 - month.length).concat(month);
day = '0'.repeat(2 - day.length).concat(day);
return ''.concat(year, month, day);
}
/**
* Produces a QIDO URL given server details and a set of specified search filter
* items
*
* @param server
* @param filter
* @returns {string} The URL with encoded filter query data
*/
function filterToQIDOURL(server, filter) {
var commaSeparatedFields = ['00081030', // Study Description
'00080060' //Modality
// Add more fields here if you want them in the result
].join(',');
var parameters = {
PatientName: filter.patientName,
PatientID: filter.patientId,
AccessionNumber: filter.accessionNumber,
StudyDescription: filter.studyDescription,
ModalitiesInStudy: filter.modalitiesInStudy,
limit: filter.limit,
includefield: server.qidoSupportsIncludeField ? 'all' : commaSeparatedFields
}; // build the StudyDate range parameter
if (filter.studyDateFrom || filter.studyDateTo) {
var dateFrom = dateToString(new Date(filter.studyDateFrom));
var dateTo = dateToString(new Date(filter.studyDateTo));
parameters.StudyDate = dateFrom + "-" + dateTo;
} // Build the StudyInstanceUID parameter
if (filter.studyInstanceUid) {
var studyUids = filter.studyInstanceUid;
studyUids = Array.isArray(studyUids) ? studyUids.join() : studyUids;
studyUids = studyUids.replace(/[^0-9.]+/g, '\\');
parameters.StudyInstanceUID = studyUids;
}
return server.qidoRoot + '/studies?' + encodeQueryData(parameters);
}
/**
* Parses resulting data from a QIDO call into a set of Study MetaData
*
* @param resultData
* @returns {Array} An array of Study MetaData objects
*/
function resultDataToStudies(resultData) {
var studies = [];
if (!resultData || !resultData.length) return;
resultData.forEach(function (study) {
return studies.push({
studyInstanceUid: DICOMWeb.getString(study['0020000D']),
// 00080005 = SpecificCharacterSet
studyDate: DICOMWeb.getString(study['00080020']),
studyTime: DICOMWeb.getString(study['00080030']),
accessionNumber: DICOMWeb.getString(study['00080050']),
referringPhysicianName: DICOMWeb.getString(study['00080090']),
// 00081190 = URL
patientName: DICOMWeb.getName(study['00100010']),
patientId: DICOMWeb.getString(study['00100020']),
patientBirthdate: DICOMWeb.getString(study['00100030']),
patientSex: DICOMWeb.getString(study['00100040']),
studyId: DICOMWeb.getString(study['00200010']),
numberOfStudyRelatedSeries: DICOMWeb.getString(study['00201206']),
numberOfStudyRelatedInstances: DICOMWeb.getString(study['00201208']),
studyDescription: DICOMWeb.getString(study['00081030']),
// modality: DICOMWeb.getString(study['00080060']),
// modalitiesInStudy: DICOMWeb.getString(study['00080061']),
modalities: DICOMWeb.getString(DICOMWeb.getModalities(study['00080060'], study['00080061']))
});
});
return studies;
}
OHIF.studies.services.QIDO.Studies = function (server, filter) {
var url = filterToQIDOURL(server, filter);
return new Promise(function (resolve, reject) {
DICOMWeb.getJSON(url, server.requestOptions).then(function (result) {
var studies = resultDataToStudies(result);
resolve(studies);
}, reject);
});
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}},"wado":{"retrieveMetadata.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/both/services/wado/retrieveMetadata.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
var DICOMWeb;
module.watch(require("meteor/ohif:dicomweb-client"), {
DICOMWeb: function (v) {
DICOMWeb = v;
}
}, 1);
var parseFloatArray;
module.watch(require("../../lib/parseFloatArray"), {
parseFloatArray: function (v) {
parseFloatArray = v;
}
}, 2);
/**
* Simple cache schema for retrieved color palettes.
*/
var paletteColorCache = {
count: 0,
maxAge: 24 * 60 * 60 * 1000,
// 24h cache?
entries: {},
isValidUID: function (paletteUID) {
return typeof paletteUID === 'string' && paletteUID.length > 0;
},
get: function (paletteUID) {
var entry = null;
if (this.entries.hasOwnProperty(paletteUID)) {
entry = this.entries[paletteUID]; // check how the entry is...
if (Date.now() - entry.time > this.maxAge) {
// entry is too old... remove entry.
delete this.entries[paletteUID];
this.count--;
entry = null;
}
}
return entry;
},
add: function (entry) {
if (this.isValidUID(entry.uid)) {
var paletteUID = entry.uid;
if (this.entries.hasOwnProperty(paletteUID) !== true) {
this.count++; // increment cache entry count...
}
entry.time = Date.now();
this.entries[paletteUID] = entry; // @TODO: Add logic to get rid of old entries and reduce memory usage...
}
}
};
/**
* Creates a URL for a WADO search
*
* @param server
* @param studyInstanceUid
* @returns {string}
*/
function buildUrl(server, studyInstanceUid) {
return server.wadoRoot + '/studies/' + studyInstanceUid + '/metadata';
}
/** Returns a WADO url for an instance
*
* @param studyInstanceUid
* @param seriesInstanceUid
* @param sopInstanceUid
* @returns {string}
*/
function buildInstanceWadoUrl(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid) {
var params = [];
params.push('requestType=WADO');
params.push("studyUID=" + studyInstanceUid);
params.push("seriesUID=" + seriesInstanceUid);
params.push("objectUID=" + sopInstanceUid);
params.push('contentType=application/dicom');
params.push('transferSyntax=*');
var paramString = params.join('&');
return server.wadoUriRoot + "?" + paramString;
}
function buildInstanceWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid) {
return server.wadoRoot + "/studies/" + studyInstanceUid + "/series/" + seriesInstanceUid + "/instances/" + sopInstanceUid;
}
function buildInstanceFrameWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid, frame) {
var baseWadoRsUri = buildInstanceWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
frame = frame != null || 1;
return baseWadoRsUri + "/frames/" + frame;
}
/**
* Parses the SourceImageSequence, if it exists, in order
* to return a ReferenceSOPInstanceUID. The ReferenceSOPInstanceUID
* is used to refer to this image in any accompanying DICOM-SR documents.
*
* @param instance
* @returns {String} The ReferenceSOPInstanceUID
*/
function getSourceImageInstanceUid(instance) {
// TODO= Parse the whole Source Image Sequence
// This is a really poor workaround for now.
// Later we should probably parse the whole sequence.
var SourceImageSequence = instance['00082112'];
if (SourceImageSequence && SourceImageSequence.Value && SourceImageSequence.Value.length) {
return SourceImageSequence.Value[0]['00081155'].Value[0];
}
}
function getPaletteColor(server, instance, tag, lutDescriptor) {
var lut = [];
var numLutEntries = lutDescriptor[0];
var bits = lutDescriptor[2];
var uri = WADOProxy.convertURL(instance[tag].BulkDataURI, server);
var bulkDataPromise = DICOMWeb.getBulkData(uri);
return bulkDataPromise.then(function (data) {
for (var i = 0; i < numLutEntries; i++) {
if (bits === 16) {
lut[i] = data[i * 65536] + data[i + 1];
} else {
lut[i] = data[i];
}
}
return lut;
});
}
/**
* Fetch palette colors for instances with "PALETTE COLOR" photometricInterpretation.
*
* @param server {Object} Current server;
* @param instance {Object} The retrieved instance metadata;
* @returns {String} The ReferenceSOPInstanceUID
*/
function getPaletteColors(server, instance, lutDescriptor) {
var entry, paletteUID;
return _regenerator.default.async(function () {
function getPaletteColors$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
entry = null;
paletteUID = DICOMWeb.getString(instance['00281199']);
return _context.abrupt("return", new Promise(function (resolve, reject) {
if (paletteColorCache.isValidUID(paletteUID)) {
entry = paletteColorCache.get(paletteUID);
return resolve(entry);
} // no entry in cache... Fetch remote data.
var r = getPaletteColor(server, instance, '00281201', lutDescriptor);
var g = getPaletteColor(server, instance, '00281202', lutDescriptor);
;
var b = getPaletteColor(server, instance, '00281203', lutDescriptor);
;
var promises = [r, g, b];
Promise.all(promises).then(function (args) {
entry = {
red: r,
green: g,
blue: b
}; // when paletteUID is present, the entry can be cached...
entry.uid = paletteUID;
paletteColorCache.add(entry);
resolve(entry);
});
}));
case 3:
case "end":
return _context.stop();
}
}
}
return getPaletteColors$;
}(), null, this);
}
function getFrameIncrementPointer(element) {
var frameIncrementPointerNames = {
'00181065': 'frameTimeVector',
'00181063': 'frameTime'
};
if (!element || !element.Value || !element.Value.length) {
return;
}
var value = element.Value[0];
return frameIncrementPointerNames[value];
}
function getRadiopharmaceuticalInfo(instance) {
var modality = DICOMWeb.getString(instance['00080060']);
if (modality !== 'PT') {
return;
}
var radiopharmaceuticalInfo = instance['00540016'];
if (radiopharmaceuticalInfo === undefined || !radiopharmaceuticalInfo.Value || !radiopharmaceuticalInfo.Value.length) {
return;
}
var firstPetRadiopharmaceuticalInfo = radiopharmaceuticalInfo.Value[0];
return {
radiopharmaceuticalStartTime: DICOMWeb.getString(firstPetRadiopharmaceuticalInfo['00181072']),
radionuclideTotalDose: DICOMWeb.getNumber(firstPetRadiopharmaceuticalInfo['00181074']),
radionuclideHalfLife: DICOMWeb.getNumber(firstPetRadiopharmaceuticalInfo['00181075'])
};
}
/**
* Parses result data from a WADO search into Study MetaData
* Returns an object populated with study metadata, including the
* series list.
*
* @param server
* @param studyInstanceUid
* @param resultData
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
*/
function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
var seriesMap, seriesList, anInstance, studyData;
return _regenerator.default.async(function () {
function resultDataToStudyMetadata$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
seriesMap = {};
seriesList = [];
if (resultData.length) {
_context3.next = 4;
break;
}
return _context3.abrupt("return");
case 4:
anInstance = resultData[0];
if (anInstance) {
_context3.next = 7;
break;
}
return _context3.abrupt("return");
case 7:
studyData = {
seriesList: seriesList,
patientName: DICOMWeb.getName(anInstance['00100010']),
patientId: DICOMWeb.getString(anInstance['00100020']),
patientAge: DICOMWeb.getNumber(anInstance['00101010']),
patientSize: DICOMWeb.getNumber(anInstance['00101020']),
patientWeight: DICOMWeb.getNumber(anInstance['00101030']),
accessionNumber: DICOMWeb.getString(anInstance['00080050']),
studyDate: DICOMWeb.getString(anInstance['00080020']),
modalities: DICOMWeb.getString(anInstance['00080061']),
studyDescription: DICOMWeb.getString(anInstance['00081030']),
imageCount: DICOMWeb.getString(anInstance['00201208']),
studyInstanceUid: DICOMWeb.getString(anInstance['0020000D']),
institutionName: DICOMWeb.getString(anInstance['00080080'])
};
_context3.next = 10;
return _regenerator.default.awrap(Promise.all(resultData.map(function () {
function _callee(instance) {
var seriesInstanceUid, series, sopInstanceUid, wadouri, baseWadoRsUri, wadorsuri, instanceSummary, redPaletteColorLookupTableDescriptor, greenPaletteColorLookupTableDescriptor, bluePaletteColorLookupTableDescriptor, palettes;
return _regenerator.default.async(function () {
function _callee$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
seriesInstanceUid = DICOMWeb.getString(instance['0020000E']);
series = seriesMap[seriesInstanceUid];
if (!series) {
series = {
seriesDescription: DICOMWeb.getString(instance['0008103E']),
modality: DICOMWeb.getString(instance['00080060']),
seriesInstanceUid: seriesInstanceUid,
seriesNumber: DICOMWeb.getNumber(instance['00200011']),
seriesDate: DICOMWeb.getString(instance['00080021']),
seriesTime: DICOMWeb.getString(instance['00080031']),
instances: []
};
seriesMap[seriesInstanceUid] = series;
seriesList.push(series);
}
sopInstanceUid = DICOMWeb.getString(instance['00080018']);
wadouri = buildInstanceWadoUrl(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
baseWadoRsUri = buildInstanceWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
wadorsuri = buildInstanceFrameWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
instanceSummary = {
imageType: DICOMWeb.getString(instance['00080008']),
sopClassUid: DICOMWeb.getString(instance['00080016']),
modality: DICOMWeb.getString(instance['00080060']),
sopInstanceUid: sopInstanceUid,
instanceNumber: DICOMWeb.getNumber(instance['00200013']),
imagePositionPatient: DICOMWeb.getString(instance['00200032']),
imageOrientationPatient: DICOMWeb.getString(instance['00200037']),
frameOfReferenceUID: DICOMWeb.getString(instance['00200052']),
sliceLocation: DICOMWeb.getNumber(instance['00201041']),
samplesPerPixel: DICOMWeb.getNumber(instance['00280002']),
photometricInterpretation: DICOMWeb.getString(instance['00280004']),
planarConfiguration: DICOMWeb.getNumber(instance['00280006']),
rows: DICOMWeb.getNumber(instance['00280010']),
columns: DICOMWeb.getNumber(instance['00280011']),
pixelSpacing: DICOMWeb.getString(instance['00280030']),
pixelAspectRatio: DICOMWeb.getString(instance['00280034']),
bitsAllocated: DICOMWeb.getNumber(instance['00280100']),
bitsStored: DICOMWeb.getNumber(instance['00280101']),
highBit: DICOMWeb.getNumber(instance['00280102']),
pixelRepresentation: DICOMWeb.getNumber(instance['00280103']),
smallestPixelValue: DICOMWeb.getNumber(instance['00280106']),
largestPixelValue: DICOMWeb.getNumber(instance['00280107']),
windowCenter: DICOMWeb.getString(instance['00281050']),
windowWidth: DICOMWeb.getString(instance['00281051']),
rescaleIntercept: DICOMWeb.getNumber(instance['00281052']),
rescaleSlope: DICOMWeb.getNumber(instance['00281053']),
rescaleType: DICOMWeb.getNumber(instance['00281054']),
sourceImageInstanceUid: getSourceImageInstanceUid(instance),
laterality: DICOMWeb.getString(instance['00200062']),
viewPosition: DICOMWeb.getString(instance['00185101']),
acquisitionDateTime: DICOMWeb.getString(instance['0008002A']),
numberOfFrames: DICOMWeb.getNumber(instance['00280008']),
frameIncrementPointer: getFrameIncrementPointer(instance['00280009']),
frameTime: DICOMWeb.getNumber(instance['00181063']),
frameTimeVector: parseFloatArray(DICOMWeb.getString(instance['00181065'])),
sliceThickness: DICOMWeb.getNumber(instance['00180050']),
lossyImageCompression: DICOMWeb.getString(instance['00282110']),
derivationDescription: DICOMWeb.getString(instance['00282111']),
lossyImageCompressionRatio: DICOMWeb.getString(instance['00282112']),
lossyImageCompressionMethod: DICOMWeb.getString(instance['00282114']),
echoNumber: DICOMWeb.getString(instance['00180086']),
contrastBolusAgent: DICOMWeb.getString(instance['00180010']),
radiopharmaceuticalInfo: getRadiopharmaceuticalInfo(instance),
baseWadoRsUri: baseWadoRsUri,
wadouri: WADOProxy.convertURL(wadouri, server),
wadorsuri: WADOProxy.convertURL(wadorsuri, server),
imageRendering: server.imageRendering,
thumbnailRendering: server.thumbnailRendering
}; // Get additional information if the instance uses "PALETTE COLOR" photometric interpretation
if (!(instanceSummary.photometricInterpretation === 'PALETTE COLOR')) {
_context2.next = 16;
break;
}
redPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281101']));
greenPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281102']));
bluePaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281103']));
_context2.next = 14;
return _regenerator.default.awrap(getPaletteColors(server, instance, redPaletteColorLookupTableDescriptor));
case 14:
palettes = _context2.sent;
if (palettes) {
if (palettes.uid) {
instanceSummary.paletteColorLookupTableUID = palettes.uid;
}
instanceSummary.redPaletteColorLookupTableData = palettes.red;
instanceSummary.greenPaletteColorLookupTableData = palettes.green;
instanceSummary.bluePaletteColorLookupTableData = palettes.blue;
instanceSummary.redPaletteColorLookupTableDescriptor = redPaletteColorLookupTableDescriptor;
instanceSummary.greenPaletteColorLookupTableDescriptor = greenPaletteColorLookupTableDescriptor;
instanceSummary.bluePaletteColorLookupTableDescriptor = bluePaletteColorLookupTableDescriptor;
}
case 16:
series.instances.push(instanceSummary);
case 17:
case "end":
return _context2.stop();
}
}
}
return _callee$;
}(), null, this);
}
return _callee;
}())));
case 10:
return _context3.abrupt("return", studyData);
case 11:
case "end":
return _context3.stop();
}
}
}
return resultDataToStudyMetadata$;
}(), null, this);
}
/**
* Retrieved Study MetaData from a DICOM server using a WADO call
* @param server
* @param studyInstanceUid
* @returns {Promise}
*/
OHIF.studies.services.WADO.RetrieveMetadata = function () {
function _callee2(server, studyInstanceUid) {
var url;
return _regenerator.default.async(function () {
function _callee2$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
url = buildUrl(server, studyInstanceUid);
return _context4.abrupt("return", new Promise(function (resolve, reject) {
DICOMWeb.getJSON(url, server.requestOptions).then(function (result) {
resultDataToStudyMetadata(server, studyInstanceUid, result).then(function (study) {
study.wadoUriRoot = server.wadoUriRoot;
study.studyInstanceUid = studyInstanceUid;
resolve(study);
}, reject);
}, reject);
}));
case 2:
case "end":
return _context4.stop();
}
}
}
return _callee2$;
}(), null, this);
}
return _callee2;
}();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}},"client":{"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./components"));
module.watch(require("./lib"));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"components":{"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./browser"));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"browser":{"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./item.html"));
module.watch(require("./item.js"));
module.watch(require("./list.html"));
module.watch(require("./list.js"));
module.watch(require("./list.styl"));
module.watch(require("./quickSwitch.html"));
module.watch(require("./quickSwitch.js"));
module.watch(require("./series.html"));
module.watch(require("./series.js"));
module.watch(require("./sidebar.html"));
module.watch(require("./sidebar.js"));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"item.html":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/ohif_studies/imports/client/components/browser/item.html //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./template.item.js"), {
"*": module.makeNsSetter(true)
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"template.item.js":function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/template.item.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Template.__checkName("studyBrowserItem");
Template["studyBrowserItem"] = new Template("Template.studyBrowserItem", (function() {
var view = this;
return HTML.DIV({
class: function() {
return [ "study-browser-item ", Spacebars.mustache(Spacebars.dot(view.lookup("."), "studyItemClass")), " ", Blaze.If(function() {
return Spacebars.call(view.lookup("isActive"));
}, function() {
return "active";
}), " ", Blaze.If(function() {
return Spacebars.call(view.lookup("isLoading"));
}, function() {
return "loading";
}) ];
},
"data-uid": function() {
return Spacebars.mustache(Spacebars.dot(view.lookup("."), "studyInformation", "studyInstanceUid"));
}
}, "\n ", HTML.DIV({
class: "study-item"
}, "\n ", Blaze.If(function() {
return Spacebars.call(view.lookup("isLoading"));
}, function() {
return [ "\n ", Spacebars.include(view.lookupTemplate("loadingText")), "\n " ];
}), "\n ", Blaze.Let({
studyData: function() {
return Spacebars.call(Spacebars.dot(view.lookup("instance"), "studyData", "get"));
}
}, function() {
return [ "\n ", HTML.DIV({
class: "study-item-box"
}, "\n ", HTML.DIV({
class: "study-modality"
}, "\n ", HTML.DIV({
class: "study-modality-text",
style: function() {
return Spacebars.mustache(view.lookup("modalityStyle"), Spacebars.dot(view.lookup("studyData"), "modalities"));
}
}, Blaze.View("lookup:studyData.modalities", function() {
return Spacebars.mustache(Spacebars.dot(view.lookup("studyData"), "modalities"));
})), "\n "), "\n ", HTML.DIV({
class: "study-text"
}, "\n ", Blaze.If(function() {
return Spacebars.dataMustache(view.lookup("or"), view.lookup("isLoaded"), view.lookup("hasDescriptionAndDate"));
}, function() {
return [ "\n ", HTML.DIV({
class: "study-date"
}, Blaze.View("lookup:formatDA", function() {
return Spacebars.mustache(view.lookup("formatDA"), Spacebars.dot(view.lookup("studyData"), "studyDate"), "D-MMM-YYYY");
})), "\n ", HTML.DIV({
class: "study-description"
}, Blaze.View("lookup:studyData.studyDescription", function() {
return Spacebars.mustache(Spacebars.dot(view.lookup("studyData"), "studyDescription"));
})), "\n " ];
}, function() {
return [ "\n ", HTML.DIV({
class: "study-availability"
}, Blaze.If(function() {
return Spacebars.dataMustache(view.lookup("eq"), view.lookup("studyAvailable"), false);
}, function() {
return "N/A";
}, function() {
return "Click to load";
})), "\n " ];
}), "\n "), "\n "), "\n " ];
}), "\n "), "\n ", Blaze.If(function() {
return Spacebars.call(Spacebars.dot(view.lookup("."), "studyChildTemplate"));
}, function() {
return [ "\n ", Blaze.If(function() {
return Spacebars.dataMustache(view.lookup("and"), Spacebars.dataMustache(view.lookup("not"), view.lookup("isLoading")), Spacebars.dot(view.lookup("instance"), "studyData", "get"), Spacebars.dot(view.lookup("instance"), "loaded"));
}, function() {
return [ "\n ", Blaze._TemplateWith(function() {
return {
template: Spacebars.call(Spacebars.dot(view.lookup("."), "studyChildTemplate")),
data: Spacebars.call(Spacebars.dataMustache(view.lookup("clone"), view.lookup(".")))
};
}, function() {
return Spacebars.include(function() {
return Spacebars.call(Template.__dynamic);
});
}), "\n " ];
}), "\n " ];
}), "\n ");
}));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"item.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/item.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Template;
module.watch(require("meteor/templating"), {
Template: function (v) {
Template = v;
}
}, 0);
var ReactiveVar;
module.watch(require("meteor/reactive-var"), {
ReactiveVar: function (v) {
ReactiveVar = v;
}
}, 1);
var Tracker;
module.watch(require("meteor/tracker"), {
Tracker: function (v) {
Tracker = v;
}
}, 2);
var $;
module.watch(require("meteor/jquery"), {
$: function (v) {
$ = v;
}
}, 3);
var _;
module.watch(require("meteor/underscore"), {
_: function (v) {
_ = v;
}
}, 4);
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 5);
Template.studyBrowserItem.onCreated(function () {
var instance = Template.instance();
var studyInformation = instance.data.studyInformation;
var studyInstanceUid = studyInformation.studyInstanceUid;
instance.loaded = new ReactiveVar(false);
instance.loading = new ReactiveVar(false);
instance.studyData = new ReactiveVar(studyInformation); // Try to load the study data from an external source if available
if (OHIF.studies.getStudyBoxData) {
OHIF.studies.getStudyBoxData(studyInformation).then(function (studyData) {
if (!instance.loaded.get()) {
instance.studyData.set(studyData);
}
});
}
instance.studyMetadata = null;
instance.getStudyMetadata = function () {
instance.loading.dep.depend();
if (!instance.studyMetadata) {
var study = OHIF.viewer.Studies.findBy({
studyInstanceUid: studyInstanceUid
}) || null;
if (study && !(study instanceof OHIF.viewerbase.metadata.StudyMetadata)) {
study = new OHIF.metadata.StudyMetadata(study, study.studyInstanceUid);
}
instance.studyMetadata = study;
}
return instance.studyMetadata;
};
instance.autorun(function () {
var instance = Template.instance();
OHIF.studies.loadingDict.get(studyInstanceUid);
var studyMetadata = instance.getStudyMetadata();
if (studyMetadata) {
var firstInstance = studyMetadata.getFirstInstance();
instance.studyData.set({
studyDate: firstInstance.getRawValue('x00080020') || '',
studyDescription: firstInstance.getRawValue('x00081030') || '',
modalities: firstInstance.getRawValue('x00080060') || ''
});
instance.loaded.set(true);
instance.loading.set(false);
}
});
});
Template.studyBrowserItem.events({
'click .study-item': function (event, instance) {
if (instance.loading.get()) return;
var studyInformation = instance.data.studyInformation; // Skip if study is not available (set to false explicitly)
if (studyInformation.available === false) {
return;
}
var element = event.currentTarget.parentElement;
var $element = $(element);
var triggerClick = function () {
var cloneEvent = _.clone(event);
delete cloneEvent.type;
cloneEvent.currentTarget = cloneEvent.target = element;
var newEvent = $.Event('ohif.studies.study.click', cloneEvent);
$element.trigger(newEvent, studyInformation);
};
if (instance.loaded.get()) {
triggerClick();
} else {
instance.loading.set(true);
OHIF.studies.loadStudy(studyInformation.studyInstanceUid).then(function () {
instance.loaded.set(true);
instance.loading.set(false);
$element.trigger('ohif.studies.study.load', studyInformation);
Tracker.afterFlush(triggerClick);
});
}
}
});
Template.studyBrowserItem.helpers({
isLoaded: function () {
return Template.instance().loaded.get();
},
hasDescriptionAndDate: function () {
var studyData = Template.instance().studyData.get();
return studyData.studyDescription && studyData.studyDate;
},
isLoading: function () {
return Template.instance().loading.get();
},
modalitiesText: function (modalities) {
var text = modalities || 'UN';
return _.uniq(text.split(/[^A-Za-z]+/g)).join(' ');
},
modalityStyle: function (modalities) {
// Responsively styles the Modality Acronyms for studies with more than one modality
var numModalities = modalities ? modalities.split(/\s/g).length : 1;
if (numModalities === 1) {
// If we have only one modality, it should take up the whole div
return 'font-size:1em';
} else if (numModalities === 2) {
// If we have two modalities, let them sit side-by-side
return 'font-size:0.7em';
} else {
// If we have more than two modalities, change the line height to display multiple rows
return 'font-size:0.7em;line-height:1.4em;padding-top:0.5em';
}
},
studyAvailable: function () {
var studyInformation = Template.instance().data.studyInformation;
if (!studyInformation) {
return;
}
return studyInformation.available;
}
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"list.html":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/ohif_studies/imports/client/components/browser/list.html //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./template.list.js"), {
"*": module.makeNsSetter(true)
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"template.list.js":function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/template.list.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Template.__checkName("studyBrowserList");
Template["studyBrowserList"] = new Template("Template.studyBrowserList", (function() {
var view = this;
return HTML.DIV({
class: function() {
return [ "study-browser-list ", Spacebars.mustache(Spacebars.dot(view.lookup("."), "class")) ];
}
}, "\n ", Blaze.Each(function() {
return {
_sequence: Spacebars.call(view.lookup("getStudiesInformation")),
_variable: "studyInformation"
};
}, function() {
return [ "\n ", Blaze._TemplateWith(function() {
return Spacebars.dataMustache(view.lookup("clone"), view.lookup("."), Spacebars.kw({
studyInformation: view.lookup("studyInformation")
}));
}, function() {
return Spacebars.include(view.lookupTemplate("studyBrowserItem"));
}), "\n " ];
}), "\n ");
}));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"list.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/list.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Template;
module.watch(require("meteor/templating"), {
Template: function (v) {
Template = v;
}
}, 0);
Template.studyBrowserList.onCreated(function () {
var instance = Template.instance();
if (instance.data.studiesData) {
instance.studiesData = instance.data.studiesData;
}
});
Template.studyBrowserList.helpers({
getStudiesInformation: function () {
var instance = Template.instance();
var studiesInformation;
if (instance.studiesData) {
studiesInformation = instance.studiesData.get() || [];
} else {
studiesInformation = instance.data.studiesInformation || [];
}
var result = new Map();
studiesInformation.forEach(function (item) {
return result.set(item.studyInstanceUid, item);
});
return Array.from(result.values());
}
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"list.styl":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/ohif_studies/imports/client/components/browser/list.styl //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./list.styl.css"), {
"*": module.makeNsSetter(true)
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"list.styl.css":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/list.styl.css //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.exports = require("meteor/modules").addStyles(
".theme-icon-crickets,\n.theme-icon-tide,\n.theme-icon-tigerlily,\n.theme-icon-quartz,\n.theme-icon-overcast,\n.theme-icon-mint,\n.theme-icon-honeycomb {\n display: inline-block;\n background: url(\"/packages/ohif_design/assets/theme-icons.png\") no-repeat;\n overflow: hidden;\n text-indent: -9999px;\n text-align: left;\n}\n.theme-icon-crickets {\n background-position: 0px 0px;\n width: 64px;\n height: 56px;\n}\n.theme-icon-tide {\n background-position: 0px -56px;\n width: 64px;\n height: 54px;\n}\n.theme-icon-tigerlily {\n background-position: 0px -110px;\n width: 62px;\n height: 61px;\n}\n.theme-icon-quartz {\n background-position: 0px -171px;\n width: 59px;\n height: 64px;\n}\n.theme-icon-overcast {\n background-position: 0px -235px;\n width: 58px;\n height: 37px;\n}\n.theme-icon-mint {\n background-position: 0px -272px;\n width: 57px;\n height: 61px;\n}\n.theme-icon-honeycomb {\n background-position: 0px -333px;\n width: 50px;\n height: 58px;\n}\n.study-browser-item {\n position: relative;\n -webkit-transform: scale(1);\n -moz-transform: scale(1);\n -ms-transform: scale(1);\n -o-transform: scale(1);\n transform: scale(1);\n}\n.study-browser-item .loadingTextDiv {\n background-color: #14191e;\n -webkit-border-radius: 12px;\n -moz-border-radius: 12px;\n -ms-border-radius: 12px;\n -o-border-radius: 12px;\n border-radius: 12px;\n font-size: 32px;\n opacity: 0;\n margin: 0;\n padding: 25px;\n position: absolute;\n pointer-events: none;\n z-index: 100;\n}\n.study-browser-item .loadingTextDiv {\n color: #91b9cd;\n}\nbody.theme-tide .study-browser-item .loadingTextDiv {\n color: #91b9cd;\n}\nbody.theme-tigerlily .study-browser-item .loadingTextDiv {\n color: #9ccdf8;\n}\nbody.theme-crickets .study-browser-item .loadingTextDiv {\n color: #8be7b5;\n}\nbody.theme-honeycomb .study-browser-item .loadingTextDiv {\n color: #fab797;\n}\nbody.theme-mint .study-browser-item .loadingTextDiv {\n color: #a7e9b3;\n}\nbody.theme-overcast .study-browser-item .loadingTextDiv {\n color: #73f2fc;\n}\nbody.theme-quartz .study-browser-item .loadingTextDiv {\n color: #d7e8fe;\n}\n.study-browser-item.loading .loadingTextDiv {\n height: 100%;\n left: 0;\n opacity: 0.75;\n top: 0;\n width: 100%;\n}\n.study-browser-item.loading .study-item-box {\n opacity: 0.2;\n}\n.study-browser-item.active .study-item-box .study-modality {\n color: #000;\n}\nbody.theme-tide .study-browser-item.active .study-item-box .study-modality {\n color: #000;\n}\nbody.theme-tigerlily .study-browser-item.active .study-item-box .study-modality {\n color: #000;\n}\nbody.theme-crickets .study-browser-item.active .study-item-box .study-modality {\n color: #000;\n}\nbody.theme-honeycomb .study-browser-item.active .study-item-box .study-modality {\n color: #000;\n}\nbody.theme-mint .study-browser-item.active .study-item-box .study-modality {\n color: #000;\n}\nbody.theme-overcast .study-browser-item.active .study-item-box .study-modality {\n color: #000;\n}\nbody.theme-quartz .study-browser-item.active .study-item-box .study-modality {\n color: #000;\n}\n.study-browser-item.active .study-item-box .study-modality,\n.study-browser-item.active .study-item-box .study-modality:before,\n.study-browser-item.active .study-item-box .study-modality:after {\n border-color: #131d29;\n}\n.study-browser-item.active .study-item-box .study-modality,\n.study-browser-item.active .study-item-box .study-modality:before,\n.study-browser-item.active .study-item-box .study-modality:after {\n background-color: #20a5d6;\n}\nbody.theme-tide .study-browser-item.active .study-item-box .study-modality {\n background-color: #20a5d6;\n}\nbody.theme-tide .study-browser-item.active .study-item-box .study-modality:before {\n background-color: #20a5d6;\n}\nbody.theme-tide .study-browser-item.active .study-item-box .study-modality:after {\n background-color: #20a5d6;\n}\nbody.theme-tigerlily .study-browser-item.active .study-item-box .study-modality {\n background-color: #fa8947;\n}\nbody.theme-tigerlily .study-browser-item.active .study-item-box .study-modality:before {\n background-color: #fa8947;\n}\nbody.theme-tigerlily .study-browser-item.active .study-item-box .study-modality:after {\n background-color: #fa8947;\n}\nbody.theme-crickets .study-browser-item.active .study-item-box .study-modality {\n background-color: #d4c3c1;\n}\nbody.theme-crickets .study-browser-item.active .study-item-box .study-modality:before {\n background-color: #d4c3c1;\n}\nbody.theme-crickets .study-browser-item.active .study-item-box .study-modality:after {\n background-color: #d4c3c1;\n}\nbody.theme-honeycomb .study-browser-item.active .study-item-box .study-modality {\n background-color: #cda56b;\n}\nbody.theme-honeycomb .study-browser-item.active .study-item-box .study-modality:before {\n background-color: #cda56b;\n}\nbody.theme-honeycomb .study-browser-item.active .study-item-box .study-modality:after {\n background-color: #cda56b;\n}\nbody.theme-mint .study-browser-item.active .study-item-box .study-modality {\n background-color: #31b166;\n}\nbody.theme-mint .study-browser-item.active .study-item-box .study-modality:before {\n background-color: #31b166;\n}\nbody.theme-mint .study-browser-item.active .study-item-box .study-modality:after {\n background-color: #31b166;\n}\nbody.theme-overcast .study-browser-item.active .study-item-box .study-modality {\n background-color: #507d80;\n}\nbody.theme-overcast .study-browser-item.active .study-item-box .study-modality:before {\n background-color: #507d80;\n}\nbody.theme-overcast .study-browser-item.active .study-item-box .study-modality:after {\n background-color: #507d80;\n}\nbody.theme-quartz .study-browser-item.active .study-item-box .study-modality {\n background-color: #7858ce;\n}\nbody.theme-quartz .study-browser-item.active .study-item-box .study-modality:before {\n background-color: #7858ce;\n}\nbody.theme-quartz .study-browser-item.active .study-item-box .study-modality:after {\n background-color: #7858ce;\n}\n.study-browser-item:not(.active) .study-browser-series {\n max-height: 0 !important;\n}\n.study-browser-item:not(.active) .study-browser-series .study-series-container {\n opacity: 0;\n -webkit-transform: translateY(-100%);\n -moz-transform: translateY(-100%);\n -ms-transform: translateY(-100%);\n -o-transform: translateY(-100%);\n transform: translateY(-100%);\n}\n.study-browser-item .study-browser-series {\n overflow: hidden;\n -webkit-transition: max-height 0.3s ease;\n -moz-transition: max-height 0.3s ease;\n -ms-transition: max-height 0.3s ease;\n -o-transition: max-height 0.3s ease;\n transition: max-height 0.3s ease;\n}\n.study-browser-item .study-browser-series .study-series-container {\n opacity: 1;\n -webkit-transition: opacity 0.3s ease , transform 0.3s ease;\n -moz-transition: opacity 0.3s ease , transform 0.3s ease;\n -ms-transition: opacity 0.3s ease , transform 0.3s ease;\n -o-transition: opacity 0.3s ease , transform 0.3s ease;\n transition: opacity 0.3s ease , transform 0.3s ease;\n -webkit-transform: translateY(0);\n -moz-transform: translateY(0);\n -ms-transform: translateY(0);\n -o-transform: translateY(0);\n transform: translateY(0);\n -webkit-transform-origin: 50% 0%;\n -moz-transform-origin: 50% 0%;\n -ms-transform-origin: 50% 0%;\n -o-transform-origin: 50% 0%;\n transform-origin: 50% 0%;\n}\n.study-item-box {\n border: 1px solid transparent;\n -webkit-border-radius: 12px;\n -moz-border-radius: 12px;\n -ms-border-radius: 12px;\n -o-border-radius: 12px;\n border-radius: 12px;\n cursor: pointer;\n padding: 12px 7px 11px;\n position: relative;\n -webkit-transition: all 0.3s ease;\n -moz-transition: all 0.3s ease;\n -ms-transition: all 0.3s ease;\n -o-transition: all 0.3s ease;\n transition: all 0.3s ease;\n z-index: 0;\n}\n.study-item-box:hover {\n background-color: #14191e;\n border-color: #2d4660;\n}\n.study-item-box:hover.additional {\n color: #91b9cd;\n}\nbody.theme-tide .study-item-box:hover.additional {\n color: #91b9cd;\n}\nbody.theme-tigerlily .study-item-box:hover.additional {\n color: #9ccdf8;\n}\nbody.theme-crickets .study-item-box:hover.additional {\n color: #8be7b5;\n}\nbody.theme-honeycomb .study-item-box:hover.additional {\n color: #fab797;\n}\nbody.theme-mint .study-item-box:hover.additional {\n color: #a7e9b3;\n}\nbody.theme-overcast .study-item-box:hover.additional {\n color: #73f2fc;\n}\nbody.theme-quartz .study-item-box:hover.additional {\n color: #d7e8fe;\n}\n.study-item-box.additional {\n font-size: 16px;\n font-weight: normal;\n height: 91px;\n line-height: 91px;\n padding: 0;\n text-align: center;\n}\n.study-item-box.additional {\n color: #fff;\n}\nbody.theme-tide .study-item-box.additional {\n color: #fff;\n}\nbody.theme-tigerlily .study-item-box.additional {\n color: #fff;\n}\nbody.theme-crickets .study-item-box.additional {\n color: #fff;\n}\nbody.theme-honeycomb .study-item-box.additional {\n color: #fff;\n}\nbody.theme-mint .study-item-box.additional {\n color: #fff;\n}\nbody.theme-overcast .study-item-box.additional {\n color: #fff;\n}\nbody.theme-quartz .study-item-box.additional {\n color: #fff;\n}\n.study-item-box .study-text {\n font-size: 13px;\n left: 89px;\n line-height: 14px;\n position: absolute;\n right: 7px;\n top: 12px;\n}\n.study-item-box .study-text .study-date {\n margin-top: 8px;\n}\n.study-item-box .study-text .study-date {\n color: #91b9cd;\n}\nbody.theme-tide .study-item-box .study-text .study-date {\n color: #91b9cd;\n}\nbody.theme-tigerlily .study-item-box .study-text .study-date {\n color: #9ccdf8;\n}\nbody.theme-crickets .study-item-box .study-text .study-date {\n color: #8be7b5;\n}\nbody.theme-honeycomb .study-item-box .study-text .study-date {\n color: #fab797;\n}\nbody.theme-mint .study-item-box .study-text .study-date {\n color: #a7e9b3;\n}\nbody.theme-overcast .study-item-box .study-text .study-date {\n color: #73f2fc;\n}\nbody.theme-quartz .study-item-box .study-text .study-date {\n color: #d7e8fe;\n}\n.study-item-box .study-text .study-description {\n margin-top: 8px;\n}\n.study-item-box .study-text .study-description {\n color: #fff;\n}\nbody.theme-tide .study-item-box .study-text .study-description {\n color: #fff;\n}\nbody.theme-tigerlily .study-item-box .study-text .study-description {\n color: #fff;\n}\nbody.theme-crickets .study-item-box .study-text .study-description {\n color: #fff;\n}\nbody.theme-honeycomb .study-item-box .study-text .study-description {\n color: #fff;\n}\nbody.theme-mint .study-item-box .study-text .study-description {\n color: #fff;\n}\nbody.theme-overcast .study-item-box .study-text .study-description {\n color: #fff;\n}\nbody.theme-quartz .study-item-box .study-text .study-description {\n color: #fff;\n}\n.study-item-box .study-text .study-availability {\n margin-top: 24px;\n}\n.study-item-box .study-text .study-availability {\n color: #fff;\n}\nbody.theme-tide .study-item-box .study-text .study-availability {\n color: #fff;\n}\nbody.theme-tigerlily .study-item-box .study-text .study-availability {\n color: #fff;\n}\nbody.theme-crickets .study-item-box .study-text .study-availability {\n color: #fff;\n}\nbody.theme-honeycomb .study-item-box .study-text .study-availability {\n color: #fff;\n}\nbody.theme-mint .study-item-box .study-text .study-availability {\n color: #fff;\n}\nbody.theme-overcast .study-item-box .study-text .study-availability {\n color: #fff;\n}\nbody.theme-quartz .study-item-box .study-text .study-availability {\n color: #fff;\n}\n.study-item-box .study-modality {\n font-size: 20px;\n line-height: 50px;\n margin-left: 12px;\n margin-top: 12px;\n position: relative;\n}\n.study-item-box .study-modality {\n color: #91b9cd;\n}\nbody.theme-tide .study-item-box .study-modality {\n color: #91b9cd;\n}\nbody.theme-tigerlily .study-item-box .study-modality {\n color: #9ccdf8;\n}\nbody.theme-crickets .study-item-box .study-modality {\n color: #8be7b5;\n}\nbody.theme-honeycomb .study-item-box .study-modality {\n color: #fab797;\n}\nbody.theme-mint .study-item-box .study-modality {\n color: #a7e9b3;\n}\nbody.theme-overcast .study-item-box .study-modality {\n color: #73f2fc;\n}\nbody.theme-quartz .study-item-box .study-modality {\n color: #d7e8fe;\n}\n.study-item-box .study-modality .study-modality-text {\n height: 100%;\n overflow: hidden;\n text-align: center;\n text-transform: uppercase;\n}\n.study-item-box .study-modality,\n.study-item-box .study-modality:before,\n.study-item-box .study-modality:after {\n -webkit-border-radius: 8px;\n -moz-border-radius: 8px;\n -ms-border-radius: 8px;\n -o-border-radius: 8px;\n border-radius: 8px;\n height: 54px;\n -webkit-transition: all 0.3s ease;\n -moz-transition: all 0.3s ease;\n -ms-transition: all 0.3s ease;\n -o-transition: all 0.3s ease;\n transition: all 0.3s ease;\n width: 54px;\n}\n.study-item-box .study-modality,\n.study-item-box .study-modality:before,\n.study-item-box .study-modality:after {\n border: 2px solid #000;\n}\nbody.theme-tide .study-item-box .study-modality {\n border: 2px solid #000;\n}\nbody.theme-tide .study-item-box .study-modality:before {\n border: 2px solid #000;\n}\nbody.theme-tide .study-item-box .study-modality:after {\n border: 2px solid #000;\n}\nbody.theme-tigerlily .study-item-box .study-modality {\n border: 2px solid #000;\n}\nbody.theme-tigerlily .study-item-box .study-modality:before {\n border: 2px solid #000;\n}\nbody.theme-tigerlily .study-item-box .study-modality:after {\n border: 2px solid #000;\n}\nbody.theme-crickets .study-item-box .study-modality {\n border: 2px solid #000;\n}\nbody.theme-crickets .study-item-box .study-modality:before {\n border: 2px solid #000;\n}\nbody.theme-crickets .study-item-box .study-modality:after {\n border: 2px solid #000;\n}\nbody.theme-honeycomb .study-item-box .study-modality {\n border: 2px solid #000;\n}\nbody.theme-honeycomb .study-item-box .study-modality:before {\n border: 2px solid #000;\n}\nbody.theme-honeycomb .study-item-box .study-modality:after {\n border: 2px solid #000;\n}\nbody.theme-mint .study-item-box .study-modality {\n border: 2px solid #000;\n}\nbody.theme-mint .study-item-box .study-modality:before {\n border: 2px solid #000;\n}\nbody.theme-mint .study-item-box .study-modality:after {\n border: 2px solid #000;\n}\nbody.theme-overcast .study-item-box .study-modality {\n border: 2px solid #000;\n}\nbody.theme-overcast .study-item-box .study-modality:before {\n border: 2px solid #000;\n}\nbody.theme-overcast .study-item-box .study-modality:after {\n border: 2px solid #000;\n}\nbody.theme-quartz .study-item-box .study-modality {\n border: 2px solid #000;\n}\nbody.theme-quartz .study-item-box .study-modality:before {\n border: 2px solid #000;\n}\nbody.theme-quartz .study-item-box .study-modality:after {\n border: 2px solid #000;\n}\n.study-item-box .study-modality,\n.study-item-box .study-modality:before,\n.study-item-box .study-modality:after {\n background-color: #3e5975;\n}\nbody.theme-tide .study-item-box .study-modality {\n background-color: #3e5975;\n}\nbody.theme-tide .study-item-box .study-modality:before {\n background-color: #3e5975;\n}\nbody.theme-tide .study-item-box .study-modality:after {\n background-color: #3e5975;\n}\nbody.theme-tigerlily .study-item-box .study-modality {\n background-color: #5b3a59;\n}\nbody.theme-tigerlily .study-item-box .study-modality:before {\n background-color: #5b3a59;\n}\nbody.theme-tigerlily .study-item-box .study-modality:after {\n background-color: #5b3a59;\n}\nbody.theme-crickets .study-item-box .study-modality {\n background-color: #344a61;\n}\nbody.theme-crickets .study-item-box .study-modality:before {\n background-color: #344a61;\n}\nbody.theme-crickets .study-item-box .study-modality:after {\n background-color: #344a61;\n}\nbody.theme-honeycomb .study-item-box .study-modality {\n background-color: #344a61;\n}\nbody.theme-honeycomb .study-item-box .study-modality:before {\n background-color: #344a61;\n}\nbody.theme-honeycomb .study-item-box .study-modality:after {\n background-color: #344a61;\n}\nbody.theme-mint .study-item-box .study-modality {\n background-color: #344a61;\n}\nbody.theme-mint .study-item-box .study-modality:before {\n background-color: #344a61;\n}\nbody.theme-mint .study-item-box .study-modality:after {\n background-color: #344a61;\n}\nbody.theme-overcast .study-item-box .study-modality {\n background-color: #344a61;\n}\nbody.theme-overcast .study-item-box .study-modality:before {\n background-color: #344a61;\n}\nbody.theme-overcast .study-item-box .study-modality:after {\n background-color: #344a61;\n}\nbody.theme-quartz .study-item-box .study-modality {\n background-color: #344a61;\n}\nbody.theme-quartz .study-item-box .study-modality:before {\n background-color: #344a61;\n}\nbody.theme-quartz .study-item-box .study-modality:after {\n background-color: #344a61;\n}\n.study-item-box .study-modality:before,\n.study-item-box .study-modality:after {\n display: block;\n content: '';\n position: absolute;\n}\n.study-item-box .study-modality:before {\n top: -8px;\n left: -8px;\n z-index: -1;\n}\n.study-item-box .study-modality:after {\n top: -14px;\n left: -14px;\n z-index: -2;\n}\n"
);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"quickSwitch.html":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/ohif_studies/imports/client/components/browser/quickSwitch.html //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./template.quickSwitch.js"), {
"*": module.makeNsSetter(true)
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"template.quickSwitch.js":function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/template.quickSwitch.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Template.__checkName("studyBrowserQuickSwitch");
Template["studyBrowserQuickSwitch"] = new Template("Template.studyBrowserQuickSwitch", (function() {
var view = this;
return Blaze._TemplateWith(function() {
return Spacebars.call(view.lookup("studyBrowserData"));
}, function() {
return Spacebars.include(view.lookupTemplate("studyBrowserList"));
});
}));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"quickSwitch.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/quickSwitch.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Template;
module.watch(require("meteor/templating"), {
Template: function (v) {
Template = v;
}
}, 0);
var ReactiveVar;
module.watch(require("meteor/reactive-var"), {
ReactiveVar: function (v) {
ReactiveVar = v;
}
}, 1);
var Tracker;
module.watch(require("meteor/tracker"), {
Tracker: function (v) {
Tracker = v;
}
}, 2);
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 3);
Template.studyBrowserQuickSwitch.onCreated(function () {
var instance = Template.instance();
instance.studiesInformation = new ReactiveVar();
var filter = {
studyInstanceUid: OHIF.viewer.data.studyInstanceUids
};
OHIF.studies.searchStudies(filter).then(function (studies) {
return instance.studiesInformation.set(studies);
});
});
Template.studyBrowserQuickSwitch.onRendered(function () {
var instance = Template.instance();
instance.autorun(function () {
instance.studiesInformation.dep.depend();
var currentStudy = instance.data.currentStudy.get();
var studyInstanceUid = currentStudy && currentStudy.studyInstanceUid || '';
Tracker.afterFlush(function () {
var $studyBrowserItems = instance.$('.study-browser-item');
$studyBrowserItems.removeClass('active');
$studyBrowserItems.filter("[data-uid=\"" + studyInstanceUid + "\"]").addClass('active');
});
});
});
Template.studyBrowserQuickSwitch.events({
'ohif.studies.study.click': function (event, instance, studyInformation) {
var studyInstanceUid = studyInformation.studyInstanceUid;
var study = OHIF.viewer.Studies.findBy({
studyInstanceUid: studyInstanceUid
});
instance.data.currentStudy.set(study);
var $studySwitch = $(event.currentTarget).closest('.study-switch');
$studySwitch.siblings('.series-switch').trigger('rescale');
}
});
Template.studyBrowserQuickSwitch.helpers({
studyBrowserData: function () {
var instance = Template.instance();
var studiesInformation = instance.studiesInformation.get();
return {
studiesInformation: studiesInformation
};
}
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"series.html":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/ohif_studies/imports/client/components/browser/series.html //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./template.series.js"), {
"*": module.makeNsSetter(true)
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"template.series.js":function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/template.series.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Template.__checkName("studyBrowserSeries");
Template["studyBrowserSeries"] = new Template("Template.studyBrowserSeries", (function() {
var view = this;
return HTML.DIV({
class: "study-browser-series"
}, "\n ", HTML.DIV({
class: "study-series-container"
}, "\n ", Blaze.Each(function() {
return {
_sequence: Spacebars.call(Spacebars.dot(view.lookup("instance"), "thumbnails", "get")),
_variable: "thumbnail"
};
}, function() {
return [ "\n ", Blaze._TemplateWith(function() {
return Spacebars.dataMustache(view.lookup("clone"), view.lookup("."), Spacebars.kw({
thumbnail: view.lookup("thumbnail")
}));
}, function() {
return Spacebars.include(view.lookupTemplate("thumbnailEntry"));
}), "\n " ];
}), "\n "), "\n ");
}));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"series.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/series.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Template;
module.watch(require("meteor/templating"), {
Template: function (v) {
Template = v;
}
}, 0);
var ReactiveVar;
module.watch(require("meteor/reactive-var"), {
ReactiveVar: function (v) {
ReactiveVar = v;
}
}, 1);
var Tracker;
module.watch(require("meteor/tracker"), {
Tracker: function (v) {
Tracker = v;
}
}, 2);
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 3);
Template.studyBrowserSeries.onCreated(function () {
var instance = Template.instance();
var _instance$data = instance.data,
studyInformation = _instance$data.studyInformation,
studyMetadata = _instance$data.studyMetadata;
var studyInstanceUid = studyMetadata && studyMetadata.studyInstanceUid || studyInformation && studyInformation.studyInstanceUid;
instance.thumbnails = new ReactiveVar([]); // Get the study metadata and update the study thumbnails
instance.autorun(function () {
var metadata = studyMetadata; // Check for reactivity
if (metadata instanceof ReactiveVar) {
metadata = metadata.get();
} // Retrieve the study metadata
if (!metadata) {
metadata = OHIF.viewer.Studies.findBy({
studyInstanceUid: studyInstanceUid
});
} // Stop here if there's no study metadata
if (!metadata) return; // Get the study display sets
var displaySets = metadata.displaySets;
if (!displaySets.length) {
displaySets = OHIF.viewerbase.sortingManager.getDisplaySets(metadata);
metadata.displaySets = displaySets;
metadata.setDisplaySets(displaySets);
metadata.forEachDisplaySet(function (displaySet) {
OHIF.viewerbase.stackManager.makeAndAddStack(metadata, displaySet);
});
} // Defines the resulting thumbnails list
var thumbnails = [];
displaySets.forEach(function (stack, thumbnailIndex) {
thumbnails.push({
thumbnailIndex: thumbnailIndex,
stack: stack
});
});
instance.thumbnails.set(thumbnails);
});
});
Template.studyBrowserSeries.onRendered(function () {
var instance = Template.instance(); // Run this computation every time the thumbnails are changed
instance.autorun(function () {
instance.thumbnails.get();
Tracker.afterFlush(function () {
instance.$('.study-browser-series').adjustMax('height');
});
});
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"sidebar.html":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/ohif_studies/imports/client/components/browser/sidebar.html //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./template.sidebar.js"), {
"*": module.makeNsSetter(true)
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"template.sidebar.js":function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/template.sidebar.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Template.__checkName("studyBrowserSidebar");
Template["studyBrowserSidebar"] = new Template("Template.studyBrowserSidebar", (function() {
var view = this;
return Blaze._TemplateWith(function() {
return {
class: Spacebars.call("fit noselect"),
scrollableClass: Spacebars.call("p-a-1"),
scrollStep: Spacebars.call(191)
};
}, function() {
return Spacebars.include(view.lookupTemplate("scrollArea"), function() {
return [ "\n ", Blaze._TemplateWith(function() {
return Spacebars.dataMustache(view.lookup("clone"), view.lookup("."), Spacebars.kw({
studyChildTemplate: "studyBrowserSeries"
}));
}, function() {
return Spacebars.include(view.lookupTemplate("studyBrowserList"));
}), "\n " ];
});
});
}));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"sidebar.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/components/browser/sidebar.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Template;
module.watch(require("meteor/templating"), {
Template: function (v) {
Template = v;
}
}, 0);
Template.studyBrowserSidebar.events({
'ohif.studies.study.click': function (event, instance) {
var $element = $(event.currentTarget); // Remove active class from sibling studies
$element.siblings().removeClass('active'); // Toggle the active class on clicked study
$element.toggleClass('active');
}
});
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}},"lib":{"getStudyBoxData.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/getStudyBoxData.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
/**
* Overridable namespace to allow getting study boxes data externally.
*
* The function must handle the first parameter as a studyInformation object containing at least the
* studyInstanceUid attribute.
*
* Shall return a promise that will be resolved with an object containing those attributes:
* - studyInstanceUid {String}: copy of studyInformation.studyInstanceUid
* - modalities {String}: 2 uppercase letters for each modality split by any non-alphabetical char(s)
* - studyDate {String}: date formatted as YYYYMMDD
* - studyDescription {String}: study description string
*/
OHIF.studies.getStudyBoxData = false;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.watch(require("./classes"));
module.watch(require("./getStudyBoxData"));
module.watch(require("./loadStudy"));
module.watch(require("./retrieveStudiesMetadata"));
module.watch(require("./retrieveStudyMetadata"));
module.watch(require("./searchStudies"));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"loadStudy.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/loadStudy.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var ReactiveDict;
module.watch(require("meteor/reactive-dict"), {
ReactiveDict: function (v) {
ReactiveDict = v;
}
}, 0);
var Tracker;
module.watch(require("meteor/tracker"), {
Tracker: function (v) {
Tracker = v;
}
}, 1);
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 2);
var Meteor;
module.watch(require("meteor/meteor"), {
Meteor: function (v) {
Meteor = v;
}
}, 3);
// Create a studies loaded state dictionary to enable reactivity. Values: loading|loaded|failed
OHIF.studies.loadingDict = new ReactiveDict();
/**
* Load the study metadata and store its information locally
*
* @param {String} studyInstanceUid The UID of the Study to be loaded
* @returns {Promise} that will be resolved with the study metadata or rejected with an error
*/
OHIF.studies.loadStudy = function (studyInstanceUid) {
return new Promise(function (resolve, reject) {
// Disable reactivity to get the current loading state
var currentLoadingState;
Tracker.nonreactive(function () {
currentLoadingState = OHIF.studies.loadingDict.get(studyInstanceUid) || '';
}); // Set the loading state as the study is not yet loaded
if (currentLoadingState !== 'loading') {
OHIF.studies.loadingDict.set(studyInstanceUid, 'loading');
}
var studyLoaded = OHIF.viewer.Studies.findBy({
studyInstanceUid: studyInstanceUid
});
if (studyLoaded) {
OHIF.studies.loadingDict.set(studyInstanceUid, 'loaded');
resolve(studyLoaded);
return;
}
return OHIF.studies.retrieveStudyMetadata(studyInstanceUid).then(function (study) {
if (window.HipaaLogger && Meteor.user && Meteor.user()) {
window.HipaaLogger.logEvent({
eventType: 'viewed',
userId: Meteor.userId(),
userName: Meteor.user().profile.fullName,
collectionName: 'Study',
recordId: studyInstanceUid,
patientId: study.patientId,
patientName: study.patientName
});
} // Once the data was retrieved, the series are sorted by series and instance number
OHIF.viewerbase.sortStudy(study); // Updates WADO-RS metaDataManager
OHIF.viewerbase.updateMetaDataManager(study); // Transform the study in a StudyMetadata object
var studyMetadata = new OHIF.metadata.StudyMetadata(study); // Add the display sets to the study
study.displaySets = OHIF.viewerbase.sortingManager.getDisplaySets(studyMetadata);
study.displaySets.forEach(function (displaySet) {
OHIF.viewerbase.stackManager.makeAndAddStack(study, displaySet);
studyMetadata.addDisplaySet(displaySet);
}); // Persist study data into OHIF.viewer
OHIF.viewer.Studies.insert(study);
OHIF.viewer.StudyMetadataList.insert(study); // Add the study to the loading listener to allow loading progress handling
var studyLoadingListener = OHIF.viewerbase.StudyLoadingListener.getInstance();
studyLoadingListener.addStudy(study); // Add the studyInstanceUid to the loaded state dictionary
OHIF.studies.loadingDict.set(studyInstanceUid, 'loaded');
resolve(study);
}).catch(function () {
OHIF.studies.loadingDict.set(studyInstanceUid, 'failed');
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
reject(args);
});
});
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"retrieveStudiesMetadata.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/retrieveStudiesMetadata.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
/**
* Retrieves metaData for multiple studies at once.
*
* This function calls retrieveStudyMetadata several times, asynchronously,
* and waits for all of the results to be returned.
*
* @param studyInstanceUids The UIDs of the Studies to be retrieved
* @return Promise
*/
OHIF.studies.retrieveStudiesMetadata = function (studyInstanceUids, seriesInstanceUids) {
// Create an empty array to store the Promises for each metaData retrieval call
var promises = []; // Loop through the array of studyInstanceUids
studyInstanceUids.forEach(function (studyInstanceUid) {
// Send the call and resolve or reject the related promise based on its outcome
var promise = OHIF.studies.retrieveStudyMetadata(studyInstanceUid, seriesInstanceUids); // Add the current promise to the array of promises
promises.push(promise);
}); // When all of the promises are complete, this callback runs
var promise = Promise.all(promises); // Warn the error on console if some retrieval failed
promise.catch(function (error) {
return OHIF.log.warn(error);
});
return promise;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"retrieveStudyMetadata.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/retrieveStudyMetadata.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Meteor;
module.watch(require("meteor/meteor"), {
Meteor: function (v) {
Meteor = v;
}
}, 0);
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 1);
module.watch(require("meteor/ohif:viewerbase"));
// Define the StudyMetaDataPromises object. This is used as a cache to store study meta data
// promises and prevent unnecessary subsequent calls to the server
var StudyMetaDataPromises = new Map();
/**
* Delete the cached study metadata retrieval promise to ensure that the browser will
* re-retrieve the study metadata when it is next requested
*
* @param {String} studyInstanceUid The UID of the Study to be removed from cache
*
*/
OHIF.studies.deleteStudyMetadataPromise = function (studyInstanceUid) {
if (StudyMetaDataPromises.has(studyInstanceUid)) {
StudyMetaDataPromises.delete(studyInstanceUid);
}
};
/**
* Retrieves study metadata using a server call
*
* @param {String} studyInstanceUid The UID of the Study to be retrieved
* @returns {Promise} that will be resolved with the metadata or rejected with the error
*/
OHIF.studies.retrieveStudyMetadata = function (studyInstanceUid, seriesInstanceUids) {
// @TODO: Whenever a study metadata request has failed, its related promise will be rejected once and for all
// and further requests for that metadata will always fail. On failure, we probably need to remove the
// corresponding promise from the "StudyMetaDataPromises" map...
// If the StudyMetaDataPromises cache already has a pending or resolved promise related to the
// given studyInstanceUid, then that promise is returned
if (StudyMetaDataPromises.has(studyInstanceUid)) {
return StudyMetaDataPromises.get(studyInstanceUid);
}
var seriesKeys = Array.isArray(seriesInstanceUids) ? '|' + seriesInstanceUids.join('|') : '';
var timingKey = "retrieveStudyMetadata[" + studyInstanceUid + seriesKeys + "]";
OHIF.log.time(timingKey); // Create a promise to handle the data retrieval
var promise = new Promise(function (resolve, reject) {
var server = OHIF.servers.getCurrentServer(); // If no study metadata is in the cache variable, we need to retrieve it from
// the server with a call.
if (server.type === 'dicomWeb' && server.requestOptions.requestFromBrowser === true) {
OHIF.studies.services.WADO.RetrieveMetadata(server, studyInstanceUid).then(function (data) {
resolve(data);
}, reject);
} else {
Meteor.call('GetStudyMetadata', studyInstanceUid, function (error, study) {
OHIF.log.timeEnd(timingKey);
if (error) {
var errorType = error.error;
var errorMessage = '';
if (errorType === 'server-connection-error') {
errorMessage = 'There was an error connecting to the DICOM server, please verify if it is up and running.';
} else if (errorType === 'server-internal-error') {
errorMessage = "There was an internal error with the DICOM server getting metadeta for " + studyInstanceUid;
} else {
errorMessage = "For some reason we could not retrieve the study's metadata for " + studyInstanceUid + ".";
}
OHIF.log.error(errorMessage);
OHIF.log.error(error.stack);
reject("GetStudyMetadata: " + errorMessage);
return;
} // Filter series if seriesInstanceUid exists
if (seriesInstanceUids && seriesInstanceUids.length) {
study.seriesList = study.seriesList.filter(function (series) {
return seriesInstanceUids.indexOf(series.seriesInstanceUid) > -1;
});
}
if (!study) {
reject("GetStudyMetadata: No study data returned from server: " + studyInstanceUid);
return;
} // Resolve the promise with the final study metadata object
resolve(study);
});
}
}); // Store the promise in cache
StudyMetaDataPromises.set(studyInstanceUid, promise);
return promise;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"searchStudies.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/searchStudies.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Meteor;
module.watch(require("meteor/meteor"), {
Meteor: function (v) {
Meteor = v;
}
}, 0);
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 1);
var studySearchPromises = new Map();
/**
* Search for studies information by the given filter
*
* @param {Object} filter Filter that will be used on search
* @returns {Promise} resolved with an array of studies information or rejected with an error
*/
OHIF.studies.searchStudies = function (filter) {
var promiseKey = JSON.stringify(filter);
if (studySearchPromises.has(promiseKey)) {
return studySearchPromises.get(promiseKey);
} else {
var promise = new Promise(function (resolve, reject) {
var server = OHIF.servers.getCurrentServer();
if (server.type === 'dicomWeb' && server.requestOptions.requestFromBrowser === true) {
OHIF.studies.services.QIDO.Studies(server, filter).then(resolve, reject);
} else {
Meteor.call('StudyListSearch', filter, function (error, studiesData) {
if (error) {
reject(error);
} else {
resolve(studiesData);
}
});
}
});
studySearchPromises.set(promiseKey, promise);
return promise;
}
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"classes":{"OHIFStudyMetadataSource.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/classes/OHIFStudyMetadataSource.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
module.export({
OHIFStudyMetadataSource: function () {
return OHIFStudyMetadataSource;
}
});
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
module.watch(require("meteor/ohif:viewerbase"));
// Important metadata classes
var _OHIF$viewerbase = OHIF.viewerbase,
OHIFError = _OHIF$viewerbase.OHIFError,
metadata = _OHIF$viewerbase.metadata;
var StudySummary = metadata.StudySummary,
StudyMetadata = metadata.StudyMetadata;
var OHIFStudyMetadataSource =
/*#__PURE__*/
function (_OHIF$viewerbase$Stud) {
(0, _inheritsLoose2.default)(OHIFStudyMetadataSource, _OHIF$viewerbase$Stud);
function OHIFStudyMetadataSource() {
return _OHIF$viewerbase$Stud.apply(this, arguments) || this;
}
var _proto = OHIFStudyMetadataSource.prototype;
/**
* Get study metadata for a study with given study InstanceUID
* @param {String} studyInstanceUID Study InstanceUID
* @return {Promise} A Promise object
*/
_proto.getByInstanceUID = function () {
function getByInstanceUID(studyInstanceUID) {
return OHIF.studies.retrieveStudyMetadata(studyInstanceUID);
}
return getByInstanceUID;
}();
/**
* Load study info (OHIF.viewer.Studies) and study metadata (OHIF.viewer.StudyMetadataList) for a given study.
* @param {StudySummary|StudyMetadata} study of StudySummary or StudyMetadata object.
*/
_proto.loadStudy = function () {
function loadStudy(study) {
var _this = this;
if (!(study instanceof StudyMetadata) && !(study instanceof StudySummary)) {
throw new OHIFError('OHIFStudyMetadataSource::loadStudy study is not an instance of StudySummary or StudyMetadata');
}
return new Promise(function (resolve, reject) {
var studyInstanceUID = study.getStudyInstanceUID();
if (study instanceof StudyMetadata) {
var alreadyLoaded = OHIF.viewer.Studies.findBy({
studyInstanceUid: studyInstanceUID
});
if (!alreadyLoaded) {
OHIFStudyMetadataSource._updateStudyCollections(study);
}
resolve(study);
return;
}
_this.getByInstanceUID(studyInstanceUID).then(function (studyInfo) {
// Create study metadata object
var studyMetadata = new OHIF.metadata.StudyMetadata(studyInfo, studyInfo.studyInstanceUid); // Get Study display sets
var displaySets = OHIF.viewerbase.sortingManager.getDisplaySets(studyMetadata); // Set studyMetadata display sets
studyMetadata.setDisplaySets(displaySets);
OHIFStudyMetadataSource._updateStudyCollections(studyMetadata);
resolve(studyMetadata);
}).catch(reject);
});
}
return loadStudy;
}(); // Static methods
OHIFStudyMetadataSource._updateStudyCollections = function () {
function _updateStudyCollections(studyMetadata) {
var studyInfo = studyMetadata.getData(); // Set some studyInfo properties
studyInfo.selected = true;
studyInfo.displaySets = studyMetadata.getDisplaySets(); // Insert new study info object in Studies TypeSafeCollection
OHIF.viewer.Studies.insert(studyInfo); // Insert new study metadata in StudyMetadataList TypeSafeCollection
OHIF.viewer.StudyMetadataList.insert(studyMetadata);
}
return _updateStudyCollections;
}();
return OHIFStudyMetadataSource;
}(OHIF.viewerbase.StudyMetadataSource);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"OHIFStudySummary.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/classes/OHIFStudySummary.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
module.export({
OHIFStudySummary: function () {
return OHIFStudySummary;
}
});
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
module.watch(require("meteor/ohif:viewerbase"));
/**
* Constants
*/
var STRING = 'string';
var propertyReplacementMap = {
modalities: 'ModalitiesInStudy',
patientBirthdate: 'PatientBirthDate'
};
/**
* OHIF Viewers specialized version of StudySummary class
*/
var OHIFStudySummary =
/*#__PURE__*/
function (_OHIF$viewerbase$meta) {
(0, _inheritsLoose2.default)(OHIFStudySummary, _OHIF$viewerbase$meta);
function OHIFStudySummary() {
return _OHIF$viewerbase$meta.apply(this, arguments) || this;
}
var _proto = OHIFStudySummary.prototype;
// @Override
_proto.addTags = function () {
function addTags(tagMap) {
var _hasOwn = Object.prototype.hasOwnProperty;
var _tagMap = Object.create(null);
for (var property in meteorBabelHelpers.sanitizeForInObject(tagMap)) {
if (_hasOwn.call(tagMap, property)) {
var standardProperty = OHIFStudySummary.getStandardPropertyName(property);
if (standardProperty) {
_tagMap[standardProperty] = tagMap[property];
}
}
}
_OHIF$viewerbase$meta.prototype.addTags.call(this, _tagMap);
}
return addTags;
}();
/**
* Turns a non-standard, OHIF specific, DICOM property name into a standard one.
* @param {string} property A string representing a non-conforming keyword.
* @returns {string|undefined} Returns a standard-conforming property name.
*/
OHIFStudySummary.getStandardPropertyName = function () {
function getStandardPropertyName(property) {
var standardProperty;
if ((0, _typeof2.default)(property) === STRING && property.charAt(0) !== '_') {
if (property in propertyReplacementMap) {
standardProperty = propertyReplacementMap[propertyReplacementMap];
} else {
standardProperty = property.replace(/^sop/, 'SOP').replace(/Uid$/, 'UID').replace(/Id$/, 'ID');
standardProperty = standardProperty.charAt(0).toUpperCase() + standardProperty.substr(1);
}
}
return standardProperty;
}
return getStandardPropertyName;
}();
return OHIFStudySummary;
}(OHIF.viewerbase.metadata.StudySummary);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ohif_studies/imports/client/lib/classes/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var OHIF;
module.watch(require("meteor/ohif:core"), {
OHIF: function (v) {
OHIF = v;
}
}, 0);
var OHIFStudyMetadataSource;
module.watch(require("./OHIFStudyMetadataSource"), {
OHIFStudyMetadataSource: function (v) {
OHIFStudyMetadataSource = v;
}
}, 1);
var OHIFStudySummary;
module.watch(require("./OHIFStudySummary"), {
OHIFStudySummary: function (v) {
OHIFStudySummary = v;
}
}, 2);
OHIF.studies.classes = {
OHIFStudyMetadataSource: OHIFStudyMetadataSource,
OHIFStudySummary: OHIFStudySummary
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}}}}}},{
"extensions": [
".js",
".json",
".html",
".styl"
]
});
require("/node_modules/meteor/ohif:studies/both/main.js");
require("/node_modules/meteor/ohif:studies/client/main.js");
/* Exports */
Package._define("ohif:studies");
})();