diff --git a/.discourse-compatibility b/.discourse-compatibility index afd2841..1f32368 100644 --- a/.discourse-compatibility +++ b/.discourse-compatibility @@ -1,3 +1,4 @@ +< 3.5.0.beta7-dev: 03804e1065d6a3afa7e5f6060e6f342eb2b94374 < 3.5.0.beta5-dev: a8c534f11832d6bb8590ce5001119654fe6f335f < 3.5.0.beta3-dev: 4f0234f5be3aaa77db277e0f224cd9750d2713cd < 3.5.0.beta2-dev: e82c6ae1ca38ccebb34669148f8de93a3028906e diff --git a/assets/javascripts/discourse/components/solved-accept-answer-button.gjs b/assets/javascripts/discourse/components/solved-accept-answer-button.gjs index d402a6b..b7147a2 100644 --- a/assets/javascripts/discourse/components/solved-accept-answer-button.gjs +++ b/assets/javascripts/discourse/components/solved-accept-answer-button.gjs @@ -27,6 +27,7 @@ export default class SolvedAcceptAnswerButton extends Component { post.get("topic.postStream.posts").forEach((p) => { p.set("topic_accepted_answer", true); + // TODO (glimmer-post-stream) the Glimmer Post Stream does not listen to this event this.appEvents.trigger("post-stream:refresh", { id: p.id }); }); } diff --git a/assets/javascripts/discourse/components/solved-accepted-answer.gjs b/assets/javascripts/discourse/components/solved-accepted-answer.gjs index fcafef5..73edaa6 100644 --- a/assets/javascripts/discourse/components/solved-accepted-answer.gjs +++ b/assets/javascripts/discourse/components/solved-accepted-answer.gjs @@ -1,14 +1,7 @@ import Component from "@glimmer/component"; -import { tracked } from "@glimmer/tracking"; -import { on } from "@ember/modifier"; -import { action } from "@ember/object"; import { service } from "@ember/service"; import { htmlSafe } from "@ember/template"; -import AsyncContent from "discourse/components/async-content"; -import PostCookedHtml from "discourse/components/post/cooked-html"; -import concatClass from "discourse/helpers/concat-class"; -import icon from "discourse/helpers/d-icon"; -import { ajax } from "discourse/lib/ajax"; +import PostQuotedContent from "discourse/components/post/quoted-content"; import { iconHTML } from "discourse/lib/icon-library"; import { formatUsername } from "discourse/lib/utilities"; import { i18n } from "discourse-i18n"; @@ -17,7 +10,9 @@ export default class SolvedAcceptedAnswer extends Component { @service siteSettings; @service store; - @tracked expanded = false; + get topic() { + return this.args.post.topic; + } get acceptedAnswer() { return this.topic.accepted_answer; @@ -27,49 +22,45 @@ export default class SolvedAcceptedAnswer extends Component { return `accepted-answer-${this.topic.id}-${this.acceptedAnswer.post_number}`; } - get topic() { - return this.args.post.topic; - } - get hasExcerpt() { return !!this.acceptedAnswer.excerpt; } - get htmlAccepter() { - const username = this.acceptedAnswer.accepter_username; - const name = this.acceptedAnswer.accepter_name; + get collapsedContent() { + if (!this.hasExcerpt) { + return null; + } + return htmlSafe(this.acceptedAnswer.excerpt); + } + + get htmlAccepter() { if (!this.siteSettings.show_who_marked_solved) { return; } - const formattedUsername = - this.siteSettings.display_name_on_posts && name - ? name - : formatUsername(username); + const { accepter_username, accepter_name } = this.acceptedAnswer; + const displayName = this.#getDisplayName(accepter_username, accepter_name); + + if (!displayName) { + return; + } return htmlSafe( i18n("solved.marked_solved_by", { - username: formattedUsername, - username_lower: username.toLowerCase(), + username: displayName, + username_lower: accepter_username.toLowerCase(), }) ); } get htmlSolvedBy() { - const username = this.acceptedAnswer.username; - const name = this.acceptedAnswer.name; - const postNumber = this.acceptedAnswer.post_number; - + const { username, name, post_number: postNumber } = this.acceptedAnswer; if (!username || !postNumber) { return; } - const displayedUser = - this.siteSettings.display_name_on_posts && name - ? name - : formatUsername(username); - + const displayedUser = this.#getDisplayName(username, name); const data = { icon: iconHTML("square-check", { class: "accepted" }), username_lower: username.toLowerCase(), @@ -82,40 +73,28 @@ export default class SolvedAcceptedAnswer extends Component { return htmlSafe(i18n("solved.accepted_html", data)); } - @action - toggleExpandedPost() { - if (!this.hasExcerpt) { - return; + #getDisplayName(username, name) { + if (!username) { + return null; } - this.expanded = !this.expanded; - } - - @action - async loadExpandedAcceptedAnswer(postNumber) { - const acceptedAnswer = await ajax( - `/posts/by_number/${this.topic.id}/${postNumber}` - ); - - return this.store.createRecord("post", acceptedAnswer); + return this.siteSettings.display_name_on_posts && name + ? name + : formatUsername(username); } } diff --git a/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs b/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs index 3c47156..afc261d 100644 --- a/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs +++ b/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs @@ -44,6 +44,7 @@ export default class SolvedUnacceptAnswerButton extends Component { post.get("topic.postStream.posts").forEach((p) => { p.set("topic_accepted_answer", false); + // TODO (glimmer-post-stream) the Glimmer Post Stream does not listen to this event this.appEvents.trigger("post-stream:refresh", { id: p.id }); }); } diff --git a/assets/javascripts/discourse/initializers/extend-for-solved-button.gjs b/assets/javascripts/discourse/initializers/extend-for-solved-button.gjs index cd732e1..8b2362d 100644 --- a/assets/javascripts/discourse/initializers/extend-for-solved-button.gjs +++ b/assets/javascripts/discourse/initializers/extend-for-solved-button.gjs @@ -31,7 +31,12 @@ function customizePost(api) { return args.post.post_number === 1 && args.post.topic.accepted_answer; } - + } ); diff --git a/spec/system/solved_spec.rb b/spec/system/solved_spec.rb index dc17f7a..32de560 100644 --- a/spec/system/solved_spec.rb +++ b/spec/system/solved_spec.rb @@ -29,6 +29,8 @@ describe "About page", type: :system do find(".post-action-menu__solved-unaccepted").click expect(topic_page).to have_css(".post-action-menu__solved-accepted") + + expect(topic_page).to have_css("aside.accepted-answer.quote[data-expanded='false']") expect(topic_page.find(".title .accepted-answer--solver")).to have_content( "Solved by #{solver.username}", ) @@ -36,6 +38,10 @@ describe "About page", type: :system do "Marked as solved by #{accepter.username}", ) expect(topic_page.find("blockquote")).to have_content("The answer is 42") + + # ensure the quoted post can be expanded + topic_page.find("aside.accepted-answer.quote button.quote-toggle").click + expect(topic_page).to have_css("aside.accepted-answer.quote[data-expanded='true']") end end end