sogo/UI/WebServerResources/js/Mailer/Account.service.js

377 lines
12 KiB
JavaScript
Raw Normal View History

/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
(function() {
'use strict';
/**
* @name Account
* @constructor
* @param {object} futureAccountData
*/
function Account(futureAccountData, fetchAll) {
// Data is immediately available
if (typeof futureAccountData.then !== 'function') {
angular.extend(this, futureAccountData);
2016-03-03 19:38:54 +01:00
_.forEach(this.identities, function(identity) {
2014-12-11 17:24:22 +01:00
if (identity.fullName)
identity.full = identity.fullName + ' <' + identity.email + '>';
else
identity.full = '<' + identity.email + '>';
});
Account.$log.debug('Account: ' + JSON.stringify(futureAccountData, undefined, 2));
}
else {
// The promise will be unwrapped first
//this.$unwrap(futureAccountData);
}
this.fetchAll = false;
// Check if we're displaying the IMAP subscription management dialog
if (angular.isDefined(fetchAll) && fetchAll) {
this.fetchAll = true;
this.$getMailboxes();
}
}
/**
* @memberof Account
* @desc The factory we'll use to register with Angular
* @returns the Account constructor
*/
2015-09-30 22:17:05 +02:00
Account.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'Resource', 'Preferences', 'Mailbox', 'Message', function($q, $timeout, $log, Settings, Resource, Preferences, Mailbox, Message) {
angular.extend(Account, {
$q: $q,
$timeout: $timeout,
$log: $log,
$$resource: new Resource(Settings.activeUser('folderURL') + 'Mail', Settings.activeUser()),
2015-09-30 22:17:05 +02:00
$Preferences: Preferences,
2014-12-11 17:24:22 +01:00
$Mailbox: Mailbox,
$Message: Message
});
return Account; // return constructor
}];
/**
* @module SOGo.MailerUI
* @desc Factory registration of Account in Angular module.
*/
try {
angular.module('SOGo.MailerUI');
}
catch(e) {
angular.module('SOGo.MailerUI', ['SOGo.Common']);
}
angular.module('SOGo.MailerUI')
.factory('Account', Account.$factory);
/**
* @memberof Account
* @desc Set the list of accounts and instanciate a new Account object for each item.
* @param {array} [data] - the metadata of the accounts
* @returns the list of accounts
*/
Account.$findAll = function(data) {
if (!data) {
return Account.$$resource.fetch('', 'mailAccounts').then(function(o) {
return Account.$unwrapCollection(o);
});
}
return Account.$unwrapCollection(data);
};
/**
* @memberof Account
* @desc Unwrap to a collection of Account instances.
* @param {object} data - the accounts information
* @returns a collection of Account objects
*/
Account.$unwrapCollection = function(data) {
var collection = [];
angular.forEach(data, function(o, i) {
o.id = i;
collection[i] = new Account(o);
});
Account.$accounts = collection;
return collection;
};
/**
* @function getLength
* @memberof Account.prototype
* @desc Used by md-virtual-repeat / md-on-demand
* @returns the number of mailboxes in the account
*/
Account.prototype.getLength = function() {
return this.$flattenMailboxes().length;
};
/**
* @function getItemAtIndex
* @memberof Account.prototype
* @desc Used by md-virtual-repeat / md-on-demand
* @returns the mailbox at the specified index
*/
Account.prototype.getItemAtIndex = function(index) {
var expandedMailboxes;
expandedMailboxes = this.$flattenMailboxes();
if (index >= 0 && index < expandedMailboxes.length)
return expandedMailboxes[index];
return null;
};
/**
* @function $getMailboxes
* @memberof Account.prototype
* @desc Fetch the list of mailboxes for the current account.
* @param {object} [options] - force a reload by setting 'reload' to true
* @returns a promise of the HTTP operation
*/
Account.prototype.$getMailboxes = function(options) {
var _this = this;
2014-12-11 17:24:22 +01:00
if (this.$mailboxes && !(options && options.reload)) {
return Account.$q.when(this.$mailboxes);
2014-12-11 17:24:22 +01:00
}
else {
return Account.$Mailbox.$find(this).then(function(data) {
2014-12-11 17:24:22 +01:00
_this.$mailboxes = data;
_this.$expanded = false;
2015-09-30 22:17:05 +02:00
// Set expanded folders from user's settings
Account.$Preferences.ready().then(function() {
2015-09-30 22:41:29 +02:00
var expandedFolders,
_visit = function(mailboxes) {
_.forEach(mailboxes, function(o) {
o.$expanded = (expandedFolders.indexOf('/' + o.id) >= 0);
if (o.children && o.children.length > 0) {
_visit(o.children);
}
});
};
2015-09-30 22:17:05 +02:00
if (Account.$Preferences.settings.Mail.ExpandedFolders) {
if (angular.isString(Account.$Preferences.settings.Mail.ExpandedFolders))
// Backward compatibility support
expandedFolders = angular.fromJson(Account.$Preferences.settings.Mail.ExpandedFolders);
else
expandedFolders = Account.$Preferences.settings.Mail.ExpandedFolders;
_this.$expanded = (expandedFolders.indexOf('/' + _this.id) >= 0);
2015-09-30 22:17:05 +02:00
if (expandedFolders.length > 0) {
2015-09-30 22:41:29 +02:00
_visit(_this.$mailboxes);
2015-09-30 22:17:05 +02:00
}
}
if (Account.$accounts)
_this.$expanded |= (Account.$accounts.length == 1); // Always expand single account
2015-09-30 22:17:05 +02:00
_this.$flattenMailboxes({reload: true});
});
return _this.$mailboxes;
2014-12-11 17:24:22 +01:00
});
}
};
/**
* @function $flattenMailboxes
* @memberof Account.prototype
* @desc Get a flatten array of the mailboxes.
* @param {object} [options] - the following boolean attributes are available:
* - reload: rebuild the flatten array of mailboxes from the original tree representation (this.$mailboxes)
* - all: return all mailboxes, ignoring their expanstion state
* - saveState: save expansion state of mailboxes to the server
* @returns an array of Mailbox instances
*/
Account.prototype.$flattenMailboxes = function(options) {
2014-12-11 17:24:22 +01:00
var _this = this,
allMailboxes = [],
2015-09-30 22:17:05 +02:00
expandedMailboxes = [],
_visit = function(mailboxes) {
2016-03-03 19:38:54 +01:00
_.forEach(mailboxes, function(o) {
allMailboxes.push(o);
if ((options && options.all || o.$expanded) && o.children && o.children.length > 0) {
_visit(o.children);
2014-12-11 17:24:22 +01:00
}
});
};
if (this.$$flattenMailboxes && !(options && (options.reload || options.all))) {
2014-12-11 17:24:22 +01:00
allMailboxes = this.$$flattenMailboxes;
}
else {
_visit(this.$mailboxes);
if (!options || !options.all) {
_this.$$flattenMailboxes = allMailboxes;
if (options && options.saveState) {
// Save expansion state of mailboxes to the server
_.forEach(Account.$accounts, function(account) {
if (account.$expanded) {
expandedMailboxes.push('/' + account.id);
}
_.reduce(account.$$flattenMailboxes, function(expandedFolders, mailbox) {
if (mailbox.$expanded) {
expandedFolders.push('/' + mailbox.id);
}
return expandedFolders;
}, expandedMailboxes);
});
Account.$$resource.post(null, 'saveFoldersState', expandedMailboxes);
}
2015-09-30 22:17:05 +02:00
}
2014-12-11 17:24:22 +01:00
}
return allMailboxes;
};
Account.prototype.$getMailboxByType = function(type) {
var mailbox,
// Recursive find function
_find = function(mailboxes) {
var mailbox = _.find(mailboxes, function(o) {
return o.type == type;
});
if (!mailbox) {
angular.forEach(mailboxes, function(o) {
if (!mailbox && o.children && o.children.length > 0) {
mailbox = _find(o.children);
}
});
}
return mailbox;
};
mailbox = _find(this.$mailboxes);
2014-12-11 17:24:22 +01:00
return mailbox;
2014-12-11 17:24:22 +01:00
};
/**
* @function $getMailboxByPath
* @memberof Account.prototype
* @desc Recursively find a mailbox using its path
* @returns a promise of the HTTP operation
*/
Account.prototype.$getMailboxByPath = function(path) {
var mailbox = null,
// Recursive find function
_find = function(mailboxes) {
var mailbox = _.find(mailboxes, function(o) {
return o.path == path;
});
if (!mailbox) {
angular.forEach(mailboxes, function(o) {
if (!mailbox && o.children && o.children.length > 0) {
mailbox = _find(o.children);
}
});
}
return mailbox;
};
mailbox = _find(this.$mailboxes);
return mailbox;
};
/**
* @function $newMailbox
* @memberof Account.prototype
* @desc Create a new mailbox on the server and refresh the list of mailboxes.
* @returns a promise of the HTTP operations
*/
Account.prototype.$newMailbox = function(path, name) {
var _this = this;
return Account.$$resource.post(path.toString(), 'createFolder', {name: name}).then(function() {
_this.$getMailboxes({reload: true});
});
};
/**
* @function updateQuota
* @memberof Account.prototype
* @param {Object} data - the inbox quota information returned by the server
* @desc Update the quota definition associated to the account
*/
Account.prototype.updateQuota = function(data) {
var percent, format, description;
percent = (Math.round(data.usedSpace * 10000 / data.maxQuota) / 100);
format = l("quotasFormat");
description = format.formatted(percent, Math.round(data.maxQuota/10.24)/100);
this.$quota = { percent: percent, description: description };
};
2014-12-11 17:24:22 +01:00
/**
* @function $newMessage
* @memberof Account.prototype
* @desc Prepare a new Message object associated to the appropriate mailbox.
* @returns a promise of the HTTP operations
*/
Account.prototype.$newMessage = function() {
var _this = this;
2014-12-11 17:24:22 +01:00
// Query account for draft folder and draft UID
return Account.$$resource.fetch(this.id.toString(), 'compose').then(function(data) {
Account.$log.debug('New message (compose): ' + JSON.stringify(data, undefined, 2));
var message = new Account.$Message(data.accountId, _this.$getMailboxByPath(data.mailboxPath), data);
return message;
}).then(function(message) {
2014-12-11 17:24:22 +01:00
// Fetch draft initial data
return Account.$$resource.fetch(message.$absolutePath({asDraft: true}), 'edit').then(function(data) {
Account.$log.debug('New message (edit): ' + JSON.stringify(data, undefined, 2));
angular.extend(message.editable, data);
message.isNew = true;
return message;
2014-12-11 17:24:22 +01:00
});
});
};
/**
* @function $addDelegate
* @memberof Account.prototype
* @param {Object} user - a User object with minimal set of attributes (uid, isGroup, cn, c_email)
* @desc Remove a user from the account's delegates
* @see {@link User.$filter}
*/
Account.prototype.$addDelegate = function(user) {
var _this = this,
deferred = Account.$q.defer(),
param = {uid: user.uid};
2016-03-03 19:38:54 +01:00
if (!user.uid || _.indexOf(_.map(this.delegates, 'uid'), user.uid) > -1) {
// No UID specified or user already in delegates
deferred.resolve();
}
else {
Account.$$resource.fetch(this.id.toString(), 'addDelegate', param).then(function() {
_this.delegates.push(user);
deferred.resolve(_this.users);
}, function(data, status) {
deferred.reject(l('An error occured please try again.'));
});
}
return deferred.promise;
};
/**
* @function $removeDelegate
* @memberof Account.prototype
* @param {Object} user - a User object with minimal set of attributes (uid, isGroup, cn, c_email)
* @desc Remove a user from the account's delegates
* @return a promise of the server call to remove the user from the account's delegates
*/
Account.prototype.$removeDelegate = function(uid) {
var _this = this,
param = {uid: uid};
return Account.$$resource.fetch(this.id.toString(), 'removeDelegate', param).then(function() {
2016-03-03 19:38:54 +01:00
var i = _.indexOf(_.map(_this.delegates, 'uid'), uid);
if (i >= 0) {
_this.delegates.splice(i, 1);
}
});
};
})();