trk_datatables 0.1.11 → 0.1.12
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 +61 -10
- data/lib/trk_datatables/base.rb +20 -15
- data/lib/trk_datatables/column_key_options.rb +3 -1
- data/lib/trk_datatables/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 689f7693808d3e9a2401c9b6fdbb6481b8d2d642e31064eb2f38e704ed95c5a2
|
4
|
+
data.tar.gz: b5f6ba211d7fcec99e9025a51bd0f6fc83d69ee3e10eeb6e1df10f2c41ddf3e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 566e9b5010b7b75bb0a1cc4ee3adf937a9cdfde97826007665a4e4b5edf80d4a970a1705700e66bf30a3c629da5bc3da66a069858e3670343284f66075b06d90
|
7
|
+
data.tar.gz: '08e33268ee12bb569476fafb899c8938ef7b272d3ea7272e4c851113ffde0b6fba94630f6363dd61e874f465622ab94c9fff638b7ab48c186c8c21a96c127fcc'
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -141,20 +141,39 @@ end
|
|
141
141
|
|
142
142
|
### Column 'ILIKE' search
|
143
143
|
|
144
|
-
All columns are by default
|
145
|
-
|
146
|
-
|
147
|
-
|
144
|
+
All columns are by default casted to string and `ILIKE` is perfomed.
|
145
|
+
|
146
|
+
If you do not need any specific column configuration,
|
147
|
+
for example custom `title`, than instead of defining columns as key/value
|
148
|
+
pairs, you can define them in one line as array of column_key.
|
148
149
|
|
149
150
|
```
|
150
151
|
# app/datatables/posts_datatable.rb
|
151
152
|
class PostsDatatable < TrkDatatables::ActiveRecord
|
152
153
|
def columns
|
153
|
-
#
|
154
|
+
# instead of
|
155
|
+
# {
|
156
|
+
# id: {},
|
157
|
+
# title: {},
|
158
|
+
# body: {},
|
159
|
+
# }.each_with_object({}) { |(key, value), obj| obj["posts.#{key}"] = value }
|
160
|
+
# you can use one liner
|
161
|
+
# %w[posts.id posts.title posts.body]
|
162
|
+
# or even shorter using map
|
154
163
|
%i[id title body].map { |col| "posts.#{col}" }
|
155
164
|
end
|
156
165
|
end
|
157
166
|
```
|
167
|
+
|
168
|
+
For specific columns you can use following keys
|
169
|
+
|
170
|
+
* `title: 'My Title'` set up column header
|
171
|
+
* `search: false` disable searching for this column
|
172
|
+
* `order: false` disable ordering for this column
|
173
|
+
* `predefined_ranges: {}` add ranges for datetime fields
|
174
|
+
* `select_options: Post.statuses` generate select box
|
175
|
+
* `hide: true` hide column
|
176
|
+
|
158
177
|
### Column 'BETWEEN' search
|
159
178
|
|
160
179
|
For column search when search string contains BETWEEN_SEPARATOR (` - `) and
|
@@ -240,7 +259,7 @@ def columns
|
|
240
259
|
end
|
241
260
|
|
242
261
|
# in view
|
243
|
-
link_to 'Active', search_posts_path(PostsDatatable.
|
262
|
+
link_to 'Active', search_posts_path(PostsDatatable.param_set('posts.status':
|
244
263
|
Post.statues.values_at(:published, :promoted)))
|
245
264
|
```
|
246
265
|
|
@@ -272,20 +291,43 @@ use empty column_key
|
|
272
291
|
end
|
273
292
|
```
|
274
293
|
|
294
|
+
### Default order and page length
|
295
|
+
|
296
|
+
You can override default order (index and direction) and default page length so
|
297
|
+
if user did not request some order or page length (and if it is not found in
|
298
|
+
save preferences) and this default values will be used
|
299
|
+
|
300
|
+
```
|
301
|
+
# app/datatables/posts_datatable.rb
|
302
|
+
class PostsDatatable
|
303
|
+
# when we show some invoice_no on first column, and that is reset every year
|
304
|
+
# on first april, thatn it is better is to use date column ordering
|
305
|
+
def default_order
|
306
|
+
[[3, :desc]]
|
307
|
+
end
|
308
|
+
|
309
|
+
def default_page_length
|
310
|
+
20
|
311
|
+
end
|
312
|
+
end
|
313
|
+
```
|
314
|
+
|
275
315
|
### Params
|
276
316
|
|
277
317
|
To set parameters that you can use for links to set column search value, use
|
278
318
|
this `PostsDatatable.param_set` for example
|
279
319
|
|
280
320
|
```
|
281
|
-
link_to '
|
321
|
+
link_to 'Active posts for my@email.com', \
|
282
322
|
posts_path(
|
283
|
-
PostsDatatable.
|
284
|
-
.
|
323
|
+
PostsDatatable.param_set('users.email', 'my@email.com')
|
324
|
+
.deep_merge(PostsDatatable.param_set('posts.status', Post.statuses.values_at(:published, :promoted))
|
325
|
+
.deep_merge(user_id: 1)
|
285
326
|
)
|
286
|
-
# will generate
|
287
327
|
```
|
288
328
|
|
329
|
+
This will fill proper column search values so you do not need to do it manually (`post_path(:columns=>{"3"=>{:search=>{:value=>"my@email.com"}}, "2"=>{:search=>{:value=>"1|2"}}}, :user_id=>1)`)
|
330
|
+
|
289
331
|
If you need, you can fetch params with this helper
|
290
332
|
|
291
333
|
```
|
@@ -420,6 +462,15 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
420
462
|
|
421
463
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
422
464
|
|
465
|
+
Instead of installing you can point directly to your path
|
466
|
+
```
|
467
|
+
# Gemfile
|
468
|
+
# for index, ordering, pagination and searching
|
469
|
+
# gem 'trk_datatables', '~>0.1'
|
470
|
+
# no need to `bundle update trk_datatables` when switch to local
|
471
|
+
gem 'trk_datatables', path: '~/gems/trk_datatables'
|
472
|
+
```
|
473
|
+
|
423
474
|
To generate docs you can run
|
424
475
|
|
425
476
|
```
|
data/lib/trk_datatables/base.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module TrkDatatables
|
2
|
+
# TODO: extract those to configuration options
|
2
3
|
BETWEEN_SEPARATOR = ' - '.freeze
|
3
4
|
MULTIPLE_OPTION_SEPARATOR = '|'.freeze
|
4
|
-
|
5
|
-
DEFAULT_PAGE_LENGTH = 10
|
5
|
+
# maximum page length = 100 (we should not believe params)
|
6
6
|
|
7
7
|
class Error < StandardError
|
8
8
|
end
|
@@ -109,11 +109,19 @@ module TrkDatatables
|
|
109
109
|
@preferences.set :order, @dt_params.dt_orders
|
110
110
|
else
|
111
111
|
check_value = ->(r) { r.is_a?(Array) && r[0].is_a?(Array) && r[0][0].is_a?(Integer) }
|
112
|
-
@dt_orders_or_default = @preferences.get(:order, check_value) ||
|
112
|
+
@dt_orders_or_default = @preferences.get(:order, check_value) || default_order
|
113
113
|
end
|
114
114
|
@dt_orders_or_default
|
115
115
|
end
|
116
116
|
|
117
|
+
def default_order
|
118
|
+
[[0, :desc]].freeze
|
119
|
+
end
|
120
|
+
|
121
|
+
def default_page_length
|
122
|
+
10
|
123
|
+
end
|
124
|
+
|
117
125
|
def dt_per_page_or_default
|
118
126
|
return @dt_per_page_or_default if defined? @dt_per_page_or_default
|
119
127
|
|
@@ -122,7 +130,7 @@ module TrkDatatables
|
|
122
130
|
@preferences.set :per_page, @dt_params.dt_per_page
|
123
131
|
@dt_params.dt_per_page
|
124
132
|
else
|
125
|
-
@preferences.get(:per_page) ||
|
133
|
+
@preferences.get(:per_page) || default_page_length
|
126
134
|
end
|
127
135
|
end
|
128
136
|
|
@@ -134,23 +142,20 @@ module TrkDatatables
|
|
134
142
|
# posts_path(PostsDatatable.params('posts.status': :published,
|
135
143
|
# 'users.email: 'my@email.com')
|
136
144
|
#
|
137
|
-
# You can always use your params for filtering outside of datatable
|
145
|
+
# You can always use your params for filtering outside of datatable and
|
146
|
+
# merge to params
|
138
147
|
# @example
|
139
148
|
# link_to 'Published posts for user1',
|
140
|
-
# posts_path(PostsDatatable.
|
141
|
-
def self.
|
149
|
+
# posts_path(PostsDatatable.param_set('posts.status', :published).merge(user_id: user1.id))
|
150
|
+
def self.param_set(column_key, value)
|
142
151
|
datatable = new OpenStruct.new(params: {})
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
column_index = datatable.index_by_column_key column_key
|
147
|
-
result = result.deep_merge DtParams.param_set column_index, value
|
148
|
-
end
|
149
|
-
result
|
152
|
+
value = value.join MULTIPLE_OPTION_SEPARATOR if value.is_a? Array
|
153
|
+
column_index = datatable.index_by_column_key column_key
|
154
|
+
DtParams.param_set column_index, value
|
150
155
|
end
|
151
156
|
|
152
157
|
# We need this method publicly available since we use it for class method
|
153
|
-
#
|
158
|
+
# param_set
|
154
159
|
def index_by_column_key(column_key)
|
155
160
|
@column_key_options.index_by_column_key column_key
|
156
161
|
end
|
@@ -17,10 +17,11 @@ module TrkDatatables
|
|
17
17
|
TITLE_OPTION = :title
|
18
18
|
SELECT_OPTIONS = :select_options
|
19
19
|
PREDEFINED_RANGES = :predefined_ranges
|
20
|
+
HIDE_OPTION = :hide
|
20
21
|
# this will load date picker
|
21
22
|
# SEARCH_OPTION_DATE_VALUE = :date
|
22
23
|
# SEARCH_OPTION_DATETIME_VALUE = :datetime
|
23
|
-
COLUMN_OPTIONS = [SEARCH_OPTION, ORDER_OPTION, TITLE_OPTION, SELECT_OPTIONS, PREDEFINED_RANGES].freeze
|
24
|
+
COLUMN_OPTIONS = [SEARCH_OPTION, ORDER_OPTION, TITLE_OPTION, SELECT_OPTIONS, PREDEFINED_RANGES, HIDE_OPTION].freeze
|
24
25
|
|
25
26
|
STRING_TYPE_CAST_POSTGRES = 'VARCHAR'.freeze
|
26
27
|
STRING_TYPE_CAST_MYSQL = 'CHAR'.freeze
|
@@ -170,6 +171,7 @@ module TrkDatatables
|
|
170
171
|
res = {}
|
171
172
|
res['data-searchable'] = false if column_options[SEARCH_OPTION] == false
|
172
173
|
res['data-orderable'] = false if column_options[ORDER_OPTION] == false
|
174
|
+
res['data-datatable-hide-column'] = true if column_options[HIDE_OPTION] == true
|
173
175
|
if %i[date datetime].include? column_type_in_db
|
174
176
|
res['data-datatable-range'] = column_type_in_db == :datetime ? :datetime : true
|
175
177
|
if column_options[PREDEFINED_RANGES].present? ||
|
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.12
|
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-09-
|
11
|
+
date: 2019-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -203,8 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
203
|
- !ruby/object:Gem::Version
|
204
204
|
version: '0'
|
205
205
|
requirements: []
|
206
|
-
|
207
|
-
rubygems_version: 2.7.6
|
206
|
+
rubygems_version: 3.0.4
|
208
207
|
signing_key:
|
209
208
|
specification_version: 4
|
210
209
|
summary: Gem that simplify using datatables with Ruby on Rails and Sinatra.
|