effective_datatables 3.7.1 → 3.7.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '00897fdaee946020e3da4d940ed071dd6d22b2309143466600196e353e66fda8'
4
- data.tar.gz: dc8eaf4b4d4719a3a209d79bc1aa498774bba00b897a26c21f777d3c0194ce4d
3
+ metadata.gz: 173590e66ff34a72a7aaed989391a718e25eaca196fae4981f295bf4a73a6bf0
4
+ data.tar.gz: 8330bb5487288950f107f6dc79dedde2b2298e77c059d98bdf4d7f095ca8c353
5
5
  SHA512:
6
- metadata.gz: d3235fbe734ed95f5cf7cc531ac6449986bac368a1b28227b1192b48bfa42f87980adc29b02a3d72d78d3a85a8ea920f5419d028f105f8de327233c5a4eadcf4
7
- data.tar.gz: 90e7bc6cb4bcd6b7e59ed05a3b6bc81f781de74c1775b3fe204c7327918bf0192fdda12129710f0e343ee350f54758cbd2e3b6633ae6e5174ee40261d8ad6208
6
+ metadata.gz: 242e5bf78a1f1aef37f3864e76d8cf90e98141a84ff4408b9fb5fed72a51115c15a5d19ca1fa79a692401ff6abc29d1f40dae4d781f217add15509f09217c810
7
+ data.tar.gz: 569226fd1c6c32e498efc9ee7728a070f971d54ee10ef353777712a7ccf891337d2061cbceec3366a5d627daa84841eb8a70bea3a81ee32a2e1fdc9c03809576
@@ -15,6 +15,7 @@
15
15
  //= require effective_datatables/bulk_actions
16
16
  //= require effective_datatables/events
17
17
  //= require effective_datatables/filters
18
+ //= require effective_datatables/flash
18
19
  //= require effective_datatables/reset
19
20
  //= require effective_datatables/responsive
20
21
 
@@ -1,50 +1,66 @@
1
1
  #### Checkbox toggling and Bulk Actions dropdown disabling
2
2
 
3
- $(document).on 'change', "input[data-role='bulk-actions-resource']", (event) ->
3
+ $(document).on 'change', ".dataTables_wrapper input[data-role='bulk-action']", (event) ->
4
4
  $wrapper = $(event.currentTarget).closest('.dataTables_wrapper')
5
5
 
6
- $wrapper.find("input[data-role='bulk-actions-all']").prop('checked', false)
7
- toggleClosestBulkActionsButton($wrapper)
6
+ $wrapper.find("input[data-role='bulk-actions']").prop('checked', false)
7
+ toggleDropdown($wrapper)
8
8
 
9
- $(document).on 'change', "input[data-role='bulk-actions-all']", (event) ->
9
+ $(document).on 'change', ".dataTables_wrapper input[data-role='bulk-actions']", (event) ->
10
10
  $wrapper = $(event.currentTarget).closest('.dataTables_wrapper')
11
- $resources = $wrapper.find("input[data-role='bulk-actions-resource']")
11
+ $resources = $wrapper.find("input[data-role='bulk-action']")
12
12
 
13
13
  if $(event.currentTarget).is(':checked')
14
14
  $resources.prop('checked', true)
15
15
  else
16
16
  $resources.prop('checked', false)
17
17
 
18
- toggleClosestBulkActionsButton($wrapper)
18
+ toggleDropdown($wrapper)
19
19
 
20
- toggleClosestBulkActionsButton = ($wrapper) ->
20
+ toggleDropdown = ($wrapper) ->
21
21
  $bulkActions = $wrapper.children().first().find('.buttons-bulk-actions').children('button')
22
22
 
23
- if $wrapper.find("input[data-role='bulk-actions-resource']:checked").length > 0
23
+ if $wrapper.find("input[data-role='bulk-action']:checked").length > 0
24
24
  $bulkActions.removeAttr('disabled')
25
25
  else
26
26
  $bulkActions.attr('disabled', 'disabled')
27
27
 
