datagrid
datagrid copied to clipboard
Set the order of filters and columns
The filters and columns are rendered in the same order as defined in the class. We want to be able to set the order ourself without the need to shuffle all the code around. As want to split our files and use inheritance to keep the code DRY. This is what we came up with. This works with filters and columns and will use the set order to render the filters and columns.
module Filters
def self.included(base)
base.class_eval do
class_attribute :filter_order, default: false
end
end
module ClassMethods
def set_filter_order(order)
self.filter_order = order
end
def filters
if filter_order
filters_array.to_a.sort_by { |u| filter_order.index(u.name) || Float::INFINITY }
else
filters_array
end
end
end
end
module Columns
def self.included(base)
base.class_eval do
class_attribute :column_order, default: false
end
end
module ClassMethods
def set_column_order(order)
self.column_order = order
end
def columns
default_columns = self.class.filter_columns(
columns_array, *column_names, data: data, html: html,
).select do |column|
column.enabled?(self)
end
if column_order
default_columns.to_a.sort_by { |u| column_order.index(u.name) || Float::INFINITY }
else
default_columns
end
end
end
end
class MyGrid do
set_filter_order(%i[author title])
set_filter_order(%i[link id])
filter(:title)
filter(:author)
column(:id)
column(:link)
end