- Remove measurementType property and use toolType property in the parts that uses measurementType - Add toolType in syncMeasurementAndToolData method - Hide Convert to Non-Target option in lesionLocationDialog for CRUNEX tools
307 lines
10 KiB
JavaScript
307 lines
10 KiB
JavaScript
function closeHandler(dialog) {
|
|
// Hide the lesion dialog
|
|
$(dialog).css('display', 'none');
|
|
|
|
// Remove the backdrop
|
|
$('.removableBackdrop').remove();
|
|
|
|
// Restore the focus to the active viewport
|
|
setFocusToActiveViewport();
|
|
}
|
|
|
|
// This event sets lesion number for new lesion
|
|
function setLesionNumberCallback(measurementData, eventData, doneCallback) {
|
|
// Get the current element's timepointId from the study date metadata
|
|
var element = eventData.element;
|
|
var enabledElement = cornerstone.getEnabledElement(element);
|
|
var imageId = enabledElement.image.imageId;
|
|
|
|
var study = cornerstoneTools.metaData.get('study', imageId);
|
|
|
|
// Find the relevant timepoint given the current study
|
|
var timepoint = Timepoints.findOne({
|
|
studyInstanceUids: {
|
|
$in: [study.studyInstanceUid]
|
|
}
|
|
});
|
|
|
|
if (!timepoint) {
|
|
return;
|
|
}
|
|
|
|
measurementData.timepointId = timepoint.timepointId;
|
|
|
|
// Get a lesion number for this lesion, depending on whether or not the same lesion previously
|
|
// exists at a different timepoint
|
|
var lesionNumber = LesionManager.getNewLesionNumber(measurementData.timepointId, isTarget = true);
|
|
measurementData.lesionNumber = lesionNumber;
|
|
|
|
// Set lesion number
|
|
doneCallback(lesionNumber);
|
|
}
|
|
|
|
// This event determines whether or not to show the lesion dialog
|
|
// If there already exists a lesion with this specific lesion number,
|
|
// related to the chosen location.
|
|
function getLesionLocationCallback(measurementData, eventData) {
|
|
Template.lesionLocationDialog.measurementData = measurementData;
|
|
|
|
// Reset the doneCallback saved in the template so we don't call the change event's done callback
|
|
Template.lesionLocationDialog.doneCallback = undefined;
|
|
|
|
// Get the lesion location dialog
|
|
var dialog = $('#lesionLocationDialog');
|
|
Template.lesionLocationDialog.dialog = dialog;
|
|
|
|
// Show the backdrop
|
|
UI.render(Template.removableBackdrop, document.body);
|
|
|
|
// Make sure the context menu is closed when the user clicks away
|
|
$('.removableBackdrop').one('mousedown touchstart', function() {
|
|
closeHandler(dialog);
|
|
});
|
|
|
|
// Select the first option for now
|
|
var selector = dialog.find('select.selectLesionLocation');
|
|
selector.find('option:first').prop('selected', true);
|
|
|
|
// Find out if this lesion number is already added in the lesion manager for another timepoint
|
|
// If it is, stop here because we don't need the dialog.
|
|
var locationUID = LesionManager.lesionNumberExists(measurementData);
|
|
if (locationUID) {
|
|
// Add an ID value to the tool data to link it to the Measurements collection
|
|
measurementData.id = 'notready';
|
|
|
|
measurementData.locationUID = locationUID;
|
|
LesionManager.updateLesionData(measurementData);
|
|
closeHandler();
|
|
return;
|
|
}
|
|
// If it isn't, continue to open the dialog and have the user choose a lesion location
|
|
|
|
// Show the lesion location dialog above
|
|
var dialogProperty = {
|
|
top: eventData.currentPoints.page.y - dialog.outerHeight() - 40,
|
|
left: eventData.currentPoints.page.x - dialog.outerWidth() / 2,
|
|
display: 'block'
|
|
};
|
|
|
|
var pageHeight = $(window).height();
|
|
dialogProperty.top = Math.max(dialogProperty.top, 0);
|
|
dialogProperty.top = Math.min(dialogProperty.top, pageHeight - dialog.outerHeight());
|
|
|
|
var pageWidth = $(window).width();
|
|
dialogProperty.left = Math.max(dialogProperty.left, 0);
|
|
dialogProperty.left = Math.min(dialogProperty.left, pageWidth - dialog.outerWidth());
|
|
|
|
// Device is touch device or not
|
|
// If device is touch device, set position center of screen vertically and horizontally
|
|
if (isTouchDevice()) {
|
|
// add dialogMobile class to provide a black,transparent background
|
|
dialog.addClass('dialogMobile');
|
|
dialogProperty.top = 0;
|
|
dialogProperty.left = 0;
|
|
dialogProperty.right = 0;
|
|
dialogProperty.bottom = 0;
|
|
}
|
|
|
|
dialog.css(dialogProperty);
|
|
dialog.focus();
|
|
}
|
|
|
|
changeLesionLocationCallback = function(measurementData, eventData, doneCallback) {
|
|
Template.lesionLocationDialog.measurementData = measurementData;
|
|
Template.lesionLocationDialog.doneCallback = doneCallback;
|
|
|
|
// Get the lesion location dialog
|
|
var dialog = $('#lesionLocationRelabelDialog');
|
|
|
|
// Show/Hide Convert To NonTarget option in lesionLocationRelabelDialog
|
|
if (measurementData.toolType === 'bidirectional') {
|
|
dialog.find("#convertToNonTarget").css("visibility", "visible");
|
|
} else {
|
|
dialog.find("#convertToNonTarget").css("visibility", "hidden");
|
|
}
|
|
|
|
Template.lesionLocationDialog.dialog = dialog;
|
|
|
|
// Show the backdrop
|
|
UI.render(Template.removableBackdrop, document.body);
|
|
|
|
// Make sure the context menu is closed when the user clicks away
|
|
$('.removableBackdrop').one('mousedown touchstart', function() {
|
|
closeHandler(dialog);
|
|
});
|
|
|
|
// Show the lesion location dialog above
|
|
var dialogProperty = {
|
|
display: 'block'
|
|
};
|
|
|
|
// Device is touch device or not
|
|
// If device is touch device, set position center of screen vertically and horizontally
|
|
if (!eventData || isTouchDevice()) {
|
|
// add dialogMobile class to provide a black,transparent background
|
|
dialog.addClass('dialogMobile');
|
|
dialogProperty.top = 0;
|
|
dialogProperty.left = 0;
|
|
dialogProperty.right = 0;
|
|
dialogProperty.bottom = 0;
|
|
} else {
|
|
dialogProperty.top = eventData.currentPoints.page.y - dialog.outerHeight() - 40;
|
|
dialogProperty.left = eventData.currentPoints.page.x - dialog.outerWidth() / 2;
|
|
}
|
|
|
|
dialog.css(dialogProperty);
|
|
dialog.focus();
|
|
|
|
var measurement = Measurements.findOne(measurementData.id);
|
|
if (!measurement) {
|
|
return;
|
|
}
|
|
|
|
LesionLocations.update({},
|
|
{
|
|
$set: {
|
|
selected: false
|
|
}
|
|
},
|
|
{
|
|
multi: true
|
|
});
|
|
|
|
var currentLocation = LesionLocations.findOne({
|
|
id: measurement.locationId
|
|
});
|
|
|
|
if (!currentLocation) {
|
|
return;
|
|
}
|
|
|
|
LesionLocations.update(currentLocation._id, {
|
|
$set: {
|
|
selected: true
|
|
}
|
|
});
|
|
};
|
|
|
|
var config = {
|
|
setLesionNumberCallback: setLesionNumberCallback,
|
|
getLesionLocationCallback: getLesionLocationCallback,
|
|
changeLesionLocationCallback: changeLesionLocationCallback
|
|
};
|
|
|
|
cornerstoneTools.bidirectional.setConfiguration(config);
|
|
|
|
// Set CR-Tool, UN-Tool, EX-Tool configurations
|
|
// Config for CR Tool
|
|
cornerstoneTools.crTool.setConfiguration(config);
|
|
|
|
// Config for EX Tool
|
|
cornerstoneTools.exTool.setConfiguration(config);
|
|
|
|
// Config for UN Tool
|
|
cornerstoneTools.unTool.setConfiguration(config);
|
|
|
|
Template.lesionLocationDialog.events({
|
|
'change .selectLesionLocation': function(e) {
|
|
var measurementData = Template.lesionLocationDialog.measurementData;
|
|
var doneCallback = Template.lesionLocationDialog.doneCallback;
|
|
var dialog = Template.lesionLocationDialog.dialog;
|
|
|
|
// Get the current value of the selector
|
|
var selectedOptionId = e.currentTarget.value;
|
|
|
|
// If the selected option is still the default (-1)
|
|
// then stop here
|
|
if (selectedOptionId < 0) {
|
|
return;
|
|
}
|
|
|
|
// Get selected location data
|
|
var locationObj = LesionLocations.findOne({
|
|
_id: selectedOptionId
|
|
});
|
|
|
|
// Add an ID value to the tool data to link it to the Measurements collection
|
|
if (!measurementData.id) {
|
|
measurementData.id = 'notready';
|
|
|
|
// Link locationUID with active lesion measurementData
|
|
measurementData.location = locationObj.location;
|
|
measurementData.locationId = locationObj.id;
|
|
|
|
/// Set the isTarget value to true, since this is the target-lesion dialog callback
|
|
measurementData.isTarget = true;
|
|
|
|
// Set the isNodal value based on the Location's properties
|
|
measurementData.isNodal = locationObj.isNodal;
|
|
|
|
// Adds lesion data to timepoints array
|
|
LesionManager.updateLesionData(measurementData);
|
|
} else {
|
|
Measurements.update(measurementData.id, {
|
|
$set: {
|
|
location: locationObj.location,
|
|
locationId: locationObj.id,
|
|
isNodal: locationObj.isNodal
|
|
}
|
|
});
|
|
}
|
|
|
|
// Close the dialog
|
|
closeHandler(dialog);
|
|
|
|
if (doneCallback && typeof doneCallback === 'function') {
|
|
doneCallback(measurementData);
|
|
}
|
|
},
|
|
'click #removeLesion': function() {
|
|
var measurementData = Template.lesionLocationDialog.measurementData;
|
|
var doneCallback = Template.lesionLocationDialog.doneCallback;
|
|
var dialog = Template.lesionLocationDialog.dialog;
|
|
|
|
var options = {
|
|
keyPressAllowed: false,
|
|
title: 'Remove measurement?',
|
|
text: 'Are you sure you would like to remove the entire measurement?'
|
|
};
|
|
|
|
showConfirmDialog(function() {
|
|
if (doneCallback && typeof doneCallback === 'function') {
|
|
var deleteTool = true;
|
|
doneCallback(measurementData, deleteTool);
|
|
}
|
|
}, options);
|
|
|
|
closeHandler(dialog);
|
|
},
|
|
'click #convertToNonTarget': function() {
|
|
var measurementData = Template.lesionLocationDialog.measurementData;
|
|
var dialog = Template.lesionLocationDialog.dialog;
|
|
|
|
convertToNonTarget(measurementData);
|
|
|
|
closeHandler(dialog);
|
|
},
|
|
'click #btnCloseLesionPopup': function() {
|
|
var dialog = Template.lesionLocationDialog.dialog;
|
|
closeHandler(dialog);
|
|
},
|
|
'keydown #lesionLocationDialog, keydown #lesionLocationRelabelDialog': function(e) {
|
|
var dialog = Template.lesionLocationDialog.dialog;
|
|
|
|
// If Esc or Enter are pressed, close the dialog
|
|
if (e.which === keys.ESC || e.which === keys.ENTER) {
|
|
closeHandler(dialog);
|
|
return false;
|
|
}
|
|
}
|
|
});
|
|
|
|
Template.lesionLocationDialog.helpers({
|
|
lesionLocations: function() {
|
|
return LesionLocations.find();
|
|
}
|
|
});
|