|
@@ -3373,16 +3373,36 @@
|
|
|
$el.find('.roster-group[data-group="'+HEADER_UNGROUPED+'"]').after(view.el);
|
|
|
} else {
|
|
|
_.each(item.get('groups'), $.proxy(function (group) {
|
|
|
+ var groups, $groups, group_lower, index, header;
|
|
|
var $group = $el.find('.roster-group[data-group="'+group+'"]');
|
|
|
if ($group.length > 0) {
|
|
|
$group.after(view.el);
|
|
|
} else {
|
|
|
- $group = $(converse.templates.group_header({
|
|
|
- label_group: group,
|
|
|
- desc_group_toggle: DESC_GROUP_TOGGLE,
|
|
|
- toggle_state: 'opened' // TODO: remember state...
|
|
|
- })).after(view.el);
|
|
|
- this.getRosterElement().append($group);
|
|
|
+ $groups = $el.find('.roster-group');
|
|
|
+
|
|
|
+ header = $(converse.templates.group_header({
|
|
|
+ label_group: group,
|
|
|
+ desc_group_toggle: DESC_GROUP_TOGGLE,
|
|
|
+ toggle_state: 'opened' // TODO: remember state...
|
|
|
+ })).after(view.el)
|
|
|
+
|
|
|
+ if ($groups.length) {
|
|
|
+ group_lower = group.toLowerCase();
|
|
|
+ groups = $.map($groups, function(o) { return o.dataset.group.toLowerCase(); })
|
|
|
+ groups.push(group_lower);
|
|
|
+ index = groups.sort().indexOf(group_lower);
|
|
|
+ if (index == 0) {
|
|
|
+ $($groups.first()).before(header);
|
|
|
+ } else if (index == groups.length) {
|
|
|
+ $($groups.last()).after(header);
|
|
|
+ } else {
|
|
|
+ $($groups.eq(index)).before(header);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // This shouldn't actually happen, since
|
|
|
+ // there's always the Ungrouped.
|
|
|
+ this.getRosterElement().append(header);
|
|
|
+ }
|
|
|
}
|
|
|
},this));
|
|
|
}
|