Skip to content

Commit

Permalink
Merge pull request #1799 from codebar/filter-sponsors
Browse files Browse the repository at this point in the history
feat(1746): filter sponsors by chapter
  • Loading branch information
matyikriszta committed Oct 21, 2022
2 parents dbd12f2 + 0c16d9e commit c86f542
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 10 deletions.
4 changes: 3 additions & 1 deletion app/controllers/admin/sponsors_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ def index
@sponsors = @sponsors_search.call

@decorated_sponsors = SponsorPresenter.decorate_collection(@sponsors)

@chapters = Chapter.all
end

def show
Expand Down Expand Up @@ -90,6 +92,6 @@ def filter_search_params
end

def search_params
{ name: filter_search_params[:name], page: params[:page] }
{ name: filter_search_params[:name], page: params[:page], chapter: filter_search_params[:chapter] }
end
end
10 changes: 8 additions & 2 deletions app/models/sponsors_search.rb
Original file line number Diff line number Diff line change
@@ -1,26 +1,32 @@
class SponsorsSearch
include ActiveModel::Model

attr_accessor :name, :page, :per_page
attr_accessor :name, :page, :per_page, :chapter

def initialize(params = {})
@page = params.fetch(:page, 1)
@per_page = params.fetch(:per_page, Sponsor.per_page)
@name = params.fetch(:name)
@chapter = params.fetch(:chapter)
end

def call
by_name
by_chapter
sponsors
end

private

def sponsors
@sponsors ||= Sponsor.includes([:chapters]).reorder('lower(name)').paginate(page: page)
@sponsors ||= Sponsor.includes([:chapters]).reorder('lower(sponsors.name)').paginate(page: page)
end

def by_name
@sponsors = sponsors.by_name(name) if name.present?
end

def by_chapter
@sponsors = sponsors.joins(:workshops).where('workshops.chapter_id' => chapter) if chapter.present?
end
end
11 changes: 7 additions & 4 deletions app/views/admin/sponsors/index.html.haml
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
.container.py-4.py-lg-5
.row.mb-2
.row.mb-4
.col-12
%nav{'aria-label': 'breadcrumb'}
%ol.breadcrumb.ml-0
%li.breadcrumb-item.active= t('admin.shared.sponsors')

.col-12
= simple_form_for @sponsors_search, url: admin_sponsors_path, method: :get, wrapper: :inline_form, html: { class: 'row row-cols-auto align-items-center' } do |f|
= f.input :name, required: false, label: false, placeholder: 'Filter by sponsor name'
= f.button :button, 'Filter', class: 'btn btn-primary'
.row.row-cols-md-auto.align-items-center
= simple_form_for @sponsors_search, url: admin_sponsors_path, method: :get, wrapper: :inline_form, html: { class: 'row row-cols-1 row-cols-md-auto align-items-center' } do |f|
= f.collection_select :chapter, @chapters, :id, :name, { include_blank: true, prompt: 'Select a chapter' }, { class: 'chosen-select'}
= f.input :name, required: false, label: false, placeholder: 'Filter by sponsor name', input_html: { class: 'my-2 my-md-0' }
= f.button :button, 'Filter', class: 'btn btn-primary'
= link_to 'Reset form', admin_sponsors_path

.row.mb-4
.col-md-6
Expand Down
49 changes: 49 additions & 0 deletions spec/features/admin/sponsor_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,54 @@
login_as_admin(manager)
end

context 'Sponsors list' do
let(:sponsor) { Fabricate(:sponsor_with_contacts) }
let(:sponsor2) { Fabricate(:sponsor_with_contacts) }

scenario 'can filter by chapter' do
sponsored_workshop = Fabricate(:workshop_sponsor, sponsor: sponsor).workshop
hosted_workshop = Fabricate(:workshop_sponsor, sponsor: sponsor2, host: true).workshop

visit admin_sponsors_path

expect(page).to have_content(sponsor.name)
expect(page).to have_content(sponsor2.name)

expect(page.all(:css, 'tbody tr', count: 2))

expect(page).to have_content(hosted_workshop.chapter.name)
expect(page).to have_content(sponsored_workshop.chapter.name)

select sponsored_workshop.chapter.name, from: 'sponsors_search[chapter]'
click_on 'Filter'

expect(page.all(:css, 'tbody tr', count: 1))
end

scenario 'can clear filtering form' do
sponsored_workshop = Fabricate(:workshop_sponsor, sponsor: sponsor).workshop
hosted_workshop = Fabricate(:workshop_sponsor, sponsor: sponsor2, host: true).workshop

visit admin_sponsors_path

expect(page).to have_content(sponsor.name)
expect(page).to have_content(sponsor2.name)

expect(page.all(:css, 'tbody tr', count: 2))

expect(page).to have_content(hosted_workshop.chapter.name)
expect(page).to have_content(sponsored_workshop.chapter.name)

select sponsored_workshop.chapter.name, from: 'sponsors_search[chapter]'
click_on 'Filter'

expect(page.all(:css, 'tbody tr', count: 1))

click_on 'Reset form'
expect(page.all(:css, 'tbody tr', count: 2))
end
end

context 'Sponsor page' do
let(:sponsor) { Fabricate(:sponsor_with_contacts) }

Expand Down Expand Up @@ -83,6 +131,7 @@
it 'can set contact information' do
visit edit_admin_sponsor_path(sponsor)


click_on 'Add contact'
fill_in 'sponsor_contacts_attributes_0_name', with: 'Jane'
fill_in 'sponsor_contacts_attributes_0_surname', with: 'Doe'
Expand Down
6 changes: 3 additions & 3 deletions spec/models/sponsors_search_spec.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
require 'spec_helper'

RSpec.describe SponsorsSearch, type: :model do
let(:search_params) { { per_page: 5, page: 2, name: Faker::Name.name } }
let(:search_params) { { per_page: 5, page: 2, name: Faker::Name.name, chapter: Faker::Name.name } }

describe 'initialization params' do
it 'configures its properties using the param hash' do
params = { per_page: 5, page: 2, name: Faker::Name.name }
params = { per_page: 5, page: 2, name: Faker::Name.name, chapter: Faker::Name.name }

sponsors_search = described_class.new(search_params)

Expand All @@ -25,7 +25,7 @@
it 'returns all sponsors when no filter is specified' do
expect(Sponsor).to_not receive(:by_name)

described_class.new({ name: nil}).call
described_class.new({ name: nil, chapter: nil}).call
end
end
end

0 comments on commit c86f542

Please sign in to comment.