mirror of https://github.com/zulip/zulip.git
message editing: Refactor editability computation to use editability_types.
We compute the editability of messages in several places around the frontend; standardize the definitions and store in message_edit.get_editability. This commit should not change app behavior.
This commit is contained in:
parent
c2c389e949
commit
879f2a1e2e
|
@ -2,6 +2,42 @@ var message_edit = (function () {
|
||||||
var exports = {};
|
var exports = {};
|
||||||
var currently_editing_messages = {};
|
var currently_editing_messages = {};
|
||||||
|
|
||||||
|
var editability_types = {
|
||||||
|
NO: 1,
|
||||||
|
NO_LONGER: 2,
|
||||||
|
// Note: TOPIC_ONLY does not include stream messages with no topic sent
|
||||||
|
// by someone else. You can edit the topic of such a message by editing
|
||||||
|
// the topic of the whole recipient_row it appears in, but you can't
|
||||||
|
// directly edit the topic of such a message.
|
||||||
|
// Similar story for messages whose topic you can change only because
|
||||||
|
// you are an admin.
|
||||||
|
TOPIC_ONLY: 3,
|
||||||
|
FULL: 4
|
||||||
|
};
|
||||||
|
exports.editability_types = editability_types;
|
||||||
|
|
||||||
|
function get_editability (message, edit_limit_seconds_buffer) {
|
||||||
|
edit_limit_seconds_buffer = edit_limit_seconds_buffer || 0;
|
||||||
|
if (!message || !message.sent_by_me || message.local_id !== undefined ||
|
||||||
|
!page_params.realm_allow_message_editing) {
|
||||||
|
return editability_types.NO;
|
||||||
|
}
|
||||||
|
if (page_params.realm_message_content_edit_limit_seconds === 0) {
|
||||||
|
return editability_types.FULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
var now = new XDate();
|
||||||
|
if (page_params.realm_message_content_edit_limit_seconds + edit_limit_seconds_buffer +
|
||||||
|
now.diffSeconds(message.timestamp * 1000) > 0) {
|
||||||
|
return editability_types.FULL;
|
||||||
|
}
|
||||||
|
// time's up!
|
||||||
|
if (message.type === 'stream') {
|
||||||
|
return editability_types.TOPIC_ONLY;
|
||||||
|
}
|
||||||
|
return editability_types.NO_LONGER;
|
||||||
|
}
|
||||||
|
exports.get_editability = get_editability;
|
||||||
|
|
||||||
// Returns true if the edit task should end.
|
// Returns true if the edit task should end.
|
||||||
exports.save = function (row, from_topic_edited_only) {
|
exports.save = function (row, from_topic_edited_only) {
|
||||||
|
@ -112,12 +148,7 @@ function edit_message (row, raw_content) {
|
||||||
// If you change this number also change edit_limit_buffer in
|
// If you change this number also change edit_limit_buffer in
|
||||||
// zerver.views.messages.update_message_backend
|
// zerver.views.messages.update_message_backend
|
||||||
var seconds_left_buffer = 5;
|
var seconds_left_buffer = 5;
|
||||||
|
var editability = get_editability(message, seconds_left_buffer);
|
||||||
var now = new XDate();
|
|
||||||
var seconds_left = page_params.realm_message_content_edit_limit_seconds +
|
|
||||||
now.diffSeconds(message.timestamp * 1000);
|
|
||||||
var can_edit_content = (page_params.realm_message_content_edit_limit_seconds === 0) ||
|
|
||||||
(seconds_left + seconds_left_buffer > 0);
|
|
||||||
|
|
||||||
var form = $(templates.render(
|
var form = $(templates.render(
|
||||||
'message_edit_form',
|
'message_edit_form',
|
||||||
|
@ -132,11 +163,11 @@ function edit_message (row, raw_content) {
|
||||||
|
|
||||||
form.keydown(_.partial(handle_edit_keydown, false));
|
form.keydown(_.partial(handle_edit_keydown, false));
|
||||||
|
|
||||||
if (!can_edit_content) {
|
if (editability === editability_types.TOPIC_ONLY) {
|
||||||
row.find('textarea.message_edit_content').attr("disabled","disabled");
|
row.find('textarea.message_edit_content').attr("disabled","disabled");
|
||||||
// Hint why you can edit the topic but not the message content
|
// Hint why you can edit the topic but not the message content
|
||||||
row.find('.message_edit_countdown_timer').text(i18n.t("Topic editing only"));
|
row.find('.message_edit_countdown_timer').text(i18n.t("Topic editing only"));
|
||||||
} else {
|
} else if (editability === editability_types.FULL) {
|
||||||
composebox_typeahead.initialize_compose_typeahead("#message_edit_content", {emoji: true});
|
composebox_typeahead.initialize_compose_typeahead("#message_edit_content", {emoji: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,12 +183,15 @@ function edit_message (row, raw_content) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// add timer
|
// add timer
|
||||||
if (can_edit_content &&
|
if (editability === editability_types.FULL &&
|
||||||
page_params.realm_message_content_edit_limit_seconds > 0) {
|
page_params.realm_message_content_edit_limit_seconds > 0) {
|
||||||
// Give them at least 10 seconds.
|
// Give them at least 10 seconds.
|
||||||
// If you change this number also change edit_limit_buffer in
|
// If you change this number also change edit_limit_buffer in
|
||||||
// zerver.views.messages.update_message_backend
|
// zerver.views.messages.update_message_backend
|
||||||
var min_seconds_to_edit = 10;
|
var min_seconds_to_edit = 10;
|
||||||
|
var now = new XDate();
|
||||||
|
var seconds_left = page_params.realm_message_content_edit_limit_seconds +
|
||||||
|
now.diffSeconds(message.timestamp * 1000);
|
||||||
seconds_left = Math.floor(Math.max(seconds_left, min_seconds_to_edit));
|
seconds_left = Math.floor(Math.max(seconds_left, min_seconds_to_edit));
|
||||||
|
|
||||||
// I believe these need to be defined outside the countdown_timer, since
|
// I believe these need to be defined outside the countdown_timer, since
|
||||||
|
@ -182,7 +216,7 @@ function edit_message (row, raw_content) {
|
||||||
message_topic_row.attr("disabled","disabled");
|
message_topic_row.attr("disabled","disabled");
|
||||||
message_topic_propagate_row.hide();
|
message_topic_propagate_row.hide();
|
||||||
}
|
}
|
||||||
// We don't go directly to "Topic editing only" state (with an active Save button),
|
// We don't go directly to a "TOPIC_ONLY" type state (with an active Save button),
|
||||||
// since it isn't clear what to do with the half-finished edit. It's nice to keep
|
// since it isn't clear what to do with the half-finished edit. It's nice to keep
|
||||||
// the half-finished edit around so that they can copy-paste it, but we don't want
|
// the half-finished edit around so that they can copy-paste it, but we don't want
|
||||||
// people to think "Save" will save the half-finished edit.
|
// people to think "Save" will save the half-finished edit.
|
||||||
|
@ -196,7 +230,7 @@ function edit_message (row, raw_content) {
|
||||||
|
|
||||||
var edit_row = row.find(".message_edit");
|
var edit_row = row.find(".message_edit");
|
||||||
if ((message.type === 'stream' && message.subject === compose.empty_topic_placeholder()) ||
|
if ((message.type === 'stream' && message.subject === compose.empty_topic_placeholder()) ||
|
||||||
!can_edit_content) {
|
editability === editability_types.TOPIC_ONLY) {
|
||||||
edit_row.find(".message_edit_topic").focus();
|
edit_row.find(".message_edit_topic").focus();
|
||||||
} else {
|
} else {
|
||||||
edit_row.find(".message_edit_content").focus();
|
edit_row.find(".message_edit_content").focus();
|
||||||
|
|
|
@ -57,7 +57,9 @@ exports.toggle_actions_popover = function (element, id) {
|
||||||
var elt = $(element);
|
var elt = $(element);
|
||||||
if (elt.data('popover') === undefined) {
|
if (elt.data('popover') === undefined) {
|
||||||
var message = current_msg_list.get(id);
|
var message = current_msg_list.get(id);
|
||||||
var can_edit = message.sent_by_me && message.local_id === undefined && page_params.realm_allow_message_editing;
|
var editability = message_edit.get_editability(message);
|
||||||
|
var is_editable = (editability === message_edit.editability_types.TOPIC_ONLY ||
|
||||||
|
editability === message_edit.editability_types.FULL);
|
||||||
var can_mute_topic =
|
var can_mute_topic =
|
||||||
message.stream &&
|
message.stream &&
|
||||||
message.subject &&
|
message.subject &&
|
||||||
|
@ -67,10 +69,9 @@ exports.toggle_actions_popover = function (element, id) {
|
||||||
message.subject &&
|
message.subject &&
|
||||||
muting.is_topic_muted(message.stream, message.subject);
|
muting.is_topic_muted(message.stream, message.subject);
|
||||||
|
|
||||||
|
|
||||||
var args = {
|
var args = {
|
||||||
message: message,
|
message: message,
|
||||||
can_edit_message: can_edit,
|
is_editable: is_editable,
|
||||||
can_mute_topic: can_mute_topic,
|
can_mute_topic: can_mute_topic,
|
||||||
can_unmute_topic: can_unmute_topic,
|
can_unmute_topic: can_unmute_topic,
|
||||||
conversation_time_uri: narrow.by_conversation_and_time_uri(message),
|
conversation_time_uri: narrow.by_conversation_and_time_uri(message),
|
||||||
|
|
|
@ -118,12 +118,8 @@ function message_hover(message_row) {
|
||||||
message = current_msg_list.get(rows.id(message_row));
|
message = current_msg_list.get(rows.id(message_row));
|
||||||
message_unhover();
|
message_unhover();
|
||||||
message_row.addClass('message_hovered');
|
message_row.addClass('message_hovered');
|
||||||
var now = new XDate();
|
if ((message_edit.get_editability(message) === message_edit.editability_types.FULL) &&
|
||||||
if (message && message.sent_by_me && !message.status_message &&
|
!message.status_message) {
|
||||||
page_params.realm_allow_message_editing &&
|
|
||||||
(page_params.realm_message_content_edit_limit_seconds === 0 ||
|
|
||||||
page_params.realm_message_content_edit_limit_seconds + now.diffSeconds(message.timestamp * 1000) > 0))
|
|
||||||
{
|
|
||||||
message_row.find('.message_content').find('p:last').append(edit_content_button);
|
message_row.find('.message_content').find('p:last').append(edit_content_button);
|
||||||
}
|
}
|
||||||
current_message_hover = message_row;
|
current_message_hover = message_row;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{! Contents of the "message actions" popup }}
|
{{! Contents of the "message actions" popup }}
|
||||||
<ul class="nav nav-list actions_popover pull-right">
|
<ul class="nav nav-list actions_popover pull-right">
|
||||||
{{#if can_edit_message}}
|
{{#if is_editable}}
|
||||||
<li>
|
<li>
|
||||||
<a href="#" class="popover_edit_message" data-msgid="{{message.id}}">
|
<a href="#" class="popover_edit_message" data-msgid="{{message.id}}">
|
||||||
<i class="icon-vector-pencil"></i> {{t "Edit" }}
|
<i class="icon-vector-pencil"></i> {{t "Edit" }}
|
||||||
|
|
Loading…
Reference in New Issue