diff --git a/plugins/discourse-topic-voting/assets/javascripts/discourse/components/vote-button.gjs b/plugins/discourse-topic-voting/assets/javascripts/discourse/components/vote-button.gjs index 7bad525a896..5357c91c389 100644 --- a/plugins/discourse-topic-voting/assets/javascripts/discourse/components/vote-button.gjs +++ b/plugins/discourse-topic-voting/assets/javascripts/discourse/components/vote-button.gjs @@ -15,9 +15,10 @@ export default class VoteBox extends Component { @tracked hasVoted = false; @tracked hasSeenSuccessMenu = false; - topic = this.args.topic; - alreadyVoted = this.topic.user_voted; + get topic() { + return this.args.topic; + } get buttonContent() { const content = {}; @@ -58,6 +59,11 @@ export default class VoteBox extends Component { @action onShowMenu() { + if (!this.topic.user_voted) { + this.hasVoted = false; + this.hasSeenSuccessMenu = false; + } + applyBehaviorTransformer("topic-vote-button-click", () => { if (!this.currentUser) { return this.args.showLogin(); @@ -174,14 +180,16 @@ export default class VoteBox extends Component { class="btn-transparent see-votes topic-voting-menu__row-btn" /> - - - + {{#if this.topic.user_voted}} + + + + {{/if}} {{/if}} diff --git a/plugins/discourse-topic-voting/spec/system/page_objects/pages/topic.rb b/plugins/discourse-topic-voting/spec/system/page_objects/pages/topic.rb index 43d4befcb33..2f9b36caf33 100644 --- a/plugins/discourse-topic-voting/spec/system/page_objects/pages/topic.rb +++ b/plugins/discourse-topic-voting/spec/system/page_objects/pages/topic.rb @@ -33,6 +33,14 @@ module TopicVotingTopic def click_my_votes find(".topic-voting-menu__votes-left").click end + + def has_vote_button_label?(text) + has_css?("button.vote-button", text: text) + end + + def has_no_remove_vote_button? + has_no_css?("button.remove-vote") + end end PageObjects::Pages::Topic.include(TopicVotingTopic) diff --git a/plugins/discourse-topic-voting/spec/system/voting_spec.rb b/plugins/discourse-topic-voting/spec/system/voting_spec.rb index 2057067fa1f..80604f5b661 100644 --- a/plugins/discourse-topic-voting/spec/system/voting_spec.rb +++ b/plugins/discourse-topic-voting/spec/system/voting_spec.rb @@ -63,6 +63,52 @@ RSpec.describe "Topic voting", type: :system do expect(topic_page.vote_count).to have_text("0") end + context "when navigating between voting topics" do + fab!(:voting_post1) { Fabricate(:post, topic: voting_topic1) } + fab!(:voting_post2) { Fabricate(:post, topic: voting_topic2) } + fab!(:voting_post3) { Fabricate(:post, topic: voting_topic3) } + + before { DiscourseTopicVoting::CategorySetting.create!(category: voting_category) } + + it "resets vote UI state after route transitions" do + voting_topic3.update!(closed: true) + Fabricate(:post, topic: voting_topic3, raw: "Check out #{voting_topic1.url}") + Fabricate(:post, topic: voting_topic1, raw: "Check out #{voting_topic2.url}") + + visit("/t/#{voting_topic3.slug}/#{voting_topic3.id}") + expect(topic_page).to have_vote_button_label(I18n.t("js.topic_voting.voting_closed_title")) + + find("a[href='#{voting_topic1.url}']").click + expect(topic_page).to have_vote_button_label(I18n.t("js.topic_voting.vote_title")) + + topic_page.vote + expect(topic_page.vote_popup).to have_text( + I18n.t("js.topic_voting.see_votes", count: 9, max: 10), + ) + + find("a[href='#{voting_topic2.url}']").click + expect(topic_page).to have_vote_button_label(I18n.t("js.topic_voting.vote_title")) + + topic_page.vote + expect(topic_page.vote_popup).to have_text( + I18n.t("js.topic_voting.see_votes", count: 8, max: 10), + ) + end + end + + context "when viewing a closed voting topic without having voted" do + before { DiscourseTopicVoting::CategorySetting.create!(category: voting_category) } + + it "does not show the remove vote button" do + voting_topic1.update!(closed: true) + Fabricate(:post, topic: voting_topic1) + + visit("/t/#{voting_topic1.slug}/#{voting_topic1.id}") + topic_page.vote + expect(topic_page).to have_no_remove_vote_button + end + end + context "when no votes are left" do before do DiscourseTopicVoting::CategorySetting.create!(category: category1)