trk_datatables 0.1.0
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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +7 -0
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +56 -0
- data/LICENSE.txt +21 -0
- data/README.md +267 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/trk_datatables.rb +15 -0
- data/lib/trk_datatables/active_record.rb +110 -0
- data/lib/trk_datatables/base.rb +189 -0
- data/lib/trk_datatables/column_key_options.rb +165 -0
- data/lib/trk_datatables/dt_params.rb +156 -0
- data/lib/trk_datatables/preferences.rb +35 -0
- data/lib/trk_datatables/render_html.rb +133 -0
- data/lib/trk_datatables/version.rb +3 -0
- data/trk_datatables.gemspec +53 -0
- data/yarn.lock +4 -0
- metadata +210 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
module TrkDatatables
|
2
|
+
# rubocop:disable Metrics/ClassLength
|
3
|
+
|
4
|
+
# This class wraps databases format https://datatables.net/manual/server-side#Returned-data
|
5
|
+
#
|
6
|
+
# In future we can use some another datatables like
|
7
|
+
# https://github.com/gregnb/mui-datatables
|
8
|
+
# https://github.com/handsontable/handsontable
|
9
|
+
# https://github.com/cloudflarearchive/backgrid (archived)
|
10
|
+
class DtParams
|
11
|
+
def initialize(params)
|
12
|
+
@params = ActiveSupport::HashWithIndifferentAccess.new params
|
13
|
+
end
|
14
|
+
|
15
|
+
def dt_offset
|
16
|
+
@params[:start].to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
def dt_per_page
|
20
|
+
return if @params[:length].blank?
|
21
|
+
|
22
|
+
@params[:length].to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
# def page
|
26
|
+
# (dt_offset / dt_per_page) + 1
|
27
|
+
# end
|
28
|
+
|
29
|
+
# Typecast so we can safelly use dt_order[:column_index] (Integer) and
|
30
|
+
# dt_order[:direction] (:asc/:desc)
|
31
|
+
# @return
|
32
|
+
# [
|
33
|
+
# { column_index: 2, direction: :asc }.
|
34
|
+
# { column_index: 1, direction: :desc },
|
35
|
+
# ]
|
36
|
+
def dt_orders
|
37
|
+
return @dt_orders if defined? @dt_orders
|
38
|
+
|
39
|
+
@dt_orders = []
|
40
|
+
return @dt_orders if @params[:order].blank?
|
41
|
+
|
42
|
+
@dt_orders = \
|
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
|
+
}
|
49
|
+
end
|
50
|
+
@dt_orders
|
51
|
+
end
|
52
|
+
|
53
|
+
# Typecast so we can safelly use dt_column[:searchable] (Boolean),
|
54
|
+
# dt_column[:orderable] (Boolean), dt_column[:search_value] (String)
|
55
|
+
#
|
56
|
+
# Returned size could be different from columns size, we match key from params to
|
57
|
+
# insert in appropriate place, and all other values are default
|
58
|
+
# @return
|
59
|
+
# [
|
60
|
+
# { index: 0, searchable: true, orderable: true, search_value: 'dule' },
|
61
|
+
# ]
|
62
|
+
def dt_columns
|
63
|
+
return @dt_columns if defined? @dt_columns
|
64
|
+
|
65
|
+
@dt_columns = []
|
66
|
+
return @dt_columns unless @params[:columns].respond_to? :each
|
67
|
+
|
68
|
+
@params[:columns].each.map do |(dt_position, dt_column)|
|
69
|
+
@dt_columns[dt_position.to_i] = {
|
70
|
+
index: dt_position.to_i,
|
71
|
+
searchable: dt_column[:searchable].to_s != 'false', # if nil as it is in set_params, than use true
|
72
|
+
orderable: dt_column[:orderable].to_s != 'false', # if nil as it is in set_params, than use true
|
73
|
+
search_value: (dt_column[:search] && dt_column[:search][:value]) || '',
|
74
|
+
}
|
75
|
+
end
|
76
|
+
@dt_columns.each_with_index do |dt_column, i|
|
77
|
+
next unless dt_column.nil?
|
78
|
+
|
79
|
+
@dt_columns[i] = {
|
80
|
+
index: i,
|
81
|
+
searchable: true,
|
82
|
+
orderable: true,
|
83
|
+
search_value: '',
|
84
|
+
}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def search_all
|
89
|
+
@params.dig(:search, :value) || ''
|
90
|
+
end
|
91
|
+
|
92
|
+
def as_json(all_count, filtered_items_count, data)
|
93
|
+
draw = @params[:draw].to_i
|
94
|
+
{
|
95
|
+
draw: draw,
|
96
|
+
recordsTotal: all_count,
|
97
|
+
recordsFiltered: filtered_items_count,
|
98
|
+
data: data,
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.param_set(column_index, value)
|
103
|
+
{ columns: { column_index.to_s => { search: { value: value } } } }
|
104
|
+
end
|
105
|
+
|
106
|
+
def param_get(column_index)
|
107
|
+
@params.dig :columns, column_index.to_s, :search, :value
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.sample_view_params(options = {})
|
111
|
+
OpenStruct.new(
|
112
|
+
params: sample_params(options),
|
113
|
+
)
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.sample_params(options = {})
|
117
|
+
HashWithIndifferentAccess.new(
|
118
|
+
draw: '1',
|
119
|
+
start: '0',
|
120
|
+
length: '10',
|
121
|
+
search: {
|
122
|
+
value: '', regex: 'false'
|
123
|
+
},
|
124
|
+
order: {
|
125
|
+
'0': { column: '0', dir: 'desc' }
|
126
|
+
},
|
127
|
+
# [:columns] should have the same size as column_key_options since we
|
128
|
+
# ignore keys, and use positions
|
129
|
+
columns: {
|
130
|
+
'0': {
|
131
|
+
searchable: 'true',
|
132
|
+
orderable: 'true',
|
133
|
+
search: {
|
134
|
+
value: '', regex: 'false'
|
135
|
+
}
|
136
|
+
},
|
137
|
+
'1': {
|
138
|
+
searchable: 'true',
|
139
|
+
orderable: 'true',
|
140
|
+
search: {
|
141
|
+
value: '', regex: 'false'
|
142
|
+
}
|
143
|
+
},
|
144
|
+
'2': {
|
145
|
+
searchable: 'true',
|
146
|
+
orderable: 'false',
|
147
|
+
search: {
|
148
|
+
value: '', regex: 'false'
|
149
|
+
}
|
150
|
+
},
|
151
|
+
},
|
152
|
+
).merge options
|
153
|
+
end
|
154
|
+
end
|
155
|
+
# rubocop:enable Metrics/ClassLength
|
156
|
+
end
|
@@ -0,0 +1,35 @@
|
|
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
|
10
|
+
end
|
11
|
+
|
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
|
22
|
+
|
23
|
+
preferences_holder.send(preferences_field).dig :dt_preferences, self.class.name, key
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_preference(key, value)
|
27
|
+
return unless preferences_holder
|
28
|
+
|
29
|
+
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!
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module TrkDatatables
|
2
|
+
# rubocop:disable Rails/OutputSafety
|
3
|
+
class RenderHtml
|
4
|
+
@indent = 0
|
5
|
+
def initialize(search_link, datatable, html_options)
|
6
|
+
@search_link = search_link
|
7
|
+
@datatable = datatable
|
8
|
+
@html_options = html_options
|
9
|
+
self.class.indent = -1
|
10
|
+
end
|
11
|
+
|
12
|
+
def result
|
13
|
+
if @search_link.nil?
|
14
|
+
table_tag_client
|
15
|
+
else
|
16
|
+
table_tag_server
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
attr_accessor :indent
|
22
|
+
end
|
23
|
+
|
24
|
+
# https://github.com/rails/rails/blob/master/actionview/lib/action_view/helpers/output_safety_helper.rb#L33
|
25
|
+
def safe_join(array, sep = $,)
|
26
|
+
sep = ERB::Util.unwrapped_html_escape(sep)
|
27
|
+
|
28
|
+
array.map { |i| ERB::Util.unwrapped_html_escape(i) }.join(sep).html_safe
|
29
|
+
end
|
30
|
+
|
31
|
+
# rubocop:disable Metrics/AbcSize
|
32
|
+
#
|
33
|
+
# _content_tag :p, 'Hi'
|
34
|
+
# _content_tag :p, class: 'button', 'Hi'
|
35
|
+
# _content_tag :div, do
|
36
|
+
# _content_tag :div, class: 'background' do
|
37
|
+
def _content_tag(tag, options = {}, content = nil)
|
38
|
+
if !options.is_a?(Hash)
|
39
|
+
inline = true
|
40
|
+
content = options
|
41
|
+
options = {}
|
42
|
+
elsif content.present?
|
43
|
+
inline = true
|
44
|
+
end
|
45
|
+
self.class.indent += 1
|
46
|
+
html = "#{' ' * self.class.indent}<#{tag}".html_safe
|
47
|
+
options.each do |attribute, value|
|
48
|
+
html << " #{attribute}='".html_safe << replace_quote(value) << "'".html_safe
|
49
|
+
end
|
50
|
+
html << if inline
|
51
|
+
'>'.html_safe << content.to_s << "</#{tag}>\n".html_safe
|
52
|
+
else
|
53
|
+
">\n".html_safe << yield << "\n#{' ' * self.class.indent}</#{tag}>".html_safe
|
54
|
+
end
|
55
|
+
self.class.indent -= 1
|
56
|
+
html
|
57
|
+
end
|
58
|
+
# rubocop:enable Metrics/AbcSize
|
59
|
+
|
60
|
+
def _select_tag(options, search_value)
|
61
|
+
selected = search_value.to_s.split(MULTIPLE_OPTION_SEPARATOR)
|
62
|
+
_content_tag :select, multiple: 'multiple' do
|
63
|
+
safe_join(options.map do |key, value|
|
64
|
+
_content_tag :option, { value: value }.merge(selected.include?(value.to_s) ? { selected: 'selected' } : {}), key
|
65
|
+
end)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# We need to replace single quote since it is used in option='value'
|
70
|
+
def replace_quote(string)
|
71
|
+
# do not know those two are different
|
72
|
+
# ERB::Util.html_escape string.to_s.gsub 'aaa', 'bbb'
|
73
|
+
# ERB::Util.html_escape string.to_s
|
74
|
+
# since it is safebuffer and html_safe, this will output with single
|
75
|
+
# quotes for example: data-datatable-multiselect=' <select multiple='multi
|
76
|
+
# ERB::Util.html_escape string
|
77
|
+
# replace single quote with double quote
|
78
|
+
string.to_s.tr "'", '"'
|
79
|
+
end
|
80
|
+
|
81
|
+
def table_tag_server
|
82
|
+
_content_tag(
|
83
|
+
:table,
|
84
|
+
class: "table table-bordered table-striped #{@html_options[:class]}",
|
85
|
+
'data-datatable': true,
|
86
|
+
'data-datatable-ajax-url': @search_link,
|
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
|
92
|
+
) do
|
93
|
+
thead << "\n".html_safe << tbody
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def thead
|
98
|
+
_content_tag :thead do
|
99
|
+
_content_tag :tr do
|
100
|
+
safe_join(@datatable.column_key_options.map do |column_key_option|
|
101
|
+
options = column_key_option[:html_options]
|
102
|
+
search_value = @datatable.param_get(column_key_option[:column_key]) if options['data-searchable'] != false
|
103
|
+
options['data-datatable-search-value'] = search_value if search_value.present?
|
104
|
+
select_options = column_key_option[:column_options][ColumnKeyOptions::SELECT_OPTIONS]
|
105
|
+
options['data-datatable-multiselect'] = _select_tag select_options, search_value if select_options.present?
|
106
|
+
_content_tag :th, options, column_key_option[:title]
|
107
|
+
end)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def tbody
|
113
|
+
# use raw html_safe only for <td>, not for data since it could be injection
|
114
|
+
# hole if we show, for example some params
|
115
|
+
ordered_paginated_filtered_items = @datatable.order_and_paginate_items \
|
116
|
+
@datatable.filter_by_search_all @datatable.filter_by_columns @datatable.all_items
|
117
|
+
_content_tag :tbody do
|
118
|
+
safe_join(@datatable.rows(ordered_paginated_filtered_items).map do |row|
|
119
|
+
_content_tag :tr do
|
120
|
+
safe_join(row.map do |col|
|
121
|
+
_content_tag :td, col
|
122
|
+
end)
|
123
|
+
end
|
124
|
+
end, "\n".html_safe)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def table_tag_client
|
129
|
+
''
|
130
|
+
end
|
131
|
+
end
|
132
|
+
# rubocop:enable Rails/OutputSafety
|
133
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'trk_datatables/version'
|
4
|
+
|
5
|
+
# rubocop:disable Metrics/BlockLength
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'trk_datatables'
|
8
|
+
spec.version = TrkDatatables::VERSION
|
9
|
+
spec.authors = ['Dusan Orlovic']
|
10
|
+
spec.email = ['duleorlovic@gmail.com']
|
11
|
+
|
12
|
+
spec.summary = %q(Gem that simplify using datatables with Ruby on Rails and Sinatra.)
|
13
|
+
spec.description = %q(Html render first page, sort and filter...)
|
14
|
+
spec.homepage = 'https://github.com/trkin/trk_datatables'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
|
+
if spec.respond_to?(:metadata)
|
20
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
21
|
+
|
22
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
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'
|
25
|
+
spec.metadata['yard.run'] = 'yri' # use "yard" to build full HTML docs.
|
26
|
+
else
|
27
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
28
|
+
'public gem pushes.'
|
29
|
+
end
|
30
|
+
|
31
|
+
# Specify which files should be added to the gem when it is released.
|
32
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
33
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
34
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
35
|
+
end
|
36
|
+
spec.bindir = 'exe'
|
37
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
38
|
+
spec.require_paths = ['lib']
|
39
|
+
|
40
|
+
# for HashWithIndifferentAccess
|
41
|
+
spec.add_dependency 'activesupport'
|
42
|
+
|
43
|
+
spec.add_development_dependency 'activerecord', '~> 6.0'
|
44
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
45
|
+
spec.add_development_dependency 'byebug'
|
46
|
+
spec.add_development_dependency 'database_cleaner'
|
47
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
48
|
+
spec.add_development_dependency 'minitest-color'
|
49
|
+
spec.add_development_dependency 'pg'
|
50
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
51
|
+
spec.add_development_dependency 'sqlite3'
|
52
|
+
end
|
53
|
+
# rubocop:enable Metrics/BlockLength
|
data/yarn.lock
ADDED
metadata
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: trk_datatables
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dusan Orlovic
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-08-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '6.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '6.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: database_cleaner
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '5.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '5.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: minitest-color
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pg
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '10.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '10.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: sqlite3
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description: Html render first page, sort and filter...
|
154
|
+
email:
|
155
|
+
- duleorlovic@gmail.com
|
156
|
+
executables: []
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- ".gitignore"
|
161
|
+
- ".travis.yml"
|
162
|
+
- CHANGELOG.md
|
163
|
+
- CODE_OF_CONDUCT.md
|
164
|
+
- Gemfile
|
165
|
+
- Gemfile.lock
|
166
|
+
- LICENSE.txt
|
167
|
+
- README.md
|
168
|
+
- Rakefile
|
169
|
+
- bin/console
|
170
|
+
- bin/setup
|
171
|
+
- lib/trk_datatables.rb
|
172
|
+
- lib/trk_datatables/active_record.rb
|
173
|
+
- lib/trk_datatables/base.rb
|
174
|
+
- lib/trk_datatables/column_key_options.rb
|
175
|
+
- lib/trk_datatables/dt_params.rb
|
176
|
+
- lib/trk_datatables/preferences.rb
|
177
|
+
- lib/trk_datatables/render_html.rb
|
178
|
+
- lib/trk_datatables/version.rb
|
179
|
+
- trk_datatables.gemspec
|
180
|
+
- yarn.lock
|
181
|
+
homepage: https://github.com/trkin/trk_datatables
|
182
|
+
licenses:
|
183
|
+
- MIT
|
184
|
+
metadata:
|
185
|
+
allowed_push_host: https://rubygems.org
|
186
|
+
homepage_uri: https://github.com/trkin/trk_datatables
|
187
|
+
source_code_uri: https://github.com/trkin/trk_datatables
|
188
|
+
changelog_uri: https://github.com/trkin/trk_datatables/CHANGELOG.md
|
189
|
+
yard.run: yri
|
190
|
+
post_install_message:
|
191
|
+
rdoc_options: []
|
192
|
+
require_paths:
|
193
|
+
- lib
|
194
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
195
|
+
requirements:
|
196
|
+
- - ">="
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: '0'
|
199
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - ">="
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0'
|
204
|
+
requirements: []
|
205
|
+
rubyforge_project:
|
206
|
+
rubygems_version: 2.7.6
|
207
|
+
signing_key:
|
208
|
+
specification_version: 4
|
209
|
+
summary: Gem that simplify using datatables with Ruby on Rails and Sinatra.
|
210
|
+
test_files: []
|