From b6a7ca304797f64052b558bcfb6b24c78703aacc Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Thu, 24 Nov 2022 10:25:59 +0100 Subject: [PATCH 1/3] create ReportRenderingOptions model --- app/models/report_rendering_options.rb | 6 ++++++ app/models/spree/user.rb | 2 +- ...20221116095826_create_report_rendering_options.rb | 12 ++++++++++++ db/schema.rb | 12 +++++++++++- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 app/models/report_rendering_options.rb create mode 100644 db/migrate/20221116095826_create_report_rendering_options.rb diff --git a/app/models/report_rendering_options.rb b/app/models/report_rendering_options.rb new file mode 100644 index 0000000000..e94d77046b --- /dev/null +++ b/app/models/report_rendering_options.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class ReportRenderingOptions < ApplicationRecord + belongs_to :user, class_name: "Spree::User" + serialize :options, Hash +end diff --git a/app/models/spree/user.rb b/app/models/spree/user.rb index 7ec00897e9..2f29c28a65 100644 --- a/app/models/spree/user.rb +++ b/app/models/spree/user.rb @@ -37,7 +37,7 @@ module Spree foreign_key: :owner_id, inverse_of: :owner has_many :customers has_many :credit_cards - + has_many :report_rendering_options, class_name:"::ReportRenderingOptions",dependent: :destroy accepts_nested_attributes_for :enterprise_roles, allow_destroy: true accepts_nested_attributes_for :bill_address diff --git a/db/migrate/20221116095826_create_report_rendering_options.rb b/db/migrate/20221116095826_create_report_rendering_options.rb new file mode 100644 index 0000000000..5b5891551f --- /dev/null +++ b/db/migrate/20221116095826_create_report_rendering_options.rb @@ -0,0 +1,12 @@ +class CreateReportRenderingOptions < ActiveRecord::Migration[6.1] + def change + create_table :report_rendering_options do |t| + t.references :user + t.text :options + t.string :report_type + t.string :report_subtype + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 87d58b6eae..a51c8817ef 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_10_07_105052) do +ActiveRecord::Schema.define(version: 2022_11_16_095826) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" @@ -354,6 +354,16 @@ ActiveRecord::Schema.define(version: 2022_10_07_105052) do t.index ["subscription_id"], name: "index_proxy_orders_on_subscription_id" end + create_table "report_rendering_options", force: :cascade do |t| + t.bigint "user_id" + t.text "options" + t.string "report_type" + t.string "report_subtype" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["user_id"], name: "index_report_rendering_options_on_user_id" + end + create_table "schedules", id: :serial, force: :cascade do |t| t.string "name", limit: 255, null: false t.datetime "created_at", null: false From e25f4b1daabeda53ba85f3a7a225d9a2322cf095 Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Thu, 24 Nov 2022 10:26:51 +0100 Subject: [PATCH 2/3] integrate ReportRenderingOptions in the View/Controller --- app/controllers/admin/reports_controller.rb | 10 +----- app/controllers/concerns/reports_actions.rb | 33 +++++++++++++++++++ app/models/spree/user.rb | 2 +- .../reports/_rendering_options.html.haml | 6 ++-- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 9c88a0bd09..cfdabcbbd7 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -48,15 +48,7 @@ module Admin else I18n.t(:name, scope: [:admin, :reports, @report_type]) end - - # Initialize data - params[:display_summary_row] = true if request.get? - @params_fields_to_show = if request.get? - @report.columns.keys - @report.fields_to_hide - else - params[:fields_to_show] - end - + @rendering_options = rendering_options @data = Reporting::FrontendData.new(spree_current_user) end end diff --git a/app/controllers/concerns/reports_actions.rb b/app/controllers/concerns/reports_actions.rb index 6cd9e5157c..4f6a8994c4 100644 --- a/app/controllers/concerns/reports_actions.rb +++ b/app/controllers/concerns/reports_actions.rb @@ -62,4 +62,37 @@ module ReportsActions def i18n_scope 'admin.reports' end + + def rendering_options + @rendering_options ||= ReportRenderingOptions.where( + user: spree_current_user, + report_type: report_type, + report_subtype: report_subtype + ).first_or_create do |report_rendering_options| + report_rendering_options.options = { + fields_to_show: if request.get? + @report.columns.keys - + @report.fields_to_hide + else + params[:fields_to_show] + end, + display_summary_row: request.get?, + display_header_row: false + } + end + update_rendering_options + @rendering_options + end + + def update_rendering_options + return unless request.post? + + @rendering_options.update( + options: { + fields_to_show: params[:fields_to_show], + display_summary_row: params[:display_summary_row].present?, + display_header_row: params[:display_header_row].present? + } + ) + end end diff --git a/app/models/spree/user.rb b/app/models/spree/user.rb index 2f29c28a65..e95df0fcfd 100644 --- a/app/models/spree/user.rb +++ b/app/models/spree/user.rb @@ -37,7 +37,7 @@ module Spree foreign_key: :owner_id, inverse_of: :owner has_many :customers has_many :credit_cards - has_many :report_rendering_options, class_name:"::ReportRenderingOptions",dependent: :destroy + has_many :report_rendering_options, class_name: "::ReportRenderingOptions", dependent: :destroy accepts_nested_attributes_for :enterprise_roles, allow_destroy: true accepts_nested_attributes_for :bill_address diff --git a/app/views/admin/reports/_rendering_options.html.haml b/app/views/admin/reports/_rendering_options.html.haml index 8ba2a4a1ba..dc00db24d0 100644 --- a/app/views/admin/reports/_rendering_options.html.haml +++ b/app/views/admin/reports/_rendering_options.html.haml @@ -16,16 +16,16 @@ .omega.fourteen.columns - if @report.header_option? %span.inline-checkbox{ style: "margin-right: 1rem;" } - = check_box_tag :display_header_row, true, params[:display_header_row] + = check_box_tag :display_header_row, true, @rendering_options.options[:display_header_row] = label_tag :display_header_row, t(".header_row") - if @report.summary_row_option? %span.inline-checkbox - = check_box_tag :display_summary_row, true, params[:display_summary_row], { "data-csv-select-target": "checkbox" } + = check_box_tag :display_summary_row, true, @rendering_options.options[:display_summary_row], { "data-csv-select-target": "checkbox" } = label_tag :display_summary_row, t(".summary_row"), { "data-csv-select-target": "label" } - if @report.available_headers.present? .row .alpha.two.columns= label_tag nil, t(:report_columns) .omega.fourteen.columns - = render MultipleCheckedSelectComponent.new(name: "fields_to_show", options: @report.available_headers, selected: @params_fields_to_show) + = render MultipleCheckedSelectComponent.new(name: "fields_to_show", options: @report.available_headers, selected: @rendering_options.options[:fields_to_show]) \ No newline at end of file From 005d5cafde7167a394c1713bfcd9c4165a12894f Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Thu, 24 Nov 2022 10:27:38 +0100 Subject: [PATCH 3/3] test if the rendering options are stored for every reports seperately and if they persiste after logout --- .../reports/orders_and_fulfillment_spec.rb | 120 +++++++++++++++++- 1 file changed, 119 insertions(+), 1 deletion(-) diff --git a/spec/system/admin/reports/orders_and_fulfillment_spec.rb b/spec/system/admin/reports/orders_and_fulfillment_spec.rb index 5a295120b1..23969c5355 100644 --- a/spec/system/admin/reports/orders_and_fulfillment_spec.rb +++ b/spec/system/admin/reports/orders_and_fulfillment_spec.rb @@ -7,8 +7,10 @@ describe "Orders And Fulfillment" do include WebHelper describe "reports" do + let(:current_user) { create(:admin_user) } + before do - login_as_admin + login_to_admin_as(current_user) visit admin_reports_path end @@ -438,5 +440,121 @@ describe "Orders And Fulfillment" do end end end + + describe "Saving report rendering options" do + let(:report_title) { "Order Cycle Supplier Totals" } + + let(:second_report_title) { "Order Cycle Supplier Totals by Distributor" } + + let(:columns_dropdown_selector) { 'div[data-multiple-checked-select-target="button"]' } + + context "Switching between reports" do + context "Display options" do + it "should store display options for every report separately" do + # Step 1: Update report rendering options on two reports + click_link report_title + expect(page).to have_unchecked_field('Header Row') + expect(page).to have_checked_field('Summary Row') + check 'Header Row' + uncheck 'Summary Row' + + click_button 'Go' + + click_link "Report" + click_link second_report_title + expect(page).to have_unchecked_field('Header Row') + expect(page).to have_checked_field('Summary Row') + check 'Header Row' + click_button 'Go' + + # Step 2: check if report rendering options are saved properly + click_link "Report" + click_link report_title + expect(page).to have_checked_field('Header Row') + expect(page).to have_unchecked_field('Summary Row') + + click_link "Report" + click_link second_report_title + expect(page).to have_checked_field('Header Row') + expect(page).to have_checked_field('Summary Row') + end + end + context "Columns to show" do + it "should store columns to show for every report separately" do + # Step 1: Update report rendering options on two reports + click_link report_title + find(columns_dropdown_selector).click + expect(page).to have_checked_field('Producer') + expect(page).to have_checked_field('Product') + uncheck('Producer') + uncheck('Product') + click_button 'Go' + + click_link "Report" + click_link second_report_title + find(columns_dropdown_selector).click + expect(page).to have_checked_field('Producer') + expect(page).to have_checked_field('Product') + uncheck('Product') + click_button 'Go' + + # Step 2: check if report rendering options are saved properly + click_link "Report" + click_link report_title + find(columns_dropdown_selector).click + expect(page).to have_unchecked_field('Producer') + expect(page).to have_unchecked_field('Product') + + click_link "Report" + click_link second_report_title + find(columns_dropdown_selector).click + expect(page).to have_checked_field('Producer') + expect(page).to have_unchecked_field('Product') + end + end + end + context "Revisiting a report after logout" do + context "Display options" do + it "should store display options" do + click_link report_title + expect(page).to have_unchecked_field('Header Row') + expect(page).to have_checked_field('Summary Row') + check 'Header Row' + uncheck 'Summary Row' + click_button 'Go' + + logout + login_to_admin_as(current_user) + visit admin_reports_path + + click_link report_title + expect(page).to have_checked_field('Header Row') + expect(page).to have_unchecked_field('Summary Row') + end + end + + context "Columns to show" do + it "should store columns after logout" do + click_link report_title + find(columns_dropdown_selector).click + expect(page).to have_checked_field('Producer') + expect(page).to have_checked_field('Product') + uncheck('Producer') + uncheck('Product') + click_button 'Go' + + logout + login_to_admin_as(current_user) + visit admin_reports_path + + click_link "Report" + click_link report_title + find(columns_dropdown_selector).click + expect(page).to have_unchecked_field('Producer') + expect(page).to have_unchecked_field('Product') + end + end + end + end end end