28
+ restoreSelected = ($table, selected) ->
29
+ $bulkActions = $table.closest('.dataTables_wrapper').children().first().find('.buttons-bulk-actions').children('button')
30
+ present = false
31
+
32
+ if selected && selected.length > 0
33
+ $table.find("input[data-role='bulk-action']").each (_, input) ->
34
+ $input = $(input)
35
+
36
+ if selected.indexOf($input.val()) > -1
37
+ $input.prop('checked', true)
38
+ present = true
39
+ else
40
+ $input.prop('checked', false)
41
+
42
+ if present then $bulkActions.removeAttr('disabled') else $bulkActions.attr('disabled', 'disabled')
28
43
 
29
44
  #### Bulk Action link behaviour
30
- $(document).on 'click', '.buttons-bulk-actions a', (event) ->
45
+ $(document).on 'click', '.dataTables_wrapper .buttons-bulk-actions a', (event) ->
31
46
  event.preventDefault() # prevent the click
32
47
 
33
48
  $bulkAction = $(event.currentTarget) # This is a regular <a href=...> tag
34
49
  $wrapper = $bulkAction.closest('.dataTables_wrapper')
35
50
  $table = $wrapper.find('table.dataTable').first()
36
51
  $processing = $table.siblings('.dataTables_processing').first()
37
- $selected = $table.find("input[data-role='bulk-actions-resource']:checked")
52
+ $selected = $table.find("input[data-role='bulk-action']:checked")
38
53
 
39
54
  url = $bulkAction.attr('href')
40
55
  title = $bulkAction.text()
41
- token = $bulkAction.parent('li').data('authenticity-token')
56
+ download = $bulkAction.data('bulk-download')
57
+ token = $table.data('authenticity-token')
42
58
  values = $.map($selected, (input) -> input.getAttribute('value'))
43
- get_link = $bulkAction.data('bulk-actions-get')
59
+ method = $bulkAction.data('ajax-method')
44
60
 
45
61
  return unless url && values
46
62
 
47
- if get_link
63
+ if method == 'GET'
48
64
  if url.includes('?')
49
65
  window.location.assign(url + '&' + $.param({ids: values}))
50
66
  else
@@ -55,52 +71,36 @@ $(document).on 'click', '.buttons-bulk-actions a', (event) ->
55
71
  # Disable the Bulk Actions dropdown, so only one can be run at a time
56
72
  $bulkAction.closest('button').attr('disabled', 'disabled')
57
73
 
58
- # Show Processing...
59
- $processing.show().data('bulk-actions-processing', true)
74
+ $table.dataTable().data('bulk-actions-restore-selected-values', values)
60
75
 
61
- if token # This is a file download
76
+ if download # This is a file download
62
77
  $.fileDownload(url,
63
78
  httpMethod: 'POST',
64
79
  data: { ids: values, authenticity_token: token }
65
80
  successCallback: ->
66
81
  success = "Successfully completed #{title} bulk action"
67
- $processing.html(success)
68
- $table.dataTable().data('bulk-actions-restore-selected-values', values)
82
+ $table.one 'draw.dt', (e) -> $(e.target).DataTable().flash(success, 'success') and restoreSelected($(e.target), values)
69
83
  $table.DataTable().draw()
70
84
  failCallback: ->
71
85
  error = "An error occured while attempting #{title} bulk action"
72
- $processing.html(error)
73
- alert(error)
74
- $table.dataTable().data('bulk-actions-restore-selected-values', values)
86
+ $table.one 'draw.dt', (e) -> $(e.target).DataTable().flash(error, 'danger') and restoreSelected($(e.target), values)
75
87
  $table.DataTable().draw()
76
88
  )
77
89
  else # Normal AJAX post
