Merge pull request #1575 from owncloud/keep-unread-counter-in-sync
Keep unread/total message counter in sync when reading/deleting messages
This commit is contained in:
Коммит
6b63f50765
|
@ -30,7 +30,7 @@ define(function(require) {
|
|||
var Handlebars = require('handlebars');
|
||||
var Marionette = require('marionette');
|
||||
var OC = require('OC');
|
||||
var AppView = require('views/app');
|
||||
var AppView = require('views/appview');
|
||||
var Cache = require('cache');
|
||||
var Radio = require('radio');
|
||||
var Router = require('router');
|
||||
|
|
|
@ -139,7 +139,7 @@ define(function(require) {
|
|||
Cache.addMessageList(changedAccount, localFolder, cachedList);
|
||||
}
|
||||
|
||||
State.folderView.updateTitle();
|
||||
Radio.ui.trigger('title:update');
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -30,6 +30,7 @@ define(function(require) {
|
|||
load(account, message, options);
|
||||
});
|
||||
Radio.message.on('forward', openForwardComposer);
|
||||
Radio.message.on('flag', flagMessage);
|
||||
|
||||
/**
|
||||
* @param {Account} account
|
||||
|
@ -162,6 +163,35 @@ define(function(require) {
|
|||
return defer.promise();
|
||||
}
|
||||
|
||||
function flagMessage(account, folder, message, flag, value) {
|
||||
var prevUnseen = folder.get('unseen');
|
||||
|
||||
if (message.get('flags').get(flag) === value) {
|
||||
// Nothing to do
|
||||
return;
|
||||
}
|
||||
message.get('flags').set(flag, value);
|
||||
|
||||
// Update folder counter
|
||||
if (flag === 'unseen') {
|
||||
var unseen = Math.max(0, prevUnseen + (value ? 1 : -1));
|
||||
folder.set('unseen', unseen);
|
||||
}
|
||||
|
||||
// Update the folder to reflect the new unread count
|
||||
Radio.ui.trigger('title:update');
|
||||
|
||||
var flaggingMessage = Radio.message.request('flag', account, folder, message, flag, value);
|
||||
$.when(flaggingMessage).fail(function() {
|
||||
Radio.ui.trigger('error:show', t('mail', 'Message flag could not be set.'));
|
||||
|
||||
// Restore previous state
|
||||
message.get('flags').set(flag, !value);
|
||||
folder.set('unseen', prevUnseen);
|
||||
Radio.ui.trigger('title:update');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Account} account
|
||||
* @param {Folder} folder
|
||||
|
|
|
@ -12,9 +12,6 @@ define(function(require) {
|
|||
'use strict';
|
||||
|
||||
var Backbone = require('backbone');
|
||||
var $ = require('jquery');
|
||||
var OC = require('OC');
|
||||
var Radio = require('radio');
|
||||
var MessageFlags = require('models/messageflags');
|
||||
|
||||
/**
|
||||
|
@ -42,31 +39,6 @@ define(function(require) {
|
|||
data.id = this.cid;
|
||||
}
|
||||
return data;
|
||||
},
|
||||
flagMessage: function(flag, value) {
|
||||
var messageId = this.id;
|
||||
var _this = this;
|
||||
_this.get('flags').set(flag, value);
|
||||
|
||||
var flags = [flag, value];
|
||||
$.ajax(
|
||||
OC.generateUrl('apps/mail/accounts/{accountId}/folders/{folderId}/messages/{messageId}/flags',
|
||||
{
|
||||
accountId: require('state').currentAccount.get('accountId'),
|
||||
folderId: require('state').currentFolder.get('id'),
|
||||
messageId: messageId
|
||||
}), {
|
||||
data: {
|
||||
flags: _.object([flags])
|
||||
},
|
||||
type: 'PUT',
|
||||
success: function() {
|
||||
},
|
||||
error: function() {
|
||||
Radio.ui.trigger('error:show', t('mail', 'Message could not be starred. Please try again.'));
|
||||
_this.get('flags').set(flag, !value);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ define(function(require) {
|
|||
var channels = {};
|
||||
_.each(channelNames, function(channelName) {
|
||||
channels[channelName] = Radio.channel(channelName);
|
||||
Radio.tuneIn(channelName);
|
||||
});
|
||||
|
||||
return channels;
|
||||
|
|
|
@ -29,6 +29,7 @@ define(function(require) {
|
|||
Radio.message.reply('entities', getMessageEntities);
|
||||
Radio.message.reply('entity', getMessageEntity);
|
||||
Radio.message.reply('bodies', fetchMessageBodies);
|
||||
Radio.message.reply('flag', flagMessage);
|
||||
Radio.message.reply('send', sendMessage);
|
||||
Radio.message.reply('draft', saveDraft);
|
||||
|
||||
|
@ -192,6 +193,32 @@ define(function(require) {
|
|||
return defer.promise();
|
||||
}
|
||||
|
||||
function flagMessage(account, folder, message, flag, value) {
|
||||
var defer = $.Deferred();
|
||||
|
||||
var flags = [flag, value];
|
||||
var url = OC.generateUrl('apps/mail/accounts/{accountId}/folders/{folderId}/messages/{messageId}/flags',
|
||||
{
|
||||
accountId: account.get('accountId'),
|
||||
folderId: folder.get('id'),
|
||||
messageId: message.id
|
||||
});
|
||||
$.ajax(url, {
|
||||
type: 'PUT',
|
||||
data: {
|
||||
flags: _.object([flags])
|
||||
},
|
||||
success: function() {
|
||||
defer.resolve();
|
||||
},
|
||||
error: function() {
|
||||
defer.reject();
|
||||
}
|
||||
});
|
||||
|
||||
return defer.promise();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Account} account
|
||||
* @param {object} message
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
/* global oc_defaults */
|
||||
|
||||
/**
|
||||
* ownCloud - Mail
|
||||
*
|
||||
|
@ -51,6 +53,7 @@ define(function(require) {
|
|||
this.listenTo(Radio.ui, 'setup:show', this.showSetup);
|
||||
this.listenTo(Radio.ui, 'foldercontent:show', this.showFolderContent);
|
||||
this.listenTo(Radio.ui, 'content:loading', this.showContentLoading);
|
||||
this.listenTo(Radio.ui, 'title:update', this.updateTitle);
|
||||
|
||||
// Hide notification favicon when switching back from
|
||||
// another browser tab
|
||||
|
@ -157,14 +160,10 @@ define(function(require) {
|
|||
if (this.activeContent !== ContentType.FOLDER_CONTENT) {
|
||||
this.activeContent = ContentType.FOLDER_CONTENT;
|
||||
|
||||
var messageContentView = new FolderContentView({
|
||||
this.content.show(new FolderContentView({
|
||||
account: account,
|
||||
folder: folder
|
||||
});
|
||||
var accountsView = this.accountsView;
|
||||
this.accountsView.listenTo(messageContentView.messages, 'change:unseen',
|
||||
accountsView.changeUnseen);
|
||||
this.content.show(messageContentView);
|
||||
}));
|
||||
}
|
||||
},
|
||||
showContentLoading: function() {
|
||||
|
@ -172,7 +171,34 @@ define(function(require) {
|
|||
this.activeContent = ContentType.LOADING;
|
||||
this.content.show(new LoadingView());
|
||||
}
|
||||
},
|
||||
updateTitle: function() {
|
||||
var activeEmail = '';
|
||||
if (require('state').currentAccount.get('accountId') !== -1) {
|
||||
var activeAccount = require('state').currentAccount;
|
||||
activeEmail = ' - ' + activeAccount.get('email');
|
||||
}
|
||||
var activeFolder = require('state').currentFolder;
|
||||
var name = activeFolder.name || activeFolder.get('name');
|
||||
var count = 0;
|
||||
// TODO: use specialUse instead, otherwise this won't work with localized drafts folders
|
||||
if (name === 'Drafts') {
|
||||
count = activeFolder.total || activeFolder.get('total');
|
||||
} else {
|
||||
count = activeFolder.unseen || activeFolder.get('unseen');
|
||||
}
|
||||
if (count > 0) {
|
||||
window.document.title = name + ' (' + count + ')' +
|
||||
// jscs:disable requireCamelCaseOrUpperCaseIdentifiers
|
||||
activeEmail + ' - Mail - ' + oc_defaults.title;
|
||||
// jscs:enable requireCamelCaseOrUpperCaseIdentifiers
|
||||
} else {
|
||||
window.document.title = name + activeEmail +
|
||||
// jscs:disable requireCamelCaseOrUpperCaseIdentifiers
|
||||
' - Mail - ' + oc_defaults.title;
|
||||
// jscs:enable requireCamelCaseOrUpperCaseIdentifiers
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return AppView;
|
|
@ -24,11 +24,6 @@ define(function(require) {
|
|||
},
|
||||
removeAttachment: function() {
|
||||
this.model.collection.remove(this.model);
|
||||
},
|
||||
|
||||
addAttachmentLocal: function() {
|
||||
console.log('test');
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
|
|
@ -42,8 +42,6 @@ define(function(require) {
|
|||
},
|
||||
filterCriteria: null,
|
||||
initialize: function() {
|
||||
this.listenTo(this.collection, 'change:flags', this.changeFlags);
|
||||
|
||||
var _this = this;
|
||||
Radio.ui.reply('messagesview:collection', function() {
|
||||
return _this.collection;
|
||||
|
@ -69,17 +67,14 @@ define(function(require) {
|
|||
emptyViewOptions: function() {
|
||||
return {filterCriteria: this.filterCriteria};
|
||||
},
|
||||
changeFlags: function(model) {
|
||||
var unseen = model.get('flags').get('unseen');
|
||||
var prevUnseen = model.get('flags')._previousAttributes.unseen;
|
||||
if (unseen !== prevUnseen) {
|
||||
this.trigger('change:unseen', model, unseen);
|
||||
}
|
||||
},
|
||||
setMessageFlag: function(messageId, flag, val) {
|
||||
var message = this.collection.get(messageId);
|
||||
if (message) {
|
||||
message.flagMessage(flag, val);
|
||||
// TODO: globals are bad :-/
|
||||
var account = require('state').currentAccount;
|
||||
var folder = require('state').currentFolder;
|
||||
|
||||
Radio.message.trigger('flag', account, folder, message, flag, val);
|
||||
}
|
||||
},
|
||||
setActiveMessage: function(messageId) {
|
||||
|
@ -103,7 +98,7 @@ define(function(require) {
|
|||
}
|
||||
|
||||
require('state').currentMessageId = messageId;
|
||||
require('state').folderView.updateTitle();
|
||||
Radio.ui.trigger('title:update');
|
||||
|
||||
},
|
||||
selectNextMessage: function() {
|
||||
|
|
|
@ -5,13 +5,14 @@
|
|||
* later. See the COPYING file.
|
||||
*
|
||||
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
* @copyright Christoph Wurst 2015
|
||||
* @copyright Christoph Wurst 2015, 2016
|
||||
*/
|
||||
|
||||
define(function(require) {
|
||||
'use strict';
|
||||
|
||||
var $ = require('jquery');
|
||||
var _ = require('underscore');
|
||||
var Handlebars = require('handlebars');
|
||||
var Marionette = require('marionette');
|
||||
var OC = require('OC');
|
||||
|
@ -64,10 +65,12 @@ define(function(require) {
|
|||
.removeClass('icon-star')
|
||||
.addClass('icon-starred');
|
||||
}
|
||||
this.model.flagMessage(
|
||||
'flagged',
|
||||
!starred
|
||||
);
|
||||
|
||||
// TODO: globals are bad :-/
|
||||
var account = require('state').currentAccount;
|
||||
var folder = require('state').currentFolder;
|
||||
|
||||
Radio.message.trigger('flag', account, folder, this.model, 'flagged', !starred);
|
||||
},
|
||||
openMessage: function(event) {
|
||||
event.stopPropagation();
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
/* global oc_defaults */
|
||||
|
||||
/**
|
||||
* ownCloud - Mail
|
||||
*
|
||||
|
@ -35,52 +33,6 @@ define(function(require) {
|
|||
this.listenTo(Radio.ui, 'folder:changed', this.onFolderChanged);
|
||||
this.listenTo(Radio.folder, 'setactive', this.setFolderActive);
|
||||
},
|
||||
/**
|
||||
* @param {Account} model
|
||||
* @param {boolean} unseen
|
||||
* @returns {undefined}
|
||||
*/
|
||||
changeUnseen: function(model, unseen) {
|
||||
// TODO: currentFolderId and currentAccount should be an attribute of this view
|
||||
var activeFolder = require('state').currentFolder;
|
||||
if (unseen) {
|
||||
activeFolder.set('unseen', activeFolder.get('unseen') + 1);
|
||||
} else {
|
||||
if (activeFolder.get('unseen') > 0) {
|
||||
activeFolder.set('unseen', activeFolder.get('unseen') - 1);
|
||||
}
|
||||
}
|
||||
this.updateTitle();
|
||||
},
|
||||
/**
|
||||
* @returns {undefined}
|
||||
*/
|
||||
updateTitle: function() {
|
||||
var activeEmail = '';
|
||||
if (require('state').currentAccount.get('accountId') !== -1) {
|
||||
var activeAccount = require('state').currentAccount;
|
||||
activeEmail = ' - ' + activeAccount.get('email');
|
||||
}
|
||||
var activeFolder = require('state').currentFolder;
|
||||
var name = activeFolder.name || activeFolder.get('name');
|
||||
var count = 0;
|
||||
if (name === 'Drafts') {
|
||||
count = activeFolder.total || activeFolder.get('total');
|
||||
} else {
|
||||
count = activeFolder.unseen || activeFolder.get('unseen');
|
||||
}
|
||||
if (count > 0) {
|
||||
window.document.title = name + ' (' + count + ')' +
|
||||
// jscs:disable requireCamelCaseOrUpperCaseIdentifiers
|
||||
activeEmail + ' - Mail - ' + oc_defaults.title;
|
||||
// jscs:enable requireCamelCaseOrUpperCaseIdentifiers
|
||||
} else {
|
||||
window.document.title = name + activeEmail +
|
||||
// jscs:disable requireCamelCaseOrUpperCaseIdentifiers
|
||||
' - Mail - ' + oc_defaults.title;
|
||||
// jscs:enable requireCamelCaseOrUpperCaseIdentifiers
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @param {Account} account
|
||||
* @param {Folder} folder
|
||||
|
|
Загрузка…
Ссылка в новой задаче