effective_datatables 3.0.1 → 3.0.2

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: b90399cec3e58ad388ef53897df0de9214f11e24
4
- data.tar.gz: 56416c9fb6eced1b452c7869aeb4797b632821cd
3
+ metadata.gz: 76b12d9c51e6dd4d3e040161ea88d8cc04d9f451
4
+ data.tar.gz: 45787258cc49d4b0b87f459b16d99fc9e2b420eb
5
5
  SHA512:
6
- metadata.gz: e53be870c6c149c8751be8e6b7bbb6ad67051bfc484eb815a79391ecc4384bee46bd4b10bc26d2227532826f1b9a04d04ca42042a26deb304514c669830207b0
7
- data.tar.gz: 0ede3718f43448110ea4df5638859cee01dde70e137faae5f35f194934d0baab4fc0ef57349d4ab525d1e52aba6650dd9913cad980af345fa734ca74f802b4e8
6
+ metadata.gz: 843709309dc8d2bf2047d4fb0dff94ee369f48c3de8852b53d498fc07a9dd783b074dcdd9f22051db35b82413aa955764c46bc15d2215dcb1f4be6358f302916
7
+ data.tar.gz: 93d36172ba1e8b0b4e435bb90dc88fb1ef7dc1b4fb3544419532c2a17dee1bc786c85488481286c1ea3bf34d77e981ec34c4c6bcddaf0472ac8a3f31e75c00b6
@@ -62,6 +62,8 @@ initializeDataTables = ->
62
62
  $table = $(api.table().node())
63
63
  $form = $(".effective-datatable-filters[aria-controls='#{$table.attr('id')}']").first()
64
64
 
65
+ params['cookie'] = $table.data('cookie')
66
+
65
67
  if $form.length > 0
66
68
  params['scope'] = $form.find("input[id^='filters_scope']:checked").val() || ''
67
69
  params['filter'] = {}
@@ -3,5 +3,5 @@ $(document).on 'click', 'a.buttons-reset-cookie', (event) ->
3
3
 
4
4
  $obj = $(event.currentTarget)
5
5
  $obj.find('span').text('Resetting...')
6
- document.cookie = "#{$obj.data('cookie-name')}=; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/"
6
+ document.cookie = "_effective_dt=; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/"
7
7
  location.reload()
@@ -22,6 +22,7 @@ module EffectiveDatatablesHelper
22
22
  'effective-form-inputs' => defined?(EffectiveFormInputs),
23
23
  'bulk-actions' => datatable_bulk_actions(datatable),
24
24
  'columns' => datatable_columns(datatable),
25
+ 'cookie' => datatable.cookie_name,
25
26
  'display-length' => datatable.display_length,
26
27
  'display-order' => [datatable.order_index, datatable.order_direction].to_json(),
27
28
  'display-records' => datatable.to_json[:recordsFiltered],
@@ -16,8 +16,7 @@ module Effective
16
16
  # The collection itself. Only evaluated once.
17
17
  attr_accessor :_collection
18
18
 
19
- # The view, and the ajax/cookie/default state
20
- attr_reader :cookie
19
+ # The view
21
20
  attr_reader :view
22
21
 
23
22
  extend Effective::EffectiveDatatable::Dsl
@@ -11,12 +11,14 @@ module Effective
11
11
 
12
12
  def load_attributes!
13
13
  if datatables_ajax_request?
14
- raise 'Expected attributes cookie to be present' unless cookie
15
- @attributes = cookie[:attributes]
14
+ raise 'Expected attributes cookie to be present' unless cookie && cookie[:attributes]
15
+ # Cookie will still be just values here. Attributes is the first value.
16
+
17
+ @attributes = cookie.delete(:attributes)
16
18
  end
17
19
 
18
20
  unless datatables_ajax_request?
19
- @attributes[:controller_namespace] ||= view.controller_path.split('/')[0...-1].join('/').presence
21
+ @attributes[:_n] ||= view.controller_path.split('/')[0...-1].join('/').presence
20
22
  end
21
23
  end
22
24
 
@@ -1,30 +1,66 @@
1
1
  module Effective
2
2
  module EffectiveDatatable
3
3
  module Cookie
4
+ MAX_COOKIE_SIZE = 2500 # String size. Real byte size is about 1.5 times bigger.
5
+
6
+ def cookie
7
+ @cookie
8
+ end
4
9
 
5
10
  def cookie_name
6
- @cookie_name ||= "datatable-#{URI(datatables_ajax_request? ? view.request.referer : view.request.url).path}-#{to_param}".parameterize
11
+ @cookie_name ||= (
12
+ if datatables_ajax_request?
13
+ view.params[:cookie]
14
+ else
15
+ [self.class, attributes].hash.to_s.last(12)
16
+ end
17
+ )
7
18
  end
8
19
 
9
20
  private
10
21
 
11
22
  def load_cookie!
