From 55e762b06955a4b73dcdf1f157455cd61abe5d61 Mon Sep 17 00:00:00 2001 From: Jason Michalski Date: Sat, 29 Mar 2014 21:42:48 -0400 Subject: [PATCH] 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) --- static/js/message_list_view.js | 54 +++++++++++-------- .../tests/frontend/node/message_list_view.js | 17 +++++- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/static/js/message_list_view.js b/static/js/message_list_view.js index e517b853bb..2a663e3d45 100644 --- a/static/js/message_list_view.js +++ b/static/js/message_list_view.js @@ -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) { diff --git a/zerver/tests/frontend/node/message_list_view.js b/zerver/tests/frontend/node/message_list_view.js index 5e64f454fc..c876ec4ccc 100644 --- a/zerver/tests/frontend/node/message_list_view.js +++ b/zerver/tests/frontend/node/message_list_view.js @@ -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, []); }());