From d361d1d0a38c70794d8c6e6b5c74f012bec981f3 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Thu, 20 Feb 2020 19:14:34 +0100 Subject: [PATCH] MUC: Include nicks from messages in the mentions auto-complete list --- spec/autocomplete.js | 17 +++++++++++++++-- src/converse-muc-views.js | 7 ++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/spec/autocomplete.js b/spec/autocomplete.js index 51e14d074..9ea88e246 100644 --- a/spec/autocomplete.js +++ b/spec/autocomplete.js @@ -7,7 +7,9 @@ } (this, function (jasmine, mock, test_utils) { "use strict"; const $pres = converse.env.$pres; + const $msg = converse.env.$msg; const Strophe = converse.env.Strophe; + const u = converse.env.utils; describe("The nickname autocomplete feature", function () { @@ -19,6 +21,7 @@ await test_utils.openAndEnterChatRoom(_converse, 'lounge@montague.lit', 'tom'); const view = _converse.chatboxviews.get('lounge@montague.lit'); + // Nicknames from presences ['dick', 'harry'].forEach((nick) => { _converse.connection._dataRecv(test_utils.createRequest( $pres({ @@ -33,6 +36,15 @@ }))); }); + // Nicknames from messages + const msg = $msg({ + from: 'lounge@montague.lit/jane', + id: u.getUniqueId(), + to: 'romeo@montague.lit', + type: 'groupchat' + }).c('body').t('Hello world').tree(); + await view.model.onMessage(msg); + // Test that pressing @ brings up all options const textarea = view.el.querySelector('textarea.chat-textarea'); const at_event = { @@ -46,10 +58,11 @@ textarea.value = '@'; view.onKeyUp(at_event); - expect(view.el.querySelectorAll('.suggestion-box__results li').length).toBe(3); + expect(view.el.querySelectorAll('.suggestion-box__results li').length).toBe(4); expect(view.el.querySelector('.suggestion-box__results li:first-child').textContent).toBe('dick'); expect(view.el.querySelector('.suggestion-box__results li:nth-child(2)').textContent).toBe('harry'); - expect(view.el.querySelector('.suggestion-box__results li:nth-child(3)').textContent).toBe('tom'); + expect(view.el.querySelector('.suggestion-box__results li:nth-child(3)').textContent).toBe('jane'); + expect(view.el.querySelector('.suggestion-box__results li:nth-child(4)').textContent).toBe('tom'); done(); })); diff --git a/src/converse-muc-views.js b/src/converse-muc-views.js index 7ddc7c0de..4849754d7 100644 --- a/src/converse-muc-views.js +++ b/src/converse-muc-views.js @@ -845,7 +845,12 @@ converse.plugins.add('converse-muc-views', { }, getAutoCompleteList () { - return this.model.occupants.filter('nick').map(o => ({'label': o.get('nick'), 'value': `@${o.get('nick')}`})); + // Create an array of unique nicknames based on the occupants and messages. + const nicks = [...new Set([ + ...this.model.occupants.map(o => o.get('nick')), + ...this.model.messages.map(m => m.get('nick')) + ])].filter(n => n); + return nicks.map(nick => ({'label': nick, 'value': `@${nick}`})); }, getAutoCompleteListItem(text, input) {