Browse Source

Filtering (WIP)

pull/2653/head
Manny Dinssa 2 years ago
parent
commit
4ec84877c8
  1. 6
      app/controllers/lettings_logs_controller.rb
  2. 6
      app/controllers/sales_logs_controller.rb
  3. 3
      app/controllers/sessions_controller.rb
  4. 11
      app/helpers/filters_helper.rb
  5. 27
      app/models/bulk_upload.rb
  6. 2
      app/models/user.rb
  7. 33
      app/services/filter_manager.rb
  8. 22
      app/views/bulk_upload_shared/_upload_filters.html.erb

6
app/controllers/lettings_logs_controller.rb

@ -141,7 +141,11 @@ private
end end
def filter_manager 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 end
def authenticate_scope! def authenticate_scope!

6
app/controllers/sales_logs_controller.rb

@ -111,7 +111,11 @@ private
end end
def filter_manager 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 end
def extract_bulk_upload_from_session_filters def extract_bulk_upload_from_session_filters

3
app/controllers/sessions_controller.rb

@ -5,6 +5,9 @@ class SessionsController < ApplicationController
if path_params[:organisation_id].present? 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]) 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 else
redirect_to send("#{params[:filter_type]}_path", scheme_id: path_params[:scheme_id], search: path_params[:search]) redirect_to send("#{params[:filter_type]}_path", scheme_id: path_params[:scheme_id], search: path_params[:search])
end end

11
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["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["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? return false if selected_filters[filter].blank?
selected_filters[filter].include?(value.to_s) selected_filters[filter].include?(value.to_s)
@ -123,6 +129,11 @@ module FiltersHelper
[OpenStruct.new(id: "", name: "Select an option", hint: "")] [OpenStruct.new(id: "", name: "Select an option", hint: "")]
end 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) def filter_search_url(category)
case category case category
when :user when :user

27
app/models/bulk_upload.rb

@ -11,6 +11,29 @@ class BulkUpload < ApplicationRecord
after_initialize :generate_identifier, unless: :identifier 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? def completed?
incomplete_logs = logs.where.not(status: "completed") incomplete_logs = logs.where.not(status: "completed")
!incomplete_logs.exists? !incomplete_logs.exists?
@ -105,6 +128,10 @@ class BulkUpload < ApplicationRecord
User.find_by(id: moved_user_id)&.name User.find_by(id: moved_user_id)&.name
end end
def user
User.find_by(id: user_id)
end
private private
def generate_identifier def generate_identifier

2
app/models/user.rb

@ -215,7 +215,7 @@ class User < ApplicationRecord
def logs_filters(specific_org: false) def logs_filters(specific_org: false)
if (support? && !specific_org) || organisation.has_managing_agents? || organisation.has_stock_owners? 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 else
%w[years status needstypes assigned_to user bulk_upload_id user_text_search] %w[years status needstypes assigned_to user bulk_upload_id user_text_search]
end end

33
app/services/filter_manager.rb

@ -76,6 +76,21 @@ class FilterManager
locations.order(created_at: :desc) locations.order(created_at: :desc)
end 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) def serialize_filters_to_session(specific_org: false)
session[session_name_for(filter_type)] = session_filters(specific_org:).to_json session[session_name_for(filter_type)] = session_filters(specific_org:).to_json
end end
@ -91,7 +106,6 @@ class FilterManager
else else
{} {}
end end
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?
@ -107,7 +121,7 @@ class FilterManager
new_filters = new_filters.except("user") if params["assigned_to"] == "all" 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["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("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" new_filters = new_filters.except("managing_organisation_text_search") if params["managing_organisation_select"] == "all"
end end
@ -124,6 +138,15 @@ class FilterManager
new_filters = new_filters.except("owning_organisation") if params["owning_organisation_select"] == "all" new_filters = new_filters.except("owning_organisation") if params["owning_organisation_select"] == "all"
end 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 new_filters
end end
@ -152,6 +175,12 @@ class FilterManager
@bulk_upload ||= current_user.bulk_uploads.find_by(id:) @bulk_upload ||= current_user.bulk_uploads.find_by(id:)
end 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 private
def logs_filters def logs_filters

22
app/views/bulk_upload_shared/_upload_filters.html.erb

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

Loading…
Cancel
Save