LT-275: Migrating ohif:lesiontracker to the new import structure

This commit is contained in:
Bruno Alves de Faria 2016-10-17 21:17:31 +01:00 committed by Erik Ziegler
parent a49fca71d2
commit 826bf9bf16
26 changed files with 142 additions and 151 deletions

View File

@ -17,7 +17,7 @@ Template.viewer.onCreated(() => {
const contentId = instance.data.contentId;
OHIF.viewer.functionList = $.extend(OHIF.viewer.functionList, {
toggleLesionTrackerTools: toggleLesionTrackerTools,
toggleLesionTrackerTools: OHIF.lesiontracker.toggleLesionTrackerTools,
clearTools: clearTools,
bidirectional: () => {
// Used for hotkeys
@ -49,7 +49,7 @@ Template.viewer.onCreated(() => {
Session.set('activeViewport', ViewerData[contentId].activeViewport || false);
// Set lesion tool buttons as disabled if pixel spacing is not available for active element
instance.autorun(pixelSpacingAutorunCheck);
instance.autorun(OHIF.lesiontracker.pixelSpacingAutorunCheck);
// Update the ViewerStudies collection with the loaded studies
ViewerStudies.remove({});

View File

@ -46,7 +46,7 @@ Router.route('/viewer/timepoints/:_id', {
var timepointId = this.params._id;
this.render('app', routerOptions);
openNewTabWithTimepoint(timepointId);
OHIF.lesiontracker.openNewTabWithTimepoint(timepointId);
}
});

View File

@ -40,7 +40,7 @@ Router.route('/viewer/timepoints/:_id', {
var timepointId = this.params._id;
this.render('app', routerOptions);
openNewTabWithTimepoint(timepointId);
OHIF.lesiontracker.openNewTabWithTimepoint(timepointId);
}
});

View File

@ -0,0 +1,3 @@
import { OHIF } from 'meteor/ohif:core';
OHIF.lesiontracker = {};

View File

@ -60,7 +60,7 @@ function displayFunction(data) {
return criteria.id;
});
const currentConstraints = getTrialCriteriaConstraints(criteriaTypes, data.imageId);
const currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes, data.imageId);
if (data.shortestDiameter) {
// TODO: Make this check criteria again to see if we should display
@ -81,6 +81,6 @@ export const bidirectional = {
measurementTableOptions: {
displayFunction: displayFunction
},
includeInCaseProgress: true,
includeInCaseProgress: true,
},
}
}

View File

@ -0,0 +1,7 @@
import './nonTarget.js';
import './ellipse.js';
import './length.js';
import './measurementTools.js';
import './dataExchange.js';
import './dataValidation.js';
import './configuration.js';

View File

@ -0,0 +1,2 @@
import './base.js';
import './configuration';

View File

@ -0,0 +1,2 @@
import './LesionLocations.js';
import './LocationResponses.js';

View File

@ -0,0 +1,5 @@
import './bidirectionalTool.js';
import './nonTargetTool.js';
import './scaleOverlayTool.js';
import './deleteLesionKeyboardTool.js';
import './qualitativeTargetTools.js';

View File

@ -0,0 +1,22 @@
import './optionsModal/optionsModal.html';
import './optionsModal/optionsModal.styl';
import './optionsModal/optionsModal.js';
import './optionsModal/recistDescription/recistDescription.html';
import './optionsModal/irRCDescription/irRCDescription.html';
import './measurementLocationDialog/measurementLocationDialog.html';
import './measurementLocationDialog/measurementLocationDialog.js';
import './measurementLocationDialog/measurementLocationDialog.styl';
import './nonTargetLesionDialog/nonTargetLesionDialog.html';
import './nonTargetLesionDialog/nonTargetLesionDialog.styl';
import './nonTargetLesionDialog/nonTargetLesionDialog.js';
import './nonTargetResponseDialog/nonTargetResponseDialog.html';
import './nonTargetResponseDialog/nonTargetResponseDialog.styl';
import './nonTargetResponseDialog/nonTargetResponseDialog.js';
import './measureFlow/measureFlow.html';
import './measureFlow/measureFlow.styl';
import './measureFlow/measureFlow.js';

View File

@ -268,7 +268,7 @@ Template.measurementLocationDialog.events({
const instance = Template.instance();
const measurementApi = instance.data.measurementApi;
convertToNonTarget(measurementApi, measurementData);
OHIF.lesiontracker.convertToNonTarget(measurementApi, measurementData);
closeHandler(dialog);
},

View File

@ -0,0 +1,12 @@
// Client-side collections
import './collections';
// Additional Custom Cornerstone Tools for Lesion Tracker
import './compatibility';
import './tools.js';
// UI Components
import './components';
import './lib';

View File

@ -223,7 +223,7 @@ function validateSingleMeasurement(measurementData) {
}).map(function(criteria) {
return criteria.id;
});
var currentConstraints = getTrialCriteriaConstraints(criteriaTypes, measurementData.imageId);
var currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes, measurementData.imageId);
// If we have no relevant constraints, stop here
if (!currentConstraints) {
@ -275,7 +275,7 @@ function validateGroups() {
});
// Criteria for the specific image are retrieved from the general set of criteria.
var currentConstraints = getTrialCriteriaConstraints(criteriaTypes);
var currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes);
if (!currentConstraints) {
return;
}
@ -320,7 +320,7 @@ function validateAll() {
currentMeasurement._id = measurement._id;
// Criteria for the specific image are retrieved from the general set of criteria.
var currentConstraints = getTrialCriteriaConstraints(criteriaTypes, currentMeasurement.imageId);
var currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes, currentMeasurement.imageId);
if (!currentConstraints) {
return;
}

