diff --git a/app/controllers/lettings_logs_controller.rb b/app/controllers/lettings_logs_controller.rb index a3ad65170..1cc607ca7 100644 --- a/app/controllers/lettings_logs_controller.rb +++ b/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 diff --git a/app/controllers/modules/logs_filter.rb b/app/controllers/modules/logs_filter.rb index 06109cfb0..3fe5ca0f0 100644 --- a/app/controllers/modules/logs_filter.rb +++ b/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 diff --git a/app/controllers/sales_logs_controller.rb b/app/controllers/sales_logs_controller.rb index 7ed52be2d..08dde8d83 100644 --- a/app/controllers/sales_logs_controller.rb +++ b/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 diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index a49242a15..c988adc4a 100644 --- a/app/helpers/filters_helper.rb +++ b/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) diff --git a/app/models/filter_manager.rb b/app/models/filter_manager.rb new file mode 100644 index 000000000..cbeb2d6b6 --- /dev/null +++ b/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 diff --git a/app/services/filter_service.rb b/app/services/filter_service.rb index 71fc19a46..57f12f21f 100644 --- a/app/services/filter_service.rb +++ b/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 diff --git a/app/views/filters/_checkbox_filter.html.erb b/app/views/filters/_checkbox_filter.html.erb index cbbf5c39d..d08c42a77 100644 --- a/app/views/filters/_checkbox_filter.html.erb +++ b/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 %> diff --git a/app/views/filters/_radio_filter.html.erb b/app/views/filters/_radio_filter.html.erb index abb55eafe..8f4a790dc 100644 --- a/app/views/filters/_radio_filter.html.erb +++ b/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: { diff --git a/app/views/filters/_select_filter.html.erb b/app/views/filters/_select_filter.html.erb index f5f6c441f..ee274906e 100644 --- a/app/views/filters/_select_filter.html.erb +++ b/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] %> diff --git a/app/views/logs/_log_filters.erb b/app/views/logs/_log_filters.erb index a1aa752c3..5553e062d 100644 --- a/app/views/logs/_log_filters.erb +++ b/app/views/logs/_log_filters.erb @@ -6,7 +6,7 @@
<%= 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": {