simple_drilldown 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a36aab8c580f75685e00d36a6aea2bbb1b58b43c153db650ec9298cf0b5fff6
4
- data.tar.gz: 6c1a7cda78d09fdff2519c1db52dd4c5aa7f2c7c273bc7b9f6bc730cf02b6d80
3
+ metadata.gz: 9461d24d039b785b19ff315ed50092a75d702b8f26ad9cc17fee8f6b4d36842e
4
+ data.tar.gz: 946fa95bc5c68cac8b15e7c192aaa5a26691af08132ecef438c4007aadb623d4
5
5
  SHA512:
6
- metadata.gz: 587b979884e3cdb8a85fee6438358bf5ba3878ff55b1355b52e987b1b896d686558fbcde181d9c1bc1a62b0ec7a6fbe591fb36c621d59d5688e0655c31170dff
7
- data.tar.gz: a4e90f4858363cea570a5544efb0ed45bb4ae541a4a2238511bf726755f6ced093e5f9dde0574f21f6e1b7621b9564788c9795f2ebd1e8c721014472b2f50d44
6
+ metadata.gz: 7321e640c76e29963928a75b00d9f6012ca2d8841a89483eb971963f3bb10974fc694cc33f96f123fa8f910fba7de633b3a7957cf65d38640326ccee348770fa
7
+ data.tar.gz: 6fd3498daaac467c329beed9a93cbea3502986e499c90d85dadc125124f834030916a2b69eccca7b8b280a263f8ed846b139c9c06603aa238a90c604a645aee2
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ def excel_header_row(sheet)
4
+ padding_cells = @dimensions.empty? ? 1 : @dimensions.size
5
+ row = (1...(padding_cells - 1)).map { |_n| nil }
6
+ @search.fields.each_with_index { |field, _i| row << t(field) }
7
+ sheet.add_row row
8
+ end
9
+
10
+ def excel_row(sheet, transaction:)
11
+ padding_cells = @dimensions.empty? ? 1 : @dimensions.size
12
+ row = (1..(padding_cells - 1)).map { |_n| nil }
13
+
14
+ @search.fields.each_with_index do |field, _i|
15
+ value = if field == 'time'
16
+ ((
17
+ if transaction.respond_to?(:completed_at)
18
+ transaction.completed_at
19
+ else
20
+ transaction.created_at
21
+ end)).localtime.strftime('%Y-%m-%d %H:%M')
22
+ elsif controller.c_fields[field.to_sym][:attr_method]
23
+ controller.c_fields[field.to_sym][:attr_method].call(transaction)
24
+ else
25
+ transaction.send(field)
26
+ end
27
+
28
+ # field_def = controller.c_fields[field.to_sym]
29
+
30
+ row << value
31
+ end
32
+ sheet.add_row row
33
+ end
34
+
35
+ sheet.add_row []
36
+ excel_header_row(sheet)
37
+ result[:records].each { |t| excel_row(sheet, transaction: t) }
38
+ sheet.add_row []
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ row = [
4
+ *(1..(dimension - headers.size - 1)).map { |_n| '' },
5
+ *headers.map.with_index { |h, i| value_label(@dimensions.size - headers.size + i - 1, h[:value]) },
6
+ *(value_label(dimension - 1, result[:value]) if dimension.positive?),
7
+ *((result[:count].to_f / parent_result[:count]).inspect if parent_result && @search.percent),
8
+ result[:count].inspect,
9
+ *(if parent_result && @search.percent
10
+ (
11
+ if parent_result[controller.c_summary_fields[0]].positive?
12
+ result[controller.c_summary_fields[0]].to_f / parent_result[controller.c_summary_fields[0]]
13
+ else
14
+ 0
15
+ end).inspect
16
+ end),
17
+ result[controller.c_summary_fields[0]].inspect
18
+ ]
19
+ if controller.c_summary_fields.size > 1
20
+ if parent_result && @search.percent
21
+ percent =
22
+ if parent_result[controller.c_summary_fields[1]].positive?
23
+ result[controller.c_summary_fields[1]].to_f / parent_result[controller.c_summary_fields[1]]
24
+ else
25
+ 0
26
+ end
27
+ row << percent.inspect
28
+ end
29
+ row << result[controller.c_summary_fields[1]].inspect
30
+ end
31
+ sheet.add_row row
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ row = (1..dimension).map { |_n| nil }
4
+
5
+ (@dimensions.size - dimension).times { |_i| row << nil }
6
+ row << result[:count]
7
+ sheet.add_row row
@@ -1,2 +1,3 @@
1
1
  <%= link_to 'Excel', @search.url_options.merge(action: :excel_export) %>&nbsp;|
