trk_datatables 0.1.2 → 0.1.3

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: 1b95bac52efa837430318bc3ef1f668ad3f328448d7f189f6b705253c5b6e538
4
- data.tar.gz: e29b7990c7e8534e29c7a444755a61a74a2c900f1ab57176a2ca5aa4be825a27
3
+ metadata.gz: 2a02c05387d75bc6ec793abce56ca69ab8924d4aab84339fa04740dce0b00ebd
4
+ data.tar.gz: b983241edd1da7ed12438608591b8acdb96b4704df3bc54eb2193e42b408d5ff
5
5
  SHA512:
6
- metadata.gz: 1cc6c6b47eabc5fa03058e6dee3de97337b2c5826b187a9b9e34805aaaf5ca4f4f3d61d6702277b5b0eafd8fbda2380b049b355ab3b11259ba2029d377c25911
7
- data.tar.gz: f21d79a8926b850c03bc203dd16c0edb771a284f6f3a1caae42aaddd06f2114c7c293972d562b00ba0cd73a53028a8630d7fe9aa06ee0ea95c03fd87058a6819
6
+ metadata.gz: 64fe2c03de96d9a0cf700c06a1b1bd2560190d6c14abefd066209280e165aab4eda90d0939bf0ee33befc2792fd4034b7be075fbadf1dd481fd9ecc9529adb42
7
+ data.tar.gz: 4b58ddb0471ea682dc5e3c1ca7e28051ac2f965d9687e01cdd1223038f52c7c47dcbfbdcf3959f687c3d3de5da529b9048277e27fae4d88e68844af7da457cb1
@@ -1,3 +1,5 @@
1
+ # CHANGELOG
2
+
1
3
  ## 0.1.0
2
4
 
3
5
  Add basic ActiveRecord sort and paginate filter
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trk_datatables (0.1.1)
4
+ trk_datatables (0.1.3)
5
5
  activesupport
6
6
 
7
7
  GEM
@@ -2,17 +2,17 @@ module TrkDatatables
2
2
  class ActiveRecord < Base
3
3
  # Global search. All columns are typecasted to string. Search string is
4
4
  # splited by space and "and"-ed.
5
- def filter_by_search_all(filtered_items)
5
+ def filter_by_search_all(filtered)
6
6
  conditions = @dt_params.search_all.split(' ').map do |search_string|
7
7
  @column_key_options.searchable_and_global_search.map do |column_key_option|
8
8
  filter_column_as_string column_key_option, search_string
9
9
  end.reduce(:or) # any searchable column is 'or'-ed
10
10
  end.reduce(:and) # 'and' for each search_string
11
11
 
12
- filtered_items.where conditions
12
+ filtered.where conditions
13
13
  end
14
14
 
15
- def filter_by_columns(filtered_items)
15
+ def filter_by_columns(filtered)
16
16
  conditions = @dt_params.dt_columns.each_with_object([]) do |dt_column, cond|
17
17
  next unless dt_column[:searchable] && dt_column[:search_value].present?
18
18
 
@@ -23,7 +23,7 @@ module TrkDatatables
23
23
  cond << build_condition_for_column(column_key_option, dt_column[:search_value])
24
24
  end.reduce(:and) # 'and' for each searchable column
25
25
 
26
- filtered_items.where conditions
26
+ filtered.where conditions
27
27
  end
28
28
 
29
29
  def build_condition_for_column(column_key_option, search_value)
@@ -71,43 +71,46 @@ module TrkDatatables
71
71
 
72
72
  def _parse_from_to(from, to, column_key_option)
73
73
  case column_key_option[:column_type_in_db]
74
- # when :integer, :float
75
- # we do not need to cast from string since range will do automatically
74
+ when :integer, :float
75
+ # we do not need to cast from string since range will do automatically
76
+ parsed_from = from
77
+ parsed_to = to
76
78
  when :date, :datetime
