effective_datatables 2.5.2 → 2.6.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
  SHA1:
3
- metadata.gz: 55a0122f14dc9a689508875d0f878461ffef5772
4
- data.tar.gz: 2b6861ee3bf35e581875e3e9949f8ddd5100e20a
3
+ metadata.gz: 3c540b23d9f98ea45c144088577103ea0c495ea7
4
+ data.tar.gz: a61e210447bb08fe4c40282a283c4c9881e8b5f9
5
5
  SHA512:
6
- metadata.gz: d289a862ca4d537477dfed7df7660235a296f3df3720b7045d7ec000250a95fac7a346588601382f6a4358e3776e6f3b9cf0d6caa80bbb02ff0f17bd28c274b1
7
- data.tar.gz: f5cbe997187012f9f369c1cba6c8e9b3f3dd07ab3680fa09034f4fda68cabdb9240546818a84bc3609f941ac7092d5a5934a0bedcafdc99de379074003a07027
6
+ metadata.gz: a179b5653c8b9f07dd3b08fb2631da06e6d6d249241e17826b700e9b1ffca7efc5cf9b36f80dea09de4651934e69220f51404743ac05c228fb7077a994d43b4d
7
+ data.tar.gz: 225185be2373c71dd8142791a7ccf059f4e2cf1f508d3edbdb1e57143832a286b9a28f7e410143990a5446523608d1eeb4459bb7f2bc19e0ef883c6227fb86c9
data/README.md CHANGED
@@ -544,9 +544,13 @@ When declaring a scope, a form field will automatically be placed above the data
544
544
  The value of the scope, its default value, will be available for use anywehre in your datatable via the `attributes` hash.
545
545
 
546
546
  ```ruby
547
- scope :start_date, Time.zone.now-3.months, filter: { input_html: { class: 'datepicker' } }
547
+ scopes do
548
+ scope :start_date, Time.zone.now-3.months, filter: { input_html: { class: 'datepicker' } }
549
+ end
548
550
  ```
549
551
 
552
+ (scopes is declared outside of the `datatable do ... end` block)
553
+
550
554
  and then in your collection, or any `table_column` block:
551
555
 
