Browse Source

feat: split lettings and sales filters

pull/1675/head
natdeanlewissoftwire 3 years ago
parent
commit
265ce708b2
  1. 17
      app/controllers/lettings_logs_controller.rb
  2. 38
      app/controllers/modules/logs_filter.rb
  3. 17
      app/controllers/sales_logs_controller.rb
  4. 12
      app/helpers/filters_helper.rb
  5. 33
      app/models/filter_manager.rb
  6. 8
      app/services/filter_service.rb
  7. 2
      app/views/filters/_checkbox_filter.html.erb
  8. 2
      app/views/filters/_radio_filter.html.erb
  9. 2
      app/views/filters/_select_filter.html.erb
  10. 2
      app/views/logs/_log_filters.erb

17
app/controllers/lettings_logs_controller.rb

@ -14,13 +14,14 @@ class LettingsLogsController < LogsController
respond_to do |format| respond_to do |format|
format.html do format.html do
all_logs = current_user.lettings_logs.visible all_logs = current_user.lettings_logs.visible
unpaginated_filtered_logs = filtered_logs(all_logs, search_term, @session_filters) unpaginated_filtered_logs = filter_manager.filtered_logs(all_logs, search_term, session_filters)
@search_term = search_term @search_term = search_term
@pagy, @logs = pagy(unpaginated_filtered_logs) @pagy, @logs = pagy(unpaginated_filtered_logs)
@searched = search_term.presence @searched = search_term.presence
@total_count = all_logs.size @total_count = all_logs.size
@unresolved_count = all_logs.unresolved.created_by(current_user).count @unresolved_count = all_logs.unresolved.created_by(current_user).count
@filter_type = "lettings_logs"
render "logs/index" render "logs/index"
end end
end end
@ -113,6 +114,18 @@ class LettingsLogsController < LogsController
private private
def set_session_filters
filter_manager.serialize_filters_to_session("lettings_logs")
end
def session_filters
filter_manager.session_filters("lettings_logs")
end
def filter_manager
FilterManager.new(current_user:, session:, params:)
end
def org_params def org_params
super.merge( super.merge(
{ "managing_organisation_id" => current_user.organisation.id }, { "managing_organisation_id" => current_user.organisation.id },
@ -131,7 +144,7 @@ private
def extract_bulk_upload_from_session_filters def extract_bulk_upload_from_session_filters
filter_service = FilterService.new(current_user:, session:) filter_service = FilterService.new(current_user:, session:)
@bulk_upload = filter_service.bulk_upload @bulk_upload = filter_service.bulk_upload("lettings_logs")
end end
def permitted_log_params def permitted_log_params

38
app/controllers/modules/logs_filter.rb

@ -1,23 +1,23 @@
module Modules::LogsFilter module Modules::LogsFilter
def filtered_logs(logs, search_term, filters) # def filtered_logs(logs, search_term, filters)
all_orgs = params["organisation_select"] == "all" # all_orgs = params["organisation_select"] == "all"
FilterService.filter_logs(logs, search_term, filters, all_orgs, current_user) # FilterService.filter_logs(logs, search_term, filters, all_orgs, current_user)
end # end
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 do |filter|
new_filters[filter] = params[filter] if params[filter].present?
end
params["organisation_select"] == "all" ? new_filters.except("organisation") : new_filters
end
def session_filters(specific_org: false) # def load_session_filters(specific_org: false)
@session_filters ||= load_session_filters(specific_org:) # current_filters = session[:logs_filters]
end # new_filters = current_filters.present? ? JSON.parse(current_filters) : {}
# 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
def set_session_filters # def session_filters(specific_org: false)
session[:logs_filters] = @session_filters.to_json # @session_filters ||= load_session_filters(specific_org:)
end # end
#
# def set_session_filters
# session[:logs_filters] = @session_filters.to_json
# end
end end

17
app/controllers/sales_logs_controller.rb

@ -16,12 +16,13 @@ class SalesLogsController < LogsController
respond_to do |format| respond_to do |format|
format.html do format.html do
all_logs = current_user.sales_logs.visible all_logs = current_user.sales_logs.visible
unpaginated_filtered_logs = filtered_logs(all_logs, search_term, @session_filters) unpaginated_filtered_logs = filter_manager.filtered_logs(all_logs, search_term, session_filters)
@search_term = search_term @search_term = search_term
@pagy, @logs = pagy(unpaginated_filtered_logs) @pagy, @logs = pagy(unpaginated_filtered_logs)
@searched = search_term.presence @searched = search_term.presence
@total_count = all_logs.size @total_count = all_logs.size
@filter_type = "sales_logs"
render "logs/index" render "logs/index"
end end
end end
@ -80,9 +81,21 @@ class SalesLogsController < LogsController
private private
def set_session_filters
filter_manager.serialize_filters_to_session("sales_logs")
end
def session_filters
filter_manager.session_filters("sales_logs")
end
def filter_manager
FilterManager.new(current_user:, session:, params:)
end
def extract_bulk_upload_from_session_filters def extract_bulk_upload_from_session_filters
filter_service = FilterService.new(current_user:, session:) filter_service = FilterService.new(current_user:, session:)
@bulk_upload = filter_service.bulk_upload @bulk_upload = filter_service.bulk_upload("sales_logs")
end end
def redirect_if_bulk_upload_resolved def redirect_if_bulk_upload_resolved

12
app/helpers/filters_helper.rb

@ -1,8 +1,8 @@
module FiltersHelper module FiltersHelper
def filter_selected?(filter, value) def filter_selected?(filter, value, type)
return false unless session[:logs_filters] return false unless session["#{type}_filters"]
selected_filters = JSON.parse(session[:logs_filters]) selected_filters = JSON.parse(session["#{type}_filters"])
return true if selected_filters.blank? && filter == "user" && value == :all return true if selected_filters.blank? && filter == "user" && value == :all
return true if !selected_filters.key?("organisation") && filter == "organisation_select" && value == :all return true if !selected_filters.key?("organisation") && filter == "organisation_select" && value == :all
return true if selected_filters["organisation"].present? && filter == "organisation_select" && value == :specific_org return true if selected_filters["organisation"].present? && filter == "organisation_select" && value == :specific_org
@ -19,10 +19,10 @@ module FiltersHelper
}.freeze }.freeze
end end
def selected_option(filter) def selected_option(filter, type)
return false unless session[:logs_filters] return false unless session["#{type}_filters"]
JSON.parse(session[:logs_filters])[filter] || "" JSON.parse(session["#{type}_filters"])[filter] || ""
end end
def organisations_filter_options(user) def organisations_filter_options(user)

