diff --git a/src/converse-controlbox.js b/src/converse-controlbox.js index 33b40dc6c..40da297e9 100644 --- a/src/converse-controlbox.js +++ b/src/converse-controlbox.js @@ -7,8 +7,7 @@ /*global define */ (function (root, factory) { - define(["jquery.noconflict", - "converse-core", + define(["converse-core", "lodash.fp", "tpl!add_contact_dropdown", "tpl!add_contact_form", @@ -24,7 +23,6 @@ "converse-profile" ], factory); }(this, function ( - $, converse, fp, tpl_add_contact_dropdown, @@ -41,7 +39,8 @@ const USERS_PANEL_ID = 'users'; const CHATBOX_TYPE = 'chatbox'; - const { Strophe, Backbone, Promise, utils, _, moment } = converse.env; + const { Strophe, Backbone, Promise, _, moment } = converse.env; + const u = converse.env.utils; const CONNECTION_STATUS_CSS_CLASS = { 'Error': 'error', @@ -166,10 +165,10 @@ /* We return the width of the controlbox or its toggle, * depending on which is visible. */ - if (!controlbox || !controlbox.$el.is(':visible')) { - return _converse.controlboxtoggle.$el.outerWidth(true); + if (!controlbox || !u.isVisible(controlbox.el)) { + return u.getOuterWidth(_converse.controlboxtoggle.el, true); } else { - return controlbox.$el.outerWidth(true); + return u.getOuterWidth(controlbox.el, true); } } else { return this.__super__.getChatBoxWidth.apply(this, arguments); @@ -242,7 +241,7 @@ initialize () { if (_.isUndefined(_converse.controlboxtoggle)) { _converse.controlboxtoggle = new _converse.ControlBoxToggle(); - this.$el.insertAfter(_converse.controlboxtoggle.$el); + _converse.controlboxtoggle.el.insertAdjacentElement('afterend', this.el); } this.model.on('change:connected', this.onConnected, this); this.model.on('destroy', this.hide, this); @@ -279,7 +278,7 @@ _converse.connection.disconnecting) { this.renderLoginPanel(); } else if (this.model.get('connected') && - (!this.contactspanel || !this.contactspanel.$el.is(':visible'))) { + (!this.contactspanel || !u.isVisible(this.contactspanel.el))) { this.renderContactsPanel(); } return this; @@ -350,7 +349,7 @@ this.model.save({'active-panel': USERS_PANEL_ID}); } this.contactspanel = new _converse.ContactsPanel({ - '$parent': this.$el.find('.controlbox-panes') + 'parent_el': this.el.querySelector('.controlbox-panes') }); this.contactspanel.insertIntoDOM(); @@ -386,8 +385,8 @@ if (_converse.sticky_controlbox) { return; } - this.$el.addClass('hidden'); - utils.refreshWebkit(); + u.addClass('hidden', this.el); + u.refreshWebkit(); _converse.emit('chatBoxClosed', this); if (!_converse.connection.connected) { _converse.controlboxtoggle.render(); @@ -397,8 +396,7 @@ }, onControlBoxToggleHidden () { - _converse.controlboxtoggle.updateOnlineCount(); - utils.refreshWebkit(); + u.refreshWebkit(); this.model.set('closed', false); this.el.classList.remove('hidden'); _converse.emit('controlBoxOpened', this); @@ -412,17 +410,19 @@ }, switchTab (ev) { - // TODO: automatically focus the relevant input if (ev && ev.preventDefault) { ev.preventDefault(); } - const $tab = $(ev.target), - $sibling = $tab.parent().siblings('li').children('a'), - $tab_panel = $($tab.attr('href')); - $($sibling.attr('href')).addClass('hidden'); - $sibling.removeClass('current'); - $tab.addClass('current'); - $tab_panel.removeClass('hidden'); + const tab = ev.target, + sibling_li = tab.parentNode.nextElementSibling || tab.parentNode.previousElementSibling, + sibling = sibling_li.firstChild, + sibling_panel = document.querySelector(sibling.getAttribute('href')), + tab_panel = document.querySelector(tab.getAttribute('href')); + + u.hideElement(sibling_panel); + u.removeClass('current', sibling); + u.addClass('current', tab); + u.removeClass('hidden', tab_panel); if (!_.isUndefined(_converse.chatboxes.browserStorage)) { - this.model.save({'active-panel': $tab.data('id')}); + this.model.save({'active-panel': tab.getAttribute('data-id')}); } return this; }, @@ -490,7 +490,7 @@ if (jid_element.value && !_converse.locked_domain && !_converse.default_domain && - !utils.isValidJID(jid_element.value)) { + !u.isValidJID(jid_element.value)) { jid_element.setCustomValidity(__('Please enter a valid XMPP address')); return false; } @@ -551,7 +551,7 @@ }, initialize (cfg) { - this.parent_el = cfg.$parent[0]; + this.parent_el = cfg.parent_el; this.tab_el = document.createElement('li'); _converse.chatboxes.on('change:num_unread', this.renderTab, this); _converse.chatboxes.on('add', _.debounce(this.renderTab, 100), this); @@ -585,11 +585,11 @@ renderTab () { const controlbox = _converse.chatboxes.get('controlbox'); - const chats = fp.filter(_.partial(utils.isOfType, CHATBOX_TYPE), _converse.chatboxes.models); + const chats = fp.filter(_.partial(u.isOfType, CHATBOX_TYPE), _converse.chatboxes.models); this.tab_el.innerHTML = tpl_contacts_tab({ 'label_contacts': LABEL_CONTACTS, 'is_current': controlbox.get('active-panel') === USERS_PANEL_ID, - 'num_unread': fp.sum(fp.map(fp.curry(utils.getAttribute)('num_unread'), chats)) + 'num_unread': fp.sum(fp.map(fp.curry(u.getAttribute)('num_unread'), chats)) }); }, @@ -620,8 +620,8 @@ ev.preventDefault(); this.el.querySelector('.search-xmpp div').innerHTML = this.generateAddContactHTML(); var dropdown = this.el.querySelector('.contact-form-container'); - utils.slideToggleElement(dropdown).then(() => { - if (utils.isVisible(dropdown)) { + u.slideToggleElement(dropdown).then(() => { + if (u.isVisible(dropdown)) { dropdown.querySelector('input.username').focus(); } }); @@ -629,26 +629,44 @@ searchContacts (ev) { ev.preventDefault(); - $.getJSON(_converse.xhr_user_search_url+ "?q=" + $(ev.target).find('input.username').val(), function (data) { - const title_subscribe = __('Click to add as a chat contact'); - const no_users_text = __('No users found'); - const $ul= $('.search-xmpp ul'); - $ul.find('li.found-user').remove(); - $ul.find('li.chat-info').remove(); - if (!data.length) { - $ul.append(`