diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2019-03-05 03:51:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-05 03:51:18 +0100 |
commit | a198add83bb527c32fa0e01404338562b157da99 (patch) | |
tree | c5a507a1e40092b89fe0c8ab6ffe36fa126628f1 /app | |
parent | 0a39c81dd87242feb84da68b8907c3e45620eadf (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.rb | 12 | ||||
-rw-r--r-- | app/javascript/mastodon/components/poll.js | 5 | ||||
-rw-r--r-- | app/javascript/styles/mastodon/polls.scss | 1 | ||||
-rw-r--r-- | app/models/poll_vote.rb | 4 | ||||
-rw-r--r-- | app/serializers/activitypub/note_serializer.rb | 12 | ||||
-rw-r--r-- | app/views/stream_entries/_poll.html.haml | 16 |
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 |