33
app/models/filter_manager.rb

@ -0,0 +1,33 @@
class FilterManager
attr_reader :current_user, :session, :params
def initialize(current_user:, session:, params:)
@current_user = current_user
@session = session
@params = params
end
def serialize_filters_to_session(filter_type, specific_org: false)
session["#{filter_type}_filters"] = session_filters(filter_type, specific_org:).to_json
end
def session_filters(filter_type, specific_org: false)
@session_filters ||= deserialize_filters_from_session(filter_type, specific_org)
end
def deserialize_filters_from_session(filter_type, specific_org)
current_filters = session["#{filter_type}_filters"]
new_filters = current_filters.present? ? JSON.parse(current_filters) : {}
if filter_type.include?("logs")
current_user.logs_filters(specific_org:).each do |filter|
new_filters[filter] = params[filter] if params[filter].present?
end
end
params["organisation_select"] == "all" ? new_filters.except("organisation") : new_filters
end
def filtered_logs(logs, search_term, filters)
all_orgs = params["organisation_select"] == "all"
FilterService.filter_logs(logs, search_term, filters, all_orgs, current_user)
end
end

8
app/services/filter_service.rb

@ -35,14 +35,14 @@ class FilterService
@session = session @session = session
end end
def bulk_upload def bulk_upload(type)
id = (logs_filters["bulk_upload_id"] || []).reject(&:blank?)[0] id = (logs_filters(type)["bulk_upload_id"] || []).reject(&:blank?)[0]
@bulk_upload ||= current_user.bulk_uploads.find_by(id:) @bulk_upload ||= current_user.bulk_uploads.find_by(id:)
end end
private private
def logs_filters def logs_filters(type)
JSON.parse(session[:logs_filters] || "{}") || {} JSON.parse(session["#{type}_filters"] || "{}") || {}
end end
end end

2
app/views/filters/_checkbox_filter.html.erb

@ -2,7 +2,7 @@
<% options.map do |key, option| %> <% options.map do |key, option| %>
<%= f.govuk_check_box category, key.to_s, <%= f.govuk_check_box category, key.to_s,
label: { text: option }, label: { text: option },
checked: filter_selected?(category, key), checked: filter_selected?(category, key, @filter_type),
size: "s" %> size: "s" %>
<% end %> <% end %>
<% end %> <% end %>

2
app/views/filters/_radio_filter.html.erb

@ -2,7 +2,7 @@
<% options.map do |key, option| %> <% options.map do |key, option| %>
<%= f.govuk_radio_button category, key.to_s, <%= f.govuk_radio_button category, key.to_s,
label: { text: option[:label] }, label: { text: option[:label] },
checked: filter_selected?(category, key), checked: filter_selected?(category, key, @filter_type),
size: "s" do %> size: "s" do %>
<% if option[:conditional_filter] %> <% if option[:conditional_filter] %>
<%= render partial: "filters/#{option[:conditional_filter][:type]}_filter", locals: { <%= render partial: "filters/#{option[:conditional_filter][:type]}_filter", locals: {

2
app/views/filters/_select_filter.html.erb

@ -3,5 +3,5 @@
:id, :id,
:name, :name,
label: { hidden: secondary }, label: { hidden: secondary },
options: { disabled: [""], selected: selected_option(category) }, options: { disabled: [""], selected: selected_option(category, @filter_type) },
"data-controller": %w[accessible-autocomplete conditional-filter] %> "data-controller": %w[accessible-autocomplete conditional-filter] %>

2
app/views/logs/_log_filters.erb

@ -39,6 +39,7 @@
<%= render partial: "filters/radio_filter", <%= render partial: "filters/radio_filter",
locals: { locals: {
f: f, f: f,
filter_type: @filter_type,
options: all_or_yours, options: all_or_yours,
label: "Logs", label: "Logs",
category: "user", category: "user",
@ -47,6 +48,7 @@
<% if (@current_user.support? || @current_user.organisation.has_managing_agents?) && request.path == "/lettings-logs" %> <% if (@current_user.support? || @current_user.organisation.has_managing_agents?) && request.path == "/lettings-logs" %>
<%= render partial: "filters/radio_filter", locals: { <%= render partial: "filters/radio_filter", locals: {
f: f, f: f,
filter_type: @filter_type,
options: { options: {
"all": { label: "All" }, "all": { label: "All" },
"specific_org": { "specific_org": {

Loading…
Cancel
Save