Sha256: 90219687c2c87c3f0901e14121993062c54b1f37ccf8749b1e823cb63a7d7e06

Contents?: true

Size: 1.83 KB

Versions: 72

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literal: true

require "active_support/concern"

module Decidim
  module Proposals
    # Common logic to ordering resources
    module Orderable
      extend ActiveSupport::Concern

      included do
        helper_method :order, :available_orders, :random_seed

        private

        # Gets how the proposals should be ordered based on the choice made by the user.
        def order
          @order ||= detect_order(params[:order]) || default_order
        end

        # Available orders based on enabled settings
        def available_orders
          @available_orders ||= begin
            available_orders = %w(random recent)
            available_orders << "most_voted" if most_voted_order_available?
            available_orders
          end
        end

        def default_order
          if order_by_votes?
            detect_order("most_voted")
          else
            "random"
          end
        end

        def most_voted_order_available?
          current_settings.votes_enabled? && !current_settings.votes_hidden?
        end

        def order_by_votes?
          most_voted_order_available? && current_settings.votes_blocked?
        end

        # Returns: A random float number between -1 and 1 to be used as a random seed at the database.
        def random_seed
          @random_seed ||= (params[:random_seed] ? params[:random_seed].to_f : (rand * 2 - 1))
        end

        def detect_order(candidate)
          available_orders.detect { |order| order == candidate }
        end

        def reorder(proposals)
          case order
          when "random"
            proposals.order_randomly(random_seed)
          when "most_voted"
            proposals.order(proposal_votes_count: :desc)
          when "recent"
            proposals.order(created_at: :desc)
          end
        end
      end
    end
  end
end

Version data entries

72 entries across 72 versions & 2 rubygems

Version Path
decidim-proposals-0.16.0 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.15.2 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.15.1 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.15.0 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.14.4 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.14.3 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.14.2 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.14.1 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.13.1 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.12.2 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.13.0 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.12.1 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.13.0.pre1 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.12.0 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.11.2 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.12.0.pre app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.11.1 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.11.0.pre1 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.10.1 app/controllers/concerns/decidim/proposals/orderable.rb
decidim-proposals-0.10.0 app/controllers/concerns/decidim/proposals/orderable.rb