- ${topic.acceptedAnswerHtml}
<\/div>
-
-
- ${topic.accepted_answer.excerpt}
-
- `;
-
- const withoutExcerpt = `
-
`;
-
- const cooked = new PostCooked(
- { cooked: hasExcerpt ? withExcerpt : withoutExcerpt },
- dec
- );
- return dec.rawHtml(cooked.init());
- }
- }
- }
- });
-
- api.attachWidgetAction("post", "acceptAnswer", function () {
- const post = this.model;
- acceptPost(post);
-
- this.appEvents.trigger("discourse-solved:solution-toggled", post);
-
- post.get("topic.postStream.posts").forEach((p) => {
- p.set("topic_accepted_answer", true);
- this.appEvents.trigger("post-stream:refresh", { id: p.id });
- });
- });
-
- api.attachWidgetAction("post", "unacceptAnswer", function () {
- const post = this.model;
- unacceptPost(post);
-
- this.appEvents.trigger("discourse-solved:solution-toggled", post);
-
- post.get("topic.postStream.posts").forEach((p) => {
- p.set("topic_accepted_answer", false);
- this.appEvents.trigger("post-stream:refresh", { id: p.id });
- });
- });
}
export default {
@@ -252,7 +233,7 @@ export default {
}),
});
- withPluginApi("0.1", initializeWithApi);
+ withPluginApi("1.34.0", initializeWithApi);
withPluginApi("0.8.10", (api) => {
api.replaceIcon(
diff --git a/assets/stylesheets/solutions.scss b/assets/stylesheets/solutions.scss
index 11d183f..b4d0ef0 100644
--- a/assets/stylesheets/solutions.scss
+++ b/assets/stylesheets/solutions.scss
@@ -14,15 +14,6 @@ $solved-color: green;
color: $solved-color;
}
-.post-controls {
- .accepted,
- .unaccepted {
- .d-button-label {
- margin-left: 7px;
- }
- }
-}
-
.post-controls .extra-buttons {
// anon text
.accepted-text {
diff --git a/test/javascripts/acceptance/discourse-solved-post-menu-test.js b/test/javascripts/acceptance/discourse-solved-post-menu-test.js
new file mode 100644
index 0000000..60df5ba
--- /dev/null
+++ b/test/javascripts/acceptance/discourse-solved-post-menu-test.js
@@ -0,0 +1,52 @@
+import { click, visit } from "@ember/test-helpers";
+import { test } from "qunit";
+import { acceptance } from "discourse/tests/helpers/qunit-helpers";
+import I18n from "I18n";
+import { postStreamWithAcceptedAnswerExcerpt } from "../helpers/discourse-solved-helpers";
+
+acceptance(
+ "Discourse Solved | Post Menu | Accept and Unaccept",
+ function (needs) {
+ needs.user({
+ admin: true,
+ });
+
+ needs.settings({
+ glimmer_post_menu_mode: "enabled",
+ solved_enabled: true,
+ allow_solved_on_all_topics: true,
+ });
+
+ needs.pretender((server, helper) => {
+ server.post("/solution/accept", () => helper.response({ success: "OK" }));
+ server.post("/solution/unaccept", () =>
+ helper.response({ success: "OK" })
+ );
+
+ server.get("/t/12.json", () => {
+ return helper.response(postStreamWithAcceptedAnswerExcerpt(null));
+ });
+ });
+
+ test("accepting and unaccepting a post works", async function (assert) {
+ await visit("/t/without-excerpt/12");
+
+ assert
+ .dom("#post_2 .post-action-menu__solved-accepted")
+ .exists("Unaccept button is visible")
+ .hasText(I18n.t("solved.solution"), "Unaccept button has correct text");
+
+ await click("#post_2 .post-action-menu__solved-accepted");
+
+ assert
+ .dom("#post_2 .post-action-menu__solved-unaccepted")
+ .exists("Accept button is visible");
+
+ await click("#post_2 .post-action-menu__solved-unaccepted");
+
+ assert
+ .dom("#post_2 .post-action-menu__solved-accepted")
+ .exists("Unccept button is visible again");
+ });
+ }
+);
diff --git a/test/javascripts/acceptance/discourse-solved-test.js b/test/javascripts/acceptance/discourse-solved-test.js
index 0a9e5ea..8609580 100644
--- a/test/javascripts/acceptance/discourse-solved-test.js
+++ b/test/javascripts/acceptance/discourse-solved-test.js
@@ -3,221 +3,12 @@ import { test } from "qunit";
import { fixturesByUrl } from "discourse/tests/helpers/create-pretender";
import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers";
import { cloneJSON } from "discourse-common/lib/object";
+import { postStreamWithAcceptedAnswerExcerpt } from "../helpers/discourse-solved-helpers";
acceptance("Discourse Solved Plugin", function (needs) {
needs.user();
needs.pretender((server, helper) => {
- const postStreamWithAcceptedAnswerExcerpt = (excerpt) => {
- return {
- post_stream: {
- posts: [
- {
- id: 21,
- name: null,
- username: "kzh",
- avatar_template:
- "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
- created_at: "2017-08-08T20:11:32.542Z",
- cooked: "
How do I declare a variable in ruby?
",
- post_number: 1,
- post_type: 1,
- updated_at: "2017-08-08T21:03:30.521Z",
- reply_count: 0,
- reply_to_post_number: null,
- quote_count: 0,
- avg_time: null,
- incoming_link_count: 0,
- reads: 1,
- score: 0,
- yours: true,
- topic_id: 23,
- topic_slug: "test-solved",
- display_username: null,
- primary_group_name: null,
- primary_group_flair_url: null,
- primary_group_flair_bg_color: null,
- primary_group_flair_color: null,
- version: 2,
- can_edit: true,
- can_delete: false,
- can_recover: null,
- can_wiki: true,
- read: true,
- user_title: null,
- actions_summary: [
- { id: 3, can_act: true },
- { id: 4, can_act: true },
- { id: 5, hidden: true, can_act: true },
- { id: 7, can_act: true },
- { id: 8, can_act: true },
- ],
- moderator: false,
- admin: true,
- staff: true,
- user_id: 1,
- hidden: false,
- hidden_reason_id: null,
- trust_level: 4,
- deleted_at: null,
- user_deleted: false,
- edit_reason: null,
- can_view_edit_history: true,
- wiki: false,
- can_accept_answer: false,
- can_unaccept_answer: false,
- accepted_answer: false,
- },
- {
- id: 22,
- name: null,
- username: "kzh",
- avatar_template:
- "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
- created_at: "2017-08-08T20:12:04.657Z",
- cooked:
- "
this is a long answer that potentially solves the question
",
- post_number: 2,
- post_type: 1,
- updated_at: "2017-08-08T21:20:24.417Z",
- reply_count: 0,
- reply_to_post_number: null,
- quote_count: 0,
- avg_time: null,
- incoming_link_count: 0,
- reads: 1,
- score: 0,
- yours: true,
- topic_id: 23,
- topic_slug: "test-solved",
- display_username: null,
- primary_group_name: null,
- primary_group_flair_url: null,
- primary_group_flair_bg_color: null,
- primary_group_flair_color: null,
- version: 2,
- can_edit: true,
- can_delete: true,
- can_recover: null,
- can_wiki: true,
- read: true,
- user_title: null,
- actions_summary: [
- { id: 3, can_act: true },
- { id: 4, can_act: true },
- { id: 5, hidden: true, can_act: true },
- { id: 7, can_act: true },
- { id: 8, can_act: true },
- ],
- moderator: false,
- admin: true,
- staff: true,
- user_id: 1,
- hidden: false,
- hidden_reason_id: null,
- trust_level: 4,
- deleted_at: null,
- user_deleted: false,
- edit_reason: null,
- can_view_edit_history: true,
- wiki: false,
- can_accept_answer: false,
- can_unaccept_answer: true,
- accepted_answer: true,
- },
- ],
- stream: [21, 22],
- },
- timeline_lookup: [[1, 0]],
- id: 23,
- title: "Test solved",
- fancy_title: "Test solved",
- posts_count: 2,
- created_at: "2017-08-08T20:11:32.098Z",
- views: 6,
- reply_count: 0,
- participant_count: 1,
- like_count: 0,
- last_posted_at: "2017-08-08T20:12:04.657Z",
- visible: true,
- closed: false,
- archived: false,
- has_summary: false,
- archetype: "regular",
- slug: "test-solved",
- category_id: 1,
- word_count: 18,
- deleted_at: null,
- pending_posts_count: 0,
- user_id: 1,
- pm_with_non_human_user: false,
- draft: null,
- draft_key: "topic_23",
- draft_sequence: 6,
- posted: true,
- unpinned: null,
- pinned_globally: false,
- pinned: false,
- pinned_at: null,
- pinned_until: null,
- details: {
- created_by: {
- id: 1,
- username: "kzh",
- avatar_template:
- "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
- },
- last_poster: {
- id: 1,
- username: "kzh",
- avatar_template:
- "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
- },
- participants: [
- {
- id: 1,
- username: "kzh",
- avatar_template:
- "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
- post_count: 2,
- primary_group_name: null,
- primary_group_flair_url: null,
- primary_group_flair_color: null,
- primary_group_flair_bg_color: null,
- },
- ],
- notification_level: 3,
- notifications_reason_id: 1,
- can_move_posts: true,
- can_edit: true,
- can_delete: true,
- can_remove_allowed_users: true,
- can_invite_to: true,
- can_invite_via_email: true,
- can_create_post: true,
- can_reply_as_new_topic: true,
- can_flag_topic: true,
- },
- highest_post_number: 2,
- last_read_post_number: 2,
- last_read_post_id: 22,
- deleted_by: null,
- has_deleted: false,
- actions_summary: [
- { id: 4, count: 0, hidden: false, can_act: true },
- { id: 7, count: 0, hidden: false, can_act: true },
- { id: 8, count: 0, hidden: false, can_act: true },
- ],
- chunk_size: 20,
- bookmarked: false,
- tags: [],
- featured_link: null,
- topic_timer: null,
- message_bus_last_id: 0,
- accepted_answer: { post_number: 2, username: "kzh", excerpt },
- };
- };
-
server.get("/t/11.json", () => {
return helper.response(
postStreamWithAcceptedAnswerExcerpt("this is an excerpt")
diff --git a/test/javascripts/acceptance/discourse-solved-widget-post-menu-test.js b/test/javascripts/acceptance/discourse-solved-widget-post-menu-test.js
new file mode 100644
index 0000000..e390d2f
--- /dev/null
+++ b/test/javascripts/acceptance/discourse-solved-widget-post-menu-test.js
@@ -0,0 +1,48 @@
+import { click, visit } from "@ember/test-helpers";
+import { test } from "qunit";
+import { acceptance } from "discourse/tests/helpers/qunit-helpers";
+import I18n from "I18n";
+import { postStreamWithAcceptedAnswerExcerpt } from "../helpers/discourse-solved-helpers";
+
+acceptance(
+ "Discourse Solved | Widget Post Menu |Accept and Unaccept",
+ function (needs) {
+ needs.user({
+ admin: true,
+ });
+
+ needs.settings({
+ glimmer_post_menu_mode: "disabled",
+ solved_enabled: true,
+ allow_solved_on_all_topics: true,
+ });
+
+ needs.pretender((server, helper) => {
+ server.post("/solution/accept", () => helper.response({ success: "OK" }));
+ server.post("/solution/unaccept", () =>
+ helper.response({ success: "OK" })
+ );
+
+ server.get("/t/12.json", () => {
+ return helper.response(postStreamWithAcceptedAnswerExcerpt(null));
+ });
+ });
+
+ test("accepting and unaccepting a post works", async function (assert) {
+ await visit("/t/without-excerpt/12");
+
+ assert
+ .dom("#post_2 .accepted")
+ .exists("Unaccept button is visible")
+ .hasText(I18n.t("solved.solution"), "Unaccept button has correct text");
+
+ await click("#post_2 .accepted");
+
+ assert.dom("#post_2 .unaccepted").exists("Accept button is visible");
+
+ await click("#post_2 .unaccepted");
+
+ assert.dom("#post_2 .accepted").exists("Unccept button is visible again");
+ });
+ }
+);
diff --git a/test/javascripts/helpers/discourse-solved-helpers.js b/test/javascripts/helpers/discourse-solved-helpers.js
new file mode 100644
index 0000000..2ee351e
--- /dev/null
+++ b/test/javascripts/helpers/discourse-solved-helpers.js
@@ -0,0 +1,204 @@
+export const postStreamWithAcceptedAnswerExcerpt = (excerpt) => {
+ return {
+ post_stream: {
+ posts: [
+ {
+ id: 21,
+ name: null,
+ username: "kzh",
+ avatar_template: "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
+ created_at: "2017-08-08T20:11:32.542Z",
+ cooked: "
How do I declare a variable in ruby?
",
+ post_number: 1,
+ post_type: 1,
+ updated_at: "2017-08-08T21:03:30.521Z",
+ reply_count: 0,
+ reply_to_post_number: null,
+ quote_count: 0,
+ avg_time: null,
+ incoming_link_count: 0,
+ reads: 1,
+ score: 0,
+ yours: true,
+ topic_id: 23,
+ topic_slug: "test-solved",
+ display_username: null,
+ primary_group_name: null,
+ primary_group_flair_url: null,
+ primary_group_flair_bg_color: null,
+ primary_group_flair_color: null,
+ version: 2,
+ can_edit: true,
+ can_delete: false,
+ can_recover: null,
+ can_wiki: true,
+ read: true,
+ user_title: null,
+ actions_summary: [
+ { id: 3, can_act: true },
+ { id: 4, can_act: true },
+ { id: 5, hidden: true, can_act: true },
+ { id: 7, can_act: true },
+ { id: 8, can_act: true },
+ ],
+ moderator: false,
+ admin: true,
+ staff: true,
+ user_id: 1,
+ hidden: false,
+ hidden_reason_id: null,
+ trust_level: 4,
+ deleted_at: null,
+ user_deleted: false,
+ edit_reason: null,
+ can_view_edit_history: true,
+ wiki: false,
+ can_accept_answer: false,
+ can_unaccept_answer: false,
+ accepted_answer: false,
+ },
+ {
+ id: 22,
+ name: null,
+ username: "kzh",
+ avatar_template: "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
+ created_at: "2017-08-08T20:12:04.657Z",
+ cooked:
+ "
this is a long answer that potentially solves the question
",
+ post_number: 2,
+ post_type: 1,
+ updated_at: "2017-08-08T21:20:24.417Z",
+ reply_count: 0,
+ reply_to_post_number: null,
+ quote_count: 0,
+ avg_time: null,
+ incoming_link_count: 0,
+ reads: 1,
+ score: 0,
+ yours: true,
+ topic_id: 23,
+ topic_slug: "test-solved",
+ display_username: null,
+ primary_group_name: null,
+ primary_group_flair_url: null,
+ primary_group_flair_bg_color: null,
+ primary_group_flair_color: null,
+ version: 2,
+ can_edit: true,
+ can_delete: true,
+ can_recover: null,
+ can_wiki: true,
+ read: true,
+ user_title: null,
+ actions_summary: [
+ { id: 3, can_act: true },
+ { id: 4, can_act: true },
+ { id: 5, hidden: true, can_act: true },
+ { id: 7, can_act: true },
+ { id: 8, can_act: true },
+ ],
+ moderator: false,
+ admin: true,
+ staff: true,
+ user_id: 1,
+ hidden: false,
+ hidden_reason_id: null,
+ trust_level: 4,
+ deleted_at: null,
+ user_deleted: false,
+ edit_reason: null,
+ can_view_edit_history: true,
+ wiki: false,
+ can_accept_answer: false,
+ can_unaccept_answer: true,
+ accepted_answer: true,
+ },
+ ],
+ stream: [21, 22],
+ },
+ timeline_lookup: [[1, 0]],
+ id: 23,
+ title: "Test solved",
+ fancy_title: "Test solved",
+ posts_count: 2,
+ created_at: "2017-08-08T20:11:32.098Z",
+ views: 6,
+ reply_count: 0,
+ participant_count: 1,
+ like_count: 0,
+ last_posted_at: "2017-08-08T20:12:04.657Z",
+ visible: true,
+ closed: false,
+ archived: false,
+ has_summary: false,
+ archetype: "regular",
+ slug: "test-solved",
+ category_id: 1,
+ word_count: 18,
+ deleted_at: null,
+ pending_posts_count: 0,
+ user_id: 1,
+ pm_with_non_human_user: false,
+ draft: null,
+ draft_key: "topic_23",
+ draft_sequence: 6,
+ posted: true,
+ unpinned: null,
+ pinned_globally: false,
+ pinned: false,
+ pinned_at: null,
+ pinned_until: null,
+ details: {
+ created_by: {
+ id: 1,
+ username: "kzh",
+ avatar_template: "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
+ },
+ last_poster: {
+ id: 1,
+ username: "kzh",
+ avatar_template: "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
+ },
+ participants: [
+ {
+ id: 1,
+ username: "kzh",
+ avatar_template: "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
+ post_count: 2,
+ primary_group_name: null,
+ primary_group_flair_url: null,
+ primary_group_flair_color: null,
+ primary_group_flair_bg_color: null,
+ },
+ ],
+ notification_level: 3,
+ notifications_reason_id: 1,
+ can_move_posts: true,
+ can_edit: true,
+ can_delete: true,
+ can_remove_allowed_users: true,
+ can_invite_to: true,
+ can_invite_via_email: true,
+ can_create_post: true,
+ can_reply_as_new_topic: true,
+ can_flag_topic: true,
+ },
+ highest_post_number: 2,
+ last_read_post_number: 2,
+ last_read_post_id: 22,
+ deleted_by: null,
+ has_deleted: false,
+ actions_summary: [
+ { id: 4, count: 0, hidden: false, can_act: true },
+ { id: 7, count: 0, hidden: false, can_act: true },
+ { id: 8, count: 0, hidden: false, can_act: true },
+ ],
+ chunk_size: 20,
+ bookmarked: false,
+ tags: [],
+ featured_link: null,
+ topic_timer: null,
+ message_bus_last_id: 0,
+ accepted_answer: { post_number: 2, username: "kzh", excerpt },
+ };
+};