buddy list: Use user_ids in DOM list elements.

This commit is contained in:
Steve Howell
2016-11-17 14:16:29 -08:00
committed by Tim Abbott
parent 78474c8bee
commit aadfe133e2
8 changed files with 87 additions and 61 deletions

View File

@@ -52,6 +52,8 @@ global.people.add(mark);
global.people.add(norbert);
var people = global.people;
var activity = require('js/activity.js');
activity.update_huddles = function () {};
@@ -75,10 +77,10 @@ activity.update_huddles = function () {};
(function test_process_loaded_messages() {
var huddle1 = 'bar@zulip.com,foo@zulip.com';
var huddle1 = 'jill@zulip.com,norbert@zulip.com';
var timestamp1 = 1382479029; // older
var huddle2 = 'alice@zulip.com,bob@zulip.com';
var huddle2 = 'alice@zulip.com,fred@zulip.com';
var timestamp2 = 1382479033; // newer
var old_timestamp = 1382479000;
@@ -110,44 +112,56 @@ activity.update_huddles = function () {};
activity.process_loaded_messages(messages);
assert.deepEqual(activity.get_huddles(), [huddle2, huddle1]);
var user_ids_string1 = people.emails_strings_to_user_ids_string(huddle1);
var user_ids_string2 = people.emails_strings_to_user_ids_string(huddle2);
assert.deepEqual(activity.get_huddles(), [user_ids_string2, user_ids_string1]);
}());
(function test_full_huddle_name() {
function full_name(emails_string) {
var user_ids_string = people.emails_strings_to_user_ids_string(emails_string);
return activity.full_huddle_name(user_ids_string);
}
assert.equal(
activity.full_huddle_name('alice@zulip.com,jill@zulip.com'),
full_name('alice@zulip.com,jill@zulip.com'),
'Alice Smith, Jill Hill'
);
assert.equal(
activity.full_huddle_name('alice@zulip.com,fred@zulip.com,jill@zulip.com'),
full_name('alice@zulip.com,fred@zulip.com,jill@zulip.com'),
'Alice Smith, Fred Flintstone, Jill Hill'
);
}());
(function test_short_huddle_name() {
function short_name(emails_string) {
var user_ids_string = people.emails_strings_to_user_ids_string(emails_string);
return activity.short_huddle_name(user_ids_string);
}
assert.equal(
activity.short_huddle_name('alice@zulip.com'),
short_name('alice@zulip.com'),
'Alice Smith'
);
assert.equal(
activity.short_huddle_name('alice@zulip.com,jill@zulip.com'),
short_name('alice@zulip.com,jill@zulip.com'),
'Alice Smith, Jill Hill'
);
assert.equal(
activity.short_huddle_name('alice@zulip.com,fred@zulip.com,jill@zulip.com'),
short_name('alice@zulip.com,fred@zulip.com,jill@zulip.com'),
'Alice Smith, Fred Flintstone, Jill Hill'
);
assert.equal(
activity.short_huddle_name('alice@zulip.com,fred@zulip.com,jill@zulip.com,mark@zulip.com'),
short_name('alice@zulip.com,fred@zulip.com,jill@zulip.com,mark@zulip.com'),
'Alice Smith, Fred Flintstone, Jill Hill, + 1 other'
);
assert.equal(
activity.short_huddle_name('alice@zulip.com,fred@zulip.com,jill@zulip.com,mark@zulip.com,norbert@zulip.com'),
short_name('alice@zulip.com,fred@zulip.com,jill@zulip.com,mark@zulip.com,norbert@zulip.com'),
'Alice Smith, Fred Flintstone, Jill Hill, + 2 others'
);
@@ -155,6 +169,7 @@ activity.update_huddles = function () {};
(function test_huddle_fraction_present() {
var huddle = 'alice@zulip.com,fred@zulip.com,jill@zulip.com,mark@zulip.com';
huddle = people.emails_strings_to_user_ids_string(huddle);
var presence_list = {};
presence_list[alice.user_id] = {status: 'active'};

View File

@@ -84,31 +84,31 @@ activity.presence_info[norbert.user_id] = {status: activity.ACTIVE};
var users = activity.update_users();
assert.deepEqual(users, [
{ name: 'Fred Flintstone',
email: 'fred@zulip.com',
user_id: fred.user_id,
num_unread: 0,
type: 'active',
type_desc: 'is active',
mobile: undefined },
{ name: 'Jill Hill',
email: 'jill@zulip.com',
user_id: jill.user_id,
num_unread: 0,
type: 'active',
type_desc: 'is active',
mobile: undefined },
{ name: 'Norbert Oswald',
email: 'norbert@zulip.com',
user_id: norbert.user_id,
num_unread: 0,
type: 'active',
type_desc: 'is active',
mobile: undefined },
{ name: 'Alice Smith',
email: 'alice@zulip.com',
user_id: alice.user_id,
num_unread: 0,
type: 'idle',
type_desc: 'is not active',
mobile: undefined },
{ name: 'Marky Mark',
email: 'mark@zulip.com',
user_id: mark.user_id,
num_unread: 0,
type: 'idle',
type_desc: 'is not active',
@@ -126,7 +126,7 @@ activity.presence_info[norbert.user_id] = {status: activity.ACTIVE};
users = activity.update_users(users);
assert.deepEqual(users, [
{ name: 'Alice Smith',
email: 'alice@zulip.com',
user_id: alice.user_id,
num_unread: 0,
type: 'active',
type_desc: 'is active',
@@ -143,7 +143,7 @@ activity.presence_info[norbert.user_id] = {status: activity.ACTIVE};
users = activity.update_users(users);
assert.deepEqual(users, [
{ name: 'Marky Mark',
email: 'mark@zulip.com',
user_id: mark.user_id,
num_unread: 0,
type: 'active',
type_desc: 'is active',

View File

@@ -73,16 +73,16 @@ function update_count_in_dom(count_span, value_span, count) {
value_span.text(count);
}
function get_filter_li(name) {
function get_filter_li(user_ids_string) {
if (name.indexOf(",") < 0) {
return $("li.user_sidebar_entry[data-email='" + name + "']");
return $("li.user_sidebar_entry[data-user-id='" + user_ids_string + "']");
} else {
return $("li.group-pms-sidebar-entry[data-emails='" + name + "']");
return $("li.group-pms-sidebar-entry[data-user-ids='" + user_ids_string + "']");
}
}
function set_count(name, count) {
var count_span = get_filter_li(name).find('.count');
function set_count(user_ids_string, count) {
var count_span = get_filter_li(user_ids_string).find('.count');
var value_span = count_span.find('.value');
update_count_in_dom(count_span, value_span, count);
}
@@ -93,8 +93,7 @@ exports.update_dom_with_unread_counts = function (counts) {
counts.pm_count.each(function (count, user_ids_string) {
// TODO: just use user_ids_string in our markup
var emails_string = people.user_ids_string_to_emails_string(user_ids_string);
set_count(emails_string, count);
set_count(user_ids_string, count);
});
};
@@ -104,10 +103,17 @@ exports.process_loaded_messages = function (messages) {
_.each(messages, function (message) {
if (message.type === 'private') {
if (message.reply_to.indexOf(',') > 0) {
var old_timestamp = huddle_timestamps.get(message.reply_to);
var user_ids_string = people.emails_strings_to_user_ids_string(
message.reply_to);
if (!user_ids_string) {
blueslip.warn('Bad reply_to for huddle: ' + message.reply_to);
}
var old_timestamp = huddle_timestamps.get(user_ids_string);
if (!old_timestamp || (old_timestamp < message.timestamp)) {
huddle_timestamps.set(message.reply_to, message.timestamp);
huddle_timestamps.set(user_ids_string, message.timestamp);
need_resize = true;
}
}
@@ -130,25 +136,25 @@ exports.get_huddles = function () {
};
exports.full_huddle_name = function (huddle) {
var emails = huddle.split(',');
var user_ids = huddle.split(',');
var names = _.map(emails, function (email) {
var person = people.get_by_email(email);
return person ? person.full_name : email;
var names = _.map(user_ids, function (user_id) {
var person = people.get_person_from_user_id(user_id);
return person.full_name;
});
return names.join(', ');
};
exports.short_huddle_name = function (huddle) {
var emails = huddle.split(',');
var user_ids = huddle.split(',');
var num_to_show = 3;
var names = _.map(emails.slice(0, num_to_show), function (email) {
var person = people.get_by_email(email);
return person ? person.full_name : email;
var names = _.map(user_ids.slice(0, num_to_show), function (user_id) {
var person = people.get_person_from_user_id(user_id);
return person.full_name;
});
var others = emails.length - num_to_show;
var others = user_ids.length - num_to_show;
if (others === 1) {
names.push("+ 1 other");
@@ -160,11 +166,10 @@ exports.short_huddle_name = function (huddle) {
};
exports.huddle_fraction_present = function (huddle, presence_info) {
var emails = huddle.split(',');
var user_ids = huddle.split(',');
var num_present = 0;
_.each(emails, function (email) {
var user_id = people.get_user_id(email);
_.each(user_ids, function (user_id) {
if (presence_info[user_id]) {
var status = presence_info[user_id].status;
if (status && (status !== 'offline')) {
@@ -173,7 +178,7 @@ exports.huddle_fraction_present = function (huddle, presence_info) {
}
});
var ratio = num_present / emails.length;
var ratio = num_present / user_ids.length;
return ratio.toFixed(2);
};
@@ -289,7 +294,7 @@ exports.update_users = function (user_list) {
var email = person.email;
return {
name: person.full_name,
email: email,
user_id: user_id,
num_unread: get_num_unread(email),
type: presence,
type_desc: presence_descriptions[presence],
@@ -300,9 +305,9 @@ exports.update_users = function (user_list) {
var user_info = _.map(users, info_for);
if (user_list !== undefined) {
// Render right panel partially
$.each(user_info, function (index, user) {
var user_index = all_users.indexOf(user.email);
$('#user_presences').find('[data-email="' + user.email + '"]').remove();
_.each(user_info, function (user, index) {
var user_index = all_users.indexOf(user.user_id);
$('#user_presences').find('[data-user-id="' + user.user_id + '"]').remove();
$('#user_presences li').eq(user_index).before(templates.render('user_presence_row', user));
});
} else {
@@ -345,7 +350,7 @@ exports.update_huddles = function () {
var group_pms = _.map(huddles, function (huddle) {
return {
emails: huddle,
user_ids_string: huddle,
name: exports.full_huddle_name(huddle),
fraction_present: exports.huddle_fraction_present(huddle, exports.presence_info),
short_name: exports.short_huddle_name(huddle)
@@ -355,9 +360,10 @@ exports.update_huddles = function () {
var html = templates.render('group_pms', {group_pms: group_pms});
$('#group-pms').expectOne().html(html);
_.each(huddles, function (huddle) {
var count = unread.num_unread_for_person(huddle);
set_count(huddle, count);
_.each(huddles, function (user_ids_string) {
var emails_string = people.user_ids_string_to_emails_string(user_ids_string);
var count = unread.num_unread_for_person(emails_string);
set_count(user_ids_string, count);
});
show_huddles();
@@ -520,11 +526,12 @@ function maybe_select_person (e) {
// Prevent a newline from being entered into the soon-to-be-opened composebox
e.preventDefault();
var topPerson = $('#user_presences li.user_sidebar_entry').first().data('email');
var topPerson = $('#user_presences li.user_sidebar_entry').first().attr('data-user-id');
if (topPerson !== undefined) {
// undefined if there are no results
var email = people.get_person_from_user_id(topPerson).email;
compose.start('private',
{trigger: 'sidebar enter key', "private_message_recipient": topPerson});
{trigger: 'sidebar enter key', "private_message_recipient": email});
}
// Clear the user filter
exports.escape_search();

View File

@@ -185,7 +185,9 @@ $(function () {
});
$('#user_presences').expectOne().on('click', '.selectable_sidebar_block', function (e) {
var email = $(e.target).parents('li').data('email');
var user_id = $(e.target).parents('li').attr('data-user-id');
var email = people.get_person_from_user_id(user_id).email;
narrow.by('pm-with', email, {select_first_unread: true, trigger: 'sidebar'});
// The preventDefault is necessary so that clicking the
// link doesn't jump us to the top of the page.
@@ -203,7 +205,8 @@ $(function () {
});
$('#group-pms').expectOne().on('click', '.selectable_sidebar_block', function (e) {
var emails = $(e.target).parents('li').data('emails');
var user_ids_string = $(e.target).parents('li').attr('data-user-ids');
var emails = people.user_ids_string_to_emails_string(user_ids_string);
narrow.by('pm-with', emails, {select_first_unread: true, trigger: 'sidebar'});
e.preventDefault();
e.stopPropagation();

View File

@@ -130,7 +130,9 @@ function _fade_users() {
}
_.forEach($('.user_sidebar_entry'), function (elt) {
elt = $(elt);
var would_receive = exports.would_receive_message(elt.attr('data-email'));
var user_id = elt.attr('data-user-id');
var email = people.get_person_from_user_id(user_id).email;
var would_receive = exports.would_receive_message(email);
if (would_receive === true) {
elt.addClass('unfaded').removeClass('faded');
} else if (would_receive === false) {

View File

@@ -206,7 +206,7 @@ exports.show_pm_list_sidebar = function () {
var current_stream_sidebar_elem;
var current_topic_sidebar_elem;
var current_user_sidebar_email;
var current_user_sidebar_user_id;
var current_user_sidebar_popover;
@@ -253,7 +253,7 @@ exports.hide_user_sidebar_popover = function () {
// and inject it here before calling destroy.
$('#user_presences').data("popover", current_user_sidebar_popover);
$('#user_presences').popover("destroy");
current_user_sidebar_email = undefined;
current_user_sidebar_user_id = undefined;
current_user_sidebar_popover = undefined;
}
};
@@ -397,11 +397,10 @@ exports.register_click_handlers = function () {
// use email of currently selected user, rather than some elem comparison,
// as the presence list may be redrawn with new elements.
var target = $(this).closest('li');
var email = target.find('a').attr('data-email');
var user_id = target.find('a').attr('data-user-id');
var name = target.find('a').attr('data-name');
var user_id = people.get_user_id(email);
if (current_user_sidebar_email === email) {
if (current_user_sidebar_user_id === user_id) {
// If the popover is already shown, clicking again should toggle it.
popovers.hide_all();
return;
@@ -421,7 +420,7 @@ exports.register_click_handlers = function () {
fixed: true
});
target.popover("show");
current_user_sidebar_email = email;
current_user_sidebar_user_id = user_id;
current_user_sidebar_popover = target.data('popover');
});

View File

@@ -1,6 +1,6 @@
{{! User Presence rows }}
{{#each group_pms}}
<li data-emails="{{emails}}" class="group-pms-sidebar-entry narrow-filter">
<li data-user-ids="{{user_ids_string}}" class="group-pms-sidebar-entry narrow-filter">
<span class="selectable_sidebar_block">
<span class="group-pm-status-indicator" style="background:rgba(68,194,29,{{fraction_present}});"></span>
<a href="#" data-name="{{name}}" title="{{name}}" class="group-pm-link">{{short_name}}</a>

View File

@@ -1,8 +1,8 @@
<li data-email="{{email}}" class="user_sidebar_entry {{#if num_unread}}user-with-count {{/if}}narrow-filter user_{{type}}">
<li data-user-id="{{user_id}}" class="user_sidebar_entry {{#if num_unread}}user-with-count {{/if}}narrow-filter user_{{type}}">
<span class="selectable_sidebar_block{{#if mobile}}{{/if}}">
<span class="user-status-indicator"></span>
<span class="user-device-indicator">{{#if mobile}}{{/if}}</span>
<a href="#" data-email="{{email}}" data-name="{{name}}" title="{{name}} {{type_desc}}"
<a href="#" data-user-id="{{user_id}}" data-name="{{name}}" title="{{name}} {{type_desc}}"
class="{{#if my_fullname}} my_fullname{{/if}}">{{name}}</a>
</span>
<span class="count"><span class="value">{{#if num_unread}}{{num_unread}}{{/if}}</span></span>