From dfbf9e609c4bb02c5c167a8f4ebf37da7a7758d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas.mueller@tmit.eu>
Date: Tue, 23 Sep 2014 10:57:34 +0200
Subject: [PATCH] update answered flag right after reply has been sent

---
 js/mail.js              | 23 +++++++++--------------
 js/models/attachment.js | 34 +++++++++++++++++++++++++++++++++-
 js/send-mail.js         |  4 +++-
 js/views/message.js     | 24 ++++++++++++++++++++----
 4 files changed, 65 insertions(+), 20 deletions(-)

diff --git a/js/mail.js b/js/mail.js
index f605522a5..a652f71f6 100644
--- a/js/mail.js
+++ b/js/mail.js
@@ -82,6 +82,7 @@ var Mail = {
 				return Handlebars.compile(rawTemplate);
 			};
 			Marionette.ItemView.prototype.modelEvents = { "change" : "render"};
+			Marionette.CompositeView.prototype.modelEvents = { "change" : "render"};
 
 			// ask to handle all mailto: links
 			if(window.navigator.registerProtocolHandler) {
@@ -104,6 +105,8 @@ var Mail = {
 			});
 			Mail.State.folderView.render();
 
+			//Mail.State.folderView.listenTo();
+
 			$.ajax(OC.generateUrl('apps/mail/accounts'), {
 				data:{},
 				type:'GET',
@@ -186,12 +189,6 @@ var Mail = {
 				.addClass('icon-loading');
 		},
 
-		clearFolders:function () {
-			var list = $('.mail_folders');
-
-			list.empty();
-		},
-
 		hideMenu:function () {
 			$('#new-message').addClass('hidden');
 		},
@@ -199,10 +196,10 @@ var Mail = {
 		addMessages:function (data) {
 			Mail.State.messageView.collection.add(data);
 
-			_.each($('.avatar'), function(a) {
-				$(a).imageplaceholder($(a).data('user'), $(a).data('user'));
-			}
-			);
+			//_.each($('.avatar'), function(a) {
+			//	$(a).imageplaceholder($(a).data('user'), $(a).data('user'));
+			//}
+			//);
 		},
 
 		loadMessages:function (accountId, folderId, noSelect) {
@@ -502,8 +499,8 @@ var Mail = {
 			// Set active class for current message and remove it from old one
 
 			if(Mail.State.currentMessageId !== null) {
-				$('#mail-message-summary-'+Mail.State.currentMessageId)
-					.removeClass('active');
+				//$('#mail-message-summary-'+Mail.State.currentMessageId).removeClass('active');
+				Mail.State.messageView.setMessageFlag(messageId, 'unseen', false);
 			}
 
 			Mail.State.currentMessageId = messageId;
@@ -518,10 +515,8 @@ var Mail = {
 			$('#mail_messages').addClass('hidden');
 			$('#mail-message').addClass('hidden');
 			$('#mail_new_message').addClass('hidden');
-//			$('#folders').addClass('hidden');
 			$('#app-navigation').removeClass('icon-loading');
 
-//			Mail.UI.clearFolders();
 			Mail.UI.hideMenu();
 
 			$('#mail-setup').removeClass('hidden');
diff --git a/js/models/attachment.js b/js/models/attachment.js
index 96fffbb54..ecfb6504b 100644
--- a/js/models/attachment.js
+++ b/js/models/attachment.js
@@ -19,7 +19,39 @@ models.Attachments = Backbone.Collection.extend({
 	model: models.Attachment
 });
 
-models.Message = Backbone.Model.extend();
+models.MessageFlags = Backbone.Model.extend({
+	defaults: {
+		answered: false
+	}
+});
+
+models.Message = Backbone.Model.extend({
+	defaults: {
+		flags: []
+	},
+
+	initialize: function() {
+		this.set('flags', new models.MessageFlags(this.get('flags')));
+		this.listenTo(this.get('flags'), 'change', this._transformEvent);
+	},
+
+	_transformEvent: function(flags) {
+		this.trigger('change');
+		this.trigger('change:flags', flags);
+	},
+
+	// Custom toJSON
+	toJSON: function() {
+		var data = Backbone.Model.prototype.toJSON.call(this);
+		if (data.flags && data.flags.toJSON) {
+			data.flags = data.flags.toJSON();
+		}
+		if (!data.id) {
+			data.id = this.cid;
+		}
+		return data;
+	}
+});
 
 models.MessageList = Backbone.Collection.extend({
 	model: models.Message
diff --git a/js/send-mail.js b/js/send-mail.js
index 267aa602b..00f3c630a 100644
--- a/js/send-mail.js
+++ b/js/send-mail.js
@@ -70,6 +70,7 @@ $(function () {
 		replyMessageSend.val(t('mail', 'Sending …'));
 		var to = $('.reply-message-fields #to');
 		var cc = $('.reply-message-fields #cc');
+		var messageId = Mail.State.currentMessageId;
 
 		to.prop('disabled', true);
 		cc.prop('disabled', true);
@@ -90,11 +91,12 @@ $(function () {
 				to: to.val(),
 				cc: cc.val(),
 				folderId: Mail.State.currentFolderId,
-				messageId: Mail.State.currentMessageId,
+				messageId: messageId,
 				body:replyMessageBody.val()
 			},
 			type: 'POST',
 			success:function () {
+				Mail.State.messageView.setMessageFlag(messageId, 'answered');
 				OC.msg.finishedAction('#reply-msg', {
 					status: 'success',
 					data: {
diff --git a/js/views/message.js b/js/views/message.js
index d89c5ef11..af207f34e 100644
--- a/js/views/message.js
+++ b/js/views/message.js
@@ -14,6 +14,12 @@ views.Message = Backbone.Marionette.ItemView.extend({
 		// nesting elements during re-render.
 		this.$el.unwrap();
 		this.setElement(this.$el);
+
+		var displayName = this.model.get('from');
+		_.each(this.$el.find('.avatar'), function(a) {
+			$(a).height('32px');
+			$(a).imageplaceholder(displayName, displayName);
+		});
 	}
 
 });
@@ -38,6 +44,16 @@ views.Messages = Backbone.Marionette.CompositeView.extend({
 		this.collection = new models.MessageList();
 	},
 
+	setMessageFlag: function(messageId, flag, val) {
+		val = val || true;
+		var message = this.collection.get(messageId);
+		if (message) {
+			message
+				.get('flags')
+				.set(flag, val);
+		}
+	},
+
 	loadNew: function() {
 		// Add loading feedback
 		$('#load-new-mail-messages')
@@ -82,10 +98,10 @@ views.Messages = Backbone.Marionette.CompositeView.extend({
 					// Add messages
 					Mail.State.messageView.collection.add(jsondata);
 
-					_.each($('.avatar'), function(a) {
-							$(a).imageplaceholder($(a).data('user'), $(a).data('user'));
-						}
-					);
+					//_.each($('.avatar'), function(a) {
+					//		$(a).imageplaceholder($(a).data('user'), $(a).data('user'));
+					//	}
+					//);
 					$('#app-content').removeClass('icon-loading');
 
 					Mail.State.currentMessageId = null;
-- 
GitLab