@@ -368,7 +407,10 @@
diff --git a/src/views/email.js b/src/views/email.js
index 099e0fac0..9a7402575 100644
--- a/src/views/email.js
+++ b/src/views/email.js
@@ -353,6 +353,111 @@ angular.module('Application').controller('EmailController', ['$scope', '$locatio
}
};
+ $scope.mailboxImport = {
+ busy: false,
+ done: false,
+ error: null,
+ percent: 0,
+ success: 0,
+ mailboxes: [],
+
+ reset: function () {
+ $scope.mailboxImport.busy = false;
+ $scope.mailboxImport.error = null;
+ $scope.mailboxImport.mailboxes = [];
+ $scope.mailboxImport.percent = 0;
+ $scope.mailboxImport.success = 0;
+ $scope.mailboxImport.done = false;
+ },
+
+ handleFileChanged: function () {
+ $scope.mailboxImport.reset();
+
+ var fileInput = document.getElementById('mailboxImportFileInput');
+ if (!fileInput.files || !fileInput.files[0]) return;
+
+ var file = fileInput.files[0];
+ if (file.type !== 'application/json') return console.log('Unsupported file type.');
+
+ const reader = new FileReader();
+ reader.addEventListener('load', function () {
+ $scope.$apply(function () {
+ try {
+ $scope.mailboxImport.mailboxes = JSON.parse(reader.result);
+ } catch (e) {
+ console.error('Failed to parse mailboxes.', e);
+ $scope.mailboxImport.error = { file: 'Imported file is not valid JSON' };
+ }
+
+ // TODO check for validity and minium requirements for the mailboxes from JSON
+ // currently supported and required fields are:
+ // domain
+ // name
+ // ownerId
+ // ownerType
+ });
+ }, false);
+ reader.readAsText(file);
+ },
+
+ show: function () {
+ $scope.mailboxImport.reset();
+
+ // named so no duplactes
+ document.getElementById('mailboxImportFileInput').addEventListener('change', $scope.mailboxImport.handleFileChanged);
+
+ $('#mailboxImportModal').modal('show');
+ },
+
+ openFileInput: function () {
+ $('#mailboxImportFileInput').click();
+ },
+
+ import: function () {
+ $scope.mailboxImport.percent = 0;
+ $scope.mailboxImport.success = 0;
+ $scope.mailboxImport.done = false;
+ $scope.mailboxImport.error = { import: [] };
+ $scope.mailboxImport.busy = true;
+
+ var processed = 0;
+
+ async.eachSeries($scope.mailboxImport.mailboxes, function (mailbox, callback) {
+ Client.addMailbox(mailbox.domain, mailbox.name, mailbox.ownerId, mailbox.ownerType, function (error) {
+ if (error) $scope.mailboxImport.error.import.push({ error: error, mailbox: mailbox });
+ else ++$scope.mailboxImport.success;
+
+ ++processed;
+ $scope.mailboxImport.percent = 100 * processed / $scope.mailboxImport.mailboxes.length;
+
+ callback();
+ });
+ }, function (error) {
+ if (error) return console.error(error);
+
+ $scope.mailboxImport.busy = false;
+ $scope.mailboxImport.done = true;
+ });
+ }
+ };
+
+ $scope.mailboxExport = function () {
+ // FIXME only does first 10k mailboxes
+ Client.listMailboxes($scope.domain.domain, '', 1, 10000, function (error, result) {
+ if (error) {
+ Client.error('Failed to list mailboxes. Full error in the webinspector.');
+ return console.error('Failed to list mailboxes.', error);
+ }
+
+ var file = new Blob([ JSON.stringify(result, null, 2) ], { type: 'application/json' });
+ var a = document.createElement('a');
+ a.href = URL.createObjectURL(file);
+ a.download = $scope.domain.domain.replaceAll('.','_') + '-mailboxes.json';
+ document.body.appendChild(a);
+ a.click();
+ });
+ };
+
$scope.mailboxes = {
mailboxes: [],
search: '',