Skip to content

Commit

Permalink
Merge pull request #93 from nextcloud/account-folders-relation-rework
Browse files Browse the repository at this point in the history
rework account-folders relation
  • Loading branch information
ChristophWurst authored Sep 21, 2016
2 parents 6038f96 + d4ad3af commit 632e62d
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 56 deletions.
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

0 comments on commit 632e62d

Please sign in to comment.