diff --git a/app/controllers/lettings_logs_controller.rb b/app/controllers/lettings_logs_controller.rb index 6b7d1e446..19b884bf6 100644 --- a/app/controllers/lettings_logs_controller.rb +++ b/app/controllers/lettings_logs_controller.rb @@ -141,7 +141,11 @@ private end def filter_manager - FilterManager.new(current_user:, session:, params:, filter_type: "lettings_logs") + if request.path.include?("bulk-uploads") + FilterManager.new(current_user:, session:, params:, filter_type: "lettings_bulk_uploads") + else + FilterManager.new(current_user:, session:, params:, filter_type: "lettings_logs") + end end def authenticate_scope! diff --git a/app/controllers/sales_logs_controller.rb b/app/controllers/sales_logs_controller.rb index 6c2877914..0b24cd193 100644 --- a/app/controllers/sales_logs_controller.rb +++ b/app/controllers/sales_logs_controller.rb @@ -111,7 +111,11 @@ private end def filter_manager - FilterManager.new(current_user:, session:, params:, filter_type: "sales_logs") + if request.path.include?("bulk-uploads") + FilterManager.new(current_user:, session:, params:, filter_type: "sales_bulk_uploads") + else + FilterManager.new(current_user:, session:, params:, filter_type: "sales_logs") + end end def extract_bulk_upload_from_session_filters diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 868b4936d..dce33f77c 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -5,6 +5,9 @@ class SessionsController < ApplicationController if path_params[:organisation_id].present? redirect_to send("#{params[:filter_type]}_organisation_path", id: path_params[:organisation_id], scheme_id: path_params[:scheme_id], search: path_params[:search]) + elsif path_params[:bulk_uploads] + bulk_upload_type = params[:filter_type].split("_").first + redirect_to send("bulk_uploads_#{bulk_upload_type}_logs_path", search: path_params[:search]) else redirect_to send("#{params[:filter_type]}_path", scheme_id: path_params[:scheme_id], search: path_params[:search]) end diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index 5f8488bc9..b218c9243 100644 --- a/app/helpers/filters_helper.rb +++ b/app/helpers/filters_helper.rb @@ -14,6 +14,12 @@ module FiltersHelper return true if (selected_filters["owning_organisation"].present? || selected_filters["owning_organisation_text_search"].present?) && filter == "owning_organisation_select" && value == :specific_org return true if (selected_filters["managing_organisation"].present? || selected_filters["managing_organisation_text_search"].present?) && filter == "managing_organisation_select" && value == :specific_org + return true if !selected_filters.key?("uploaded_by") && filter == "uploaded_by" && value == :all + return true if selected_filters["uploaded_by"] == "specific_user" && filter == "uploaded_by" && value == :specific_user + + return true if !selected_filters.key?("uploading_organisation") && filter == "uploading_organisation_select" && value == :all + return true if selected_filters["uploading_organisation"] == "specific_org" && filter == "uploading_organisation_select" && value == :specific_org + return false if selected_filters[filter].blank? selected_filters[filter].include?(value.to_s) @@ -123,6 +129,11 @@ module FiltersHelper [OpenStruct.new(id: "", name: "Select an option", hint: "")] end + def uploaded_by_filter_options + user_options = User.all + [OpenStruct.new(id: "", name: "Select an option", hint: "")] + user_options.map { |user_option| OpenStruct.new(id: user_option.id, name: user_option.name, hint: user_option.email) } + end + def filter_search_url(category) case category when :user diff --git a/app/models/bulk_upload.rb b/app/models/bulk_upload.rb index 69ab42871..006f101f9 100644 --- a/app/models/bulk_upload.rb +++ b/app/models/bulk_upload.rb @@ -11,6 +11,29 @@ class BulkUpload < ApplicationRecord after_initialize :generate_identifier, unless: :identifier + scope :search_by_filename, ->(filename) { where("filename ILIKE ?", "%#{filename}%") } + scope :search_by_user_name, ->(name) { where(user_id: User.where("name ILIKE ?", "%#{name}%").select(:id)) } + scope :search_by_user_email, ->(email) { where(user_id: User.where("email ILIKE ?", "%#{email}%").select(:id)) } + scope :search_by_organisation_name, ->(name) { where(user_id: User.joins(:organisation).where("organisations.name ILIKE ?", "%#{name}%").select(:id)) } + + scope :search_by, lambda { |param| + search_by_filename(param) + .or(search_by_user_name(param)) + .or(search_by_user_email(param)) + .or(search_by_organisation_name(param)) + } + + scope :filter_by_id, ->(id) { where(id:) } + scope :filter_by_years, lambda { |years, _user = nil| + first_year = years.shift + query = where(year: first_year) + years.each { |year| query = query.or(where(year:)) } + query.all + } + scope :filter_by_uploaded_by, ->(user_id, _user = nil) { where(user_id:) } + scope :filter_by_user_text_search, ->(param, _user = nil) { where(user_id: User.search_by(param).select(:id)) } + scope :filter_by_user, ->(selected_user, _user = nil) { selected_user.present? ? where(user: selected_user) : all } + def completed? incomplete_logs = logs.where.not(status: "completed") !incomplete_logs.exists? @@ -105,6 +128,10 @@ class BulkUpload < ApplicationRecord User.find_by(id: moved_user_id)&.name end + def user + User.find_by(id: user_id) + end + private def generate_identifier diff --git a/app/models/user.rb b/app/models/user.rb index 0a26a254b..c8dfd53de 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -215,7 +215,7 @@ class User < ApplicationRecord def logs_filters(specific_org: false) if (support? && !specific_org) || organisation.has_managing_agents? || organisation.has_stock_owners? - %w[years status needstypes assigned_to user managing_organisation owning_organisation bulk_upload_id user_text_search owning_organisation_text_search managing_organisation_text_search] + %w[years status needstypes assigned_to user uploaded_by managing_organisation owning_organisation uploading_organisation bulk_upload_id user_text_search owning_organisation_text_search managing_organisation_text_search] else %w[years status needstypes assigned_to user bulk_upload_id user_text_search] end diff --git a/app/services/filter_manager.rb b/app/services/filter_manager.rb index 9f68a097c..f5c7bd71b 100644 --- a/app/services/filter_manager.rb +++ b/app/services/filter_manager.rb @@ -76,6 +76,21 @@ class FilterManager locations.order(created_at: :desc) end + def self.filter_uploads(uploads, search_term, filters, all_orgs, user) + uploads = filter_by_search(uploads, search_term) + + filters.each do |category, values| + next if Array(values).reject(&:empty?).blank? + next if category == "uploading_organisation" && all_orgs + next if category == "uploading_organisation_text_search" && all_orgs + # next if category == "uploaded_by" + next if category == "uploaded_by_text_search" && filters["uploaded_by"] != "specific_user" + + uploads = uploads.public_send("filter_by_#{category}", values, user) + end + uploads.order(created_at: :desc) + end + def serialize_filters_to_session(specific_org: false) session[session_name_for(filter_type)] = session_filters(specific_org:).to_json end @@ -91,7 +106,6 @@ class FilterManager else {} end - if filter_type.include?("logs") current_user.logs_filters(specific_org:).each do |filter| new_filters[filter] = params[filter] if params[filter].present? @@ -107,7 +121,7 @@ class FilterManager new_filters = new_filters.except("user") if params["assigned_to"] == "all" new_filters["user"] = current_user.id.to_s if params["assigned_to"] == "you" - new_filters = new_filters.except("user_text_search") if params["assigned_to"] == "all" || params["assigned_to"] == "you" + new_filters = new_filters.except("user_text_search") if params["assigned_to"] == "all" || params["assigned_to"] == "you" # add later new_filters = new_filters.except("owning_organisation_text_search") if params["owning_organisation_select"] == "all" new_filters = new_filters.except("managing_organisation_text_search") if params["managing_organisation_select"] == "all" end @@ -124,6 +138,15 @@ class FilterManager new_filters = new_filters.except("owning_organisation") if params["owning_organisation_select"] == "all" end + if filter_type.include?("bulk_uploads") + current_user.logs_filters(specific_org:).each do |filter| + new_filters[filter] = params[filter] if params[filter].present? + end + new_filters = new_filters.except("uploading_organisation") if params["uploading_organisation_select"] == "all" + new_filters = new_filters.except("uploaded_by") if params["uploaded_by"] == "all" + new_filters["uploaded_by"] = current_user.id.to_s if params["uploaded_by"] == "you" + end + new_filters end @@ -152,6 +175,12 @@ class FilterManager @bulk_upload ||= current_user.bulk_uploads.find_by(id:) end + def filtered_uploads(uploads, search_term, filters) + all_orgs = params["uploading_organisation_select"] == "all" + + FilterManager.filter_uploads(uploads, search_term, filters, all_orgs, current_user) + end + private def logs_filters diff --git a/app/views/bulk_upload_shared/_upload_filters.html.erb b/app/views/bulk_upload_shared/_upload_filters.html.erb index 63f8e3475..754e62cbf 100644 --- a/app/views/bulk_upload_shared/_upload_filters.html.erb +++ b/app/views/bulk_upload_shared/_upload_filters.html.erb @@ -12,11 +12,10 @@ <%= filters_applied_text(@filter_type) %>

