From 0a6ca62403fa91f74e054a2de842ae87c7b6c5f9 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Tue, 26 Jul 2016 17:20:09 +0200 Subject: [PATCH 1/2] refactor/restructure 'unseen' flag event handling --- js/controller/messagecontroller.js | 26 ++++++++++++++++++++++++++ js/models/folder.js | 2 +- js/models/message.js | 28 ---------------------------- js/radio.js | 1 + js/service/messageservice.js | 27 +++++++++++++++++++++++++++ js/views/app.js | 8 ++------ js/views/attachment.js | 5 ----- js/views/messages.js | 15 +++++---------- js/views/messagesitem.js | 13 ++++++++----- js/views/navigation-accounts.js | 17 ----------------- 10 files changed, 70 insertions(+), 72 deletions(-) diff --git a/js/controller/messagecontroller.js b/js/controller/messagecontroller.js index 0e5006e8f..95a0366ed 100644 --- a/js/controller/messagecontroller.js +++ b/js/controller/messagecontroller.js @@ -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,31 @@ 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 + // TODO: drafts folder + // TODO: update page title + if (flag === 'unseen') { + var unseen = Math.max(0, prevUnseen + (value ? 1 : -1)); + folder.set('unseen', unseen); + } + + 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.')); + message.get('flags').set(flag, !value); + folder.set('unseen', prevUnseen); + }); + } + /** * @param {Account} account * @param {Folder} folder diff --git a/js/models/folder.js b/js/models/folder.js index 04e7adba7..b90bfdf09 100644 --- a/js/models/folder.js +++ b/js/models/folder.js @@ -5,7 +5,7 @@ * later. See the COPYING file. * * @author Christoph Wurst - * @copyright Christoph Wurst 2015 + * @copyright Christoph Wurst 2015, 2016 */ define(function(require) { diff --git a/js/models/message.js b/js/models/message.js index 28c5d5dc8..b4b628898 100644 --- a/js/models/message.js +++ b/js/models/message.js @@ -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); - } - }); } }); diff --git a/js/radio.js b/js/radio.js index 6cab05684..c7b5ac831 100644 --- a/js/radio.js +++ b/js/radio.js @@ -29,6 +29,7 @@ define(function(require) { var channels = {}; _.each(channelNames, function(channelName) { channels[channelName] = Radio.channel(channelName); + Radio.tuneIn(channelName); }); return channels; diff --git a/js/service/messageservice.js b/js/service/messageservice.js index a093776e8..112b9c7a7 100644 --- a/js/service/messageservice.js +++ b/js/service/messageservice.js @@ -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 diff --git a/js/views/app.js b/js/views/app.js index a9b62c786..be1b694e0 100644 --- a/js/views/app.js +++ b/js/views/app.js @@ -157,14 +157,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() { diff --git a/js/views/attachment.js b/js/views/attachment.js index b2b4cac29..5a45da976 100644 --- a/js/views/attachment.js +++ b/js/views/attachment.js @@ -24,11 +24,6 @@ define(function(require) { }, removeAttachment: function() { this.model.collection.remove(this.model); - }, - - addAttachmentLocal: function() { - console.log('test'); } - }); }); diff --git a/js/views/messages.js b/js/views/messages.js index 3dbee0519..5c930e9bf 100644 --- a/js/views/messages.js +++ b/js/views/messages.js @@ -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) { diff --git a/js/views/messagesitem.js b/js/views/messagesitem.js index 016156350..bd1344b1a 100644 --- a/js/views/messagesitem.js +++ b/js/views/messagesitem.js @@ -5,13 +5,14 @@ * later. See the COPYING file. * * @author Christoph Wurst - * @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(); diff --git a/js/views/navigation-accounts.js b/js/views/navigation-accounts.js index c5b212aa3..55ef67c4a 100644 --- a/js/views/navigation-accounts.js +++ b/js/views/navigation-accounts.js @@ -35,23 +35,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} */ From e6217c8e65f31b4dd998ad75dba4824de06cf9c6 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Tue, 26 Jul 2016 18:55:16 +0200 Subject: [PATCH 2/2] update title if flags change --- js/app.js | 2 +- js/background.js | 2 +- js/controller/messagecontroller.js | 8 ++++++-- js/models/folder.js | 2 +- js/views/{app.js => appview.js} | 32 +++++++++++++++++++++++++++++- js/views/messages.js | 2 +- js/views/navigation-accounts.js | 31 ----------------------------- 7 files changed, 41 insertions(+), 38 deletions(-) rename js/views/{app.js => appview.js} (81%) diff --git a/js/app.js b/js/app.js index c2b1e1616..33293badb 100644 --- a/js/app.js +++ b/js/app.js @@ -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'); diff --git a/js/background.js b/js/background.js index 1eb4e9c37..790f339f4 100644 --- a/js/background.js +++ b/js/background.js @@ -139,7 +139,7 @@ define(function(require) { Cache.addMessageList(changedAccount, localFolder, cachedList); } - State.folderView.updateTitle(); + Radio.ui.trigger('title:update'); }); } }); diff --git a/js/controller/messagecontroller.js b/js/controller/messagecontroller.js index 95a0366ed..6a804c110 100644 --- a/js/controller/messagecontroller.js +++ b/js/controller/messagecontroller.js @@ -173,18 +173,22 @@ define(function(require) { message.get('flags').set(flag, value); // Update folder counter - // TODO: drafts folder - // TODO: update page title 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'); }); } diff --git a/js/models/folder.js b/js/models/folder.js index b90bfdf09..04e7adba7 100644 --- a/js/models/folder.js +++ b/js/models/folder.js @@ -5,7 +5,7 @@ * later. See the COPYING file. * * @author Christoph Wurst - * @copyright Christoph Wurst 2015, 2016 + * @copyright Christoph Wurst 2015 */ define(function(require) { diff --git a/js/views/app.js b/js/views/appview.js similarity index 81% rename from js/views/app.js rename to js/views/appview.js index be1b694e0..3b8cc74f9 100644 --- a/js/views/app.js +++ b/js/views/appview.js @@ -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 @@ -168,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; diff --git a/js/views/messages.js b/js/views/messages.js index 5c930e9bf..31b656d42 100644 --- a/js/views/messages.js +++ b/js/views/messages.js @@ -98,7 +98,7 @@ define(function(require) { } require('state').currentMessageId = messageId; - require('state').folderView.updateTitle(); + Radio.ui.trigger('title:update'); }, selectNextMessage: function() { diff --git a/js/views/navigation-accounts.js b/js/views/navigation-accounts.js index 55ef67c4a..1b7536eb7 100644 --- a/js/views/navigation-accounts.js +++ b/js/views/navigation-accounts.js @@ -1,5 +1,3 @@ -/* global oc_defaults */ - /** * ownCloud - Mail * @@ -35,35 +33,6 @@ define(function(require) { this.listenTo(Radio.ui, 'folder:changed', this.onFolderChanged); this.listenTo(Radio.folder, 'setactive', this.setFolderActive); }, - /** - * @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