simple_drilldown 0.5.0 → 0.6.5

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: 9994fb706e46554bec7e26a9191cdc10e2675a19770e4414019f5b4a067e7daf
4
- data.tar.gz: 874f30d58de361193d6faed89b2af82e8899b0c628861865b917af9466faa64d
3
+ metadata.gz: 213cbd7d6cd897ec7b381009bef56cf5fb663a8dcaeba2ef459b84635093e59b
4
+ data.tar.gz: ebc3d77828685b892254022b471ac76f80f840963ba7e78f9ddf4cb3161e746c
5
5
  SHA512:
6
- metadata.gz: 61559d0c5e2f91474c86bbb3424c55e41d4fb355921a06cd3b4627ea1ab72a789be74989e53135b7179ea3b59feec83d140ed4e681fb85f111f0f024017a169d
7
- data.tar.gz: 8bed5fd23fb6254bf5280ddce378738294af1bf5de119da11000695a3c594e48797b9f820987ef4296ed94ac6a680075f20924a6d6473702f7b05c7fe120af34
6
+ metadata.gz: f21841814f866ecdfe03b63d853dd79ff4b4f4fef5754a67ff78dbbeda1faab0c6ad9f1afe59b100087e4efbcf87de430c5fcf2a8cafbcf299401fef232d1d05
7
+ data.tar.gz: 6b227bf456e69d56902f03415c5c7cff137177f09512a8d268a97eabd2ed48d674bf5e5b25a14fed95c1c732c2b40cf178935c99c67df975e2868490373fc65f
@@ -20,7 +20,7 @@
20
20
  case @search.display_type
21
21
  when SimpleDrilldown::Search::DisplayType::PIE
22
22
  %>
23
- <%= pie_chart data, height: '24rem' %>
23
+ <%= pie_chart data, height: '24rem', events: ['click'] %>
24
24
  <% when SimpleDrilldown::Search::DisplayType::BAR %>
25
25
  <%= column_chart data, height: '24rem' %>
26
26
  <% when SimpleDrilldown::Search::DisplayType::LINE %>
@@ -40,7 +40,7 @@
40
40
  options += @remaining_dimensions.keys.map { |name| [controller.c_dimension_defs[name][:pretty_name], name] } %>
41
41
  <%= t(i == 0 ? :group_by : :then_by) %>:
42
42
  <%= form.select 'dimensions', options, { :selected => @search.dimensions && @search.dimensions[i] },
43
- { :onChange => 'form.submit()', :name => 'search[dimensions][]', :id => "search_dimensions_#{i}" } %>
43
+ { onChange: 'form.submit()', name: 'search[dimensions][]', id: "search_dimensions_#{i}" } %>
44
44
  <% end %>
45
45
 
46
46
  <br/>
@@ -60,3 +60,23 @@
60
60
  <%= form.check_box :list, { :onChange => 'form.submit()' } %>
61
61
  <%= form.label :list, t(:list) %>
62
62
  </div>
63
+
64
+ <% if @dimensions.size == 1 &&
65
+ [SimpleDrilldown::Search::DisplayType::BAR, SimpleDrilldown::Search::DisplayType::PIE].include?(@search.display_type) %>
66
+ <%= javascript_tag do %>
67
+ $('#chart-1').on('click', function(e){
68
+ chart = Chartkick.charts['chart-1'].getChartObject();
69
+ firstPoint = chart.getElementsAtEvent(e)[0]
70
+ if (firstPoint) {
71
+ label = chart.data.labels[firstPoint._index];
72
+ value = chart.data.datasets[firstPoint._datasetIndex].data[firstPoint._index];
73
+ console.log("Label: " + label + ", Value: " + value);
74
+ new_location = window.location.toString();
75
+ new_location = new_location.replace("&search[dimensions][]=<%= @dimensions[0][:url_param_name] %>", '');
76
+ new_location = new_location + '&search[filter][<%= @dimensions[0][:url_param_name] %>][]=' + label;
77
+ console.log(new_location);
78
+ window.location = new_location;
79
+ }
80
+ });
81
+ <% end %>
82
+ <% end %>
@@ -2,6 +2,6 @@
2
2
 
3
3
  xml << render(partial: '/drilldown/excel_row_header')
4
4
 
5
- result[:transactions].each do |t|
5
+ result[:records].each do |t|
6
6
  xml << render(partial: '/drilldown/excel_row', locals: { transaction: t, previous_transaction: nil, errors: [], error_row: false, meter1_errors: false })
