simple_drilldown 0.6.7 → 0.6.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20d7b53c9e1fdf228a84a025903f46d614625db9fdd66080576969700136f3a6
4
- data.tar.gz: 75bdf58b4bc191390cdf9aa358a0f9e018c5bc20be0c6f0db8b686deff584a06
3
+ metadata.gz: 42c85e43c9d07d94ed0d7c502afa8b4ee638f86ca41bf6b742f7f34cfd47a355
4
+ data.tar.gz: 506ac06824fd78a878302544967b7f997bfae64c6e4e26da9b5955603595ffc2
5
5
  SHA512:
6
- metadata.gz: d6a3da501e77e3d0e8c4fdff93372014e7c0761e2971e750ea8de2eea9208174740467a16f55558dc8be69446dce84a1709547664e759d796787620fa2032a58
7
- data.tar.gz: bef5d70dc50b1b68396464410844c05c40698298339476a43c825f09899f9a0d01d0e4283207a30f3b1858415d2bd2509fcc6aad88f61484c10fec7a13244ea6
6
+ metadata.gz: 4dbf710685173878b38ce96238eb9c1e558bd4b9472d0f928146920f21b2de3a4eb3c64195ad87da9940383f7190c6d89404419390bce6f4fcceb134a959f634
7
+ data.tar.gz: aa1f9ba981439836636dcab9a0adcd61b834f7c5e2667b86dd43980d7b3a3072f2df2b4ab6e7d6f7161fa7ed449c9473fd1a796692680dbffeb6a25e9977f0ee
@@ -3,5 +3,8 @@
3
3
  xml << render(partial: '/drilldown/excel_row_header')
4
4
 
5
5
  result[:records].each do |t|
6
- xml << render(partial: '/drilldown/excel_row', locals: { transaction: t, previous_transaction: nil, errors: [], error_row: false, meter1_errors: false })
6
+ xml << render(
7
+ partial: '/drilldown/excel_row',
8
+ locals: { transaction: t, previous_transaction: nil, errors: [], error_row: false, meter1_errors: false }
9
+ )
7
10
  end
@@ -6,7 +6,12 @@ xml.Row do
6
6
 
7
7
  @search.fields.each_with_index do |field, i|
8
8
  if field == 'time'
9
- value = (transaction.respond_to?(:completed_at) ? transaction.completed_at : transaction.created_at).localtime.strftime('%Y-%m-%d %H:%M')
9
+ value = ((
10
+ if transaction.respond_to?(:completed_at)
11
+ transaction.completed_at
12
+ else
13
+ transaction.created_at
14
+ end)).localtime.strftime('%Y-%m-%d %H:%M')
10
15
  else
11
16
  value = if @transaction_fields_map[field.to_sym][:attr_method]
12
17
  @transaction_fields_map[field.to_sym][:attr_method].call(transaction)
@@ -9,7 +9,11 @@ xml.Row do
9
9
  end
10
10
  end
11
11
  if dimension > 0
12
- xml.Cell('ss:StyleID' => 'Outer', 'ss:Index' => dimension.to_s) { xml.Data value_label(dimension - 1, result[:value]), 'ss:Type' => 'String' }
12
+ xml.Cell('ss:StyleID' => 'Outer',
13
+ 'ss:Index' => dimension.to_s) do
14
+ xml.Data value_label(dimension - 1, result[:value]),
15
+ 'ss:Type' => 'String'
16
+ end
13
17
  end
14
18
 
15
19
  xml.Cell('ss:StyleID' => 'Outer') { xml.Data result[:count].inspect, 'ss:Type' => 'Number' }
@@ -4,8 +4,12 @@ xml.chart(xAxisName: (@dimensions[0][:pretty_name] || 'Elections').gsub("'", '')
4
4
  showValues: '1', caption: caption, subcaption: subcaption,
5
5
  yAxisName: "Election #{t(@search.select_value.downcase)}", numberSuffix: '') do
6
6
  @result[:rows].each do |res|