552
556
  ```ruby
@@ -18,6 +18,7 @@
18
18
  //= require effective_datatables/bulk_actions
19
19
  //= require effective_datatables/responsive
20
20
  //= require effective_datatables/scopes
21
+ //= require effective_datatables/charts
21
22
  //= require effective_datatables/initialize
22
23
 
23
24
  $.extend( $.fn.dataTable.defaults, {
@@ -0,0 +1,13 @@
1
+ initializeCharts = ->
2
+ $('.effective-datatables-chart').each ->
3
+ $chart = $(this)
4
+
5
+ data = $chart.data('data') || []
6
+ type = $chart.data('type') || 'BarChart'
7
+ options = $chart.data('options') || {}
8
+
9
+ chart = new google.visualization[type](document.getElementById($chart.attr('id')))
10
+ chart.draw(google.visualization.arrayToDataTable(data), options)
11
+
12
+ $ -> initializeCharts()
13
+ $(document).on 'page:change', -> initializeCharts()
@@ -69,15 +69,18 @@ initializeDataTables = ->
69
69
  pagingType: 'simple_numbers'
70
70
  initComplete: (settings) ->
71
71
  initializeBulkActions(this.api())
72
- initializeScopes(this.api())
73
72
  initializeFilters(this.api())
74
73
  drawCallback: (settings) ->
75
74
  $table = $(this.api().table().node())
76
75
  selected = $table.data('bulk-actions-restore-selected-values')
77
76
  completeBulkAction($table, selected) if selected && selected.length > 0
78
77
 
79
- if settings['json'] && settings['json']['aggregates']
80
- drawAggregates($table, settings['json']['aggregates'])
78
+ if settings['json']
79
+ if settings['json']['aggregates']
80
+ drawAggregates($table, settings['json']['aggregates'])
81
+
82
+ if settings['json']['charts']
83
+ drawCharts($table, settings['json']['charts'])
81
84
 
82
85
  # Copies the bulk actions html, stored in a data attribute on the table, into the buttons area
83
86
  initializeBulkActions = (api) ->
@@ -107,12 +110,11 @@ initializeDataTables = ->
107
110
  if $row
108
111
  $.each values, (col, value) => $row.children().eq(col).html(value)
109
112
 
110
- # Appends the scope html
111
- initializeScopes = (api) ->
112
- $table = $(api.table().node())
113
- scopes = $table.data('scopes')
114
-
115
- $table.closest('.dataTables_wrapper').prepend(scopes['scopeHtml']) if scopes
113
+ drawCharts = ($table, charts) ->
114
+ $.each charts, (name, data) =>
115
+ $(".effective-datatables-chart[data-name='#{name}']").each (_, obj) =>
116
+ chart = new google.visualization[data['type']](obj)
117
+ chart.draw(google.visualization.arrayToDataTable(data['data']), data['options'])
116
118
 
117
119
  # Appends the filter html, stored in the column definitions, into each column header
118
120
  initializeFilters = (api) ->
@@ -1,13 +1,50 @@
1
1
  module EffectiveDatatablesHelper
2
2
  def render_datatable(datatable, input_js_options = nil)
3
- datatable.view = self
3
+ return unless datatable.present?
4
+ datatable.view ||= self
5
+
4
6
  render partial: 'effective/datatables/datatable',
5
7
  locals: { datatable: datatable, input_js_options: input_js_options.try(:to_json) }
6
8
  end
7
9
 
10
+ def render_datatable_scopes(datatable)
11
+ return unless datatable.scopes.present?
12
+ datatable.view ||= self
13
+
14
+ render partial: 'effective/datatables/scopes', locals: { datatable: datatable }
15
+ end
16
+
17
+ def render_datatable_charts(datatable)
18
+ return unless datatable.charts.present?
19
+ datatable.view ||= self
20
+
21
+ datatable.charts.map { |name, _| render_datatable_chart(datatable, name) }.join.html_safe
22
+ end
23
+
24
+ def render_datatable_chart(datatable, name)
25
+ return unless datatable.charts.present?
26
+ return unless datatable.charts[name].present?
27
+ datatable.view ||= self
28
+
29
+ unless @effective_datatables_chart_javascript_rendered
30
+ concat javascript_include_tag('https://www.google.com/jsapi')
31
+ concat javascript_tag("if(google && google.visualization === undefined) { google.load('visualization', '1', {packages:#{EffectiveDatatables.google_chart_packages}}); }")
32
+
33
+ @effective_datatables_chart_javascript_rendered = true
34
+ end
35
+
36
+ options = datatable.charts[name]
37
+ chart = datatable.to_json[:charts][name]
38
+
39
+ render partial: (options[:partial] || 'effective/datatables/chart'),
40
+ locals: { datatable: datatable, chart: chart }
41
+ end
42
+
8
43
  def render_simple_datatable(datatable, input_js_options = nil)
9
- datatable.view = self
44
+ return unless datatable.present?
45
+ datatable.view ||= self
10
46
  datatable.simple = true
47
+
11
48
  render partial: 'effective/datatables/datatable',
12
49
  locals: {datatable: datatable, input_js_options: input_js_options.try(:to_json) }
13
50
  end
@@ -51,17 +88,6 @@ module EffectiveDatatablesHelper
51
88
  }.to_json()
52
89
  end
53
90
 
54
- def datatable_scopes(datatable)
55
- return false unless datatable.scopes.present?
56
-
57
- {
58
- scopeHtml: render(
59
- partial: 'effective/datatables/scopes',
60
- locals: HashWithIndifferentAccess.new(datatable: datatable)
61
- )
62
- }.to_json()
63
- end
64
-
65
91
  def datatable_header_filter(form, name, value, opts)
66
92
  return render(partial: opts[:header_partial], locals: {form: form, name: (opts[:label] || name), column: opts}) if opts[:header_partial].present?
67
93
 
@@ -7,10 +7,13 @@ module Effective
7
7
 
8
8
  delegate :render, :controller, :link_to, :mail_to, :number_to_currency, :number_to_percentage, :to => :@view
9
9
 
10
- include Effective::EffectiveDatatable::Dsl
11
- extend Effective::EffectiveDatatable::Dsl::ClassMethods
10
+ extend Effective::EffectiveDatatable::Dsl
11
+ include Effective::EffectiveDatatable::Dsl::Charts
12
+ include Effective::EffectiveDatatable::Dsl::Datatable
13
+ include Effective::EffectiveDatatable::Dsl::Scopes
12
14
 
13
15
  include Effective::EffectiveDatatable::Ajax
16
+ include Effective::EffectiveDatatable::Charts
14
17
  include Effective::EffectiveDatatable::Helpers
15
18
  include Effective::EffectiveDatatable::Hooks
16
19
  include Effective::EffectiveDatatable::Options
@@ -22,9 +25,20 @@ module Effective
22
25
  args.first.each { |k, v| self.attributes[k] = v }
23
26
  end
24
27
 
25
- initialize_datatable # This creates @table_columns based on the DSL datatable do .. end block
26
- initialize_scopes # This normalizes scopes, and copies scope default values to attributes
27
- initialize_options # This normalizes all the options
28
+ if respond_to?(:initialize_scopes) # There was at least one scope defined in the scopes do .. end block
29
+ initialize_scopes
30
+ initialize_scope_options
31
+ end
32
+
33
+ if respond_to?(:initialize_datatable)
34
+ initialize_datatable # This creates @table_columns based on the DSL datatable do .. end block
35
+ initialize_datatable_options # This normalizes all the options
36
+ end
37
+
38
+ if respond_to?(:initialize_charts)
39
+ initialize_charts
40
+ initialize_chart_options
41
+ end
28
42
 
29
43
  unless active_record_collection? || array_collection?
30
44
  raise "Unsupported collection type. Should be ActiveRecord class, ActiveRecord relation, or an Array of Arrays [[1, 'something'], [2, 'something else']]"
@@ -43,6 +57,10 @@ module Effective
43
57
  @scopes
44
58
  end
45
59
 
60
+ def charts
61
+ @charts
62
+ end
63
+
46
64
  def aggregates
47
65
  @aggregates
48
66
  end
@@ -86,7 +104,8 @@ module Effective
86
104
  :data => (data || []),
87
105
  :recordsTotal => (total_records || 0),
88
106
  :recordsFiltered => (display_records || 0),
89
- :aggregates => (aggregate_data(data) || [])
107
+ :aggregates => (aggregate_data(data) || []),
108
+ :charts => (charts_data || {})
90
109
  }
91
110
  end
92
111
  end
@@ -102,7 +121,6 @@ module Effective
102
121
  def total_records
103
122
  @total_records ||= (
104
123
  if active_record_collection?
105
- # https://github.com/rails/rails/issues/15331
106
124
  if collection_class.connection.respond_to?(:unprepared_statement)
107
125
  collection_sql = collection_class.connection.unprepared_statement { collection.to_sql }
108
126
  (collection_class.connection.execute("SELECT COUNT(*) FROM (#{collection_sql}) AS datatables_total_count").first.values.first rescue 1).to_i
@@ -128,11 +146,11 @@ module Effective
128
146
  @view.effective_datatable = self
129
147
 
130
148
  (self.class.instance_methods(false) - [:collection, :search_column, :order_column]).each do |view_method|
131
- @view.class_eval { delegate view_method, :to => :@effective_datatable }
149
+ @view.class_eval { delegate view_method, to: :@effective_datatable }
132
150
  end
133
151
 
134
152
  Effective::EffectiveDatatable::Helpers.instance_methods(false).each do |helper_method|
135
- @view.class_eval { delegate helper_method, :to => :@effective_datatable }
153
+ @view.class_eval { delegate helper_method, to: :@effective_datatable }
136
154
  end
137
155
 
138
156
  # Clear the search_terms memoization
@@ -141,6 +159,10 @@ module Effective
141
159
  @order_direction = nil
142
160
  end
143
161
 
162
+ def view_context
163
+ view
164
+ end
165
+
144
166
  def table_html_class
145
167
  @table_html_class.presence || 'table table-bordered table-striped'
146
168
  end
@@ -0,0 +1,20 @@
1
+ module Effective
2
+ module EffectiveDatatable
3
+ module Charts
4
+
5
+ def charts_data
6
+ HashWithIndifferentAccess.new().tap do |retval|
7
+ (charts || {}).each do |name, chart|
8
+ retval[name] = {
9
+ name: chart[:name],
10
+ type: chart[:type],
11
+ options: chart[:options],
12
+ data: (instance_exec(&chart[:block]) if chart[:block])
13
+ }
14
+ end
15
+ end
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -1,94 +1,19 @@
1
- # This is extended as class level into Datatable
1
+ # These are Class level methods.
2
2
 
3
3
  module Effective
4
4
  module EffectiveDatatable
5
5
  module Dsl
6
6
 
7
- module ClassMethods
8
- def datatable(&block)
9
- define_method('initialize_datatable') { instance_exec(&block) }
10
- end
7
+ def datatable(&block)
8
+ define_method('initialize_datatable') { instance_exec(&block) }
11
9
  end
12
10
 
13
- # Instance Methods inside the datatable do .. end block
14
- def default_order(name, direction = :asc)
15
- @default_order = {name => direction}
11
+ def scopes(&block)
12
+ define_method('initialize_scopes') { instance_exec(&block) }
16
13
  end
17
14
 
18
- def default_entries(entries)
19
- @default_entries = entries
20
- end
21
-
22
- def table_column(name, options = {}, proc = nil, &block)
23
- if block_given?
24
- raise "You cannot use partial: ... with the block syntax" if options[:partial]
25
- raise "You cannot use proc: ... with the block syntax" if options[:proc]
26
- options[:block] = block
27
- end
28
- raise "You cannot use both partial: ... and proc: ..." if options[:partial] && options[:proc]
29
-
30
- (@table_columns ||= HashWithIndifferentAccess.new)[name] = options
31
- end
32
-
33
- def array_column(name, options = {}, proc = nil, &block)
34
- table_column(name, options.merge!(array_column: true), proc, &block)
35
- end
36
-
37
- def actions_column(options = {}, proc = nil, &block)
38
- show = options.fetch(:show, (EffectiveDatatables.actions_column[:show] rescue false))
39
- edit = options.fetch(:edit, (EffectiveDatatables.actions_column[:edit] rescue false))
40
- destroy = options.fetch(:destroy, (EffectiveDatatables.actions_column[:destroy] rescue false))
41
- unarchive = options.fetch(:unarchive, (EffectiveDatatables.actions_column[:unarchive] rescue false))
42
- name = options.fetch(:name, 'actions')
43
-
44
- opts = {
45
- sortable: false,
46
- filter: false,
47
- responsivePriority: 0,
48
- partial_locals: { show_action: show, edit_action: edit, destroy_action: destroy, unarchive_action: unarchive }
49
- }.merge(options)
50
-
51
- opts[:partial_local] ||= :resource unless opts[:partial].present?
52
- opts[:partial] ||= '/effective/datatables/actions_column' unless (block_given? || proc.present?)
53
-
54
- table_column(name, opts, proc, &block)
55
- end
56
-
57
- def bulk_actions_column(options = {}, proc = nil, &block)
58
- name = options.fetch(:name, 'bulk_actions')
59
- resource_method = options.fetch(:resource_method, :to_param)
60
-
61
- opts = {
62
- bulk_actions_column: true,
63
- label: '',
64
- partial_local: :resource,
65
- partial: '/effective/datatables/bulk_actions_column',
66
- partial_locals: { resource_method: resource_method },
67
- sortable: false,
68
- dropdown_partial: '/effective/datatables/bulk_actions_dropdown',
69
- dropdown_block: block
70
- }.merge(options)
71
-
72
- table_column(name, opts, proc)
73
- end
74
-
75
- def scope(name, default, options = {}, &block)
76
- if block_given?
77
- raise "You cannot use partial: ... with the block syntax" if options[:partial]
78
- options[:block] = block
79
- end
80
-
81
- # This needs to be a {} not WithIndifferentAccess or rendering _scopes won't work correctly
82
- (@scopes ||= {})[name] = options.merge(default: default)
83
- end
84
-
85
- def aggregate(name, options = {}, &block)
86
- if block_given?
87
- raise "You cannot use proc: ... with the block syntax" if options[:proc]
88
- options[:block] = block
89
- end
90
-
91
- (@aggregates ||= HashWithIndifferentAccess.new)[name] = options
15
+ def charts(&block)
16
+ define_method('initialize_charts') { instance_exec(&block) }
92
17
  end
93
18
 
94
19
  end
@@ -0,0 +1,22 @@
1
+ module Effective
2
+ module EffectiveDatatable
3
+ module Dsl
4
+ module Charts
5
+ # Instance Methods inside the charts do .. end block
6
+ def chart(name, type, options = {}, &block)
7
+
8
+ options[:title] ||= (options[:label] || name.to_s.titleize)
9
+ options[:legend] = 'none' if options[:legend] == false
10
+
11
+ (@charts ||= HashWithIndifferentAccess.new)[name] = {
12
+ name: name,
13
+ type: type,
14
+ partial: options.delete(:partial),
15
+ options: options,
16
+ block: (block if block_given?)
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,78 @@
1
+ module Effective
2
+ module EffectiveDatatable
3
+ module Dsl
4
+ module Datatable
5
+ # Instance Methods inside the datatable do .. end block
6
+ def default_order(name, direction = :asc)
7
+ @default_order = {name => direction}
8
+ end
9
+
10
+ def default_entries(entries)
11
+ @default_entries = entries
12
+ end
13
+
14
+ def table_column(name, options = {}, proc = nil, &block)
15
+ if block_given?
16
+ raise "You cannot use partial: ... with the block syntax" if options[:partial]
17
+ raise "You cannot use proc: ... with the block syntax" if options[:proc]
18
+ options[:block] = block
19
+ end
20
+ raise "You cannot use both partial: ... and proc: ..." if options[:partial] && options[:proc]
21
+
22
+ (@table_columns ||= HashWithIndifferentAccess.new)[name] = options
23
+ end
24
+
25
+ def array_column(name, options = {}, proc = nil, &block)
26
+ table_column(name, options.merge!(array_column: true), proc, &block)
27
+ end
28
+
29
+ def actions_column(options = {}, proc = nil, &block)
30
+ show = options.fetch(:show, (EffectiveDatatables.actions_column[:show] rescue false))
31
+ edit = options.fetch(:edit, (EffectiveDatatables.actions_column[:edit] rescue false))
32
+ destroy = options.fetch(:destroy, (EffectiveDatatables.actions_column[:destroy] rescue false))
33
+ unarchive = options.fetch(:unarchive, (EffectiveDatatables.actions_column[:unarchive] rescue false))
34
+ name = options.fetch(:name, 'actions')
35
+
36
+ opts = {
37
+ sortable: false,
38
+ filter: false,
39
+ responsivePriority: 0,
40
+ partial_locals: { show_action: show, edit_action: edit, destroy_action: destroy, unarchive_action: unarchive }
41
+ }.merge(options)
42
+
43
+ opts[:partial_local] ||= :resource unless opts[:partial].present?
44
+ opts[:partial] ||= '/effective/datatables/actions_column' unless (block_given? || proc.present?)
45
+
46
+ table_column(name, opts, proc, &block)
47
+ end
48
+
49
+ def bulk_actions_column(options = {}, proc = nil, &block)
50
+ name = options.fetch(:name, 'bulk_actions')
51
+ resource_method = options.fetch(:resource_method, :to_param)
52
+
53
+ opts = {
54
+ bulk_actions_column: true,
55
+ label: '',
56
+ partial_local: :resource,
57
+ partial: '/effective/datatables/bulk_actions_column',
58
+ partial_locals: { resource_method: resource_method },
59
+ sortable: false,
60
+ dropdown_partial: '/effective/datatables/bulk_actions_dropdown',
61
+ dropdown_block: block
62
+ }.merge(options)
63
+
64
+ table_column(name, opts, proc)
65
+ end
66
+
67
+ def aggregate(name, options = {}, &block)
68
+ if block_given?
69
+ raise "You cannot use proc: ... with the block syntax" if options[:proc]
70
+ options[:block] = block
71
+ end
72
+
73
+ (@aggregates ||= HashWithIndifferentAccess.new)[name] = options
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,18 @@
1
+ module Effective
2
+ module EffectiveDatatable
3
+ module Dsl
4
+ module Scopes
5
+ # Instance Methods inside the scopes do .. end block
6
+ def scope(name, default, options = {}, &block)
7
+ if block_given?
8
+ raise "You cannot use partial: ... with the block syntax" if options[:partial]
9
+ options[:block] = block
10
+ end
11
+
12
+ # This needs to be a {} not WithIndifferentAccess or rendering _scopes won't work correctly
13
+ (@scopes ||= {})[name] = options.merge(default: default)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -4,12 +4,16 @@ module Effective
4
4
  module EffectiveDatatable
5
5
  module Options
6
6
 
7
- def initialize_options
8
- @table_columns = initialize_column_options(@table_columns)
7
+ def initialize_datatable_options
8
+ @table_columns = _initialize_datatable_options(@table_columns)
9
9
  end
10
10
 
11
- def initialize_scopes
12
- @scopes = initialize_scope_options(@scopes)
11
+ def initialize_scope_options
12
+ @scopes = _initialize_scope_options(@scopes)
13
+ end
14
+
15
+ def initialize_chart_options
16
+ @charts = _initialize_chart_options(@charts)
13
17
  end
14
18
 
15
19
  def quote_sql(name)
@@ -25,26 +29,27 @@ module Effective
25
29
 
26
30
  # A scope comes to us like {:start_date => {default: Time.zone.now, filter: {as: :select, collection: ... input_html :}}}
27
31
  # We want to make sure an input_html: { value: default } exists
28
- def initialize_scope_options(scopes)
32
+ def _initialize_scope_options(scopes)
29
33
  (scopes || []).each do |name, options|
30
34
  value = attributes.key?(name) ? attributes[name] : options[:default]
31
35
 
36
+ if (options[:fallback] || options[:presence]) && attributes[name].blank? && attributes[name] != false
37
+ self.attributes[name] = options[:default]
38
+ value = options[:default]
39
+ end
40
+
32
41
  options[:filter] ||= {}
33
42
  options[:filter][:input_html] ||= {}
34
43
  options[:filter][:input_html][:value] = value
35
44
  options[:filter][:selected] = value
36
-
37
- if attributes.key?(name) == false
38
- self.attributes[name] = options[:default]
39
- end
40
-
41
- if (options[:fallback] || options[:presence]) && attributes[name].blank? && attributes[name] != false
42
- self.attributes[name] = options[:default]
43
- end
44
45
  end
45
46
  end
46
47
 
47
- def initialize_column_options(cols)
48
+ def _initialize_chart_options(charts)
49
+ charts
50
+ end
51
+
52
+ def _initialize_datatable_options(cols)
48
53
  sql_table = (collection.table rescue nil)
49
54
 
50
55
  # Here we identify all belongs_to associations and build up a Hash like:
@@ -0,0 +1 @@
1
+ .effective-datatables-chart{id: "#{chart[:name].to_s.parameterize}-chart-#{Time.zone.now.nsec}", data: {name: chart[:name], type: chart[:type], options: chart[:options].to_json, data: chart[:data].to_json}}
@@ -7,7 +7,6 @@
7
7
  'bulk-actions' => datatable_bulk_actions(datatable),
8
8
  'columns' => datatable_columns(datatable),
9
9
  'input-js-options' => local_assigns[:input_js_options],
10
- 'scopes' => datatable_scopes(datatable),
11
10
  'simple' => datatable.simple?.to_s,
12
11
  'source' => effective_datatables.datatable_path(datatable, {format: 'json'}.merge(attributes: datatable.attributes)).chomp('?'),
13
12
  'default-order' => datatable_default_order(datatable),
@@ -10,6 +10,6 @@
10
10
  - else
11
11
  = form.input name, options[:filter]
12
12
 
13
- = form.submit 'Refresh', class: 'btn btn-primary', 'data-disable-with' => 'Refreshing...'
13
+ = form.submit 'Submit', class: 'btn btn-primary', 'data-disable-with' => 'Submitting...'
14
14
  = link_to 'Reset', '#', 'data-reset-form' => true
15
15
 
@@ -14,6 +14,8 @@ module EffectiveDatatables
14
14
  mattr_accessor :default_entries
15
15
  mattr_accessor :actions_column # A Hash
16
16
 
17
+ mattr_accessor :google_chart_packages
18
+
17
19
  def self.setup
18
20
  yield self
19
21
  end
@@ -1,3 +1,3 @@
1
1
  module EffectiveDatatables
2
- VERSION = '2.5.2'.freeze
2
+ VERSION = '2.6.0'.freeze
3
3
  end
@@ -62,4 +62,7 @@ EffectiveDatatables.setup do |config|
62
62
  unarchive: :authorize
63
63
  }
64
64
 
65
+ # Which packages to load when using the charts DSL
66
+ config.google_chart_packages = ['corechart', 'gauge', 'geochart']
67
+
65
68
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_datatables
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.2
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-21 00:00:00.000000000 Z
11
+ date: 2016-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -121,6 +121,7 @@ files:
121
121
  - app/assets/javascripts/dataTables/responsive/responsive.bootstrap.min.js
122
122
  - app/assets/javascripts/effective_datatables.js
123
123
  - app/assets/javascripts/effective_datatables/bulk_actions.js.coffee
124
+ - app/assets/javascripts/effective_datatables/charts.js.coffee
124
125
  - app/assets/javascripts/effective_datatables/initialize.js.coffee
125
126
  - app/assets/javascripts/effective_datatables/responsive.js.coffee
126
127
  - app/assets/javascripts/effective_datatables/scopes.js.coffee
@@ -143,7 +144,11 @@ files:
143
144
  - app/models/effective/array_datatable_tool.rb
144
145
  - app/models/effective/datatable.rb
145
146
  - app/models/effective/effective_datatable/ajax.rb
147
+ - app/models/effective/effective_datatable/charts.rb
146
148
  - app/models/effective/effective_datatable/dsl.rb
149
+ - app/models/effective/effective_datatable/dsl/charts.rb
150
+ - app/models/effective/effective_datatable/dsl/datatable.rb
151
+ - app/models/effective/effective_datatable/dsl/scopes.rb
147
152
  - app/models/effective/effective_datatable/helpers.rb
148
153
  - app/models/effective/effective_datatable/hooks.rb
149
154
  - app/models/effective/effective_datatable/options.rb
@@ -151,6 +156,7 @@ files:
151
156
  - app/views/effective/datatables/_actions_column.html.haml
152
157
  - app/views/effective/datatables/_bulk_actions_column.html.haml
153
158
  - app/views/effective/datatables/_bulk_actions_dropdown.html.haml
159
+ - app/views/effective/datatables/_chart.html.haml
154
160
  - app/views/effective/datatables/_datatable.html.haml
155
161
  - app/views/effective/datatables/_scopes.html.haml
156
162
  - app/views/effective/datatables/_spacer_template.html