message_list_view: Move edited position conditionals to JS.

This adds three bools to message_container object which calculate bools
where the "(EDITED)" label should appear:

* `edited_in_left_col` -- when label appears in left column.
* `edited_alongside_sender` -- when label appears alongside sender info.
* `edited_status_msg` -- when label appears for a "/me" message.

We use the new bools and remove the complicated if else statements
from the templates for the "(EDITED)" label.

This also allows us to add a unit test to verify the logic.
This commit is contained in:
Vaibhav
2019-03-16 00:12:24 +05:30
committed by Tim Abbott
parent 58874a08e3
commit 1f76374e32
4 changed files with 97 additions and 14 deletions

View File

@@ -46,6 +46,81 @@ set_global('rows', {
},
});
run_test('msg_edited_vars', () => {
// This is a test to verify that only one of the three bools,
// `edited_in_left_col`, `edited_alongside_sender`, `edited_status_msg`
// is not false; Tests for three different kinds of messages:
// * "/me" message
// * message that includes sender
// * message without sender
function build_message_context(message, message_context) {
if (message_context === undefined) {
message_context = {};
}
if (message === undefined) {
message = {};
}
message_context = _.defaults(message_context, {
include_sender: true,
});
message_context.msg = _.defaults(message, {
is_me_message: false,
last_edit_timestamp: _.uniqueId(),
});
return message_context;
}
function build_message_group(messages) {
return { message_containers: messages };
}
function build_list(message_groups) {
var list = new MessageListView(undefined, undefined, true);
list._message_groups = message_groups;
return list;
}
function assert_left_col(message_container) {
assert.equal(message_container.edited_in_left_col, true);
assert.equal(message_container.edited_alongside_sender, false);
assert.equal(message_container.edited_status_msg, false);
}
function assert_alongside_sender(message_container) {
assert.equal(message_container.edited_in_left_col, false);
assert.equal(message_container.edited_alongside_sender, true);
assert.equal(message_container.edited_status_msg, false);
}
function assert_status_msg(message_container) {
assert.equal(message_container.edited_in_left_col, false);
assert.equal(message_container.edited_alongside_sender, false);
assert.equal(message_container.edited_status_msg, true);
}
(function test_msg_edited_vars() {
var messages = [
build_message_context(),
build_message_context({}, { include_sender: false }),
build_message_context({ is_me_message: true, content: "<p>/me test</p>" }),
];
var message_group = build_message_group(messages);
var list = build_list([message_group]);
_.each(messages, function (message_container) {
list._maybe_format_me_message(message_container);
list._add_msg_edited_vars(message_container);
});
var result = list._message_groups[0].message_containers;
assert_alongside_sender(result[0]);
assert_left_col(result[1]);
assert_status_msg(result[2]);
}());
});
run_test('merge_message_groups', () => {
// MessageListView has lots of DOM code, so we are going to test the message
// group mearging logic on its own.

View File

@@ -201,9 +201,21 @@ MessageListView.prototype = {
},
_add_msg_edited_vars: function (message_container) {
// This adds variables to message_container object which calculate bools for
// checking position of "(EDITED)" label as well as the edited timestring
// The bools can be defined only when the message is edited
// (or when the `last_edit_timestr` is defined). The bools are:
// * `edited_in_left_col` -- when label appears in left column.
// * `edited_alongside_sender` -- when label appears alongside sender info.
// * `edited_status_msg` -- when label appears for a "/me" message.
var last_edit_timestr = this._get_msg_timestring(message_container);
var include_sender = message_container.include_sender;
var status_message = Boolean(message_container.status_message);
if (last_edit_timestr !== undefined) {
message_container.last_edit_timestr = last_edit_timestr;
message_container.edited_in_left_col = !include_sender;
message_container.edited_alongside_sender = include_sender && !status_message;
message_container.edited_status_msg = include_sender && status_message;
}
},
@@ -321,8 +333,6 @@ MessageListView.prototype = {
message_container.sender_is_bot = people.sender_is_bot(message_container.msg);
message_container.sender_is_guest = people.sender_is_guest(message_container.msg);
self._add_msg_edited_vars(message_container);
message_container.small_avatar_url = people.small_avatar_url(message_container.msg);
if (message_container.msg.stream) {
message_container.background_color =
@@ -331,6 +341,8 @@ MessageListView.prototype = {
message_container.contains_mention = message_container.msg.mentioned;
self._maybe_format_me_message(message_container);
// Once all other variables are updated
self._add_msg_edited_vars(message_container);
prev = message_container;
});
@@ -1153,8 +1165,8 @@ MessageListView.prototype = {
var was_selected = this.list.selected_message() === message_container.msg;
// Re-render just this one message
this._add_msg_edited_vars(message_container);
this._maybe_format_me_message(message_container);
this._add_msg_edited_vars(message_container);
// Make sure the right thing happens if the message was edited to mention us.
message_container.contains_mention = message_container.msg.mentioned;

View File

@@ -13,8 +13,8 @@
{{{ status_message }}}
</span>
{{#if_and last_edit_timestr include_sender}}
{{#if edited_status_msg}}
{{partial "edited_notice"}}
{{/if_and}}
{{/if}}
</span>
</span>

View File

@@ -27,11 +27,9 @@
{{timestr}}
</span>
{{#if_and last_edit_timestr include_sender}}
{{#unless status_message}}
{{partial "edited_notice"}}
{{/unless}}
{{/if_and}}
{{#if edited_alongside_sender}}
{{partial "edited_notice"}}
{{/if}}
{{partial "message_controls"}}
@@ -41,10 +39,8 @@
<div class="message_content rendered_markdown">{{#if use_match_properties}}{{{msg/match_content}}}{{else}}{{{msg/content}}}{{/if}}</div>
{{/unless}}
{{#if last_edit_timestr}}
{{#unless include_sender}}
{{partial "edited_notice"}}
{{/unless}}
{{#if edited_in_left_col}}
{{partial "edited_notice"}}
{{/if}}
<div class="message_edit">