datagrid 1.8.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +2 -0
- data/CHANGELOG.md +11 -1
- data/{Readme.markdown → README.md} +44 -29
- data/app/assets/stylesheets/datagrid.css +145 -0
- data/app/views/datagrid/_enum_checkboxes.html.erb +5 -3
- data/app/views/datagrid/_form.html.erb +4 -4
- data/app/views/datagrid/_head.html.erb +26 -3
- data/app/views/datagrid/_range_filter.html.erb +5 -3
- data/app/views/datagrid/_row.html.erb +12 -1
- data/app/views/datagrid/_table.html.erb +4 -4
- data/datagrid.gemspec +8 -7
- data/lib/datagrid/active_model.rb +9 -17
- data/lib/datagrid/base.rb +39 -0
- data/lib/datagrid/column_names_attribute.rb +9 -11
- data/lib/datagrid/columns/column.rb +155 -133
- data/lib/datagrid/columns.rb +325 -115
- data/lib/datagrid/configuration.rb +33 -4
- data/lib/datagrid/core.rb +89 -54
- data/lib/datagrid/deprecated_object.rb +20 -0
- data/lib/datagrid/drivers/abstract_driver.rb +12 -23
- data/lib/datagrid/drivers/active_record.rb +24 -26
- data/lib/datagrid/drivers/array.rb +22 -14
- data/lib/datagrid/drivers/mongo_mapper.rb +15 -14
- data/lib/datagrid/drivers/mongoid.rb +15 -17
- data/lib/datagrid/drivers/sequel.rb +14 -19
- data/lib/datagrid/drivers.rb +2 -1
- data/lib/datagrid/engine.rb +11 -3
- data/lib/datagrid/filters/base_filter.rb +166 -143
- data/lib/datagrid/filters/boolean_filter.rb +19 -5
- data/lib/datagrid/filters/date_filter.rb +33 -35
- data/lib/datagrid/filters/date_time_filter.rb +24 -16
- data/lib/datagrid/filters/default_filter.rb +9 -3
- data/lib/datagrid/filters/dynamic_filter.rb +151 -105
- data/lib/datagrid/filters/enum_filter.rb +43 -19
- data/lib/datagrid/filters/extended_boolean_filter.rb +39 -31
- data/lib/datagrid/filters/float_filter.rb +15 -5
- data/lib/datagrid/filters/integer_filter.rb +21 -10
- data/lib/datagrid/filters/ranged_filter.rb +66 -45
- data/lib/datagrid/filters/select_options.rb +58 -49
- data/lib/datagrid/filters/string_filter.rb +9 -4
- data/lib/datagrid/filters.rb +204 -79
- data/lib/datagrid/form_builder.rb +116 -128
- data/lib/datagrid/generators/scaffold.rb +184 -0
- data/lib/datagrid/generators/views.rb +20 -0
- data/lib/datagrid/helper.rb +436 -69
- data/lib/datagrid/ordering.rb +26 -29
- data/lib/datagrid/rspec.rb +6 -10
- data/lib/datagrid/utils.rb +37 -30
- data/lib/datagrid/version.rb +3 -1
- data/lib/datagrid.rb +8 -28
- data/templates/base.rb.erb +6 -4
- data/templates/grid.rb.erb +1 -1
- metadata +17 -17
- data/app/assets/stylesheets/datagrid.sass +0 -134
- data/lib/datagrid/filters/composite_filters.rb +0 -49
- data/lib/datagrid/renderer.rb +0 -157
- data/lib/datagrid/scaffold.rb +0 -129
- data/lib/tasks/datagrid_tasks.rake +0 -15
- data/templates/controller.rb.erb +0 -6
- data/templates/index.html.erb +0 -5
@@ -1,49 +0,0 @@
|
|
1
|
-
module Datagrid
|
2
|
-
module Filters
|
3
|
-
# @!visibility private
|
4
|
-
module CompositeFilters
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
base.extend ClassMethods
|
8
|
-
base.class_eval do
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
# @!visibility private
|
13
|
-
module ClassMethods
|
14
|
-
|
15
|
-
def date_range_filters(field, from_options = {}, to_options = {})
|
16
|
-
Utils.warn_once('date_range_filters is deprecated in favor of range option for date filter')
|
17
|
-
from_options = normalize_composite_filter_options(from_options, field)
|
18
|
-
to_options = normalize_composite_filter_options(to_options, field)
|
19
|
-
|
20
|
-
filter(from_options[:name] || :"from_#{field.to_s.tr('.', '_')}", :date, **from_options) do |date, scope, grid|
|
21
|
-
grid.driver.greater_equal(scope, field, date)
|
22
|
-
end
|
23
|
-
filter(to_options[:name] || :"to_#{field.to_s.tr('.', '_')}", :date, **to_options) do |date, scope, grid|
|
24
|
-
grid.driver.less_equal(scope, field, date)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def integer_range_filters(field, from_options = {}, to_options = {})
|
29
|
-
Utils.warn_once('integer_range_filters is deprecated in favor of range option for integer filter')
|
30
|
-
from_options = normalize_composite_filter_options(from_options, field)
|
31
|
-
to_options = normalize_composite_filter_options(to_options, field)
|
32
|
-
filter(from_options[:name] || :"from_#{field.to_s.tr('.', '_')}", :integer, **from_options) do |value, scope, grid|
|
33
|
-
grid.driver.greater_equal(scope, field, value)
|
34
|
-
end
|
35
|
-
filter(to_options[:name] || :"to_#{field.to_s.tr('.', '_')}", :integer, **to_options) do |value, scope, grid|
|
36
|
-
grid.driver.less_equal(scope, field, value)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def normalize_composite_filter_options(options, field)
|
41
|
-
if options.is_a?(String) || options.is_a?(Symbol)
|
42
|
-
options = {name: options}
|
43
|
-
end
|
44
|
-
options
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/lib/datagrid/renderer.rb
DELETED
@@ -1,157 +0,0 @@
|
|
1
|
-
require "action_view"
|
2
|
-
|
3
|
-
module Datagrid
|
4
|
-
# @!visibility private
|
5
|
-
class Renderer
|
6
|
-
|
7
|
-
def self.for(template)
|
8
|
-
new(template)
|
9
|
-
end
|
10
|
-
|
11
|
-
def initialize(template)
|
12
|
-
@template = template
|
13
|
-
end
|
14
|
-
|
15
|
-
def format_value(grid, column, asset)
|
16
|
-
if column.is_a?(String) || column.is_a?(Symbol)
|
17
|
-
column = grid.column_by_name(column)
|
18
|
-
end
|
19
|
-
|
20
|
-
value = grid.html_value(column, @template, asset)
|
21
|
-
|
22
|
-
url = column.options[:url] && column.options[:url].call(asset)
|
23
|
-
if url
|
24
|
-
@template.link_to(value, url)
|
25
|
-
else
|
26
|
-
value
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def form_for(grid, options = {})
|
31
|
-
options[:method] ||= :get
|
32
|
-
options[:html] ||= {}
|
33
|
-
options[:html][:class] ||= "datagrid-form #{@template.dom_class(grid)}"
|
34
|
-
options[:as] ||= grid.param_name
|
35
|
-
_render_partial('form', options[:partials], {:grid => grid, :options => options})
|
36
|
-
end
|
37
|
-
|
38
|
-
def table(grid, assets, **options)
|
39
|
-
options[:html] ||= {}
|
40
|
-
options[:html][:class] ||= "datagrid #{@template.dom_class(grid)}"
|
41
|
-
|
42
|
-
_render_partial('table', options[:partials],
|
43
|
-
{
|
44
|
-
grid: grid,
|
45
|
-
options: options,
|
46
|
-
assets: assets
|
47
|
-
})
|
48
|
-
end
|
49
|
-
|
50
|
-
def header(grid, options = {})
|
51
|
-
options[:order] = true unless options.has_key?(:order)
|
52
|
-
|
53
|
-
_render_partial('head', options[:partials],
|
54
|
-
{ :grid => grid, :options => options })
|
55
|
-
end
|
56
|
-
|
57
|
-
def rows(grid, assets = grid.assets, **options, &block)
|
58
|
-
result = assets.map do |asset|
|
59
|
-
row(grid, asset, **options, &block)
|
60
|
-
end.to_a.join
|
61
|
-
|
62
|
-
_safe(result)
|
63
|
-
end
|
64
|
-
|
65
|
-
def row(grid, asset, **options, &block)
|
66
|
-
Datagrid::Helper::HtmlRow.new(self, grid, asset, options).tap do |row|
|
67
|
-
if block_given?
|
68
|
-
return @template.capture(row, &block)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def order_for(grid, column, options = {})
|
74
|
-
_render_partial('order_for', options[:partials],
|
75
|
-
{ :grid => grid, :column => column })
|
76
|
-
end
|
77
|
-
|
78
|
-
def order_path(grid, column, descending, request)
|
79
|
-
column = grid.column_by_name(column)
|
80
|
-
query = request ? request.query_parameters : {}
|
81
|
-
ActionDispatch::Http::URL.path_for(
|
82
|
-
path: request ? request.path : '/',
|
83
|
-
params: query.merge(grid.query_params(order: column.name, descending: descending))
|
84
|
-
)
|
85
|
-
end
|
86
|
-
|
87
|
-
private
|
88
|
-
|
89
|
-
def _safe(string)
|
90
|
-
string.respond_to?(:html_safe) ? string.html_safe : string
|
91
|
-
end
|
92
|
-
|
93
|
-
def _render_partial(partial_name, partials_path, locals = {})
|
94
|
-
@template.render({
|
95
|
-
:partial => File.join(partials_path || 'datagrid', partial_name),
|
96
|
-
:locals => locals
|
97
|
-
})
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
module Helper
|
102
|
-
# Represents a datagrid row that provides access to column values for the given asset
|
103
|
-
# @example
|
104
|
-
# row = datagrid_row(grid, user)
|
105
|
-
# row.class # => Datagrid::Helper::HtmlRow
|
106
|
-
# row.first_name # => "<strong>Bogdan</strong>"
|
107
|
-
# row.grid # => Grid object
|
108
|
-
# row.asset # => User object
|
109
|
-
# row.each do |value|
|
110
|
-
# puts value
|
111
|
-
# end
|
112
|
-
class HtmlRow
|
113
|
-
|
114
|
-
include Enumerable
|
115
|
-
|
116
|
-
attr_reader :grid, :asset, :options
|
117
|
-
|
118
|
-
# @!visibility private
|
119
|
-
def initialize(renderer, grid, asset, options)
|
120
|
-
@renderer = renderer
|
121
|
-
@grid = grid
|
122
|
-
@asset = asset
|
123
|
-
@options = options
|
124
|
-
end
|
125
|
-
|
126
|
-
# @return [Object] a column value for given column name
|
127
|
-
def get(column)
|
128
|
-
@renderer.format_value(@grid, column, @asset)
|
129
|
-
end
|
130
|
-
|
131
|
-
# Iterates over all column values that are available in the row
|
132
|
-
# param block [Proc] column value iterator
|
133
|
-
def each(&block)
|
134
|
-
(@options[:columns] || @grid.html_columns).each do |column|
|
135
|
-
block.call(get(column))
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
def to_s
|
140
|
-
@renderer.send(:_render_partial, 'row', options[:partials], {
|
141
|
-
:grid => grid,
|
142
|
-
:options => options,
|
143
|
-
:asset => asset
|
144
|
-
})
|
145
|
-
end
|
146
|
-
|
147
|
-
protected
|
148
|
-
def method_missing(method, *args, &blk)
|
149
|
-
if column = @grid.column_by_name(method)
|
150
|
-
get(column)
|
151
|
-
else
|
152
|
-
super
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
data/lib/datagrid/scaffold.rb
DELETED
@@ -1,129 +0,0 @@
|
|
1
|
-
require "rails/generators"
|
2
|
-
|
3
|
-
class Datagrid::Scaffold < Rails::Generators::NamedBase
|
4
|
-
|
5
|
-
include Rails::Generators::ResourceHelpers
|
6
|
-
|
7
|
-
check_class_collision suffix: "Grid"
|
8
|
-
source_root File.expand_path(__FILE__ + "/../../../templates")
|
9
|
-
|
10
|
-
def create_scaffold
|
11
|
-
unless file_exists?(base_grid_file)
|
12
|
-
template "base.rb.erb", base_grid_file
|
13
|
-
end
|
14
|
-
template "grid.rb.erb", "app/grids/#{grid_class_name.underscore}.rb"
|
15
|
-
if file_exists?(grid_controller_file)
|
16
|
-
inject_into_file grid_controller_file, index_action, after: %r{class .*#{grid_controller_class_name}.*\n}
|
17
|
-
else
|
18
|
-
template "controller.rb.erb", grid_controller_file
|
19
|
-
end
|
20
|
-
template "index.html.erb", view_file
|
21
|
-
route(generate_routing_namespace("resources :#{grid_controller_short_name}"))
|
22
|
-
unless defined?(::Kaminari) || defined?(::WillPaginate)
|
23
|
-
gem 'kaminari'
|
24
|
-
end
|
25
|
-
in_root do
|
26
|
-
{
|
27
|
-
"css" => " *= require datagrid",
|
28
|
-
"css.sass" => " *= require datagrid",
|
29
|
-
"css.scss" => " *= require datagrid",
|
30
|
-
}.each do |extension, string|
|
31
|
-
file = "app/assets/stylesheets/application.#{extension}"
|
32
|
-
if file_exists?(file)
|
33
|
-
inject_into_file file, string + "\n", {before: %r{.*require_self}} # before all
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def view_file
|
40
|
-
Rails.root.join("app/views").join(controller_file_path).join("index.html.erb")
|
41
|
-
end
|
42
|
-
|
43
|
-
def grid_class_name
|
44
|
-
file_name.camelize.pluralize + "Grid"
|
45
|
-
end
|
46
|
-
|
47
|
-
def grid_controller_class_name
|
48
|
-
controller_class_name.camelize + "Controller"
|
49
|
-
end
|
50
|
-
|
51
|
-
def grid_controller_file
|
52
|
-
Rails.root.join("app/controllers").join("#{grid_controller_class_name.underscore}.rb")
|
53
|
-
end
|
54
|
-
|
55
|
-
def grid_controller_short_name
|
56
|
-
controller_file_name
|
57
|
-
end
|
58
|
-
|
59
|
-
def grid_model_name
|
60
|
-
file_name.camelize.singularize
|
61
|
-
end
|
62
|
-
|
63
|
-
def grid_param_name
|
64
|
-
grid_class_name.underscore
|
65
|
-
end
|
66
|
-
|
67
|
-
def pagination_helper_code
|
68
|
-
if defined?(::WillPaginate)
|
69
|
-
"will_paginate(@grid.assets)"
|
70
|
-
else
|
71
|
-
# Kaminari is default
|
72
|
-
"paginate(@grid.assets)"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def base_grid_file
|
77
|
-
"app/grids/base_grid.rb"
|
78
|
-
end
|
79
|
-
|
80
|
-
def grid_route_name
|
81
|
-
controller_class_name.underscore.gsub("/", "_") + "_path"
|
82
|
-
end
|
83
|
-
|
84
|
-
def index_action
|
85
|
-
indent(<<-RUBY)
|
86
|
-
def index
|
87
|
-
@grid = #{grid_class_name}.new(grid_params) do |scope|
|
88
|
-
scope.page(params[:page])
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
protected
|
93
|
-
|
94
|
-
def grid_params
|
95
|
-
params.fetch(:#{grid_param_name}, {}).permit!
|
96
|
-
end
|
97
|
-
RUBY
|
98
|
-
end
|
99
|
-
|
100
|
-
protected
|
101
|
-
def generate_routing_namespace(code)
|
102
|
-
depth = regular_class_path.length
|
103
|
-
# Create 'namespace' ladder
|
104
|
-
# namespace :foo do
|
105
|
-
# namespace :bar do
|
106
|
-
namespace_ladder = regular_class_path.each_with_index.map do |ns, i|
|
107
|
-
indent("namespace :#{ns} do\n", i * 2)
|
108
|
-
end.join
|
109
|
-
|
110
|
-
# Create route
|
111
|
-
# get 'baz/index'
|
112
|
-
route = indent(code, depth * 2)
|
113
|
-
|
114
|
-
# Create `end` ladder
|
115
|
-
# end
|
116
|
-
# end
|
117
|
-
end_ladder = (1..depth).reverse_each.map do |i|
|
118
|
-
indent("end\n", i * 2)
|
119
|
-
end.join
|
120
|
-
|
121
|
-
# Combine the 3 parts to generate complete route entry
|
122
|
-
namespace_ladder + route + "\n" + end_ladder
|
123
|
-
end
|
124
|
-
|
125
|
-
def file_exists?(name)
|
126
|
-
name = Rails.root.join(name) unless name.to_s.first == "/"
|
127
|
-
File.exist?(name)
|
128
|
-
end
|
129
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
namespace :datagrid do
|
2
|
-
|
3
|
-
desc "Copy table partials into rails application"
|
4
|
-
task :copy_partials do
|
5
|
-
require "fileutils"
|
6
|
-
views_path = "app/views/datagrid"
|
7
|
-
destination_dir = (Rails.root + views_path).to_s
|
8
|
-
pattern = File.expand_path(File.dirname(__FILE__) + "/../../#{views_path}") + "/*"
|
9
|
-
Dir[pattern].each do |template|
|
10
|
-
puts "* copy #{template} => #{destination_dir}"
|
11
|
-
FileUtils.mkdir_p destination_dir
|
12
|
-
FileUtils.cp template, destination_dir
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/templates/controller.rb.erb
DELETED