Skip to content

Commit ac675e8

Browse files
authored
Merge pull request #5094 from coalest/4543-improvements-regarding-inactive-donation-sites
Add inactive donation site filtering and reactivate buttons
2 parents ab7d15a + 728dc6b commit ac675e8

File tree

7 files changed

+146
-38
lines changed

7 files changed

+146
-38
lines changed

app/controllers/donation_sites_controller.rb

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ class DonationSitesController < ApplicationController
44
include Importable
55

66
def index
7-
@donation_sites = current_organization.donation_sites.active.alphabetized
8-
@donation_site = current_organization.donation_sites.new
7+
@donation_sites = current_organization.donation_sites.alphabetized
8+
@include_inactive_donation_sites = params[:include_inactive_donation_sites]
9+
@donation_sites = @donation_sites.active if @include_inactive_donation_sites.blank?
10+
911
respond_to do |format|
1012
format.html
1113
format.csv { send_data DonationSite.generate_csv(@donation_sites), filename: "DonationSites-#{Time.zone.today}.csv" }
@@ -57,14 +59,28 @@ def deactivate
5759
donation_site.deactivate!
5860
rescue => e
5961
flash[:error] = e.message
60-
redirect_back(fallback_location: items_path)
62+
redirect_back(fallback_location: donation_sites_path)
6163
return
6264
end
6365

6466
flash[:notice] = "#{donation_site.name} has been deactivated."
6567
redirect_to donation_sites_path
6668
end
6769

70+
def reactivate
71+
donation_site = current_organization.donation_sites.find(params[:id])
72+
begin
73+
donation_site.reactivate!
74+
rescue => e
75+
flash[:error] = e.message
76+
redirect_back(fallback_location: donation_sites_path)
77+
return
78+
end
79+
80+
flash[:notice] = "#{donation_site.name} has been reactivated."
81+
redirect_to donation_sites_path
82+
end
83+
6884
private
6985

7086
def donation_site_params

app/helpers/filter_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def filter_text(label: nil, scope:, selected: nil)
1515

1616
def filter_checkbox(label: nil, scope:, selected: nil)
1717
label_tag do
18-
check_box_tag(scope, 1, selected) + label
18+
check_box_tag(scope, 1, selected) + " " + label
1919
end
2020
end
2121
end

app/models/donation_site.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,8 @@ def csv_export_attributes
5555
def deactivate!
5656
update!(active: false)
5757
end
58+
59+
def reactivate!
60+
update!(active: true)
61+
end
5862
end

app/views/donation_sites/_donation_site_row.html.erb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@
77
<td class="text-right">
88
<%= view_button_to donation_site_row %>
99
<%= edit_button_to edit_donation_site_path(donation_site_row) %>
10-
<%= delete_button_to deactivate_donation_site_path(donation_site_row),
11-
text: 'Deactivate',
12-
enabled: true,
13-
confirm: confirm_deactivate_msg(donation_site_row.name) %>
10+
<% if donation_site_row.active? %>
11+
<%= deactivate_button_to deactivate_donation_site_path(donation_site_row),
12+
text: "Deactivate",
13+
confirm: confirm_deactivate_msg(donation_site_row.name) %>
14+
<% else %>
15+
<%= reactivate_button_to reactivate_donation_site_path(donation_site_row),
16+
text: "Restore",
17+
confirm: confirm_reactivate_msg(donation_site_row.name) %>
18+
<% end %>
1419
</td>
1520
</tr>

app/views/donation_sites/index.html.erb

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,24 @@
3232
<div class="card-header">
3333
<h3 class="card-title">Donation Sites</h3>
3434
</div>
35-
<!-- /.card-header -->
36-
<div class="card-footer">
37-
<div class="pull-right">
38-
<%= modal_button_to("#csvImportModal", {icon: "upload", text: "Import Donation Sites", size: "md"}) if @donation_sites.empty? %>
39-
<%= download_button_to(donation_sites_path(format: :csv, filters: filter_params.merge(date_range: date_range_params)), {text: "Export Donation Sites", size: "md"}) if @donation_sites.any? %>
40-
<%= new_button_to new_donation_site_path, {text: "New Donation Site"} %>
41-
</div>
35+
<div class="card-body">
36+
<%= form_tag(donation_sites_path, method: :get) do |f| %>
37+
<div class="row">
38+
<div class="form-group col-lg-3 col-md-4 col-sm-6 col-xs-12">
39+
<%= filter_checkbox(label: "Also include inactive donation sites", scope: "include_inactive_donation_sites", selected: @include_inactive_donation_sites) %>
40+
</div>
41+
</div>
42+
</div>
43+
<div class="card-footer">
44+
<%= filter_button %>
45+
<%= clear_filter_button %>
46+
<span class="float-right">
47+
<%= modal_button_to("#csvImportModal", {icon: "upload", text: "Import Donation Sites", size: "md"}) if @donation_sites.empty? %>
48+
<%= download_button_to(donation_sites_path(format: :csv, filters: filter_params), {text: "Export Donation Sites", size: "md"}) if @donation_sites.any? %>
49+
<%= new_button_to new_donation_site_path, {text: "New Donation Site"} %>
50+
</span>
51+
</div>
52+
<% end # form %>
4253
</div>
4354
</div>
4455
<!-- /.card -->

config/routes.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,10 @@ def set_up_flipper
154154
collection do
155155
post :import_csv
156156
end
157-
delete :deactivate, on: :member
157+
member do
158+
put :deactivate
159+
put :reactivate
160+
end
158161
end
159162

160163
resources :product_drive_participants, except: [:destroy] do

spec/requests/donation_sites_requests_spec.rb