77
- from = _parse_in_zone(from) if from.present?
78
- if to.present?
79
- to = if to.include?('AM') || to.include?('PM')
80
- _parse_in_zone(to)
81
- else
82
- # we need to add one day since it looks at begining of a day 2010-10-10 00:00:00
83
- _parse_in_zone(to) + 60 * 60 * 24 - 1
84
- end
79
+ parsed_from = _parse_in_zone(from)
80
+ parsed_to = _parse_in_zone(to)
81
+ if parsed_to.present? && !to.match(/AM|PM/)
82
+ # we need to add one day since it looks at begining of a day 2010-10-10 00:00:00
83
+ parsed_to += 60 * 60 * 24 - 1
85
84
  end
86
85
  end
87
- [from, to]
86
+ [parsed_from, parsed_to]
88
87
  end
89
88
 
90
89
  # rubocop:disable Rails/TimeZone
91
90
  def _parse_in_zone(time)
91
+ return nil if time.blank?
92
+
92
93
  # without rails we will parse without zone so make sure params are correct
93
94
  Time.zone ? Time.zone.parse(time) : Time.parse(time)
95
+ rescue ArgumentError
96
+ nil
94
97
  end
95
98
  # rubocop:enable Rails/TimeZone
96
99
 
97
- def order_and_paginate_items(filtered_items)
98
- filtered_items = order_items filtered_items
99
- filtered_items = filtered_items.offset(@dt_params.dt_offset).limit(dt_per_page_or_default)
100
- filtered_items
100
+ def order_and_paginate_items(filtered)
101
+ filtered = order_items filtered
102
+ filtered = filtered.offset(@dt_params.dt_offset).limit(dt_per_page_or_default)
103
+ filtered
101
104
  end
102
105
 
103
- def order_items(filtered_items)
104
- order_by = dt_orders_or_default.each_with_object([]) do |dt_order, queries|
105
- column_key_option = @column_key_options[dt_order[:column_index]]
106
+ def order_items(filtered)
107
+ order_by = dt_orders_or_default_index_and_direction.each_with_object([]) do |(index, direction), queries|
108
+ column_key_option = @column_key_options[index]
106
109
  next if column_key_option[:column_options][ColumnKeyOptions::ORDER_OPTION] == false
107
110
 
108
- queries << "#{column_key_option[:column_key]} #{dt_order[:direction]}"
111
+ queries << "#{column_key_option[:column_key]} #{direction}"
109
112
  end
110
- filtered_items.order(Arel.sql(order_by.join(', ')))
113
+ filtered.order(Arel.sql(order_by.join(', ')))
111
114
  end
112
115
 
113
116
  def _arel_column(column_key_option)
@@ -1,20 +1,20 @@
1
1
  module TrkDatatables
2
2
  BETWEEN_SEPARATOR = ' - '.freeze
3
3
  MULTIPLE_OPTION_SEPARATOR = '|'.freeze
4
- DEFAULT_ORDER = [{ column_index: 0, direction: :desc }].freeze
4
+ DEFAULT_ORDER = [[0, :desc]].freeze
5
5
  DEFAULT_PAGE_LENGTH = 10
6
6
 
7
7
  class Error < StandardError
8
8
  end
9
9
 
10
10
  class Base
11
- include TrkDatatables::Preferences
12
11
  attr_accessor :column_key_options
13
12
 
14
13
  def initialize(view)
15
14
  @view = view
16
15
  @dt_params = DtParams.new view.params
17
16
  @column_key_options = ColumnKeyOptions.new columns, global_search_columns
17
+ @preferences = Preferences.new preferences_holder, preferences_field
18
18
 
19
19
  # if @dt_params.dt_columns.size != @column_key_options.size
20
20
  # raise Error, "dt_columns size of columns is #{@dt_params.dt_columns.size} \
@@ -93,19 +93,21 @@ module TrkDatatables
93
93
  raise 'order_and_paginate_items_is_defined_in_specific_orm'
94
94
  end
95
95
 
96
- # Returns dt_orders or default
96
+ # Returns dt_orders or default as array of index and direction
97
+ # https://datatables.net/reference/option/order
97
98
  # @return
98
99
  # [
99
- # { column_index: 0, direction: :desc },
100
+ # [0, :desc],
100
101
  # ]
101
- def dt_orders_or_default
102
+ def dt_orders_or_default_index_and_direction
102
103
  return @dt_orders_or_default if defined? @dt_orders_or_default
103
104
 
104
105
  if @dt_params.dt_orders.present?
105
106
  @dt_orders_or_default = @dt_params.dt_orders
