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,9 +121,13 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer | |||
|     object.account.local? | ||||
|   end | ||||
| 
 | ||||
|   def 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? | ||||
|     object.poll&.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? | ||||
| - 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) | ||||
| 
 | ||||
|     - unless poll.expires_at.nil? | ||||
|       · | ||||
|     %span= poll.expires_at | ||||
|       %span= l poll.expires_at | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue