Merge pull request #9999 from abdellani/add-ability-to-save-rendering-options-per-report

Add ability to save rendering options per report
This commit is contained in:
Konrad
2022-12-02 14:33:37 +01:00
committed by GitHub
8 changed files with 186 additions and 15 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,6 @@
# frozen_string_literal: true
class ReportRenderingOptions < ApplicationRecord
belongs_to :user, class_name: "Spree::User"
serialize :options, Hash
end

View File

@@ -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

View File

@@ -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])

View File

@@ -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

View File

@@ -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 "plpgsql"
@@ -353,6 +353,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

View File

@@ -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