12
- @cookie ||= (
13
- cookie = view.cookies.signed[cookie_name]
23
+ @dt_cookie = view.cookies.signed['_effective_dt']
14
24
 
15
- if cookie.present?
16
- data = Marshal.load(Base64.decode64(cookie))
17
- raise 'invalid cookie' unless [data, data[:attributes], data[:state]].all? { |obj| obj.kind_of?(Hash) }
18
- data
19
- end
20
- )
25
+ # Load global datatables cookie
26
+ if @dt_cookie.present?
27
+ @dt_cookie = Marshal.load(Base64.decode64(@dt_cookie))
28
+ raise 'invalid datatables cookie' unless @dt_cookie.kind_of?(Array)
29
+
30
+ # Assign individual cookie
31
+ index = @dt_cookie.rindex { |name, _| name == cookie_name }
32
+ @cookie = @dt_cookie.delete_at(index)
33
+ end
34
+
35
+ # Load my individual cookie
36
+ if @cookie.kind_of?(Array)
37
+ @cookie = initial_state.keys.zip(@cookie.second).to_h
38
+ end
21
39
  end
22
40
 
23
41
  def save_cookie!
24
- todelete = view.cookies.map { |name, value| name if (name.start_with?('datatable-') && name != cookie_name) }.compact
25
- todelete.each { |name| view.cookies.delete(name) }
42
+ @dt_cookie ||= []
43
+ @dt_cookie << [cookie_name, cookie_payload]
44
+
45
+ while @dt_cookie.to_s.size > MAX_COOKIE_SIZE
46
+ @dt_cookie.shift((@dt_cookie.length / 3) + 1)
47
+ end
48
+
49
+ view.cookies.signed['_effective_dt'] = Base64.encode64(Marshal.dump(@dt_cookie))
50
+ end
51
+
52
+ def cookie_payload
53
+ payload = state.except(:attributes)
54
+
55
+ # Turn visible into a bitmask. This is undone in load_columns!
56
+ payload[:visible] = (
57
+ if columns.keys.length < 63 # 64-bit integer
58
+ columns.keys.map { |name| (2 ** columns[name][:index]) if state[:visible][name] }.compact.sum
59
+ end
60
+ )
26
61
 
27
- view.cookies.signed[cookie_name] = Base64.encode64(Marshal.dump(attributes: attributes, state: state))
62
+ # Just store the values
63
+ [attributes.delete_if { |k, v| v.nil? }] + payload.values
28
64
  end
29
65
 
30
66
  end
@@ -7,7 +7,7 @@ module Effective
7
7
  end
8
8
 
9
9
  def controller_namespace
10
- @attributes[:controller_namespace]
10
+ @attributes[:_n]
11
11
  end
12
12
 
13
13
  private
@@ -50,6 +50,7 @@ module Effective
50
50
  # This is called first. Our initial state is set.
51
51
  def initial_state
52
52
  {
53
+ attributes: {},
53
54
  filter: {},
54
55
  length: nil,
55
56
  order_name: nil,
@@ -84,7 +85,7 @@ module Effective
84
85
  if datatables_ajax_request?
85
86
  load_filter_params!
86
87
  load_ajax_state!
87
- elsif cookie.present? && cookie[:state][:params] == params.length
88
+ elsif cookie.present? && cookie[:params] == params.length
88
89
  load_cookie_state!
89
90
  else
90
91
  # Nothing to do for default state
@@ -123,11 +124,11 @@ module Effective
123
124
  state[:filter][name] = parse_filter_value(_filters[name], value)
124
125
  end
125
126
 
126
- state[:params] = cookie[:state][:params]
127
+ state[:params] = cookie[:params]
127
128
  end
128
129
 
129
130
  def load_cookie_state!
130
- @state = cookie[:state]
131
+ @state = cookie
131
132
  end
132
133
 
133
134
  def load_columns!
@@ -153,8 +154,14 @@ module Effective
153
154
  end
154
155
  end
155
156
 
156
- columns.each do |name, opts|
157
- state[:visible][name] = opts[:visible] unless state[:visible].key?(name)
157
+ # Load cookie bitmask
158
+ if state[:visible].kind_of?(Integer)
159
+ visible_mask = state[:visible] # bitmask
160
+ state[:visible] = {}
161
+ columns.each { |name, opts| state[:visible][name] = (visible_mask & (2 ** opts[:index])) != 0 }
162
+ else
163
+ state[:visible] = {} unless state[:visible].kind_of?(Hash)
164
+ columns.each { |name, opts| state[:visible][name] = opts[:visible] unless state[:visible].key?(name) }
158
165
  end
159
166
 
160
167
  unless datatables_ajax_request?
@@ -1,2 +1,2 @@
1
- %a.btn.btn-default.buttons-reset-cookie{'href' => '#', 'data-cookie-name' => datatable.cookie_name}
1
+ %a.btn.btn-default.buttons-reset-cookie{href: '#'}
2
2
  %span Reset
@@ -1,3 +1,3 @@
1
1
  module EffectiveDatatables
2
- VERSION = '3.0.1'.freeze
2
+ VERSION = '3.0.2'.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.0.1
4
+ version: 3.0.2
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: 2017-05-19 00:00:00.000000000 Z
11
+ date: 2017-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails