fixes #3165
Use configured nickname in profile view in the control box. Remove doc for the unimplemented `fullname` setting.
This commit is contained in:
parent
0a338feb40
commit
27a47c6ee8
|
@ -7,7 +7,9 @@
|
||||||
- Fix `autojoin` checkbox state in MUC bookmark form
|
- Fix `autojoin` checkbox state in MUC bookmark form
|
||||||
- Remove call to `api.confirm` in `@converse/headless`
|
- Remove call to `api.confirm` in `@converse/headless`
|
||||||
- Generate TypeScript declaration files into `dist/types`
|
- Generate TypeScript declaration files into `dist/types`
|
||||||
|
- Removed documentation about the no longer implemented `fullname` option.
|
||||||
- #3156: Add function to prevent drag stutter effect over iframes when resize is called in overlay mode
|
- #3156: Add function to prevent drag stutter effect over iframes when resize is called in overlay mode
|
||||||
|
- #3165: Use configured nickname in profile view in the control box
|
||||||
|
|
||||||
- New config option [stanza_timeout](https://conversejs.org/docs/html/configuration.html#stanza-timeout)
|
- New config option [stanza_timeout](https://conversejs.org/docs/html/configuration.html#stanza-timeout)
|
||||||
|
|
||||||
|
|
|
@ -925,12 +925,6 @@ filter_url_query_params
|
||||||
|
|
||||||
Accepts a string or array of strings. Any query strings from URLs that match this setting will be removed.
|
Accepts a string or array of strings. Any query strings from URLs that match this setting will be removed.
|
||||||
|
|
||||||
fullname
|
|
||||||
--------
|
|
||||||
|
|
||||||
If you are using prebinding, can specify the fullname of the currently
|
|
||||||
logged in user, otherwise the user's vCard will be fetched.
|
|
||||||
|
|
||||||
geouri_regex
|
geouri_regex
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,8 @@ module.exports = function(config) {
|
||||||
{ pattern: "src/plugins/omemo/tests/muc.js", type: 'module' },
|
{ pattern: "src/plugins/omemo/tests/muc.js", type: 'module' },
|
||||||
{ pattern: "src/plugins/omemo/tests/omemo.js", type: 'module' },
|
{ pattern: "src/plugins/omemo/tests/omemo.js", type: 'module' },
|
||||||
{ pattern: "src/plugins/profile/tests/password-reset.js", type: 'module' },
|
{ pattern: "src/plugins/profile/tests/password-reset.js", type: 'module' },
|
||||||
|
{ pattern: "src/plugins/profile/tests/profile.js", type: 'module' },
|
||||||
|
{ pattern: "src/plugins/profile/tests/status.js", type: 'module' },
|
||||||
{ pattern: "src/plugins/push/tests/push.js", type: 'module' },
|
{ pattern: "src/plugins/push/tests/push.js", type: 'module' },
|
||||||
{ pattern: "src/plugins/register/tests/register.js", type: 'module' },
|
{ pattern: "src/plugins/register/tests/register.js", type: 'module' },
|
||||||
{ pattern: "src/plugins/roomslist/tests/roomslist.js", type: 'module' },
|
{ pattern: "src/plugins/roomslist/tests/roomslist.js", type: 'module' },
|
||||||
|
|
|
@ -5,11 +5,11 @@ import { _converse, api, converse } from '@converse/headless/core';
|
||||||
|
|
||||||
const { Strophe, $pres } = converse.env;
|
const { Strophe, $pres } = converse.env;
|
||||||
|
|
||||||
const XMPPStatus = Model.extend({
|
export default class XMPPStatus extends Model {
|
||||||
|
|
||||||
defaults () {
|
defaults () { // eslint-disable-line class-methods-use-this
|
||||||
return { "status": api.settings.get("default_state") }
|
return { "status": api.settings.get("default_state") }
|
||||||
},
|
}
|
||||||
|
|
||||||
initialize () {
|
initialize () {
|
||||||
this.on('change', item => {
|
this.on('change', item => {
|
||||||
|
@ -20,16 +20,19 @@ const XMPPStatus = Model.extend({
|
||||||
api.user.presence.send(this.get('status'), null, this.get('status_message'));
|
api.user.presence.send(this.get('status'), null, this.get('status_message'));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
}
|
||||||
|
|
||||||
getNickname () {
|
getDisplayName () {
|
||||||
|
return this.getFullname() || this.getNickname() || _converse.bare_jid;
|
||||||
|
}
|
||||||
|
|
||||||
|
getNickname () { // eslint-disable-line class-methods-use-this
|
||||||
return api.settings.get('nickname');
|
return api.settings.get('nickname');
|
||||||
},
|
}
|
||||||
|
|
||||||
getFullname () {
|
getFullname () { // eslint-disable-line class-methods-use-this
|
||||||
// Gets overridden in converse-vcard
|
return ''; // Gets overridden in converse-vcard
|
||||||
return '';
|
}
|
||||||
},
|
|
||||||
|
|
||||||
/** Constructs a presence stanza
|
/** Constructs a presence stanza
|
||||||
* @param { string } [type]
|
* @param { string } [type]
|
||||||
|
@ -85,6 +88,4 @@ const XMPPStatus = Model.extend({
|
||||||
presence = await api.hook('constructedPresence', null, presence);
|
presence = await api.hook('constructedPresence', null, presence);
|
||||||
return presence;
|
return presence;
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
export default XMPPStatus;
|
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
const $msg = converse.env.$msg;
|
const $msg = converse.env.$msg;
|
||||||
const u = converse.env.utils;
|
const u = converse.env.utils;
|
||||||
const Strophe = converse.env.Strophe;
|
|
||||||
|
|
||||||
describe("The Controlbox", function () {
|
describe("The Controlbox", function () {
|
||||||
|
|
||||||
|
@ -105,67 +104,4 @@ describe("The Controlbox", function () {
|
||||||
await u.waitUntil(() => rosterview.querySelector('.msgs-indicator') === null);
|
await u.waitUntil(() => rosterview.querySelector('.msgs-indicator') === null);
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("The Status Widget", function () {
|
|
||||||
|
|
||||||
it("shows the user's chat status, which is online by default",
|
|
||||||
mock.initConverse([], {}, async function (_converse) {
|
|
||||||
mock.openControlBox(_converse);
|
|
||||||
const view = await u.waitUntil(() => document.querySelector('converse-user-profile'));
|
|
||||||
expect(u.hasClass('online', view.querySelector('.xmpp-status span:first-child'))).toBe(true);
|
|
||||||
expect(view.querySelector('.xmpp-status span.online').textContent.trim()).toBe('I am online');
|
|
||||||
}));
|
|
||||||
|
|
||||||
it("can be used to set the current user's chat status",
|
|
||||||
mock.initConverse([], {}, async function (_converse) {
|
|
||||||
|
|
||||||
await mock.openControlBox(_converse);
|
|
||||||
const cbview = _converse.chatboxviews.get('controlbox');
|
|
||||||
cbview.querySelector('.change-status').click()
|
|
||||||
const modal = _converse.api.modal.get('converse-chat-status-modal');
|
|
||||||
await u.waitUntil(() => u.isVisible(modal), 1000);
|
|
||||||
modal.querySelector('label[for="radio-busy"]').click(); // Change status to "dnd"
|
|
||||||
modal.querySelector('[type="submit"]').click();
|
|
||||||
const sent_stanzas = _converse.connection.sent_stanzas;
|
|
||||||
const sent_presence = await u.waitUntil(() => sent_stanzas.filter(s => Strophe.serialize(s).match('presence')).pop());
|
|
||||||
expect(Strophe.serialize(sent_presence)).toBe(
|
|
||||||
`<presence xmlns="jabber:client">`+
|
|
||||||
`<show>dnd</show>`+
|
|
||||||
`<priority>0</priority>`+
|
|
||||||
`<c hash="sha-1" node="https://conversejs.org" ver="TfHz9vOOfqIG0Z9lW5CuPaWGnrQ=" xmlns="http://jabber.org/protocol/caps"/>`+
|
|
||||||
`</presence>`);
|
|
||||||
const view = await u.waitUntil(() => document.querySelector('converse-user-profile'));
|
|
||||||
const first_child = view.querySelector('.xmpp-status span:first-child');
|
|
||||||
expect(u.hasClass('online', first_child)).toBe(false);
|
|
||||||
expect(u.hasClass('dnd', first_child)).toBe(true);
|
|
||||||
expect(view.querySelector('.xmpp-status span:first-child').textContent.trim()).toBe('I am busy');
|
|
||||||
}));
|
|
||||||
|
|
||||||
it("can be used to set a custom status message",
|
|
||||||
mock.initConverse([], {}, async function (_converse) {
|
|
||||||
|
|
||||||
await mock.openControlBox(_converse);
|
|
||||||
const cbview = _converse.chatboxviews.get('controlbox');
|
|
||||||
cbview.querySelector('.change-status').click()
|
|
||||||
const modal = _converse.api.modal.get('converse-chat-status-modal');
|
|
||||||
|
|
||||||
await u.waitUntil(() => u.isVisible(modal), 1000);
|
|
||||||
const msg = 'I am happy';
|
|
||||||
modal.querySelector('input[name="status_message"]').value = msg;
|
|
||||||
modal.querySelector('[type="submit"]').click();
|
|
||||||
const sent_stanzas = _converse.connection.sent_stanzas;
|
|
||||||
const sent_presence = await u.waitUntil(() => sent_stanzas.filter(s => Strophe.serialize(s).match('presence')).pop());
|
|
||||||
expect(Strophe.serialize(sent_presence)).toBe(
|
|
||||||
`<presence xmlns="jabber:client">`+
|
|
||||||
`<status>I am happy</status>`+
|
|
||||||
`<priority>0</priority>`+
|
|
||||||
`<c hash="sha-1" node="https://conversejs.org" ver="TfHz9vOOfqIG0Z9lW5CuPaWGnrQ=" xmlns="http://jabber.org/protocol/caps"/>`+
|
|
||||||
`</presence>`);
|
|
||||||
|
|
||||||
const view = await u.waitUntil(() => document.querySelector('converse-user-profile'));
|
|
||||||
const first_child = view.querySelector('.xmpp-status span:first-child');
|
|
||||||
expect(u.hasClass('online', first_child)).toBe(true);
|
|
||||||
expect(view.querySelector('.xmpp-status span:first-child').textContent.trim()).toBe(msg);
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'shared/avatar/avatar.js';
|
import 'shared/avatar/avatar.js';
|
||||||
import { __ } from 'i18n';
|
import { __ } from 'i18n';
|
||||||
import { _converse, api } from "@converse/headless/core";
|
import { api } from "@converse/headless/core";
|
||||||
import { getPrettyStatus, logOut } from '../utils.js';
|
import { getPrettyStatus, logOut } from '../utils.js';
|
||||||
import { html } from "lit";
|
import { html } from "lit";
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@ function tplUserSettingsButton (o) {
|
||||||
|
|
||||||
export default (el) => {
|
export default (el) => {
|
||||||
const chat_status = el.model.get('status') || 'offline';
|
const chat_status = el.model.get('status') || 'offline';
|
||||||
const fullname = el.model.vcard?.get('fullname') || el.model.vcard?.get('nickname') || _converse.bare_jid;
|
|
||||||
const status_message = el.model.get('status_message') || __("I am %1$s", getPrettyStatus(chat_status));
|
const status_message = el.model.get('status_message') || __("I am %1$s", getPrettyStatus(chat_status));
|
||||||
const i18n_change_status = __('Click to change your chat status');
|
const i18n_change_status = __('Click to change your chat status');
|
||||||
const show_settings_button = api.settings.get('show_client_info') || api.settings.get('allow_adhoc_commands');
|
const show_settings_button = api.settings.get('show_client_info') || api.settings.get('allow_adhoc_commands');
|
||||||
|
@ -44,7 +43,7 @@ export default (el) => {
|
||||||
nonce=${el.model.vcard?.get('vcard_updated')}
|
nonce=${el.model.vcard?.get('vcard_updated')}
|
||||||
height="40" width="40"></converse-avatar>
|
height="40" width="40"></converse-avatar>
|
||||||
</a>
|
</a>
|
||||||
<span class="username w-100 align-self-center">${fullname}</span>
|
<span class="username w-100 align-self-center">${el.model.getDisplayName()}</span>
|
||||||
${show_settings_button ? tplUserSettingsButton(el) : ''}
|
${show_settings_button ? tplUserSettingsButton(el) : ''}
|
||||||
${api.settings.get('allow_logout') ? tplSignout() : ''}
|
${api.settings.get('allow_logout') ? tplSignout() : ''}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*global mock, converse */
|
||||||
|
|
||||||
|
const u = converse.env.utils;
|
||||||
|
|
||||||
|
describe("The Controlbox", function () {
|
||||||
|
describe("The user profile", function () {
|
||||||
|
|
||||||
|
it("shows the user's configured nickname",
|
||||||
|
mock.initConverse([], { blacklisted_plugins: ['converse-vcard'], nickname: 'nicky'},
|
||||||
|
async function (_converse) {
|
||||||
|
|
||||||
|
mock.openControlBox(_converse);
|
||||||
|
const el = await u.waitUntil(() => document.querySelector('converse-user-profile .username'));
|
||||||
|
expect(el.textContent).toBe('nicky');
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*global mock, converse */
|
||||||
|
|
||||||
|
const u = converse.env.utils;
|
||||||
|
const Strophe = converse.env.Strophe;
|
||||||
|
|
||||||
|
describe("The Controlbox", function () {
|
||||||
|
describe("The Status Widget", function () {
|
||||||
|
|
||||||
|
it("shows the user's chat status, which is online by default",
|
||||||
|
mock.initConverse([], {}, async function (_converse) {
|
||||||
|
mock.openControlBox(_converse);
|
||||||
|
const view = await u.waitUntil(() => document.querySelector('converse-user-profile'));
|
||||||
|
expect(u.hasClass('online', view.querySelector('.xmpp-status span:first-child'))).toBe(true);
|
||||||
|
expect(view.querySelector('.xmpp-status span.online').textContent.trim()).toBe('I am online');
|
||||||
|
}));
|
||||||
|
|
||||||
|
it("can be used to set the current user's chat status",
|
||||||
|
mock.initConverse([], {}, async function (_converse) {
|
||||||
|
|
||||||
|
await mock.openControlBox(_converse);
|
||||||
|
const cbview = _converse.chatboxviews.get('controlbox');
|
||||||
|
cbview.querySelector('.change-status').click()
|
||||||
|
const modal = _converse.api.modal.get('converse-chat-status-modal');
|
||||||
|
await u.waitUntil(() => u.isVisible(modal), 1000);
|
||||||
|
modal.querySelector('label[for="radio-busy"]').click(); // Change status to "dnd"
|
||||||
|
modal.querySelector('[type="submit"]').click();
|
||||||
|
const sent_stanzas = _converse.connection.sent_stanzas;
|
||||||
|
const sent_presence = await u.waitUntil(() => sent_stanzas.filter(s => Strophe.serialize(s).match('presence')).pop());
|
||||||
|
expect(Strophe.serialize(sent_presence)).toBe(
|
||||||
|
`<presence xmlns="jabber:client">`+
|
||||||
|
`<show>dnd</show>`+
|
||||||
|
`<priority>0</priority>`+
|
||||||
|
`<c hash="sha-1" node="https://conversejs.org" ver="TfHz9vOOfqIG0Z9lW5CuPaWGnrQ=" xmlns="http://jabber.org/protocol/caps"/>`+
|
||||||
|
`</presence>`);
|
||||||
|
const view = await u.waitUntil(() => document.querySelector('converse-user-profile'));
|
||||||
|
const first_child = view.querySelector('.xmpp-status span:first-child');
|
||||||
|
expect(u.hasClass('online', first_child)).toBe(false);
|
||||||
|
expect(u.hasClass('dnd', first_child)).toBe(true);
|
||||||
|
expect(view.querySelector('.xmpp-status span:first-child').textContent.trim()).toBe('I am busy');
|
||||||
|
}));
|
||||||
|
|
||||||
|
it("can be used to set a custom status message",
|
||||||
|
mock.initConverse([], {}, async function (_converse) {
|
||||||
|
|
||||||
|
await mock.openControlBox(_converse);
|
||||||
|
const cbview = _converse.chatboxviews.get('controlbox');
|
||||||
|
cbview.querySelector('.change-status').click()
|
||||||
|
const modal = _converse.api.modal.get('converse-chat-status-modal');
|
||||||
|
|
||||||
|
await u.waitUntil(() => u.isVisible(modal), 1000);
|
||||||
|
const msg = 'I am happy';
|
||||||
|
modal.querySelector('input[name="status_message"]').value = msg;
|
||||||
|
modal.querySelector('[type="submit"]').click();
|
||||||
|
const sent_stanzas = _converse.connection.sent_stanzas;
|
||||||
|
const sent_presence = await u.waitUntil(() => sent_stanzas.filter(s => Strophe.serialize(s).match('presence')).pop());
|
||||||
|
expect(Strophe.serialize(sent_presence)).toBe(
|
||||||
|
`<presence xmlns="jabber:client">`+
|
||||||
|
`<status>I am happy</status>`+
|
||||||
|
`<priority>0</priority>`+
|
||||||
|
`<c hash="sha-1" node="https://conversejs.org" ver="TfHz9vOOfqIG0Z9lW5CuPaWGnrQ=" xmlns="http://jabber.org/protocol/caps"/>`+
|
||||||
|
`</presence>`);
|
||||||
|
|
||||||
|
const view = await u.waitUntil(() => document.querySelector('converse-user-profile'));
|
||||||
|
const first_child = view.querySelector('.xmpp-status span:first-child');
|
||||||
|
expect(u.hasClass('online', first_child)).toBe(true);
|
||||||
|
expect(view.querySelector('.xmpp-status span:first-child').textContent.trim()).toBe(msg);
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
|
@ -643,31 +643,8 @@ function clearStores () {
|
||||||
window.sessionStorage.removeItem(cache_key+'fetched');
|
window.sessionStorage.removeItem(cache_key+'fetched');
|
||||||
}
|
}
|
||||||
|
|
||||||
const theme = ['dracula', 'classic', 'concord'][Math.floor(Math.random()*3)];
|
function getMockVcardFetcher (settings) {
|
||||||
|
return (model, force) => {
|
||||||
async function _initConverse (settings) {
|
|
||||||
clearStores();
|
|
||||||
await clearIndexedDB();
|
|
||||||
|
|
||||||
_converse = await converse.initialize(Object.assign({
|
|
||||||
'animate': false,
|
|
||||||
'auto_subscribe': false,
|
|
||||||
'bosh_service_url': 'montague.lit/http-bind',
|
|
||||||
'discover_connection_methods': false,
|
|
||||||
'enable_smacks': false,
|
|
||||||
'i18n': 'en',
|
|
||||||
'loglevel': 'debug',
|
|
||||||
'no_trimming': true,
|
|
||||||
'persistent_store': 'localStorage',
|
|
||||||
'play_sounds': false,
|
|
||||||
'theme': theme,
|
|
||||||
'use_emojione': false,
|
|
||||||
'view_mode': view_mode
|
|
||||||
}, settings || {}));
|
|
||||||
|
|
||||||
window._converse = _converse;
|
|
||||||
|
|
||||||
_converse.api.vcard.get = function (model, force) {
|
|
||||||
let jid;
|
let jid;
|
||||||
if (typeof model === 'string' || model instanceof String) {
|
if (typeof model === 'string' || model instanceof String) {
|
||||||
jid = model;
|
jid = model;
|
||||||
|
@ -702,7 +679,37 @@ async function _initConverse (settings) {
|
||||||
'vcard_updated': dayjs().format(),
|
'vcard_updated': dayjs().format(),
|
||||||
'vcard_error': undefined
|
'vcard_error': undefined
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const theme = ['dracula', 'classic', 'concord'][Math.floor(Math.random()*3)];
|
||||||
|
|
||||||
|
async function _initConverse (settings) {
|
||||||
|
clearStores();
|
||||||
|
await clearIndexedDB();
|
||||||
|
|
||||||
|
_converse = await converse.initialize(Object.assign({
|
||||||
|
'animate': false,
|
||||||
|
'auto_subscribe': false,
|
||||||
|
'bosh_service_url': 'montague.lit/http-bind',
|
||||||
|
'discover_connection_methods': false,
|
||||||
|
'enable_smacks': false,
|
||||||
|
'i18n': 'en',
|
||||||
|
'loglevel': 'debug',
|
||||||
|
'no_trimming': true,
|
||||||
|
'persistent_store': 'localStorage',
|
||||||
|
'play_sounds': false,
|
||||||
|
'theme': theme,
|
||||||
|
'use_emojione': false,
|
||||||
|
'view_mode': view_mode
|
||||||
|
}, settings || {}));
|
||||||
|
|
||||||
|
window._converse = _converse;
|
||||||
|
|
||||||
|
if (_converse.api.vcard) {
|
||||||
|
_converse.api.vcard.get = getMockVcardFetcher(settings);
|
||||||
|
}
|
||||||
|
|
||||||
if (settings?.auto_login !== false) {
|
if (settings?.auto_login !== false) {
|
||||||
_converse.api.user.login('romeo@montague.lit/orchard', 'secret');
|
_converse.api.user.login('romeo@montague.lit/orchard', 'secret');
|
||||||
await _converse.api.waitUntil('afterResourceBinding');
|
await _converse.api.waitUntil('afterResourceBinding');
|
||||||
|
|
Loading…
Reference in New Issue