7
7
  end
@@ -0,0 +1,2 @@
1
+ <%= link_to 'Excel', @search.url_options.merge(action: :excel_export) %>&nbsp;|
2
+ <%= 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'] %>
@@ -22,7 +22,7 @@
22
22
  </tr>
23
23
  <% else %>
24
24
  <div class="form-group">
25
- <%= form.label "filter[#{dimension_name}]", t(dimension_name) %>
25
+ <%= form.label "filter[#{dimension_name}]", t(dimension_name, default: :"activerecord.models.#{dimension_name}") %>
26
26
  <%= select :search, :filter,
27
27
  choices,
28
28
  { :selected => @search.filter[dimension_name] },
@@ -6,7 +6,7 @@
6
6
  </style>
7
7
 
8
8
  <% @transaction_fields.each do | field | %>
9
- <%=form.label "fields[#{field}]", t(field), :class => "field_label" %>
9
+ <%=form.label "fields[#{field}]", t(field, default: :"attributes.#{field}"), :class => "field_label" %>
10
10
  <%=form.check_box :fields, :id => "search_fields[#{field}]", :name => "search[fields][#{field}]", :checked => @search.fields.include?(field) %>
11
11
  <br/>
12
12
  <% end %>
@@ -3,9 +3,8 @@
3
3
  <%= form.text_field :title, class: 'form-control' %>
4
4
  </div>
5
5
 
6
- <% choices = Concurrent::Hash.new %>
7
6
  <% controller.c_dimension_defs.each do |dimension_name, dimension| %>
