diff --git a/app/controllers/modules/logs_filter.rb b/app/controllers/modules/logs_filter.rb index 7c60bb027..06109cfb0 100644 --- a/app/controllers/modules/logs_filter.rb +++ b/app/controllers/modules/logs_filter.rb @@ -7,7 +7,9 @@ module Modules::LogsFilter def load_session_filters(specific_org: false) current_filters = session[:logs_filters] new_filters = current_filters.present? ? JSON.parse(current_filters) : {} - current_user.logs_filters(specific_org:).each { |filter| new_filters[filter] = params[filter] if params[filter].present? } + current_user.logs_filters(specific_org:).each do |filter| + new_filters[filter] = params[filter] if params[filter].present? + end params["organisation_select"] == "all" ? new_filters.except("organisation") : new_filters end diff --git a/app/models/log.rb b/app/models/log.rb index 3217251b1..fcde08bdb 100644 --- a/app/models/log.rb +++ b/app/models/log.rb @@ -24,6 +24,10 @@ class Log < ApplicationRecord where(created_by: user) end } + scope :filter_by_bulk_upload_id, lambda { |bulk_upload_id, user| + joins(:bulk_upload) + .where(bulk_upload: { id: bulk_upload_id, user: }) + } scope :created_by, ->(user) { where(created_by: user) } def collection_start_year diff --git a/app/models/user.rb b/app/models/user.rb index 04a545584..4d2aeeca1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -145,9 +145,9 @@ class User < ApplicationRecord def logs_filters(specific_org: false) if (support? && !specific_org) || organisation.has_managing_agents? - %w[status years user organisation] + %w[status years user organisation bulk_upload_id] else - %w[status years user] + %w[status years user bulk_upload_id] end end diff --git a/app/views/logs/_log_filters.erb b/app/views/logs/_log_filters.erb index d2a327d99..3049a8a77 100644 --- a/app/views/logs/_log_filters.erb +++ b/app/views/logs/_log_filters.erb @@ -3,13 +3,21 @@

Filters

+
<%= form_with html: { method: :get } do |f| %> - <% years = {"2021": "2021/22", "2022": "2022/23"} %> - <% all_or_yours = {"all": { label: "All" }, "yours": { label: "Yours" } } %> + <% years = { "2021": "2021/22", "2022": "2022/23" } %> + <% all_or_yours = { "all": { label: "All" }, "yours": { label: "Yours" } } %> + <% bulk_upload_options = (@session_filters["bulk_upload_id"] || []).reject(&:blank?).index_with { |_bulk_upload_id| "With logs from bulk upload" } %> + + <% if bulk_upload_options.present? %> + <%= render partial: "filters/checkbox_filter", locals: { f: f, options: bulk_upload_options, label: "Bulk upload", category: "bulk_upload_id" } %> + <% end %> + <%= render partial: "filters/checkbox_filter", locals: { f: f, options: years, label: "Collection year", category: "years" } %> <%= render partial: "filters/checkbox_filter", locals: { f: f, options: status_filters, label: "Status", category: "status" } %> - <%= render partial: "filters/radio_filter", locals: { f: f, options: all_or_yours, label: "Logs", category: "user", } %> + <%= render partial: "filters/radio_filter", locals: { f: f, options: all_or_yours, label: "Logs", category: "user" } %> + <% if (@current_user.support? || @current_user.organisation.has_managing_agents?) && request.path == "/lettings-logs" %> <%= render partial: "filters/radio_filter", locals: { f: f, @@ -21,14 +29,15 @@ type: "select", label: "Organisation", category: "organisation", - options: organisations_filter_options(@current_user) - } - } + options: organisations_filter_options(@current_user), + }, + }, }, label: "Organisation", - category: "organisation_select" + category: "organisation_select", } %> <% end %> + <%= f.govuk_submit "Apply filters", class: "govuk-!-margin-bottom-0" %> <% end %>
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 9244ad7e5..b285a55e7 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -123,7 +123,7 @@ RSpec.describe User, type: :model do end it "can filter lettings logs by user, year and status" do - expect(user.logs_filters).to eq(%w[status years user]) + expect(user.logs_filters).to eq(%w[status years user bulk_upload_id]) end end @@ -133,7 +133,7 @@ RSpec.describe User, type: :model do end it "can filter lettings logs by user, year, status and organisation" do - expect(user.logs_filters).to eq(%w[status years user organisation]) + expect(user.logs_filters).to eq(%w[status years user organisation bulk_upload_id]) end end end @@ -159,7 +159,7 @@ RSpec.describe User, type: :model do end it "can filter lettings logs by user, year, status and organisation" do - expect(user.logs_filters).to eq(%w[status years user organisation]) + expect(user.logs_filters).to eq(%w[status years user organisation bulk_upload_id]) end end diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb index dc009a16d..f11998120 100644 --- a/spec/requests/lettings_logs_controller_spec.rb +++ b/spec/requests/lettings_logs_controller_spec.rb @@ -400,6 +400,55 @@ RSpec.describe LettingsLogsController, type: :request do expect(page).not_to have_link(lettings_log_2022.id.to_s) end end + + context "with bulk_upload_id filter" do + context "with bulk upload that belongs to current user" do + let(:organisation) { create(:organisation) } + + let(:user) { create(:user, organisation:) } + let(:bulk_upload) { create(:bulk_upload, user:) } + + let!(:included_log) { create(:lettings_log, bulk_upload:, owning_organisation: organisation) } + let!(:excluded_log) { create(:lettings_log, owning_organisation: organisation) } + + it "returns logs only associated with the bulk upload" do + get "/lettings-logs?bulk_upload_id[]=#{bulk_upload.id}" + + expect(page).to have_content(included_log.id) + expect(page).not_to have_content(excluded_log.id) + end + + it "displays filter" do + get "/lettings-logs?bulk_upload_id[]=#{bulk_upload.id}" + expect(page).to have_content("With logs from bulk upload") + end + end + + context "with bulk upload that belongs to another user" do + let(:organisation) { create(:organisation) } + + let(:user) { create(:user, organisation:) } + let(:other_user) { create(:user, organisation:) } + let(:bulk_upload) { create(:bulk_upload, user: other_user) } + + let!(:excluded_log) { create(:lettings_log, bulk_upload:, owning_organisation: organisation) } + let!(:also_excluded_log) { create(:lettings_log, owning_organisation: organisation) } + + it "does not return any logs" do + get "/lettings-logs?bulk_upload_id[]=#{bulk_upload.id}" + + expect(page).not_to have_content(excluded_log.id) + expect(page).not_to have_content(also_excluded_log.id) + end + end + end + + context "without bulk_upload_id" do + it "does not display filter" do + get "/lettings-logs" + expect(page).not_to have_content("With logs from bulk upload") + end + end end end