FIX: Missing excerpt for post small actions in topic timeline. (#14547)

FIX: Missing excerpt for post small actions in topic timeline. (#14547)

diff --git a/app/assets/javascripts/discourse/app/widgets/topic-timeline.js b/app/assets/javascripts/discourse/app/widgets/topic-timeline.js
index 0d83d2b..28437a7 100644
--- a/app/assets/javascripts/discourse/app/widgets/topic-timeline.js
+++ b/app/assets/javascripts/discourse/app/widgets/topic-timeline.js
@@ -2,6 +2,7 @@ import ComponentConnector from "discourse/widgets/component-connector";
 import I18n from "I18n";
 import RawHtml from "discourse/widgets/raw-html";
 import { createWidget } from "discourse/widgets/widget";
+import { actionDescriptionHtml } from "discourse/widgets/post-small-action";
 import { h } from "virtual-dom";
 import { iconNode } from "discourse-common/lib/icon-library";
 import { later } from "@ember/runloop";
@@ -456,7 +457,16 @@ export default createWidget("topic-timeline", {
             excerpt = "<span class='username'>" + info.username + ":</span> ";
           }
 
-          this.state.excerpt = excerpt + info.excerpt;
+          if (info.excerpt) {
+            this.state.excerpt = excerpt + info.excerpt;
+          } else if (info.action_code) {
+            this.state.excerpt = `${excerpt} ${actionDescriptionHtml(
+              info.action_code,
+              info.created_at,
+              info.username
+            )}`;
+          }
+
           this.scheduleRerender();
         }
       });
diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb
index b23245c..32f3785 100644
--- a/app/controllers/topics_controller.rb
+++ b/app/controllers/topics_controller.rb
@@ -262,14 +262,21 @@ class TopicsController < ApplicationController
     @posts = Post.where(hidden: false, deleted_at: nil, topic_id: @topic.id)
       .where('posts.id in (?)', post_ids)
       .joins("LEFT JOIN users u on u.id = posts.user_id")
-      .pluck(:id, :cooked, :username)
-      .map do |post_id, cooked, username|
-      {
-        post_id: post_id,
-        username: username,
-        excerpt: PrettyText.excerpt(cooked, 800, keep_emoji_images: true)
-      }
-    end
+      .pluck(:id, :cooked, :username, :action_code, :created_at)
+      .map do |post_id, cooked, username, action_code, created_at|
+        attrs = {
+          post_id: post_id,
+          username: username,
+          excerpt: PrettyText.excerpt(cooked, 800, keep_emoji_images: true),
+        }
+
+        if action_code
+          attrs[:action_code] = action_code
+          attrs[:created_at] = created_at
+        end
+
+        attrs
+      end
 
     render json: @posts.to_json
   end
diff --git a/spec/requests/topics_controller_spec.rb b/spec/requests/topics_controller_spec.rb
index 281b3ae..2aa3b85 100644
--- a/spec/requests/topics_controller_spec.rb
+++ b/spec/requests/topics_controller_spec.rb
@@ -3444,25 +3444,29 @@ RSpec.describe TopicsController do
     it "can correctly get excerpts" do
       first_post = create_post(raw: 'This is the first post :)', title: 'This is a test title I am making yay')
       second_post = create_post(raw: 'This is second post', topic: first_post.topic)
+      third_post = first_post.topic.add_small_action(first_post.user, "autobumped")
 
       random_post = Fabricate(:post)
 
       get "/t/#{first_post.topic_id}/excerpts.json", params: {
-        post_ids: [first_post.id, second_post.id, random_post.id]
+        post_ids: [first_post.id, second_post.id, third_post.id, random_post.id]
       }
 
       json = response.parsed_body
       json.sort! { |a, b| a["post_id"] <=> b["post_id"] }
 
       # no random post
-      expect(json.length).to eq(2)
+      expect(json.map { |p| p["post_id"] }).to contain_exactly(first_post.id, second_post.id, third_post.id)
       # keep emoji images
       expect(json[0]["excerpt"]).to match(/emoji/)
       expect(json[0]["excerpt"]).to match(/first post/)
       expect(json[0]["username"]).to eq(first_post.user.username)
-      expect(json[0]["post_id"]).to eq(first_post.id)
+      expect(json[0]["created_at"].present?).to eq(false)
 
       expect(json[1]["excerpt"]).to match(/second post/)
+
+      expect(json[2]["action_code"]).to eq("autobumped")
+      expect(json[2]["created_at"].present?).to eq(true)
     end
   end
 

GitHub sha: d0595127cc92eb0b8334ba79669d62104315618a

This commit appears in #14547 which was approved by vinothkannans. It was merged by tgxworld.