about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2019-03-05 03:51:18 +0100
committerGitHub <noreply@github.com>2019-03-05 03:51:18 +0100
commita198add83bb527c32fa0e01404338562b157da99 (patch)
treec5a507a1e40092b89fe0c8ab6ffe36fa126628f1 /app
parent0a39c81dd87242feb84da68b8907c3e45620eadf (diff)
Fix various issues in polls (#10165)
* Fix ActivityPub poll results being serialized even with hide_totals

* Fix poll refresh button having a different font size

* Display poll in OpenGraph description

* Fix NoMethodError when serializing votes

Regression from #10158

* Fix polls on public pages being broken for non-logged-in users

* Do not show time remaining if poll has no expiration date
Diffstat (limited to 'app')
-rw-r--r--app/helpers/stream_entries_helper.rb12
-rw-r--r--app/javascript/mastodon/components/poll.js5
-rw-r--r--app/javascript/styles/mastodon/polls.scss1
-rw-r--r--app/models/poll_vote.rb4
-rw-r--r--app/serializers/activitypub/note_serializer.rb12
-rw-r--r--app/views/stream_entries/_poll.html.haml16
6 files changed, 37 insertions, 13 deletions
diff --git a/app/helpers/stream_entries_helper.rb b/app/helpers/stream_entries_helper.rb
index 7a74c0b7d..8392afa73 100644
--- a/app/helpers/stream_entries_helper.rb
+++ b/app/helpers/stream_entries_helper.rb
@@ -104,9 +104,19 @@ module StreamEntriesHelper
     I18n.t('statuses.content_warning', warning: status.spoiler_text)
   end
 
+  def poll_summary(status)
+    return unless status.poll
+    status.poll.options.map { |o| "[ ] #{o}" }.join("\n")
+  end
+
   def status_description(status)
     components = [[media_summary(status), status_text_summary(status)].reject(&:blank?).join(' · ')]
-    components << status.text if status.spoiler_text.blank?
+
+    if status.spoiler_text.blank?
+      components << status.text
+      components << poll_summary(status)
+    end
+
     components.reject(&:blank?).join("\n\n")
   end
 
diff --git a/app/javascript/mastodon/components/poll.js b/app/javascript/mastodon/components/poll.js
index e9124aefa..182491af8 100644
--- a/app/javascript/mastodon/components/poll.js
+++ b/app/javascript/mastodon/components/poll.js
@@ -118,7 +118,7 @@ class Poll extends ImmutablePureComponent {
           />
 
           {!showResults && <span className={classNames('poll__input', { checkbox: poll.get('multiple'), active })} />}
-          {showResults && <span className='poll__number'>{Math.floor(percent)}%</span>}
+          {showResults && <span className='poll__number'>{Math.round(percent)}%</span>}
 
           {option.get('title')}
         </label>
@@ -146,7 +146,8 @@ class Poll extends ImmutablePureComponent {
         <div className='poll__footer'>
           {!showResults && <button className='button button-secondary' disabled={disabled} onClick={this.handleVote}><FormattedMessage id='poll.vote' defaultMessage='Vote' /></button>}
           {showResults && !this.props.disabled && <span><button className='poll__link' onClick={this.handleRefresh}><FormattedMessage id='poll.refresh' defaultMessage='Refresh' /></button> · </span>}
-          <FormattedMessage id='poll.total_votes' defaultMessage='{count, plural, one {# vote} other {# votes}}' values={{ count: poll.get('votes_count') }} />  · {timeRemaining}
+          <FormattedMessage id='poll.total_votes' defaultMessage='{count, plural, one {# vote} other {# votes}}' values={{ count: poll.get('votes_count') }} />
+          {poll.get('expires_at') && <span> · {timeRemaining}</span>}
         </div>
       </div>
     );
diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss
index f42496559..7c6e61d63 100644
--- a/app/javascript/styles/mastodon/polls.scss
+++ b/app/javascript/styles/mastodon/polls.scss
@@ -82,6 +82,7 @@
     border: 0;
     color: $dark-text-color;
     text-decoration: underline;
+    font-size: inherit;
 
     &:hover,
     &:focus,
diff --git a/app/models/poll_vote.rb b/app/models/poll_vote.rb
index aec678968..9ad66bbf8 100644
--- a/app/models/poll_vote.rb
+++ b/app/models/poll_vote.rb
@@ -23,6 +23,10 @@ class PollVote < ApplicationRecord
 
   delegate :local?, to: :account
 
+  def object_type
+    :vote
+  end
+
   private
 
   def increment_counter_cache
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index b2c92fdc1..b2a5f53e0 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -15,8 +15,8 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
 
   has_one :replies, serializer: ActivityPub::CollectionSerializer, if: :local?
 
-  has_many :poll_loaded_options, key: :one_of, if: :poll_and_not_multiple?
-  has_many :poll_loaded_options, key: :any_of, if: :poll_and_multiple?
+  has_many :poll_options, key: :one_of, if: :poll_and_not_multiple?
+  has_many :poll_options, key: :any_of, if: :poll_and_multiple?
 
   attribute :end_time, if: :poll_and_expires?
   attribute :closed, if: :poll_and_expired?
@@ -121,8 +121,12 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
     object.account.local?
   end
 
-  def poll_loaded_options
-    object.poll.loaded_options
+  def poll_options
+    if !object.expired? && object.hide_totals?
+      object.poll.unloaded_options
+    else
+      object.poll.loaded_options
+    end
   end
 
   def poll_and_multiple?
diff --git a/app/views/stream_entries/_poll.html.haml b/app/views/stream_entries/_poll.html.haml
index 974aff9bd..c7e5e0c63 100644
--- a/app/views/stream_entries/_poll.html.haml
+++ b/app/views/stream_entries/_poll.html.haml
@@ -1,5 +1,5 @@
-- options = (!poll.expired? && poll.hide_totals?) ? poll.unloaded_options : poll.loaded_options
-- voted = poll.votes.where(account: current_user.account).exists?
+- options      = (!poll.expired? && poll.hide_totals?) ? poll.unloaded_options : poll.loaded_options
+- voted        = user_signed_in? && poll.votes.where(account: current_account).exists?
 - show_results = voted || poll.expired?
 
 .poll
@@ -9,17 +9,21 @@
         - if show_results
           - percent = 100 * option.votes_count / poll.votes_count
           %span.poll__chart{ style: "width: #{percent}%" }
+
           %label.poll__text><
-            %span.poll__number= percent
+            %span.poll__number= percent.round
             = option.title
         - else
           %label.poll__text><
-            %span.poll__input{ class: poll.multiple ? 'checkbox' : nil}><
+            %span.poll__input{ class: poll.multiple? ? 'checkbox' : nil}><
             = option.title
   .poll__footer
     - unless show_results
       %button.button.button-secondary{ disabled: true }
         = t('statuses.poll.vote')
+
     %span= t('statuses.poll.total_votes', count: poll.votes_count)
-    ·
-    %span= poll.expires_at
+
+    - unless poll.expires_at.nil?
+      ·
+      %span= l poll.expires_at