7
- xml.set(name: @dimensions[0][:label_method] ? @dimensions[0][:label_method].call(res[:value]) : res[:value],
7
+ xml.set name: @dimensions[0][:label_method] ? @dimensions[0][:label_method].call(res[:value]) : res[:value],
8
8
  value: res[@search.select_value.downcase.to_sym],
9
- link: @dimensions[0][:url_param_name] ? CGI.escape(url_for(@search.drill_down(@dimensions, res[:value]).url_options)) : '')
9
+ link: if @dimensions[0][:url_param_name]
10
+ CGI.escape(url_for(@search.drill_down(@dimensions, res[:value]).url_options))
11
+ else
12
+ ''
13
+ end
10
14
  end
11
15
  end
@@ -1,23 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- xml.chart xAxisName: (@dimensions[0][:pretty_name] || 'Elections').gsub("'", ''), palette: '2',
4
- caption: caption, subcaption: subcaption,
5
- showNames: '1', showValues: @result[:rows].size > 15 || @result[:rows][0] && @result[:rows][0][:rows].size > 4 ? 0 : 1, decimals: '0',
6
- numberPrefix: '', clustered: '0', exeTime: '1.5', showPlotBorder: '0', zGapPlot: '30',
7
- zDepth: '90', divLineEffect: 'emboss', startAngX: '10', endAngX: '18', startAngY: '-10',
8
- numberSuffix: '', zAxisName: 'Z Axis', yAxisName: "Transaction #{t(@search.select_value.downcase)}", endAngY: '-40' do
3
+ xml.chart(
4
+ xAxisName: (@dimensions[0][:pretty_name] || 'Elections').gsub("'", ''), palette: '2',
5
+ caption: caption, subcaption: subcaption,
6
+ showNames: '1',
7
+ showValues: @result[:rows].size > 15 || @result[:rows][0] && @result[:rows][0][:rows].size > 4 ? 0 : 1,
8
+ decimals: '0',
9
+ numberPrefix: '', clustered: '0', exeTime: '1.5', showPlotBorder: '0', zGapPlot: '30',
10
+ zDepth: '90', divLineEffect: 'emboss', startAngX: '10', endAngX: '18', startAngY: '-10',
11
+ numberSuffix: '', zAxisName: 'Z Axis',
12
+ yAxisName: "Transaction #{t(@search.select_value.downcase)}", endAngY: '-40'
13
+ ) do
9
14
  unless @result[:rows].empty?
10
15
  xml.categories do
11
16
  @result[:rows].each do |result|
12
- xml.category label: @dimensions[0][:label_method] ? @dimensions[0][:label_method].call(result[:value]) : result[:value]
17
+ label_method = @dimensions[0][:label_method]
18
+ xml.category label: label_method ? label_method.call(result[:value]) : result[:value]
13
19
  end
14
20
  end
15
21
 
16
22
  @result[:rows][0][:rows].reverse.each_with_index do |result, i|
17
- xml.dataset seriesName: @dimensions[1][:label_method] ? @dimensions[1][:label_method].call(result[:value]) : result[:value] do
23
+ name = if @dimensions[1][:label_method]
24
+ @dimensions[1][:label_method].call(result[:value])
25
+ else
26
+ result[:value]
27
+ end
28
+ xml.dataset seriesName: name do
18
29
  @result[:rows].each do |res|
19
30
  value = res[:rows].reverse[i][:value]