View File

@ -1,7 +1,8 @@
import { Template } from 'meteor/templating';
import { OHIF } from 'meteor/ohif:core';
// Define the Trial Criteria Structure
TrialCriteriaConstraints = {
OHIF.lesiontracker.TrialCriteriaConstraints = {
RECIST: RECIST,
irRC: irRC
};
@ -331,41 +332,41 @@ function irRC(image) {
* @param imageId A Cornerstone Image ID
* @returns {*} An Object of Trial Criteria that can be used to validate measurements' conformance
*/
getTrialCriteriaConstraints = function(criteriaTypes, imageId) {
OHIF.lesiontracker.getTrialCriteriaConstraints = (criteriaTypes, imageId) => {
// TODO: update this when we allow multiple criteria
var allCriteria = [];
const allCriteria = [];
criteriaTypes.forEach(function(criteriaType) {
if (!TrialCriteriaConstraints[criteriaType]) {
if (!OHIF.lesiontracker.TrialCriteriaConstraints[criteriaType]) {
throw 'No such Trial Criteria defined: ' + criteriaType;
}
// If no imageId was specified, skip customization of the criteria
// and return the requested criteria right away
var criteria;
let criteria;
if (!imageId) {
criteria = TrialCriteriaConstraints[criteriaType]();
criteria = OHIF.lesiontracker.TrialCriteriaConstraints[criteriaType]();
allCriteria.push(criteria);
return;
}
// Otherwise, retrieve the series metaData to identify the modality of the image
var seriesMetaData = cornerstoneTools.metaData.get('series', imageId);
const seriesMetaData = cornerstoneTools.metaData.get('series', imageId);
if (!seriesMetaData) {
return;
}
// TODO: Get the rest of the metaData that has already been loaded by Cornerstone
var image = {};
const image = {};
// If we are looking at an MR or CT image, we should pass the slice thickness
// to the Trial Criteria functions so that they can customize the validation rules
if (seriesMetaData.modality === 'MR' || seriesMetaData.modality === 'CT') {
var instanceMetaData = cornerstoneTools.metaData.get('instance', imageId);
const instanceMetaData = cornerstoneTools.metaData.get('instance', imageId);
image.acquisitionSliceThickness = instanceMetaData.sliceThickness;
}
// Retrieve the study metaData in order to find the timepoint type
var studyMetaData = cornerstoneTools.metaData.get('study', imageId);
const studyMetaData = cornerstoneTools.metaData.get('study', imageId);
if (!studyMetaData) {
return;
}
@ -383,10 +384,10 @@ getTrialCriteriaConstraints = function(criteriaTypes, imageId) {
}
// Retrieve the Timepoint's type (e.g. 'baseline' or 'followup')
var timepointType = timepoint.timepointType;
const timepointType = timepoint.timepointType;
// Obtain the customized trial criteria given the image metaData
criteria = TrialCriteriaConstraints[criteriaType](image);
criteria = OHIF.lesiontracker.TrialCriteriaConstraints[criteriaType](image);
// Return the relevant criteria given the current timepoint type
allCriteria.push(criteria[timepointType]);

View File

@ -1,38 +1,21 @@
import { OHIF } from 'meteor/ohif:core';
clearMeasurementTimepointData = function(measurementId, timepointId) {
var data = Measurements.findOne(measurementId);
// Clear the Measurement data for this timepoint
var imageId = data.timepoints[timepointId].imageId;
var toolType = data.toolType;
removeToolDataWithMeasurementId(imageId, toolType, measurementId);
// Update any viewports that are currently displaying this imageId
var enabledElements = cornerstone.getEnabledElementsByImageId(imageId);
enabledElements.forEach(function(enabledElement) {
cornerstone.updateImage(enabledElement.element);
});
};
function removeToolDataWithMeasurementId(imageId, toolType, measurementId) {
const removeToolDataWithMeasurementId = (imageId, toolType, measurementId) => {
OHIF.log.info('removeToolDataWithMeasurementId');
var toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.toolState;
const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.toolState;
// Find any related toolData
if (!toolState[imageId] || !toolState[imageId][toolType]) {
return;
}
var toolData = toolState[imageId][toolType].data;
const toolData = toolState[imageId][toolType].data;
if (!toolData.length) {
return;
}
// Search toolData for entries linked to the specified Measurement
var toRemove = [];
const toRemove = [];
toolData.forEach(function(measurement, index) {
if (measurement.id === measurementId ||
measurement._id === measurementId) {
@ -50,3 +33,16 @@ function removeToolDataWithMeasurementId(imageId, toolType, measurementId) {
toolData.splice(index, 1);
});
};
OHIF.lesiontracker.clearMeasurementTimepointData = (measurementId, timepointId) => {
const data = Measurements.findOne(measurementId);
// Clear the Measurement data for this timepoint
const imageId = data.timepoints[timepointId].imageId;
const toolType = data.toolType;
removeToolDataWithMeasurementId(imageId, toolType, measurementId);
// Update any viewports that are currently displaying this imageId
const enabledElements = cornerstone.getEnabledElementsByImageId(imageId);
enabledElements.forEach(enabledElement => cornerstone.updateImage(enabledElement.element));
};

View File

@ -67,6 +67,6 @@ convertNonTarget = function(measurementApi, measurementData, newTooltype) {
if (measurement) {
// Remove the timepointData from this Measurement and update it
// in the database, if it is already in the database
clearMeasurementTimepointData(measurement._id, measurementData.timepointId);
OHIF.lesiontracker.clearMeasurementTimepointData(measurement._id, measurementData.timepointId);
}
};

View File

@ -1,17 +1,19 @@
convertToNonTarget = function(measurementApi, measurementData) {
import { OHIF } from 'meteor/ohif:core';
OHIF.lesiontracker.convertToNonTarget = (measurementApi, measurementData) => {
if (measurementData.isTarget === false) {
return;
}
var measurement = Measurements.findOne(measurementData.id);
const measurement = Measurements.findOne(measurementData.id);
var timepoint = Timepoints.findOne({
const timepoint = Timepoints.findOne({
timepointId: measurementData.timepointId
});
// Next, update the measurementData and add it to the new tool type
var toolType = 'nonTarget';
var newMeasurement = {
const toolType = 'nonTarget';
const newMeasurement = {
id: 'notready',
lesionNumber: LesionManager.getNewLesionNumber(measurementData.timepointId, false),
visible: true,
@ -23,7 +25,7 @@ convertToNonTarget = function(measurementApi, measurementData) {
isTarget: false,
toolType: toolType
};
if (timepoint && timepoint.timepointType === 'baseline') {
newMeasurement.response = 'Present';
} else {
@ -79,6 +81,6 @@ convertToNonTarget = function(measurementApi, measurementData) {
if (measurement) {
// Remove the timepointData from this Measurement and update it
// in the database, if it is already in the database
clearMeasurementTimepointData(measurement._id, measurementData.timepointId);
OHIF.lesiontracker.clearMeasurementTimepointData(measurement._id, measurementData.timepointId);
}
};

View File

@ -0,0 +1,12 @@
// StudyList-related functions
import './studylist/openNewTabWithTimepoint.js';
import './studylist/studylistModification.js';
// Library functions
import './TrialCriteriaConstraints.js';
import './MeasurementValidation.js';
import './pixelSpacingAutorunCheck.js';
import './toggleLesionTrackerTools.js';
import './clearMeasurementTimepointData.js';
import './convertToNonTarget.js';
import './convertNonTarget.js';

View File

@ -1,24 +1,26 @@
import { Session } from 'meteor/session';
import { OHIF } from 'meteor/ohif:core';
pixelSpacingAutorunCheck = function() {
OHIF.lesiontracker.pixelSpacingAutorunCheck = () => {
OHIF.log.info('lesionTool button change autorun');
// Get oncology tools
var oncologyTools = $('button#lesion, button#nonTarget');
const $oncologyTools = $('button#lesion, button#nonTarget');
// TODO: Set activeViewport for empty viewport element
var activeViewportIndex = Session.get('activeViewport');
const activeViewportIndex = Session.get('activeViewport');
if (activeViewportIndex === undefined) {
return;
}
var element = $('.imageViewerViewport').get(activeViewportIndex);
const element = $('.imageViewerViewport').get(activeViewportIndex);
if (!element) {
return;
}
let enabledElement;
try {
var enabledElement = cornerstone.getEnabledElement(element);
enabledElement = cornerstone.getEnabledElement(element);
} catch(error) {
return;
}
@ -29,10 +31,10 @@ pixelSpacingAutorunCheck = function() {
!enabledElement.image.rowPixelSpacing ||
!enabledElement.image.columnPixelSpacing) {
// Disable Lesion Buttons
oncologyTools.prop('disabled', true);
$oncologyTools.prop('disabled', true);
} else {
// Enable Lesion Buttons
oncologyTools.prop('disabled', false);
$oncologyTools.prop('disabled', false);
}
};

View File

@ -7,7 +7,7 @@ import { OHIF } from 'meteor/ohif:core';
* @param timepointId The UID of the Timepoint to be opened
* @param title The title to be used for the tab heading
*/
openNewTabWithTimepoint = function(timepointId, title) {
OHIF.lesiontracker.openNewTabWithTimepoint = (timepointId, title) => {
const contentId = 'viewerTab';
const Timepoints = StudyList.timepointApi.timepoints;

View File

@ -28,7 +28,7 @@ function dblClickOnStudy(data) {
if (timepoint) {
// Add the Timepoint name to the Patient name to create the tab title
title += ' ' + timepointApi.name(timepoint);
openNewTabWithTimepoint(timepoint.timepointId, title);
OHIF.lesiontracker.openNewTabWithTimepoint(timepoint.timepointId, title);
} else {
open(data.studyInstanceUid, title);
}

View File

@ -1,20 +1,22 @@
import { OHIF } from 'meteor/ohif:core';
/**
* Show / hide lesion tracker tools
*/
var previousStates;
var previousActiveTool;
let previousStates;
let previousActiveTool;
var toolsShown = true;
let toolsShown = true;
toggleLesionTrackerTools = function() {
OHIF.lesiontracker.toggleLesionTrackerTools = () => {
if (toolsShown === true) {
// Save the current settings for later
previousStates = toolManager.getToolDefaultStates();
previousActiveTool = toolManager.getActiveTool();
// Hide the tools (set them all to disabled)
var toolDefaultStates = {
const toolDefaultStates = {
activate: [ 'deleteLesionKeyboardTool' ],
deactivate: [],
enable: [],

View File

@ -25,89 +25,15 @@ Package.onUse(function(api) {
api.use('ohif:cornerstone');
api.use('ohif:measurements');
api.addFiles('both/configuration/bidirectional.js', [ 'client', 'server' ]);
api.addFiles('both/configuration/nonTarget.js', [ 'client', 'server' ]);
api.addFiles('both/configuration/ellipse.js', [ 'client', 'server' ]);
api.addFiles('both/configuration/length.js', [ 'client', 'server' ]);
api.addFiles('both/configuration/measurementTools.js', [ 'client', 'server' ]);
api.addFiles('both/index.js', [ 'client', 'server' ]);
api.addFiles('both/configuration/dataExchange.js', [ 'client', 'server' ]);
api.addFiles('both/configuration/dataValidation.js', [ 'client', 'server' ]);
api.addFiles('both/configuration/configuration.js', [ 'client', 'server' ]);
api.addFiles('server/index.js', 'server');
api.addFiles('server/methods.js', 'server');
// Client-side collections
api.addFiles('client/collections/LesionLocations.js', 'client');
api.addFiles('client/collections/LocationResponses.js', 'client');
// Additional Custom Cornerstone Tools for Lesion Tracker
api.addFiles([
'client/compatibility/bidirectionalTool.js',
'client/compatibility/nonTargetTool.js',
'client/compatibility/scaleOverlayTool.js',
'client/compatibility/deleteLesionKeyboardTool.js',
'client/compatibility/qualitativeTargetTools.js'
], 'client', {
bare: true
});
api.addFiles('client/tools.js', 'client');
// UI Components
api.addFiles('client/components/optionsModal/optionsModal.html', 'client');
api.addFiles('client/components/optionsModal/optionsModal.styl', 'client');
api.addFiles('client/components/optionsModal/optionsModal.js', 'client');
api.addFiles('client/components/optionsModal/recistDescription/recistDescription.html', 'client');
api.addFiles('client/components/optionsModal/irRCDescription/irRCDescription.html', 'client');
api.addFiles('client/components/measurementLocationDialog/measurementLocationDialog.html', 'client');
api.addFiles('client/components/measurementLocationDialog/measurementLocationDialog.js', 'client');
api.addFiles('client/components/measurementLocationDialog/measurementLocationDialog.styl', 'client');
api.addFiles('client/components/nonTargetLesionDialog/nonTargetLesionDialog.html', 'client');
api.addFiles('client/components/nonTargetLesionDialog/nonTargetLesionDialog.styl', 'client');
api.addFiles('client/components/nonTargetLesionDialog/nonTargetLesionDialog.js', 'client');
api.addFiles('client/components/nonTargetResponseDialog/nonTargetResponseDialog.html', 'client');
api.addFiles('client/components/nonTargetResponseDialog/nonTargetResponseDialog.styl', 'client');
api.addFiles('client/components/nonTargetResponseDialog/nonTargetResponseDialog.js', 'client');
api.addFiles('client/components/measureFlow/measureFlow.html', 'client');
api.addFiles('client/components/measureFlow/measureFlow.styl', 'client');
api.addFiles('client/components/measureFlow/measureFlow.js', 'client');
// StudyList-related functions
api.addFiles('lib/studylist/openNewTabWithTimepoint.js', 'client');
api.addFiles('lib/studylist/studylistModification.js', 'client');
// Library functions
api.addFiles('lib/TrialCriteriaConstraints.js', 'client');
api.addFiles('lib/MeasurementValidation.js', 'client');
api.addFiles('lib/pixelSpacingAutorunCheck.js', 'client');
api.addFiles('lib/toggleLesionTrackerTools.js', 'client');
api.addFiles('lib/clearMeasurementTimepointData.js', 'client');
api.addFiles('lib/convertToNonTarget.js', 'client');
api.addFiles('lib/convertNonTarget.js', 'client');
api.addFiles('client/index.js', 'client');
// Export global functions
api.export('pixelSpacingAutorunCheck', 'client');
api.export('syncImageMeasurementAndToolData', 'client');
api.export('openNewTabWithTimepoint', 'client');
api.export('toggleLesionTrackerTools', 'client');
api.export('clearMeasurementTimepointData', 'client');
api.export('getTrialCriteriaConstraints', 'client');
api.export('convertToNonTarget', 'client');
api.export('convertNonTarget', 'client');
// Export global objects
api.export('MeasurementValidation', 'client');
api.export('TrialCriteriaConstraints', 'client');
// Export client-side collections
api.export('ValidationErrors', 'client');
api.export('LesionLocations', 'client');
@ -116,9 +42,5 @@ Package.onUse(function(api) {
// Export collections spanning both client and server
api.export('AdditionalFindings', [ 'client', 'server' ]);
// Export utility classes
api.export('FormUtils', 'client');
api.export('Configuration', ['client', 'server']);
});

View File

@ -0,0 +1 @@
import './methods.js';

View File

@ -29,7 +29,7 @@ Template.measurementTableHeaderRow.onCreated(() => {
return criteria.id;
});
const currentConstraints = getTrialCriteriaConstraints(criteriaTypes);
const currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes);
if (!currentConstraints) {
return;
}

View File

@ -44,7 +44,7 @@ function doneCallback(measurementData, deleteTool) {
// the specified Timepoint Cell
if (deleteTool === true) {
OHIF.log.info('Confirm clicked!');
clearMeasurementTimepointData(measurementData.id, measurementData.timepointId);
OHIF.lesiontracker.clearMeasurementTimepointData(measurementData.id, measurementData.timepointId);
}
}
@ -80,7 +80,7 @@ Template.measurementTableTimepointCell.events({
if (currentMeasurement.isTarget) {
showConfirmDialog(function() {
clearMeasurementTimepointData(currentMeasurement._id, currentTimepointID);
OHIF.lesiontracker.clearMeasurementTimepointData(currentMeasurement._id, currentTimepointID);
});
} else {
changeNonTargetResponse(measurementData, null, doneCallback);
@ -94,7 +94,7 @@ Template.measurementTableTimepointCell.events({
const currentTimepointID = this.timepointId;
showConfirmDialog(function() {
clearMeasurementTimepointData(currentMeasurement._id, currentTimepointID);
OHIF.lesiontracker.clearMeasurementTimepointData(currentMeasurement._id, currentTimepointID);
});
}
}