106
- set_preference :order, @dt_params.dt_orders
107
+ @preferences.set :order, @dt_params.dt_orders
107
108
  else
108
- @dt_orders_or_default = get_preference(:order) || DEFAULT_ORDER
109
+ check_value = ->(r) { r.is_a?(Array) && r[0].is_a?(Array) && r[0][0].is_a?(Integer) }
110
+ @dt_orders_or_default = @preferences.get(:order, check_value) || DEFAULT_ORDER
109
111
  end
110
112
  @dt_orders_or_default
111
113
  end
@@ -115,10 +117,10 @@ module TrkDatatables
115
117
 
116
118
  @dt_per_page_or_default = \
117
119
  if @dt_params.dt_per_page.present?
118
- set_preference :per_page, @dt_params.dt_per_page
120
+ @preferences.set :per_page, @dt_params.dt_per_page
119
121
  @dt_params.dt_per_page
120
122
  else
121
- get_preference(:per_page) || DEFAULT_PAGE_LENGTH
123
+ @preferences.get(:per_page) || DEFAULT_PAGE_LENGTH
122
124
  end
123
125
  end
124
126
 
@@ -164,7 +166,6 @@ module TrkDatatables
164
166
  def as_json(_attr = nil)
165
167
  # get the value if it is not a relation
166
168
  all_count = all_items.count
167
- filtered_items = filter_by_search_all filter_by_columns all_items
168
169
  @dt_params.as_json(
169
170
  all_count,
170
171
  filtered_items.count,
@@ -172,6 +173,10 @@ module TrkDatatables
172
173
  )
173
174
  end
174
175
 
176
+ def filtered_items
177
+ filter_by_search_all filter_by_columns all_items
178
+ end
179
+
175
180
  def ordered_paginated_filtered_items
176
181
  order_and_paginate_items filter_by_search_all filter_by_columns all_items
177
182
  end
@@ -188,5 +193,22 @@ module TrkDatatables
188
193
  render = RenderHtml.new(search_link, self, html_options)
189
194
  render.result
190
195
  end
196
+
197
+ # Override this to set model where you can store order, index, page length
198
+ # @example
199
+ # def preferences_holder
200
+ # @view.current_user
201
+ # end
202
+ def preferences_holder
203
+ nil
204
+ end
205
+
206
+ # Override if you use different than :preferences
207
+ # You can generate with this command:
208
+ # @code
209
+ # rails g migration add_preferences_to_users preferences:jsonb
210
+ def preferences_field
211
+ :preferences
212
+ end
191
213
  end
192
214
  end
@@ -26,12 +26,12 @@ module TrkDatatables
26
26
  # (dt_offset / dt_per_page) + 1
27
27
  # end
28
28
 
29
- # Typecast so we can safelly use dt_order[:column_index] (Integer) and
30
- # dt_order[:direction] (:asc/:desc)
29
+ # Typecast so we can safelly use dt_order[0] (Integer) and
30
+ # dt_order[1] (:asc/:desc)
31
31
  # @return
32
32
  # [
33
- # { column_index: 2, direction: :asc }.
34
- # { column_index: 1, direction: :desc },
33
+ # [ 2, :asc ],
34
+ # [ 1, :desc ],
35
35
  # ]
36
36
  def dt_orders
37
37
  return @dt_orders if defined? @dt_orders
@@ -41,11 +41,11 @@ module TrkDatatables
41
41
 
42
42
  @dt_orders = \
43
43
  @params[:order].each_with_object([]) do |(_index, dt_order), a|
44
- # for order we ignore key (index) since order is preserved
45
- a << {
46
- column_index: dt_order[:column].to_i,
47
- direction: dt_order[:dir]&.to_s&.casecmp('ASC')&.zero? ? :asc : :desc,
48
- }
44
+ # for order we ignore key (_index) since order is preserved
45
+ a << [
46
+ dt_order[:column].to_i,
47
+ dt_order[:dir]&.to_s&.casecmp('ASC')&.zero? ? :asc : :desc,
48
+ ]
49
49
  end
50
50
  @dt_orders
51
51
  end
@@ -1,35 +1,28 @@
1
1
  module TrkDatatables
