simple_drilldown 0.7.4 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/views/drilldown/_excel_record_list_xlsx.xlsx.axlsx +38 -0
- data/app/views/drilldown/_excel_summary_row_xlsx.xlsx.axlsx +31 -0
- data/app/views/drilldown/_excel_summary_total_row_xlsx.xlsx.axlsx +7 -0
- data/app/views/drilldown/_export_links.html.erb +1 -0
- data/app/views/drilldown/excel_export_xlsx.xlsx.axlsx +85 -0
- data/lib/simple_drilldown.rb +1 -0
- data/lib/simple_drilldown/controller.rb +13 -6
- data/lib/simple_drilldown/routing.rb +3 -1
- data/lib/simple_drilldown/search.rb +9 -9
- data/lib/simple_drilldown/version.rb +1 -1
- metadata +20 -4
- data/app/views/drilldown/_excel_record_list.builder +0 -10
- data/app/views/drilldown/_excel_row.builder +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9461d24d039b785b19ff315ed50092a75d702b8f26ad9cc17fee8f6b4d36842e
|
4
|
+
data.tar.gz: 946fa95bc5c68cac8b15e7c192aaa5a26691af08132ecef438c4007aadb623d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
@@ -1,2 +1,3 @@
|
|
1
1
|
<%= link_to 'Excel', @search.url_options.merge(action: :excel_export) %> |
|
2
|
+
<%= link_to 'Excel (XML)', @search.url_options.merge(action: :excel_export, format: :xml) %> |
|
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
|
data/lib/simple_drilldown.rb
CHANGED
@@ -395,12 +395,19 @@ module SimpleDrilldown
|
|
395
395
|
|
396
396
|
def excel_export
|
397
397
|
index(false)
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
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
|
-
|
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
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
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.
|
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-
|
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/
|
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
|