Skip to content

Commit

Permalink
Add ability to set default order of PaperTrail versions
Browse files Browse the repository at this point in the history
Closes #3095
  • Loading branch information
mshibuya committed Aug 14, 2022
1 parent 951b708 commit a1c4c67
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
20 changes: 12 additions & 8 deletions lib/rails_admin/extensions/paper_trail/auditing_adapter.rb
Expand Up @@ -100,9 +100,13 @@ def initialize(controller, user_class_name = nil, version_class_name = nil, &blo
raise E_VERSION_MODEL_NOT_SET
end

register_instance_option :sort_by do
{id: :desc}
end

def latest(count = 100)
version_class.
order(id: :desc).includes(:item).limit(count).
order(sort_by).includes(:item).limit(count).
collect { |version| VersionProxy.new(version, user_class) }
end

Expand Down Expand Up @@ -130,18 +134,18 @@ def listing_for_object(model, object, query, sort, sort_reverse, all, page, per_

# - model - a RailsAdmin::AbstractModel
def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, page, per_page)
if sort.present?
sort = COLUMN_MAPPING[sort.to_sym]
else
sort = :created_at
sort_reverse = 'true'
end
sort =
if sort.present?
{COLUMN_MAPPING[sort.to_sym] => sort_reverse ? :desc : :asc}
else
sort_by
end

current_page = page.presence || '1'

versions = object.nil? ? versions_for_model(model) : object.public_send(model.model.versions_association_name)
versions = versions.where('event LIKE ?', "%#{query}%") if query.present?
versions = versions.order(sort_reverse == 'true' ? "#{sort} DESC" : sort)
versions = versions.order(sort)
versions = all ? versions : versions.send(Kaminari.config.page_method_name, current_page).per(per_page)
paginated_proxies = Kaminari.paginate_array([], total_count: versions.try(:total_count) || versions.count)
paginated_proxies = paginated_proxies.send(
Expand Down
17 changes: 17 additions & 0 deletions spec/rails_admin/extentions/paper_trail/auditing_adapter_spec.rb
Expand Up @@ -16,9 +16,26 @@
adapter = described_class.new(controller) do
user_class User::Confirmed
version_class Trail
sort_by(created_at: :asc)
end
expect(adapter.user_class).to eq User::Confirmed
expect(adapter.version_class).to eq Trail
expect(adapter.sort_by).to eq({created_at: :asc})
end
end

describe '#listing_for_model' do
subject { RailsAdmin::Extensions::PaperTrail::AuditingAdapter.new(nil) }
let(:model) { RailsAdmin::AbstractModel.new(PaperTrailTest) }

it 'uses the given sort order' do
expect_any_instance_of(ActiveRecord::Relation).to receive(:order).with(whodunnit: :asc).and_call_original
subject.listing_for_model model, nil, :username, false, true, nil, 20
end

it 'uses the default order when sort is not given' do
expect_any_instance_of(ActiveRecord::Relation).to receive(:order).with(id: :desc).and_call_original
subject.listing_for_model model, nil, false, false, true, nil, 20
end
end
end

0 comments on commit a1c4c67

Please sign in to comment.