Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit 75cd306

Browse files
committed
Revert to widget instead of glimmer component
1 parent 29416b8 commit 75cd306

File tree

6 files changed

+124
-198
lines changed

6 files changed

+124
-198
lines changed

assets/javascripts/discourse/components/solved-accept-answer-button.gjs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default class SolvedAcceptAnswerButton extends Component {
1919

2020
@action
2121
acceptAnswer() {
22-
acceptAnswer(this.args.post, this.appEvents);
22+
acceptAnswer(this.args.post, this.appEvents, this.currentUser);
2323
}
2424

2525
<template>
@@ -34,9 +34,9 @@ export default class SolvedAcceptAnswerButton extends Component {
3434
</template>
3535
}
3636

37-
export function acceptAnswer(post, appEvents) {
37+
export function acceptAnswer(post, appEvents, acceptingUser) {
3838
// TODO (glimmer-post-menu): Remove this exported function and move the code into the button action after the widget code is removed
39-
acceptPost(post);
39+
acceptPost(post, acceptingUser);
4040

4141
appEvents.trigger("discourse-solved:solution-toggled", post);
4242

@@ -46,7 +46,7 @@ export function acceptAnswer(post, appEvents) {
4646
});
4747
}
4848

49-
function acceptPost(post) {
49+
function acceptPost(post, acceptingUser) {
5050
const topic = post.topic;
5151

5252
clearAccepted(topic);
@@ -62,6 +62,8 @@ function acceptPost(post) {
6262
name: post.name,
6363
post_number: post.post_number,
6464
excerpt: post.cooked,
65+
accepter_username: acceptingUser.username,
66+
accepter_name: acceptingUser.name,
6567
});
6668

6769
ajax("/solution/accept", {

assets/javascripts/discourse/components/solved-post.gjs

Lines changed: 0 additions & 100 deletions
This file was deleted.

assets/javascripts/discourse/initializers/extend-for-solved-button.js

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1+
import { computed } from "@ember/object";
12
import discourseComputed from "discourse/lib/decorators";
23
import { withSilencedDeprecations } from "discourse/lib/deprecated";
3-
import { iconNode } from "discourse/lib/icon-library";
4+
import { iconHTML, iconNode } from "discourse/lib/icon-library";
45
import { withPluginApi } from "discourse/lib/plugin-api";
6+
import { formatUsername } from "discourse/lib/utilities";
7+
import Topic from "discourse/models/topic";
8+
import User from "discourse/models/user";
9+
import PostCooked from "discourse/widgets/post-cooked";
510
import { i18n } from "discourse-i18n";
611
import SolvedAcceptAnswerButton, {
712
acceptAnswer,
813
} from "../components/solved-accept-answer-button";
9-
import SolvedPost from "../components/solved-post";
1014
import SolvedUnacceptAnswerButton, {
1115
unacceptAnswer,
1216
} from "../components/solved-unaccept-answer-button";
@@ -25,10 +29,39 @@ function initializeWithApi(api) {
2529
api.addDiscoveryQueryParam("solved", { replace: true, refreshModel: true });
2630
}
2731

28-
api.renderBeforeWrapperOutlet("post-menu", SolvedPost);
32+
api.decorateWidget("post-contents:after-cooked", (dec) => {
33+
if (dec.attrs.post_number === 1) {
34+
const postModel = dec.getModel();
35+
if (postModel) {
36+
const topic = postModel.topic;
37+
if (topic.accepted_answer) {
38+
const hasExcerpt = !!topic.accepted_answer.excerpt;
39+
const excerpt = hasExcerpt
40+
? ` <blockquote> ${topic.accepted_answer.excerpt} </blockquote> `
41+
: "";
42+
const solvedQuote = `
43+
<aside class='quote accepted-answer' data-post="${topic.get("accepted_answer").post_number}" data-topic="${topic.id}">
44+
<div class='title ${hasExcerpt ? "" : "title-only"}'>
45+
<div class="accepted-answer--solver">
46+
${topic.solvedByHtml}
47+
<\/div>
48+
<div class="accepted-answer--accepter">
49+
${topic.accepterHtml}
50+
<\/div>
51+
<div class="quote-controls"><\/div>
52+
</div>
53+
${excerpt}
54+
</aside>`;
55+
56+
const cooked = new PostCooked({ cooked: solvedQuote }, dec);
57+
return dec.rawHtml(cooked.init());
58+
}
59+
}
60+
}
61+
});
2962

3063
api.attachWidgetAction("post", "acceptAnswer", function () {
31-
acceptAnswer(this.model, this.appEvents);
64+
acceptAnswer(this.model, this.appEvents, this.currentUser);
3265
});
3366

3467
api.attachWidgetAction("post", "unacceptAnswer", function () {
@@ -132,6 +165,45 @@ function customizeWidgetPostMenu(api) {
132165
export default {
133166
name: "extend-for-solved-button",
134167
initialize() {
168+
Topic.reopen({
169+
// keeping this here cause there is complex localization
170+
solvedByHtml: computed("accepted_answer", "id", function () {
171+
const username = this.get("accepted_answer.username");
172+
const name = this.get("accepted_answer.name");
173+
const postNumber = this.get("accepted_answer.post_number");
174+
175+
if (!username || !postNumber) {
176+
return "";
177+
}
178+
179+
const displayedUser =
180+
this.siteSettings.display_name_on_posts && name
181+
? name
182+
: formatUsername(username);
183+
184+
return i18n("solved.accepted_html", {
185+
icon: iconHTML("square-check", { class: "accepted" }),
186+
username_lower: username.toLowerCase(),
187+
username: displayedUser,
188+
post_path: `${this.url}/${postNumber}`,
189+
post_number: postNumber,
190+
user_path: User.create({ username }).path,
191+
});
192+
}),
193+
accepterHtml: computed("accepted_answer", function () {
194+
const username = this.get("accepted_answer.accepter_username");
195+
const name = this.get("accepted_answer.accepter_name");
196+
const formattedUsername =
197+
this.siteSettings.display_name_on_posts && name
198+
? name
199+
: formatUsername(username);
200+
return i18n("solved.marked_solved_by", {
201+
username: formattedUsername,
202+
username_lower: username.toLowerCase(),
203+
});
204+
}),
205+
});
206+
135207
withPluginApi("2.0.0", (api) => {
136208
withSilencedDeprecations("discourse.hbr-topic-list-overrides", () => {
137209
let topicStatusIcons;

spec/system/solved_spec.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
describe "About page", type: :system do
4+
fab!(:admin)
5+
fab!(:solver) { Fabricate(:user) }
6+
fab!(:accepter) { Fabricate(:user) }
7+
fab!(:topic) { Fabricate(:post, user: admin).topic }
8+
fab!(:post1) { Fabricate(:post, topic:, user: solver, cooked: "The answer is 42") }
9+
let(:topic_page) { PageObjects::Pages::Topic.new }
10+
11+
before do
12+
SiteSetting.solved_enabled = true
13+
SiteSetting.allow_solved_on_all_topics = true
14+
SiteSetting.accept_all_solutions_allowed_groups = Group::AUTO_GROUPS[:everyone]
15+
end
16+
17+
it "accepts post as solution and shows in OP" do
18+
sign_in(accepter)
19+
20+
topic_page.visit_topic(topic, post_number: 2)
21+
22+
expect(topic_page).to have_css(".post-action-menu__solved-unaccepted")
23+
24+
find(".post-action-menu__solved-unaccepted").click
25+
26+
expect(topic_page).to have_css(".post-action-menu__solved-accepted")
27+
expect(topic_page.find(".title .accepted-answer--solver")).to have_content(
28+
"Solved by #{solver.username}",
29+
)
30+
expect(topic_page.find(".title .accepted-answer--accepter")).to have_content(
31+
"Marked as solved by #{accepter.username}",
32+
)
33+
expect(topic_page.find("blockquote")).to have_content("The answer is 42")
34+
end
35+
end

test/javascripts/helpers/discourse-solved-helpers.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,12 @@ export const postStreamWithAcceptedAnswerExcerpt = (excerpt) => {
199199
featured_link: null,
200200
topic_timer: null,
201201
message_bus_last_id: 0,
202-
accepted_answer: { post_number: 2, username: "kzh", excerpt },
202+
accepted_answer: {
203+
post_number: 2,
204+
username: "kzh",
205+
excerpt,
206+
accepter_username: "tomtom",
207+
accepter_name: "Tomtom",
208+
},
203209
};
204210
};

test/javascripts/integratin/discourse-solved-post-test.js

Lines changed: 0 additions & 89 deletions
This file was deleted.

0 commit comments

Comments
 (0)