diff --git a/converse.js b/converse.js index 2dfe59658..2e164eb41 100644 --- a/converse.js +++ b/converse.js @@ -2880,15 +2880,20 @@ this.$el.removeClass(cls); } }, this); - this.$el.addClass(chat_status).data('status', chat_status); if ((ask === 'subscribe') || (subscription === 'from')) { - // if subscription === 'from', then they are subscribed to - // us, but not vice versa. We assume that there is a - // pending subscription from us to them (otherwise we're in - // a state not supported by converse.js), so the user is a - // "pending" contact. + /* ask === 'subscribe' + * Means we have asked to subscribe to them. + * + * subscription === 'from' + * They are subscribed to use, but not vice versa. + * We assume that there is a pending subscription + * from us to them (otherwise we're in a state not + * supported by converse.js). + * + * So in both cases the user is a "pending" contact. + */ this.$el.addClass('pending-xmpp-contact'); this.$el.html(converse.templates.pending_contact( _.extend(item.toJSON(), { @@ -3226,7 +3231,7 @@ initialize: function () { this.model.on("add", function (item) { - this.addRosterItemView(item).updateRoster(item); + this.addRosterItemView(item).renderRosterItem(item).updateRoster(); if (item.get('is_last')) { this.sortRoster().showRoster(); } @@ -3240,7 +3245,7 @@ if ((_.size(item.changed) === 1) && _.contains(_.keys(item.changed), 'sorted')) { return; } - this.updateChatBox(item).updateRoster(item); + this.updateChatBox(item).renderRosterItem(item).updateRoster(); if (item.changed.chat_status) { // A changed chat status implies a new sort order this.sortRoster(); } @@ -3311,52 +3316,40 @@ return this; }, - renderRosterItem: function (item, view) { + renderRosterItem: function (item) { + var $contact_requests = this.$('#xmpp-contact-requests'), + $pending_contacts = this.$('#pending-xmpp-contacts'), + $current_contacts = this.$el.find('.roster-group'), + crit = {order:'asc'}; + var view = this.get(item.id); + if (!view) { + // This method should only be called for items with views. + return; + } if ((converse.show_only_online_users) && (item.get('chat_status') !== 'online')) { view.$el.remove(); view.delegateEvents(); return this; } - // FIXME need to choose proper group - this.$el.find('.roster-group').after(view.render().el); + // TODO: need to choose proper group + // FIXME: DON'T SORT CONTINUOUSLY, SUPER SLOW + // TODO: Insert the item in the correct order + view.render() + if (view.$el.hasClass('current-xmpp-contact')) { + $current_contacts.after(view.el); + $current_contacts.after($current_contacts.siblings('dd.current-xmpp-contact').tsort(crit)); + } else if (view.$el.hasClass('pending-xmpp-contact')) { + $pending_contacts.after(view.el); + $pending_contacts.after($pending_contacts.siblings('dd.pending-xmpp-contact').tsort(crit)); + } else if (view.$el.hasClass('requesting-xmpp-contact')) { + $contact_requests.after(view.render().el); + $contact_requests.after($contact_requests.siblings('dd.requesting-xmpp-contact').tsort(crit)); + } + return this; }, updateRoster: function (item) { - var $contact_requests = this.$el.find('#xmpp-contact-requests'), - $pending_contacts = this.$el.find('#pending-xmpp-contacts'); - if (item) { - var jid = item.id, - view = this.get(item.id), - ask = item.get('ask'), - subscription = item.get('subscription'), - requesting = item.get('requesting'), - crit = {order:'asc'}; - - if ((ask === 'subscribe') && (subscription == 'none')) { - $pending_contacts.after(view.render().el); - $pending_contacts.after($pending_contacts.siblings('dd.pending-xmpp-contact').tsort(crit)); - } else if ((ask === 'subscribe' || ask === null) && (subscription === 'from')) { - // We have accepted an incoming subscription - // request and (automatically) made our own subscription request back. - // - // From what I can tell: (see docs/DEVELOPER.rst) - // if ask == 'subscribe', then the other user is online. - // if ask == null, then the other user is not online currently. - // - // In either case, the other user is now subscribed to - // us (i.e. "from" them to us), and we have a pending - // subscription to them, so we show the user as a - // pending contact. - $pending_contacts.after(view.render().el); - $pending_contacts.after($pending_contacts.siblings('dd.pending-xmpp-contact').tsort(crit)); - } else if (requesting === true) { - $contact_requests.after(view.render().el); - $contact_requests.after($contact_requests.siblings('dd.requesting-xmpp-contact').tsort(crit)); - } else if (subscription === 'both' || subscription === 'to') { - this.renderRosterItem(item, view); - } - } - this.updateCount().toggleHeaders($contact_requests, $pending_contacts); + this.updateCount().toggleHeaders(); converse.emit('rosterViewUpdated'); return this; }, @@ -3370,7 +3363,9 @@ return this; }, - toggleHeaders: function ($contact_requests, $pending_contacts) { + toggleHeaders: function () { + var $contact_requests = this.$('#xmpp-contact-requests'), + $pending_contacts = this.$('#pending-xmpp-contacts'); var $groups = this.$el.find('.roster-group'); // Hide the headers if there are no contacts under them _.each([$groups, $contact_requests, $pending_contacts], function (h) {