datagrid icon indicating copy to clipboard operation
datagrid copied to clipboard

Set the order of filters and columns

Open CharlieWinkwaves opened this issue 1 month ago • 4 comments

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

CharlieWinkwaves avatar Dec 01 '25 15:12 CharlieWinkwaves