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. 4
      app/views/logs/_log_filters.erb

17
app/controllers/lettings_logs_controller.rb

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

38
app/controllers/modules/logs_filter.rb

@ -1,23 +1,23 @@
module Modules::LogsFilter
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
# 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
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 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)
@session_filters ||= load_session_filters(specific_org:)
end
def set_session_filters
session[:logs_filters] = @session_filters.to_json
end
# def session_filters(specific_org: false)
# @session_filters ||= load_session_filters(specific_org:)
# end
#
# def set_session_filters
# session[:logs_filters] = @session_filters.to_json
# end
end

17
app/controllers/sales_logs_controller.rb

@ -16,12 +16,13 @@ class SalesLogsController < LogsController
respond_to do |format|
format.html do
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
@pagy, @logs = pagy(unpaginated_filtered_logs)
@searched = search_term.presence
@total_count = all_logs.size
@filter_type = "sales_logs"
render "logs/index"
end
end
@ -80,9 +81,21 @@ class SalesLogsController < LogsController
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
filter_service = FilterService.new(current_user:, session:)
@bulk_upload = filter_service.bulk_upload
@bulk_upload = filter_service.bulk_upload("sales_logs")
end
def redirect_if_bulk_upload_resolved

12
app/helpers/filters_helper.rb

@ -1,8 +1,8 @@
module FiltersHelper
def filter_selected?(filter, value)
return false unless session[:logs_filters]
def filter_selected?(filter, value, type)
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.key?("organisation") && filter == "organisation_select" && value == :all
return true if selected_filters["organisation"].present? && filter == "organisation_select" && value == :specific_org
@ -19,10 +19,10 @@ module FiltersHelper
}.freeze
end
def selected_option(filter)
return false unless session[:logs_filters]
def selected_option(filter, type)
return false unless session["#{type}_filters"]
JSON.parse(session[:logs_filters])[filter] || ""
JSON.parse(session["#{type}_filters"])[filter] || ""
end
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
end
def bulk_upload
id = (logs_filters["bulk_upload_id"] || []).reject(&:blank?)[0]
def bulk_upload(type)
id = (logs_filters(type)["bulk_upload_id"] || []).reject(&:blank?)[0]
@bulk_upload ||= current_user.bulk_uploads.find_by(id:)
end
private
def logs_filters
JSON.parse(session[:logs_filters] || "{}") || {}
def logs_filters(type)
JSON.parse(session["#{type}_filters"] || "{}") || {}
end
end

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

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

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

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

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

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

4
app/views/logs/_log_filters.erb

@ -6,7 +6,7 @@
<div class="app-filter__content">
<%= form_with html: { method: :get } do |f| %>
<% all_or_yours = { "all": { label: "All" }, "yours": { label: "Yours" } } %>
<% all_or_yours = { "all": { label: "All" }, "yours": { label: "Yours" }} %>
<% if bulk_upload_options(@bulk_upload).present? %>
<%= render partial: "filters/checkbox_filter",
@ -39,6 +39,7 @@
<%= render partial: "filters/radio_filter",
locals: {
f: f,
filter_type: @filter_type,
options: all_or_yours,
label: "Logs",
category: "user",
@ -47,6 +48,7 @@
<% if (@current_user.support? || @current_user.organisation.has_managing_agents?) && request.path == "/lettings-logs" %>
<%= render partial: "filters/radio_filter", locals: {
f: f,
filter_type: @filter_type,
options: {
"all": { label: "All" },
"specific_org": {

Loading…
Cancel
Save