Immediately display poll results to poll author (#10187)

* Immediately display poll results to poll author

* Refactor Poll#loaded_options and add Poll#voted? to improve DRYness
This commit is contained in:
Eugen Rochko 2019-03-07 22:53:47 +01:00 committed by GitHub
parent 75cb93676b
commit 054bbb3da2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 14 additions and 24 deletions

View File

@ -41,17 +41,17 @@ class Poll < ApplicationRecord
after_commit :reset_parent_cache, on: :update after_commit :reset_parent_cache, on: :update
def loaded_options def loaded_options
options.map.with_index { |title, key| Option.new(self, key.to_s, title, cached_tallies[key]) } options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? cached_tallies[key] : nil) }
end
def unloaded_options
options.map.with_index { |title, key| Option.new(self, key.to_s, title, nil) }
end end
def possibly_stale? def possibly_stale?
remote? && last_fetched_before_expiration? && time_passed_since_last_fetch? remote? && last_fetched_before_expiration? && time_passed_since_last_fetch?
end end
def voted?(account)
account.id == account_id || votes.where(account: account).exists?
end
delegate :local?, to: :account delegate :local?, to: :account
def remote? def remote?
@ -95,4 +95,8 @@ class Poll < ApplicationRecord
def time_passed_since_last_fetch? def time_passed_since_last_fetch?
last_fetched_at.nil? || last_fetched_at < 1.minute.ago last_fetched_at.nil? || last_fetched_at < 1.minute.ago
end end
def show_totals_now?
expired? || !hide_totals?
end
end end

View File

@ -122,12 +122,8 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
end end
def poll_options def poll_options
if !object.poll.expired? && object.poll.hide_totals?
object.poll.unloaded_options
else
object.poll.loaded_options object.poll.loaded_options
end end
end
def poll_and_multiple? def poll_and_multiple?
object.poll&.multiple? object.poll&.multiple?

View File

@ -4,7 +4,7 @@ class REST::PollSerializer < ActiveModel::Serializer
attributes :id, :expires_at, :expired, attributes :id, :expires_at, :expired,
:multiple, :votes_count :multiple, :votes_count
has_many :dynamic_options, key: :options has_many :loaded_options, key: :options
attribute :voted, if: :current_user? attribute :voted, if: :current_user?
@ -12,20 +12,12 @@ class REST::PollSerializer < ActiveModel::Serializer
object.id.to_s object.id.to_s
end end
def dynamic_options
if !object.expired? && object.hide_totals?
object.unloaded_options
else
object.loaded_options
end
end
def expired def expired
object.expired? object.expired?
end end
def voted def voted
object.votes.where(account: current_user.account).exists? object.voted?(current_user.account)
end end
def current_user? def current_user?

View File

@ -1,10 +1,8 @@
- options = (!poll.expired? && poll.hide_totals?) ? poll.unloaded_options : poll.loaded_options - show_results = (user_signed_in? && poll.voted?(current_account)) || poll.expired?
- voted = user_signed_in? && poll.votes.where(account: current_account).exists?
- show_results = voted || poll.expired?
.poll .poll
%ul %ul
- options.each do |option| - poll.loaded_options.each do |option|
%li %li
- if show_results - if show_results
- percent = poll.votes_count > 0 ? 100 * option.votes_count / poll.votes_count : 0 - percent = poll.votes_count > 0 ? 100 * option.votes_count / poll.votes_count : 0