Quellcode durchsuchen

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
master
Eugen Rochko vor 5 Jahren
committed by GitHub
Ursprung
Commit
a198add83b
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden GPG-Schlüssel-ID: 4AEE18F83AFDEB23
6 geänderte Dateien mit 37 neuen und 13 gelöschten Zeilen
  1. +11
    -1
      app/helpers/stream_entries_helper.rb
  2. +3
    -2
      app/javascript/mastodon/components/poll.js
  3. +1
    -0
      app/javascript/styles/mastodon/polls.scss
  4. +4
    -0
      app/models/poll_vote.rb
  5. +8
    -4
      app/serializers/activitypub/note_serializer.rb
  6. +10
    -6
      app/views/stream_entries/_poll.html.haml

+ 11
- 1
app/helpers/stream_entries_helper.rb Datei anzeigen

@@ -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



+ 3
- 2
app/javascript/mastodon/components/poll.js Datei anzeigen

@@ -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>
);


+ 1
- 0
app/javascript/styles/mastodon/polls.scss Datei anzeigen

@@ -82,6 +82,7 @@
border: 0;
color: $dark-text-color;
text-decoration: underline;
font-size: inherit;

&:hover,
&:focus,


+ 4
- 0
app/models/poll_vote.rb Datei anzeigen

@@ -23,6 +23,10 @@ class PollVote < ApplicationRecord

delegate :local?, to: :account

def object_type
:vote
end

private

def increment_counter_cache


+ 8
- 4
app/serializers/activitypub/note_serializer.rb Datei anzeigen

@@ -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?


+ 10
- 6
app/views/stream_entries/_poll.html.haml Datei anzeigen

@@ -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

Laden…
Abbrechen
Speichern