datagrid 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.markdown +21 -2
- data/VERSION +1 -1
- data/datagrid.gemspec +5 -4
- data/lib/datagrid/core.rb +1 -0
- data/lib/datagrid/drivers.rb +1 -0
- data/lib/datagrid/drivers/abstract_driver.rb +6 -3
- data/lib/datagrid/drivers/active_record.rb +4 -3
- data/lib/datagrid/drivers/array.rb +52 -0
- data/lib/datagrid/drivers/mongo_mapper.rb +2 -2
- data/lib/datagrid/drivers/mongoid.rb +2 -2
- data/lib/datagrid/filters.rb +1 -2
- data/lib/datagrid/filters/base_filter.rb +26 -13
- data/lib/datagrid/scaffold.rb +2 -2
- data/spec/datagrid/drivers/array_spec.rb +60 -0
- data/spec/datagrid/scaffold_spec.rb +17 -0
- metadata +6 -5
- data/template/controller.rb.erb +0 -9
- data/template/grid.rb.erb +0 -10
data/Readme.markdown
CHANGED
@@ -141,6 +141,26 @@ Each column is sortable.
|
|
141
141
|
|
142
142
|
### Front end
|
143
143
|
|
144
|
+
### Using Generator
|
145
|
+
|
146
|
+
Datagrid has a builtin generator:
|
147
|
+
|
148
|
+
```
|
149
|
+
rails g datagrid:scaffold skills
|
150
|
+
```
|
151
|
+
|
152
|
+
That gives you some code to play with out of the box:
|
153
|
+
|
154
|
+
```
|
155
|
+
create app/grids/skills_grid.rb
|
156
|
+
create app/controllers/skills_controller.rb
|
157
|
+
create app/views/skills/index.html.erb
|
158
|
+
route resources :skills
|
159
|
+
```
|
160
|
+
|
161
|
+
### Manually
|
162
|
+
|
163
|
+
If you want to be a true ninja you can build everything from scratch on your own.
|
144
164
|
|
145
165
|
In order to create form for your report you can use all set of rails built-in tools.
|
146
166
|
More over Datagrid provides you two additional form helpers:
|
@@ -149,8 +169,7 @@ More over Datagrid provides you two additional form helpers:
|
|
149
169
|
* datagrid\_filter
|
150
170
|
|
151
171
|
|
152
|
-
The easiest way to create a report form:
|
153
|
-
(haml for readablity)
|
172
|
+
The easiest way to create a report form (haml for readablity):
|
154
173
|
|
155
174
|
``` haml
|
156
175
|
# Method `GET` is recommended for all report forms by default.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.8.
|
1
|
+
0.8.1
|
data/datagrid.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "datagrid"
|
8
|
-
s.version = "0.8.
|
8
|
+
s.version = "0.8.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Bogdan Gusiev"]
|
12
|
-
s.date = "2013-04-
|
12
|
+
s.date = "2013-04-28"
|
13
13
|
s.description = "This allows you to easily build datagrid aka data tables with sortable columns and filters"
|
14
14
|
s.email = "agresso@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -36,6 +36,7 @@ Gem::Specification.new do |s|
|
|
36
36
|
"lib/datagrid/drivers.rb",
|
37
37
|
"lib/datagrid/drivers/abstract_driver.rb",
|
38
38
|
"lib/datagrid/drivers/active_record.rb",
|
39
|
+
"lib/datagrid/drivers/array.rb",
|
39
40
|
"lib/datagrid/drivers/mongo_mapper.rb",
|
40
41
|
"lib/datagrid/drivers/mongoid.rb",
|
41
42
|
"lib/datagrid/engine.rb",
|
@@ -63,6 +64,7 @@ Gem::Specification.new do |s|
|
|
63
64
|
"spec/datagrid/columns_spec.rb",
|
64
65
|
"spec/datagrid/core_spec.rb",
|
65
66
|
"spec/datagrid/drivers/active_record_spec.rb",
|
67
|
+
"spec/datagrid/drivers/array_spec.rb",
|
66
68
|
"spec/datagrid/drivers/mongo_mapper_spec.rb",
|
67
69
|
"spec/datagrid/drivers/mongoid_spec.rb",
|
68
70
|
"spec/datagrid/filters/boolean_enum_filter_spec.rb",
|
@@ -75,6 +77,7 @@ Gem::Specification.new do |s|
|
|
75
77
|
"spec/datagrid/form_builder_spec.rb",
|
76
78
|
"spec/datagrid/helper_spec.rb",
|
77
79
|
"spec/datagrid/ordering_spec.rb",
|
80
|
+
"spec/datagrid/scaffold_spec.rb",
|
78
81
|
"spec/datagrid/utils_spec.rb",
|
79
82
|
"spec/datagrid_spec.rb",
|
80
83
|
"spec/spec_helper.rb",
|
@@ -84,8 +87,6 @@ Gem::Specification.new do |s|
|
|
84
87
|
"spec/support/mongoid.rb",
|
85
88
|
"spec/support/simple_report.rb",
|
86
89
|
"spec/support/test_partials/_actions.html.erb",
|
87
|
-
"template/controller.rb.erb",
|
88
|
-
"template/grid.rb.erb",
|
89
90
|
"templates/controller.rb.erb",
|
90
91
|
"templates/grid.rb.erb",
|
91
92
|
"templates/index.html.erb"
|
data/lib/datagrid/core.rb
CHANGED
data/lib/datagrid/drivers.rb
CHANGED
@@ -11,21 +11,24 @@ module Datagrid
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.guess_driver(scope)
|
14
|
-
|
14
|
+
self.subclasses.find do |driver_class|
|
15
15
|
driver_class.match?(scope)
|
16
16
|
end || raise(Datagrid::ConfigurationError, "ORM Driver not found for scope: #{scope.inspect}.")
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
19
|
def self.match?(scope)
|
21
20
|
raise NotImplementedError
|
22
21
|
end
|
23
22
|
|
23
|
+
def match?(scope)
|
24
|
+
self.class.match?(scope)
|
25
|
+
end
|
26
|
+
|
24
27
|
def to_scope(scope)
|
25
28
|
raise NotImplementedError
|
26
29
|
end
|
27
30
|
|
28
|
-
def where(scope,
|
31
|
+
def where(scope, attribute, value)
|
29
32
|
raise NotImplementedError
|
30
33
|
end
|
31
34
|
|
@@ -12,21 +12,22 @@ module Datagrid
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def to_scope(scope)
|
15
|
+
return scope if scope.is_a?(::ActiveRecord::Relation)
|
15
16
|
# Model class or Active record association
|
16
17
|
# ActiveRecord association class hides itself under an Array
|
17
18
|
# We can only reveal it by checking if it respond to some specific
|
18
19
|
# to ActiveRecord method like #scoped
|
19
20
|
if scope.is_a?(Class)
|
20
21
|
scope.scoped({})
|
21
|
-
elsif
|
22
|
+
elsif scope.respond_to?(:scoped)
|
22
23
|
scope.scoped
|
23
24
|
else
|
24
25
|
scope
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
28
|
-
def where(scope,
|
29
|
-
scope.where(
|
29
|
+
def where(scope, attribute, value)
|
30
|
+
scope.where(attribute => value)
|
30
31
|
end
|
31
32
|
|
32
33
|
def asc(scope, order)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Datagrid
|
2
|
+
module Drivers
|
3
|
+
class Array < AbstractDriver
|
4
|
+
|
5
|
+
def self.match?(scope)
|
6
|
+
!Datagrid::Drivers::ActiveRecord.match?(scope) && scope.is_a?(::Array)
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_scope(scope)
|
10
|
+
scope
|
11
|
+
end
|
12
|
+
|
13
|
+
def where(scope, attribute, value)
|
14
|
+
scope.select do |object|
|
15
|
+
object.send(attribute) == value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def asc(scope, order)
|
20
|
+
return scope unless order
|
21
|
+
return scope if order.empty?
|
22
|
+
scope.sort_by do |object|
|
23
|
+
object.send(order)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def desc(scope, order)
|
28
|
+
asc(scope, order).reverse
|
29
|
+
end
|
30
|
+
|
31
|
+
def default_order(scope, column_name)
|
32
|
+
column_name
|
33
|
+
end
|
34
|
+
|
35
|
+
def greater_equal(scope, field, value)
|
36
|
+
scope.select do |object|
|
37
|
+
object.send(field) >= value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def less_equal(scope, field, value)
|
42
|
+
scope.select do |object|
|
43
|
+
object.send(field) <= value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def has_column?(scope, column_name)
|
48
|
+
scope.first.respond_to?(column_name)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/datagrid/filters.rb
CHANGED
@@ -84,8 +84,7 @@ module Datagrid
|
|
84
84
|
def assets
|
85
85
|
result = super
|
86
86
|
self.class.filters.each do |filter|
|
87
|
-
|
88
|
-
result = result_filter if result_filter
|
87
|
+
result = filter.apply(self, result, filter_value(filter))
|
89
88
|
end
|
90
89
|
result
|
91
90
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
class Datagrid::FilteringError < StandardError
|
2
|
+
end
|
1
3
|
|
2
4
|
class Datagrid::Filters::BaseFilter
|
3
5
|
|
@@ -7,7 +9,7 @@ class Datagrid::Filters::BaseFilter
|
|
7
9
|
self.grid = grid_class
|
8
10
|
self.name = name
|
9
11
|
self.options = options
|
10
|
-
self.block = block || default_filter_block
|
12
|
+
self.block = block || default_filter_block
|
11
13
|
end
|
12
14
|
|
13
15
|
def format(value)
|
@@ -21,18 +23,17 @@ class Datagrid::Filters::BaseFilter
|
|
21
23
|
return scope if value.blank? && !allow_blank?
|
22
24
|
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
else
|
29
|
-
scope.instance_exec(value, &block)
|
26
|
+
result = execute(value, scope, grid_object, &block)
|
27
|
+
return scope unless result
|
28
|
+
unless grid_object.driver.match?(result)
|
29
|
+
raise Datagrid::FilteringError, "Can not apply #{name.inspect} filter: result #{result.inspect} no longer match #{grid_object.driver.class}."
|
30
30
|
end
|
31
|
+
result
|
31
32
|
end
|
32
33
|
|
33
34
|
def format_values(value)
|
34
|
-
if !self.multiple && value.is_a?(Array)
|
35
|
-
raise Datagrid::ArgumentError, "#{grid}##{name} filter can not accept Array argument. Use :multiple option."
|
35
|
+
if !self.multiple && value.is_a?(Array)
|
36
|
+
raise Datagrid::ArgumentError, "#{grid}##{name} filter can not accept Array argument. Use :multiple option."
|
36
37
|
end
|
37
38
|
values = Array.wrap(value)
|
38
39
|
values.map! do |v|
|
@@ -42,7 +43,7 @@ class Datagrid::Filters::BaseFilter
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def header
|
45
|
-
options[:header] ||
|
46
|
+
options[:header] ||
|
46
47
|
I18n.translate(self.name, :scope => "datagrid.#{grid.param_name}.filters", :default => self.name.to_s.humanize)
|
47
48
|
end
|
48
49
|
|
@@ -73,9 +74,9 @@ class Datagrid::Filters::BaseFilter
|
|
73
74
|
|
74
75
|
def default_filter_block
|
75
76
|
filter = self
|
76
|
-
lambda do |value, scope, grid|
|
77
|
+
lambda do |value, scope, grid|
|
77
78
|
filter.default_filter(value, scope, grid)
|
78
|
-
end
|
79
|
+
end
|
79
80
|
end
|
80
81
|
|
81
82
|
def default_filter(value, scope, grid)
|
@@ -87,8 +88,20 @@ class Datagrid::Filters::BaseFilter
|
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
91
|
+
protected
|
92
|
+
|
90
93
|
def default_filter_where(driver, scope, value)
|
91
|
-
driver.where(scope, name
|
94
|
+
driver.where(scope, name, value)
|
95
|
+
end
|
96
|
+
|
97
|
+
def execute(value, scope, grid_object, &block)
|
98
|
+
if block.arity >= 3 || block.arity < 0
|
99
|
+
scope.instance_exec(value, scope, grid_object, &block)
|
100
|
+
elsif block.arity == 2
|
101
|
+
scope.instance_exec(value, scope, &block)
|
102
|
+
else
|
103
|
+
scope.instance_exec(value, &block)
|
104
|
+
end
|
92
105
|
end
|
93
106
|
|
94
107
|
end
|
data/lib/datagrid/scaffold.rb
CHANGED
@@ -33,7 +33,7 @@ class Datagrid::Scaffold < Rails::Generators::NamedBase
|
|
33
33
|
def paginate_code
|
34
34
|
if defined?(Kaminari)
|
35
35
|
"page(params[:page])"
|
36
|
-
elsif
|
36
|
+
elsif defined?(WillPaginate)
|
37
37
|
"paginate(:page => params[:page])"
|
38
38
|
else
|
39
39
|
"paginate_somehow"
|
@@ -43,7 +43,7 @@ class Datagrid::Scaffold < Rails::Generators::NamedBase
|
|
43
43
|
def pagination_helper_code
|
44
44
|
if defined?(Kaminari)
|
45
45
|
"paginate(@assets)"
|
46
|
-
elsif
|
46
|
+
elsif defined?(WillPaginate)
|
47
47
|
"will_paginate(@assets)"
|
48
48
|
else
|
49
49
|
"some_pagination_helper(@assets)"
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Datagrid::Drivers::Array do
|
4
|
+
|
5
|
+
describe ".match?" do
|
6
|
+
subject { described_class }
|
7
|
+
|
8
|
+
it {should be_match(Array.new)}
|
9
|
+
it {should_not be_match({})}
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "api" do
|
13
|
+
|
14
|
+
class ArrayGrid
|
15
|
+
class User < Struct.new(:name, :age); end
|
16
|
+
include Datagrid
|
17
|
+
scope do
|
18
|
+
[]
|
19
|
+
end
|
20
|
+
|
21
|
+
filter(:name)
|
22
|
+
filter(:age, :integer, :range => true)
|
23
|
+
|
24
|
+
column(:name)
|
25
|
+
column(:age)
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:first) { ArrayGrid::User.new("Vasya", 15) }
|
29
|
+
let(:second) { ArrayGrid::User.new("Petya", 12) }
|
30
|
+
let(:third) { ArrayGrid::User.new("Vova", 13) }
|
31
|
+
|
32
|
+
subject do
|
33
|
+
ArrayGrid.new(
|
34
|
+
defined?(_attributes) ? _attributes : {}
|
35
|
+
).scope do
|
36
|
+
[ first, second, third ]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
its(:"assets.size") {should == 3}
|
42
|
+
its(:rows) {should == [["Vasya", 15], ["Petya", 12], ["Vova", 13]]}
|
43
|
+
its(:header) {should ==[ "Name", "Age"]}
|
44
|
+
|
45
|
+
its(:data) {should == [[ "Name", "Age"], ["Vasya", 15], ["Petya", 12], ["Vova", 13]]}
|
46
|
+
|
47
|
+
|
48
|
+
describe "when some filters specified" do
|
49
|
+
let(:_attributes) { {:age => [12,14]} }
|
50
|
+
its(:assets) {should_not include(first)}
|
51
|
+
its(:assets) {should include(second)}
|
52
|
+
its(:assets) {should include(third)}
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "when reverse ordering is specified" do
|
56
|
+
let(:_attributes) { {:order => :name, :descending => true} }
|
57
|
+
its(:assets) {should == [third, first, second]}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Datagrid::Scaffold do
|
4
|
+
subject { Datagrid::Scaffold.new([""]) }
|
5
|
+
|
6
|
+
describe '.paginate_code' do
|
7
|
+
it 'should fall through options successfully' do
|
8
|
+
subject.paginate_code.should eql('paginate_somehow')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.pagination_helper_code' do
|
13
|
+
it 'should fall through options successfully' do
|
14
|
+
subject.pagination_helper_code.should eql('some_pagination_helper(@assets)')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datagrid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -263,6 +263,7 @@ files:
|
|
263
263
|
- lib/datagrid/drivers.rb
|
264
264
|
- lib/datagrid/drivers/abstract_driver.rb
|
265
265
|
- lib/datagrid/drivers/active_record.rb
|
266
|
+
- lib/datagrid/drivers/array.rb
|
266
267
|
- lib/datagrid/drivers/mongo_mapper.rb
|
267
268
|
- lib/datagrid/drivers/mongoid.rb
|
268
269
|
- lib/datagrid/engine.rb
|
@@ -290,6 +291,7 @@ files:
|
|
290
291
|
- spec/datagrid/columns_spec.rb
|
291
292
|
- spec/datagrid/core_spec.rb
|
292
293
|
- spec/datagrid/drivers/active_record_spec.rb
|
294
|
+
- spec/datagrid/drivers/array_spec.rb
|
293
295
|
- spec/datagrid/drivers/mongo_mapper_spec.rb
|
294
296
|
- spec/datagrid/drivers/mongoid_spec.rb
|
295
297
|
- spec/datagrid/filters/boolean_enum_filter_spec.rb
|
@@ -302,6 +304,7 @@ files:
|
|
302
304
|
- spec/datagrid/form_builder_spec.rb
|
303
305
|
- spec/datagrid/helper_spec.rb
|
304
306
|
- spec/datagrid/ordering_spec.rb
|
307
|
+
- spec/datagrid/scaffold_spec.rb
|
305
308
|
- spec/datagrid/utils_spec.rb
|
306
309
|
- spec/datagrid_spec.rb
|
307
310
|
- spec/spec_helper.rb
|
@@ -311,8 +314,6 @@ files:
|
|
311
314
|
- spec/support/mongoid.rb
|
312
315
|
- spec/support/simple_report.rb
|
313
316
|
- spec/support/test_partials/_actions.html.erb
|
314
|
-
- template/controller.rb.erb
|
315
|
-
- template/grid.rb.erb
|
316
317
|
- templates/controller.rb.erb
|
317
318
|
- templates/grid.rb.erb
|
318
319
|
- templates/index.html.erb
|
@@ -331,7 +332,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
331
332
|
version: '0'
|
332
333
|
segments:
|
333
334
|
- 0
|
334
|
-
hash:
|
335
|
+
hash: 3628850104894180281
|
335
336
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
336
337
|
none: false
|
337
338
|
requirements:
|
data/template/controller.rb.erb
DELETED