////////////////////////////////////////////////////////////////////////// // // // 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"); })();