feat: Show cc from last email on reply editor (#3983)

* Adds last emails to reply editor

* Fixes bug in reply box

* Adds test cases

* Prevents private notes having cc bcc data

* Prevents private notes having cc bcc data

* Init reply head with values

* fix broken tests

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: Fayaz Ahmed <15716057+fayazara@users.noreply.github.com>
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
This commit is contained in:
Nithin David Thomas 2022-02-28 21:42:50 +05:30 committed by GitHub
parent 1de18391b4
commit eee89bf0d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 74 additions and 3 deletions

View file

@ -190,6 +190,7 @@ export default {
currentChat: 'getSelectedChat', currentChat: 'getSelectedChat',
messageSignature: 'getMessageSignature', messageSignature: 'getMessageSignature',
currentUser: 'getCurrentUser', currentUser: 'getCurrentUser',
lastEmail: 'getLastEmailInSelectedChat',
globalConfig: 'globalConfig/get', globalConfig: 'globalConfig/get',
accountId: 'getCurrentAccountId', accountId: 'getCurrentAccountId',
}), }),
@ -388,6 +389,8 @@ export default {
} else { } else {
this.replyType = REPLY_EDITOR_MODES.NOTE; this.replyType = REPLY_EDITOR_MODES.NOTE;
} }
this.setCCEmailFromLastChat();
}, },
message(updatedMessage) { message(updatedMessage) {
this.hasSlashCommand = this.hasSlashCommand =
@ -409,6 +412,8 @@ export default {
// working even if input/textarea is focussed. // working even if input/textarea is focussed.
document.addEventListener('keydown', this.handleKeyEvents); document.addEventListener('keydown', this.handleKeyEvents);
document.addEventListener('paste', this.onPaste); document.addEventListener('paste', this.onPaste);
this.setCCEmailFromLastChat();
}, },
destroyed() { destroyed() {
document.removeEventListener('keydown', this.handleKeyEvents); document.removeEventListener('keydown', this.handleKeyEvents);
@ -650,11 +655,11 @@ export default {
}); });
} }
if (this.ccEmails) { if (this.ccEmails && !this.isOnPrivateNote) {
messagePayload.ccEmails = this.ccEmails; messagePayload.ccEmails = this.ccEmails;
} }
if (this.bccEmails) { if (this.bccEmails && !this.isOnPrivateNote) {
messagePayload.bccEmails = this.bccEmails; messagePayload.bccEmails = this.bccEmails;
} }
@ -667,6 +672,17 @@ export default {
this.bccEmails = value.bccEmails; this.bccEmails = value.bccEmails;
this.ccEmails = value.ccEmails; this.ccEmails = value.ccEmails;
}, },
setCCEmailFromLastChat() {
if (this.lastEmail) {
const {
content_attributes: { email: emailAttributes = {} },
} = this.lastEmail;
const cc = emailAttributes.cc || [];
const bcc = emailAttributes.bcc || [];
this.ccEmails = cc.join(', ');
this.bccEmails = bcc.join(', ');
}
},
}, },
}; };
</script> </script>

View file

@ -83,6 +83,10 @@ export default {
} }
}, },
}, },
mounted() {
this.ccEmailsVal = this.ccEmails;
this.bccEmailsVal = this.bccEmails;
},
validations: { validations: {
ccEmailsVal: { ccEmailsVal: {
hasValidEmails(value) { hasValidEmails(value) {

View file

@ -70,7 +70,7 @@ export default {
return this.emailAttributes.subject || ''; return this.emailAttributes.subject || '';
}, },
showHead() { showHead() {
return this.toMails || this.ccMails || this.bccMails; return this.toMails || this.ccMails || this.bccMails || this.fromMail;
}, },
}, },
}; };

View file

@ -1,4 +1,5 @@
import authAPI from '../../../api/auth'; import authAPI from '../../../api/auth';
import { MESSAGE_TYPE } from 'shared/constants/messages';
import { applyPageFilters } from './helpers'; import { applyPageFilters } from './helpers';
export const getSelectedChatConversation = ({ export const getSelectedChatConversation = ({
@ -19,6 +20,26 @@ const getters = {
); );
return selectedChat || {}; return selectedChat || {};
}, },
getLastEmailInSelectedChat: (stage, _getters) => {
const selectedChat = _getters.getSelectedChat;
const { messages = [] } = selectedChat;
const lastEmail = [...messages].reverse().find(message => {
const {
content_attributes: contentAttributes = {},
message_type: messageType,
} = message;
const { email = {} } = contentAttributes;
const isIncomingOrOutgoing =
messageType === MESSAGE_TYPE.OUTGOING ||
messageType === MESSAGE_TYPE.INCOMING;
if (email.from && isIncomingOrOutgoing) {
return true;
}
return false;
});
return lastEmail;
},
getMineChats: _state => activeFilters => { getMineChats: _state => activeFilters => {
const currentUserID = authAPI.getCurrentUser().id; const currentUserID = authAPI.getCurrentUser().id;

View file

@ -131,4 +131,34 @@ describe('#getters', () => {
expect(getters.getAppliedConversationFilters(state)).toEqual(filtersList); expect(getters.getAppliedConversationFilters(state)).toEqual(filtersList);
}); });
}); });
describe('#getLastEmailInSelectedChat', () => {
it('Returns cc in last email', () => {
const state = {};
const getSelectedChat = {
messages: [
{
message_type: 1,
content_attributes: {
email: {
from: 'why@how.my',
cc: ['nithin@me.co', 'we@who.why'],
},
},
},
],
};
expect(
getters.getLastEmailInSelectedChat(state, { getSelectedChat })
).toEqual({
message_type: 1,
content_attributes: {
email: {
from: 'why@how.my',
cc: ['nithin@me.co', 'we@who.why'],
},
},
});
});
});
}); });