- <%= reset_filters_link(@filter_type, { search: request.params["search"], organisation_id: @organisation&.id }.compact) %> + <%= reset_filters_link(@filter_type, { search: request.params["search"], bulk_uploads: true }.compact) %>

- <% if bulk_upload_options(@bulk_upload).blank? %> <%= render partial: "filters/checkbox_filter", locals: { f:, @@ -25,7 +24,6 @@ category: "years", size: "s", } %> - <% end %> <%= render partial: "filters/radio_filter", locals: { @@ -38,29 +36,28 @@ conditional_filter: { type: "text_select", label: "User", - category: "user", - options: assigned_to_filter_options(@filter_type), + category: "uploaded_by", + options: uploaded_by_filter_options, caption_text: "User's name or email", }, }, }, label: "Uploaded by", - category: "created_by", + category: "uploaded_by", size: "s", } %> - <% if current_user.support? || non_support_with_multiple_owning_orgs? %> <%= render partial: "filters/radio_filter", locals: { f:, options: { - "all": { label: "Any owning organisation" }, + "all": { label: "Any uploading organisation" }, "specific_org": { - label: "Specific owning organisation", + label: "Specific uploading organisation", conditional_filter: { type: "text_select", - label: "Owning Organisation", - category: "owning_organisation", - options: owning_organisation_filter_options(current_user, @filter_type), + label: "Uploading Organisation", + category: "uploading_organisation", + options: all_owning_organisation_filter_options(current_user), caption_text: "Organisation name", }, }, @@ -69,7 +66,6 @@ category: "uploading_organisation_select", size: "s", } %> - <% end %> <% if request.params["search"].present? %> <%= f.hidden_field :search, value: request.params["search"] %>