78
- $.post(
79
- url, { ids: values }
90
+ $table.dataTable().data('bulk-actions-restore-selected-values', values)
91
+
92
+ $.ajax(
93
+ method: method,
94
+ url: url,
95
+ data: { ids: values, authenticity_token: token }
80
96
  ).done((response) ->
81
97
  success = response['message'] || "Successfully completed #{title} bulk action"
82
- $processing.html(success)
98
+ $table.one 'draw.dt', (e) -> $(e.target).DataTable().flash(success, 'success') and restoreSelected($(e.target), values)
99
+
83
100
  ).fail((response) ->
84
101
  error = response['message'] || "An error occured while attempting #{title} bulk action: #{response.statusText}"
85
- $processing.html(error)
86
- alert(error)
102
+ $table.one 'draw.dt', (e) -> $(e.target).DataTable().flash(error, 'danger') and restoreSelected($(e.target), values)
103
+
87
104
  ).always((response) ->
88
- $table.dataTable().data('bulk-actions-restore-selected-values', values)
89
105
  $table.DataTable().draw()
90
106
  )
91
-
92
- # We borrow the Processing div for our bulk action success/error messages
93
- # This makes sure that the message is displayed for 1500ms
94
- $(document).on 'processing.dt', (event, settings, visible) ->
95
- return if settings.bDestroying
96
-
97
- $processing = $(event.target).siblings('.dataTables_processing').first()
98
- return unless $processing.data('bulk-actions-processing')
99
-
100
- timeout = $processing.show().data('timeout')
101
- clearTimeout(timeout) if timeout
102
- $processing.data('timeout', setTimeout( =>
103
- $processing.html('Processing...').hide()
104
- $processing.data('bulk-actions-processing', null)
105
- , 1500)
106
- )
@@ -24,14 +24,14 @@ initializeDataTables = (target) ->
24
24
  extend: 'copy',
25
25
  exportOptions:
26
26
  format:
27
- header: (str) -> $("<div>#{str}</div>").children('.search-label').first().text()
27
+ header: (str) -> $("<div>#{str}</div>").children('span').first().text()
28
28
  columns: buttons_export_columns
29
29
  },
30
30
  {
31
31
  extend: 'csv',
32
32
  exportOptions:
33
33
  format:
34
- header: (str) -> $("<div>#{str}</div>").children('.search-label').first().text()
34
+ header: (str) -> $("<div>#{str}</div>").children('span').first().text()
35
35
  columns: buttons_export_columns
36
36
  },
37
37
  {
@@ -39,7 +39,7 @@ initializeDataTables = (target) ->
39
39
  footer: true,
40
40
  exportOptions:
41
41
  format:
42
- header: (str) -> $("<div>#{str}</div>").children('.search-label').first().text()
42
+ header: (str) -> $("<div>#{str}</div>").children('span').first().text()
43
43
  columns: ':visible:not(.col-actions)'
44
44
  },
45
45
  ]
@@ -64,12 +64,23 @@ initializeDataTables = (target) ->
64
64
  params['authenticity_token'] = $table.data('authenticity-token')
65
65
 
66
66
  if $form.length > 0
67
- params['scope'] = $form.find("input[id^='filters_scope']:checked").val() || ''
67
+ params['scope'] = $form.find("input[name='filters[scope]']:checked").val() || ''
68
68
  params['filter'] = {}
69
69
 
70
- $form.find("[id^='filters_']:not(input[id^='filters_scope'])").each ->
70
+ $form.find("select,textarea,input:not([type=submit])").each ->
71
71
  $input = $(this)
72
- params['filter'][$input.attr('id').substring(8, $input.attr('id').length)] = $input.val()
72
+
73
+ if ['utf8', 'authenticity_token', 'filters[scope]'].includes($input.attr('name'))
74
+ # Skipped
75
+ else if $input.attr('type') == 'radio'
76
+ name = $input.attr('name')
77
+ filter_name = name.replace('filters[', '').substring(0, name.length-9)
78
+
79
+ params['filter'][filter_name] = $form.find("input[name='#{name}']:checked").val()
80
+
81
+ else if $input.attr('id')
82
+ filter_name = $input.attr('id').replace('filters_', '')
83
+ params['filter'][filter_name] = $input.val()
73
84
 
74
85
  serverSide: true
75
86
  scrollCollapse: true
@@ -145,6 +156,7 @@ initializeDataTables = (target) ->
145
156
 
146
157
  $input.parent().on 'click', (event) -> false # Dont order columns when you click inside the input
