Cleanup around viewerbase and worklist

This commit is contained in:
Erik Ziegler 2015-11-06 15:29:09 +01:00
parent 0365e9963d
commit 5363880e40
19 changed files with 132 additions and 115 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);
},

View File

@ -10,6 +10,7 @@
color: #ffffff
background-color: #424242
border-color: #424242
outline: none
&.active, &:active
background-color: #3B678E

View File

@ -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>

View File

@ -12,6 +12,8 @@ createStacks = function(study) {
if (!anInstance || !anInstance.rows) {
return;
}
series.studyInstanceUid = study.studyInstanceUid;
stacks.push(series);
});
return stacks;

View File

@ -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;

View File

@ -1,5 +1,5 @@
UI.registerHelper('formatNumberPrecision', function(context, precision, options) {
if(context) {
if (context) {
return parseFloat(context).toFixed(precision);
}
});

View File

@ -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;
});

View File

@ -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

View File

@ -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 ----------

View File

@ -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];

View File

@ -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'
});
});

View File

@ -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;
};

View File

@ -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);
}
});

View File

@ -46,6 +46,7 @@ body
&:hover
background-color: #424242
cursor: none
a
color: white

View File

@ -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>

View File

@ -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}}

View File

@ -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);
}
});