diff --git a/LesionTracker/defaultSettings.js b/LesionTracker/defaultSettings.js index f7cb4245a..f891e57cd 100644 --- a/LesionTracker/defaultSettings.js +++ b/LesionTracker/defaultSettings.js @@ -31,7 +31,10 @@ Meteor.startup(function() { }], "defaultServiceType": 'dicomWeb', "public": { - "verifyEmail": false + "verifyEmail": false, + "ui": { + "studyListFunctionsEnabled": false + } } //defaultServiceType: 'dimse' }; diff --git a/OHIFViewer/defaultSettings.js b/OHIFViewer/defaultSettings.js index 6e90d6895..b86fd1991 100644 --- a/OHIFViewer/defaultSettings.js +++ b/OHIFViewer/defaultSettings.js @@ -28,7 +28,12 @@ Meteor.startup(function() { port: 4242, hostAE: 'ORTHANC' }, - defaultServiceType: 'dicomWeb' + defaultServiceType: 'dicomWeb', + public: { + ui: { + studyListFunctionsEnabled: false + } + } //defaultServiceType: 'dimse' }; diff --git a/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html b/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html index 5478f0289..8c262a0f7 100644 --- a/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html +++ b/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.html @@ -24,16 +24,20 @@ title="Remove Timepoint Association"> Remove Association - - - - Anonymize - + + {{#if studyListFunctionsEnabled}} + + + + Anonymize + + + Export + + {{/if}} Delete Send - - Export Download View Series Details diff --git a/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.js b/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.js index ca43814b6..dfb9bd2f6 100644 --- a/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.js +++ b/Packages/lesiontracker/client/components/lesionTrackerWorklistContextMenu/lesionTrackerWorklistContextMenu.js @@ -171,4 +171,12 @@ function viewStudies() { // Switch to the new tab switchToTab(contentid); -} \ No newline at end of file +} + +Template.studyContextMenu.helpers({ + 'studyListFunctionsEnabled': function() { + var studyListFunctionsEnabled = Meteor.settings && Meteor.settings.public && Meteor.settings.public.ui && + Meteor.settings.public.ui.studyListFunctionsEnabled || false; + return studyListFunctionsEnabled; + } +}); \ No newline at end of file diff --git a/Packages/viewerbase/client/components/basic/progressDialog/progressDialog.html b/Packages/viewerbase/client/components/basic/progressDialog/progressDialog.html index c8358ec2c..e3bc409d6 100644 --- a/Packages/viewerbase/client/components/basic/progressDialog/progressDialog.html +++ b/Packages/viewerbase/client/components/basic/progressDialog/progressDialog.html @@ -9,6 +9,7 @@ {{progressStatus}} +
{{progressMessage}}
\ No newline at end of file diff --git a/Packages/viewerbase/client/components/basic/progressDialog/progressDialog.js b/Packages/viewerbase/client/components/basic/progressDialog/progressDialog.js index 602c6f3dc..1dcf92900 100644 --- a/Packages/viewerbase/client/components/basic/progressDialog/progressDialog.js +++ b/Packages/viewerbase/client/components/basic/progressDialog/progressDialog.js @@ -18,6 +18,11 @@ progressDialog = { Session.set("progressDialogSettings", { title: "", numberOfCompleted: 0, numberOfTotal: 1 }); $('#progressDialog').css('display', 'none'); }, + 'setMessage': function(message) { + var progressDialogSettings = Session.get("progressDialogSettings"); + progressDialogSettings.message = message; + Session.set("progressDialogSettings", progressDialogSettings); + } }; Template.progressDialog.helpers({ @@ -40,5 +45,12 @@ Template.progressDialog.helpers({ } return parseInt((numberOfCompleted / numberofTotal) * 100) + "%"; + }, + 'progressMessage': function() { + var progressDialogSettings = Session.get("progressDialogSettings"); + if (progressDialogSettings && progressDialogSettings.message) { + return progressDialogSettings.message; + } + return; } }); diff --git a/Packages/viewerbase/lib/importStudies.js b/Packages/viewerbase/lib/importStudies.js index 57a5a8f91..1d6106fbb 100644 --- a/Packages/viewerbase/lib/importStudies.js +++ b/Packages/viewerbase/lib/importStudies.js @@ -6,7 +6,10 @@ importStudies = function(filesToImport, importCallback) { if (filesToImport.length < 1) { return; } - var fileUploadStatus = { numberOfFilesUploaded: 0, numberOfFilesFailed: 0 }; + var fileUploadStatus = { + numberOfFilesUploaded: 0, + numberOfFilesFailed: 0 + }; var numberOfFilesToUpload = filesToImport.length; var studiesToImport = []; @@ -60,8 +63,11 @@ function updateFileUploadStatus(fileUploadStatus, isSuccess) { fileUploadStatus.numberOfFilesUploaded++; } } - function importStudiesInternal(studiesToImport, importCallback) { + if (!studiesToImport) { + return; + } + var numberOfStudiesToImport = studiesToImport.length; progressDialog.show("Importing Studies...", numberOfStudiesToImport); @@ -69,7 +75,9 @@ function importStudiesInternal(studiesToImport, importCallback) { // Create/Insert a new study import status item Meteor.call("createStudyImportStatus", function(err, studyImportStatusId) { if (err) { - console.log(err); + // Hide dialog + progressDialog.close(); + console.log(err.message); return; } @@ -82,6 +90,12 @@ function importStudiesInternal(studiesToImport, importCallback) { var numberOfStudiesProcessedToImport = studyImportStatus.numberOfStudiesImported + studyImportStatus.numberOfStudiesFailed; + // Show failed message in the dialog + if (studyImportStatus.numberOfStudiesFailed > 0) { + var failMessage = "Failed to import " + studyImportStatus.numberOfStudiesFailed + " of " + numberOfStudiesToImport + " files"; + progressDialog.setMessage(failMessage); + } + progressDialog.update(numberOfStudiesProcessedToImport); if (numberOfStudiesProcessedToImport == numberOfStudiesToImport) { @@ -90,7 +104,10 @@ function importStudiesInternal(studiesToImport, importCallback) { if (studyImportStatus.numberOfStudiesFailed > 0) { //TODO: Some files failed to import, so let user know - console.log("Failed to import " + studyImportStatus.numberOfStudiesFailed + " of " + numberOfStudiesToImport + " files"); + // Update progress dialog message + var failMessage = "Failed to import " + studyImportStatus.numberOfStudiesFailed + " of " + numberOfStudiesToImport + " files"; + progressDialog.setMessage(failMessage); + console.log(failMessage); } // Let the caller know that import operation is completed diff --git a/Packages/viewerbase/server/methods/importStudies.js b/Packages/viewerbase/server/methods/importStudies.js index 202282e0b..ca57e5d5b 100644 --- a/Packages/viewerbase/server/methods/importStudies.js +++ b/Packages/viewerbase/server/methods/importStudies.js @@ -49,6 +49,10 @@ Meteor.methods({ * @param studyImportStatusId Study import status collection id to track import status */ importStudies: function(studiesToImport, studyImportStatusId) { + if (!studiesToImport || !studyImportStatusId) { + return; + } + if (Meteor.settings.dicomWeb && Meteor.settings.defaultServiceType === 'dicomWeb') { //TODO: Support importing studies into dicomWeb console.log('Importing studies into dicomWeb is currently not supported.'); @@ -76,24 +80,41 @@ Meteor.methods({ }); function importStudiesDIMSE(studiesToImport, studyImportStatusId) { + if (!studiesToImport || !studyImportStatusId) { + return; + } // Perform C-Store to import studies and handle the callbacks to update import status DIMSE.storeInstances(studiesToImport, function(err, file) { - // Use fiber to be able to modify meteor collection in callback - fiber(function() { - // Update the import status - if (err) { - StudyImportStatus.update({_id: studyImportStatusId}, {$inc: {'numberOfStudiesFailed': 1}}); - console.log("Failed to import study via DIMSE: ", file, err); - } else { - StudyImportStatus.update({_id: studyImportStatusId}, {$inc: {'numberOfStudiesImported': 1}}); - console.log("Study successfully imported via DIMSE: ", file); - } + try { + // Use fiber to be able to modify meteor collection in callback + fiber(function() { + try { + // Update the import status + if (err) { + StudyImportStatus.update({_id: studyImportStatusId}, {$inc: {'numberOfStudiesFailed': 1}}); + console.log("Failed to import study via DIMSE: ", file, err); + } else { + StudyImportStatus.update({_id: studyImportStatusId}, {$inc: {'numberOfStudiesImported': 1}}); + console.log("Study successfully imported via DIMSE: ", file); + } + + } catch(error) { + + StudyImportStatus.update({_id: studyImportStatusId}, {$inc: {'numberOfStudiesFailed': 1}}); + console.log("Failed to import study via DIMSE: ", file, error); + } finally { + // The import operation of this file is completed, so delete it if still exists + if (fileExists(file)) { + fs.unlink(file); + } + } + + }).run(); + } catch(error) { + StudyImportStatus.update({_id: studyImportStatusId}, {$inc: {'numberOfStudiesFailed': 1}}); + console.log("Failed to import study via DIMSE: ", file, error); + } - // The import operation of this file is completed, so delete it if still exists - if (fileExists(file)) { - fs.unlink(file); - } - }).run(); }); } diff --git a/Packages/worklist/client/components/studyContextMenu/studyContextMenu.html b/Packages/worklist/client/components/studyContextMenu/studyContextMenu.html index 9e344f348..52920f358 100644 --- a/Packages/worklist/client/components/studyContextMenu/studyContextMenu.html +++ b/Packages/worklist/client/components/studyContextMenu/studyContextMenu.html @@ -5,16 +5,18 @@ onselectstart='return false;'>