Lines changed: 91 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,124 @@
11
RSpec.describe "DonationSites", type: :request do
22
let(:organization) { create(:organization) }
33
let(:user) { create(:user, organization: organization) }
4+
let(:params) { {} }
45

56
describe "while signed in" do
67
before do
78
sign_in(user)
89
end
910

1011
describe "GET #index" do
12+
let!(:active_donation_site) { create(:donation_site, organization: organization, name: "An Active Site") }
13+
let!(:inactive_donation_site) { create(:donation_site, organization: organization, active: false, name: "An Inactive Site") }
14+
1115
subject do
12-
get donation_sites_path(format: response_format)
16+
get donation_sites_path(**params)
1317
response
1418
end
1519

16-
before do
17-
create(:donation_site)
20+
it { is_expected.to be_successful }
21+
22+
it "should show active donation sites with deactivate buttons" do
23+
get donation_sites_path
24+
page = Nokogiri::HTML(response.body)
25+
expect(response.body).to include("An Active Site")
26+
expect(response.body).not_to include("An Inactive Site")
27+
button1 = page.css(".btn[href='/donation_sites/#{active_donation_site.id}/deactivate']")
28+
expect(button1.text.strip).to eq("Deactivate")
29+
expect(button1.attr('class')).not_to match(/disabled/)
1830
end
1931

20-
context "html" do
21-
let(:response_format) { 'html' }
32+
context "with include donation sites checkbox selected" do
33+
let(:params) { { include_inactive_donation_sites: "1" } }
2234

23-
it { is_expected.to be_successful }
35+
it "should show active donation sites with deactivate buttons" do
36+
get donation_sites_path(params)
37+
page = Nokogiri::HTML(response.body)
38+
expect(response.body).to include("An Active Site")
39+
expect(response.body).to include("An Inactive Site")
40+
41+
# Active donation site should have deactivate button
42+
button1 = page.css(".btn[href='/donation_sites/#{active_donation_site.id}/deactivate']")
43+
expect(button1.text.strip).to eq("Deactivate")
44+
expect(button1.attr('class')).not_to match(/disabled/)
45+
46+
# Inactive donation site should have reactivate button
47+
button2 = page.css(".btn[href='/donation_sites/#{inactive_donation_site.id}/reactivate']")
48+
expect(button2.text.strip).to eq("Restore")
49+
expect(button2.attr('class')).not_to match(/disabled/)
50+
end
2451
end
2552

2653
context "csv" do
27-
let(:response_format) { 'csv' }
54+
subject do
55+
get donation_sites_path(format: :csv)
56+
response
57+
end
58+
59+
let(:expected_headers) { ["Name", "Address", "Contact Name", "Email", "Phone"] }
2860

2961
it { is_expected.to be_successful }
30-
end
31-
end
32-
describe 'GET #index' do
33-
let!(:active_donation_site) { create(:donation_site, organization: organization, name: "An Active Site") }
34-
let!(:inactive_donation_site) { create(:donation_site, organization: organization, active: false, name: "An Inactive Site") }
3562

36-
it "should show all/only active donation sites with deactivate buttons" do
37-
get donation_sites_path
38-
page = Nokogiri::HTML(response.body)
39-
expect(response.body).to include("An Active Site")
40-
expect(response.body).not_to include("An Inactive Site")
41-
button1 = page.css(".btn[href='/donation_sites/#{active_donation_site.id}/deactivate']")
42-
expect(button1.text.strip).to eq("Deactivate")
43-
expect(button1.attr('class')).not_to match(/disabled/)
63+
it "has the expected csv headers" do
64+
subject
65+
66+
csv = CSV.parse(response.body)
67+
expect(csv[0]).to eq(expected_headers)
68+
end
69+
70+
it "only includes active donation sites by default" do
71+
subject
72+
73+
csv = CSV.parse(response.body)
74+
75+
# 1 row of headers + 1 row for active site
76+
expect(csv.length).to eq(2)
77+
78+
# Expect active site to be present by name
79+
expect(csv[1][0]).to eq("An Active Site")
80+
end
81+
82+
context "with include inactive donation sites selected" do
83+
subject do
84+
get donation_sites_path(include_inactive_donation_sites: "1", format: :csv)
85+
response
86+
end
87+
88+
it "includes active and inactive donation sites" do
89+
subject
90+
91+
csv = CSV.parse(response.body)
92+
93+
# 1 row of headers + 1 row for active site + 1 row for inactive site
94+
expect(csv.length).to eq(3)
95+
96+
csv_rows = csv[1..]
97+
donation_site_names = csv_rows.map(&:first)
98+
99+
expect(donation_site_names).to include("An Active Site")
100+
expect(donation_site_names).to include("An Inactive Site")
101+
end
102+
end
44103
end
45104
end
46105

47-
describe 'DELETE #deactivate' do
106+
describe 'PUT #deactivate' do
48107
it 'should be able to deactivate an item' do
49108
donation_site = create(:donation_site, organization: organization, active: true, name: "to be deactivated")
50109
params = { id: donation_site.id }
51110

52-
expect { delete deactivate_donation_site_path(params) }.to change { donation_site.reload.active }.from(true).to(false)
111+
expect { put deactivate_donation_site_path(params) }.to change { donation_site.reload.active }.from(true).to(false)
112+
expect(response).to redirect_to(donation_sites_path)
113+
end
114+
end
115+
116+
describe 'PUT #reactivate' do
117+
it 'should be able to reactivate an item' do
118+
donation_site = create(:donation_site, organization:, active: false, name: "to be reactivated")
119+
params = { id: donation_site.id }
120+
121+
expect { put reactivate_donation_site_path(params) }.to change { donation_site.reload.active }.from(false).to(true)
53122
expect(response).to redirect_to(donation_sites_path)
54123
end
55124
end

0 commit comments

Comments
 (0)