Removing progressDialog from DOM
This commit is contained in:
parent
cb2d0d18aa
commit
c7f31ddb0a
@ -28,5 +28,4 @@
|
|||||||
<div class="tab-pane" id="viewerTab">
|
<div class="tab-pane" id="viewerTab">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{>progressDialog}}
|
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -1,82 +1,87 @@
|
|||||||
import { Template } from 'meteor/templating';
|
import { Template } from 'meteor/templating';
|
||||||
import { Session } from 'meteor/session';
|
import { ReactiveVar } from 'meteor/reactive-var';
|
||||||
import { _ } from 'meteor/underscore';
|
import { _ } from 'meteor/underscore';
|
||||||
|
|
||||||
Template.dialogProgress.onCreated(() => {
|
Template.dialogProgress.onCreated(() => {
|
||||||
const instance = Template.instance();
|
const instance = Template.instance();
|
||||||
|
|
||||||
Session.set('progressDialogState', {
|
instance.state = new ReactiveVar({
|
||||||
processed: 0,
|
processed: 0,
|
||||||
total: instance.data.total,
|
total: instance.data.total,
|
||||||
message: instance.data.message
|
message: instance.data.message
|
||||||
});
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
Template.dialogProgress.onRendered(() => {
|
Template.dialogProgress.onRendered(() => {
|
||||||
const instance = Template.instance();
|
const instance = Template.instance();
|
||||||
const task = instance.data.task;
|
const task = instance.data.task;
|
||||||
const state = Session.get('progressDialogState');
|
|
||||||
|
|
||||||
const progressDialog = {
|
const progressDialog = {
|
||||||
promise: instance.data.promise,
|
promise: instance.data.promise,
|
||||||
|
|
||||||
done: value => {
|
done: value => {
|
||||||
// Hide the modal, removing the backdrop
|
// Hide the modal, removing the backdrop
|
||||||
instance.$('.modal').on('hidden.bs.modal', event => {
|
instance.$('.modal').on('hidden.bs.modal', event => {
|
||||||
instance.data.promiseResolve(value);
|
instance.data.promiseResolve(value);
|
||||||
}).modal('hide');
|
}).modal('hide');
|
||||||
},
|
},
|
||||||
|
|
||||||
cancel: () => {
|
cancel: () => {
|
||||||
// Hide the modal, removing the backdrop
|
// Hide the modal, removing the backdrop
|
||||||
instance.$('.modal').on('hidden.bs.modal', event => {
|
instance.$('.modal').on('hidden.bs.modal', event => {
|
||||||
instance.data.promiseReject();
|
instance.data.promiseReject();
|
||||||
}).modal('hide');
|
}).modal('hide');
|
||||||
},
|
},
|
||||||
|
|
||||||
update: _.throttle(processed => {
|
update: _.throttle(processed => {
|
||||||
const state = Session.get('progressDialogState');
|
const state = instance.state.get();
|
||||||
state.processed = Math.max(0, processed);
|
state.processed = Math.max(0, processed);
|
||||||
|
|
||||||
Session.set('progressDialogState', state);
|
instance.state.set(state);
|
||||||
}, 100),
|
}, 100),
|
||||||
|
|
||||||
setTotal: _.throttle(total => {
|
setTotal: _.throttle(total => {
|
||||||
const state = Session.get('progressDialogState');
|
const state = instance.state.get();
|
||||||
state.total = total;
|
state.total = total;
|
||||||
|
|
||||||
Session.set('progressDialogState', state);
|
instance.state.set(state);
|
||||||
}, 100),
|
}, 100),
|
||||||
|
|
||||||
setMessage: _.throttle(message => {
|
setMessage: _.throttle(message => {
|
||||||
const state = Session.get('progressDialogState');
|
const state = instance.state.get();
|
||||||
state.message = message;
|
state.message = message;
|
||||||
|
|
||||||
Session.set('progressDialogState', state);
|
instance.state.set(state);
|
||||||
}, 100)
|
}, 100)
|
||||||
}
|
};
|
||||||
|
|
||||||
task.run(progressDialog);
|
task.run(progressDialog);
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.dialogProgress.helpers({
|
Template.dialogProgress.helpers({
|
||||||
progress() {
|
progress() {
|
||||||
const state = Session.get('progressDialogState');
|
const instance = Template.instance();
|
||||||
|
const state = instance.state.get();
|
||||||
|
|
||||||
if (!state || !state.total) {
|
if (!state || !state.total) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.min(1, state.processed / state.total) * 100;
|
||||||
|
},
|
||||||
|
|
||||||
|
message() {
|
||||||
|
const instance = Template.instance();
|
||||||
|
const state = instance.state.get();
|
||||||
|
|
||||||
|
if (!state) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof state.message === 'function') {
|
||||||
|
return state.message(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
return state.message;
|
||||||
}
|
}
|
||||||
|
});
|
||||||
return Math.min(1, state.processed / state.total) * 100;
|
|
||||||
},
|
|
||||||
|
|
||||||
message() {
|
|
||||||
const state = Session.get('progressDialogState');
|
|
||||||
|
|
||||||
if (!state) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return state.message;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import './progressDialog';
|
|
||||||
import './seriesDetailsModal';
|
import './seriesDetailsModal';
|
||||||
import './serverInformation';
|
import './serverInformation';
|
||||||
import './studyContextMenu';
|
import './studyContextMenu';
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
import './progressDialog.html';
|
|
||||||
import './progressDialog.styl';
|
|
||||||
import './progressDialog.js';
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
<template name="progressDialog">
|
|
||||||
<div id="progressDialog" tabindex="0">
|
|
||||||
<div class="dialogHeader">
|
|
||||||
<h5>{{progressDialogTitle}}</h5>
|
|
||||||
</div>
|
|
||||||
<div class="dialogContent">
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar progress-bar-striped active"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: {{progressStatus}}%"
|
|
||||||
>{{formatNumberPrecision progressStatus 0}}%</div>
|
|
||||||
</div>
|
|
||||||
<div id="message">
|
|
||||||
{{{progressMessage}}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@ -1,78 +0,0 @@
|
|||||||
import { Template } from 'meteor/templating';
|
|
||||||
import { Session } from 'meteor/session';
|
|
||||||
import { _ } from 'meteor/underscore';
|
|
||||||
import { OHIF } from 'meteor/ohif:core';
|
|
||||||
|
|
||||||
const updateProgress = numberOfCompleted => {
|
|
||||||
const progressDialogSettings = Session.get('progressDialogSettings');
|
|
||||||
progressDialogSettings.numberOfCompleted = numberOfCompleted;
|
|
||||||
|
|
||||||
Session.set('progressDialogSettings', progressDialogSettings);
|
|
||||||
|
|
||||||
if (progressDialogSettings.numberOfCompleted === progressDialogSettings.numberOfTotal) {
|
|
||||||
OHIF.studylist.progressDialog.close();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const setProgressMessage = message => {
|
|
||||||
let progressDialogSettings = Session.get('progressDialogSettings');
|
|
||||||
progressDialogSettings.message = message;
|
|
||||||
Session.set('progressDialogSettings', progressDialogSettings);
|
|
||||||
};
|
|
||||||
|
|
||||||
OHIF.studylist.progressDialog = {
|
|
||||||
update: _.debounce(updateProgress, 100),
|
|
||||||
setMessage: _.debounce(setProgressMessage, 100),
|
|
||||||
show: function(title, numberOfTotal) {
|
|
||||||
Session.set('progressDialogSettings', {
|
|
||||||
title: title,
|
|
||||||
numberOfCompleted: 0,
|
|
||||||
numberOfTotal: numberOfTotal
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#progressDialog').css('display', 'block');
|
|
||||||
},
|
|
||||||
close: function() {
|
|
||||||
Session.set('progressDialogSettings', {
|
|
||||||
title: '',
|
|
||||||
numberOfCompleted: 0,
|
|
||||||
numberOfTotal: 1
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#progressDialog').css('display', 'none');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Template.progressDialog.helpers({
|
|
||||||
progressDialogTitle() {
|
|
||||||
const settings = Session.get('progressDialogSettings');
|
|
||||||
if (!settings) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return settings.title;
|
|
||||||
},
|
|
||||||
|
|
||||||
progressStatus() {
|
|
||||||
const settings = Session.get('progressDialogSettings');
|
|
||||||
if (!settings) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settings.numberOfCompleted === undefined ||
|
|
||||||
settings.numberOfTotal === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (settings.numberOfCompleted / settings.numberOfTotal) * 100;
|
|
||||||
},
|
|
||||||
|
|
||||||
progressMessage() {
|
|
||||||
const settings = Session.get('progressDialogSettings');
|
|
||||||
if (!settings) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return settings.message;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
#progressDialog
|
|
||||||
display: none
|
|
||||||
position: fixed
|
|
||||||
left: 0
|
|
||||||
right: 0
|
|
||||||
margin: auto
|
|
||||||
width: 20%
|
|
||||||
min-height: 85px;
|
|
||||||
z-index: 100
|
|
||||||
border-radius: 5px
|
|
||||||
padding: 10px 20px 10px 20px
|
|
||||||
background-color: rgba(255,255,255,1)
|
|
||||||
outline: none
|
|
||||||
|
|
||||||
.dialogContent
|
|
||||||
margin-bottom: 20px
|
|
||||||
|
|
||||||
#message
|
|
||||||
width: 100%
|
|
||||||
|
|
||||||
span
|
|
||||||
display: inline-block;
|
|
||||||
width: 100%
|
|
||||||
@ -2,7 +2,7 @@
|
|||||||
<div id="studylistTabs" class="tab-content">
|
<div id="studylistTabs" class="tab-content">
|
||||||
<div role="tabpanel" class="tab-pane active" id="studylistTab">
|
<div role="tabpanel" class="tab-pane active" id="studylistTab">
|
||||||
<div class="studylistContainer">
|
<div class="studylistContainer">
|
||||||
{{> studylistResult (clone this)}}
|
{{>studylistResult (clone this)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div role="tabpanel" class="tab-pane" id="viewerTab">
|
<div role="tabpanel" class="tab-pane" id="viewerTab">
|
||||||
@ -11,7 +11,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{#each templateName in additionalTemplates}}
|
{{#each templateName in additionalTemplates}}
|
||||||
{{> UI.dynamic template=templateName}}
|
{{>Template.dynamic template=templateName}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{>progressDialog}}
|
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
<template name="studylistToolbar">
|
<template name="studylistToolbar">
|
||||||
<div class='studylistToolbar'>
|
<div class='studylistToolbar'>
|
||||||
{{#if importSupported }}
|
{{#if importSupported}}
|
||||||
<div class="addNewStudy btn-file">
|
<div class="addNewStudy btn-file">
|
||||||
<label for="btnImport">
|
<label for="btnImport">
|
||||||
<i class="fa fa-plus"></i> Import study
|
<i class="fa fa-plus"></i> Import study
|
||||||
</label>
|
</label>
|
||||||
<input id="btnImport" class='js-import-files' type="file" webkitdirectory directory multiple>
|
<input id="btnImport" class='js-import-files' type="file" webkitdirectory directory multiple>
|
||||||
</div>
|
</div>
|
||||||
{{/if }}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -19,7 +19,7 @@ Template.studylistToolbar.events({
|
|||||||
// Get selected files located in the client machine
|
// Get selected files located in the client machine
|
||||||
const selectedFiles = $.map(event.currentTarget.files, value => value);
|
const selectedFiles = $.map(event.currentTarget.files, value => value);
|
||||||
|
|
||||||
importStudies(selectedFiles);
|
OHIF.studylist.importStudies(selectedFiles);
|
||||||
},
|
},
|
||||||
|
|
||||||
'click .js-import-files'(event) {
|
'click .js-import-files'(event) {
|
||||||
|
|||||||
@ -1,133 +1,126 @@
|
|||||||
|
import { Meteor } from 'meteor/meteor';
|
||||||
import { OHIF } from 'meteor/ohif:core';
|
import { OHIF } from 'meteor/ohif:core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Imports selected studies from local into studylist
|
* Imports selected studies from local into studylist
|
||||||
* @param filesToImport Files located in the client machine to import
|
* @param filesToImport Files located in the client machine to import
|
||||||
*/
|
*/
|
||||||
importStudies = function(filesToImport, importCallback) {
|
OHIF.studylist.importStudies = filesToImport => {
|
||||||
if (filesToImport.length < 1) {
|
const numberOfFiles = filesToImport && filesToImport.length;
|
||||||
return;
|
if (!numberOfFiles) {
|
||||||
|
return new Promise((resolve, reject) => reject('No files to upload'));
|
||||||
}
|
}
|
||||||
var fileUploadStatus = {
|
|
||||||
numberOfFilesUploaded: 0,
|
const uploadMessage = ({ processed, total }) => `Uploaded files: ${processed} / ${total}`;
|
||||||
numberOfFilesFailed: 0
|
|
||||||
|
const taskRunHandler = dialog => {
|
||||||
|
const uploadErrorHandler = fileNames => {
|
||||||
|
const names = fileNames.join('; ');
|
||||||
|
dialog.setMessage(`Failed to upload files: ${names}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
const uploadSuccessHandler = studiesToImport => {
|
||||||
|
importStudiesInternal(studiesToImport, dialog).then(() => {
|
||||||
|
dialog.done();
|
||||||
|
}).catch(errorMessage => {
|
||||||
|
dialog.setMessage(errorMessage);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
uploadFiles(filesToImport, dialog).then(uploadSuccessHandler).catch(uploadErrorHandler);
|
||||||
};
|
};
|
||||||
var numberOfFilesToUpload = filesToImport.length;
|
|
||||||
var studiesToImport = [];
|
|
||||||
OHIF.studylist.progressDialog.show({
|
|
||||||
title: "Uploading Files...",
|
|
||||||
numberOfCompleted: 0,
|
|
||||||
numberOfTotal: numberOfFilesToUpload
|
|
||||||
});
|
|
||||||
|
|
||||||
// Upload files to the server
|
return OHIF.ui.showDialog('dialogProgress', {
|
||||||
filesToImport.forEach(function(fileToUpload) {
|
title: 'Importing Studies...',
|
||||||
var xhr = new XMLHttpRequest();
|
message: uploadMessage,
|
||||||
xhr.open('POST', "/uploadFilesToImport", true);
|
total: numberOfFiles,
|
||||||
xhr.setRequestHeader("filename", fileToUpload.name);
|
task: { run: taskRunHandler }
|
||||||
|
|
||||||
xhr.onload = function() {
|
|
||||||
// Failed to upload a file
|
|
||||||
if (xhr.readyState === 4 && xhr.status !== 200) {
|
|
||||||
updateFileUploadStatus(fileUploadStatus, false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
studiesToImport.push(xhr.responseText);
|
|
||||||
|
|
||||||
updateFileUploadStatus(fileUploadStatus, true);
|
|
||||||
|
|
||||||
var numberOfFilesProcessedToUpload = fileUploadStatus.numberOfFilesUploaded + fileUploadStatus.numberOfFilesFailed;
|
|
||||||
OHIF.studylist.progressDialog.update(numberOfFilesProcessedToUpload);
|
|
||||||
|
|
||||||
if (numberOfFilesToUpload === numberOfFilesProcessedToUpload) {
|
|
||||||
// The upload is completed, so import files
|
|
||||||
importStudiesInternal(studiesToImport, importCallback);
|
|
||||||
|
|
||||||
if (fileUploadStatus.numberOfFilesFailed > 0) {
|
|
||||||
//TODO: Some files failed to upload, so let user know
|
|
||||||
OHIF.log.info("Failed to upload " + fileUploadStatus.numberOfFilesFailed + " of " + numberOfFilesToUpload + " files");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Failed to upload a file
|
|
||||||
xhr.onerror = function() {
|
|
||||||
updateFileUploadStatus(fileUploadStatus, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
xhr.send(fileToUpload);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function updateFileUploadStatus(fileUploadStatus, isSuccess) {
|
const uploadFiles = (files, dialog) => {
|
||||||
if (!isSuccess) {
|
let processed = 0;
|
||||||
fileUploadStatus.numberOfFilesFailed++;
|
|
||||||
} else {
|
|
||||||
fileUploadStatus.numberOfFilesUploaded++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function importStudiesInternal(studiesToImport, importCallback) {
|
|
||||||
if (!studiesToImport) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var numberOfStudiesToImport = studiesToImport.length;
|
const promise = new Promise((resolve, reject) => {
|
||||||
|
const promises = [];
|
||||||
|
|
||||||
OHIF.studylist.progressDialog.show({
|
// Upload files to the server
|
||||||
title: "Importing Studies...",
|
files.forEach(file => {
|
||||||
numberOfCompleted: 0,
|
const filePromise = uploadFile(file, dialog);
|
||||||
numberOfTotal: numberOfStudiesToImport
|
filePromise.then(() => dialog.update(++processed));
|
||||||
});
|
promises.push(filePromise);
|
||||||
|
|
||||||
// Create/Insert a new study import status item
|
|
||||||
Meteor.call("createStudyImportStatus", function(err, studyImportStatusId) {
|
|
||||||
if (err) {
|
|
||||||
// Hide dialog
|
|
||||||
OHIF.studylist.progressDialog.close();
|
|
||||||
console.log(err.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle when StudyImportStatus collection is updated
|
|
||||||
OHIF.studylist.collections.StudyImportStatus.find(studyImportStatusId).observe({
|
|
||||||
changed: function(studyImportStatus) {
|
|
||||||
if (!studyImportStatus) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var numberOfStudiesProcessedToImport = studyImportStatus.numberOfStudiesImported + studyImportStatus.numberOfStudiesFailed;
|
|
||||||
|
|
||||||
// Show number of imported files
|
|
||||||
var successMessage = 'Imported '+studyImportStatus.numberOfStudiesImported+' of '+numberOfStudiesToImport;
|
|
||||||
OHIF.studylist.progressDialog.setMessage({
|
|
||||||
message: successMessage,
|
|
||||||
messageType: 'success'
|
|
||||||
});
|
|
||||||
OHIF.studylist.progressDialog.update(numberOfStudiesProcessedToImport);
|
|
||||||
|
|
||||||
// Show number of failed files if there is at least one failed file
|
|
||||||
if (studyImportStatus.numberOfStudiesFailed > 0) {
|
|
||||||
var successMessage = 'Failed '+studyImportStatus.numberOfStudiesFailed+' of '+numberOfStudiesToImport;
|
|
||||||
OHIF.studylist.progressDialog.setMessage({
|
|
||||||
message: successMessage,
|
|
||||||
messageType: 'warning'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numberOfStudiesProcessedToImport == numberOfStudiesToImport) {
|
|
||||||
// The entire import operation is completed, so remove the study import status item
|
|
||||||
Meteor.call("removeStudyImportStatus", studyImportStatus._id);
|
|
||||||
|
|
||||||
// Let the caller know that import operation is completed
|
|
||||||
if (importCallback) {
|
|
||||||
importCallback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Import studies with study import status id to get callbacks
|
Promise.all(promises).then(resolve).catch(reject);
|
||||||
Meteor.call("importStudies", studiesToImport, studyImportStatusId);
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
return promise;
|
||||||
|
};
|
||||||
|
|
||||||
|
const uploadFile = file => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('POST', '/uploadFilesToImport', true);
|
||||||
|
xhr.setRequestHeader('filename', file.name);
|
||||||
|
|
||||||
|
xhr.onload = () => {
|
||||||
|
if (xhr.readyState === 4 && xhr.status !== 200) {
|
||||||
|
// Failed to upload the file
|
||||||
|
reject(file.name);
|
||||||
|
} else {
|
||||||
|
// Success uploading the file
|
||||||
|
resolve(xhr.responseText);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Failed to upload the file
|
||||||
|
xhr.onerror = () => reject(file.name);
|
||||||
|
|
||||||
|
xhr.send(file);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const importStudiesInternal = (studiesToImport, dialog) => {
|
||||||
|
const numberOfStudies = studiesToImport && studiesToImport.length;
|
||||||
|
if (!numberOfStudies) {
|
||||||
|
return new Promise((resolve, reject) => reject('No studies to import'));
|
||||||
|
}
|
||||||
|
|
||||||
|
let processed = 0;
|
||||||
|
dialog.update(processed);
|
||||||
|
dialog.setTotal(numberOfStudies);
|
||||||
|
dialog.setMessage(({ processed, total }) => `Imported: ${processed} / ${total}`);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
// Create/Insert a new study import status item
|
||||||
|
Meteor.call('createStudyImportStatus', (error, studyImportStatusId) => {
|
||||||
|
if (error) {
|
||||||
|
return reject(error.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle when StudyImportStatus collection is updated
|
||||||
|
OHIF.studylist.collections.StudyImportStatus.find(studyImportStatusId).observe({
|
||||||
|
changed(studyImportStatus) {
|
||||||
|
const { numberOfStudiesImported, numberOfStudiesFailed } = studyImportStatus;
|
||||||
|
dialog.update(numberOfStudiesImported);
|
||||||
|
|
||||||
|
if (numberOfStudiesImported === numberOfStudies) {
|
||||||
|
// The entire import operation is completed, so remove the study import status item
|
||||||
|
Meteor.call('removeStudyImportStatus', studyImportStatus._id);
|
||||||
|
|
||||||
|
// Show number of failed files if there is at least one failed file
|
||||||
|
if (studyImportStatus.numberOfStudiesFailed > 0) {
|
||||||
|
const failed = numberOfStudiesFailed;
|
||||||
|
reject(`Failed to import ${failed} of ${numberOfStudies} studies`);
|
||||||
|
} else {
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Import studies with study import status id to get callbacks
|
||||||
|
Meteor.call('importStudies', studiesToImport, studyImportStatusId);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user