From dfb4f6a41c0ee49b05ae91c009c7d272788a091b Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Tue, 27 Oct 2015 16:28:53 +0100 Subject: [PATCH 01/59] Updated Meteor apps to 1.2.1 --- LesionTracker/.meteor/release | 2 +- LesionTracker/.meteor/versions | 40 ++++++++++++------------- OHIFViewer/.meteor/release | 2 +- OHIFViewer/.meteor/versions | 54 +++++++++++++++++----------------- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/LesionTracker/.meteor/release b/LesionTracker/.meteor/release index 5684262a8..3a05e0a2f 100644 --- a/LesionTracker/.meteor/release +++ b/LesionTracker/.meteor/release @@ -1 +1 @@ -METEOR@1.2.0.2 +METEOR@1.2.1 diff --git a/LesionTracker/.meteor/versions b/LesionTracker/.meteor/versions index d46560543..4a556777f 100644 --- a/LesionTracker/.meteor/versions +++ b/LesionTracker/.meteor/versions @@ -1,9 +1,9 @@ -accounts-base@1.2.1 -accounts-password@1.1.3 +accounts-base@1.2.2 +accounts-password@1.1.4 anti:i18n@0.4.3 arsnebula:reactive-promise@0.9.1 autopublish@1.0.4 -autoupdate@1.2.3 +autoupdate@1.2.4 babel-compiler@5.8.24_1 babel-runtime@0.1.4 base64@1.0.4 @@ -15,21 +15,21 @@ boilerplate-generator@1.0.4 caching-compiler@1.0.0 caching-html-compiler@1.0.2 callback-hook@1.0.4 -check@1.0.6 +check@1.1.0 cornerstone@0.0.1 ddp@1.2.2 ddp-client@1.2.1 -ddp-common@1.2.1 +ddp-common@1.2.2 ddp-rate-limiter@1.0.0 -ddp-server@1.2.1 +ddp-server@1.2.2 deps@1.0.9 dicomweb@0.0.1 diff-sequence@1.0.1 -ecmascript@0.1.5 -ecmascript-collections@0.1.6 +ecmascript@0.1.6 +ecmascript-runtime@0.2.6 ejson@1.0.7 -email@1.0.7 -es5-shim@4.1.13 +email@1.0.8 +es5-shim@4.1.14 fastclick@1.0.7 fortawesome:fontawesome@4.4.0 geojson-utils@1.0.4 @@ -37,7 +37,7 @@ hot-code-push@1.0.0 html-tools@1.0.5 htmljs@1.0.5 http@1.1.1 -ian:accounts-ui-bootstrap-3@1.2.82 +ian:accounts-ui-bootstrap-3@1.2.83 id-map@1.0.4 insecure@1.0.4 iron:controller@1.0.12 @@ -54,23 +54,23 @@ lesiontracker@0.0.1 livedata@1.0.15 localstorage@1.0.5 logging@1.0.8 -meteor@1.1.9 +meteor@1.1.10 meteor-base@1.0.1 meteor-platform@1.2.3 minifiers@1.1.7 minimongo@1.0.10 mobile-experience@1.0.1 mobile-status-bar@1.0.6 -mongo@1.1.2 +mongo@1.1.3 mongo-id@1.0.1 npm-bcrypt@0.7.8_2 npm-mongo@1.4.39_1 observe-sequence@1.0.7 ordered-dict@1.0.4 -promise@0.5.0 -random@1.0.4 +promise@0.5.1 +random@1.0.5 rate-limit@1.0.0 -reactive-dict@1.1.2 +reactive-dict@1.1.3 reactive-var@1.0.6 reload@1.1.4 retry@1.0.4 @@ -82,9 +82,9 @@ spacebars@1.0.7 spacebars-compiler@1.0.7 srp@1.0.4 standard-app-packages@1.0.6 -standard-minifiers@1.0.1 -stylus@2.511.0_2 -templating@1.1.4 +standard-minifiers@1.0.2 +stylus@2.511.1 +templating@1.1.5 templating-tools@1.0.0 tracker@1.0.9 twbs:bootstrap@3.3.5 @@ -92,6 +92,6 @@ ui@1.0.8 underscore@1.0.4 url@1.0.5 viewerbase@0.0.1 -webapp@1.2.2 +webapp@1.2.3 webapp-hashing@1.0.5 worklist@0.0.1 diff --git a/OHIFViewer/.meteor/release b/OHIFViewer/.meteor/release index 5684262a8..3a05e0a2f 100644 --- a/OHIFViewer/.meteor/release +++ b/OHIFViewer/.meteor/release @@ -1 +1 @@ -METEOR@1.2.0.2 +METEOR@1.2.1 diff --git a/OHIFViewer/.meteor/versions b/OHIFViewer/.meteor/versions index 1c2361305..62a4a53a7 100644 --- a/OHIFViewer/.meteor/versions +++ b/OHIFViewer/.meteor/versions @@ -1,8 +1,8 @@ -accounts-base@1.2.1 -accounts-password@1.1.3 +accounts-base@1.2.2 +accounts-password@1.1.4 anti:i18n@0.4.3 arsnebula:reactive-promise@0.9.1 -autoupdate@1.2.3 +autoupdate@1.2.4 babel-compiler@5.8.24_1 babel-runtime@0.1.4 base64@1.0.4 @@ -14,20 +14,20 @@ boilerplate-generator@1.0.4 caching-compiler@1.0.0 caching-html-compiler@1.0.2 callback-hook@1.0.4 -check@1.0.6 +check@1.1.0 cornerstone@0.0.1 ddp@1.2.2 ddp-client@1.2.1 -ddp-common@1.2.1 +ddp-common@1.2.2 ddp-rate-limiter@1.0.0 -ddp-server@1.2.1 +ddp-server@1.2.2 deps@1.0.9 dicomweb@0.0.1 diff-sequence@1.0.1 -ecmascript@0.1.5 -ecmascript-collections@0.1.6 +ecmascript@0.1.6 +ecmascript-runtime@0.2.6 ejson@1.0.7 -email@1.0.7 +email@1.0.8 fastclick@1.0.7 fortawesome:fontawesome@4.4.0 geojson-utils@1.0.4 @@ -35,39 +35,39 @@ hot-code-push@1.0.0 html-tools@1.0.5 htmljs@1.0.5 http@1.1.1 -ian:accounts-ui-bootstrap-3@1.2.81 +ian:accounts-ui-bootstrap-3@1.2.83 id-map@1.0.4 -iron:controller@1.0.8 -iron:core@1.0.8 -iron:dynamic-template@1.0.8 -iron:layout@1.0.8 -iron:location@1.0.9 -iron:middleware-stack@1.0.9 -iron:router@1.0.9 -iron:url@1.0.9 +iron:controller@1.0.12 +iron:core@1.0.11 +iron:dynamic-template@1.0.12 +iron:layout@1.0.12 +iron:location@1.0.11 +iron:middleware-stack@1.0.11 +iron:router@1.0.12 +iron:url@1.0.11 jquery@1.11.4 launch-screen@1.0.4 livedata@1.0.15 localstorage@1.0.5 logging@1.0.8 -meteor@1.1.9 +meteor@1.1.10 meteor-base@1.0.1 meteor-platform@1.2.3 minifiers@1.1.7 minimongo@1.0.10 mobile-experience@1.0.1 mobile-status-bar@1.0.6 -mongo@1.1.2 +mongo@1.1.3 mongo-id@1.0.1 mrt:moment@2.8.1 npm-bcrypt@0.7.8_2 npm-mongo@1.4.39_1 observe-sequence@1.0.7 ordered-dict@1.0.4 -promise@0.5.0 -random@1.0.4 +promise@0.5.1 +random@1.0.5 rate-limit@1.0.0 -reactive-dict@1.1.2 +reactive-dict@1.1.3 reactive-var@1.0.6 reload@1.1.4 retry@1.0.4 @@ -79,9 +79,9 @@ spacebars@1.0.7 spacebars-compiler@1.0.7 srp@1.0.4 standard-app-packages@1.0.6 -standard-minifiers@1.0.1 -stylus@2.511.0_2 -templating@1.1.4 +standard-minifiers@1.0.2 +stylus@2.511.1 +templating@1.1.5 templating-tools@1.0.0 tracker@1.0.9 twbs:bootstrap@3.3.5 @@ -89,6 +89,6 @@ ui@1.0.8 underscore@1.0.4 url@1.0.5 viewerbase@0.0.1 -webapp@1.2.2 +webapp@1.2.3 webapp-hashing@1.0.5 worklist@0.0.1 From f5f10dea346827f2a8ebe2c0a218118f2dbaebc1 Mon Sep 17 00:00:00 2001 From: Aysel Afsar Date: Thu, 29 Oct 2015 08:50:28 -0400 Subject: [PATCH 02/59] Measurements collection is added for lesion table --- LesionTracker/.meteor/packages | 1 + .../lesiontracker/compatibility/lesionTool.js | 280 ++++++++++++------ .../compatibility/measurementManagerDAL.js | 206 +++++++++++++ .../components/lesionDialog/lesionDialog.js | 26 +- .../lesionLocationDialog.js | 29 ++ .../components/lesionTable/lesionTable.html | 2 + .../components/lesionTable/lesionTable.js | 225 +++----------- .../components/lesionTable/lesionTable.styl | 5 +- .../lesionTableRow/lesionTableRow.html | 12 +- .../lesionTableRow/lesionTableRow.js | 4 +- .../lesiontracker/lib/getActiveTimepointID.js | 7 + Packages/lesiontracker/lib/uuid.js | 250 ++++++++++++++++ Packages/lesiontracker/package.js | 6 + .../imageViewerViewport.js | 1 + Packages/worklist/components/worklist.js | 5 + Packages/worklist/lib/generateUUID.js | 2 +- 16 files changed, 774 insertions(+), 287 deletions(-) create mode 100644 Packages/lesiontracker/compatibility/measurementManagerDAL.js create mode 100644 Packages/lesiontracker/lib/getActiveTimepointID.js create mode 100755 Packages/lesiontracker/lib/uuid.js diff --git a/LesionTracker/.meteor/packages b/LesionTracker/.meteor/packages index 808176914..b9b9c9081 100644 --- a/LesionTracker/.meteor/packages +++ b/LesionTracker/.meteor/packages @@ -34,4 +34,5 @@ stylus fortawesome:fontawesome random reactive-var +reactive-dict lesiontracker diff --git a/Packages/lesiontracker/compatibility/lesionTool.js b/Packages/lesiontracker/compatibility/lesionTool.js index 8b6b3b62b..8fab525b2 100644 --- a/Packages/lesiontracker/compatibility/lesionTool.js +++ b/Packages/lesiontracker/compatibility/lesionTool.js @@ -1,4 +1,6 @@ var lineIndex = 0; //This holds drawn line index +var activeLesionMeasurementData; +var timepointID; var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTools) { "use strict"; @@ -13,6 +15,9 @@ var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTo function createNewMeasurement(mouseEventData) { var element = mouseEventData.element; + timepointID = getActiveTimepointID(element); + var lesionNumber = measurementManagerDAL.getLesionNumber(timepointID); + console.log(lesionNumber); var lesionCounter = ""; // Subscribe CornerstoneMouseup event, when mouse is up, call lesionDialog @@ -21,8 +26,12 @@ var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTo // Unsubscribe CornerstoneToolsMouseUp event $(element).off("CornerstoneToolsMouseUp"); + // Set lesionMeasurementData Session + activeLesionMeasurementData.timepointID = timepointID; + Session.set("lesionMeasurementData", activeLesionMeasurementData); + // Show LesionDialog - $(document).trigger("ShowLesionDialog", e); + $(document).trigger("ShowLesionDialog", [e, activeLesionMeasurementData]); }); @@ -72,9 +81,11 @@ var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTo }, init: false }, - lesionName: "Target "+lesionCounter, + lesionName: "Target "+lesionNumber, isDeleted: false, - lineNumber:"" //Indicates line number on image + lineNumber:"", //Indicates line number on image + lesionNumber: lesionNumber, + uid: uuid.v4() }; lineIndex++; return measurementData; @@ -103,110 +114,201 @@ var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTo ///////// BEGIN IMAGE RENDERING /////// function onImageRendered(e, eventData) { - // if we have no toolData for this element, return immediately as there is nothing to do var toolData = cornerstoneTools.getToolState(e.currentTarget, toolType); if (toolData === undefined) { return; } + updateLesions(toolData, eventData, e.currentTarget); + } + + function updateLesions(toolData, eventData, currentElement) { // we have tool data for this element - iterate over each one and draw it var context = eventData.canvasContext.canvas.getContext('2d'); context.setTransform(1, 0, 0, 1, 0, 0); + for (var i = 0; i < toolData.data.length; i++) { + renderLesion(toolData.data[i], context, eventData); + updateLesionCollection(toolData.data[i], currentElement); + } + } + + function updateLesionCollection(lesionData, currentElement) { + + if (lesionData.active) { + activeLesionMeasurementData = lesionData; + } + + // TODO: Option1: Create a global variable like lesionMeasurementData + // TODO: Insert lesionData inside the lesionMeasurementData + // TODO: Send the lesionMeasurementData to lesionDialog by ShowLesionDialog event + + /*if (lesionMeasurementData != undefined && lesionMeasurementData.lesionNumber === lesionData.index) { + lesionMeasurementData.timepoints.now.longestDiameter = lesionData.measurementText; + console.log(lesionMeasurementData.timepoints.now.longestDiameter); + } else { + lesionMeasurementData = { + lesionNumber: lesionData.index, + isTarget: true, + location: '', + timepoints: { + "now": { + imageId: "blah", + timepointUid: "timepointX", + date: 2010, + isDirty: true, + longestDiameter: lesionData.measurementText + }, + "earlier": { + imageId: "blah2", + timepointUid: "timepointy", + date: 2010, + isDirty: true, + longestDiameter: 8 + } + } + }; + }*/ + + // TODO: Option2: + // Check collection has this lesionData + /*var isFound = Measurements.findOne({lesionNumber: lesionData.index}); + + // TODO: Decide which time point is changed + if (isFound) { + // Update measurement text + Measurements.update( + { lesionNumber: lesionData.index }, + { + $set: { + "timepoints.now.longestDiameter": lesionData.measurementText + } + }, {multi: true} + ); + + console.log(Measurements.find()); + } else { + var lesionObject = { + lesionNumber: lesionData.index, + isTarget: true, + location: '', + isHidden: true, + timepoints: { + "now": { + imageId: "blah", + timepointUid: "timepointX", + date: 2010, + isDirty: true, + longestDiameter: lesionData.measurementText + }, + "earlier": { + imageId: "blah2", + timepointUid: "timepointy", + date: 2010, + isDirty: true, + longestDiameter: 8 + } + } + }; + Measurements.insert(lesionObject); + }*/ + } + + function renderLesion(lesion, context, eventData){ + context.save(); + var color; var lineWidth = cornerstoneTools.toolStyle.getToolWidth(); var font = cornerstoneTools.textStyle.getFont(); var config = cornerstoneTools.length.getConfiguration(); - for (var i = 0; i < toolData.data.length; i++) { - context.save(); - // configurable shadow - if (config && config.shadow) { - context.shadowColor = '#000000'; - context.shadowOffsetX = +1; - context.shadowOffsetY = +1; - } - - var data = toolData.data[i]; - if (data.active) { - color = cornerstoneTools.toolColors.getActiveColor(); - } else { - color = cornerstoneTools.toolColors.getToolColor(); - } - - // draw the line - var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start); - var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end); - - context.beginPath(); - context.strokeStyle = color; - context.lineWidth = lineWidth; - context.moveTo(handleStartCanvas.x, handleStartCanvas.y); - context.lineTo(handleEndCanvas.x, handleEndCanvas.y); - context.stroke(); - - // draw the handles - cornerstoneTools.drawHandles(context, eventData, data.handles, color); - - //Set coordinates of text - var linkedTextStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.linkedTextCoords.start); - var linkedTextEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.linkedTextCoords.end); - if(!data.linkedTextCoords.init){ - data.linkedTextCoords.start.x = data.handles.start.x + 50; - data.linkedTextCoords.start.y = data.handles.start.y + 40; - linkedTextStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.linkedTextCoords.start); - - //Set end point of linkedTextCoords - data.linkedTextCoords.end.x = data.linkedTextCoords.start.x + 50; - data.linkedTextCoords.end.y = data.linkedTextCoords.start.y + 30; - linkedTextEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.linkedTextCoords.end); - - //initialized coordinates of text - data.linkedTextCoords.init = true; - } - - //Draw linked line as dashed - context.setLineDash([2,3]); - context.beginPath(); - context.strokeStyle = color; - context.lineWidth = 1 / eventData.viewport.scale; - var mid = { - x:(handleStartCanvas.x + handleEndCanvas.x) / 2, y:(handleStartCanvas.y + handleEndCanvas.y) / 2 - }; - - context.moveTo(mid.x, mid.y); - context.lineTo(linkedTextStartCanvas.x + 20, linkedTextStartCanvas.y + 20); - context.stroke(); - - // Draw the text - context.fillStyle = color; - context.font = font; - var dx = (data.handles.start.x - data.handles.end.x) * (eventData.image.columnPixelSpacing || 1); - var dy = (data.handles.start.y - data.handles.end.y) * (eventData.image.rowPixelSpacing || 1); - var length = Math.sqrt(dx * dx + dy * dy); - - var suffix = ' mm'; - if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) { - suffix = ' pixels'; - } - - var text = '' + length.toFixed(2) + suffix; - var textCoords = { - x: linkedTextStartCanvas.x, y: linkedTextStartCanvas.y - }; - - cornerstoneTools.drawTextBox(context, data.lesionName, textCoords.x, textCoords.y, color); - cornerstoneTools.drawTextBox(context, text, textCoords.x, textCoords.y + 20, color); - - //Set measurement text to show lesion table - data.measurementText = length.toFixed(2); - $(eventData.enabledElement.element).trigger("LesionTextChanged",data); - - context.restore(); + // configurable shadow from CornerstoneTools + if (config && config.shadow) { + context.shadowColor = '#000000'; + context.shadowOffsetX = +1; + context.shadowOffsetY = +1; } + if (lesion.active) { + color = cornerstoneTools.toolColors.getActiveColor(); + } else { + color = cornerstoneTools.toolColors.getToolColor(); + } + + // draw the line + var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, lesion.handles.start); + var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, lesion.handles.end); + + context.beginPath(); + context.strokeStyle = color; + context.lineWidth = lineWidth; + context.moveTo(handleStartCanvas.x, handleStartCanvas.y); + context.lineTo(handleEndCanvas.x, handleEndCanvas.y); + context.stroke(); + + // draw the handles + cornerstoneTools.drawHandles(context, eventData, lesion.handles, color); + + //Set coordinates of text + var linkedTextStartCanvas = cornerstone.pixelToCanvas(eventData.element, lesion.linkedTextCoords.start); + var linkedTextEndCanvas = cornerstone.pixelToCanvas(eventData.element, lesion.linkedTextCoords.end); + if(!lesion.linkedTextCoords.init){ + lesion.linkedTextCoords.start.x = lesion.handles.start.x + 50; + lesion.linkedTextCoords.start.y = lesion.handles.start.y + 40; + linkedTextStartCanvas = cornerstone.pixelToCanvas(eventData.element, lesion.linkedTextCoords.start); + + //Set end point of linkedTextCoords + lesion.linkedTextCoords.end.x = lesion.linkedTextCoords.start.x + 50; + lesion.linkedTextCoords.end.y = lesion.linkedTextCoords.start.y + 30; + linkedTextEndCanvas = cornerstone.pixelToCanvas(eventData.element, lesion.linkedTextCoords.end); + + //initialized coordinates of text + lesion.linkedTextCoords.init = true; + } + + //Draw linked line as dashed + context.setLineDash([2,3]); + context.beginPath(); + context.strokeStyle = color; + context.lineWidth = 1 / eventData.viewport.scale; + var mid = { + x:(handleStartCanvas.x + handleEndCanvas.x) / 2, y:(handleStartCanvas.y + handleEndCanvas.y) / 2 + }; + + context.moveTo(mid.x, mid.y); + context.lineTo(linkedTextStartCanvas.x + 20, linkedTextStartCanvas.y + 20); + context.stroke(); + + // Draw the text + context.fillStyle = color; + context.font = font; + var dx = (lesion.handles.start.x - lesion.handles.end.x) * (eventData.image.columnPixelSpacing || 1); + var dy = (lesion.handles.start.y - lesion.handles.end.y) * (eventData.image.rowPixelSpacing || 1); + var length = Math.sqrt(dx * dx + dy * dy); + + var suffix = ' mm'; + if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) { + suffix = ' pixels'; + } + + var text = '' + length.toFixed(2) + suffix; + var textCoords = { + x: linkedTextStartCanvas.x, y: linkedTextStartCanvas.y + }; + + cornerstoneTools.drawTextBox(context, lesion.lesionName, textCoords.x, textCoords.y, color); + cornerstoneTools.drawTextBox(context, text, textCoords.x, textCoords.y + 20, color); + + //Set measurement text to show lesion table + lesion.measurementText = length.toFixed(2); + + // Lesion Measurement is changed + $(eventData.enabledElement.element).trigger("LesionTextChanged",lesion); + + context.restore(); } + ///////// END IMAGE RENDERING /////// //This function is called from cornerstone-viewport.html and updates lesion measurement and makes the lesion active diff --git a/Packages/lesiontracker/compatibility/measurementManagerDAL.js b/Packages/lesiontracker/compatibility/measurementManagerDAL.js new file mode 100644 index 000000000..4564acfea --- /dev/null +++ b/Packages/lesiontracker/compatibility/measurementManagerDAL.js @@ -0,0 +1,206 @@ +var measurementManagerDAL = (function () { + var trialPatientLocations = []; + var timepoints = []; + + // timepointID = tabId + activeViewportIndex + /*timepoints = [ + { + timepointID: "tp0", + rois: [ + { + UID: "345", + number: 1, + measurement: "22.34", + locationUID: 12345 + }, + { + UID: "245", + number: 2, + measurement: "22.34", + locationUID: 1745 + } + ] + }, + { + timepointID: "tp1", + rois: [ + { + UID: "243", + number: 1, + measurement: "22.34", + locationUID: 12345 + } + ] + }, + { + timepointID: "tp2", + rois: [ + { + UID: "253", + number: 1, + measurement: "0.34", + locationUID: 12345 + } + ] + } + ]; + */ + + // Returns trialPatientLocations array + function getPatientLocations () { + return trialPatientLocations; + } + + function getLocationName (locationUID) { + for(var i = 0; i< trialPatientLocations.length; i++) { + var locationObject = trialPatientLocations[i]; + if(locationObject.uid === locationUID) { + return locationObject.location.location; + } + } + + return ""; + } + + function getTimepoints() { + return timepoints; + } + + // Adds new location to trialPatientLocations array + function addPatientLocation (location) { + var contentId = getContentId(); + var locationUID = uuid.v4(); + var locationObject = {contentId: contentId, uid: locationUID, location: location}; + trialPatientLocations.push(locationObject); + + return locationUID; + } + + + // Insert Measurements Collection + function insertDataToMeasurementCollection (lesionData) { + + + } + + function getContentId () { + return Session.get("activeContentId"); + } + + // Adds new timepoint item to tiemepoints array + function addLesionData (lesionData) { + + // TODO: if find lesionNumber, add + // TODO: Unless create new object + var contentId = getContentId(); + var timepointID = lesionData.timepointID; + var tabMeasurements = Measurements.find({contentId: contentId}).fetch(); + var existingMeasurement; + if(tabMeasurements != undefined && tabMeasurements.length > 0) { + var tabLesionData = tabMeasurements.filter(function(item){return (item.lesionData.lesionNumber == lesionData.lesionNumber);} )[0]; + if(tabLesionData != undefined) { + existingMeasurement = tabLesionData.lesionData; + } + } + + if (existingMeasurement != undefined) { + + var existingTimepoint = existingMeasurement.timepoints; + existingTimepoint[timepointID] = {longestDiameter: lesionData.measurementText}; + + Measurements.update( + { contentId: contentId, "lesionData.lesionNumber": lesionData.lesionNumber}, + { + $set: { + "lesionData.timepoints": existingTimepoint + } + }, {multi: true} + ); + console.log(Measurements.find()) + + } else { + + var timepointArr = {}; + timepointArr[timepointID] = {longestDiameter: lesionData.measurementText}; + var lesionDataCollectionObject = { + lesionNumber: lesionData.lesionNumber, + isTarget: true, + location: getLocationName(lesionData.locationUID), + timepoints: timepointArr + }; + + Measurements.insert({contentId: contentId, lesionData: lesionDataCollectionObject}); + console.log(Measurements.find()); + + } + + // Populate timepoints array + var roi = { + uid: lesionData.uid, + number: lesionData.lesionNumber, + measurement: lesionData.measurementText, + locationUID: lesionData.locationUID + }; + if (timepoints.length) { + timepoints.forEach(function(timepoint) { + if(timepoint.timepointID === timepointID) { + timepoint.rois.push(roi); + } + }); + } else { + timepoints.push({timepointID: timepointID, rois: [roi]}); + } + + insertDataToMeasurementCollection(lesionData); + + } + + // Returns new lesion number according to timepointID + function getNewLesionNumber (timepointID) { + // Check timepoint is in timepoints array + for (var i=0; i< timepoints.length; i++) { + var timepoint = timepoints[i]; + if(timepoint.timepointID === timepointID) { + return timepoint.rois.length + 1; + } + } + + // Add new time point + timepoints.push({timepointID: timepointID, rois: []}); + + return 1; + } + + // If lesion number is added for any timepoint, returns lesion locationUID + function isLesionNumberAdded (lesionNumber) { + + for (var i=0; i< timepoints.length; i++) { + var timepoint = timepoints[i]; + var rois = timepoint.rois; + + for(var j=0; jlesionTableRow }} {{ /each }} + + diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.js b/Packages/lesiontracker/components/lesionTable/lesionTable.js index 134d04263..165db1cac 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.js +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.js @@ -1,187 +1,52 @@ -measurements = new Meteor.Collection(null); - -var test = { - lesionNumber: 1, - isTarget: true, - location: 'Brain', - timepoints: { - "now": { - imageId: "blah", - timepointUid: "timepointX", - date: 2010, - isDirty: true, - longestDiameter: 5 - }, - "earlier": { - imageId: "blah2", - timepointUid: "timepointy", - date: 2010, - isDirty: true, - longestDiameter: 8 - } - } -}; - -measurements.insert(test); +Measurements = new Meteor.Collection(null); +TimepointNames = new Meteor.Collection(null); Template.lesionTable.helpers({ 'measurement': function() { - return measurements.find(); + var contentId = Session.get("activeContentId"); + console.log(Measurements.find({contentId: contentId})); + return Measurements.find({contentId: contentId}); }, 'timepointNames': function() { - return [ - {name: 'now'}, - {name: 'earlier'} - ]; - } -}); - -/*var lesionTableData; -setLesionTableData = function (data) { - lesionTableData = data; -}; - -getLesionTableData = function () { - return lesionTableData; -}; - -lesionNumberIsAdded = function(data) { - var tabId = data.tabId; - var returnValue = {isFound: false, rowIndex : -1}; - $('#content'+tabId+' table tbody tr td.lesionNumber').each( function(){ - console.log($(this).text()); - var lesionNumber = parseInt($(this).text()); - - if(lesionNumber == data.lesionNumber) { - var $tr = $(this).closest('tr'); - var rowIndex = $tr.index(); - returnValue.rowIndex = rowIndex; - returnValue.isFound = true; - } - }); - - return returnValue; -}; - -returnTblStr = function (obj) { - // Get count of lds - var tabId = obj.tabId; - var lds = $("#content"+tabId).find(".lesionTable th.ld"); - - var rowStr = '' + - '' + - ''+obj.lesionNumber+'' + - 'Y'; - - // Add measurement to right column - if(obj.totalViewportCount) { - for(var i=0; i< lds.length; i++) { - if(i === obj.viewportIndex) { - rowStr += ''+obj.lesionLocationObj.location+''+obj.lesions+''; - - }else{ - rowStr += ''+obj.lesionLocationObj.location+''; - } - } - } - rowStr += ''; - - return rowStr; -}; - -//Link lesionLocationSelected event -$(document).on("lesionLocationSelected",function(event,data ){ - var lesionData = getLesionTableData(); - lesionData.lesionLocationObj = data; - var tabId = lesionData.tabId; - //var el_index = lesionData.viewportIndex; - var tableEl = $("#content"+tabId).find(".lesionTable"); - var tblStr = returnTblStr(lesionData); - $(tableEl).append(tblStr); - -}); - -//Link addLesionToExistedRow event -$(document).on("addLesionToExistedRow",function(event,data ){ - // Get count of lds - var tabId = data.tabId; - var lds = $("#content"+tabId).find(".lesionTable th.ld"); - // Add measurement to right column - for(var i=0; i< lds.length; i++) { - if(i === data.viewportIndex) { - var rowIndex = data.rowIndex + 1; - var row = $("#content"+tabId).find(".lesionTable tr").eq(rowIndex); - var cell = $(row).find("td.lesion").eq(data.viewportIndex); - $(cell).attr("id", data.lineIndex); - $(cell).html(data.lesions); - } - } -}); - -$(document).on("lesionTextChanged", function(event, data){ - var cellId = data.index; - $("td#"+cellId).html(data.measurementText); -}); - - -Template.lesionTable.onRendered( function () { - - // TODO: Set lesion table as hiding-panel - console.log(this); - var template = this; - var tabId = this.data.tabId; - var viewports = $("#content"+tabId).find(".imageViewerViewport"); - var lesionTable = $("#content"+tabId).find(".lesionTable"); - - var viewportCount = viewports.length; - - var lesionTableWidth = $(lesionTable).width(); - var viewportWidth = viewports.width(); - var ldColumnRatio = viewportWidth / lesionTableWidth * 100; - - // Add LD column as viewportCount - // Set lesion table columns width - - if(viewportCount > 0) { - if(viewportCount == 1) { - $('#content'+tabId+' thead tr').append( $('', {text : 'Location', width: ldColumnRatio/2+'%', class:'thLocation'}) ) - $('#content'+tabId+' thead tr').append( $('', {text : 'LD', width: ldColumnRatio/2+'%', class:'ld'}) ) - - } else if(viewportCount == 2) { - - for(var i = 0; i< viewportCount; i++) { - $('#content'+tabId+' thead tr').append( $('', {text : 'Location'+i, width: ldColumnRatio/2+'%', class:'thLocation'}) ) - $('#content'+tabId+' thead tr').append( $('', {text : 'LD'+i, width: ldColumnRatio/2+'%', class:'ld'}) ) - } - - } else if(viewportCount > 2) { - // TODO: Set when viewport count is bigger than 2 - } - } - // TODO: When layout is changed, add and calculate new columns for measurement -}); - -Template.lesionTable.events({ - 'click button.btnRemove': function (e) { - var el = $(e.target); + var contentId = Session.get("activeContentId"); + return Template.instance().timepointNamesDictionary.get(contentId); }, - 'click table tbody tr': function(e) { - console.log(this); - var row = e.currentTarget; - var lesionCells = $(row).find("td.lesion"); - for(var i = 0; i< lesionCells.length; i++) { - var cell = lesionCells[i]; - var idAttr = $(cell).attr("id"); - if(idAttr != undefined) { - // TODO: Create eventObject and trigger LesionToolModified event - var viewports = $(".imageViewerViewport"); - var eventObject = { - enabledElement: cornerstone.getEnabledElement(viewports[0]), - lineIndex: parseInt(idAttr), - type: "active" - }; - $(viewports[0]).trigger("LesionToolModified", eventObject); - } - } + 'lesionData': function() { + var array = []; + var lesions = this.lesionData; + Object.keys(lesions).forEach(function(key) { + array.push(lesions[key]); + }); + return array; } -});*/ \ No newline at end of file +}); + +Template.lesionTable.onRendered(function() { + + // TODO: Create seperate method + var cols = Template.instance().data.viewportColumns.curValue; + var rows = Template.instance().data.viewportRows.curValue; + + var totalViewports = cols * rows; + + var contentId = Session.get('activeContentId'); + for(var i=0; i< totalViewports; i++) { + var timepointNamesArray = []; + if(Template.instance().timepointNamesDictionary.get(contentId) != undefined) { + timepointNamesArray = Template.instance().timepointNamesDictionary.get(contentId); + } + var timepointID = contentId.toString()+ i.toString(); + var timepointName = "Baseline"; + if(i > 0) { + timepointName = "Follow Up "+i; + } + var timepointObject = {id: timepointID, name: timepointName}; + timepointNamesArray.push(timepointObject); + Template.instance().timepointNamesDictionary.set(contentId, timepointNamesArray); + } + +}); + +Template.lesionTable.onCreated(function() { + this.timepointNamesDictionary = new ReactiveDict(); +}); diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.styl b/Packages/lesiontracker/components/lesionTable/lesionTable.styl index faa910740..bc3007437 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.styl +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.styl @@ -1,6 +1,7 @@ #lesionTableContainer - width: 100% - height: 25% + width: 100% + height: 25% + overflow: auto table.lesionTable thead diff --git a/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.html b/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.html index 682ddab89..73923ee78 100644 --- a/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.html +++ b/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.html @@ -1,11 +1,11 @@ \ No newline at end of file diff --git a/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.js b/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.js index eab82fae2..d7f0c9d37 100644 --- a/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.js +++ b/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.js @@ -1,10 +1,10 @@ Template.lesionTableRow.helpers({ 'timepoints': function() { var array = []; - var timepoints = this.timepoints; + var timepoints = this.lesionData.timepoints; Object.keys(timepoints).forEach(function(key) { array.push(timepoints[key]); }); return array; - }, + } }); diff --git a/Packages/lesiontracker/lib/getActiveTimepointID.js b/Packages/lesiontracker/lib/getActiveTimepointID.js new file mode 100644 index 000000000..b10db86d7 --- /dev/null +++ b/Packages/lesiontracker/lib/getActiveTimepointID.js @@ -0,0 +1,7 @@ +getActiveTimepointID = function (viewportElement) { + var contentId = Session.get("activeContentId"); + var imageViewportElements = $("#"+contentId).find(".imageViewerViewport"); + var index = $(imageViewportElements).index(viewportElement); + + return contentId.toString() + index.toString(); +}; \ No newline at end of file diff --git a/Packages/lesiontracker/lib/uuid.js b/Packages/lesiontracker/lib/uuid.js new file mode 100755 index 000000000..0b596fc3e --- /dev/null +++ b/Packages/lesiontracker/lib/uuid.js @@ -0,0 +1,250 @@ +// uuid.js +// +// Copyright (c) 2010-2012 Robert Kieffer +// MIT License - http://opensource.org/licenses/mit-license.php + +(function() { + var _global = this; + + // Unique ID creation requires a high quality random # generator. We feature + // detect to determine the best RNG source, normalizing to a function that + // returns 128-bits of randomness, since that's what's usually required + var _rng; + + // Allow for MSIE11 msCrypto + var _crypto = _global.crypto || _global.msCrypto; + + // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html + // + // Moderately fast, high quality + if (typeof(_global.require) == 'function') { + try { + var _rb = _global.require('crypto').randomBytes; + _rng = _rb && function() {return _rb(16);}; + } catch(e) {} + } + + if (!_rng && _crypto && _crypto.getRandomValues) { + // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto + // + // Moderately fast, high quality + var _rnds8 = new Uint8Array(16); + _rng = function whatwgRNG() { + _crypto.getRandomValues(_rnds8); + return _rnds8; + }; + } + + if (!_rng) { + // Math.random()-based (RNG) + // + // If all else fails, use Math.random(). It's fast, but is of unspecified + // quality. + var _rnds = new Array(16); + _rng = function() { + for (var i = 0, r; i < 16; i++) { + if ((i & 0x03) === 0) r = Math.random() * 0x100000000; + _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return _rnds; + }; + } + + // Buffer class to use + var BufferClass = typeof(_global.Buffer) == 'function' ? _global.Buffer : Array; + + // Maps for number <-> hex string conversion + var _byteToHex = []; + var _hexToByte = {}; + for (var i = 0; i < 256; i++) { + _byteToHex[i] = (i + 0x100).toString(16).substr(1); + _hexToByte[_byteToHex[i]] = i; + } + + // **`parse()` - Parse a UUID into it's component bytes** + function parse(s, buf, offset) { + var i = (buf && offset) || 0, ii = 0; + + buf = buf || []; + s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { + if (ii < 16) { // Don't overflow! + buf[i + ii++] = _hexToByte[oct]; + } + }); + + // Zero out remaining bytes if string was short + while (ii < 16) { + buf[i + ii++] = 0; + } + + return buf; + } + + // **`unparse()` - Convert UUID byte array (ala parse()) into a string** + function unparse(buf, offset) { + var i = offset || 0, bth = _byteToHex; + return bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]]; + } + + // **`v1()` - Generate time-based UUID** + // + // Inspired by https://github.com/LiosK/UUID.js + // and http://docs.python.org/library/uuid.html + + // random #'s we need to init node and clockseq + var _seedBytes = _rng(); + + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + var _nodeId = [ + _seedBytes[0] | 0x01, + _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] + ]; + + // Per 4.2.2, randomize (14 bit) clockseq + var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff; + + // Previous uuid creation time + var _lastMSecs = 0, _lastNSecs = 0; + + // See https://github.com/broofa/node-uuid for API details + function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + + options = options || {}; + + var clockseq = options.clockseq != null ? options.clockseq : _clockseq; + + // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + var msecs = options.msecs != null ? options.msecs : new Date().getTime(); + + // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1; + + // Time since last uuid creation (in msecs) + var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; + + // Per 4.2.1.2, Bump clockseq on clock regression + if (dt < 0 && options.clockseq == null) { + clockseq = clockseq + 1 & 0x3fff; + } + + // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) { + nsecs = 0; + } + + // Per 4.2.1.2 Throw error if too many uuids are requested + if (nsecs >= 10000) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + + // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + msecs += 12219292800000; + + // `time_low` + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; + + // `time_mid` + var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; + + // `time_high_and_version` + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + b[i++] = tmh >>> 16 & 0xff; + + // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + b[i++] = clockseq >>> 8 | 0x80; + + // `clock_seq_low` + b[i++] = clockseq & 0xff; + + // `node` + var node = options.node || _nodeId; + for (var n = 0; n < 6; n++) { + b[i + n] = node[n]; + } + + return buf ? buf : unparse(b); + } + + // **`v4()` - Generate random UUID** + + // See https://github.com/broofa/node-uuid for API details + function v4(options, buf, offset) { + // Deprecated - 'format' argument, as supported in v1.2 + var i = buf && offset || 0; + + if (typeof(options) == 'string') { + buf = options == 'binary' ? new BufferClass(16) : null; + options = null; + } + options = options || {}; + + var rnds = options.random || (options.rng || _rng)(); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + + // Copy bytes to buffer, if provided + if (buf) { + for (var ii = 0; ii < 16; ii++) { + buf[i + ii] = rnds[ii]; + } + } + + return buf || unparse(rnds); + } + + // Export public API + var uuid = v4; + uuid.v1 = v1; + uuid.v4 = v4; + uuid.parse = parse; + uuid.unparse = unparse; + uuid.BufferClass = BufferClass; + + if (typeof(module) != 'undefined' && module.exports) { + // Publish as node.js module + module.exports = uuid; + } else if (typeof define === 'function' && define.amd) { + // Publish as AMD module + define(function() {return uuid;}); + + + } else { + // Publish as global (in browsers) + var _previousRoot = _global.uuid; + + // **`noConflict()` - (browser only) to reset global 'uuid' var** + uuid.noConflict = function() { + _global.uuid = _previousRoot; + return uuid; + }; + + _global.uuid = uuid; + } +}).call(this); diff --git a/Packages/lesiontracker/package.js b/Packages/lesiontracker/package.js index c4ed6f673..420ee6338 100644 --- a/Packages/lesiontracker/package.js +++ b/Packages/lesiontracker/package.js @@ -15,6 +15,7 @@ Package.onUse(function (api) { api.use('cornerstone'); api.addFiles('compatibility/lesionTool.js', 'client', {bare: true}); + api.addFiles('compatibility/measurementManagerDAL.js', 'client', {bare: true}); api.addFiles('components/lesionDialog/lesionDialog.html', 'client'); api.addFiles('components/lesionDialog/lesionDialog.js', 'client'); @@ -32,4 +33,9 @@ Package.onUse(function (api) { api.addFiles('components/lesionTableTimepointCell/lesionTableTimepointCell.html', 'client'); api.addFiles('components/lesionTableTimepointHeader/lesionTableTimepointHeader.html', 'client'); + + // Library functions + api.addFiles('lib/getActiveTimepointID.js', 'client'); + api.addFiles('lib/uuid.js', 'client'); + }); \ No newline at end of file diff --git a/Packages/viewerbase/components/viewer/imageViewerViewport/imageViewerViewport.js b/Packages/viewerbase/components/viewer/imageViewerViewport/imageViewerViewport.js index fd722f35f..cc8653e6d 100644 --- a/Packages/viewerbase/components/viewer/imageViewerViewport/imageViewerViewport.js +++ b/Packages/viewerbase/components/viewer/imageViewerViewport/imageViewerViewport.js @@ -255,6 +255,7 @@ Template.imageViewerViewport.events({ if (this.viewportIndex === this.activeViewport.curValue) { return; } + Session.set("ActivateViewportIndex", this.viewportIndex); console.log('ActivateViewport index: ' + this.viewportIndex); this.activeViewport.curValue = this.viewportIndex; enablePrefetchOnElement(this.viewportIndex); diff --git a/Packages/worklist/components/worklist.js b/Packages/worklist/components/worklist.js index 097a9ea7a..086f7bd72 100644 --- a/Packages/worklist/components/worklist.js +++ b/Packages/worklist/components/worklist.js @@ -18,6 +18,10 @@ switchToTab = function(contentId) { var data = ViewerData[contentId]; console.log("Switching to tab: " + contentId); + + // Set active tab + Session.set("activeContentId", contentId); + $('.tabTitle a[data-target="#' + contentId + '"]').tab('show'); $("#viewer").remove(); @@ -70,6 +74,7 @@ Template.worklist.onRendered(function() { }; Session.set('ViewerData', ViewerData); + switchToTab(contentId); }); }); \ No newline at end of file diff --git a/Packages/worklist/lib/generateUUID.js b/Packages/worklist/lib/generateUUID.js index a03d70e59..3de8a8a46 100644 --- a/Packages/worklist/lib/generateUUID.js +++ b/Packages/worklist/lib/generateUUID.js @@ -7,4 +7,4 @@ generateUUID = function() { return(c=='x' ? r :(r&0x3|0x8)).toString(8); }); return uuid; -}; \ No newline at end of file +}; From b056112e6bc350f5cf9d61dc4f8c46b628110fb8 Mon Sep 17 00:00:00 2001 From: radicalrob Date: Thu, 29 Oct 2015 09:58:56 -0400 Subject: [PATCH 03/59] Updated path to packages and config based on having pushed viewers down one level --- LesionTracker/bin/siimDCM4CHEE.sh | 2 +- OHIFViewer/bin/siimDCM4CHEE.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LesionTracker/bin/siimDCM4CHEE.sh b/LesionTracker/bin/siimDCM4CHEE.sh index be0397a85..2c0293411 100755 --- a/LesionTracker/bin/siimDCM4CHEE.sh +++ b/LesionTracker/bin/siimDCM4CHEE.sh @@ -1 +1 @@ -PACKAGE_DIRS="../Packages" meteor --settings ../config/siimDCM4CHEE.json +PACKAGE_DIRS="../../Packages" meteor --settings ../../config/siimDCM4CHEE.json diff --git a/OHIFViewer/bin/siimDCM4CHEE.sh b/OHIFViewer/bin/siimDCM4CHEE.sh index be0397a85..2c0293411 100755 --- a/OHIFViewer/bin/siimDCM4CHEE.sh +++ b/OHIFViewer/bin/siimDCM4CHEE.sh @@ -1 +1 @@ -PACKAGE_DIRS="../Packages" meteor --settings ../config/siimDCM4CHEE.json +PACKAGE_DIRS="../../Packages" meteor --settings ../../config/siimDCM4CHEE.json From 074f043a65f934a87676ac92d20dbdc804c6995e Mon Sep 17 00:00:00 2001 From: Rob Lewis Date: Thu, 29 Oct 2015 10:23:38 -0400 Subject: [PATCH 04/59] Revert "Updated path to packages and config based on having pushed viewers down one level" This reverts commit b056112e6bc350f5cf9d61dc4f8c46b628110fb8. --- LesionTracker/bin/siimDCM4CHEE.sh | 2 +- OHIFViewer/bin/siimDCM4CHEE.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LesionTracker/bin/siimDCM4CHEE.sh b/LesionTracker/bin/siimDCM4CHEE.sh index 2c0293411..be0397a85 100755 --- a/LesionTracker/bin/siimDCM4CHEE.sh +++ b/LesionTracker/bin/siimDCM4CHEE.sh @@ -1 +1 @@ -PACKAGE_DIRS="../../Packages" meteor --settings ../../config/siimDCM4CHEE.json +PACKAGE_DIRS="../Packages" meteor --settings ../config/siimDCM4CHEE.json diff --git a/OHIFViewer/bin/siimDCM4CHEE.sh b/OHIFViewer/bin/siimDCM4CHEE.sh index 2c0293411..be0397a85 100755 --- a/OHIFViewer/bin/siimDCM4CHEE.sh +++ b/OHIFViewer/bin/siimDCM4CHEE.sh @@ -1 +1 @@ -PACKAGE_DIRS="../../Packages" meteor --settings ../../config/siimDCM4CHEE.json +PACKAGE_DIRS="../Packages" meteor --settings ../config/siimDCM4CHEE.json From 78faa2a8f9a3746a04f6fa3fd0390e48165220ef Mon Sep 17 00:00:00 2001 From: Aysel Afsar Date: Thu, 29 Oct 2015 15:40:20 -0400 Subject: [PATCH 05/59] Set lesion table row data in correct columns Populate Measurements collection according to lesion table columns --- .../compatibility/measurementManagerDAL.js | 64 ++++++++++++------- .../components/lesionTable/lesionTable.html | 6 +- .../components/lesionTable/lesionTable.js | 38 +++++++---- .../lesionTableRow/lesionTableRow.js | 7 +- .../lesionTableTimepointCell.js | 6 ++ .../lesionTableTimepointHeader.html | 2 +- .../lesionTableTimepointHeader.js | 5 ++ Packages/lesiontracker/package.js | 3 + 8 files changed, 87 insertions(+), 44 deletions(-) create mode 100644 Packages/lesiontracker/components/lesionTableTimepointCell/lesionTableTimepointCell.js create mode 100644 Packages/lesiontracker/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js diff --git a/Packages/lesiontracker/compatibility/measurementManagerDAL.js b/Packages/lesiontracker/compatibility/measurementManagerDAL.js index 4564acfea..05ec765b1 100644 --- a/Packages/lesiontracker/compatibility/measurementManagerDAL.js +++ b/Packages/lesiontracker/compatibility/measurementManagerDAL.js @@ -87,53 +87,71 @@ var measurementManagerDAL = (function () { return Session.get("activeContentId"); } + function getTimepointsOfTab (){ + var contentId = getContentId(); + var tabData = TabsTimepoints.find({contentId: contentId}).fetch(); + return tabData[0].timepoints; + } + // Adds new timepoint item to tiemepoints array function addLesionData (lesionData) { - // TODO: if find lesionNumber, add - // TODO: Unless create new object var contentId = getContentId(); var timepointID = lesionData.timepointID; - var tabMeasurements = Measurements.find({contentId: contentId}).fetch(); - var existingMeasurement; - if(tabMeasurements != undefined && tabMeasurements.length > 0) { - var tabLesionData = tabMeasurements.filter(function(item){return (item.lesionData.lesionNumber == lesionData.lesionNumber);} )[0]; - if(tabLesionData != undefined) { - existingMeasurement = tabLesionData.lesionData; + var tabMeasurements = Measurements.find({contentId: contentId, "lesionData.lesionNumber": lesionData.lesionNumber}).fetch(); + var tabMeasurementsData = tabMeasurements[0]; + if (tabMeasurements != undefined && tabMeasurements.length > 0) { + + // Update timepoint + var timepointArr = tabMeasurementsData.lesionData.timepoints; + for(var i=0; i< timepointArr.length; i++) { + var timepoint = timepointArr[i]; + if(timepoint[timepointID] != undefined) { + timepoint[timepointID].longestDiameter = lesionData.measurementText; + } } - } - - if (existingMeasurement != undefined) { - - var existingTimepoint = existingMeasurement.timepoints; - existingTimepoint[timepointID] = {longestDiameter: lesionData.measurementText}; - Measurements.update( { contentId: contentId, "lesionData.lesionNumber": lesionData.lesionNumber}, { $set: { - "lesionData.timepoints": existingTimepoint + "lesionData.timepoints": timepointArr } }, {multi: true} ); - console.log(Measurements.find()) } else { - var timepointArr = {}; - timepointArr[timepointID] = {longestDiameter: lesionData.measurementText}; + // Add new measurement data + var timepointsOfTab = getTimepointsOfTab(); + var timepointsArr = []; + for(var i=0; i< timepointsOfTab.length; i++) { + var timepointId = timepointsOfTab[i].timepointID; + var lesionTimepointId = lesionData.timepointID; + + if (timepointId === lesionTimepointId) { + // Add real mesurement + var timepointObject = {}; + timepointObject[timepointId] = {longestDiameter: lesionData.measurementText}; + timepointsArr.push(timepointObject); + } else { + // Add null measurement + var timepointObject = {}; + timepointObject[timepointId] = {longestDiameter: ""}; + timepointsArr.push(timepointObject); + + } + } + var lesionDataCollectionObject = { lesionNumber: lesionData.lesionNumber, isTarget: true, location: getLocationName(lesionData.locationUID), - timepoints: timepointArr + timepoints: timepointsArr }; Measurements.insert({contentId: contentId, lesionData: lesionDataCollectionObject}); - console.log(Measurements.find()); - } - + // Populate timepoints array var roi = { uid: lesionData.uid, diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.html b/Packages/lesiontracker/components/lesionTable/lesionTable.html index f3619ecec..68cca4b56 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.html +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.html @@ -7,8 +7,10 @@ Target Location - {{ #each timepointNames }} - {{ >lesionTableTimepointHeader }} + {{ #each tabTimepoints }} + {{ #each timepoints }} + {{ >lesionTableTimepointHeader }} + {{ /each }} {{ /each }} diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.js b/Packages/lesiontracker/components/lesionTable/lesionTable.js index 165db1cac..a219fdcb4 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.js +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.js @@ -1,15 +1,14 @@ Measurements = new Meteor.Collection(null); -TimepointNames = new Meteor.Collection(null); +TabsTimepoints = new Meteor.Collection(null); Template.lesionTable.helpers({ 'measurement': function() { var contentId = Session.get("activeContentId"); - console.log(Measurements.find({contentId: contentId})); return Measurements.find({contentId: contentId}); }, - 'timepointNames': function() { + 'tabTimepoints': function() { var contentId = Session.get("activeContentId"); - return Template.instance().timepointNamesDictionary.get(contentId); + return TabsTimepoints.find({contentId: contentId}); }, 'lesionData': function() { var array = []; @@ -23,26 +22,41 @@ Template.lesionTable.helpers({ Template.lesionTable.onRendered(function() { - // TODO: Create seperate method var cols = Template.instance().data.viewportColumns.curValue; var rows = Template.instance().data.viewportRows.curValue; var totalViewports = cols * rows; var contentId = Session.get('activeContentId'); + var timepointsArray = []; for(var i=0; i< totalViewports; i++) { - var timepointNamesArray = []; - if(Template.instance().timepointNamesDictionary.get(contentId) != undefined) { - timepointNamesArray = Template.instance().timepointNamesDictionary.get(contentId); - } + var timepointID = contentId.toString()+ i.toString(); var timepointName = "Baseline"; if(i > 0) { timepointName = "Follow Up "+i; } - var timepointObject = {id: timepointID, name: timepointName}; - timepointNamesArray.push(timepointObject); - Template.instance().timepointNamesDictionary.set(contentId, timepointNamesArray); + var timepointObject = {timepointID: timepointID, timepointName: timepointName}; + timepointsArray.push(timepointObject); + + } + + // Prevent duplicate data when onRendered is called + var tabTimepoint = TabsTimepoints.find({contentId: contentId}).fetch(); + if (tabTimepoint != undefined && tabTimepoint.length > 0) { + // Update timepoints + TabsTimepoints.update( + { contentId: contentId}, + { + $set: { + timepoints: timepointsArray + } + }, {multi: true} + ); + } else { + + // Insert new timepoints array + TabsTimepoints.insert({contentId: contentId, timepoints: timepointsArray}); } }); diff --git a/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.js b/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.js index d7f0c9d37..8d4f412b9 100644 --- a/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.js +++ b/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.js @@ -1,10 +1,5 @@ Template.lesionTableRow.helpers({ 'timepoints': function() { - var array = []; - var timepoints = this.lesionData.timepoints; - Object.keys(timepoints).forEach(function(key) { - array.push(timepoints[key]); - }); - return array; + return this.lesionData.timepoints; } }); diff --git a/Packages/lesiontracker/components/lesionTableTimepointCell/lesionTableTimepointCell.js b/Packages/lesiontracker/components/lesionTableTimepointCell/lesionTableTimepointCell.js new file mode 100644 index 000000000..c19772d12 --- /dev/null +++ b/Packages/lesiontracker/components/lesionTableTimepointCell/lesionTableTimepointCell.js @@ -0,0 +1,6 @@ +Template.lesionTableTimepointCell.helpers({ + 'longestDiameter': function() { + var longestDiameter = this[Object.keys(this)[0]].longestDiameter; + return longestDiameter; + } +}); \ No newline at end of file diff --git a/Packages/lesiontracker/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html b/Packages/lesiontracker/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html index 6800cd376..2bd4a7756 100644 --- a/Packages/lesiontracker/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html +++ b/Packages/lesiontracker/components/lesionTableTimepointHeader/lesionTableTimepointHeader.html @@ -1,3 +1,3 @@ \ No newline at end of file diff --git a/Packages/lesiontracker/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js b/Packages/lesiontracker/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js new file mode 100644 index 000000000..fe1d49009 --- /dev/null +++ b/Packages/lesiontracker/components/lesionTableTimepointHeader/lesionTableTimepointHeader.js @@ -0,0 +1,5 @@ +Template.lesionTableTimepointHeader.helpers({ + 'timepoints': function (){ + return this.timepoints; + } +}); \ No newline at end of file diff --git a/Packages/lesiontracker/package.js b/Packages/lesiontracker/package.js index 420ee6338..7f1eabfa8 100644 --- a/Packages/lesiontracker/package.js +++ b/Packages/lesiontracker/package.js @@ -31,8 +31,11 @@ Package.onUse(function (api) { api.addFiles('components/lesionTableRow/lesionTableRow.js', 'client'); api.addFiles('components/lesionTableTimepointCell/lesionTableTimepointCell.html', 'client'); + api.addFiles('components/lesionTableTimepointCell/lesionTableTimepointCell.js', 'client'); api.addFiles('components/lesionTableTimepointHeader/lesionTableTimepointHeader.html', 'client'); + api.addFiles('components/lesionTableTimepointHeader/lesionTableTimepointHeader.js', 'client'); + // Library functions api.addFiles('lib/getActiveTimepointID.js', 'client'); From 9fb5cc2953d78de6ebe37f937e03fc1f375ee58f Mon Sep 17 00:00:00 2001 From: Aysel Afsar Date: Thu, 29 Oct 2015 19:05:04 -0400 Subject: [PATCH 06/59] Update measurement data in lesion table --- .../lesiontracker/compatibility/lesionTool.js | 83 +------ .../compatibility/measurementManagerDAL.js | 203 ++++++++---------- .../components/lesionDialog/lesionDialog.js | 35 +-- 3 files changed, 98 insertions(+), 223 deletions(-) diff --git a/Packages/lesiontracker/compatibility/lesionTool.js b/Packages/lesiontracker/compatibility/lesionTool.js index 8fab525b2..e7ff4d4bf 100644 --- a/Packages/lesiontracker/compatibility/lesionTool.js +++ b/Packages/lesiontracker/compatibility/lesionTool.js @@ -17,7 +17,6 @@ var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTo var element = mouseEventData.element; timepointID = getActiveTimepointID(element); var lesionNumber = measurementManagerDAL.getLesionNumber(timepointID); - console.log(lesionNumber); var lesionCounter = ""; // Subscribe CornerstoneMouseup event, when mouse is up, call lesionDialog @@ -137,82 +136,14 @@ var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTo function updateLesionCollection(lesionData, currentElement) { if (lesionData.active) { - activeLesionMeasurementData = lesionData; + if(lesionData.timepointID != undefined && lesionData.timepointID != "") { + // Update Measurements Collection + measurementManagerDAL.updateTimepointData(lesionData); + + } else { + activeLesionMeasurementData = lesionData; + } } - - // TODO: Option1: Create a global variable like lesionMeasurementData - // TODO: Insert lesionData inside the lesionMeasurementData - // TODO: Send the lesionMeasurementData to lesionDialog by ShowLesionDialog event - - /*if (lesionMeasurementData != undefined && lesionMeasurementData.lesionNumber === lesionData.index) { - lesionMeasurementData.timepoints.now.longestDiameter = lesionData.measurementText; - console.log(lesionMeasurementData.timepoints.now.longestDiameter); - } else { - lesionMeasurementData = { - lesionNumber: lesionData.index, - isTarget: true, - location: '', - timepoints: { - "now": { - imageId: "blah", - timepointUid: "timepointX", - date: 2010, - isDirty: true, - longestDiameter: lesionData.measurementText - }, - "earlier": { - imageId: "blah2", - timepointUid: "timepointy", - date: 2010, - isDirty: true, - longestDiameter: 8 - } - } - }; - }*/ - - // TODO: Option2: - // Check collection has this lesionData - /*var isFound = Measurements.findOne({lesionNumber: lesionData.index}); - - // TODO: Decide which time point is changed - if (isFound) { - // Update measurement text - Measurements.update( - { lesionNumber: lesionData.index }, - { - $set: { - "timepoints.now.longestDiameter": lesionData.measurementText - } - }, {multi: true} - ); - - console.log(Measurements.find()); - } else { - var lesionObject = { - lesionNumber: lesionData.index, - isTarget: true, - location: '', - isHidden: true, - timepoints: { - "now": { - imageId: "blah", - timepointUid: "timepointX", - date: 2010, - isDirty: true, - longestDiameter: lesionData.measurementText - }, - "earlier": { - imageId: "blah2", - timepointUid: "timepointy", - date: 2010, - isDirty: true, - longestDiameter: 8 - } - } - }; - Measurements.insert(lesionObject); - }*/ } function renderLesion(lesion, context, eventData){ diff --git a/Packages/lesiontracker/compatibility/measurementManagerDAL.js b/Packages/lesiontracker/compatibility/measurementManagerDAL.js index 05ec765b1..3a4496221 100644 --- a/Packages/lesiontracker/compatibility/measurementManagerDAL.js +++ b/Packages/lesiontracker/compatibility/measurementManagerDAL.js @@ -2,50 +2,6 @@ var measurementManagerDAL = (function () { var trialPatientLocations = []; var timepoints = []; - // timepointID = tabId + activeViewportIndex - /*timepoints = [ - { - timepointID: "tp0", - rois: [ - { - UID: "345", - number: 1, - measurement: "22.34", - locationUID: 12345 - }, - { - UID: "245", - number: 2, - measurement: "22.34", - locationUID: 1745 - } - ] - }, - { - timepointID: "tp1", - rois: [ - { - UID: "243", - number: 1, - measurement: "22.34", - locationUID: 12345 - } - ] - }, - { - timepointID: "tp2", - rois: [ - { - UID: "253", - number: 1, - measurement: "0.34", - locationUID: 12345 - } - ] - } - ]; - */ - // Returns trialPatientLocations array function getPatientLocations () { return trialPatientLocations; @@ -76,13 +32,6 @@ var measurementManagerDAL = (function () { return locationUID; } - - // Insert Measurements Collection - function insertDataToMeasurementCollection (lesionData) { - - - } - function getContentId () { return Session.get("activeContentId"); } @@ -93,9 +42,43 @@ var measurementManagerDAL = (function () { return tabData[0].timepoints; } - // Adds new timepoint item to tiemepoints array - function addLesionData (lesionData) { + // Add timepoint data to Measurements collection + function addTimepointData(lesionData) { + var contentId = getContentId(); + var timepointsOfTab = getTimepointsOfTab(); + var timepointsArr = []; + for(var i=0; i< timepointsOfTab.length; i++) { + var timepointId = timepointsOfTab[i].timepointID; + var lesionTimepointId = lesionData.timepointID; + + if (timepointId === lesionTimepointId) { + // Add real mesurement + var timepointObject = {}; + timepointObject[timepointId] = {longestDiameter: lesionData.measurementText}; + timepointsArr.push(timepointObject); + } else { + // Add null measurement + var timepointObject = {}; + timepointObject[timepointId] = {longestDiameter: ""}; + timepointsArr.push(timepointObject); + + } + } + + var lesionDataCollectionObject = { + lesionNumber: lesionData.lesionNumber, + isTarget: true, + locationUID: lesionData.locationUID, + location: getLocationName(lesionData.locationUID), + timepoints: timepointsArr + }; + + Measurements.insert({contentId: contentId, lesionData: lesionDataCollectionObject}); + } + + // Update timepoint data in Measurements collection + function updateTimepointData (lesionData) { var contentId = getContentId(); var timepointID = lesionData.timepointID; var tabMeasurements = Measurements.find({contentId: contentId, "lesionData.lesionNumber": lesionData.lesionNumber}).fetch(); @@ -119,39 +102,31 @@ var measurementManagerDAL = (function () { }, {multi: true} ); - } else { - - // Add new measurement data - var timepointsOfTab = getTimepointsOfTab(); - var timepointsArr = []; - for(var i=0; i< timepointsOfTab.length; i++) { - var timepointId = timepointsOfTab[i].timepointID; - var lesionTimepointId = lesionData.timepointID; - - if (timepointId === lesionTimepointId) { - // Add real mesurement - var timepointObject = {}; - timepointObject[timepointId] = {longestDiameter: lesionData.measurementText}; - timepointsArr.push(timepointObject); - } else { - // Add null measurement - var timepointObject = {}; - timepointObject[timepointId] = {longestDiameter: ""}; - timepointsArr.push(timepointObject); - - } - } - - var lesionDataCollectionObject = { - lesionNumber: lesionData.lesionNumber, - isTarget: true, - location: getLocationName(lesionData.locationUID), - timepoints: timepointsArr - }; - - Measurements.insert({contentId: contentId, lesionData: lesionDataCollectionObject}); } - + } + + // Check timepointData is found in Measurements collection + function timepointDataIsFound (lesionNumber) { + var contentId = getContentId(); + var timepointData = Measurements.findOne({contentId: contentId, "lesionData.lesionNumber": lesionNumber}); + if (timepointData != undefined) { + return true; + } else { + return false; + } + } + + // Adds new timepoint item to tiemepoints array + function addLesionData (lesionData) { + if(timepointDataIsFound(lesionData)) { + // Update data + updateTimepointData(lesionData); + } else{ + // Insert data + addTimepointData(lesionData); + } + + // TODO: This code block will be removed // Populate timepoints array var roi = { uid: lesionData.uid, @@ -169,47 +144,48 @@ var measurementManagerDAL = (function () { timepoints.push({timepointID: timepointID, rois: [roi]}); } - insertDataToMeasurementCollection(lesionData); - } // Returns new lesion number according to timepointID function getNewLesionNumber (timepointID) { - // Check timepoint is in timepoints array - for (var i=0; i< timepoints.length; i++) { - var timepoint = timepoints[i]; - if(timepoint.timepointID === timepointID) { - return timepoint.rois.length + 1; - } - } + var contentId = getContentId(); + var lesionNumberCounter = 0; + var timepointsData = Measurements.find({contentId: contentId}).fetch(); + if(timepointsData.length > 0) { + for(var i=0; i< timepointsData.length; i++) { + var timepointData = timepointsData[i]; + var timepoints = timepointData.lesionData.timepoints; + for(var j=0; j< timepoints.length; j++) { + var timepoint = timepoints[j]; + var key = Object.keys(timepoint); + if(key == timepointID) { + if (timepoint[key].longestDiameter === "") { + return timepointData.lesionData.lesionNumber; - // Add new time point - timepoints.push({timepointID: timepointID, rois: []}); + } else { + lesionNumberCounter = lesionNumberCounter + 1; + } + } + } + } + console.log(lesionNumberCounter + 1); + + return lesionNumberCounter + 1; + } return 1; } // If lesion number is added for any timepoint, returns lesion locationUID function isLesionNumberAdded (lesionNumber) { + if (timepointDataIsFound(lesionNumber)){ + var contentId = getContentId(); + var timepointData = Measurements.find({contentId: contentId, "lesionData.lesionNumber": lesionNumber}).fetch(); + return timepointData[0].lesionData.locationUID; - for (var i=0; i< timepoints.length; i++) { - var timepoint = timepoints[i]; - var rois = timepoint.rois; - - for(var j=0; j Date: Fri, 30 Oct 2015 12:21:59 +0100 Subject: [PATCH 07/59] Updates to improve reactivity, session storage, logging --- LesionTracker/.meteor/packages | 1 + LesionTracker/.meteor/versions | 3 + LesionTracker/client/components/viewer.html | 8 +- LesionTracker/client/components/viewer.js | 43 +++--- .../components/viewerMain/viewerMain.html | 4 +- .../components/viewerMain/viewerMain.js | 3 - LesionTracker/client/log.js | 3 + LesionTracker/client/route.js | 49 ------- LesionTracker/client/routes.js | 45 ++++++ OHIFViewer/.meteor/packages | 1 + OHIFViewer/.meteor/versions | 3 + .../client/components/viewer/viewer.html | 7 +- OHIFViewer/client/components/viewer/viewer.js | 43 +++--- .../client/components/viewer/viewer.styl | 8 +- .../viewer/viewerMain/viewerMain.html | 6 - .../viewer/viewerMain/viewerMain.js | 5 - .../viewer/viewerMain/viewerMain.styl | 5 - OHIFViewer/client/log.js | 3 + OHIFViewer/client/routes.js | 54 ++++--- Packages/cornerstone/client/cornerstone.js | 6 +- .../components/lesionTable/lesionTable.js | 29 ++-- .../studyBrowser/studyBrowser/studyBrowser.js | 2 +- .../imageViewerViewport.js | 59 +++++--- .../imageViewerViewports.html | 2 +- .../imageViewerViewports.js | 59 ++++---- .../viewer/layoutChooser/layoutChooser.js | 25 +--- .../viewer/playClipButton/playClipButton.js | 4 +- .../components/viewer/toolbar/toolbar.html | 4 +- .../components/viewer/toolbar/toolbar.js | 4 +- .../lib/rerenderViewportWithNewSeries.js | 2 +- Packages/viewerbase/log.js | 3 + Packages/viewerbase/package.js | 4 + Packages/worklist/components/worklist.js | 132 +++++++++++------- .../components/worklistStudy/worklistStudy.js | 4 +- Packages/worklist/log.js | 3 + Packages/worklist/package.js | 8 ++ README.md | 14 ++ 37 files changed, 370 insertions(+), 288 deletions(-) create mode 100644 LesionTracker/client/log.js delete mode 100644 LesionTracker/client/route.js create mode 100644 LesionTracker/client/routes.js delete mode 100644 OHIFViewer/client/components/viewer/viewerMain/viewerMain.html delete mode 100644 OHIFViewer/client/components/viewer/viewerMain/viewerMain.js delete mode 100644 OHIFViewer/client/components/viewer/viewerMain/viewerMain.styl create mode 100644 OHIFViewer/client/log.js create mode 100644 Packages/viewerbase/log.js create mode 100644 Packages/worklist/log.js diff --git a/LesionTracker/.meteor/packages b/LesionTracker/.meteor/packages index b9b9c9081..9cdc97fa1 100644 --- a/LesionTracker/.meteor/packages +++ b/LesionTracker/.meteor/packages @@ -36,3 +36,4 @@ random reactive-var reactive-dict lesiontracker +practicalmeteor:loglevel diff --git a/LesionTracker/.meteor/versions b/LesionTracker/.meteor/versions index 4a556777f..d00252c84 100644 --- a/LesionTracker/.meteor/versions +++ b/LesionTracker/.meteor/versions @@ -16,6 +16,7 @@ caching-compiler@1.0.0 caching-html-compiler@1.0.2 callback-hook@1.0.4 check@1.1.0 +coffeescript@1.0.11 cornerstone@0.0.1 ddp@1.2.2 ddp-client@1.2.1 @@ -67,6 +68,8 @@ npm-bcrypt@0.7.8_2 npm-mongo@1.4.39_1 observe-sequence@1.0.7 ordered-dict@1.0.4 +practicalmeteor:chai@1.9.2_3 +practicalmeteor:loglevel@1.1.0_3 promise@0.5.1 random@1.0.5 rate-limit@1.0.0 diff --git a/LesionTracker/client/components/viewer.html b/LesionTracker/client/components/viewer.html index 8530698dc..0bc88f89a 100644 --- a/LesionTracker/client/components/viewer.html +++ b/LesionTracker/client/components/viewer.html @@ -1,10 +1,10 @@ \ No newline at end of file diff --git a/LesionTracker/client/components/viewer.js b/LesionTracker/client/components/viewer.js index f72198aa7..a79b498ad 100644 --- a/LesionTracker/client/components/viewer.js +++ b/LesionTracker/client/components/viewer.js @@ -1,4 +1,6 @@ function resizeViewports() { + log.info("viewer resizeViewports"); + // Handle resizing of image viewer viewports // For some reason, this seems to need to be on // another delay, or the resizing won't work properly @@ -15,7 +17,8 @@ function resizeViewports() { } Template.viewer.onCreated(function() { - console.log("Image Viewer onCreated"); + log.info("viewer onCreated"); + OHIF = { viewer: {} }; @@ -55,35 +58,35 @@ Template.viewer.onCreated(function() { }; } - if (this.data.activeViewport === undefined) { - this.data.activeViewport = new ReactiveVar(0); - } - if (this.data.viewportRows === undefined) { - this.data.viewportRows = new ReactiveVar(1); - } - if (this.data.viewportColumns === undefined) { - this.data.viewportColumns = new ReactiveVar(2); - } - var contentId = this.data.contentId; - // Update the viewer data object - ViewerData[contentId].viewportColumns = this.data.viewportColumns; - ViewerData[contentId].viewportRows = this.data.viewportRows; - ViewerData[contentId].activeViewport = this.data.activeViewport; - Session.set('ViewerData', ViewerData); + if (ViewerData[contentId].loadedSeriesData) { + log.info('Reloading previous loadedSeriesData'); + + OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData; - if (ViewerData[contentId].viewer) { - OHIF.viewer = ViewerData[contentId].viewer; } else { - OHIF.viewer.imageViewerLoadedSeriesDictionary = {}; - ViewerData[contentId].viewer = OHIF.viewer; + log.info('Setting default ViewerData'); + OHIF.viewer.loadedSeriesData = {}; + + ViewerData[contentId].loadedSeriesData = OHIF.viewer.loadedSeriesData; + + // Update the viewer data object + ViewerData[contentId].viewportColumns = 2; + ViewerData[contentId].viewportRows = 1; + ViewerData[contentId].activeViewport = 0; + Session.set('ViewerData', ViewerData); } + Session.set('activeViewport', ViewerData[contentId].activeViewport || 0); + + Session.set("studies", this.data.studies); + OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer("CornerstoneNewImage", cornerstoneTools.updateImageSynchronizer); }); Template.viewer.onDestroyed(function() { + log.info("onDestroyed"); OHIF.viewer.updateImageSynchronizer.destroy(); }); diff --git a/LesionTracker/client/components/viewerMain/viewerMain.html b/LesionTracker/client/components/viewerMain/viewerMain.html index e7bdf403f..6bf8bf680 100644 --- a/LesionTracker/client/components/viewerMain/viewerMain.html +++ b/LesionTracker/client/components/viewerMain/viewerMain.html @@ -1,6 +1,6 @@ \ No newline at end of file diff --git a/LesionTracker/client/components/viewerMain/viewerMain.js b/LesionTracker/client/components/viewerMain/viewerMain.js index 2062952f5..7db405613 100644 --- a/LesionTracker/client/components/viewerMain/viewerMain.js +++ b/LesionTracker/client/components/viewerMain/viewerMain.js @@ -1,7 +1,4 @@ Template.viewerMain.helpers({ - studies : function() { - return this.studies; - }, 'toolbarOptions': function() { var toolbarOptions = {}; diff --git a/LesionTracker/client/log.js b/LesionTracker/client/log.js new file mode 100644 index 000000000..f4e50c3e4 --- /dev/null +++ b/LesionTracker/client/log.js @@ -0,0 +1,3 @@ +// Create application logger using loglevel +// https://atmospherejs.com/spacejamio/loglevel +log = loglevel.createAppLogger('LesionTracker', defaultLevel = 'info'); diff --git a/LesionTracker/client/route.js b/LesionTracker/client/route.js deleted file mode 100644 index 2fa8c2777..000000000 --- a/LesionTracker/client/route.js +++ /dev/null @@ -1,49 +0,0 @@ -Router.configure({ - layoutTemplate: 'layoutLesionTracker', - //loadingTemplate: '', - notFoundTemplate: 'notFound' -}); - -Router.route('/', function () { - this.render('worklist', {}); -}); - -tabs = new Meteor.Collection(null); -Session.setDefault('ViewerData', {}); -Session.setDefault('ViewerDataUpdated', Random.id()); - -Object.keys(ViewerData).forEach(function(contentId) { - var tabData = ViewerData[contentId]; - var data = { - title: tabData.title, - contentid: tabData.contentId, - }; - tabs.insert(data); -}); - - -Router.route('/viewer/:_id', { - layoutTemplate: 'layout', - name: 'viewer', - onBeforeAction: function() { - var self = this; - - Meteor.call('GetStudyMetadata', this.params._id, function(error, study) { - sortStudy(study); - - var title = study.seriesList[0].instances[0].patientName; - var contentid = generateUUID(); - - var data = { - title: title, - contentid: contentid, - }; - tabs.insert(data); - - data.studies = [study]; - - self.render('worklist'); - Session.set('OpenNewTabEvent', data); - }); - } -}); \ No newline at end of file diff --git a/LesionTracker/client/routes.js b/LesionTracker/client/routes.js new file mode 100644 index 000000000..422eeb95c --- /dev/null +++ b/LesionTracker/client/routes.js @@ -0,0 +1,45 @@ +tabs = new Meteor.Collection(null); +Session.setDefault('ViewerData', {}); + +// Re-add any tab data saved in the Session +Object.keys(ViewerData).forEach(function(contentId) { + var tabData = ViewerData[contentId]; + var data = { + title: tabData.title, + contentid: tabData.contentid, + }; + tabs.insert(data); +}); + +Router.configure({ + layoutTemplate: 'layout', + loadingTemplate: 'layout', + notFoundTemplate: 'notFound' +}); + +Router.onBeforeAction('loading'); + +Router.route('/', function () { + this.render('worklist'); +}); + + +Router.route('/viewer/:_id', { + layoutTemplate: 'layout', + name: 'viewer', + onBeforeAction: function() { + log.info('Router GetStudyMetadata'); + + var studyInstanceUid = this.params._id; + + // Check if this study is already loaded in a tab + // If it is, stop here so we don't keep adding tabs on hot-code reloads + var tab = tabs.find({'studyInstanceUid' : studyInstanceUid}).fetch(); + if (tab) { + return; + } + + this.render('worklist'); + openNewTab(studyInstanceUid); + } +}); \ No newline at end of file diff --git a/OHIFViewer/.meteor/packages b/OHIFViewer/.meteor/packages index 2dbded030..78786adc7 100644 --- a/OHIFViewer/.meteor/packages +++ b/OHIFViewer/.meteor/packages @@ -33,3 +33,4 @@ dicomweb viewerbase worklist reactive-var +practicalmeteor:loglevel diff --git a/OHIFViewer/.meteor/versions b/OHIFViewer/.meteor/versions index 62a4a53a7..86aaf5f24 100644 --- a/OHIFViewer/.meteor/versions +++ b/OHIFViewer/.meteor/versions @@ -15,6 +15,7 @@ caching-compiler@1.0.0 caching-html-compiler@1.0.2 callback-hook@1.0.4 check@1.1.0 +coffeescript@1.0.11 cornerstone@0.0.1 ddp@1.2.2 ddp-client@1.2.1 @@ -64,6 +65,8 @@ npm-bcrypt@0.7.8_2 npm-mongo@1.4.39_1 observe-sequence@1.0.7 ordered-dict@1.0.4 +practicalmeteor:chai@1.9.2_3 +practicalmeteor:loglevel@1.1.0_3 promise@0.5.1 random@1.0.5 rate-limit@1.0.0 diff --git a/OHIFViewer/client/components/viewer/viewer.html b/OHIFViewer/client/components/viewer/viewer.html index 173d21833..6e7b46e82 100644 --- a/OHIFViewer/client/components/viewer/viewer.html +++ b/OHIFViewer/client/components/viewer/viewer.html @@ -1,6 +1,9 @@ \ No newline at end of file diff --git a/OHIFViewer/client/components/viewer/viewer.js b/OHIFViewer/client/components/viewer/viewer.js index ae0c0b139..058215c73 100644 --- a/OHIFViewer/client/components/viewer/viewer.js +++ b/OHIFViewer/client/components/viewer/viewer.js @@ -1,4 +1,6 @@ function resizeViewports() { + log.info("viewer resizeViewports"); + // Handle resizing of image viewer viewports // For some reason, this seems to need to be on // another delay, or the resizing won't work properly @@ -15,7 +17,8 @@ function resizeViewports() { } Template.viewer.onCreated(function() { - console.log("Image Viewer onCreated"); + log.info("viewer onCreated"); + OHIF = { viewer: {} }; @@ -55,35 +58,35 @@ Template.viewer.onCreated(function() { }; } - if (this.data.activeViewport === undefined) { - this.data.activeViewport = new ReactiveVar(0); - } - if (this.data.viewportRows === undefined) { - this.data.viewportRows = new ReactiveVar(1); - } - if (this.data.viewportColumns === undefined) { - this.data.viewportColumns = new ReactiveVar(1); - } - var contentId = this.data.contentId; - // Update the viewer data object - ViewerData[contentId].viewportColumns = this.data.viewportColumns; - ViewerData[contentId].viewportRows = this.data.viewportRows; - ViewerData[contentId].activeViewport = this.data.activeViewport; - Session.set('ViewerData', ViewerData); + if (ViewerData[contentId].loadedSeriesData) { + log.info('Reloading previous loadedSeriesData'); + + OHIF.viewer.loadedSeriesData = ViewerData[contentId].loadedSeriesData; - if (ViewerData[contentId].viewer) { - OHIF.viewer = ViewerData[contentId].viewer; } else { - OHIF.viewer.imageViewerLoadedSeriesDictionary = {}; - ViewerData[contentId].viewer = OHIF.viewer; + log.info('Setting default ViewerData'); + OHIF.viewer.loadedSeriesData = {}; + + ViewerData[contentId].loadedSeriesData = OHIF.viewer.loadedSeriesData; + + // Update the viewer data object + ViewerData[contentId].viewportColumns = 1; + ViewerData[contentId].viewportRows = 1; + ViewerData[contentId].activeViewport = 0; + Session.set('ViewerData', ViewerData); } + Session.set('activeViewport', ViewerData[contentId].activeViewport || 0); + + Session.set("studies", this.data.studies); + OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer("CornerstoneNewImage", cornerstoneTools.updateImageSynchronizer); }); Template.viewer.onDestroyed(function() { + log.info("onDestroyed"); OHIF.viewer.updateImageSynchronizer.destroy(); }); diff --git a/OHIFViewer/client/components/viewer/viewer.styl b/OHIFViewer/client/components/viewer/viewer.styl index 854b359f5..4a1c1f8df 100644 --- a/OHIFViewer/client/components/viewer/viewer.styl +++ b/OHIFViewer/client/components/viewer/viewer.styl @@ -12,4 +12,10 @@ user-select: none .studyBrowser - width: auto \ No newline at end of file + width: auto + +.viewerMain + float: left + background-color: gray + height: 100% + width: calc(100% - 120px) \ No newline at end of file diff --git a/OHIFViewer/client/components/viewer/viewerMain/viewerMain.html b/OHIFViewer/client/components/viewer/viewerMain/viewerMain.html deleted file mode 100644 index eb39a71c8..000000000 --- a/OHIFViewer/client/components/viewer/viewerMain/viewerMain.html +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/OHIFViewer/client/components/viewer/viewerMain/viewerMain.js b/OHIFViewer/client/components/viewer/viewerMain/viewerMain.js deleted file mode 100644 index 260bf1cc9..000000000 --- a/OHIFViewer/client/components/viewer/viewerMain/viewerMain.js +++ /dev/null @@ -1,5 +0,0 @@ -Template.viewerMain.helpers({ - studies : function() { - return this.studies; - } -}); \ No newline at end of file diff --git a/OHIFViewer/client/components/viewer/viewerMain/viewerMain.styl b/OHIFViewer/client/components/viewer/viewerMain/viewerMain.styl deleted file mode 100644 index 7b269b4cd..000000000 --- a/OHIFViewer/client/components/viewer/viewerMain/viewerMain.styl +++ /dev/null @@ -1,5 +0,0 @@ -.viewerMain - float: left - background-color: gray - height: 100% - width: calc(100% - 120px) \ No newline at end of file diff --git a/OHIFViewer/client/log.js b/OHIFViewer/client/log.js new file mode 100644 index 000000000..1f567f0c5 --- /dev/null +++ b/OHIFViewer/client/log.js @@ -0,0 +1,3 @@ +// Create application logger using loglevel +// https://atmospherejs.com/spacejamio/loglevel +log = loglevel.createAppLogger('OHIFViewer', defaultLevel = 'info'); diff --git a/OHIFViewer/client/routes.js b/OHIFViewer/client/routes.js index 84ae25bfe..422eeb95c 100644 --- a/OHIFViewer/client/routes.js +++ b/OHIFViewer/client/routes.js @@ -1,49 +1,45 @@ -Router.configure({ - layoutTemplate: 'layout', - //loadingTemplate: '', - notFoundTemplate: 'notFound' -}); - -Router.route('/', function () { - this.render('worklist', {}); -}); - tabs = new Meteor.Collection(null); Session.setDefault('ViewerData', {}); -Session.setDefault('ViewerDataUpdated', Random.id()); +// Re-add any tab data saved in the Session Object.keys(ViewerData).forEach(function(contentId) { var tabData = ViewerData[contentId]; var data = { title: tabData.title, - contentid: tabData.contentId, + contentid: tabData.contentid, }; tabs.insert(data); }); +Router.configure({ + layoutTemplate: 'layout', + loadingTemplate: 'layout', + notFoundTemplate: 'notFound' +}); + +Router.onBeforeAction('loading'); + +Router.route('/', function () { + this.render('worklist'); +}); + Router.route('/viewer/:_id', { layoutTemplate: 'layout', name: 'viewer', onBeforeAction: function() { - var self = this; + log.info('Router GetStudyMetadata'); - Meteor.call('GetStudyMetadata', this.params._id, function(error, study) { - sortStudy(study); + var studyInstanceUid = this.params._id; + + // Check if this study is already loaded in a tab + // If it is, stop here so we don't keep adding tabs on hot-code reloads + var tab = tabs.find({'studyInstanceUid' : studyInstanceUid}).fetch(); + if (tab) { + return; + } - var title = study.seriesList[0].instances[0].patientName; - var contentid = generateUUID(); - - var data = { - title: title, - contentid: contentid, - }; - tabs.insert(data); - - data.studies = [study]; - - self.render('worklist'); - Session.set('OpenNewTabEvent', data); - }); + this.render('worklist'); + openNewTab(studyInstanceUid); } }); \ No newline at end of file diff --git a/Packages/cornerstone/client/cornerstone.js b/Packages/cornerstone/client/cornerstone.js index b68821d71..f2cca6c2d 100644 --- a/Packages/cornerstone/client/cornerstone.js +++ b/Packages/cornerstone/client/cornerstone.js @@ -2148,7 +2148,7 @@ if(typeof cornerstone === 'undefined'){ function initShaders() { for (var id in cornerstone.webGL.shaders) { - console.log("WEBGL: Loading shader", id); + //console.log("WEBGL: Loading shader", id); var shader = cornerstone.webGL.shaders[ id ]; shader.attributes = {}; shader.uniforms = {}; @@ -2168,13 +2168,13 @@ if(typeof cornerstone === 'undefined'){ function initRenderer() { if (cornerstone.webGL.isWebGLInitialized === true) { - console.log("WEBGL Renderer already initialized"); + //console.log("WEBGL Renderer already initialized"); return; } if ( initWebGL( renderCanvas ) ) { initBuffers(); initShaders(); - console.log("WEBGL Renderer initialized!"); + //console.log("WEBGL Renderer initialized!"); cornerstone.webGL.isWebGLInitialized = true; } } diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.js b/Packages/lesiontracker/components/lesionTable/lesionTable.js index a219fdcb4..5a1d72bce 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.js +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.js @@ -3,12 +3,22 @@ TabsTimepoints = new Meteor.Collection(null); Template.lesionTable.helpers({ 'measurement': function() { +<<<<<<< HEAD var contentId = Session.get("activeContentId"); return Measurements.find({contentId: contentId}); }, 'tabTimepoints': function() { var contentId = Session.get("activeContentId"); return TabsTimepoints.find({contentId: contentId}); +======= + var contentId = this.contentId; + console.log(Measurements.find({contentId: contentId})); + return Measurements.find({contentId: contentId}); + }, + 'timepointNames': function() { + var contentId = this.contentId; + return Template.instance().timepointNamesDictionary.get(contentId); +>>>>>>> Updates to improve reactivity, session storage, logging }, 'lesionData': function() { var array = []; @@ -21,19 +31,16 @@ Template.lesionTable.helpers({ }); Template.lesionTable.onRendered(function() { + var contentId = this.data.contentId; + var viewportColumns = ViewerData[contentId].viewportColumns; + var viewportRows = ViewerData[contentId].viewportRows; - var cols = Template.instance().data.viewportColumns.curValue; - var rows = Template.instance().data.viewportRows.curValue; - - var totalViewports = cols * rows; - - var contentId = Session.get('activeContentId'); - var timepointsArray = []; + var totalViewports = viewportColumns * viewportRows; + for(var i=0; i< totalViewports; i++) { - - var timepointID = contentId.toString()+ i.toString(); + var timepointID = contentId.toString() + i.toString(); var timepointName = "Baseline"; - if(i > 0) { + if (i > 0) { timepointName = "Follow Up "+i; } var timepointObject = {timepointID: timepointID, timepointName: timepointName}; @@ -43,7 +50,7 @@ Template.lesionTable.onRendered(function() { // Prevent duplicate data when onRendered is called var tabTimepoint = TabsTimepoints.find({contentId: contentId}).fetch(); - if (tabTimepoint != undefined && tabTimepoint.length > 0) { + if (tabTimepoint !== undefined && tabTimepoint.length > 0) { // Update timepoints TabsTimepoints.update( { contentId: contentId}, diff --git a/Packages/viewerbase/components/studyBrowser/studyBrowser/studyBrowser.js b/Packages/viewerbase/components/studyBrowser/studyBrowser/studyBrowser.js index 512dd6076..2fcac4d84 100644 --- a/Packages/viewerbase/components/studyBrowser/studyBrowser/studyBrowser.js +++ b/Packages/viewerbase/components/studyBrowser/studyBrowser/studyBrowser.js @@ -1,5 +1,5 @@ Template.studyBrowser.helpers({ studies : function() { - return this.studies; + return Session.get('studies'); } }); \ No newline at end of file diff --git a/Packages/viewerbase/components/viewer/imageViewerViewport/imageViewerViewport.js b/Packages/viewerbase/components/viewer/imageViewerViewport/imageViewerViewport.js index cc8653e6d..f612b6cf2 100644 --- a/Packages/viewerbase/components/viewer/imageViewerViewport/imageViewerViewport.js +++ b/Packages/viewerbase/components/viewer/imageViewerViewport/imageViewerViewport.js @@ -6,8 +6,9 @@ * @param element */ function enablePrefetchOnElement(viewportIndex) { + log.info("imageViewerViewport enablePrefetchOnElement"); + var element = $('.imageViewerViewport').get(viewportIndex); - //console.log('Enabling prefetch on new element'); // Loop through all viewports and disable stackPrefetch $('.imageViewerViewport').each(function() { @@ -25,6 +26,8 @@ function enablePrefetchOnElement(viewportIndex) { } function displayReferenceLines(viewportIndex) { + log.info("imageViewerViewport displayReferenceLines"); + var element = $('.imageViewerViewport').get(viewportIndex); $('.imageViewerViewport').each(function(index, element) { @@ -49,17 +52,22 @@ function displayReferenceLines(viewportIndex) { } function loadSeriesIntoViewport(data) { + log.info("imageViewerViewport loadSeriesIntoViewport"); + if (!data.series || !data.element) { return; } - var contentId = $("#viewer").parents('.tab-pane.active').attr('id'); + var contentId = Session.get('activeContentId'); + var study = data.study; var series = data.series; var element = data.element; var viewportIndex = $(".imageViewerViewport").index(element); + ViewerData[contentId].loadedSeriesData[viewportIndex] = {}; + var allEvents = 'CornerstoneToolsMouseDown CornerstoneToolsMouseDownActivate ' + 'CornerstoneToolsMouseClick CornerstoneToolsMouseDrag CornerstoneToolsMouseUp ' + 'CornerstoneToolsMouseWheel CornerstoneToolsTap CornerstoneToolsTouchPress ' + @@ -115,6 +123,8 @@ function loadSeriesIntoViewport(data) { endLoadingHandler(element); } + cornerstone.resize(element, true); + element.classList.remove('empty'); $(element).siblings('.viewportInstructions').hide(); $(element).siblings('.imageViewerViewportOverlay').show(); @@ -142,9 +152,11 @@ function loadSeriesIntoViewport(data) { cornerstoneTools.magnify.enable(element); function onImageRendered(e, eventData) { + log.info('imageViewerViewport onImageRendered'); + Session.set('CornerstoneImageRendered' + viewportIndex, Random.id()); var viewport = cornerstone.getViewport(element); - ViewerData[contentId].viewer.imageViewerLoadedSeriesDictionary[viewportIndex].viewport = viewport; + ViewerData[contentId].loadedSeriesData[viewportIndex].viewport = viewport; Session.set('ViewerData', ViewerData); } @@ -153,6 +165,8 @@ function loadSeriesIntoViewport(data) { Session.set('CornerstoneImageRendered' + viewportIndex, Random.id()); function onNewImage(e, eventData) { + log.info('imageViewerViewport onNewImage'); + // Update the templateData with the new imageId // This allows the template helpers to update reactively templateData.imageId = eventData.enabledElement.image.imageId; @@ -161,7 +175,7 @@ function loadSeriesIntoViewport(data) { var stack = cornerstoneTools.getToolState(element, 'stack'); if (stack && stack.data.length && stack.data[0].imageIds.length > 1) { var imageIdIndex = stack.data[0].imageIds.indexOf(templateData.imageId); - ViewerData[contentId].viewer.imageViewerLoadedSeriesDictionary[viewportIndex].currentImageIdIndex = imageIdIndex; + ViewerData[contentId].loadedSeriesData[viewportIndex].currentImageIdIndex = imageIdIndex; Session.set('ViewerData', ViewerData); } } @@ -170,14 +184,17 @@ function loadSeriesIntoViewport(data) { $(element).on('CornerstoneNewImage', onNewImage); function sendActivationTrigger(e, eventData) { - var activeViewportIndex = data.activeViewport.curValue; + log.info('imageViewerViewport sendActivationTrigger'); + var activeViewportIndex = Session.get('activeViewport'); var viewportIndex = $(".imageViewerViewport").index(eventData.element); if (viewportIndex === activeViewportIndex) { return; } eventData.viewportIndex = viewportIndex; - var customEvent = jQuery.Event('ActivateViewport', eventData); - customEvent.type = 'ActivateViewport'; // Need to overwrite the type set in the touch tools + var customEvent = $.Event('ActivateViewport', eventData); + + // Need to overwrite the type set in the original event + customEvent.type = 'ActivateViewport'; $(e.target).trigger(customEvent, eventData); } @@ -186,7 +203,7 @@ function loadSeriesIntoViewport(data) { Session.set('CornerstoneNewImage' + viewportIndex, Random.id()); - OHIF.viewer.imageViewerLoadedSeriesDictionary[viewportIndex] = { + OHIF.viewer.loadedSeriesData[viewportIndex] = { studyInstanceUid: data.studyInstanceUid, seriesInstanceUid: data.seriesInstanceUid, currentImageIdIndex: data.currentImageIdIndex, @@ -206,16 +223,19 @@ function loadSeriesIntoViewport(data) { } Template.imageViewerViewport.onRendered(function() { - var studies = this.data.studies; + log.info("imageViewerViewport onRendered"); + + var studies = Session.get('studies'); + var activeViewport = Session.get('activeViewport'); var element = this.find(".imageViewerViewport"); var data = { element: element, viewport: this.data.viewport, currentImageIdIndex: this.data.currentImageIdIndex, - activeViewport: this.data.activeViewport, studyInstanceUid: this.data.studyInstanceUid, - seriesInstanceUid: this.data.seriesInstanceUid + seriesInstanceUid: this.data.seriesInstanceUid, + activeViewport: activeViewport }; if (this.data.seriesInstanceUid === undefined || this.data.studyInstanceUid === undefined) { @@ -246,18 +266,23 @@ Template.imageViewerViewport.onRendered(function() { }); Template.imageViewerViewport.onDestroyed(function() { + log.info("imageViewerViewport onDestroyed"); + var element = this.find(".imageViewerViewport"); + + try { + cornerstoneTools.stopClip(element); + } catch(error) { + } + cornerstone.disable(element); }); Template.imageViewerViewport.events({ 'ActivateViewport .imageViewerViewport': function(e) { - if (this.viewportIndex === this.activeViewport.curValue) { - return; - } - Session.set("ActivateViewportIndex", this.viewportIndex); - console.log('ActivateViewport index: ' + this.viewportIndex); - this.activeViewport.curValue = this.viewportIndex; + log.info("imageViewerViewport ActivateViewport"); + + Session.set("activeViewport", this.viewportIndex); enablePrefetchOnElement(this.viewportIndex); displayReferenceLines(this.viewportIndex); }, diff --git a/Packages/viewerbase/components/viewer/imageViewerViewports/imageViewerViewports.html b/Packages/viewerbase/components/viewer/imageViewerViewports/imageViewerViewports.html index aced504b7..3a22cc13d 100644 --- a/Packages/viewerbase/components/viewer/imageViewerViewports/imageViewerViewports.html +++ b/Packages/viewerbase/components/viewer/imageViewerViewports/imageViewerViewports.html @@ -3,7 +3,7 @@ {{ #each viewportArray }}
- {{ >imageViewerViewport viewportIndex=viewportIndex studies=studies activeViewport=activeViewport seriesInstanceUid=seriesInstanceUid studyInstanceUid=studyInstanceUid currentImageIdIndex=currentImageIdIndex viewport=viewport}} + {{ >imageViewerViewport viewportIndex=viewportIndex seriesInstanceUid=seriesInstanceUid studyInstanceUid=studyInstanceUid currentImageIdIndex=currentImageIdIndex viewport=viewport}}
{{ /each }} diff --git a/Packages/viewerbase/components/viewer/imageViewerViewports/imageViewerViewports.js b/Packages/viewerbase/components/viewer/imageViewerViewports/imageViewerViewports.js index 1cf4ec99b..9b52aee3e 100644 --- a/Packages/viewerbase/components/viewer/imageViewerViewports/imageViewerViewports.js +++ b/Packages/viewerbase/components/viewer/imageViewerViewports/imageViewerViewports.js @@ -1,49 +1,44 @@ Template.imageViewerViewports.helpers({ height: function() { - var viewportRows; - if (!Template.parentData(1).viewportRows) { - viewportRows = 1; - } else { - viewportRows = Template.parentData(1).viewportRows.curValue; //Having issues with .get(), not sure why? - } + var viewportRows = this.viewportRows || 1; return 100 / viewportRows; }, width: function() { - var viewportColumns; - if (!Template.parentData(1).viewportColumns) { - viewportColumns = 1; - } else { - viewportColumns = Template.parentData(1).viewportColumns.curValue; //Having issues with .get(), not sure why? - } + var viewportColumns = this.viewportColumns || 1; return 100 / viewportColumns; }, viewportArray: function() { - // This is a really annoying thing to have to do, but Meteor - // doesn't want to let me use another type of helper. - var viewportRows; - if (!this.viewportRows) { - viewportRows = 1; - } else { - viewportRows = this.viewportRows.curValue; //Having issues with .get(), not sure why? + log.info("imageViewerViewports viewportArray"); + + var studies = Session.get('studies'); + + var viewportRows = this.viewportRows || 1; + var viewportColumns = this.viewportColumns || 1; + + var contentId = this.contentId || $("#viewer").parents(".tab-pane.active").attr('id'); + if (this.viewportRows && this.viewportColumns) { + viewportRows = this.viewportRows || 1; + viewportColumns = this.viewportColumns || 1; + } else if (ViewerData[contentId].viewportRows && ViewerData[contentId].viewportColumns) { + viewportRows = ViewerData[contentId].viewportRows; + viewportColumns = ViewerData[contentId].viewportColumns; } - var viewportColumns; - if (!this.viewportColumns) { - viewportColumns = 1; - } else { - viewportColumns = this.viewportColumns.curValue; //Having issues with .get(), not sure why? - } - + // Update viewerData + ViewerData[contentId].viewportRows = viewportRows; + ViewerData[contentId].viewportColumns = viewportColumns; + Session.set("ViewerData", ViewerData); + var viewportData; - if (OHIF && OHIF.viewer && !$.isEmptyObject(OHIF.viewer.imageViewerLoadedSeriesDictionary)) { - viewportData = OHIF.viewer.imageViewerLoadedSeriesDictionary; + if (!$.isEmptyObject(ViewerData[contentId].loadedSeriesData)) { + viewportData = ViewerData[contentId].loadedSeriesData; } var hangingProtocol = getHangingProtocol(); var inputData = { viewportColumns: viewportColumns, viewportRows: viewportRows, - studies: this.studies + studies: studies }; var hangingProtocolViewportData = hangingProtocol(inputData); @@ -52,8 +47,10 @@ Template.imageViewerViewports.helpers({ for (var i=0; i < numViewports; ++i) { var data = { viewportIndex: i, - studies: this.studies, - activeViewport: this.activeViewport + // These two are necessary because otherwise the width and height helpers + // don't get the right data context. Seems to be related to the "each" loop. + viewportColumns: viewportColumns, + viewportRows: viewportRows }; if (viewportData && viewportData[i]) { data.seriesInstanceUid = viewportData[i].seriesInstanceUid; diff --git a/Packages/viewerbase/components/viewer/layoutChooser/layoutChooser.js b/Packages/viewerbase/components/viewer/layoutChooser/layoutChooser.js index 4d0cfac35..84e3ee81d 100644 --- a/Packages/viewerbase/components/viewer/layoutChooser/layoutChooser.js +++ b/Packages/viewerbase/components/viewer/layoutChooser/layoutChooser.js @@ -27,31 +27,18 @@ Template.layoutChooser.events({ }, 'click .layoutChooser table td': function(evt) { $('#imageViewerViewports').remove(); - var container = $(".viewerMain").get(0); var currentCell = $(evt.currentTarget); var rowIndex = currentCell.closest('tr').index(); var columnIndex = currentCell.index(); - var data = {}; - // Add 1 because the indices start from zero - if (this.viewportRows) { - this.viewportRows.curValue = rowIndex + 1; - data.viewportRows = this.viewportRows; - } else { - data.viewportRows = 1; - } - - if (this.viewportColumns) { - this.viewportColumns.curValue = columnIndex + 1; - data.viewportColumns = this.viewportColumns; - } else { - data.viewportColumns = 1; - } - - data.studies = Template.parentData(2).studies; - data.activeViewport = Template.parentData(2).activeViewport; + var data = { + viewportRows: rowIndex + 1, + viewportColumns: columnIndex + 1, + }; + + var container = $(".viewerMain").get(0); UI.renderWithData(Template.imageViewerViewports, data, container); } }); \ No newline at end of file diff --git a/Packages/viewerbase/components/viewer/playClipButton/playClipButton.js b/Packages/viewerbase/components/viewer/playClipButton/playClipButton.js index 75d8e7947..ec35a6d47 100644 --- a/Packages/viewerbase/components/viewer/playClipButton/playClipButton.js +++ b/Packages/viewerbase/components/viewer/playClipButton/playClipButton.js @@ -1,7 +1,7 @@ Template.playClipButton.helpers({ 'isPlaying': function() { Session.get('UpdateCINE'); - var viewportIndex = this.activeViewport.curValue; - return !!OHIF.viewer.isPlaying[viewportIndex]; + var activeViewport = Session.get('activeViewport'); + return !!OHIF.viewer.isPlaying[activeViewport]; } }); \ No newline at end of file diff --git a/Packages/viewerbase/components/viewer/toolbar/toolbar.html b/Packages/viewerbase/components/viewer/toolbar/toolbar.html index 12c4ac125..b4616916a 100644 --- a/Packages/viewerbase/components/viewer/toolbar/toolbar.html +++ b/Packages/viewerbase/components/viewer/toolbar/toolbar.html @@ -6,11 +6,11 @@ {{ /each }} {{ #if includePlayClipButton }} - {{ >playClipButton activeViewport=activeViewport}} + {{ >playClipButton }} {{ /if }} {{ #if includeLayoutButton }} - {{ >layoutButton viewportRows=viewportRows viewportColumns=viewportColumns}} + {{ >layoutButton }} {{ /if }} diff --git a/Packages/viewerbase/components/viewer/toolbar/toolbar.js b/Packages/viewerbase/components/viewer/toolbar/toolbar.js index 77799e35e..b43711c81 100644 --- a/Packages/viewerbase/components/viewer/toolbar/toolbar.js +++ b/Packages/viewerbase/components/viewer/toolbar/toolbar.js @@ -84,8 +84,8 @@ Template.toolbar.events({ if (!OHIF.viewer.functionList.hasOwnProperty(command)) { return; } - var viewportIndex = Template.parentData(0).activeViewport.get(); - var element = $('.imageViewerViewport').get(viewportIndex); + var activeViewport = Session.get('activeViewport'); + var element = $('.imageViewerViewport').get(activeViewport); OHIF.viewer.functionList[command](element); } }); diff --git a/Packages/viewerbase/lib/rerenderViewportWithNewSeries.js b/Packages/viewerbase/lib/rerenderViewportWithNewSeries.js index a8dae13e9..35c6f3f16 100644 --- a/Packages/viewerbase/lib/rerenderViewportWithNewSeries.js +++ b/Packages/viewerbase/lib/rerenderViewportWithNewSeries.js @@ -12,7 +12,7 @@ rerenderViewportWithNewSeries = function(element, data) { data.viewportIndex = viewportIndex; // Update the dictionary of loaded series for the specified viewport - OHIF.viewer.imageViewerLoadedSeriesDictionary[viewportIndex] = { + OHIF.viewer.loadedSeriesData[viewportIndex] = { seriesInstanceUid: data.seriesInstanceUid, studyInstanceUid: data.studyInstanceUid, currentImageIdIndex: 0 diff --git a/Packages/viewerbase/log.js b/Packages/viewerbase/log.js new file mode 100644 index 000000000..e188235f2 --- /dev/null +++ b/Packages/viewerbase/log.js @@ -0,0 +1,3 @@ +// Create package logger using loglevel +// https://atmospherejs.com/spacejamio/loglevel +log = loglevel.createPackageLogger('viewerbase', defaultLevel = 'warn'); \ No newline at end of file diff --git a/Packages/viewerbase/package.js b/Packages/viewerbase/package.js index 15f3418a4..52cdca459 100644 --- a/Packages/viewerbase/package.js +++ b/Packages/viewerbase/package.js @@ -11,9 +11,13 @@ Package.onUse(function (api) { api.use('jquery'); api.use('stylus'); + api.use('practicalmeteor:loglevel'); + // Our custom package api.use('cornerstone'); + api.addFiles('log.js', 'client'); + // ---------- Components ---------- // Basic components diff --git a/Packages/worklist/components/worklist.js b/Packages/worklist/components/worklist.js index 086f7bd72..acee1a9e7 100644 --- a/Packages/worklist/components/worklist.js +++ b/Packages/worklist/components/worklist.js @@ -1,43 +1,59 @@ ViewerData = Session.get('ViewerData') || {}; +StudyMetaData = {}; -Template.worklist.helpers({ - 'tabs': function() { - console.log('Updating tabs'); - return tabs.find(); - } -}); +getStudyMetadata = function(studyInstanceUid, doneCallback) { + log.info('worklistStudy getStudyMetadata'); -Template.worklist.events({ - 'click a[data-toggle="tab"]': function(e) { - var contentId = $(e.currentTarget).data('target').replace("#", ""); - switchToTab(contentId); + if (StudyMetaData.hasOwnProperty(studyInstanceUid) && StudyMetaData[studyInstanceUid]) { + var study = StudyMetaData[studyInstanceUid]; + doneCallback(study); + return; } -}); + + Meteor.call('GetStudyMetadata', studyInstanceUid, function(error, study) { + sortStudy(study); + + StudyMetaData[studyInstanceUid] = study; + + doneCallback(study); + }); +}; switchToTab = function(contentId) { - var data = ViewerData[contentId]; - - console.log("Switching to tab: " + contentId); - - // Set active tab - Session.set("activeContentId", contentId); + log.info("Switching to tab: " + contentId); $('.tabTitle a[data-target="#' + contentId + '"]').tab('show'); $("#viewer").remove(); - var container = $('.tab-content').find("#" + contentId).get(0); - if (!container) { - return; - } - if (contentId === 'worklistTab') { - console.log('Switching to worklist'); document.body.style.overflow = null; document.body.style.height = null; document.body.style.minWidth = null; document.body.style.position = null; - } else { + return; + } + + // Set active tab + Session.set("activeContentId", contentId); + + // Get tab content container + var container = $('.tab-content').find("#" + contentId).get(0); + if (!container) { + return; + } + + var studyInstanceUid = ViewerData[contentId].studyInstanceUid; + getStudyMetadata(studyInstanceUid, function(study) { + var data = { + viewportRows: ViewerData[contentId].viewportRows, + viewportColumns: ViewerData[contentId].viewportColumns, + contentId: contentId, + studies: [study], + }; + + Session.set('studies', data.studies); + UI.renderWithData(Template.viewer, data, container); var imageViewer = $("#viewer"); if (imageViewer) { @@ -47,34 +63,50 @@ switchToTab = function(contentId) { document.body.style.minWidth = 0; document.body.style.position = 'fixed'; // Prevent overscroll on mobile devices } - } + }); +}; + + +openNewTab = function(studyInstanceUid) { + getStudyMetadata(studyInstanceUid, function(study) { + var title = study.seriesList[0].instances[0].patientName; + var contentid = generateUUID(); + + var data = { + title: title, + contentid: contentid, + }; + tabs.insert(data); + + ViewerData[contentid] = { + title: title, + contentid: contentid, + studyInstanceUid: studyInstanceUid + }; + switchToTab(contentid); + }); }; Template.worklist.onRendered(function() { - this.autorun(function() { - var data = Session.get('OpenNewTabEvent'); - - // If we have no new tab data, stop here - // (e.g. if we are rendering the worklist) - if (!data) { - return; - } - - var contentId = data.contentid; - if (ViewerData.hasOwnProperty(contentId)) { - console.warn('Contentid already exists?'); - return; - } - - // Update the viewer data object - ViewerData[contentId] = { - contentId: contentId, - studies: data.studies, - title: data.title - }; - Session.set('ViewerData', ViewerData); - - + // If there is a tab set as active in the Session, + // switch to that now. + var contentId = Session.get("activeContentId"); + if (contentId) { switchToTab(contentId); - }); + } +}); + + +Template.worklist.helpers({ + 'tabs': function() { + log.info('Updating tabs'); + return tabs.find(); + } +}); + +Template.worklist.events({ + 'click a[data-toggle="tab"]': function(e) { + var contentId = $(e.currentTarget).data('target').replace("#", ""); + switchToTab(contentId); + } }); \ No newline at end of file diff --git a/Packages/worklist/components/worklistStudy/worklistStudy.js b/Packages/worklist/components/worklistStudy/worklistStudy.js index 389460128..f02950b9b 100644 --- a/Packages/worklist/components/worklistStudy/worklistStudy.js +++ b/Packages/worklist/components/worklistStudy/worklistStudy.js @@ -1,5 +1,5 @@ Template.worklistStudy.events({ - 'click': function (){ - Router.go('viewer', {_id: this.studyInstanceUid}); + 'click': function () { + openNewTab(this.studyInstanceUid); } }); \ No newline at end of file diff --git a/Packages/worklist/log.js b/Packages/worklist/log.js new file mode 100644 index 000000000..3496daf76 --- /dev/null +++ b/Packages/worklist/log.js @@ -0,0 +1,3 @@ +// Create package logger using loglevel +// https://atmospherejs.com/spacejamio/loglevel +log = loglevel.createPackageLogger('worklist', defaultLevel = 'info'); \ No newline at end of file diff --git a/Packages/worklist/package.js b/Packages/worklist/package.js index 6414183dd..eb3c02907 100644 --- a/Packages/worklist/package.js +++ b/Packages/worklist/package.js @@ -11,6 +11,13 @@ Package.onUse(function (api) { api.use('jquery'); api.use('stylus'); + api.use('practicalmeteor:loglevel'); + + // Our custom package + api.use('dicomweb'); + + api.addFiles('log.js', 'client'); + // Components api.addFiles('components/worklist.html', 'client'); api.addFiles('components/worklist.js', 'client'); @@ -37,6 +44,7 @@ Package.onUse(function (api) { api.addFiles('lib/generateUUID.js', 'client'); api.export('generateUUID', 'client'); + api.export('openNewTab', 'client'); api.export('switchToTab', 'client'); api.export('ViewerData', 'client'); diff --git a/README.md b/README.md index 3dfadfb50..011864000 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,16 @@ # Viewers This repo contains the OHIF DICOM Viewer and Lesion Trackers, and various shared meteor packages + + +### Docker usage +#### Temporary data storage +docker run --rm -p 4242:4242 -p 8042:8042 jodogne/orthanc-plugins + +#### Persistent data storage +1. Create a persistant data volume for Orthanc to use +docker create --name sampledata -v /sampledata jodogne/orthanc-plugins + +2. Run Orthanc from Docker with the data volume attached +docker run --volumes-from sampledata -p 4242:4242 -p 8042:8042 jodogne/orthanc-plugins + +3. Upload your data and it will be persisted \ No newline at end of file From 7a958c35132eab0bfa72aa6f048c56beefe20779 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Fri, 30 Oct 2015 12:27:30 +0100 Subject: [PATCH 08/59] Fixed rebasing error --- .../components/lesionTable/lesionTable.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.js b/Packages/lesiontracker/components/lesionTable/lesionTable.js index 5a1d72bce..15160d1b8 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.js +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.js @@ -3,22 +3,12 @@ TabsTimepoints = new Meteor.Collection(null); Template.lesionTable.helpers({ 'measurement': function() { -<<<<<<< HEAD - var contentId = Session.get("activeContentId"); + var contentId = this.contentId; return Measurements.find({contentId: contentId}); }, 'tabTimepoints': function() { - var contentId = Session.get("activeContentId"); + var contentId = this.contentId; return TabsTimepoints.find({contentId: contentId}); -======= - var contentId = this.contentId; - console.log(Measurements.find({contentId: contentId})); - return Measurements.find({contentId: contentId}); - }, - 'timepointNames': function() { - var contentId = this.contentId; - return Template.instance().timepointNamesDictionary.get(contentId); ->>>>>>> Updates to improve reactivity, session storage, logging }, 'lesionData': function() { var array = []; @@ -37,6 +27,7 @@ Template.lesionTable.onRendered(function() { var totalViewports = viewportColumns * viewportRows; + var timepointsArray = []; for(var i=0; i< totalViewports; i++) { var timepointID = contentId.toString() + i.toString(); var timepointName = "Baseline"; From d07d794dcd86137b8a1dfa5eee03d4248067ef70 Mon Sep 17 00:00:00 2001 From: Rob Lewis Date: Fri, 30 Oct 2015 10:34:05 -0400 Subject: [PATCH 09/59] added .bat files for starting apps in Windows --- LesionTracker/bin/localhostOrthanc.bat | 2 ++ LesionTracker/bin/medicalConnections.bat | 2 ++ LesionTracker/bin/medkenOrthanc.bat | 2 ++ LesionTracker/bin/siimDCM4CHEE.bat | 2 ++ OHIFViewer/bin/localhostOrthanc.bat | 2 ++ OHIFViewer/bin/medicalConnections.bat | 2 ++ OHIFViewer/bin/medkenOrthanc.bat | 2 ++ OHIFViewer/bin/siimDCM4CHEE.bat | 2 ++ 8 files changed, 16 insertions(+) create mode 100644 LesionTracker/bin/localhostOrthanc.bat create mode 100644 LesionTracker/bin/medicalConnections.bat create mode 100644 LesionTracker/bin/medkenOrthanc.bat create mode 100644 LesionTracker/bin/siimDCM4CHEE.bat create mode 100644 OHIFViewer/bin/localhostOrthanc.bat create mode 100644 OHIFViewer/bin/medicalConnections.bat create mode 100644 OHIFViewer/bin/medkenOrthanc.bat create mode 100644 OHIFViewer/bin/siimDCM4CHEE.bat diff --git a/LesionTracker/bin/localhostOrthanc.bat b/LesionTracker/bin/localhostOrthanc.bat new file mode 100644 index 000000000..fb565e0bb --- /dev/null +++ b/LesionTracker/bin/localhostOrthanc.bat @@ -0,0 +1,2 @@ +PACKAGE_DIRS=..\Packages +meteor --settings ../config/localhostOrthanc.json \ No newline at end of file diff --git a/LesionTracker/bin/medicalConnections.bat b/LesionTracker/bin/medicalConnections.bat new file mode 100644 index 000000000..bf0ca7e9f --- /dev/null +++ b/LesionTracker/bin/medicalConnections.bat @@ -0,0 +1,2 @@ +set PACKAGE_DIRS=..\Packages +meteor --settings ../config/medicalConnections.json diff --git a/LesionTracker/bin/medkenOrthanc.bat b/LesionTracker/bin/medkenOrthanc.bat new file mode 100644 index 000000000..5831ac369 --- /dev/null +++ b/LesionTracker/bin/medkenOrthanc.bat @@ -0,0 +1,2 @@ +set PACKAGE_DIRS=..\Packages +meteor --settings ../config/medkenOrthanc.json diff --git a/LesionTracker/bin/siimDCM4CHEE.bat b/LesionTracker/bin/siimDCM4CHEE.bat new file mode 100644 index 000000000..b63adf424 --- /dev/null +++ b/LesionTracker/bin/siimDCM4CHEE.bat @@ -0,0 +1,2 @@ +set PACKAGE_DIRS=..\Packages +meteor --settings ../config/siimDCM4CHEE.json diff --git a/OHIFViewer/bin/localhostOrthanc.bat b/OHIFViewer/bin/localhostOrthanc.bat new file mode 100644 index 000000000..d1d615ff7 --- /dev/null +++ b/OHIFViewer/bin/localhostOrthanc.bat @@ -0,0 +1,2 @@ +set PACKAGE_DIRS=..\Packages +meteor --settings ../config/localhostOrthanc.json diff --git a/OHIFViewer/bin/medicalConnections.bat b/OHIFViewer/bin/medicalConnections.bat new file mode 100644 index 000000000..bf0ca7e9f --- /dev/null +++ b/OHIFViewer/bin/medicalConnections.bat @@ -0,0 +1,2 @@ +set PACKAGE_DIRS=..\Packages +meteor --settings ../config/medicalConnections.json diff --git a/OHIFViewer/bin/medkenOrthanc.bat b/OHIFViewer/bin/medkenOrthanc.bat new file mode 100644 index 000000000..5831ac369 --- /dev/null +++ b/OHIFViewer/bin/medkenOrthanc.bat @@ -0,0 +1,2 @@ +set PACKAGE_DIRS=..\Packages +meteor --settings ../config/medkenOrthanc.json diff --git a/OHIFViewer/bin/siimDCM4CHEE.bat b/OHIFViewer/bin/siimDCM4CHEE.bat new file mode 100644 index 000000000..b63adf424 --- /dev/null +++ b/OHIFViewer/bin/siimDCM4CHEE.bat @@ -0,0 +1,2 @@ +set PACKAGE_DIRS=..\Packages +meteor --settings ../config/siimDCM4CHEE.json From 90e677fc42cbec8281fd8bedf3d762e09f116892 Mon Sep 17 00:00:00 2001 From: Rob Lewis Date: Fri, 30 Oct 2015 12:16:09 -0400 Subject: [PATCH 10/59] Some styling changes to lesion table --- .../components/lesionTable/lesionTable.html | 3 +- .../components/lesionTable/lesionTable.js | 2 +- .../components/lesionTable/lesionTable.styl | 35 ++++++++++++++++++- .../lesionTableRow/lesionTableRow.html | 6 ++-- .../lesionTableTimepointCell.html | 2 +- 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.html b/Packages/lesiontracker/components/lesionTable/lesionTable.html index 68cca4b56..a7f65b70b 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.html +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.html @@ -4,14 +4,15 @@ Lesion # - Target Location + Target {{ #each tabTimepoints }} {{ #each timepoints }} {{ >lesionTableTimepointHeader }} {{ /each }} {{ /each }} + diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.js b/Packages/lesiontracker/components/lesionTable/lesionTable.js index 15160d1b8..69f9d5a9a 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.js +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.js @@ -32,7 +32,7 @@ Template.lesionTable.onRendered(function() { var timepointID = contentId.toString() + i.toString(); var timepointName = "Baseline"; if (i > 0) { - timepointName = "Follow Up "+i; + timepointName = "Current"; //"Follow Up "+i; } var timepointObject = {timepointID: timepointID, timepointName: timepointName}; timepointsArray.push(timepointObject); diff --git a/Packages/lesiontracker/components/lesionTable/lesionTable.styl b/Packages/lesiontracker/components/lesionTable/lesionTable.styl index bc3007437..90a086bb4 100644 --- a/Packages/lesiontracker/components/lesionTable/lesionTable.styl +++ b/Packages/lesiontracker/components/lesionTable/lesionTable.styl @@ -24,7 +24,7 @@ table.lesionTable > tbody > tr > td { padding: 4px; margin: 0; height: 25px; - line-height: 15px; + line-height: 10px; } table.lesionTable tbody tr:hover{ @@ -37,6 +37,39 @@ table.lesionTable tbody tr{ line-height: 14px; } +th#thNumber { + width: 4%; +} + +th#thTarget { + width: 4%; +} + +th#thLocation { + width: 15%; + text-align: left; +} + +th#thSpacer { + width: 50%; +} + +td.location { + text-align: left; +} + +td.lesionNumber { + text-align: center; +} + +td.target { + text-align: center; +} + +td.lesionTableTimepointCell { + width: 4%; + text-align: center; +} .btnRemove{ border: none; diff --git a/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.html b/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.html index 73923ee78..4df9362f3 100644 --- a/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.html +++ b/Packages/lesiontracker/components/lesionTableRow/lesionTableRow.html @@ -1,8 +1,8 @@