Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rework account-folders relation #93

Merged
merged 1 commit into from
Sep 21, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions js/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ define(function(require) {

function checkForNotifications(accounts) {
accounts.each(function(account) {
var folders = account.get('folders');
var folders = account.folders;

var url = OC.generateUrl('apps/mail/accounts/{id}/folders/detectChanges',
{
Expand Down Expand Up @@ -130,7 +130,9 @@ define(function(require) {
// reload if current selected folder has changed
if (State.currentAccount === changedAccount &&
State.currentFolder.get('id') === changes.id) {
Radio.ui.request('messagesview:collection').add(changes.messages);
_.each(changes.messages, function(msg) {
State.currentFolder.addMessages(msg);
});
var messages = new MessageCollection(changes.messages).slice(0);
Radio.message.trigger('fetch:bodies', changedAccount, changedFolder, messages);
}
Expand Down
2 changes: 0 additions & 2 deletions js/controller/foldercontroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,6 @@ define(function(require) {
// Fade out the message composer
$('#mail_new_message').prop('disabled', false);

Radio.ui.trigger('messagesview:messages:add', messages);

if (messages.length > 0) {
// Fetch first 10 messages in background
Radio.message.trigger('fetch:bodies', account, folder, messages.slice(0, 10));
Expand Down
20 changes: 13 additions & 7 deletions js/models/account.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,14 @@ define(function(require) {
*/
var Account = Backbone.Model.extend({
defaults: {
folders: [],
aliases: []
},
idAttribute: 'accountId',
url: function() {
return OC.generateUrl('apps/mail/accounts');
},
initialize: function() {
this.set('folders', new FolderCollection(this.get('folders')));
this.folders = new FolderCollection();
this.set('aliases', new AliasesCollection(this.get('aliases')));
},
_getFolderByIdRecursively: function(folder, folderId) {
Expand All @@ -41,7 +40,7 @@ define(function(require) {
return folder;
}

var subFolders = folder.get('folders');
var subFolders = folder.folders;
if (!subFolders) {
return null;
}
Expand All @@ -54,13 +53,20 @@ define(function(require) {

return null;
},
/**
* @param {Folder} folder
* @returns {undefined}
*/
addFolder: function(folder) {
folder = this.folders.add(folder);
folder.account = this;
},
getFolderById: function(folderId) {
var folders = this.get('folders');
if (!folders) {
if (!this.folders) {
return undefined;
}
for (var i = 0; i < folders.length; i++) {
var result = this._getFolderByIdRecursively(folders.at(i), folderId);
for (var i = 0; i < this.folders.length; i++) {
var result = this._getFolderByIdRecursively(this.folders.at(i), folderId);
if (result) {
return result;
}
Expand Down
17 changes: 14 additions & 3 deletions js/models/folder.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,17 @@ define(function(require) {
*/
var Folder = Backbone.Model.extend({
messages: undefined,
account: undefined,
folder: undefined,
folders: undefined,
defaults: {
open: false,
folders: []
folders: [],
},
initialize: function() {
var FolderCollection = require('models/foldercollection');
var MessageCollection = require('models/messagecollection');
this.set('folders', new FolderCollection(this.get('folders')));
this.folders = new FolderCollection(this.get('folders') || []);
this.messages = new MessageCollection();
},
toggleOpen: function() {
Expand All @@ -36,8 +39,16 @@ define(function(require) {
* @returns {undefined}
*/
addMessage: function(message) {
message.folder = this;
this.messages.add(message);
message.folder = this;
},
/**
* @param {Folder} folder
* @returns {undefined}
*/
addFolder: function(folder) {
folder = this.folder.add(folder);
folder.account = this.account;
},
toJSON: function() {
var data = Backbone.Model.prototype.toJSON.call(this);
Expand Down
6 changes: 3 additions & 3 deletions js/routecontroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ define(function(require) {

// Show first folder of first account
var firstAccount = this.accounts.at(0);
var firstFolder = firstAccount.get('folders').at(0);
var firstFolder = firstAccount.folders.at(0);
_this.showFolder(firstAccount.get('accountId'), firstFolder.get('id'));
},
showFolder: function(accountId, folderId, noSelect) {
Expand All @@ -111,7 +111,7 @@ define(function(require) {

var folder = account.getFolderById(folderId);
if (_.isUndefined(folder)) {
folder = account.get('folders').at(0);
folder = account.folders.at(0);
Radio.ui.trigger('error:show', t('mail', 'Invalid folder'));
this._navigate('accounts/' + accountId + '/folders/' + folder.get('id'));
}
Expand All @@ -134,7 +134,7 @@ define(function(require) {

var folder = account.getFolderById(folderId);
if (_.isUndefined(folder)) {
folder = account.get('folders').at(0);
folder = account.folders.at(0);
Radio.ui.trigger('error:show', t('mail', 'Invalid folder'));
this._navigate('accounts/' + accountId + '/folders/' + folder.get('id'));
}
Expand Down
6 changes: 3 additions & 3 deletions js/service/folderservice.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ define(function(require) {
promise.done(function(data) {
for (var prop in data) {
if (prop === 'folders') {
account.get('folders').reset();
account.get('folders').add(data.folders);
account.folders.reset();
account.addFolder(data.folders);
} else {
account.set(prop, data[prop]);
}
}
defer.resolve(account.get('folders'));
defer.resolve(account.folders);
});

promise.fail(function() {
Expand Down
52 changes: 30 additions & 22 deletions js/tests/models_account_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,35 +20,43 @@
define(['models/account',
'models/foldercollection',
'models/aliasescollection',
'OC'],
function(Account, FolderCollection, AliasCollection, OC) {
describe('Account test', function() {
var account;
'models/folder',
'OC'
], function(Account, FolderCollection, AliasCollection, Folder, OC) {
describe('Account test', function() {
var account;

beforeEach(function() {
account = new Account();
});

beforeEach(function() {
account = new Account();
});
it('has collections as default attributes', function() {
var folders = account.folders;
var aliases = account.get('aliases');

it('has collections as default attributes', function() {
var folders = account.get('folders');
var aliases = account.get('aliases');
expect(folders instanceof FolderCollection).toBe(true);
expect(aliases instanceof AliasCollection).toBe(true);
});

expect(folders instanceof FolderCollection).toBe(true);
expect(aliases instanceof AliasCollection).toBe(true);
});
it('uses accountId as id attribute', function() {
expect(account.idAttribute).toBe('accountId');
});

it('uses accountId as id attribute', function() {
expect(account.idAttribute).toBe('accountId');
});
it('has the correct URL', function() {
spyOn(OC, 'generateUrl').and.returnValue('index.php/apps/mail/accounts');

it('has the correct URL', function() {
spyOn(OC, 'generateUrl').and.returnValue('index.php/apps/mail/accounts');
var url = account.url();

var url = account.url();
expect(url).toBe('index.php/apps/mail/accounts');
});

expect(url).toBe('index.php/apps/mail/accounts');
});
it('adds folders to its collection', function() {
var folder = new Folder();

account.addFolder(folder);

expect(account.folders.length).toBe(1);
expect(folder.account).toBe(account);
});
});
});
});
6 changes: 3 additions & 3 deletions js/views/account.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ define(function(require) {
menuShown: false,
initialize: function(options) {
this.model = options.model;
this.collection = this.model.get('folders');
this.collection = this.model.folders;
},
filter: function(child) {
if (!this.collapsed) {
Expand Down Expand Up @@ -104,9 +104,9 @@ define(function(require) {
},
onClick: function(e) {
e.preventDefault();
if (this.model.get('folders').length > 0) {
if (this.model.folders.length > 0) {
var accountId = this.model.get('accountId');
var folderId = this.model.get('folders').first().get('id');
var folderId = this.model.folders.first().get('id');
Radio.navigation.trigger('folder', accountId, folderId);
}
},
Expand Down
2 changes: 1 addition & 1 deletion js/views/folder.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ define(function(require) {
if (folderId === this.model.get('id')) {
folder = this.model;
} else {
folder = this.model.get('folders').get(folderId);
folder = this.model.folders.get(folderId);
}
var noSelect = $(e.currentTarget).parent().data('no_select');
Radio.navigation.trigger('folder', account.get('accountId'), folder.get('id'), noSelect);
Expand Down
8 changes: 0 additions & 8 deletions js/views/messagesview.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ define(function(require) {
return _this.collection;
});
this.listenTo(Radio.ui, 'messagesview:messages:update', this.refresh);
this.listenTo(Radio.ui, 'messagesview:messages:add', this.addMessages);
this.listenTo(Radio.ui, 'messagesview:messageflag:set', this.setMessageFlag);
this.listenTo(Radio.ui, 'messagesview:filter', this.filterCurrentMailbox);
this.listenTo(Radio.ui, 'messagesview:message:setactive', this.setActiveMessage);
Expand Down Expand Up @@ -263,13 +262,6 @@ define(function(require) {
// scroll event is fired, which we want to ignore
_this.reloaded = reload;
});
},
addMessages: function(message) {
var _this = this;
// TODO: merge?
message.each(function(msg) {
_this.collection.add(msg);
});
}
});
});
2 changes: 1 addition & 1 deletion js/views/navigation-accounts.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ define(function(require) {
if (_.isUndefined(localAccount)) {
return;
}
var folders = localAccount.get('folders');
var folders = localAccount.folders;
_.each(folders.models, function(folder) {
folders.get(folder).set('active', false);
});
Expand Down
2 changes: 1 addition & 1 deletion js/views/setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ define(function(require) {
// Let's assume there's at least one account after a successful
// setup, so let's show the first one (could be the unified inbox)
var firstAccount = accounts.first();
var firstFolder = firstAccount.get('folders').first();
var firstFolder = firstAccount.folders.first();
Radio.navigation.trigger('folder', firstAccount.get('accountId'), firstFolder.get('id'));
});
});
Expand Down