mirror of
				https://github.com/zulip/zulip.git
				synced 2025-10-31 03:53:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			192 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import {format, isSameDay} from "date-fns";
 | |
| import $ from "jquery";
 | |
| 
 | |
| import render_message_edit_history from "../templates/message_edit_history.hbs";
 | |
| import render_message_history_modal from "../templates/message_history_modal.hbs";
 | |
| 
 | |
| import * as channel from "./channel";
 | |
| import * as dialog_widget from "./dialog_widget";
 | |
| import {$t, $t_html} from "./i18n";
 | |
| import * as message_lists from "./message_lists";
 | |
| import {page_params} from "./page_params";
 | |
| import * as people from "./people";
 | |
| import * as popovers from "./popovers";
 | |
| import * as rendered_markdown from "./rendered_markdown";
 | |
| import * as rows from "./rows";
 | |
| import * as stream_data from "./stream_data";
 | |
| import * as sub_store from "./sub_store";
 | |
| import * as timerender from "./timerender";
 | |
| import * as ui_report from "./ui_report";
 | |
| 
 | |
| export function fetch_and_render_message_history(message) {
 | |
|     channel.get({
 | |
|         url: "/json/messages/" + message.id + "/history",
 | |
|         data: {message_id: JSON.stringify(message.id)},
 | |
|         success(data) {
 | |
|             const content_edit_history = [];
 | |
|             let prev_time = null;
 | |
|             let prev_stream_item = null;
 | |
| 
 | |
|             for (const [index, msg] of data.message_history.entries()) {
 | |
|                 // Format times and dates nicely for display
 | |
|                 const time = new Date(msg.timestamp * 1000);
 | |
|                 const item = {
 | |
|                     timestamp: timerender.stringify_time(time),
 | |
|                     display_date: format(time, "MMMM d, yyyy"),
 | |
|                     show_date_row: prev_time === null || !isSameDay(time, prev_time),
 | |
|                 };
 | |
| 
 | |
|                 if (!msg.user_id) {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 const person = people.get_by_user_id(msg.user_id);
 | |
|                 const full_name = person.full_name;
 | |
| 
 | |
|                 if (index === 0) {
 | |
|                     item.edited_by_notice = $t(
 | |
|                         {defaultMessage: "Posted by {full_name}"},
 | |
|                         {full_name},
 | |
|                     );
 | |
|                     item.body_to_render = msg.rendered_content;
 | |
|                 } else if (msg.prev_topic && msg.prev_content) {
 | |
|                     item.edited_by_notice = $t(
 | |
|                         {defaultMessage: "Edited by {full_name}"},
 | |
|                         {full_name},
 | |
|                     );
 | |
|                     item.body_to_render = msg.content_html_diff;
 | |
|                     item.topic_edited = true;
 | |
|                     item.prev_topic = msg.prev_topic;
 | |
|                     item.new_topic = msg.topic;
 | |
|                 } else if (msg.prev_topic && msg.prev_stream) {
 | |
|                     const sub = sub_store.get(msg.prev_stream);
 | |
|                     item.edited_by_notice = $t(
 | |
|                         {defaultMessage: "Moved by {full_name}"},
 | |
|                         {full_name},
 | |
|                     );
 | |
|                     item.topic_edited = true;
 | |
|                     item.prev_topic = msg.prev_topic;
 | |
|                     item.new_topic = msg.topic;
 | |
|                     item.stream_changed = true;
 | |
|                     if (!sub) {
 | |
|                         item.prev_stream = $t({defaultMessage: "Unknown stream"});
 | |
|                     } else {
 | |
|                         item.prev_stream = stream_data.maybe_get_stream_name(msg.prev_stream);
 | |
|                     }
 | |
|                     if (prev_stream_item !== null) {
 | |
|                         prev_stream_item.new_stream = stream_data.maybe_get_stream_name(
 | |
|                             msg.prev_stream,
 | |
|                         );
 | |
|                     }
 | |
|                     prev_stream_item = item;
 | |
|                 } else if (msg.prev_topic) {
 | |
|                     item.edited_by_notice = $t(
 | |
|                         {defaultMessage: "Moved by {full_name}"},
 | |
|                         {full_name},
 | |
|                     );
 | |
|                     item.topic_edited = true;
 | |
|                     item.prev_topic = msg.prev_topic;
 | |
|                     item.new_topic = msg.topic;
 | |
|                 } else if (msg.prev_stream) {
 | |
|                     const sub = sub_store.get(msg.prev_stream);
 | |
|                     item.edited_by_notice = $t(
 | |
|                         {defaultMessage: "Moved by {full_name}"},
 | |
|                         {full_name},
 | |
|                     );
 | |
|                     item.stream_changed = true;
 | |
|                     if (!sub) {
 | |
|                         item.prev_stream = $t({defaultMessage: "Unknown stream"});
 | |
|                     } else {
 | |
|                         item.prev_stream = stream_data.maybe_get_stream_name(msg.prev_stream);
 | |
|                     }
 | |
|                     if (prev_stream_item !== null) {
 | |
|                         prev_stream_item.new_stream = stream_data.maybe_get_stream_name(
 | |
|                             msg.prev_stream,
 | |
|                         );
 | |
|                     }
 | |
|                     prev_stream_item = item;
 | |
|                 } else {
 | |
|                     // just a content edit
 | |
|                     item.edited_by_notice = $t(
 | |
|                         {defaultMessage: "Edited by {full_name}"},
 | |
|                         {full_name},
 | |
|                     );
 | |
|                     item.body_to_render = msg.content_html_diff;
 | |
|                 }
 | |
| 
 | |
|                 content_edit_history.push(item);
 | |
|                 prev_time = time;
 | |
|             }
 | |
|             if (prev_stream_item !== null) {
 | |
|                 prev_stream_item.new_stream = stream_data.maybe_get_stream_name(message.stream_id);
 | |
|             }
 | |
|             $("#message-history").attr("data-message-id", message.id);
 | |
|             $("#message-history").html(
 | |
|                 render_message_edit_history({
 | |
|                     edited_messages: content_edit_history,
 | |
|                 }),
 | |
|             );
 | |
|             // Pass the history through rendered_markdown.js
 | |
|             // to update dynamic_elements in the content.
 | |
|             $("#message-history")
 | |
|                 .find(".rendered_markdown")
 | |
|                 .each(function () {
 | |
|                     rendered_markdown.update_elements($(this));
 | |
|                 });
 | |
|         },
 | |
|         error(xhr) {
 | |
|             ui_report.error(
 | |
|                 $t_html({defaultMessage: "Error fetching message edit history"}),
 | |
|                 xhr,
 | |
|                 $("#dialog_error"),
 | |
|             );
 | |
|         },
 | |
|     });
 | |
| }
 | |
| 
 | |
| export function show_history(message) {
 | |
|     const rendered_message_history = render_message_history_modal();
 | |
| 
 | |
|     dialog_widget.launch({
 | |
|         html_heading: $t_html({defaultMessage: "Message edit history"}),
 | |
|         html_body: rendered_message_history,
 | |
|         html_submit_button: $t_html({defaultMessage: "Close"}),
 | |
|         id: "message-edit-history",
 | |
|         on_click: () => {},
 | |
|         close_on_submit: true,
 | |
|         focus_submit_on_open: true,
 | |
|         single_footer_button: true,
 | |
|         post_render: () => {
 | |
|             fetch_and_render_message_history(message);
 | |
|         },
 | |
|     });
 | |
| }
 | |
| 
 | |
| export function initialize() {
 | |
|     $("body").on("mouseenter", ".message_edit_notice", (e) => {
 | |
|         if (page_params.realm_allow_edit_history) {
 | |
|             $(e.currentTarget).addClass("message_edit_notice_hover");
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     $("body").on("mouseleave", ".message_edit_notice", (e) => {
 | |
|         if (page_params.realm_allow_edit_history) {
 | |
|             $(e.currentTarget).removeClass("message_edit_notice_hover");
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     $("body").on("click", ".message_edit_notice", (e) => {
 | |
|         popovers.hide_all();
 | |
|         const message_id = rows.id($(e.currentTarget).closest(".message_row"));
 | |
|         const $row = message_lists.current.get_row(message_id);
 | |
|         const message = message_lists.current.get(rows.id($row));
 | |
| 
 | |
|         if (page_params.realm_allow_edit_history) {
 | |
|             show_history(message);
 | |
|             $("#message-history-cancel").trigger("focus");
 | |
|         }
 | |
|         e.stopPropagation();
 | |
|         e.preventDefault();
 | |
|     });
 | |
| }
 |