diff --git a/README.md b/README.md index dc6589b..ef72585 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,19 @@ Include awesome_sort in your javascript and css application files In config/initializers, create an awesome_sort with similar syntax: ```ruby AwesomeSort.configure do |config| - config.add_sorter :contacts, :name, ->(scope, direction){ scope.order(surname: direction, forename: direction) } - config.add_sorter :contacts, :organisations, ->(direction){ scope.eager_load(:clients).order("institute.name #{direction}") } - config.add_default :contacts, ->(scope){ scope.eager_load(:clients).order('institute.name') } + config.add_sorter( + :contacts, + :name, + ->(scope, direction){ scope.order(surname: direction, forename: direction) } + ) + + config.add_sorter( + :contacts, + :organisations, + ->(direction){ scope.eager_load(:clients).order("institute.name #{direction}") } + ) + + config.defaults[sort_by: 'name'] or config.defaults = { sort_order: 'desc', sort_by: 'dob' } end ``` diff --git a/app/helpers/awesome_sort/awesome_sort_helper.rb b/app/helpers/awesome_sort/awesome_sort_helper.rb index bff7404..f6698d7 100644 --- a/app/helpers/awesome_sort/awesome_sort_helper.rb +++ b/app/helpers/awesome_sort/awesome_sort_helper.rb @@ -2,23 +2,19 @@ module AwesomeSort module AwesomeSortHelper def column_sort(args = {}) args[:extra] ||= {} + defaults = AwesomeSort.defaults + # Should pass it column_name, link_name, controller_name and # optionally width, html_options and header_classes - args.reverse_merge!( - header_classes: [], - html_options: {} - ) + args.reverse_merge!(header_classes: [], html_options: {}) + sort_order = args[:sort_order] || defaults[:sort_order] + c_method = args[:controller_name] + "_path" klass = ["orderable"] - klass << "order-#{params[:sort_order]}" if params[:sort_by] == args[:column_name] + klass << "order-#{sort_order}" if args[:sort_by] == args[:column_name] klass << args[:header_classes] klass.flatten - sort_order = - if params[:sort_by] == args[:column_name] && params[:sort_order] == "asc" - "desc" - else - "asc" - end + content_tag(:th, width: args[:width], class: klass, data: { order_term: args[:column_name] }) do link_to( args[:link_name], @@ -30,6 +26,7 @@ def column_sort(args = {}) def sort(scope, sort_by, sort_order) klass = scope.model.name.tableize.to_sym + defaults = AwesomeSort.defaults if sort_by if sorter = AwesomeSort.sorters[klass][sort_by.to_sym] @@ -38,11 +35,13 @@ def sort(scope, sort_by, sort_order) scope.order(sort_by => sort_order) end else - if default_sorter = AwesomeSort.defaults[klass] + own_defaults = defaults[klass] + + if (default_sorter = own_defaults ? own_defaults[:sort_by] : defaults[:sort_by]) if default_sorter.respond_to?(:call) default_sorter.call(scope) else - scope.order(default_sorter => 'asc') + scope.order(default_sorter => (own_defaults ? defaults[klass][:sort_order] : defaults[:sort_order])) end else scope diff --git a/lib/awesome_sort.rb b/lib/awesome_sort.rb index 05d9755..9711079 100644 --- a/lib/awesome_sort.rb +++ b/lib/awesome_sort.rb @@ -6,6 +6,8 @@ module AwesomeSort mattr_accessor :sorters, :defaults def self.configure + self.sorters = {} + self.defaults = { sort_order: 'asc', sort_by: 'name' } yield self end @@ -13,11 +15,4 @@ def self.add_sorter(model, attribute, sorter) self.sorters[model] ||= {} self.sorters[model][attribute] = sorter end - - def self.set_default(model, attribute_or_sorter) - self.defaults[model] = attribute_or_sorter - end end - -AwesomeSort.defaults = {} -AwesomeSort.sorters = {}