From f4d7538bed0c67d55caefededd0c6fec943c1649 Mon Sep 17 00:00:00 2001 From: Jack S Date: Wed, 26 Jul 2023 11:33:35 +0100 Subject: [PATCH] Add sheme owning org filter --- app/models/scheme.rb | 1 + app/services/filter_manager.rb | 18 +++++++++++++----- app/views/schemes/_scheme_filters.html.erb | 21 +++++++++++++++++++++ spec/models/scheme_spec.rb | 19 +++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/app/models/scheme.rb b/app/models/scheme.rb index 2da6bdd84..c8cfa32db 100644 --- a/app/models/scheme.rb +++ b/app/models/scheme.rb @@ -19,6 +19,7 @@ class Scheme < ApplicationRecord scope :order_by_completion, -> { order("confirmed ASC NULLS FIRST") } 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| filtered_records = all scopes = [] diff --git a/app/services/filter_manager.rb b/app/services/filter_manager.rb index a473cf271..d88bd7a09 100644 --- a/app/services/filter_manager.rb +++ b/app/services/filter_manager.rb @@ -50,11 +50,12 @@ class FilterManager users 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) filters.each do |category, values| next if Array(values).reject(&:empty?).blank? + next if category == "owning_organisation" && all_orgs schemes = schemes.public_send("filter_by_#{category}", values, user) end @@ -72,7 +73,8 @@ class FilterManager def deserialize_filters_from_session(specific_org) current_filters = session[session_name_for(filter_type)] 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| new_filters[filter] = params[filter] if params[filter].present? end @@ -84,8 +86,12 @@ class FilterManager new_filters["user"] = current_user.id.to_s if params["assigned_to"] == "you" end - if (@filter_type.include?("schemes") || @filter_type.include?("users")) && params["status"].present? - new_filters["status"] = params["status"] + if filter_type.include?("schemes") + 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 new_filters @@ -102,7 +108,9 @@ class FilterManager end 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 def bulk_upload diff --git a/app/views/schemes/_scheme_filters.html.erb b/app/views/schemes/_scheme_filters.html.erb index 086d6fd84..ce89ceac4 100644 --- a/app/views/schemes/_scheme_filters.html.erb +++ b/app/views/schemes/_scheme_filters.html.erb @@ -22,6 +22,27 @@ label: "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" %> <% end %> diff --git a/spec/models/scheme_spec.rb b/spec/models/scheme_spec.rb index 2fb3ee0d0..48b41b870 100644 --- a/spec/models/scheme_spec.rb +++ b/spec/models/scheme_spec.rb @@ -90,6 +90,25 @@ RSpec.describe Scheme, type: :model do 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 let!(:incomplete_scheme) { FactoryBot.create(:scheme, :incomplete) } let!(:active_scheme) { FactoryBot.create(:scheme) }