simple_drilldown 0.6.7 → 0.6.8
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 +4 -4
- data/app/views/drilldown/_excel_record_list.builder +4 -1
- data/app/views/drilldown/_excel_row.builder +6 -1
- data/app/views/drilldown/_excel_summary_row.builder +5 -1
- data/app/views/drilldown/data_1.builder +6 -2
- data/app/views/drilldown/data_2.builder +21 -9
- data/app/views/drilldown/data_3.builder +34 -11
- data/app/views/drilldown/excel_export.builder +4 -2
- data/lib/simple_drilldown/controller.rb +33 -34
- data/lib/simple_drilldown/helper.rb +44 -17
- data/lib/simple_drilldown/search.rb +4 -12
- data/lib/simple_drilldown/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42c85e43c9d07d94ed0d7c502afa8b4ee638f86ca41bf6b742f7f34cfd47a355
|
4
|
+
data.tar.gz: 506ac06824fd78a878302544967b7f997bfae64c6e4e26da9b5955603595ffc2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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(
|
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 = (
|
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',
|
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
|
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]
|
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
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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:
|
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
|
-
|
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(
|
21
|
-
|
22
|
-
|
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,
|
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,
|
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
|
-
|
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:
|
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 =
|
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 <<
|
243
|
+
sql << " #{make_join(joins, model, parent)}"
|
241
244
|
ass = model.to_s.camelize.constantize.reflect_on_association parent
|
242
|
-
sql <<
|
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
|
-
|
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
|
-
|
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
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
headers['Content-
|
411
|
-
headers['
|
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
|
-
|
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,
|
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
|
-
|
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
|
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
|
-
|
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
|
568
|
+
inc.each do |v|
|
571
569
|
h = hash_includes(h, v)
|
572
|
-
|
570
|
+
end
|
573
571
|
when Hash
|
574
|
-
inc.each
|
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 ||
|
15
|
-
|
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: {
|
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 + [{
|
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
|
-
|
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 =
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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',
|
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
|
-
|
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
|
-
|
24
|
-
|
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] =
|
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')
|
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.
|
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-
|
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: '
|
149
|
+
version: '2.5'
|
150
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
151
|
requirements:
|
152
152
|
- - ">="
|