8
- <% choices[dimension_name] = [[t(:all), nil]] + (dimension[:legal_values] && dimension[:legal_values].call(@search).map { |o| o.is_a?(Array) ? [o[0].to_s, o[1].to_s] : o.to_s } || []) %>
9
- <%= render partial: 'drilldown/field', locals: { choices: choices[dimension_name] || [],
7
+ <% choices = [[t(:all), nil]] + (dimension[:legal_values] && dimension[:legal_values].call(@search).map { |o| o.is_a?(Array) ? [o[0].to_s, o[1].to_s] : o.to_s } || []) %>
8
+ <%= render partial: 'drilldown/field', locals: { choices: choices || [],
10
9
  form: form, dimension_name: dimension_name } %>
11
10
  <% end %>
@@ -1,9 +1,9 @@
1
- <% unless result[:transactions].empty? %>
1
+ <% unless result[:records].empty? %>
2
2
  <tr>
3
3
  <td colspan="<%= controller.c_summary_fields.size + 1 %>">
4
4
  <table class="table table-condensed table-bordered" style="padding-bottom: 10px;">
5
5
  <%= render :partial => '/drilldown/row_header' %>
6
- <% result[:transactions].each do |t| %>
6
+ <% result[:records].each do |t| %>
7
7
  <%= render :partial => '/drilldown/row', :locals => { :transaction => t, :previous_transaction => nil, :errors => [], :error_row => false, :meter1_errors => false } %>
8
8
  <% end %>
9
9
  </table>
@@ -1,7 +1,7 @@
1
1
  <thead>
2
2
  <tr>
3
3
  <% @search.fields.each do |field| %>
4
- <th><%=t field %></th>
4
+ <th><%=t field, default: :"attributes.#{field}" %></th>
5
5
  <% end %>
6
6
  <th></th>
7
7
  </tr>
@@ -12,7 +12,7 @@ xml.Workbook(
12
12
  ) do
13
13
  xml << render(partial: '/layouts/excel_styles')
14
14
 
15
- xml.Worksheet 'ss:Name' => 'Transactions' do
15
+ xml.Worksheet 'ss:Name' => 'Drilldown' do
16
16
  xml.Table do
17
17
  xml.Row 'ss:Height' => '18.75' do
18
18
  xml.Cell 'ss:MergeAcross' => '35', 'ss:StyleID' => 'MainTitle' do
@@ -42,7 +42,7 @@ xml.Workbook(
42
42
  end
43
43
  end
44
44
 
45
- @transactions.each do |transaction|
45
+ @records.each do |transaction|
46
46
  xml.Row do
47
47
  @transaction_fields.each do |field|
48
48
  field_map = controller.c_fields[field.to_sym]
@@ -13,25 +13,25 @@
13
13
  }
14
14
  </style>
15
15
 
16
- <%= form_for @search, :html => {:id => 'edit_search_SEARCH', :method => :get, :class => :search, :style => 'background: inherit', :onsubmit => 'return this.submit()'}, :url => {} do |form| %>
16
+ <%= form_for @search, html: { id: 'edit_search_SEARCH', method: :get, class: :search, style: 'background: inherit', onsubmit: 'return this.submit()' }, url: {} do |form| %>
17
17
  <div class="row">
18
18
  <div class="col-md-3" valign="top">
19
19
  <ul class="nav nav-tabs">
20
- <li class="active">
21
- <a href="#filter" data-toggle="tab"><em><%= t :filter %></em></a></li>
22
- <li><a href="#fields" data-toggle="tab"><em><%= t :fields %></em></a>
20
+ <li class="nav-item">
21
+ <a class="nav-link active" href="#filter" data-toggle="tab"><em><%= t :filter %></em></a></li>
22
+ <li><a class="nav-link" href="#fields" data-toggle="tab"><em><%= t :fields %></em></a>
23
23
  </li>
24
24
  </ul>
25
25
 
26
26
  <!-- Tab panes -->
27
27
  <div class="tab-content">
28
28
  <div class="tab-pane active" id="filter">
29
- <%= render :partial => '/drilldown/tab_buttons', :locals => {:form => form} %>
30
- <%= render :partial => '/drilldown/filter', :locals => {:form => form} %>
29
+ <%= render '/drilldown/tab_buttons', form: form %>
30
+ <%= render '/drilldown/filter', form: form %>
31
31
  </div>
32
32
  <div class="tab-pane" id="fields">
33
- <%= render :partial => '/drilldown/tab_buttons', :locals => {:form => form} %>
34
- <%= render :partial => '/drilldown/fields', :locals => {:form => form} %>
33
+ <%= render '/drilldown/tab_buttons', form: form %>
34
+ <%= render '/drilldown/fields', form: form %>
35
35
  </div>
36
36
  </div>
37
37
 
@@ -39,20 +39,16 @@
39
39
  <div class="col-md-9">
40
40
  <div class="row" valign="top">
41
41
  <div class="col-md-12">
42
- <%= render :partial => '/drilldown/chart', :locals => {:form => form} %>
43
- <br/>
42
+ <%= render '/drilldown/chart', form: form %>
44
43
  </div>
45
44
  </div>
46
45
 
47
46
  <div class="row">
48
47
  <div class="col-md-12" valign="top">
49
48
  <div style="float: right; clear: both;">
50
- <%= link_to 'Excel', @search.url_options.merge(action: :excel_export) %>&nbsp;|
51
- <%= 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'] %>
49
+ <%= render '/drilldown/export_links' %>
52
50
  </div>
53
- <br/>
54
-
55
- <%= render :partial => '/drilldown/summary_table' %>
51
+ <%= render '/drilldown/summary_table' %>
56
52
  </div>
57
53
  </div>
58
54
  </div>
@@ -6,3 +6,4 @@ Example:
6
6
 
7
7
  This will create:
8
8
  app/controllers/thing_drilldown_controller.rb
9
+ test/controllers/thing_drilldown_controller_test.rb
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'simple_drilldown/drilldown_controller'
3
+ require 'simple_drilldown/controller'
4
4
 
5
- class <%= class_name %>DrilldownController < SimpleDrilldown::DrilldownController
5
+ class <%= class_name %>DrilldownController < SimpleDrilldown::Controller
6
6
  # The main focus of the drilldown
7
7
  # target_class <%= class_name %>
8
8
 
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'simple_drilldown/drilldown_helper'
3
+ require 'simple_drilldown/helper'
4
4
  require 'simple_drilldown/search'
5
5
 
6
6
  module SimpleDrilldown
7
- class DrilldownController < ::ApplicationController
8
- helper DrilldownHelper
7
+ class Controller < ::ApplicationController
8
+ helper Helper
9
9
 
10
10
  LIST_LIMIT = 10_000
11
11
 
@@ -14,8 +14,8 @@ module SimpleDrilldown
14
14
  class_attribute :c_base_includes, default: []
15
15
  class_attribute :c_default_fields, default: []
16
16
  class_attribute :c_default_select_value, default: SimpleDrilldown::Search::SelectValue::COUNT
17
- class_attribute :c_dimension_defs, default: Concurrent::Hash.new
18
- class_attribute :c_fields, default: {}
17
+ class_attribute :c_dimension_defs
18
+ class_attribute :c_fields
19
19
  class_attribute :c_list_includes, default: []
20
20
  class_attribute :c_list_order
21
21
  class_attribute :c_select, default: 'count(*) as count'
@@ -25,7 +25,16 @@ module SimpleDrilldown
25
25
  class << self
26
26
  def inherited(base)
27
27
  super
28
- base.c_target_class = base.name.chomp('DrilldownController').constantize
28
+ base.c_dimension_defs = Concurrent::Hash.new
29
+ base.c_fields = {}
30
+ begin
31
+ base.c_target_class = base.name.chomp('DrilldownController').constantize
32
+ rescue NameError
33
+ begin
34
+ base.c_target_class = base.name.chomp('Controller').constantize
35
+ rescue NameError
36
+ end
37
+ end
29
38
  end
30
39
 
31
40
  def base_condition(base_condition)
@@ -41,7 +50,11 @@ module SimpleDrilldown
41
50
  end
42
51
 
43
52
  def default_fields(default_fields)
44
- self.c_default_fields = default_fields
53
+ self.c_default_fields = default_fields.flatten
54
+ end
55
+
56
+ def default_select_value(default_select_value)
57
+ self.c_default_select_value = default_select_value
45
58
  end
46
59
 
47
60
  def target_class(target_class)
@@ -53,7 +66,7 @@ module SimpleDrilldown
53
66
  end
54
67
 
55
68
  def list_includes(list_includes)
56
- self.c_list_includes = list_includes
69
+ self.c_list_includes = list_includes.flatten
57
70
  end
58
71
 
59
72
  def list_order(list_order)
@@ -65,7 +78,7 @@ module SimpleDrilldown
65
78
  end
66
79
 
67
80
  def summary_fields(*summary_fields)
68
- self.c_summary_fields = summary_fields
81
+ self.c_summary_fields = summary_fields.flatten
69
82
  end
70
83
 
71
84
  def dimension(name, select_expression = name, options = {})
@@ -92,17 +105,24 @@ module SimpleDrilldown
92
105
  end
93
106
 
94
107
  c_dimension_defs[name.to_s] = {
95
- includes: queries.inject([]) do |a, e|
108
+ includes: queries.inject(nil) do |a, e|
96
109
  i = e[:includes]
97
110
  next a unless i
98
- next a if a.include?(i)
111
+ next a if a&.include?(i)
99
112
 
100
- a + [i]
113
+ case a
114
+ when nil
115
+ i
116
+ when Symbol
117
+ [a, *i]
118
+ else
119
+ a.concat(*i)
120
+ end
101
121
  end,
102
122
  interval: interval,
103
123
  label_method: label_method,
104
124
  legal_values: legal_values,
105
- pretty_name: I18n.t(name),
125
+ pretty_name: I18n.t(name, default: :"activerecord.models.#{name}"),
106
126
  queries: queries,
107
127
  reverse: reverse,
108
128
  select_expression: queries.size > 1 ? "COALESCE(#{queries.map { |q| q[:select] }.join(',')})" : queries[0][:select],
@@ -217,9 +237,9 @@ module SimpleDrilldown
217
237
  when Hash
218
238
  sql = +''
219
239
  include.each do |parent, child|
220
- sql << make_join(joins, model, parent) + ' '
240
+ sql << ' ' + make_join(joins, model, parent)
221
241
  ass = model.to_s.camelize.constantize.reflect_on_association parent
222
- sql << make_join(joins, parent, child, ass.class_name.constantize)
242
+ sql << ' ' + make_join(joins, parent, child, ass.class_name.constantize)
223
243
  end
224
244
  sql
225
245
  when Symbol
@@ -369,26 +389,26 @@ module SimpleDrilldown
369
389
  def excel_export
370
390
  index(false)
371
391
  headers['Content-Type'] = 'application/vnd.ms-excel'
372
- headers['Content-Disposition'] = 'attachment; filename="transactions.xml"'
392
+ headers['Content-Disposition'] = 'attachment; filename="drilldown.xml"'
373
393
  headers['Cache-Control'] = ''
374
394
  render template: '/drilldown/excel_export', layout: false
375
395
  end
376
396
 
377
- def excel_export_transactions
397
+ def excel_export_records
378
398
  params[:search][:list] = '1'
379
399
  index(false)
380
- @transactions = get_transactions(@result)
400
+ @records = get_records(@result)
381
401
  headers['Content-Type'] = 'application/vnd.ms-excel'
382
- headers['Content-Disposition'] = 'attachment; filename="transactions.xml"'
383
- render template: '/drilldown/excel_export_transactions', layout: false
402
+ headers['Content-Disposition'] = 'attachment; filename="drilldown.xml"'
403
+ render template: '/drilldown/excel_export_records', layout: false
384
404
  end
385
405
 
386
406
  def xml_export
387
407
  params[:search][:list] = '1'
388
408
  index(false)
389
- @transactions = get_transactions(@result)
409
+ @records = get_records(@result)
390
410
  headers['Content-Type'] = 'text/xml'
391
- headers['Content-Disposition'] = 'attachment; filename="transactions.xml"'
411
+ headers['Content-Disposition'] = 'attachment; filename="drilldown.xml"'
392
412
  render template: '/drilldown/xml_export', layout: false
393
413
  end
394
414
 
@@ -498,31 +518,69 @@ module SimpleDrilldown
498
518
 
499
519
  def populate_list(conditions, includes, result, values)
500
520
  if result[:rows]
501
- result[:rows].each do |r|
502
- populate_list(conditions, includes, r, values + [r[:value]])
521
+ return result[:rows].each { |r| populate_list(conditions, includes, r, values + [r[:value]]) }
522
+ end
523
+ list_includes = merge_includes(includes, c_list_includes)
524
+ @search.fields.each do |field|
525
+ field_def = c_fields[field.to_sym]
526
+ raise "Field definition missing for: #{field.inspect}" unless field_def
527
+
528
+ field_includes = field_def[:include]
529
+ if field_includes
530
+ list_includes = merge_includes(list_includes , field_includes)
503
531
  end
504
- else
505
- list_includes = includes + c_list_includes
506
- @search.fields.each do |field|
507
- field_def = c_fields[field.to_sym]
508
- raise "Field definition missing for: #{field.inspect}" unless field_def
509
-
510
- field_includes = field_def[:include]
511
- if field_includes
512
- list_includes += field_includes.is_a?(Array) ? field_includes : [field_includes]
532
+ end
533
+ if @search.list_change_times
534
+ @history_fields.each do |f|
535
+ if @search.fields.include? f
536
+ list_includes = merge_includes(list_includes, assignment: { order: :"#{f}_changes" } )
513
537
  end
514
538
  end
515
- list_includes.uniq!
516
- if @search.list_change_times
517
- @history_fields.each do |f|
518
- list_includes << { assignment: { order: :"#{f}_changes" } } if @search.fields.include? f
519
- end
539
+ end
540
+ joins = self.class.make_join([], c_target_class.name.underscore.to_sym, list_includes)
541
+ list_conditions = list_conditions(conditions, values)
542
+ base_query = c_target_class.unscoped.where(c_base_condition).joins(joins).order(c_list_order)
543
+ base_query = base_query.where(list_conditions) if list_conditions
544
+ result[:records] = base_query.to_a
545
+ end
546
+
547
+ def merge_includes(*args)
548
+ hash = hash_includes(*args)
549
+ result = hash.dup.map { |k, v|
550
+ if v.blank?
551
+ hash.delete(k)
552
+ k
553
+ end
554
+ }.compact
555
+ result << hash unless hash.blank?
556
+ case result.size
557
+ when 0
558
+ nil
559
+ when 1
560
+ result[0]
561
+ else
562
+ result
563
+ end
564
+ end
565
+
566
+ def hash_includes(*args)
567
+ args.inject({}) do |h, inc|
568
+ case inc
569
+ when Array
570
+ inc.each { |v|
571
+ h = hash_includes(h, v)
572
+ }
573
+ when Hash
574
+ inc.each { |k, v|
575
+ h[k] = merge_includes(h[k], v)
576
+ }
577
+ when NilClass, FalseClass
578
+ when String, Symbol
579
+ h[inc] ||= []
580
+ else
581
+ raise "Unknown include type: #{inc.inspect}"
520
582
  end
521
- joins = self.class.make_join([], c_target_class.name.underscore.to_sym, list_includes)
522
- list_conditions = list_conditions(conditions, values)
523
- base_query = c_target_class.unscoped.where(c_base_condition).joins(joins).order(@list_order)
524
- base_query = base_query.where(list_conditions) if list_conditions
525
- result[:transactions] = base_query.to_a
583
+ h
526
584
  end
527
585
  end
528
586
 
@@ -536,10 +594,10 @@ module SimpleDrilldown
536
594
  [list_conditions_string, *(conditions[1..-1] + values)]
537
595
  end
538
596
 
539
- def get_transactions(tree)
540
- return tree[:transactions] if tree[:transactions]
597
+ def get_records(tree)
598
+ return tree[:records] if tree[:records]
541
599
 
542
- tree[:rows].map { |r| get_transactions(r) }.flatten
600
+ tree[:rows].map { |r| get_records(r) }.flatten
543
601
  end
544
602
 
545
603
  class ScopeHolder
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'chartkick'
4
+ require 'simple_drilldown/routing'
4
5
 
5
6
  module SimpleDrilldown
6
7
  class Engine < ::Rails::Engine
@@ -10,5 +11,7 @@ module SimpleDrilldown
10
11
  initializer 'simple_drilldown.assets.precompile' do |app|
11
12
  app.config.assets.precompile += %w[chartkick.js]
12
13
  end
14
+
15
+ ActionDispatch::Routing::Mapper.include SimpleDrilldown::Routing
13
16
  end
14
17
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module SimpleDrilldown
4
4
  # View helper for SimpleDrilldown
5
- module DrilldownHelper
5
+ module Helper
6
6
  def value_label(dimension_index, value)
7
7
  dimension = @dimensions[dimension_index]
8
8
  return nil if dimension.nil?
@@ -11,7 +11,7 @@ module SimpleDrilldown
11
11
  end
12
12
 
13
13
  def caption
14
- result = @search.title || "#{@target_class} #{t(@search.select_value.downcase)}" +
14
+ result = @search.title || "#{controller.c_target_class} #{t(@search.select_value.downcase)}" +
15
15
  (@dimensions && @dimensions.any? ? ' by ' + @dimensions.map { |d| d[:pretty_name] }.join(' and ') : '')
16
16
  result.gsub('$date', [*@search.filter[:calendar_date]].uniq.join(' - '))
17
17
  end
@@ -6,7 +6,7 @@ module SimpleDrilldown
6
6
  def draw_drilldown(path, controller = path)
7
7
  get "#{path}(.:format)" => "#{controller}#index", as: path
8
8
  scope path do
9
- %i[excel_export html_export index].each do |action|
9
+ %i[choices excel_export html_export index].each do |action|
10
10
  get "#{action}(/:id)(.:format)", controller: controller, action: action
11
11
  end
12
12
  end
@@ -108,6 +108,10 @@ module SimpleDrilldown
108
108
  'SEARCH'
109
109
  end
110
110
 
111
+ def list?
112
+ list
113
+ end
114
+
111
115
  def drill_down(dimensions, *values)
112
116
  raise 'Too many values' if values.size > self.dimensions.size
113
117
 
@@ -1,3 +1,3 @@
1
1
  module SimpleDrilldown
2
- VERSION = '0.5.0'
2
+ VERSION = '0.6.5'
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.5.0
4
+ version: 0.6.5
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-08-12 00:00:00.000000000 Z
11
+ date: 2020-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chartkick
@@ -97,6 +97,7 @@ files:
97
97
  - app/views/drilldown/_excel_styles.builder
98
98
  - app/views/drilldown/_excel_summary_row.builder
99
99
  - app/views/drilldown/_excel_summary_total_row.builder
100
+ - app/views/drilldown/_export_links.html.erb
100
101
  - app/views/drilldown/_field.html.erb
101
102
  - app/views/drilldown/_fields.html.erb
102
103
  - app/views/drilldown/_filter.html.erb
@@ -125,9 +126,9 @@ files:
125
126
  - lib/generators/drilldown_controller/templates/drilldown_controller.rb.erb
126
127
  - lib/generators/drilldown_controller/templates/drilldown_controller_test.rb.erb
127
128
  - lib/simple_drilldown.rb
128
- - lib/simple_drilldown/drilldown_controller.rb
129
- - lib/simple_drilldown/drilldown_helper.rb
129
+ - lib/simple_drilldown/controller.rb
130
130
  - lib/simple_drilldown/engine.rb
131
+ - lib/simple_drilldown/helper.rb
131
132
  - lib/simple_drilldown/routing.rb
132
133
  - lib/simple_drilldown/search.rb
133
134
  - lib/simple_drilldown/version.rb