Fix bug with date separators when prepending messages

When the date changes between an existing group and a new group the
existing date separator needs to be updated. This is done by rerendering
the existing group.

(imported from commit a3775815e33872b0ec07704dc7ccf5fd2671fa21)
This commit is contained in:
Jason Michalski
2014-03-29 21:42:48 -04:00
parent 1e9efe441a
commit 55e762b069
2 changed files with 48 additions and 23 deletions

View File

@@ -24,6 +24,9 @@ function stringify_time(time) {
}
function same_day(earlier_msg, later_msg) {
if (earlier_msg === undefined || later_msg === undefined) {
return false;
}
var earlier_time = new XDate(earlier_msg.msg.timestamp * 1000);
var later_time = new XDate(later_msg.msg.timestamp * 1000);
@@ -279,6 +282,15 @@ MessageListView.prototype = {
this._message_groups.unshift(first_group);
new_message_groups = _.initial(new_message_groups);
} else if (!same_day(second_group.message_containers[0], first_group.message_containers[0])) {
// The groups did not merge, so we need up update the date row for the old group
add_display_time(
second_group,
_.first(second_group.message_containers),
_.last(first_group.message_containers)
);
// We could add an action to just update the date row, but for now rerender the group.
message_actions.rerender_groups.push(second_group);
}
message_actions.prepend_groups = new_message_groups;
this._message_groups = new_message_groups.concat(this._message_groups);
@@ -401,6 +413,27 @@ MessageListView.prototype = {
self.message_containers[message_container.msg.id] = message_container;
});
// Render new message groups on the top
if (message_actions.prepend_groups.length > 0) {
save_scroll_position();
rendered_groups = $(templates.render('message_group', {
message_groups: message_actions.prepend_groups,
use_match_properties: self.list.filter.is_search(),
table_name: self.table_name
}));
dom_messages = rendered_groups.find('.message_row');
new_dom_elements = new_dom_elements.concat(rendered_groups);
self._post_process_dom_messages(dom_messages.get());
// The date row will be included in the message groups or will be
// added in a rerenderd in the group below
table.find('.recipient_row').first().prev('.date_row').remove();
table.prepend(rendered_groups);
condense.condense_and_collapse(dom_messages);
}
// Rerender message groups
if (message_actions.rerender_groups.length > 0) {
@@ -426,27 +459,6 @@ MessageListView.prototype = {
});
}
// Render new message groups on the top
if (message_actions.prepend_groups.length > 0) {
save_scroll_position();
rendered_groups = $(templates.render('message_group', {
message_groups: message_actions.prepend_groups,
use_match_properties: self.list.filter.is_search(),
table_name: self.table_name
}));
dom_messages = rendered_groups.find('.message_row');
new_dom_elements = new_dom_elements.concat(rendered_groups);
self._post_process_dom_messages(dom_messages.get());
// The date row will be included in the message groups
table.find('.recipient_row').first().prev('.date_row').remove();
table.prepend(rendered_groups);
condense.condense_and_collapse(dom_messages);
}
// Rerender message rows
if (message_actions.rerender_messages.length > 0) {
_.each(message_actions.rerender_messages, function (message_container) {

View File

@@ -12,6 +12,16 @@ set_global('feature_flags', {twenty_four_hour_time: false});
set_global('ui', {small_avatar_url: function () { return ''; }});
set_global('notifications', {speaking_at_me: function () {}});
set_global('unread', {message_unread: function () {}});
// timerender calls setInterval when imported
set_global('timerender', {
render_date: function (time1, time2) {
if (time2 === undefined) {
return [{outerHTML: String(time1)}];
} else {
return [{outerHTML: String(time1) + ' - ' + String(time2)}];
}
}
});
(function test_merge_message_groups() {
// MessageListView has lots of DOM code, so we are going to test the mesage
@@ -297,14 +307,17 @@ set_global('unread', {message_unread: function () {}});
var list = build_list([message_group1]);
var result = list.merge_message_groups([message_group2], 'top');
assert(message_group1.show_date);
assert.equal(
message_group1.show_date,
'Sun Jan 11 1970 05:00:00 GMT-0500 (EST) - Wed Dec 31 1969 19:16:40 GMT-0500 (EST)'
);
assert_message_groups_list_equal(
list._message_groups,
[message_group2, message_group1]
);
assert_message_groups_list_equal(result.append_groups, []);
assert_message_groups_list_equal(result.prepend_groups, [message_group2]);
assert_message_groups_list_equal(result.rerender_groups, []);
assert_message_groups_list_equal(result.rerender_groups, [message_group1]);
assert_message_list_equal(result.append_messages, []);
assert_message_list_equal(result.rerender_messages, []);
}());