diff --git a/app/controllers/lettings_logs_controller.rb b/app/controllers/lettings_logs_controller.rb index 18905341f..df645b2d4 100644 --- a/app/controllers/lettings_logs_controller.rb +++ b/app/controllers/lettings_logs_controller.rb @@ -1,16 +1,12 @@ class LettingsLogsController < LogsController - include Pagy::Backend - include Modules::LettingsLogsFilter - include Modules::SearchFilter - before_action :authenticate_user!, unless: :json_api_request? before_action :find_resource, except: %i[create index edit] def index set_session_filters all_logs = current_user.lettings_logs - unpaginated_filtered_logs = filtered_lettings_logs(filtered_collection(all_logs, search_term)) + unpaginated_filtered_logs = filtered_logs(filtered_collection(all_logs, search_term)) respond_to do |format| format.html do @@ -78,12 +74,6 @@ class LettingsLogsController < LogsController private - API_ACTIONS = %w[create show update destroy].freeze - - def search_term - params["search"] - end - def permitted_log_params params.require(:lettings_log).permit(LettingsLog.editable_fields) end diff --git a/app/controllers/logs_controller.rb b/app/controllers/logs_controller.rb index 723d7adca..384b19c89 100644 --- a/app/controllers/logs_controller.rb +++ b/app/controllers/logs_controller.rb @@ -1,6 +1,31 @@ class LogsController < ApplicationController + + include Pagy::Backend + include Modules::LogsFilter + include Modules::SearchFilter + skip_before_action :verify_authenticity_token, if: :json_api_request? before_action :authenticate, if: :json_api_request? + before_action :authenticate_user!, unless: :json_api_request? + + def index + set_session_filters + + all_logs = current_user.lettings_logs + current_user.sales_logs + unpaginated_filtered_logs = filtered_logs(filtered_collection(all_logs, search_term)) + + respond_to do |format| + format.html do + @pagy, @lettings_logs = pagy(unpaginated_filtered_logs) + @searched = search_term.presence + @total_count = all_logs.size + end + + format.csv do + send_data byte_order_mark + unpaginated_filtered_logs.to_csv(current_user), filename: "logs-#{Time.zone.now}.csv" + end + end + end private @@ -61,4 +86,8 @@ private "created_by_id" => current_user.id, } end + + def search_term + params["search"] + end end diff --git a/app/controllers/modules/lettings_logs_filter.rb b/app/controllers/modules/logs_filter.rb similarity index 50% rename from app/controllers/modules/lettings_logs_filter.rb rename to app/controllers/modules/logs_filter.rb index c074e48bb..ef33ac372 100644 --- a/app/controllers/modules/lettings_logs_filter.rb +++ b/app/controllers/modules/logs_filter.rb @@ -1,7 +1,7 @@ -module Modules::LettingsLogsFilter - def filtered_lettings_logs(logs) - if session[:lettings_logs_filters].present? - filters = JSON.parse(session[:lettings_logs_filters]) +module Modules::LogsFilter + def filtered_logs(logs) + if session[:logs_filters].present? + filters = JSON.parse(session[:logs_filters]) filters.each do |category, values| next if Array(values).reject(&:empty?).blank? next if category == "organisation" && params["organisation_select"] == "all" @@ -9,15 +9,15 @@ module Modules::LettingsLogsFilter logs = logs.public_send("filter_by_#{category}", values, current_user) end end - logs = logs.order(created_at: :desc) + logs = logs.sort_by(&:created_at) current_user.support? ? logs.all.includes(:owning_organisation, :managing_organisation) : logs end def set_session_filters(specific_org: false) - new_filters = session[:lettings_logs_filters].present? ? JSON.parse(session[:lettings_logs_filters]) : {} - current_user.lettings_logs_filters(specific_org:).each { |filter| new_filters[filter] = params[filter] if params[filter].present? } + new_filters = session[:logs_filters].present? ? JSON.parse(session[:logs_filters]) : {} + current_user.logs_filters(specific_org:).each { |filter| new_filters[filter] = params[filter] if params[filter].present? } new_filters = new_filters.except("organisation") if params["organisation_select"] == "all" - session[:lettings_logs_filters] = new_filters.to_json + session[:logs_filters] = new_filters.to_json end end diff --git a/app/controllers/organisations_controller.rb b/app/controllers/organisations_controller.rb index 1cf181788..fca5f22db 100644 --- a/app/controllers/organisations_controller.rb +++ b/app/controllers/organisations_controller.rb @@ -92,7 +92,7 @@ class OrganisationsController < ApplicationController set_session_filters(specific_org: true) organisation_logs = LettingsLog.all.where(owning_organisation_id: @organisation.id) - unpaginated_filtered_logs = filtered_lettings_logs(filtered_collection(organisation_logs, search_term)) + unpaginated_filtered_logs = filtered_logs(filtered_collection(organisation_logs, search_term)) respond_to do |format| format.html do diff --git a/app/models/user.rb b/app/models/user.rb index 175657cba..56dd2821f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -141,7 +141,7 @@ class User < ApplicationRecord ROLES.except(:support) end - def lettings_logs_filters(specific_org: false) + def logs_filters(specific_org: false) if support? && !specific_org %w[status years user organisation] else diff --git a/config/routes.rb b/config/routes.rb index 5a3cdb43f..6f87c1f2c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -73,6 +73,7 @@ Rails.application.routes.draw do end end + get "logs", to: "logs#index" resources :lettings_logs, path: "/logs" do collection do post "bulk-upload", to: "bulk_upload#bulk_upload" diff --git a/spec/requests/logs_controller_spec.rb b/spec/requests/logs_controller_spec.rb new file mode 100644 index 000000000..e123af1ab --- /dev/null +++ b/spec/requests/logs_controller_spec.rb @@ -0,0 +1,20 @@ +require "rails_helper" + +RSpec.describe LettingsLogsController, type: :request do + + describe "index" do + let(:user) { FactoryBot.create(:user) } + let(:page) { Capybara::Node::Simple.new(response.body) } + + before do + sign_in user + FactoryBot.create_list(:lettings_log, 3, :completed, owning_organisation: user.organisation, created_by: user) + FactoryBot.create_list(:sales_log, 3, owning_organisation: user.organisation, created_by: user) + end + + it "shows both lettings and sales logs" do + get "/logs" + expect(page).to have_content("6 total logs") + end + end +end \ No newline at end of file