mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-27 01:43:22 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
6
app/models/report_rendering_options.rb
Normal file
6
app/models/report_rendering_options.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ReportRenderingOptions < ApplicationRecord
|
||||
belongs_to :user, class_name: "Spree::User"
|
||||
serialize :options, Hash
|
||||
end
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
12
db/migrate/20221116095826_create_report_rendering_options.rb
Normal file
12
db/migrate/20221116095826_create_report_rendering_options.rb
Normal 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
|
||||
12
db/schema.rb
12
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 "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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user