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
This commit is contained in:
		
							parent
							
								
									0a39c81dd8
								
							
						
					
					
						commit
						a198add83b
					
				
					 6 changed files with 37 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
    );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,6 +82,7 @@
 | 
			
		|||
    border: 0;
 | 
			
		||||
    color: $dark-text-color;
 | 
			
		||||
    text-decoration: underline;
 | 
			
		||||
    font-size: inherit;
 | 
			
		||||
 | 
			
		||||
    &:hover,
 | 
			
		||||
    &:focus,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,10 @@ class PollVote < ApplicationRecord
 | 
			
		|||
 | 
			
		||||
  delegate :local?, to: :account
 | 
			
		||||
 | 
			
		||||
  def object_type
 | 
			
		||||
    :vote
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def increment_counter_cache
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue