UX: Show specific review actions in timeline (#36524)

The reviewable timeline now displays specific action text based on the
review outcome instead of a generic "Reviewed by" message. This provides
a clearer context about what action was taken on the reviewable item.
This commit is contained in:
Krzysztof Kotlarek
2025-12-09 09:05:15 +08:00
committed by GitHub
parent dbcdcdbcd2
commit ebb3a3cc01
4 changed files with 19 additions and 6 deletions
+3 -1
View File
@@ -944,7 +944,9 @@ en:
claimed_by: "Claimed by %{username} · %{relativeDate}"
unclaimed_by: "Unclaimed by %{username} · %{relativeDate}"
reviewed: "Reviewed"
reviewed_by: "Reviewed by %{username} · %{relativeDate}"
approved_by: "Approved by %{username} · %{relativeDate}"
rejected_by: "Rejected by %{username} · %{relativeDate}"
ignored_by: "Ignored by %{username} · %{relativeDate}"
view_conversation: "view PM"
note_added: "Moderator note"
note_added_by: "Moderator note by %{username} · %{relativeDate}"
@@ -131,15 +131,19 @@ export default class ReviewableTimeline extends Component {
if (!reviewedEvents.has(reviewedKey)) {
// Determine icon based on score status
let reviewIcon;
let titleKey;
switch (score.status) {
case 1: // approved
reviewIcon = "check";
titleKey = "review.timeline.approved_by";
break;
case 2: // rejected
reviewIcon = "times";
reviewIcon = "xmark";
titleKey = "review.timeline.rejected_by";
break;
case 3: // ignored
reviewIcon = "far-eye-slash";
titleKey = "review.timeline.ignored_by";
break;
default:
reviewIcon = "check"; // fallback
@@ -150,10 +154,7 @@ export default class ReviewableTimeline extends Component {
date: score.reviewed_at,
user: score.reviewed_by,
icon: reviewIcon,
titleKey: "review.timeline.reviewed_by",
description: score.reason
? htmlSafe(`<p>${score.reason}</p>`)
: undefined,
titleKey,
};
events.push(reviewedEvent);
@@ -34,10 +34,18 @@ module PageObjects
within(reviewable_by_id(reviewable.id)) { page.has_css?(".review-item__status.--rejected") }
end
def has_rejected_item_in_timeline?(reviewable)
within(reviewable_by_id(reviewable.id)) { page.has_text?("Rejected by") }
end
def has_reviewable_with_approved_status?(reviewable)
within(reviewable_by_id(reviewable.id)) { page.has_css?(".review-item__status.--approved") }
end
def has_approved_item_in_timeline?(reviewable)
within(reviewable_by_id(reviewable.id)) { page.has_text?("Approved by") }
end
def has_reviewable_with_ignored_status?(reviewable)
within(reviewable_by_id(reviewable.id)) { page.has_css?(".review-item__status.--ignored") }
end
+2
View File
@@ -331,6 +331,7 @@ describe "Viewing reviewable item", type: :system do
refreshed_review_page.visit_reviewable(reviewable)
refreshed_review_page.select_bundled_action(reviewable, "user-delete_user_block")
expect(refreshed_review_page).to have_reviewable_with_rejected_status(reviewable)
expect(refreshed_review_page).to have_rejected_item_in_timeline(reviewable)
end
it "Allows to approve user" do
@@ -340,6 +341,7 @@ describe "Viewing reviewable item", type: :system do
refreshed_review_page.select_bundled_action(reviewable, "user-approve_user")
expect(refreshed_review_page).to have_reviewable_with_approved_status(reviewable)
expect(refreshed_review_page).to have_approved_item_in_timeline(reviewable)
end
end
end