Sha256: c9ce277fd05b192a9edf6dd0214062936d9a3798094344857778084b4c181884

Contents?: true

Size: 1.52 KB

Versions: 1

Compression:

Stored size: 1.52 KB

Contents

module RearHelpers
  module InstanceMixin

    # flip-flopping vectors, that's it, if current vector set to asc
    # this method will return desc, and vice-versa.
    # also it will return UI arrow direction - when vector is asc
    # arrow is down and arrow is up when vector is desc
    def sortable_vector column
      vector = ['asc', nil].include?(order_params[column.string_name]) ? 'desc' : 'asc'
      [vector, vector == 'asc' ? 'down' : 'up']
    end

    # checks whether ordering is happening by given column
    # and if it is, check whether a valid vector used
    def sortable_vector? column
      if vector = (params[:order] || {})[column.string_name]
        valid_sortable_vector? vector
      end
    end

    def valid_sortable_vector? vector
      vector if vector == 'asc' || vector == 'desc'
    end

    def order_params
      @__rear__order_params ||= pane_columns.inject({}) do |map,column|
        (vector = sortable_vector?(column)) ?
          map.update(column.string_name => vector) : map
      end.freeze
    end

    def order_params_to_sql
      order = []
      order_params.each_pair do |column_name, vector|
        next unless column = columns.find {|c| c.string_name == column_name}
        case __rear__.orm
        when :dm
          column.order_by.each {|c| order << c.send(vector)}
        when :ar
          columns = column.order_by.map {|c| RearUtils.quote_ar_column(model, c)}
          order  << [columns.join(', '), vector].join(' ')
        end
      end
      order.any? ? order : nil
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rear-0.2.0 lib/rear/helpers/order.rb