2
+ <%= link_to 'Excel (XML)', @search.url_options.merge(action: :excel_export, format: :xml) %>&nbsp;|
2
3
  <%= link_to 'HTML', @search.url_options.merge(action: :html_export), data_popup: ['Elections', 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes, width=1024px'] %>
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ def excel_summary_row_xlsx(sheet, result, parent_result = nil, dimension = 0, headers = [])
4
+ if result[:rows]
5
+ significant_rows = result[:rows].reject { |r| r[:row_count].zero? }
6
+ significant_rows.each_with_index do |r, i|
7
+ sub_headers =
8
+ if i.zero?
9
+ if dimension.zero?
10
+ headers
11
+ else
12
+ headers + [{
13
+ value: result[:value],
14
+ display_row_count: result[:nodes] + result[:row_count] * (@search.list ? 1 : 0)
15
+ }]
16
+ end
17
+ else
18
+ [] # [{:value => result[:value], :row_count => result[:row_count]}]
19
+ end
20
+ excel_summary_row_xlsx(sheet, r, result, dimension + 1, sub_headers)
21
+ end
22
+ else
23
+ render(partial: '/drilldown/excel_summary_row_xlsx',
24
+ locals: { sheet: sheet, result: result, parent_result: parent_result, headers: headers.dup,
25
+ dimension: dimension })
26
+
27
+ if @search.list
28
+ render(partial: '/drilldown/excel_record_list_xlsx',
29
+ locals: { sheet: sheet, result: result })
30
+ end
31
+ end
32
+
33
+ return if dimension >= @dimensions.size
34
+
35
+ render(partial: '/drilldown/excel_summary_total_row_xlsx', locals: {
36
+ sheet: sheet, result: result, headers: headers.dup, dimension: dimension
37
+ })
38
+ end
39
+
40
+ wb = xlsx_package.workbook
41
+ wb.add_worksheet(name: 'Transaction Summary') do |sheet|
42
+ # header_colspan =
43
+ # if @search.list
44
+ # [@dimensions.size - 1, 0].max + @search.fields.size - 1
45
+ # else
46
+ # @dimensions.size - 1 + (controller.c_summary_fields.size + 1) * (@search.percent ? 2 : 1)
47
+ # end
48
+
49
+ # xml.Row 'ss:Height' => '18.75' do
50
+ # xml.Cell 'ss:MergeAcross' => header_colspan, 'ss:StyleID' => 'MainTitle' do
51
+ # xml.Data caption, 'ss:Type' => 'String'
52
+ # end
53
+ # end
54
+ sheet.add_row [caption]
55
+
56
+ # xml.Row 'ss:Height' => '15.75' do
57
+ # xml.Cell 'ss:MergeAcross' => header_colspan, 'ss:StyleID' => 'SubTitle' do
58
+ # xml.Data subcaption, 'ss:Type' => 'String'
59
+ # end
60
+ # end
61
+ sheet.add_row [subcaption]
62
+
63
+ # xml.Row do
64
+ # @dimensions.each do |d|
65
+ # xml.Cell 'ss:StyleID' => 'DimensionHeading' do
66
+ # xml.Data (h d[:pretty_name]).to_s, 'ss:Type' => 'String'
67
+ # end
68
+ # end
69
+ # xml.Cell 'ss:StyleID' => 'Heading', 'ss:MergeAcross' => @search.percent ? 1 : 0 do
70
+ # xml.Data t(controller.c_target_class.table_name), 'ss:Type' => 'String'
71
+ # end
72
+ # controller.c_summary_fields.each do |f|
73
+ # xml.Cell 'ss:StyleID' => 'Heading', 'ss:MergeAcross' => @search.percent ? 1 : 0 do
74
+ # xml.Data f, 'ss:Type' => 'String'
75
+ # end
76
+ # end
77
+ # end
78
+ sheet.add_row [
79
+ *@dimensions.map { |d| (h d[:pretty_name]).to_s },
80
+ t(controller.c_target_class.table_name),
81
+ *controller.c_summary_fields.map { |f| f }
82
+ ]
83
+
84
+ excel_summary_row_xlsx(sheet, @result)
85
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'caxlsx_rails'
3
4
  require 'simple_drilldown/engine'
4
5
 
5
6
  module SimpleDrilldown
@@ -395,12 +395,19 @@ module SimpleDrilldown
395
395
 
396
396
  def excel_export
397
397
  index(false)
398
- set_excel_headers
399
- if params.dig(:search, :list) == '1'
400
- @records = get_records(@result)
401
- render template: '/drilldown/excel_export_records', layout: false
402
- else
403
- render template: '/drilldown/excel_export', layout: false
398
+ respond_to do |format|
399
+ format.xlsx do
400
+ render xlsx: c_target_class.table_name, template: 'drilldown/excel_export_xlsx'
401
+ end
402
+ format.xml do
403
+ set_excel_headers
404
+ if params.dig(:search, :list) == '1'
405
+ @records = get_records(@result)
406
+ render template: 'drilldown/excel_export_records', layout: false
407
+ else
408
+ render template: 'drilldown/excel_export', layout: false
409
+ end
410
+ end
404
411
  end
405
412
  end
406
413
 
@@ -8,7 +8,9 @@ module SimpleDrilldown
8
8
  controller ||= path
9
9
  get "#{path}(.:format)" => "#{controller}#index", as: path
10
10
  scope path, controller: controller, as: path do
11
- %i[excel_export excel_export_records html_export].each { |action| get action }
11
+ { excel_export: :xlsx, excel_export_records: :xlsx, html_export: :html }.each do |action, format|
12
+ get action, defaults: { format: format }
13
+ end
12
14
  get 'choices/:dimension_name', action: :choices, as: :choices
13
15
  end
14
16
  end
@@ -81,15 +81,15 @@ module SimpleDrilldown
81
81
 
82
82
  def url_options
83
83
  o = {
84
- search: {
85
- title: title,
86
- list: list ? '1' : '0',
87
- percent: percent ? '1' : '0',
88
- list_change_times: list_change_times ? '1' : '0',
89
- filter: filter,
90
- dimensions: dimensions,
91
- display_type: display_type,
92
- },
84
+ search: {
85
+ title: title,
86
+ list: list ? '1' : '0',
87
+ percent: percent ? '1' : '0',
88
+ list_change_times: list_change_times ? '1' : '0',
89
+ filter: filter,
90
+ dimensions: dimensions,
91
+ display_type: display_type,
92
+ },
93
93
  }
94
94
  o[:search][:fields] = fields unless fields == @default_fields
95
95
  o
@@ -1,3 +1,3 @@
1
1
  module SimpleDrilldown
2
- VERSION = '0.7.4'
2
+ VERSION = '0.8.0'
3
3
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_drilldown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.4
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uwe Kubosch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-02 00:00:00.000000000 Z
11
+ date: 2021-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: caxlsx_rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.6'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: chartkick
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -91,12 +105,13 @@ files:
91
105
  - app/mailers/simple_drilldown/application_mailer.rb
92
106
  - app/models/simple_drilldown/application_record.rb
93
107
  - app/views/drilldown/_chart.html.erb
94
- - app/views/drilldown/_excel_record_list.builder
95
- - app/views/drilldown/_excel_row.builder
108
+ - app/views/drilldown/_excel_record_list_xlsx.xlsx.axlsx
96
109
  - app/views/drilldown/_excel_row_header.builder
97
110
  - app/views/drilldown/_excel_styles.builder
98
111
  - app/views/drilldown/_excel_summary_row.builder
112
+ - app/views/drilldown/_excel_summary_row_xlsx.xlsx.axlsx
99
113
  - app/views/drilldown/_excel_summary_total_row.builder
114
+ - app/views/drilldown/_excel_summary_total_row_xlsx.xlsx.axlsx
100
115
  - app/views/drilldown/_export_links.html.erb
101
116
  - app/views/drilldown/_field.html.erb
102
117
  - app/views/drilldown/_fields.html.erb
@@ -114,6 +129,7 @@ files:
114
129
  - app/views/drilldown/data_3.builder
115
130
  - app/views/drilldown/excel_export.builder
116
131
  - app/views/drilldown/excel_export_records.builder
132
+ - app/views/drilldown/excel_export_xlsx.xlsx.axlsx
117
133
  - app/views/drilldown/html_export.html.erb
118
134
  - app/views/drilldown/index.html.erb
119
135
  - app/views/drilldown/print.html.erb
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- xml << render(partial: '/drilldown/excel_row_header')
4
-
5
- result[:records].each do |t|
6
- xml << render(
7
- partial: '/drilldown/excel_row',
8
- locals: { transaction: t, previous_transaction: nil, errors: [], error_row: false, meter1_errors: false }
9
- )
10
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- xml.Row do
4
- padding_cells = @dimensions.empty? ? 1 : @dimensions.size
5
- 1.upto(padding_cells - 1) { |_n| xml.Cell('ss:StyleID' => 'Outer') }
6
-
7
- @search.fields.each_with_index do |field, i|
8
- if field == 'time'
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')
15
- else
16
- value = if @transaction_fields_map[field.to_sym][:attr_method]
17
- @transaction_fields_map[field.to_sym][:attr_method].call(transaction)
18
- else
19
- transaction.send(field)
20
- end
21
- end
22
-
23
- field_def = @transaction_fields_map[field.to_sym]
24
-
25
- xml.Cell('ss:Index' => (padding_cells + i).to_s) do
26
- xml.Data value, 'ss:Type' => 'String'
27
- end
28
- end
29
- end