Browse Source

Add sheme owning org filter

pull/1806/head
Jack S 3 years ago
parent
commit
f4d7538bed
  1. 1
      app/models/scheme.rb
  2. 18
      app/services/filter_manager.rb
  3. 21
      app/views/schemes/_scheme_filters.html.erb
  4. 19
      spec/models/scheme_spec.rb

1
app/models/scheme.rb

@ -19,6 +19,7 @@ class Scheme < ApplicationRecord
scope :order_by_completion, -> { order("confirmed ASC NULLS FIRST") } scope :order_by_completion, -> { order("confirmed ASC NULLS FIRST") }
scope :order_by_service_name, -> { order(service_name: :asc) } scope :order_by_service_name, -> { order(service_name: :asc) }
scope :filter_by_owning_organisation, ->(owning_organisation, _user = nil) { where(owning_organisation:) }
scope :filter_by_status, lambda { |statuses, _user = nil| scope :filter_by_status, lambda { |statuses, _user = nil|
filtered_records = all filtered_records = all
scopes = [] scopes = []

18
app/services/filter_manager.rb

@ -50,11 +50,12 @@ class FilterManager
users users
end end
def self.filter_schemes(schemes, search_term, filters, user) def self.filter_schemes(schemes, search_term, filters, user, all_orgs)
schemes = filter_by_search(schemes, search_term) schemes = filter_by_search(schemes, search_term)
filters.each do |category, values| filters.each do |category, values|
next if Array(values).reject(&:empty?).blank? next if Array(values).reject(&:empty?).blank?
next if category == "owning_organisation" && all_orgs
schemes = schemes.public_send("filter_by_#{category}", values, user) schemes = schemes.public_send("filter_by_#{category}", values, user)
end end
@ -72,7 +73,8 @@ class FilterManager
def deserialize_filters_from_session(specific_org) def deserialize_filters_from_session(specific_org)
current_filters = session[session_name_for(filter_type)] current_filters = session[session_name_for(filter_type)]
new_filters = current_filters.present? ? JSON.parse(current_filters) : {} new_filters = current_filters.present? ? JSON.parse(current_filters) : {}
if @filter_type.include?("logs")
if filter_type.include?("logs")
current_user.logs_filters(specific_org:).each do |filter| current_user.logs_filters(specific_org:).each do |filter|
new_filters[filter] = params[filter] if params[filter].present? new_filters[filter] = params[filter] if params[filter].present?
end end
@ -84,8 +86,12 @@ class FilterManager
new_filters["user"] = current_user.id.to_s if params["assigned_to"] == "you" new_filters["user"] = current_user.id.to_s if params["assigned_to"] == "you"
end end
if (@filter_type.include?("schemes") || @filter_type.include?("users")) && params["status"].present? if filter_type.include?("schemes")
new_filters["status"] = params["status"] current_user.logs_filters(specific_org:).each do |filter|
new_filters[filter] = params[filter] if params[filter].present?
end
new_filters = new_filters.except("owning_organisation") if params["owning_organisation_select"] == "all"
end end
new_filters new_filters
@ -102,7 +108,9 @@ class FilterManager
end end
def filtered_schemes(schemes, search_term, filters) def filtered_schemes(schemes, search_term, filters)
FilterManager.filter_schemes(schemes, search_term, filters, current_user) all_orgs = params["owning_organisation_select"] == "all"
FilterManager.filter_schemes(schemes, search_term, filters, current_user, all_orgs)
end end
def bulk_upload def bulk_upload

21
app/views/schemes/_scheme_filters.html.erb

@ -22,6 +22,27 @@
label: "Status", label: "Status",
category: "status", category: "status",
} %> } %>
<% if @current_user.support? || @current_user.organisation.stock_owners.count > 1 %>
<%= render partial: "filters/radio_filter", locals: {
f:,
options: {
"all": { label: "Any owning organisation" },
"specific_org": {
label: "Specific owning organisation",
conditional_filter: {
type: "select",
label: "Owning Organisation",
category: "owning_organisation",
options: owning_organisations_filter_options(@current_user),
},
},
},
label: "Owned by",
category: "owning_organisation_select",
} %>
<% end %>
<%= f.govuk_submit "Apply filters", class: "govuk-!-margin-bottom-0" %> <%= f.govuk_submit "Apply filters", class: "govuk-!-margin-bottom-0" %>
<% end %> <% end %>
</div> </div>

19
spec/models/scheme_spec.rb

@ -90,6 +90,25 @@ RSpec.describe Scheme, type: :model do
end end
end end
context "when filtering by owning organisation" do
let(:organisation_1) { create(:organisation) }
let(:organisation_2) { create(:organisation) }
let(:organisation_3) { create(:organisation) }
before do
create(:scheme, owning_organisation: organisation_1)
create(:scheme, owning_organisation: organisation_1)
create(:scheme, owning_organisation: organisation_2)
create(:scheme, owning_organisation: organisation_2)
end
it "filters by given owning organisation" do
expect(described_class.filter_by_owning_organisation([organisation_1]).count).to eq(2)
expect(described_class.filter_by_owning_organisation([organisation_1, organisation_2]).count).to eq(4)
expect(described_class.filter_by_owning_organisation([organisation_3]).count).to eq(0)
end
end
context "when filtering by status" do context "when filtering by status" do
let!(:incomplete_scheme) { FactoryBot.create(:scheme, :incomplete) } let!(:incomplete_scheme) { FactoryBot.create(:scheme, :incomplete) }
let!(:active_scheme) { FactoryBot.create(:scheme) } let!(:active_scheme) { FactoryBot.create(:scheme) }

Loading…
Cancel
Save