From 1e1ee4126ca8e37e19a859a3bcd135c645a270fb Mon Sep 17 00:00:00 2001 From: Martin Meyerhoff Date: Tue, 30 Jul 2024 16:56:25 +0200 Subject: [PATCH] Resource Controller: Allow additional Ransack filters When using custom Ransack filters, this will allow combining them with the pagination. Without this, we can only combine the one ransack field we use for searching in the top bar. See #2978 for context. --- .../alchemy/admin/resources_controller.rb | 11 +++++++---- spec/dummy/app/models/event.rb | 6 ++++++ .../features/admin/resources_integration_spec.rb | 16 ++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/app/controllers/alchemy/admin/resources_controller.rb b/app/controllers/alchemy/admin/resources_controller.rb index 4caaf2a7bc..8e57d988e9 100644 --- a/app/controllers/alchemy/admin/resources_controller.rb +++ b/app/controllers/alchemy/admin/resources_controller.rb @@ -200,10 +200,7 @@ def search_filter_params def common_search_filter_includes search_filters = [ { - q: [ - resource_handler.search_field_name, - :s - ] + q: [:s] + permitted_ransack_search_fields }, :tagged_with, :page, @@ -219,6 +216,12 @@ def common_search_filter_includes search_filters end + def permitted_ransack_search_fields + [ + resource_handler.search_field_name + ] + end + def items_per_page cookies[:alchemy_items_per_page] = params[:per_page] || cookies[:alchemy_items_per_page] || Alchemy::Config.get(:items_per_page) diff --git a/spec/dummy/app/models/event.rb b/spec/dummy/app/models/event.rb index 846571d8bb..487b62e7af 100644 --- a/spec/dummy/app/models/event.rb +++ b/spec/dummy/app/models/event.rb @@ -18,6 +18,12 @@ class Event < ActiveRecord::Base scope :future, -> { where("starts_at > ?", Date.tomorrow.at_midnight) } scope :by_location_name, ->(name) { joins(:location).where(locations: { name: name }) } + def self.ransackable_attributes(*) + [ + "name" + ] + end + def self.alchemy_resource_relations { location: { attr_method: "name", attr_type: "string" }, diff --git a/spec/features/admin/resources_integration_spec.rb b/spec/features/admin/resources_integration_spec.rb index 70f36dc608..d8b152c18e 100644 --- a/spec/features/admin/resources_integration_spec.rb +++ b/spec/features/admin/resources_integration_spec.rb @@ -120,6 +120,22 @@ expect(page).not_to have_content("yesterday") end end + + it "can combine ransack queries and pagination", :js do + allow_any_instance_of(Admin::EventsController).to receive(:permitted_ransack_search_fields).and_return([:name_start]) + stub_alchemy_config(:items_per_page, 1) + + visit "/admin/events?q[name_start]=today" + + select("4", from: "per_page") + + within "div#archive_all table.list tbody" do + expect(page).to have_selector("tr", count: 2) + expect(page).to have_content("today 1") + expect(page).to have_content("today 2") + expect(page).not_to have_content("yesterday") + end + end end end