From 1d53c0f43634b6211c18ad82528066b23a8767ec Mon Sep 17 00:00:00 2001 From: Maksim Sukharev Date: Fri, 30 Jun 2023 15:33:46 +0200 Subject: [PATCH] sort messages within one group Signed-off-by: Maksim Sukharev --- .../MessagesGroup/MessagesSystemGroup.vue | 48 ++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue b/src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue index 6b10c889d7d..e61532f51fa 100644 --- a/src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue +++ b/src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue @@ -73,6 +73,18 @@ import NcButton from '@nextcloud/vue/dist/Components/NcButton.js' import Message from './Message/Message.vue' +// List only sortable messages with order, in which they should be sorted +const MESSAGES = { + user_added: 1, + user_removed: 2, + moderator_promoted: 11, + guest_moderator_promoted: 11, + moderator_demoted: 12, + guest_moderator_demoted: 12, + call_joined: 21, + call_left: 22, +} + export default { name: 'MessagesSystemGroup', @@ -133,7 +145,7 @@ export default { messages: { immediate: true, handler(value) { - this.messagesGroupedBySystemMessage = this.groupMessages(value) + this.messagesGroupedBySystemMessage = this.groupMessages(this.sortMessages(value)) }, }, }, @@ -191,24 +203,46 @@ export default { } // Group users promoted one by one - if (message1.systemMessage === 'moderator_promoted' - && message1.systemMessage === message2.systemMessage) { + if ((message1.systemMessage === 'moderator_promoted' || message1.systemMessage === 'guest_moderator_promoted') + && (message2.systemMessage === 'moderator_promoted' || message2.systemMessage === 'guest_moderator_promoted')) { return 'moderator_promoted' } // Group users demoted one by one - if (message1.systemMessage === 'moderator_demoted' - && message1.systemMessage === message2.systemMessage) { + if ((message1.systemMessage === 'moderator_demoted' || message1.systemMessage === 'guest_moderator_demoted') + && (message2.systemMessage === 'moderator_demoted' || message2.systemMessage === 'guest_moderator_demoted')) { return 'moderator_demoted' } return '' }, - groupMessages() { + sortMessages(messages) { + return messages.sort((message1, message2) => { + // Don't sort messages if they're not intended to be sorted + if (!MESSAGES[message1.systemMessage] || !MESSAGES[message2.systemMessage]) { + return 0 + } + + // Don't sort same system messages between each other + if (MESSAGES[message1.systemMessage] === MESSAGES[message2.systemMessage]) { + return 0 + } + + // Don't sort related system messages from one actor between each other + if (message1.actorId === message2.actorId && message1.actorType === message2.actorType + && Math.abs(MESSAGES[message1.systemMessage] - MESSAGES[message2.systemMessage]) === 1) { + return 0 + } + + return MESSAGES[message1.systemMessage] > MESSAGES[message2.systemMessage] ? 1 : -1 + }) + }, + + groupMessages(messages) { const groups = [] let lastMessage = null - for (const message of this.messages) { + for (const message of messages) { const groupingType = this.messagesShouldBeGrouped(message, lastMessage) if (!groupingType) { groups.push({ messages: [message], type: '', collapsed: true })