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:
Jan-Christoph Borchardt 2016-07-27 11:44:17 +02:00 коммит произвёл GitHub
Родитель f0082443c9 e6217c8e65
Коммит 6b63f50765
11 изменённых файлов: 107 добавлений и 106 удалений

Просмотреть файл

@ -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