0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-08 17:53:55 +08:00
discourse/plugins/discourse-topic-voting/lib/discourse_topic_voting/user_extension.rb
Régis Hanol a9d2e8272a
FIX: Show the voting notification prompt when vote limits are disabled (#41731)
When topic voting vote limits are disabled, the "Notify me about new
posts"
prompt shown after voting never appeared. That prompt is part of the
menu the
vote button opens, but the menu was only rendered when vote limits were
enabled — with limits off the button had no menu at all, so both the
notification prompt and the remove-vote action were unreachable.

The fix renders the menu for any signed-in user rather than gating it on
vote
limits. The remaining-votes rows stay tied to limits being enabled,
while
remove-vote and watch-topic show whenever the user has voted. Removing a
vote
with limits disabled now goes through the menu, matching the behavior
when
limits are enabled.

Reported at
https://meta.discourse.org/t/disabling-vote-limits-seems-to-break-notification-prompt-in-topic-voting/407512

The second commit is follow-up housekeeping on the plugin, kept separate
from
the fix: removing dead code and duplication in the vote components and
initializers, counting a user's votes with `COUNT` instead of loading
every
row on each current-user serialization, and deleting orphaned i18n keys
and a
route-map filename left over from the plugin's former name.

### Testing

- Added a system spec covering the notification prompt appearing after
voting
  with vote limits disabled.
- Existing topic-voting system and JS specs pass; the model spec still
covers
  the trust-level-0 lock via `reached_voting_limit?`.
2026-07-15 14:54:37 +02:00

45 lines
1.1 KiB
Ruby
Vendored

# frozen_string_literal: true
module DiscourseTopicVoting
module UserExtension
extend ActiveSupport::Concern
prepended { has_many :votes, class_name: "DiscourseTopicVoting::Vote", dependent: :destroy }
def vote_count
topics_with_vote.count
end
def alert_low_votes?
return false unless SiteSetting.topic_voting_enable_vote_limits
(vote_limit - vote_count) <= SiteSetting.topic_voting_alert_votes_left
end
def topics_with_vote
votes.where(archive: false)
end
def topics_with_archived_vote
votes.where(archive: true)
end
def can_vote?
!reached_voting_limit?
end
def reached_voting_limit?
return false unless SiteSetting.topic_voting_enable_vote_limits
vote_count >= vote_limit
end
def vote_limit
return nil unless SiteSetting.topic_voting_enable_vote_limits
SiteSetting.public_send("topic_voting_tl#{trust_level}_vote_limit")
end
def votes_left
return nil unless SiteSetting.topic_voting_enable_vote_limits
[vote_limit - vote_count, 0].max
end
end
end