Introduce FeatureToggle for columns logic

Key is `report_inverse_columns_logic`

This commit is relative to 985893667 commit
This commit is contained in:
Jean-Baptiste Bellet
2022-05-31 13:56:27 +02:00
parent a46416a98e
commit a6dc19f717
5 changed files with 75 additions and 15 deletions

View File

@@ -4,12 +4,19 @@ module Reporting
class ReportHeadersBuilder
attr_reader :report
def initialize(report)
def initialize(report, current_user)
@report = report
@current_user = current_user
end
def table_headers
report.columns.keys.filter{ |key| key.in?(fields_to_show) }.map do |key|
filter = if OpenFoodNetwork::FeatureToggle.enabled?(:report_inverse_columns_logic,
@current_user)
proc { |key| key.in?(fields_to_show) }
else
proc { |key| !key.in?(fields_to_hide) }
end
report.columns.keys.filter { |key| filter.call(key) }.map do |key|
translate_header(key)
end
end
@@ -18,6 +25,14 @@ module Reporting
report.columns.keys.map { |key| [translate_header(key), key] }
end
def fields_to_hide
if report.display_header_row?
report.formatted_rules.map { |rule| rule[:fields_used_in_header] }.flatten.reject(&:blank?)
else
[]
end.concat(params_fields_to_hide)
end
def fields_to_show
fields_in_headers = if report.display_header_row?
report.formatted_rules.map { |rule|
@@ -41,6 +56,10 @@ module Reporting
Spree::Money.currency_symbol
end
def params_fields_to_hide
report.params[:fields_to_hide]&.map(&:to_sym) || []
end
def params_fields_to_show
report.params[:fields_to_show]&.map(&:to_sym) || report.columns.keys
end

View File

@@ -7,8 +7,9 @@ module Reporting
attr_reader :report
def initialize(report)
def initialize(report, current_user)
@report = report
@current_user = current_user
end
# Compute the query result item into a result row
@@ -27,7 +28,12 @@ module Reporting
end
def slice_and_format_row(row)
result = row.to_h.select { |k, _v| k.in?(report.fields_to_show) }
result = if OpenFoodNetwork::FeatureToggle.enabled?(:report_inverse_columns_logic,
@current_user)
row.to_h.select { |k, _v| k.in?(report.fields_to_show) }
else
row.to_h.reject { |k, _v| k.in?(report.fields_to_hide) }
end
unless report.raw_render?
result = result.map { |k, v| [k, format_cell(v, k)] }.to_h
end

View File

@@ -4,9 +4,9 @@ module Reporting
class ReportRowsBuilder
attr_reader :report
def initialize(report)
def initialize(report, current_user)
@report = report
@builder = ReportRowBuilder.new(report)
@builder = ReportRowBuilder.new(report, current_user)
end
# Structured data by groups. This tree is used to render

View File

@@ -9,7 +9,8 @@ module Reporting
delegate :raw_render?, :html_render?, :display_header_row?, :display_summary_row?, to: :renderer
delegate :rows, :table_rows, :grouped_data, to: :rows_builder
delegate :available_headers, :table_headers, :fields_to_show, to: :headers_builder
delegate :available_headers, :table_headers, :fields_to_hide, :fields_to_show,
to: :headers_builder
delegate :formatted_rules, :header_option?, :summary_row_option?, to: :ruler
@@ -104,11 +105,11 @@ module Reporting
end
def rows_builder
@rows_builder ||= ReportRowsBuilder.new(self)
@rows_builder ||= ReportRowsBuilder.new(self, @user)
end
def headers_builder
@headers_builder ||= ReportHeadersBuilder.new(self)
@headers_builder ||= ReportHeadersBuilder.new(self, @user)
end
def ruler

View File

@@ -101,7 +101,28 @@ module Reporting
check_report
end
describe "fields_to_hide" do
before do
allow(OpenFoodNetwork::FeatureToggle).to receive(:enabled?).with(
:report_inverse_columns_logic, anything
).and_return(false)
end
let(:params) { { fields_to_hide: [:product] } }
it "works" do
@expected_headers = ['Hub', 'Price']
check_report
end
end
describe "fields_to_show" do
before do
allow(OpenFoodNetwork::FeatureToggle).to receive(:enabled?).with(
:report_inverse_columns_logic, anything
).and_return(true)
end
let(:params) { { fields_to_show: [:hub, :price] } }
it "works" do
@@ -263,13 +284,26 @@ module Reporting
}]
end
let(:params) { { fields_to_show: [:hub, :quantity], report_format: 'json' } }
describe "for fields_to_show" do
let(:params) { { fields_to_show: [:hub, :quantity], report_format: 'json' } }
it "works" do
@expetec_rows = [
{ hub: "Hub 1", quantity: 4 }
]
check_report
it "works" do
@expetec_rows = [
{ hub: "Hub 1", quantity: 4 }
]
check_report
end
end
describe "for fields_to_hide" do
let(:params) { { fields_to_hide: [:customer], report_format: 'json' } }
it "works" do
@expetec_rows = [
{ hub: "Hub 1", quantity: 4 }
]
check_report
end
end
end
end