trk_datatables 0.1.23 → 0.1.24
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +26 -17
- data/lib/trk_datatables/active_record.rb +9 -2
- data/lib/trk_datatables/column_key_options.rb +14 -7
- data/lib/trk_datatables/dt_params.rb +2 -2
- data/lib/trk_datatables/preferences.rb +1 -1
- data/lib/trk_datatables/render_html.rb +5 -6
- data/lib/trk_datatables/version.rb +1 -1
- data/trk_datatables.gemspec +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63b484a61536f738a27bc1011d30e4e51f784f07468f13b66ad18912137159a1
|
4
|
+
data.tar.gz: 85d5c270f493090bcb6c0f177d2b71c26fa950adb181a6268747adf05491bc91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f0e940deeb4eebc8e227080a51e95c84f5038b54f00186bd273ac771abac4672d5c7cf262ce12cd653d22328c38f2a8bedf53f8b5f6deb50143233b1dc65349
|
7
|
+
data.tar.gz: eb84cc60601fd30ec87bcaf5c6c3812688ca0d15b7a53ea19f73a06290865fdbe0d72dcb62f7d1e4cdd52cd20fc7c538bbfe037b36e385629b0ad2ab80b1ee3c
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -5,10 +5,10 @@ used with [trk_datatables npm package](https://www.npmjs.com/package/trk_datatab
|
|
5
5
|
|
6
6
|
Instead of using Rails scaffold generator you can use advanced [Datatables plug-in for jQuery library](https://datatables.net).
|
7
7
|
|
8
|
-
After [few lines of code](https://github.com/trkin/trk_datatables#installation)
|
9
|
-
one line commands `@datatable.render_html` to generate index page
|
10
|
-
global search, filtering and sorting, first page is prerendered
|
11
|
-
crawlers can see it), adding map and other interesting features.
|
8
|
+
After [few lines of code](https://github.com/trkin/trk_datatables#installation)
|
9
|
+
you can use one line commands `@datatable.render_html` to generate index page
|
10
|
+
that supports: global search, filtering and sorting, first page is prerendered
|
11
|
+
(so non-js crawlers can see it), adding map and other interesting features.
|
12
12
|
|
13
13
|
So instead of basic Rails scaffold with a lot of html code
|
14
14
|
|
@@ -26,13 +26,19 @@ You can get something like
|
|
26
26
|
* [Usage example in Ruby on Rails](#usage-example-in-ruby-on-rails)
|
27
27
|
* [Configuration](#configuration)
|
28
28
|
* [Global search](#global-search)
|
29
|
-
* [Column 'ILIKE'
|
30
|
-
* [Column '
|
31
|
-
* [
|
29
|
+
* [Column 'ILIKE' search with text input](#column-ilike-search-with-text-input)
|
30
|
+
* [Column 'BETWEEN' search with js daterangepicker](#column-between-search-with-js-daterangepicker)
|
31
|
+
* [Column 'IN' search with select tag](#column-in-search-with-select-tag)
|
32
|
+
* [Boolean column with checkbox](#boolean-column-with-checkbox)
|
33
|
+
* [Action and non database columns](#action-and-non-database-columns)
|
34
|
+
* [Values calculated in database](#values-calculated-in-database)
|
35
|
+
* [Default order and page length](#default-order-and-page-length)
|
32
36
|
* [Params](#params)
|
33
37
|
* [Saved Preferences (optional)](#saved-preferences-optional)
|
34
38
|
* [Additional data to json response](#additional-data-to-json-response)
|
35
39
|
* [Different response for mobile app](#different-response-for-mobile-app)
|
40
|
+
* [Test your datatables](#test-your-datatables)
|
41
|
+
* [Exceptions](#exceptions)
|
36
42
|
* [Debug](#debug)
|
37
43
|
* [Alternatives](#alternatives)
|
38
44
|
* [Development](#development)
|
@@ -40,7 +46,7 @@ You can get something like
|
|
40
46
|
* [License](#license)
|
41
47
|
* [Code of Conduct](#code-of-conduct)
|
42
48
|
|
43
|
-
<!-- Added by: orlovic, at:
|
49
|
+
<!-- Added by: orlovic, at: Sat Aug 29 05:26:19 CEST 2020 -->
|
44
50
|
|
45
51
|
<!--te-->
|
46
52
|
|
@@ -207,9 +213,10 @@ class PostsDatatable < TrkDatatables::ActiveRecord
|
|
207
213
|
end
|
208
214
|
```
|
209
215
|
|
210
|
-
### Column 'ILIKE' search
|
216
|
+
### Column 'ILIKE' search with text input
|
211
217
|
|
212
|
-
All columns are by default casted to string
|
218
|
+
All columns are by default casted to `:string` (you can manually cast with
|
219
|
+
`column_type_in_db: :string`) and `ILIKE` is perfomed.
|
213
220
|
|
214
221
|
If you do not need any specific column configuration,
|
215
222
|
for example custom `title`, than instead of defining columns as key/value
|
@@ -244,7 +251,7 @@ For specific columns you can use following keys
|
|
244
251
|
* `class_name: 'Admin::User'` use different class name than
|
245
252
|
`table_name.classify` (in this case of `admin_users` will be `AdminUser`)
|
246
253
|
|
247
|
-
### Column 'BETWEEN' search
|
254
|
+
### Column 'BETWEEN' search with js daterangepicker
|
248
255
|
|
249
256
|
For column search when search string contains BETWEEN_SEPARATOR (` - `) and
|
250
257
|
column_type_in_db as one of the: `:date`, `:datetime`, `:integer` and
|
@@ -315,7 +322,7 @@ We use
|
|
315
322
|
[ActiveSupport::TimeZone](https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html)
|
316
323
|
so if you use different than UTC you need to set `Time.zone =` in your app [example values](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/values/time_zone.rb#L31). Whenever Time.parse is used (and we use `Time.zone.parse` for params) it needs correct zone (in Rails you can set timezone in `config.time_zone` or use [browser timezone rails gem](https://github.com/kbaum/browser-timezone-rails)).
|
317
324
|
|
318
|
-
### Column 'IN' search
|
325
|
+
### Column 'IN' search with select tag
|
319
326
|
|
320
327
|
You can use column_option `select_options: [['name1', 'value1']]` so select box
|
321
328
|
will be loaded and match if `col IN (value1|value2)`.
|
@@ -333,9 +340,11 @@ link_to 'Active', search_posts_path(PostsDatatable.param_set('posts.status':
|
|
333
340
|
Post.statues.values_at(:published, :promoted)))
|
334
341
|
```
|
335
342
|
|
336
|
-
|
337
|
-
|
338
|
-
|
343
|
+
### Boolean column with checkbox
|
344
|
+
|
345
|
+
For column_type_in_db `:boolean` it will generate checkbox and use
|
346
|
+
http://vanderlee.github.io/tristate/ so you can filter for `true`, `false` or
|
347
|
+
`any` (in this case we ignore this column in filtering)
|
339
348
|
|
340
349
|
### Action and non database columns
|
341
350
|
|
@@ -583,7 +592,7 @@ class PostsDatatableTest < ActiveSupport::TestCase
|
|
583
592
|
end
|
584
593
|
```
|
585
594
|
|
586
|
-
|
595
|
+
## Exceptions
|
587
596
|
|
588
597
|
To catch errors from TrkDatables you can
|
589
598
|
|
@@ -627,7 +636,7 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
627
636
|
rake
|
628
637
|
# specific file
|
629
638
|
ruby -I test test/trk_datatables/base_test.rb
|
630
|
-
#
|
639
|
+
# specific test that matches additional
|
631
640
|
ruby -I test test/trk_datatables/base_test.rb -n /additional/
|
632
641
|
```
|
633
642
|
|
@@ -33,6 +33,8 @@ module TrkDatatables
|
|
33
33
|
select_options = column_key_option[:column_options][ColumnKeyOptions::SELECT_OPTIONS]
|
34
34
|
if select_options.present?
|
35
35
|
filter_column_as_in(column_key_option, search_value)
|
36
|
+
elsif %i[boolean].include?(column_key_option[:column_type_in_db])
|
37
|
+
filter_column_as_boolean(column_key_option, search_value)
|
36
38
|
elsif %i[date datetime integer float].include?(column_key_option[:column_type_in_db]) && \
|
37
39
|
search_value.include?(BETWEEN_SEPARATOR)
|
38
40
|
from, to = search_value.split BETWEEN_SEPARATOR
|
@@ -52,6 +54,13 @@ module TrkDatatables
|
|
52
54
|
end.reduce(:and)
|
53
55
|
end
|
54
56
|
|
57
|
+
def filter_column_as_boolean(column_key_option, search_value)
|
58
|
+
# return true relation in case we ignore
|
59
|
+
return Arel::Nodes::SqlLiteral.new('1').eq(1) if search_value == 'any'
|
60
|
+
|
61
|
+
_arel_column(column_key_option).eq(search_value == 'true')
|
62
|
+
end
|
63
|
+
|
55
64
|
def filter_column_as_between(column_key_option, from, to)
|
56
65
|
from, to = _parse_from_to(from, to, column_key_option)
|
57
66
|
if from.present? && to.present?
|
@@ -86,7 +95,6 @@ module TrkDatatables
|
|
86
95
|
[parsed_from, parsed_to]
|
87
96
|
end
|
88
97
|
|
89
|
-
# rubocop:disable Rails/TimeZone
|
90
98
|
def _parse_in_zone(time)
|
91
99
|
return nil if time.blank?
|
92
100
|
|
@@ -95,7 +103,6 @@ module TrkDatatables
|
|
95
103
|
rescue ArgumentError
|
96
104
|
nil
|
97
105
|
end
|
98
|
-
# rubocop:enable Rails/TimeZone
|
99
106
|
|
100
107
|
def order_and_paginate_items(filtered)
|
101
108
|
filtered = order_items filtered
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module TrkDatatables
|
2
|
-
# rubocop:disable ClassLength
|
2
|
+
# rubocop:disable Metrics/ClassLength
|
3
3
|
class ColumnKeyOptions
|
4
4
|
include Enumerable
|
5
5
|
|
@@ -16,6 +16,7 @@ module TrkDatatables
|
|
16
16
|
ORDER_OPTION = :order
|
17
17
|
TITLE_OPTION = :title
|
18
18
|
SELECT_OPTIONS = :select_options
|
19
|
+
CHECKBOX_OPTION = :checkbox_option
|
19
20
|
PREDEFINED_RANGES = :predefined_ranges
|
20
21
|
HIDE_OPTION = :hide
|
21
22
|
CLASS_NAME = :class_name
|
@@ -23,9 +24,11 @@ module TrkDatatables
|
|
23
24
|
# this will load date picker
|
24
25
|
# SEARCH_OPTION_DATE_VALUE = :date
|
25
26
|
# SEARCH_OPTION_DATETIME_VALUE = :datetime
|
26
|
-
COLUMN_OPTIONS = [
|
27
|
-
|
28
|
-
|
27
|
+
COLUMN_OPTIONS = [
|
28
|
+
SEARCH_OPTION, ORDER_OPTION, TITLE_OPTION, SELECT_OPTIONS,
|
29
|
+
CHECKBOX_OPTION, PREDEFINED_RANGES, HIDE_OPTION, CLASS_NAME,
|
30
|
+
COLUMN_TYPE_IN_DB
|
31
|
+
].freeze
|
29
32
|
|
30
33
|
# for columns that as calculated in db query
|
31
34
|
STRING_CALCULATED_IN_DB = :string_calculcated_in_db
|
@@ -96,7 +99,10 @@ module TrkDatatables
|
|
96
99
|
else
|
97
100
|
table_class = _determine_table_class table_name, column_options[CLASS_NAME]
|
98
101
|
|
99
|
-
|
102
|
+
unless column_options[SEARCH_OPTION] == false && column_options[ORDER_OPTION] == false
|
103
|
+
column_type_in_db = column_options[COLUMN_TYPE_IN_DB] || _determine_db_type_for_column(table_class, column_name)
|
104
|
+
column_options[CHECKBOX_OPTION] = true if column_type_in_db == :boolean && column_options[CHECKBOX_OPTION].nil?
|
105
|
+
end
|
100
106
|
end
|
101
107
|
arr << {
|
102
108
|
column_key: column_key.to_sym,
|
@@ -208,10 +214,11 @@ module TrkDatatables
|
|
208
214
|
res['data-searchable'] = false if column_options[SEARCH_OPTION] == false
|
209
215
|
res['data-orderable'] = false if column_options[ORDER_OPTION] == false
|
210
216
|
res['data-datatable-hidden-column'] = true if column_options[HIDE_OPTION] == true
|
217
|
+
res['data-datatable-checkbox'] = true if column_options[CHECKBOX_OPTION] == true
|
211
218
|
if %i[date datetime].include? column_type_in_db
|
212
219
|
res['data-datatable-range'] = column_type_in_db == :datetime ? :datetime : true
|
213
220
|
if column_options[PREDEFINED_RANGES].present? ||
|
214
|
-
|
221
|
+
(@predefined_ranges.present? && column_options[PREDEFINED_RANGES] != false)
|
215
222
|
res['data-datatable-predefined-ranges'] = if column_options[PREDEFINED_RANGES].is_a? Hash
|
216
223
|
column_options[PREDEFINED_RANGES]
|
217
224
|
else
|
@@ -225,5 +232,5 @@ module TrkDatatables
|
|
225
232
|
res
|
226
233
|
end
|
227
234
|
end
|
228
|
-
# rubocop:enable ClassLength
|
235
|
+
# rubocop:enable Metrics/ClassLength
|
229
236
|
end
|
@@ -107,7 +107,7 @@ module TrkDatatables
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def self.param_set(column_index, value)
|
110
|
-
{
|
110
|
+
{columns: {column_index.to_s => {search: {value: value}}}}
|
111
111
|
end
|
112
112
|
|
113
113
|
def self.form_field_name(column_index)
|
@@ -135,7 +135,7 @@ module TrkDatatables
|
|
135
135
|
value: '', regex: 'false'
|
136
136
|
},
|
137
137
|
order: {
|
138
|
-
'0': {
|
138
|
+
'0': {column: '0', dir: 'desc'}
|
139
139
|
},
|
140
140
|
# [:columns] should have the same size as column_key_options since we
|
141
141
|
# ignore keys, and use positions
|
@@ -21,7 +21,7 @@ module TrkDatatables
|
|
21
21
|
def set(key, value)
|
22
22
|
return unless @holder
|
23
23
|
|
24
|
-
h = {
|
24
|
+
h = {KEY_IN_PREFERENCES => {@class_name => {key => value}}}
|
25
25
|
@holder.send("#{@field}=", {}) if @holder.send(@field).nil?
|
26
26
|
@holder.send(@field).deep_merge! h
|
27
27
|
@holder.save!
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module TrkDatatables
|
2
|
-
# rubocop:disable Rails/OutputSafety
|
3
2
|
class RenderHtml
|
4
3
|
@indent = 0
|
5
4
|
def initialize(search_link, datatable, html_options = {})
|
@@ -28,7 +27,7 @@ module TrkDatatables
|
|
28
27
|
array.map { |i| ERB::Util.unwrapped_html_escape(i) }.join(sep).html_safe
|
29
28
|
end
|
30
29
|
|
31
|
-
# rubocop:disable Metrics/AbcSize
|
30
|
+
# rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
|
32
31
|
#
|
33
32
|
# _content_tag :p, 'Hi'
|
34
33
|
# _content_tag :p, class: 'button', 'Hi'
|
@@ -57,13 +56,13 @@ module TrkDatatables
|
|
57
56
|
self.class.indent -= 1
|
58
57
|
html
|
59
58
|
end
|
60
|
-
# rubocop:enable Metrics/AbcSize
|
59
|
+
# rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity
|
61
60
|
|
62
61
|
def _select_tag(options, search_value)
|
63
62
|
selected = search_value.to_s.split(MULTIPLE_OPTION_SEPARATOR)
|
64
63
|
_content_tag :select, multiple: 'multiple' do
|
65
64
|
safe_join(options.map do |key, value|
|
66
|
-
_content_tag :option, {
|
65
|
+
_content_tag :option, {value: value}.merge(selected.include?(value.to_s) ? {selected: 'selected'} : {}), key
|
67
66
|
end)
|
68
67
|
end
|
69
68
|
end
|
@@ -93,7 +92,8 @@ module TrkDatatables
|
|
93
92
|
'data-datatable-total-length': @datatable.filtered_items_count,
|
94
93
|
) do
|
95
94
|
thead << "\n".html_safe << tbody
|
96
|
-
end
|
95
|
+
end +
|
96
|
+
"\n" # add new line at the end so we can test with HERE_DOC </table>
|
97
97
|
end
|
98
98
|
|
99
99
|
def thead
|
@@ -132,5 +132,4 @@ module TrkDatatables
|
|
132
132
|
''
|
133
133
|
end
|
134
134
|
end
|
135
|
-
# rubocop:enable Rails/OutputSafety
|
136
135
|
end
|
data/trk_datatables.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['Dusan Orlovic']
|
10
10
|
spec.email = ['duleorlovic@gmail.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
12
|
+
spec.summary = 'Gem that simplify using datatables with Ruby on Rails and Sinatra.'
|
13
|
+
spec.description = 'Html render first page, sort and filter...'
|
14
14
|
spec.homepage = 'https://github.com/trkin/trk_datatables'
|
15
15
|
spec.license = 'MIT'
|
16
16
|
|
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.
|
4
|
+
version: 0.1.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dusan Orlovic
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-08-
|
11
|
+
date: 2020-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|