2
- module Preferences
3
- # Override this to set model where you can store order, index, page length
4
- # @example
5
- # def preferences_holder
6
- # @view.current_user
7
- # end
8
- def preferences_holder
9
- nil
2
+ class Preferences
3
+ def initialize(holder, field)
4
+ @holder = holder
5
+ @field = field
10
6
  end
11
7
 
12
- # Override if you use different than :preferences
13
- # You can generate with this command:
14
- # @code
15
- # rails g migration add_preferences_to_users preferences:jsonb
16
- def preferences_field
17
- :preferences
18
- end
19
-
20
- def get_preference(key)
21
- return unless preferences_holder
8
+ # Get the key from holder
9
+ # Use check_value proc to ignore wrong format. This is usefull when you
10
+ # change format and you do not want to clear all existing values
11
+ def get(key, check_value = nil)
12
+ return unless @holder
22
13
 
23
- preferences_holder.send(preferences_field).dig :dt_preferences, self.class.name, key
14
+ result = @holder.send(@field).dig :dt_preferences, self.class.name, key
15
+ return result if check_value.nil?
16
+ return result if check_value.call result
24
17
  end
25
18
 
26
- def set_preference(key, value)
27
- return unless preferences_holder
19
+ def set(key, value)
20
+ return unless @holder
28
21
 
29
22
  h = { dt_preferences: { self.class.name => { key => value } } }
30
- preferences_holder.send("#{preferences_field}=", {}) if preferences_holder.send(preferences_field).nil?
31
- preferences_holder.send(preferences_field).deep_merge! h
32
- preferences_holder.save!
23
+ @holder.send("#{@field}=", {}) if @holder.send(@field).nil?
24
+ @holder.send(@field).deep_merge! h
25
+ @holder.save!
33
26
  end
34
27
  end
35
28
  end
@@ -85,10 +85,10 @@ module TrkDatatables
85
85
  'data-datatable': true,
86
86
  'data-datatable-ajax-url': @search_link,
87
87
  'data-datatable-page-length': @datatable.dt_per_page_or_default,
88
- 'data-datatable-order': (@datatable.dt_orders_or_default.map do |dt_order|
89
- [dt_order[:column_index], dt_order[:direction].to_s.html_safe]
90
- end).to_json, # TODO: legacy, better is to use simple @datatable.dt_orders_or_default.to_json
91
- 'data-datatable-total-length': @datatable.all_items.count
88
+ 'data-datatable-order': @datatable.dt_orders_or_default_index_and_direction.to_json,
89
+ # for initial page load we do not have ability to show recordsTotal
90
+ # https://github.com/trkin/trk_datatables_js/issues/1
91
+ 'data-datatable-total-length': @datatable.filtered_items.count,
92
92
  ) do
93
93
  thead << "\n".html_safe << tbody
94
94
  end
@@ -1,3 +1,3 @@
1
1
  module TrkDatatables
2
- VERSION = '0.1.2'.freeze
2
+ VERSION = '0.1.3'.freeze
3
3
  end
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.metadata['homepage_uri'] = spec.homepage
23
23
  spec.metadata['source_code_uri'] = 'https://github.com/trkin/trk_datatables'
24
- spec.metadata['changelog_uri'] = 'https://github.com/trkin/trk_datatables/CHANGELOG.md'
24
+ spec.metadata['changelog_uri'] = 'https://github.com/trkin/trk_datatables/blob/master/CHANGELOG.md'
25
25
  spec.metadata['yard.run'] = 'yri' # use "yard" to build full HTML docs.
26
26
  else
27
27
  raise 'RubyGems 2.0 or newer is required to protect against ' \
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trk_datatables
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dusan Orlovic
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-28 00:00:00.000000000 Z
11
+ date: 2019-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -185,7 +185,7 @@ metadata:
185
185
  allowed_push_host: https://rubygems.org
186
186
  homepage_uri: https://github.com/trkin/trk_datatables
187
187
  source_code_uri: https://github.com/trkin/trk_datatables
188
- changelog_uri: https://github.com/trkin/trk_datatables/CHANGELOG.md
188
+ changelog_uri: https://github.com/trkin/trk_datatables/blob/master/CHANGELOG.md
189
189
  yard.run: yri
190
190
  post_install_message:
191
191
  rdoc_options: []