20
- xml.set(label: @dimensions[0][:label_method] ? @dimensions[0][:label_method].call(res[:value]) : "#{res[:value]}, #{value}",
31
+ label_method = @dimensions[0][:label_method]
32
+ xml.set(label: (label_method ? label_method.call(res[:value]) : "#{res[:value]}, #{value}"),
21
33
  value: res[:rows].reverse[i][@search.select_value.downcase.to_sym],
22
34
  link: CGI.escape(url_for(@search.drill_down(@dimensions, res[:value], value).url_options)))
23
35
  end
@@ -1,25 +1,48 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- xml.chart xAxisName: (@dimensions[0][:pretty_name] || 'Elections').gsub("'", ''), palette: '2',
4
- caption: caption, subcaption: subcaption,
5
- showNames: '1', showValues: @result[:rows].size > 15 || @result[:rows][0] && @result[:rows][0][:rows].size > 4 ? 0 : 1, decimals: '0',
6
- numberPrefix: '', clustered: '0', exeTime: '1.5', showPlotBorder: '0', zGapPlot: '30',
7
- zDepth: '90', divLineEffect: 'emboss', startAngX: '10', endAngX: '18', startAngY: '-10',
8
- numberSuffix: '', zAxisName: 'Z Axis', yAxisName: "Transaction #{t(@search.select_value.downcase)}", endAngY: '-40' do
3
+ xml.chart(
4
+ xAxisName: (@dimensions[0][:pretty_name] || 'Elections').gsub("'", ''), palette: '2',
5
+ caption: caption, subcaption: subcaption,
6
+ showNames: '1',
7
+ showValues:
8
+ @result[:rows].size > 15 || @result[:rows][0] && @result[:rows][0][:rows].size > 4 ? 0 : 1,
9
+ decimals: '0',
10
+ numberPrefix: '', clustered: '0', exeTime: '1.5', showPlotBorder: '0', zGapPlot: '30',
11
+ zDepth: '90', divLineEffect: 'emboss', startAngX: '10', endAngX: '18', startAngY: '-10',
12
+ numberSuffix: '', zAxisName: 'Z Axis',
13
+ yAxisName: "Transaction #{t(@search.select_value.downcase)}", endAngY: '-40'
14
+ ) do
9
15
  unless @result[:rows].empty?
10
16
  xml.categories do
11
17
  @result[:rows].each do |result|
12
- xml.category label: @dimensions[0][:label_method] ? @dimensions[0][:label_method].call(result[:value]) : result[:value]
18
+ xml.category label: if @dimensions[0][:label_method]
19
+ @dimensions[0][:label_method].call(result[:value])
20
+ else
21
+ result[:value]
22
+ end
13
23
  end
14
24
  end
15
25
 
16
26
  @result[:rows][0][:rows].reverse.each_with_index do |result, i|
17
- xml.dataset seriesName: @dimensions[1][:label_method] ? @dimensions[1][:label_method].call(result[:value]) : result[:value] do
27
+ series_name =
28
+ if @dimensions[1][:label_method]
29
+ @dimensions[1][:label_method].call(result[:value])
30
+ else
31
+ result[:value]
32
+ end
33
+ xml.dataset seriesName: series_name do
18
34
  @result[:rows].each do |res|
19
35
  value = res[:rows].reverse[i][:value]
20
- xml.set(label: @dimensions[0][:label_method] ? @dimensions[0][:label_method].call(res[:value]) : "#{res[:value]}, #{value}",
21
- value: res[:rows].reverse[i][@search.select_value.downcase.to_sym],
22
- link: CGI.escape(url_for(@search.drill_down(@dimensions, res[:value], value).url_options)))
36
+ xml.set(
37
+ label:
38
+ if @dimensions[0][:label_method]
39
+ @dimensions[0][:label_method].call(res[:value])
40
+ else
41
+ "#{res[:value]}, #{value}"
42
+ end,
43
+ value: res[:rows].reverse[i][@search.select_value.downcase.to_sym],
44
+ link: CGI.escape(url_for(@search.drill_down(@dimensions, res[:value], value).url_options))
45
+ )
23
46
  end
24
47
  end
25
48
  end
@@ -15,12 +15,14 @@ xml.Workbook(
15
15
  xml.Worksheet 'ss:Name' => 'Transaction Summary' do
16
16
  xml.Table do
17
17
  xml.Row 'ss:Height' => '18.75' do
18
- xml.Cell 'ss:MergeAcross' => @search.list ? @search.fields.size - 1 : @dimensions.size + 2, 'ss:StyleID' => 'MainTitle' do
18
+ xml.Cell 'ss:MergeAcross' => @search.list ? @search.fields.size - 1 : @dimensions.size + 2,
19
+ 'ss:StyleID' => 'MainTitle' do
19
20
  xml.Data caption, 'ss:Type' => 'String'
20
21
  end
21
22
  end
22
23
  xml.Row 'ss:Height' => '15.75' do
23
- xml.Cell 'ss:MergeAcross' => @search.list ? @search.fields.size - 1 : @dimensions.size + 2, 'ss:StyleID' => 'SubTitle' do
24
+ xml.Cell 'ss:MergeAcross' => @search.list ? @search.fields.size - 1 : @dimensions.size + 2,
25
+ 'ss:StyleID' => 'SubTitle' do
24
26
  xml.Data subcaption, 'ss:Type' => 'String'
25
27
  end
26
28
  end
@@ -33,6 +33,7 @@ module SimpleDrilldown
33
33
  begin
34
34
  base.c_target_class = base.name.chomp('Controller').constantize
35
35
  rescue NameError
36
+ # No default target class found
36
37
  end
37
38
  end
38
39
  end
@@ -101,7 +102,9 @@ module SimpleDrilldown
101
102
  raise "Unexpected options: #{options.inspect}" if options.present?
102
103
 
103
104
  queries.each do |query_opts|
104
- raise "Unknown options: #{query_opts.keys.inspect}" unless (query_opts.keys - %i[select includes where]).empty?
105
+ unless (query_opts.keys - %i[select includes where]).empty?
106
+ raise "Unknown options: #{query_opts.keys.inspect}"
107
+ end
105
108
  end
106
109
 
107
110
  c_dimension_defs[name.to_s] = {
@@ -125,7 +128,7 @@ module SimpleDrilldown
125
128
  pretty_name: I18n.t(name, default: :"activerecord.models.#{name}"),
126
129
  queries: queries,
127
130
  reverse: reverse,
128
- select_expression: queries.size > 1 ? "COALESCE(#{queries.map { |q| q[:select] }.join(',')})" : queries[0][:select],
131
+ select_expression: "COALESCE(#{queries.map { |q| q[:select] }.join(',')})",
129
132
  row_class: row_class,
130
133
  url_param_name: name.to_s
131
134
  }
@@ -182,7 +185,7 @@ module SimpleDrilldown
182
185
  dimension_def = c_dimension_defs[field]
183
186
  raise "Unknown filter field: #{field.inspect}" if dimension_def.nil?
184
187
 
185
- values = [*values]
188
+ values = Array(values)
186
189
  if dimension_def[:interval]
187
190
  values *= 2 if values.size == 1
188
191
  raise "Need 2 values for interval filter: #{values.inspect}" if values.size != 2
@@ -237,9 +240,9 @@ module SimpleDrilldown
237
240
  when Hash
238
241
  sql = +''
239
242
  include.each do |parent, child|
240
- sql << ' ' + make_join(joins, model, parent)
243
+ sql << " #{make_join(joins, model, parent)}"
241
244
  ass = model.to_s.camelize.constantize.reflect_on_association parent
242
- sql << ' ' + make_join(joins, parent, child, ass.class_name.constantize)
245
+ sql << " #{make_join(joins, parent, child, ass.class_name.constantize)}"
243
246
  end
244
247
  sql
245
248
  when Symbol
@@ -373,8 +376,7 @@ module SimpleDrilldown
373
376
  selected = @search.filter[dimension_name] || []
374
377
  raise "Unknown dimension #{dimension_name.inspect}: #{c_dimension_defs.keys.inspect}" unless dimension
375
378
 
376
- choices = [[t(:all), nil]] +
377
- (dimension[:legal_values]&.call(@search)&.map { |o| o.is_a?(Array) ? o[0..1].map(&:to_s) : o.to_s } || [])
379
+ choices = [[t(:all), nil]] + (legal_values_for_dimension(dimension) || [])
378
380
  choices_html = choices.map do |c|
379
381
  %(<option value="#{c[1]}"#{' SELECTED' if selected.include?(c[1])}>#{c[0]}</option>)
380
382
  end.join("\n")
@@ -388,9 +390,7 @@ module SimpleDrilldown
388
390
 
389
391
  def excel_export
390
392
  index(false)
391
- headers['Content-Type'] = 'application/vnd.ms-excel'
392
- headers['Content-Disposition'] = 'attachment; filename="drilldown.xml"'
393
- headers['Cache-Control'] = ''
393
+ set_excel_headers
394
394
  render template: '/drilldown/excel_export', layout: false
395
395
  end
396
396
 
@@ -398,21 +398,21 @@ module SimpleDrilldown
398
398
  params[:search][:list] = '1'
399
399
  index(false)
400
400
  @records = get_records(@result)
401
- headers['Content-Type'] = 'application/vnd.ms-excel'
402
- headers['Content-Disposition'] = 'attachment; filename="drilldown.xml"'
401
+ set_excel_headers
403
402
  render template: '/drilldown/excel_export_records', layout: false
404
403
  end
405
404
 
406
- def xml_export
407
- params[:search][:list] = '1'
408
- index(false)
409
- @records = get_records(@result)
410
- headers['Content-Type'] = 'text/xml'
411
- headers['Content-Disposition'] = 'attachment; filename="drilldown.xml"'
412
- render template: '/drilldown/xml_export', layout: false
405
+ private
406
+
407
+ def set_excel_headers
408
+ headers['Content-Type'] = 'application/vnd.ms-excel'
409
+ headers['Content-Disposition'] = %{attachment; filename="#{c_target_class.table_name}.xml"}
410
+ headers['Cache-Control'] = ''
413
411
  end
414
412
 
415
- private
413
+ def legal_values_for_dimension(dimension)
414
+ dimension[:legal_values]&.call(@search)&.map { |o| o.is_a?(Array) ? o[0..1].map(&:to_s) : o.to_s }
415
+ end
416
416
 
417
417
  def new_search_object
418
418
  SimpleDrilldown::Search.new(params[:search]&.to_unsafe_h, c_default_fields, c_default_select_value)
@@ -495,7 +495,8 @@ module SimpleDrilldown
495
495
 
496
496
  result_rows = []
497
497
  loop do
498
- sub_result = result_from_rows(rows, row_index, dimension + 1, values + [rows[row_index]["value#{dimension + 1}"]])
498
+ sub_result = result_from_rows(rows, row_index, dimension + 1,
499
+ values + [rows[row_index]["value#{dimension + 1}"]])
499
500
  break if sub_result.nil?
500
501
 
501
502
  result_rows << sub_result
@@ -517,23 +518,20 @@ module SimpleDrilldown
517
518
  end
518
519
 
519
520
  def populate_list(conditions, includes, result, values)
520
- if result[:rows]
521
- return result[:rows].each { |r| populate_list(conditions, includes, r, values + [r[:value]]) }
522
- end
521
+ return result[:rows].each { |r| populate_list(conditions, includes, r, values + [r[:value]]) } if result[:rows]
522
+
523
523
  list_includes = merge_includes(includes, c_list_includes)
524
524
  @search.fields.each do |field|
525
525
  field_def = c_fields[field.to_sym]
526
526
  raise "Field definition missing for: #{field.inspect}" unless field_def
527
527
 
528
528
  field_includes = field_def[:include]
529
- if field_includes
530
- list_includes = merge_includes(list_includes , field_includes)
531
- end
529
+ list_includes = merge_includes(list_includes, field_includes) if field_includes
532
530
  end
533
531
  if @search.list_change_times
534
532
  @history_fields.each do |f|
535
533
  if @search.fields.include? f
536
- list_includes = merge_includes(list_includes, assignment: { order: :"#{f}_changes" } )
534
+ list_includes = merge_includes(list_includes, assignment: { order: :"#{f}_changes" })
537
535
  end
538
536
  end
539
537
  end
@@ -546,12 +544,12 @@ module SimpleDrilldown
546
544
 
547
545
  def merge_includes(*args)
548
546
  hash = hash_includes(*args)
549
- result = hash.dup.map { |k, v|
547
+ result = hash.dup.map do |k, v|
550
548
  if v.blank?
551
549
  hash.delete(k)
552
550
  k
553
551
  end
554
- }.compact
552
+ end.compact
555
553
  result << hash unless hash.blank?
556
554
  case result.size
557
555
  when 0
@@ -567,14 +565,15 @@ module SimpleDrilldown
567
565
  args.inject({}) do |h, inc|
568
566
  case inc
569
567
  when Array
570
- inc.each { |v|
568
+ inc.each do |v|
571
569
  h = hash_includes(h, v)
572
- }
570
+ end
573
571
  when Hash
574
- inc.each { |k, v|
572
+ inc.each do |k, v|
575
573
  h[k] = merge_includes(h[k], v)
576
- }
574
+ end
577
575
  when NilClass, FalseClass
576
+ # Leave as it is
578
577
  when String, Symbol
579
578
  h[inc] ||= []
580
579
  else
@@ -11,9 +11,8 @@ module SimpleDrilldown
11
11
  end
12
12
 
13
13
  def caption
14
- result = @search.title || "#{controller.c_target_class} #{t(@search.select_value.downcase)}" +
15
- (@dimensions && @dimensions.any? ? ' by ' + @dimensions.map { |d| d[:pretty_name] }.join(' and ') : '')
16
- result.gsub('$date', [*@search.filter[:calendar_date]].uniq.join(' - '))
14
+ result = @search.title || caption_txt
15
+ result.gsub('$date', Array(@search.filter[:calendar_date]).uniq.join(' - '))
17
16
  end
18
17
 
19
18
  def subcaption
@@ -21,9 +20,15 @@ module SimpleDrilldown
21
20
  end
22
21
 
23
22
  def summary_row(result, parent_result = nil, dimension = 0, headers = [], new_row = true)
24
- html = render(partial: '/drilldown/summary_row', locals: { result: result, parent_result: parent_result, new_row: new_row, dimension: dimension, headers: headers, with_results: !result[:rows] })
23
+ html = render(partial: '/drilldown/summary_row', locals: {
24
+ result: result, parent_result: parent_result, new_row: new_row, dimension: dimension,
25
+ headers: headers, with_results: !result[:rows]
26
+ })
25
27
  if result[:rows]
26
- sub_headers = headers + [{ value: result[:value], display_row_count: result[:nodes] + result[:row_count] * (@search.list ? 1 : 0) }]
28
+ sub_headers = headers + [{
29
+ value: result[:value],
30
+ display_row_count: result[:nodes] + result[:row_count] * (@search.list ? 1 : 0)
31
+ }]
27
32
  significant_rows = result[:rows].reject { |r| r[:row_count].zero? }
28
33
  significant_rows.each_with_index do |r, i|
29
34
  html << summary_row(r, result, dimension + 1, sub_headers, i.positive?)
@@ -31,7 +36,12 @@ module SimpleDrilldown
31
36
  elsif @search.list
32
37
  html << render(partial: '/drilldown/record_list', locals: { result: result })
33
38
  end
34
- html << render(partial: '/drilldown/summary_total_row', locals: { result: result, parent_result: parent_result, headers: headers.dup, dimension: dimension }) if dimension < @dimensions.size
39
+ if dimension < @dimensions.size
40
+ html << render(partial: '/drilldown/summary_total_row',
41
+ locals: {
42
+ result: result, parent_result: parent_result, headers: headers.dup, dimension: dimension
43
+ })
44
+ end
35
45
 
36
46
  html
37
47
  end
@@ -41,25 +51,42 @@ module SimpleDrilldown
41
51
  if result[:rows]
42
52
  significant_rows = result[:rows].reject { |r| r[:row_count].zero? }
43
53
  significant_rows.each_with_index do |r, i|
44
- sub_headers = if i.zero?
45
- if dimension.zero?
46
- headers
47
- else
48
- headers + [{ value: result[:value], display_row_count: result[:nodes] + result[:row_count] * (@search.list ? 1 : 0) }]
49
- end
50
- else
51
- [] # [{:value => result[:value], :row_count => result[:row_count]}]
52
- end
54
+ sub_headers =
55
+ if i.zero?
56
+ if dimension.zero?
57
+ headers
58
+ else
59
+ headers + [{
60
+ value: result[:value],
61
+ display_row_count: result[:nodes] + result[:row_count] * (@search.list ? 1 : 0)
62
+ }]
63
+ end
64
+ else
65
+ [] # [{:value => result[:value], :row_count => result[:row_count]}]
66
+ end
53
67
  xml << excel_summary_row(r, result, dimension + 1, sub_headers)
54
68
  end
55
69
  else
56
- xml << render(partial: '/drilldown/excel_summary_row', locals: { result: result, parent_result: parent_result, headers: headers.dup, dimension: dimension })
70
+ xml << render(partial: '/drilldown/excel_summary_row',
71
+ locals: { result: result, parent_result: parent_result, headers: headers.dup,
72
+ dimension: dimension })
57
73
 
58
74
  xml << render(partial: '/drilldown/excel_record_list', locals: { result: result }) if @search.list
59
75
  end
60
76
 
61
- xml << render(partial: '/drilldown/excel_summary_total_row', locals: { result: result, headers: headers.dup, dimension: dimension }) if dimension < @dimensions.size
77
+ if dimension < @dimensions.size
78
+ xml << render(partial: '/drilldown/excel_summary_total_row', locals: {
79
+ result: result, headers: headers.dup, dimension: dimension
80
+ })
81
+ end
62
82
  xml
63
83
  end
84
+
85
+ private
86
+
87
+ def caption_txt
88
+ "#{controller.c_target_class} #{t(@search.select_value.downcase)}" +
89
+ (@dimensions && @dimensions.any? ? " by #{@dimensions.map { |d| d[:pretty_name] }.join(' and ')}" : '')
90
+ end
64
91
  end
65
92
  end
@@ -19,17 +19,9 @@ module SimpleDrilldown
19
19
  VOLUME_COMPENSATED = 'VOLUME_COMPENSATED'
20
20
  end
21
21
 
22
- attr_reader :dimensions
23
- attr_reader :display_type
24
- attr_reader :fields
25
- attr_reader :filter
26
- attr_accessor :list
27
- attr_accessor :percent
28
- attr_reader :list_change_times
29
- attr_reader :order_by_value
30
- attr_reader :select_value
31
- attr_reader :title
32
- attr_reader :default_fields
22
+ attr_reader :dimensions, :display_type, :fields, :filter, :list_change_times, :order_by_value,
23
+ :select_value, :title, :default_fields
24
+ attr_accessor :list, :percent
33
25
 
34
26
  def self.validators_on(_attribute)
35
27
  []
@@ -60,7 +52,7 @@ module SimpleDrilldown
60
52
  @dimensions = attributes && attributes[:dimensions] || []
61
53
  @dimensions.delete_if(&:empty?)
62
54
  @filter = attributes && attributes[:filter] ? attributes[:filter] : {}
63
- @filter.keys.dup.each { |k| @filter[k] = [*@filter[k]] }
55
+ @filter.keys.dup.each { |k| @filter[k] = Array(@filter[k]) }
64
56
  @filter.each do |_k, v|
65
57
  v.delete('')
66
58
  v.delete('Select Some Options')
@@ -1,3 +1,3 @@
1
1
  module SimpleDrilldown
2
- VERSION = '0.6.7'
2
+ VERSION = '0.6.8'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_drilldown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.7
4
+ version: 0.6.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uwe Kubosch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-13 00:00:00.000000000 Z
11
+ date: 2020-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chartkick
@@ -146,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
146
  requirements:
147
147
  - - ">="
148
148
  - !ruby/object:Gem::Version
149
- version: '0'
149
+ version: '2.5'
150
150
  required_rubygems_version: !ruby/object:Gem::Requirement
151
151
  requirements:
152
152
  - - ">="