diff --git a/lib/reporting/report_headers_builder.rb b/lib/reporting/report_headers_builder.rb index e52a7a6792..cc5b537fa5 100644 --- a/lib/reporting/report_headers_builder.rb +++ b/lib/reporting/report_headers_builder.rb @@ -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 diff --git a/lib/reporting/report_row_builder.rb b/lib/reporting/report_row_builder.rb index 88eb1a1966..28bec7b25b 100644 --- a/lib/reporting/report_row_builder.rb +++ b/lib/reporting/report_row_builder.rb @@ -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 diff --git a/lib/reporting/report_rows_builder.rb b/lib/reporting/report_rows_builder.rb index 1395aef98d..e9a460904a 100644 --- a/lib/reporting/report_rows_builder.rb +++ b/lib/reporting/report_rows_builder.rb @@ -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 diff --git a/lib/reporting/report_template.rb b/lib/reporting/report_template.rb index 7ecc0484be..9c2cc3fe00 100644 --- a/lib/reporting/report_template.rb +++ b/lib/reporting/report_template.rb @@ -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 diff --git a/spec/lib/reports/report_spec.rb b/spec/lib/reports/report_spec.rb index 790329f21f..964bd8f1bf 100644 --- a/spec/lib/reports/report_spec.rb +++ b/spec/lib/reports/report_spec.rb @@ -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