147
158
  $input.parent().on 'mousedown', (event) -> event.stopPropagation() # Dont order columns when you click inside the input
159
+ $input.parent().on 'keypress', (event) -> event.stopPropagation() # Don't order columns when you type inside the input
148
160
 
149
161
  if $input.is('select')
150
162
  $input.on 'change', (event) -> dataTableSearch($(event.currentTarget))
@@ -48,8 +48,8 @@ module EffectiveDatatablesPrivateHelper
48
48
  action = action.merge(column[:actions][:new])
49
49
 
50
50
  effective_resource = (datatable.effective_resource || datatable.fallback_effective_resource)
51
- klass = (column[:actions][:new][:klass] || effective_resource&.klass || datatable.collection_class)
52
- elsif Array(datatable.effective_resource&.actions).include?(:new)
51
+ klass = (column[:actions][:new][:klass] || effective_resource.try(:klass) || datatable.collection_class)
52
+ elsif Array(datatable.effective_resource.try(:actions)).include?(:new)
53
53
  effective_resource = datatable.effective_resource
54
54
  klass = effective_resource.klass
55
55
  else
@@ -148,7 +148,7 @@ module EffectiveDatatablesPrivateHelper
148
148
  input_html: input_html,
149
149
  input_js: { placeholder: placeholder }
150
150
  when :bulk_actions
151
- input_html[:data]['role'] = 'bulk-actions-all'
151
+ input_html[:data]['role'] = 'bulk-actions'
152
152
 
153
153
  form.input name, label: false, required: false, value: nil,
154
154
  as: :boolean,
@@ -176,15 +176,15 @@ module EffectiveDatatablesPrivateHelper
176
176
  collection = opts[:collection]
177
177
  input_html = opts[:input_html] || {}
178
178
 
179
- form.input name,
179
+ attributes = {
180
180
  value: value,
181
181
  selected: value,
182
182
  as: as,
183
183
  collection: collection,
184
184
  label: opts[:label],
185
- required: input_html.delete(:required),
186
- multiple: input_html.delete(:multiple),
187
- include_blank: input_html.delete(:include_blank),
185
+ required: input_html.delete(:required) || opts[:required],
186
+ multiple: input_html.delete(:multiple) || opts[:multiple],
187
+ include_blank: input_html.delete(:include_blank) || opts[:include_blank],
188
188
  group_method: input_html.delete(:group_method),
189
189
  group_label_method: input_html.delete(:group_label_method),
190
190
  value_method: input_html.delete(:value_method),
@@ -192,6 +192,9 @@ module EffectiveDatatablesPrivateHelper
192
192
  input_html: (({name: ''} unless datatable._filters_form_required?) || {}).merge(input_html),
193
193
  input_js: ({ placeholder: ''} if as == :effective_select),
194
194
  wrapper_html: {class: 'form-group-sm'}
195
+ }.compact
196
+
197
+ form.input name, **attributes
195
198
  end
196
199
 
197
200
  def datatable_scope_tag(form, datatable, opts = {})
@@ -94,10 +94,10 @@ module Effective
94
94
 
95
95
  case column[:as]
96
96
  when :boolean
97
- if fuzzy
98
- term ? (obj == true) : (obj != true)
97
+ if term
98
+ ['Yes', 'yes', true, 'true', '1'].include?(value)
99
99
  else
100
- obj == term
100
+ ['No', 'no', false, 'false', '0'].include?(value)
101
101
  end
102
102
  when :datetime, :date
