From 01d22aa3c5abe6db26f821fe62676f2c9d6abc12 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Sun, 13 Nov 2016 20:02:20 +0100 Subject: [PATCH] LT-327: Added functionality to disassociate timepoints from studies --- .../both/configuration/configuration.js | 5 +- .../both/configuration/dataExchange.js | 16 +++++ Packages/ohif-lesiontracker/server/methods.js | 44 +++++++++++++- .../both/configuration/measurements.js | 2 +- .../both/configuration/timepoints.js | 14 ++++- .../confirmRemoveTimepointAssociation.html | 4 +- .../longitudinalStudyListContextMenu.html | 23 +++++--- .../longitudinalStudyListContextMenu.js | 59 ++++--------------- .../longitudinalViewportOverlay.js | 2 +- 9 files changed, 106 insertions(+), 63 deletions(-) diff --git a/Packages/ohif-lesiontracker/both/configuration/configuration.js b/Packages/ohif-lesiontracker/both/configuration/configuration.js index f7189d0a7..afda123d0 100644 --- a/Packages/ohif-lesiontracker/both/configuration/configuration.js +++ b/Packages/ohif-lesiontracker/both/configuration/configuration.js @@ -1,7 +1,7 @@ import { OHIF } from 'meteor/ohif:core'; import { measurementTools } from './measurementTools'; -import { retrieveMeasurements, storeMeasurements, retrieveTimepoints, storeTimepoints, removeTimepoint, updateTimepoint } from './dataExchange'; +import { retrieveMeasurements, storeMeasurements, retrieveTimepoints, storeTimepoints, removeTimepoint, updateTimepoint, disassociateStudy } from './dataExchange'; import { validateMeasurements } from './dataValidation'; console.log('OHIF-LesionTracker: Defining Configuration for Measurements'); @@ -28,6 +28,7 @@ OHIF.measurements.TimepointApi.setConfiguration({ retrieve: retrieveTimepoints, store: storeTimepoints, remove: removeTimepoint, - update: updateTimepoint + update: updateTimepoint, + disassociate: disassociateStudy } }); diff --git a/Packages/ohif-lesiontracker/both/configuration/dataExchange.js b/Packages/ohif-lesiontracker/both/configuration/dataExchange.js index 51e655f08..97c649fbd 100644 --- a/Packages/ohif-lesiontracker/both/configuration/dataExchange.js +++ b/Packages/ohif-lesiontracker/both/configuration/dataExchange.js @@ -95,3 +95,19 @@ export const removeTimepoint = timepointData => { }); }); }; + +export const disassociateStudy = (timepointIds, studyInstanceUid) => { + console.log('disassociateStudy'); + console.log(timepointIds); + console.log(studyInstanceUid); + + return new Promise((resolve, reject) => { + Meteor.call('disassociateStudy', timepointIds, studyInstanceUid, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response); + } + }); + }); +}; diff --git a/Packages/ohif-lesiontracker/server/methods.js b/Packages/ohif-lesiontracker/server/methods.js index 6005b7a85..4b5286c91 100644 --- a/Packages/ohif-lesiontracker/server/methods.js +++ b/Packages/ohif-lesiontracker/server/methods.js @@ -37,8 +37,50 @@ Meteor.methods({ }); }, + disassociateStudy(timepointIds, studyInstanceUid) { + OHIF.log.info('Disassociating Study from Timepoints'); + timepointIds.forEach(timepointId => { + const timepoint = Timepoints.findOne({timepointId}); + if (!timepoint) { + return; + } + + // Find the index of the current studyInstanceUid in the array + // of reference studyInstanceUids + const index = timepoint.studyInstanceUids.indexOf(studyInstanceUid); + if (index < 0) { + return; + } + + // Remove the specified studyInstanceUid from the array of associated studyInstanceUids + timepoint.studyInstanceUids.splice(index, 1); + + let updated = []; + let removed = []; + if (timepoint.studyInstanceUids.length) { + Timepoints.update(timepoint._id, { + $set: { + studyInstanceUids: timepoint.studyInstanceUids + } + }); + } else { + Timepoints.remove(timepoint._id); + } + + // Remove all Measurement Data for this timepoint and study + measurementTools.forEach(tool => { + const filter = { + studyInstanceUid: studyInstanceUid, + timepointId: timepointId + }; + + MeasurementCollections[tool.id].remove(filter) + }); + }); + }, + removeTimepoint(timepointData) { - OHIF.log.info('Removing Timepoint off the Server'); + OHIF.log.info('Removing Timepoint from the Server'); OHIF.log.info(JSON.stringify(timepointData, null, 2)); Timepoints.remove(timepointData); }, diff --git a/Packages/ohif-measurements/both/configuration/measurements.js b/Packages/ohif-measurements/both/configuration/measurements.js index 4a94c1373..f979e3d43 100644 --- a/Packages/ohif-measurements/both/configuration/measurements.js +++ b/Packages/ohif-measurements/both/configuration/measurements.js @@ -119,7 +119,7 @@ class MeasurementApi { } }); - // Update the measurement numbers for the remaning measurements + // Update the measurement numbers for the remaining measurements const updateFilter = _.clone(filter); updateFilter.measurementNumber = { $gt: measurementNumber diff --git a/Packages/ohif-measurements/both/configuration/timepoints.js b/Packages/ohif-measurements/both/configuration/timepoints.js index dd325c873..a12dda0c1 100644 --- a/Packages/ohif-measurements/both/configuration/timepoints.js +++ b/Packages/ohif-measurements/both/configuration/timepoints.js @@ -20,13 +20,13 @@ class TimepointApi { if (currentTimepointId) { this.currentTimepointId = currentTimepointId; } - } - retrieveTimepoints(filter) { this.timepoints = new Mongo.Collection(null); this.timepoints.attachSchema(TimepointSchema); this.timepoints._debugName = 'Timepoints'; + } + retrieveTimepoints(filter) { const retrievalFn = configuration.dataExchange.retrieve; if (!_.isFunction(retrievalFn)) { return; @@ -59,6 +59,16 @@ class TimepointApi { storeFn(timepointData).then(() => OHIF.log.info('Timepoint storage completed')); } + disassociateStudy(timepointIds, studyInstanceUid) { + const disassociateFn = configuration.dataExchange.disassociate; + disassociateFn(timepointIds, studyInstanceUid).then(() => { + OHIF.log.info('Disassociation completed') + + this.timepoints.remove({}); + this.retrieveTimepoints(); + }); + } + removeTimepoint(timepointId) { const removeFn = configuration.dataExchange.remove; if (!_.isFunction(removeFn)) { diff --git a/Packages/ohif-measurements/client/components/association/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.html b/Packages/ohif-measurements/client/components/association/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.html index 15bcec29c..2aa06b4e7 100644 --- a/Packages/ohif-measurements/client/components/association/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.html +++ b/Packages/ohif-measurements/client/components/association/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.html @@ -10,10 +10,12 @@ Measurements related to this Study and Timepoint will be erased. Do you really want to delete this association? diff --git a/Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.html b/Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.html index b02e1d3ef..318ae510a 100644 --- a/Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.html +++ b/Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.html @@ -2,15 +2,22 @@ {{#dropdownForm}}
  • View
  • - -
  • Associate
  • -
  • Remove Association
  • +
  • + Associate +
  • +
  • + Remove Association + +
  • -
  • View Series Details
  • +
  • + View Series Details +
  • Anonymize
  • Send
  • diff --git a/Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.js b/Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.js index 497a6c5f1..6e6b95a69 100644 --- a/Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.js +++ b/Packages/ohif-measurements/client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.js @@ -22,54 +22,19 @@ function removeTimepointAssociations() { // Get a Cursor pointing to the selected Studies from the StudyList const selectedStudies = OHIF.studylist.getSelectedStudies(); + // Find the Timepoint that was previously referenced + const timepointApi = StudyList.timepointApi; + if (!timepointApi) { + OHIF.log.error('Remove Study/Timepoint Association: No Timepoint API found.') + return; + } + // Loop through the Cursor of Selected Studies - selectedStudies.forEach(function(selectedStudy) { - // Find the Timepoint that was previously referenced - const timepointApi = StudyList.timepointApi; - if (!timepointApi) { - return; - } - - let timepoint = timepointApi.study(selectedStudy.studyInstanceUid)[0]; - if (!timepoint) { - return; - } - - // Find the index of the current studyInstanceUid in the array - // of reference studyInstanceUids - const index = timepoint.studyInstanceUids.indexOf(selectedStudy.studyInstanceUid); - if (index < 0) { - return; - } - - // Remove the specified studyInstanceUid from the array of associated studyInstanceUids - timepoint.studyInstanceUids.splice(index, 1); - - // Check if there are still one or more Studies associated with this Timepoint - if (timepoint.studyInstanceUids.length) { - // Update the Timepoints Collection with this modified array for the - // studyInstanceUids attribute - timepointApi.updateTimepoint(timepoint.timepointId, { - $set: { - studyInstanceUids: timepoint.studyInstanceUids - } - }); - - // Log - const hipaaEvent = { - eventType: 'modify', - userId: Meteor.userId(), - userName: Meteor.user().profile.fullName, - collectionName: 'Timepoints', - recordId: selectedStudy.timepointId, - patientId: selectedStudy.patientId, - patientName: selectedStudy.patientName - }; - HipaaLogger.logEvent(hipaaEvent); - } else { - // If no more Studies are associated with this Timepoint, we should remove it - timepointApi.removeTimepoint(timepoint.timepointId); - } + selectedStudies.forEach(study => { + const studyInstanceUid = study.studyInstanceUid; + const timepoints = timepointApi.study(studyInstanceUid); + const timepointIds = timepoints.map(t => t.timepointId); + timepointApi.disassociateStudy(timepointIds, studyInstanceUid); }); } diff --git a/Packages/ohif-measurements/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js b/Packages/ohif-measurements/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js index 43d264c88..3ae7a9a4f 100644 --- a/Packages/ohif-measurements/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js +++ b/Packages/ohif-measurements/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js @@ -12,7 +12,7 @@ Template[defaultTemplate].helpers({ const studyInstanceUid = instance.data.studyInstanceUid; // TODO: Find a better way to obtain the timepointApi from the viewer.js template - const timepointApi = OHIF.viewer.timepointApi; + const timepointApi = StudyList.timepointApi; if (!timepointApi) { return; }