Cleanup around viewerbase and worklist
This commit is contained in:
parent
0365e9963d
commit
5363880e40
@ -146,7 +146,7 @@ var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTo
|
||||
function updateLesionCollection(lesionData, currentElement) {
|
||||
|
||||
if (lesionData.active) {
|
||||
if(lesionData.timepointID != undefined && lesionData.timepointID != "") {
|
||||
if(lesionData.timepointID !== undefined && lesionData.timepointID !== "") {
|
||||
// Update Measurements Collection
|
||||
measurementManagerDAL.updateTimepointData(lesionData);
|
||||
|
||||
|
||||
@ -26,7 +26,7 @@ Template.lesionLocationDialog.onRendered(function () {
|
||||
// Observe Measurements Collection Changes
|
||||
Measurements.find().observe({
|
||||
added: function (lesionData) {
|
||||
lastAddedLesionData = lesionData
|
||||
lastAddedLesionData = lesionData;
|
||||
},
|
||||
changed: function(lesionData) {
|
||||
console.log("lesionData is changed!");
|
||||
@ -44,7 +44,7 @@ Template.lesionLocationDialog.events({
|
||||
|
||||
'change select#selectLesionLocation': function (e) {
|
||||
var el = $(e.target);
|
||||
var selectedLocationIndex = el.val()
|
||||
var selectedLocationIndex = el.val();
|
||||
if(selectedLocationIndex !== "-1"){
|
||||
|
||||
// Get selected location data
|
||||
|
||||
@ -199,7 +199,7 @@ Template.thumbnailEntry.events({
|
||||
// Touch drag/drop events
|
||||
'touchstart .thumbnailEntry, mousedown .thumbnailEntry': function(e) {
|
||||
var data = Template.parentData(2);
|
||||
data.studyInstanceUid = this.stack.instances[0].studyInstanceUid;
|
||||
data.studyInstanceUid = this.stack.studyInstanceUid;
|
||||
data.seriesInstanceUid = this.stack.seriesInstanceUid;
|
||||
thumbnailDragStartHandler(e, data);
|
||||
},
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
color: #ffffff
|
||||
background-color: #424242
|
||||
border-color: #424242
|
||||
outline: none
|
||||
|
||||
&.active, &:active
|
||||
background-color: #3B678E
|
||||
@ -1,13 +1,13 @@
|
||||
<template name="viewportOverlay">
|
||||
<div class="imageViewerViewportOverlay noselect">
|
||||
<div class="topleft dicomTag">
|
||||
<div>{{patientName}}</div>
|
||||
<div>{{formatPN patientName}}</div>
|
||||
<div>{{patientId}}</div>
|
||||
<div></div>
|
||||
</div>
|
||||
<div class="topright dicomTag">
|
||||
<div>{{studyDescription}}</div>
|
||||
<div>{{studyDate}} {{studyTime}}</div>
|
||||
<div>{{formatDA studyDate}} {{formatTM studyTime}}</div>
|
||||
</div>
|
||||
<div class="bottomright dicomTag">
|
||||
<div>Zoom: {{formatNumberPrecision zoom 2}}%</div>
|
||||
|
||||
@ -12,6 +12,8 @@ createStacks = function(study) {
|
||||
if (!anInstance || !anInstance.rows) {
|
||||
return;
|
||||
}
|
||||
|
||||
series.studyInstanceUid = study.studyInstanceUid;
|
||||
stacks.push(series);
|
||||
});
|
||||
return stacks;
|
||||
|
||||
@ -2,12 +2,8 @@ UI.registerHelper('formatDA', function (context, format, options) {
|
||||
if (!context) {
|
||||
return undefined;
|
||||
}
|
||||
/*var date = DICOMUtilities.toDate(context, '', false);
|
||||
if(!date) {
|
||||
return context;
|
||||
}*/
|
||||
var date = context;
|
||||
var dateAsMoment = moment(date);
|
||||
var dateAsMoment = moment(date, "YYYYMMDD");
|
||||
var strFormat = "MMM D, YYYY";
|
||||
if (options) {
|
||||
strFormat = format;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
UI.registerHelper('formatNumberPrecision', function(context, precision, options) {
|
||||
if(context) {
|
||||
if (context) {
|
||||
return parseFloat(context).toFixed(precision);
|
||||
}
|
||||
});
|
||||
@ -1,20 +1,7 @@
|
||||
UI.registerHelper('formatDA', function (context, format, options) {
|
||||
UI.registerHelper('formatPN', function (context, format, options) {
|
||||
if (!context) {
|
||||
return undefined;
|
||||
}
|
||||
var pn = context;
|
||||
var str = '';
|
||||
if(pn.prefix) {
|
||||
str = pn.prefix + ' ';
|
||||
}
|
||||
str += (pn.familyName || '') + ', ';
|
||||
str += (pn.givenName || '');
|
||||
if(pn.middleName) {
|
||||
str += ' ' + pn.middleName;
|
||||
}
|
||||
if(pn.suffix) {
|
||||
str += ' ' + pn.suffix;
|
||||
}
|
||||
|
||||
return str;
|
||||
var patientName = context.replace('^', ', ');
|
||||
return patientName;
|
||||
});
|
||||
@ -10,9 +10,10 @@ addMetaData = function(imageId, data) {
|
||||
var metaData = {};
|
||||
|
||||
metaData.study = {
|
||||
date: instanceMetaData.studyDate,
|
||||
time: instanceMetaData.studyTime,
|
||||
description: instanceMetaData.studyDescription
|
||||
instanceUid: studyMetaData.studyInstanceUid,
|
||||
date: studyMetaData.studyDate,
|
||||
time: studyMetaData.studyTime,
|
||||
description: studyMetaData.studyDescription
|
||||
};
|
||||
|
||||
metaData.series = {
|
||||
@ -29,8 +30,8 @@ addMetaData = function(imageId, data) {
|
||||
};
|
||||
|
||||
metaData.patient = {
|
||||
name: instanceMetaData.patientName,
|
||||
id: instanceMetaData.patientId
|
||||
name: studyMetaData.patientName,
|
||||
id: studyMetaData.patientId
|
||||
};
|
||||
|
||||
// If there is sufficient information, populate
|
||||
|
||||
@ -18,7 +18,7 @@ Package.onUse(function (api) {
|
||||
// Our custom package
|
||||
api.use('cornerstone');
|
||||
|
||||
api.addFiles('log.js', 'client');
|
||||
api.addFiles('log.js', ['client', 'server']);
|
||||
|
||||
// ---------- Components ----------
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
Meteor.methods({
|
||||
'GetStudyMetadata' : function(studyInstanceUid) {
|
||||
console.log('GetStudyMetadata(%s)', studyInstanceUid);
|
||||
log.info('GetStudyMetadata(%s)', studyInstanceUid);
|
||||
|
||||
var server = Meteor.settings.dicomWeb.endpoints[0];
|
||||
|
||||
|
||||
@ -14,14 +14,21 @@ function resultDataToStudies(resultData) {
|
||||
var studies = [];
|
||||
resultData.forEach(function(study) {
|
||||
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']),
|
||||
accessionNumber : DICOMWeb.getString(study['00080050']),
|
||||
studyDate: DICOMWeb.getString(study['00080020']),
|
||||
modalities: DICOMWeb.getString(study['00080061']),
|
||||
studyDescription: DICOMWeb.getString(study['00081030']),
|
||||
patientBirthdate: DICOMWeb.getString(study['00100030']),
|
||||
patientSex: DICOMWeb.getString(study['00100040']),
|
||||
imageCount: DICOMWeb.getString(study['00201208']),
|
||||
studyInstanceUid: DICOMWeb.getString(study['0020000D'])
|
||||
studyId: DICOMWeb.getString(study['00200010']),
|
||||
studyDescription: DICOMWeb.getString(study['00081030']),
|
||||
modalities: DICOMWeb.getString(study['00080061'])
|
||||
//url : server.wadoRoot + '/studies/' + DICOMWeb.getString(study['0020000D']) + '/metadata'
|
||||
});
|
||||
});
|
||||
|
||||
@ -1,88 +1,100 @@
|
||||
function buildUrl(server, studyInstanceUid) {
|
||||
|
||||
var url = server.wadoRoot + '/studies/' + studyInstanceUid + '/metadata';
|
||||
var url = server.wadoRoot + '/studies/' + studyInstanceUid + '/metadata';
|
||||
|
||||
return url;
|
||||
return url;
|
||||
}
|
||||
|
||||
function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
||||
var seriesMap = {};
|
||||
var seriesList = [];
|
||||
resultData.forEach(function(instance) {
|
||||
var seriesInstanceUid = DICOMWeb.getString(instance['0020000E']);
|
||||
var series = seriesMap[seriesInstanceUid];
|
||||
if(!series) {
|
||||
series = {
|
||||
seriesDescription: DICOMWeb.getString(instance['0008103E']),
|
||||
modality: DICOMWeb.getString(instance['00080060']),
|
||||
seriesInstanceUid : seriesInstanceUid,
|
||||
seriesNumber : DICOMWeb.getNumber(instance['00200011']),
|
||||
instances: []
|
||||
};
|
||||
seriesMap[seriesInstanceUid] = series;
|
||||
seriesList.push(series);
|
||||
var seriesMap = {};
|
||||
var seriesList = [];
|
||||
|
||||
if (!resultData.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
var sopInstanceUid = DICOMWeb.getString(instance['00080018']);
|
||||
var anInstance = resultData[0];
|
||||
if (!anInstance) {
|
||||
return;
|
||||
}
|
||||
|
||||
var instanceSummary = {
|
||||
// -----------
|
||||
// TODO = Fix this
|
||||
// This doesn't seem like the best place to put this, but otherwise we have no study info
|
||||
patientName: DICOMWeb.getName(instance['00100010']),
|
||||
patientId: DICOMWeb.getString(instance['00100020']),
|
||||
accessionNumber : DICOMWeb.getString(instance['00080050']),
|
||||
studyDate: DICOMWeb.getString(instance['00080020']),
|
||||
modalities: DICOMWeb.getString(instance['00080061']),
|
||||
studyDescription: DICOMWeb.getString(instance['00081030']),
|
||||
imageCount: DICOMWeb.getString(instance['00201208']),
|
||||
studyInstanceUid: DICOMWeb.getString(instance['0020000D']),
|
||||
// -----------
|
||||
imageType: DICOMWeb.getString(instance['00080008']),
|
||||
sopClassUid: DICOMWeb.getString(instance['00080016']),
|
||||
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']),
|
||||
rows: DICOMWeb.getNumber(instance['00280010']),
|
||||
columns: DICOMWeb.getNumber(instance['00280011']),
|
||||
pixelSpacing: DICOMWeb.getString(instance['00280030']),
|
||||
bitsAllocated: DICOMWeb.getNumber(instance['00280100']),
|
||||
bitsStored: DICOMWeb.getNumber(instance['00280101']),
|
||||
highBit: DICOMWeb.getNumber(instance['00280102']),
|
||||
pixelRepresentation: DICOMWeb.getNumber(instance['00280103']),
|
||||
windowCenter: DICOMWeb.getString(instance['00281050']),
|
||||
windowWidth: DICOMWeb.getString(instance['00281051']),
|
||||
rescaleIntercept: DICOMWeb.getNumber(instance['00281052']),
|
||||
rescaleSlope: DICOMWeb.getNumber(instance['00281053']),
|
||||
var studyData = {
|
||||
seriesList: seriesList,
|
||||
patientName: DICOMWeb.getName(anInstance['00100010']),
|
||||
patientId: DICOMWeb.getString(anInstance['00100020']),
|
||||
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']),
|
||||
};
|
||||
|
||||
if(server.imageRendering === 'wadouri') {
|
||||
instanceSummary.wadouri = server.wadoUriRoot + '?requestType=WADO&studyUID=' + studyInstanceUid + '&seriesUID=' + seriesInstanceUid + '&objectUID=' + sopInstanceUid + "&contentType=application%2Fdicom";
|
||||
} else {
|
||||
instanceSummary.wadorsuri = server.wadoRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + '/frames/1';
|
||||
}
|
||||
resultData.forEach(function(instance) {
|
||||
var seriesInstanceUid = DICOMWeb.getString(instance['0020000E']);
|
||||
var series = seriesMap[seriesInstanceUid];
|
||||
if (!series) {
|
||||
series = {
|
||||
seriesDescription: DICOMWeb.getString(instance['0008103E']),
|
||||
modality: DICOMWeb.getString(instance['00080060']),
|
||||
seriesInstanceUid: seriesInstanceUid,
|
||||
seriesNumber: DICOMWeb.getNumber(instance['00200011']),
|
||||
instances: []
|
||||
};
|
||||
seriesMap[seriesInstanceUid] = series;
|
||||
seriesList.push(series);
|
||||
}
|
||||
|
||||
series.instances.push(instanceSummary);
|
||||
});
|
||||
return seriesList;
|
||||
var sopInstanceUid = DICOMWeb.getString(instance['00080018']);
|
||||
|
||||
var instanceSummary = {
|
||||
imageType: DICOMWeb.getString(instance['00080008']),
|
||||
sopClassUid: DICOMWeb.getString(instance['00080016']),
|
||||
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']),
|
||||
rows: DICOMWeb.getNumber(instance['00280010']),
|
||||
columns: DICOMWeb.getNumber(instance['00280011']),
|
||||
pixelSpacing: DICOMWeb.getString(instance['00280030']),
|
||||
bitsAllocated: DICOMWeb.getNumber(instance['00280100']),
|
||||
bitsStored: DICOMWeb.getNumber(instance['00280101']),
|
||||
highBit: DICOMWeb.getNumber(instance['00280102']),
|
||||
pixelRepresentation: DICOMWeb.getNumber(instance['00280103']),
|
||||
windowCenter: DICOMWeb.getString(instance['00281050']),
|
||||
windowWidth: DICOMWeb.getString(instance['00281051']),
|
||||
rescaleIntercept: DICOMWeb.getNumber(instance['00281052']),
|
||||
rescaleSlope: DICOMWeb.getNumber(instance['00281053']),
|
||||
};
|
||||
|
||||
if (server.imageRendering === 'wadouri') {
|
||||
instanceSummary.wadouri = server.wadoUriRoot + '?requestType=WADO&studyUID=' + studyInstanceUid + '&seriesUID=' + seriesInstanceUid + '&objectUID=' + sopInstanceUid + "&contentType=application%2Fdicom";
|
||||
} else {
|
||||
instanceSummary.wadorsuri = server.wadoRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + '/frames/1';
|
||||
}
|
||||
|
||||
series.instances.push(instanceSummary);
|
||||
});
|
||||
|
||||
return studyData;
|
||||
}
|
||||
|
||||
Services.WADO.RetrieveMetadata = function(server, studyInstanceUid) {
|
||||
var url = buildUrl(server, studyInstanceUid);
|
||||
|
||||
var url = buildUrl(server, studyInstanceUid);
|
||||
var result = DICOMWeb.getJSON(url, server.requestOptions);
|
||||
|
||||
var result = DICOMWeb.getJSON(url, server.requestOptions);
|
||||
var study = resultDataToStudyMetadata(server, studyInstanceUid, result.data);
|
||||
if (!study) {
|
||||
study = {};
|
||||
}
|
||||
|
||||
var study = {
|
||||
wadoUriRoot: server.wadoUriRoot,
|
||||
studyInstanceUid: studyInstanceUid,
|
||||
seriesList: resultDataToStudyMetadata(server, studyInstanceUid, result.data)
|
||||
};
|
||||
study.wadoUriRoot = server.wadoUriRoot;
|
||||
study.studyInstanceUid = studyInstanceUid;
|
||||
|
||||
return study;
|
||||
return study;
|
||||
};
|
||||
@ -104,7 +104,15 @@ Template.worklist.helpers({
|
||||
|
||||
Template.worklist.events({
|
||||
'click #tablist a[data-toggle="tab"]': function(e) {
|
||||
var contentId = $(e.currentTarget).data('target').replace("#", "");
|
||||
// If this tab is already active, do nothing
|
||||
var tabButton = $(e.currentTarget);
|
||||
var tabTitle = tabButton.parents('.tabTitle');
|
||||
if (tabTitle.hasClass("active")) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Otherwise, switch to the tab
|
||||
var contentId = tabButton.data('target').replace("#", "");
|
||||
switchToTab(contentId);
|
||||
}
|
||||
});
|
||||
@ -46,6 +46,7 @@ body
|
||||
|
||||
&:hover
|
||||
background-color: #424242
|
||||
cursor: none
|
||||
|
||||
a
|
||||
color: white
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
<template name="worklistResult">
|
||||
{{ #if studies.count }}
|
||||
<table id="tblStudyList" class="table table-striped">
|
||||
<table id="tblStudyList" class="table table-striped noselect">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Patient Name</th>
|
||||
<th>Patient ID</th>
|
||||
<th>Accession#</th>
|
||||
<th>Accession #</th>
|
||||
<th>Study Date</th>
|
||||
<th>Modality</th>
|
||||
<th>Study Description</th>
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template name="worklistStudy">
|
||||
<tr class="worklistStudy">
|
||||
<tr class="worklistStudy noselect">
|
||||
<td>
|
||||
{{patientName}}
|
||||
{{formatPN patientName}}
|
||||
</td>
|
||||
<td>
|
||||
{{patientId}}
|
||||
@ -10,7 +10,7 @@
|
||||
{{accessionNumber}}
|
||||
</td>
|
||||
<td>
|
||||
{{studyDate}}
|
||||
{{formatDA studyDate}}
|
||||
</td>
|
||||
<td>
|
||||
{{modalities}}
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
Template.worklistStudy.events({
|
||||
'click': function () {
|
||||
openNewTab(this.studyInstanceUid, this.patientName);
|
||||
// Use the formatPN template helper to clean up the patient name
|
||||
var title = Blaze._globalHelpers['formatPN'](this.patientName);
|
||||
openNewTab(this.studyInstanceUid, title);
|
||||
}
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user