103
103
  end_at = (
@@ -88,9 +88,9 @@ module Effective
88
88
  when :currency
89
89
  view.number_to_currency(value)
90
90
  when :date
91
- (value.strftime('%F') rescue BLANK)
91
+ value.respond_to?(:strftime) ? value.strftime(EffectiveDatatables.format_date) : BLANK
92
92
  when :datetime
93
- (value.strftime('%F %H:%M') rescue BLANK)
93
+ value.respond_to?(:strftime) ? value.strftime(EffectiveDatatables.format_datetime) : BLANK
94
94
  when :decimal
95
95
  value
96
96
  when :duration
@@ -116,7 +116,7 @@ module Effective
116
116
  when Numeric ; view.number_to_currency(value)
117
117
  end
118
118
  when :time
119
- (value.strftime('%H:%M') rescue BLANK)
119
+ value.respond_to?(:strftime) ? value.strftime(EffectiveDatatables.format_time) : BLANK
120
120
  else
121
121
  value.to_s
122
122
  end
@@ -126,7 +126,7 @@ module Effective
126
126
  # Applies data-remote to anything that's data-method post or delete
127
127
  # Merges in any extra attributes when passed as a Hash
128
128
  def actions_col_actions(column)
129
- resource_actions = (effective_resource&.resource_actions || fallback_effective_resource.fallback_resource_actions)
129
+ resource_actions = (effective_resource.try(:resource_actions) || fallback_effective_resource.fallback_resource_actions)
130
130
 
131
131
  actions = if column[:inline]
132
132
  resource_actions.transform_values { |opts| opts['data-remote'] = true; opts }
@@ -139,7 +139,7 @@ module Effective
139
139
  column[:actions].each do |action, opts|
140
140
  next unless opts.kind_of?(Hash)
141
141
 
142
- existing = actions.find { |_, v| v[:action] == action }&.first
142
+ existing = actions.find { |_, v| v[:action] == action }.try(:first)
143
143
  next unless existing.present?
144
144
 
145
145
  actions[existing]['data-remote'] = opts[:remote] if opts.key?(:remote)
@@ -1,2 +1,2 @@
1
1
  - id = (resource.try(:to_param) || resource.try(:id) || resource.object_id)
2
- = check_box_tag 'bulk_actions_resources[]', id, false, autocomplete: 'off', id: "datatable_bulk_actions_resource_#{id}", data: { role: 'bulk-actions-resource' }, onClick: 'event.stopPropagation();'
2
+ = check_box_tag 'bulk_actions_resources[]', id, false, autocomplete: 'off', id: "datatable_bulk_actions_resource_#{id}", data: { role: 'bulk-action' }, onClick: 'event.stopPropagation();'
@@ -39,4 +39,8 @@ EffectiveDatatables.setup do |config|
39
39
  config.cookie_domain = :all # Should usually be :all
40
40
  config.cookie_tld_length = nil # Leave nil to autodetect, or set to probably 2
41
41
 
42
+ # Date formatting
43
+ config.format_datetime = '%F %H:%M'
44
+ config.format_date = '%F'
45
+ config.format_time = '%H:%M'
42
46
  end
@@ -16,6 +16,10 @@ module EffectiveDatatables
16
16
  mattr_accessor :cookie_domain
17
17
  mattr_accessor :cookie_tld_length
18
18
 
19
+ mattr_accessor :format_datetime
20
+ mattr_accessor :format_date
21
+ mattr_accessor :format_time
22
+
19
23
  mattr_accessor :debug
20
24
 
21
25
  alias_method :max_cookie_size, :cookie_max_size
@@ -1,3 +1,3 @@
1
1
  module EffectiveDatatables
2
- VERSION = '3.7.1'.freeze
2
+ VERSION = '3.7.7'.freeze
3
3
  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: 3.7.1
4
+ version: 3.7.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-17 00:00:00.000000000 Z
11
+ date: 2020-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -176,7 +176,7 @@ homepage: https://github.com/code-and-effect/effective_datatables
176
176
  licenses:
177
177
  - MIT
178
178
  metadata: {}
179
- post_install_message:
179
+ post_install_message:
180
180
  rdoc_options: []
181
181
  require_paths:
182
182
  - lib
@@ -191,8 +191,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
191
  - !ruby/object:Gem::Version
192
192
  version: '0'
193
193
  requirements: []
194
- rubygems_version: 3.0.3
195
- signing_key:
194
+ rubygems_version: 3.1.4
195
+ signing_key:
196
196
  specification_version: 4
197
197
  summary: Uniquely powerful server-side searching, sorting and filtering of any ActiveRecord
198
198
  or Array collection as well as post-rendered content displayed as a frontend jQuery