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) { function updateLesionCollection(lesionData, currentElement) {
if (lesionData.active) { if (lesionData.active) {
if(lesionData.timepointID != undefined && lesionData.timepointID != "") { if(lesionData.timepointID !== undefined && lesionData.timepointID !== "") {
// Update Measurements Collection // Update Measurements Collection
measurementManagerDAL.updateTimepointData(lesionData); measurementManagerDAL.updateTimepointData(lesionData);

View File

@ -26,7 +26,7 @@ Template.lesionLocationDialog.onRendered(function () {
// Observe Measurements Collection Changes // Observe Measurements Collection Changes
Measurements.find().observe({ Measurements.find().observe({
added: function (lesionData) { added: function (lesionData) {
lastAddedLesionData = lesionData lastAddedLesionData = lesionData;
}, },
changed: function(lesionData) { changed: function(lesionData) {
console.log("lesionData is changed!"); console.log("lesionData is changed!");
@ -44,7 +44,7 @@ Template.lesionLocationDialog.events({
'change select#selectLesionLocation': function (e) { 'change select#selectLesionLocation': function (e) {
var el = $(e.target); var el = $(e.target);
var selectedLocationIndex = el.val() var selectedLocationIndex = el.val();
if(selectedLocationIndex !== "-1"){ if(selectedLocationIndex !== "-1"){
// Get selected location data // Get selected location data

View File

@ -199,7 +199,7 @@ Template.thumbnailEntry.events({
// Touch drag/drop events // Touch drag/drop events
'touchstart .thumbnailEntry, mousedown .thumbnailEntry': function(e) { 'touchstart .thumbnailEntry, mousedown .thumbnailEntry': function(e) {
var data = Template.parentData(2); var data = Template.parentData(2);
data.studyInstanceUid = this.stack.instances[0].studyInstanceUid; data.studyInstanceUid = this.stack.studyInstanceUid;
data.seriesInstanceUid = this.stack.seriesInstanceUid; data.seriesInstanceUid = this.stack.seriesInstanceUid;
thumbnailDragStartHandler(e, data); thumbnailDragStartHandler(e, data);
}, },

View File

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

View File

@ -1,13 +1,13 @@
<template name="viewportOverlay"> <template name="viewportOverlay">
<div class="imageViewerViewportOverlay noselect"> <div class="imageViewerViewportOverlay noselect">
<div class="topleft dicomTag"> <div class="topleft dicomTag">
<div>{{patientName}}</div> <div>{{formatPN patientName}}</div>
<div>{{patientId}}</div> <div>{{patientId}}</div>
<div></div> <div></div>
</div> </div>
<div class="topright dicomTag"> <div class="topright dicomTag">
<div>{{studyDescription}}</div> <div>{{studyDescription}}</div>
<div>{{studyDate}} {{studyTime}}</div> <div>{{formatDA studyDate}} {{formatTM studyTime}}</div>
</div> </div>
<div class="bottomright dicomTag"> <div class="bottomright dicomTag">
<div>Zoom: {{formatNumberPrecision zoom 2}}%</div> <div>Zoom: {{formatNumberPrecision zoom 2}}%</div>

View File

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

View File

@ -2,12 +2,8 @@ UI.registerHelper('formatDA', function (context, format, options) {
if (!context) { if (!context) {
return undefined; return undefined;
} }
/*var date = DICOMUtilities.toDate(context, '', false);
if(!date) {
return context;
}*/
var date = context; var date = context;
var dateAsMoment = moment(date); var dateAsMoment = moment(date, "YYYYMMDD");
var strFormat = "MMM D, YYYY"; var strFormat = "MMM D, YYYY";
if (options) { if (options) {
strFormat = format; strFormat = format;

View File

@ -1,20 +1,7 @@
UI.registerHelper('formatDA', function (context, format, options) { UI.registerHelper('formatPN', function (context, format, options) {
if (!context) { if (!context) {
return undefined; return undefined;
} }
var pn = context; var patientName = context.replace('^', ', ');
var str = ''; return patientName;
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;
}); });

View File

@ -10,9 +10,10 @@ addMetaData = function(imageId, data) {
var metaData = {}; var metaData = {};
metaData.study = { metaData.study = {
date: instanceMetaData.studyDate, instanceUid: studyMetaData.studyInstanceUid,
time: instanceMetaData.studyTime, date: studyMetaData.studyDate,
description: instanceMetaData.studyDescription time: studyMetaData.studyTime,
description: studyMetaData.studyDescription
}; };
metaData.series = { metaData.series = {
@ -29,8 +30,8 @@ addMetaData = function(imageId, data) {
}; };
metaData.patient = { metaData.patient = {
name: instanceMetaData.patientName, name: studyMetaData.patientName,
id: instanceMetaData.patientId id: studyMetaData.patientId
}; };
// If there is sufficient information, populate // If there is sufficient information, populate

View File

@ -18,7 +18,7 @@ Package.onUse(function (api) {
// Our custom package // Our custom package
api.use('cornerstone'); api.use('cornerstone');
api.addFiles('log.js', 'client'); api.addFiles('log.js', ['client', 'server']);
// ---------- Components ---------- // ---------- Components ----------

View File

@ -1,6 +1,6 @@
Meteor.methods({ Meteor.methods({
'GetStudyMetadata' : function(studyInstanceUid) { 'GetStudyMetadata' : function(studyInstanceUid) {
console.log('GetStudyMetadata(%s)', studyInstanceUid); log.info('GetStudyMetadata(%s)', studyInstanceUid);
var server = Meteor.settings.dicomWeb.endpoints[0]; var server = Meteor.settings.dicomWeb.endpoints[0];

View File

@ -14,14 +14,21 @@ function resultDataToStudies(resultData) {
var studies = []; var studies = [];
resultData.forEach(function(study) { resultData.forEach(function(study) {
studies.push({ 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']), patientName: DICOMWeb.getName(study['00100010']),
patientId: DICOMWeb.getString(study['00100020']), patientId: DICOMWeb.getString(study['00100020']),
accessionNumber : DICOMWeb.getString(study['00080050']), patientBirthdate: DICOMWeb.getString(study['00100030']),
studyDate: DICOMWeb.getString(study['00080020']), patientSex: DICOMWeb.getString(study['00100040']),
modalities: DICOMWeb.getString(study['00080061']),
studyDescription: DICOMWeb.getString(study['00081030']),
imageCount: DICOMWeb.getString(study['00201208']), 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' //url : server.wadoRoot + '/studies/' + DICOMWeb.getString(study['0020000D']) + '/metadata'
}); });
}); });

View File

@ -8,6 +8,28 @@ function buildUrl(server, studyInstanceUid) {
function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
var seriesMap = {}; var seriesMap = {};
var seriesList = []; var seriesList = [];
if (!resultData.length) {
return;
}
var anInstance = resultData[0];
if (!anInstance) {
return;
}
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']),
};
resultData.forEach(function(instance) { resultData.forEach(function(instance) {
var seriesInstanceUid = DICOMWeb.getString(instance['0020000E']); var seriesInstanceUid = DICOMWeb.getString(instance['0020000E']);
var series = seriesMap[seriesInstanceUid]; var series = seriesMap[seriesInstanceUid];
@ -26,18 +48,6 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
var sopInstanceUid = DICOMWeb.getString(instance['00080018']); var sopInstanceUid = DICOMWeb.getString(instance['00080018']);
var instanceSummary = { 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']), imageType: DICOMWeb.getString(instance['00080008']),
sopClassUid: DICOMWeb.getString(instance['00080016']), sopClassUid: DICOMWeb.getString(instance['00080016']),
sopInstanceUid: sopInstanceUid, sopInstanceUid: sopInstanceUid,
@ -69,20 +79,22 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
series.instances.push(instanceSummary); series.instances.push(instanceSummary);
}); });
return seriesList;
return studyData;
} }
Services.WADO.RetrieveMetadata = function(server, studyInstanceUid) { 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 = { var study = resultDataToStudyMetadata(server, studyInstanceUid, result.data);
wadoUriRoot: server.wadoUriRoot, if (!study) {
studyInstanceUid: studyInstanceUid, study = {};
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({ Template.worklist.events({
'click #tablist a[data-toggle="tab"]': function(e) { '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); switchToTab(contentId);
} }
}); });

View File

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

View File

@ -1,6 +1,6 @@
<template name="worklistResult"> <template name="worklistResult">
{{ #if studies.count }} {{ #if studies.count }}
<table id="tblStudyList" class="table table-striped"> <table id="tblStudyList" class="table table-striped noselect">
<thead> <thead>
<tr> <tr>
<th>Patient Name</th> <th>Patient Name</th>

View File

@ -1,7 +1,7 @@
<template name="worklistStudy"> <template name="worklistStudy">
<tr class="worklistStudy"> <tr class="worklistStudy noselect">
<td> <td>
{{patientName}} {{formatPN patientName}}
</td> </td>
<td> <td>
{{patientId}} {{patientId}}
@ -10,7 +10,7 @@
{{accessionNumber}} {{accessionNumber}}
</td> </td>
<td> <td>
{{studyDate}} {{formatDA studyDate}}
</td> </td>
<td> <td>
{{modalities}} {{modalities}}

View File

@ -1,5 +1,7 @@
Template.worklistStudy.events({ Template.worklistStudy.events({
'click': function () { '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);
} }
}); });