datagrid 0.4.1 → 0.5.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.
- data/Gemfile.lock +82 -62
- data/Readme.markdown +0 -2
- data/VERSION +1 -1
- data/app/views/datagrid/_head.html.erb +8 -0
- data/app/views/datagrid/_row.html.erb +7 -0
- data/app/views/datagrid/_table.html.erb +10 -0
- data/datagrid.gemspec +13 -5
- data/lib/datagrid.rb +3 -0
- data/lib/datagrid/columns.rb +15 -9
- data/lib/datagrid/columns/column.rb +13 -4
- data/lib/datagrid/drivers/active_record.rb +1 -0
- data/lib/datagrid/drivers/mongoid.rb +1 -0
- data/lib/datagrid/engine.rb +12 -0
- data/lib/datagrid/form_builder.rb +4 -4
- data/lib/datagrid/helper.rb +14 -58
- data/lib/datagrid/renderer.rb +73 -0
- data/lib/datagrid/rspec.rb +2 -1
- data/lib/datagrid/utils.rb +10 -0
- data/lib/tasks/datagrid_tasks.rake +19 -0
- data/spec/datagrid/columns_spec.rb +7 -3
- data/spec/datagrid/filters/enum_filter_spec.rb +0 -9
- data/spec/datagrid/filters_spec.rb +11 -1
- data/spec/datagrid/helper_spec.rb +105 -87
- data/spec/datagrid/utils_spec.rb +14 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/{schema.rb → active_record.rb} +0 -0
- data/spec/support/matchers.rb +93 -0
- data/spec/support/simple_report.rb +4 -0
- data/spec/support/test_partials/_actions.html.erb +1 -0
- metadata +15 -7
- data/spec/support/equal_to_dom.rb +0 -42
data/Gemfile.lock
CHANGED
|
@@ -1,91 +1,105 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: http://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
-
abstract (1.0.0)
|
|
5
4
|
accept_values_for (0.4.3)
|
|
6
5
|
activemodel (>= 3.0.0)
|
|
7
6
|
rspec
|
|
8
|
-
actionmailer (3.
|
|
9
|
-
actionpack (= 3.
|
|
10
|
-
mail (~> 2.
|
|
11
|
-
actionpack (3.
|
|
12
|
-
activemodel (= 3.
|
|
13
|
-
activesupport (= 3.
|
|
14
|
-
builder (~>
|
|
15
|
-
erubis (~> 2.
|
|
16
|
-
i18n (~> 0.
|
|
17
|
-
rack (~> 1.
|
|
18
|
-
rack-
|
|
19
|
-
rack-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
7
|
+
actionmailer (3.1.3)
|
|
8
|
+
actionpack (= 3.1.3)
|
|
9
|
+
mail (~> 2.3.0)
|
|
10
|
+
actionpack (3.1.3)
|
|
11
|
+
activemodel (= 3.1.3)
|
|
12
|
+
activesupport (= 3.1.3)
|
|
13
|
+
builder (~> 3.0.0)
|
|
14
|
+
erubis (~> 2.7.0)
|
|
15
|
+
i18n (~> 0.6)
|
|
16
|
+
rack (~> 1.3.5)
|
|
17
|
+
rack-cache (~> 1.1)
|
|
18
|
+
rack-mount (~> 0.8.2)
|
|
19
|
+
rack-test (~> 0.6.1)
|
|
20
|
+
sprockets (~> 2.0.3)
|
|
21
|
+
activemodel (3.1.3)
|
|
22
|
+
activesupport (= 3.1.3)
|
|
23
|
+
builder (~> 3.0.0)
|
|
24
|
+
i18n (~> 0.6)
|
|
25
|
+
activerecord (3.1.3)
|
|
26
|
+
activemodel (= 3.1.3)
|
|
27
|
+
activesupport (= 3.1.3)
|
|
28
|
+
arel (~> 2.2.1)
|
|
29
|
+
tzinfo (~> 0.3.29)
|
|
30
|
+
activeresource (3.1.3)
|
|
31
|
+
activemodel (= 3.1.3)
|
|
32
|
+
activesupport (= 3.1.3)
|
|
33
|
+
activesupport (3.1.3)
|
|
34
|
+
multi_json (~> 1.0)
|
|
35
|
+
arel (2.2.1)
|
|
35
36
|
bson (1.4.0)
|
|
36
37
|
bson_ext (1.4.0)
|
|
37
|
-
builder (
|
|
38
|
-
columnize (0.3.
|
|
39
|
-
diff-lcs (1.1.
|
|
40
|
-
erubis (2.
|
|
41
|
-
|
|
42
|
-
fastercsv (1.5.3)
|
|
38
|
+
builder (3.0.0)
|
|
39
|
+
columnize (0.3.5)
|
|
40
|
+
diff-lcs (1.1.3)
|
|
41
|
+
erubis (2.7.0)
|
|
42
|
+
fastercsv (1.5.4)
|
|
43
43
|
git (1.2.5)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
hike (1.2.1)
|
|
45
|
+
i18n (0.6.0)
|
|
46
|
+
jeweler (1.6.4)
|
|
47
|
+
bundler (~> 1.0)
|
|
47
48
|
git (>= 1.2.5)
|
|
48
49
|
rake
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
json (1.6.3)
|
|
51
|
+
linecache (0.46)
|
|
52
|
+
rbx-require-relative (> 0.0.4)
|
|
53
|
+
mail (2.3.0)
|
|
52
54
|
i18n (>= 0.4.0)
|
|
53
55
|
mime-types (~> 1.16)
|
|
54
56
|
treetop (~> 1.4.8)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
metaclass (0.0.1)
|
|
58
|
+
mime-types (1.17.2)
|
|
59
|
+
mocha (0.10.0)
|
|
60
|
+
metaclass (~> 0.0.1)
|
|
57
61
|
mongo (1.4.0)
|
|
58
62
|
bson (= 1.4.0)
|
|
59
63
|
mongoid (2.2.2)
|
|
60
64
|
activemodel (~> 3.0)
|
|
61
65
|
mongo (~> 1.3)
|
|
62
66
|
tzinfo (~> 0.3.22)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
rack
|
|
67
|
+
multi_json (1.0.4)
|
|
68
|
+
nokogiri (1.5.0)
|
|
69
|
+
polyglot (0.3.3)
|
|
70
|
+
rack (1.3.5)
|
|
71
|
+
rack-cache (1.1)
|
|
72
|
+
rack (>= 0.4)
|
|
73
|
+
rack-mount (0.8.3)
|
|
67
74
|
rack (>= 1.0.0)
|
|
68
|
-
rack-
|
|
75
|
+
rack-ssl (1.3.2)
|
|
76
|
+
rack
|
|
77
|
+
rack-test (0.6.1)
|
|
69
78
|
rack (>= 1.0)
|
|
70
|
-
rails (3.
|
|
71
|
-
actionmailer (= 3.
|
|
72
|
-
actionpack (= 3.
|
|
73
|
-
activerecord (= 3.
|
|
74
|
-
activeresource (= 3.
|
|
75
|
-
activesupport (= 3.
|
|
79
|
+
rails (3.1.3)
|
|
80
|
+
actionmailer (= 3.1.3)
|
|
81
|
+
actionpack (= 3.1.3)
|
|
82
|
+
activerecord (= 3.1.3)
|
|
83
|
+
activeresource (= 3.1.3)
|
|
84
|
+
activesupport (= 3.1.3)
|
|
76
85
|
bundler (~> 1.0)
|
|
77
|
-
railties (= 3.
|
|
78
|
-
railties (3.
|
|
79
|
-
actionpack (= 3.
|
|
80
|
-
activesupport (= 3.
|
|
86
|
+
railties (= 3.1.3)
|
|
87
|
+
railties (3.1.3)
|
|
88
|
+
actionpack (= 3.1.3)
|
|
89
|
+
activesupport (= 3.1.3)
|
|
90
|
+
rack-ssl (~> 1.3.2)
|
|
81
91
|
rake (>= 0.8.7)
|
|
82
|
-
|
|
92
|
+
rdoc (~> 3.4)
|
|
93
|
+
thor (~> 0.14.6)
|
|
83
94
|
rake (0.9.2.2)
|
|
95
|
+
rbx-require-relative (0.0.5)
|
|
96
|
+
rdoc (3.11)
|
|
97
|
+
json (~> 1.4)
|
|
84
98
|
rspec (2.6.0)
|
|
85
99
|
rspec-core (~> 2.6.0)
|
|
86
100
|
rspec-expectations (~> 2.6.0)
|
|
87
101
|
rspec-mocks (~> 2.6.0)
|
|
88
|
-
rspec-core (2.6.
|
|
102
|
+
rspec-core (2.6.4)
|
|
89
103
|
rspec-expectations (2.6.0)
|
|
90
104
|
diff-lcs (~> 1.1.2)
|
|
91
105
|
rspec-mocks (2.6.0)
|
|
@@ -94,13 +108,19 @@ GEM
|
|
|
94
108
|
ruby-debug-base (~> 0.10.4.0)
|
|
95
109
|
ruby-debug-base (0.10.4)
|
|
96
110
|
linecache (>= 0.3)
|
|
97
|
-
|
|
111
|
+
sprockets (2.0.3)
|
|
112
|
+
hike (~> 1.2)
|
|
113
|
+
rack (~> 1.0)
|
|
114
|
+
tilt (~> 1.1, != 1.3.0)
|
|
115
|
+
sqlite3 (1.3.5)
|
|
98
116
|
sqlite3-ruby (1.3.3)
|
|
99
117
|
sqlite3 (>= 1.3.3)
|
|
100
118
|
thor (0.14.6)
|
|
101
|
-
|
|
119
|
+
tilt (1.3.3)
|
|
120
|
+
treetop (1.4.10)
|
|
121
|
+
polyglot
|
|
102
122
|
polyglot (>= 0.3.1)
|
|
103
|
-
tzinfo (0.3.
|
|
123
|
+
tzinfo (0.3.31)
|
|
104
124
|
will_paginate (2.3.15)
|
|
105
125
|
|
|
106
126
|
PLATFORMS
|
data/Readme.markdown
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.5.0
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Local variables:
|
|
3
|
+
* grid - instance of Datagrid
|
|
4
|
+
* assets - Array of database Entities
|
|
5
|
+
* options - passed options Hash
|
|
6
|
+
-->
|
|
7
|
+
<%= content_tag :table, options[:html] do %>
|
|
8
|
+
<%= datagrid_header(grid, options) %>
|
|
9
|
+
<%= datagrid_rows(grid, assets, options) %>
|
|
10
|
+
<% end %>
|
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
|
+
s.version = "0.5.0"
|
|
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 = "
|
|
12
|
+
s.date = "2012-01-03"
|
|
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 = [
|
|
@@ -24,6 +24,9 @@ Gem::Specification.new do |s|
|
|
|
24
24
|
"Rakefile",
|
|
25
25
|
"Readme.markdown",
|
|
26
26
|
"VERSION",
|
|
27
|
+
"app/views/datagrid/_head.html.erb",
|
|
28
|
+
"app/views/datagrid/_row.html.erb",
|
|
29
|
+
"app/views/datagrid/_table.html.erb",
|
|
27
30
|
"datagrid.gemspec",
|
|
28
31
|
"lib/datagrid.rb",
|
|
29
32
|
"lib/datagrid/active_model.rb",
|
|
@@ -34,6 +37,7 @@ Gem::Specification.new do |s|
|
|
|
34
37
|
"lib/datagrid/drivers/abstract_driver.rb",
|
|
35
38
|
"lib/datagrid/drivers/active_record.rb",
|
|
36
39
|
"lib/datagrid/drivers/mongoid.rb",
|
|
40
|
+
"lib/datagrid/engine.rb",
|
|
37
41
|
"lib/datagrid/filters.rb",
|
|
38
42
|
"lib/datagrid/filters/base_filter.rb",
|
|
39
43
|
"lib/datagrid/filters/boolean_enum_filter.rb",
|
|
@@ -48,8 +52,10 @@ Gem::Specification.new do |s|
|
|
|
48
52
|
"lib/datagrid/form_builder.rb",
|
|
49
53
|
"lib/datagrid/helper.rb",
|
|
50
54
|
"lib/datagrid/ordering.rb",
|
|
55
|
+
"lib/datagrid/renderer.rb",
|
|
51
56
|
"lib/datagrid/rspec.rb",
|
|
52
57
|
"lib/datagrid/utils.rb",
|
|
58
|
+
"lib/tasks/datagrid_tasks.rake",
|
|
53
59
|
"spec/datagrid/active_model_spec.rb",
|
|
54
60
|
"spec/datagrid/columns_spec.rb",
|
|
55
61
|
"spec/datagrid/drivers/active_record_spec.rb",
|
|
@@ -61,12 +67,14 @@ Gem::Specification.new do |s|
|
|
|
61
67
|
"spec/datagrid/form_builder_spec.rb",
|
|
62
68
|
"spec/datagrid/helper_spec.rb",
|
|
63
69
|
"spec/datagrid/ordering_spec.rb",
|
|
70
|
+
"spec/datagrid/utils_spec.rb",
|
|
64
71
|
"spec/datagrid_spec.rb",
|
|
65
72
|
"spec/spec_helper.rb",
|
|
66
|
-
"spec/support/
|
|
73
|
+
"spec/support/active_record.rb",
|
|
74
|
+
"spec/support/matchers.rb",
|
|
67
75
|
"spec/support/mongoid.rb",
|
|
68
|
-
"spec/support/
|
|
69
|
-
"spec/support/
|
|
76
|
+
"spec/support/simple_report.rb",
|
|
77
|
+
"spec/support/test_partials/_actions.html.erb"
|
|
70
78
|
]
|
|
71
79
|
s.homepage = "http://github.com/bogdan/datagrid"
|
|
72
80
|
s.licenses = ["MIT"]
|
data/lib/datagrid.rb
CHANGED
data/lib/datagrid/columns.rb
CHANGED
|
@@ -12,15 +12,16 @@ module Datagrid
|
|
|
12
12
|
|
|
13
13
|
include Datagrid::Core
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
end
|
|
17
16
|
base.send :include, InstanceMethods
|
|
18
17
|
end # self.included
|
|
19
18
|
|
|
20
19
|
module ClassMethods
|
|
21
20
|
|
|
22
|
-
def columns
|
|
23
|
-
@columns ||= []
|
|
21
|
+
def columns(options = {})
|
|
22
|
+
(@columns ||= []).reject do |column|
|
|
23
|
+
options[:data] && column.html?
|
|
24
|
+
end
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
def column(name, options = {}, &block)
|
|
@@ -28,7 +29,8 @@ module Datagrid
|
|
|
28
29
|
block ||= lambda do |model|
|
|
29
30
|
model.send(name)
|
|
30
31
|
end
|
|
31
|
-
|
|
32
|
+
@columns ||= []
|
|
33
|
+
@columns << Datagrid::Columns::Column.new(self, name, options, &block)
|
|
32
34
|
end
|
|
33
35
|
|
|
34
36
|
def column_by_name(name)
|
|
@@ -42,12 +44,12 @@ module Datagrid
|
|
|
42
44
|
|
|
43
45
|
# Returns <tt>Array</tt> of human readable column names. See also "Localization" section
|
|
44
46
|
def header
|
|
45
|
-
self.
|
|
47
|
+
self.data_columns.map(&:header)
|
|
46
48
|
end
|
|
47
49
|
|
|
48
50
|
# Returns <tt>Array</tt> column values for given asset
|
|
49
51
|
def row_for(asset)
|
|
50
|
-
self.
|
|
52
|
+
self.data_columns.map do |column|
|
|
51
53
|
column.value(asset, self)
|
|
52
54
|
end
|
|
53
55
|
end
|
|
@@ -55,7 +57,7 @@ module Datagrid
|
|
|
55
57
|
# Returns <tt>Hash</tt> where keys are column names and values are column values for the given asset
|
|
56
58
|
def hash_for(asset)
|
|
57
59
|
result = {}
|
|
58
|
-
self.
|
|
60
|
+
self.data_columns.each do |column|
|
|
59
61
|
result[column.name] = column.value(asset, self)
|
|
60
62
|
end
|
|
61
63
|
result
|
|
@@ -94,8 +96,12 @@ module Datagrid
|
|
|
94
96
|
end
|
|
95
97
|
end
|
|
96
98
|
|
|
97
|
-
def columns
|
|
98
|
-
self.class.columns
|
|
99
|
+
def columns(options ={})
|
|
100
|
+
self.class.columns(options)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def data_columns
|
|
104
|
+
self.columns(:data => true)
|
|
99
105
|
end
|
|
100
106
|
|
|
101
107
|
def column_by_name(name)
|
|
@@ -7,17 +7,20 @@ class Datagrid::Columns::Column
|
|
|
7
7
|
self.name = name.to_sym
|
|
8
8
|
self.options = options
|
|
9
9
|
self.block = block
|
|
10
|
+
if format
|
|
11
|
+
::Datagrid::Utils.warn_once(":format column option is deprecated. Use :url or :html option instead.")
|
|
12
|
+
end
|
|
10
13
|
end
|
|
11
14
|
|
|
12
|
-
def value(model,
|
|
13
|
-
value_for(model,
|
|
15
|
+
def value(model, grid)
|
|
16
|
+
value_for(model, grid)
|
|
14
17
|
end
|
|
15
18
|
|
|
16
|
-
def value_for(model,
|
|
19
|
+
def value_for(model, grid)
|
|
17
20
|
if self.block.arity == 1
|
|
18
21
|
self.block.call(model)
|
|
19
22
|
elsif self.block.arity == 2
|
|
20
|
-
self.block.call(model,
|
|
23
|
+
self.block.call(model, grid)
|
|
21
24
|
else
|
|
22
25
|
model.instance_eval(&self.block)
|
|
23
26
|
end
|
|
@@ -49,4 +52,10 @@ class Datagrid::Columns::Column
|
|
|
49
52
|
self.options[:order_desc]
|
|
50
53
|
end
|
|
51
54
|
|
|
55
|
+
|
|
56
|
+
def html?
|
|
57
|
+
!! self.options[:html]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
52
61
|
end
|
|
@@ -7,7 +7,7 @@ module Datagrid
|
|
|
7
7
|
filter = get_filter(filter_or_attribute)
|
|
8
8
|
options[:class] ||= ""
|
|
9
9
|
options[:class] += " " unless options[:class].blank?
|
|
10
|
-
options[:class] += "#{filter.name} #{
|
|
10
|
+
options[:class] += "#{filter.name} #{datagrid_filter_html_class(filter)}"
|
|
11
11
|
self.send(datagrid_filter_method(filter), filter, options)
|
|
12
12
|
end
|
|
13
13
|
|
|
@@ -67,12 +67,12 @@ module Datagrid
|
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
|
|
70
|
-
def
|
|
71
|
-
|
|
70
|
+
def datagrid_filter_html_class(filter)
|
|
71
|
+
filter.class.to_s.demodulize.underscore
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
def datagrid_filter_method(filter)
|
|
75
|
-
:"datagrid_#{filter.class.to_s.underscore
|
|
75
|
+
:"datagrid_#{filter.class.to_s.demodulize.underscore}"
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
class Error < StandardError
|
data/lib/datagrid/helper.rb
CHANGED
|
@@ -1,83 +1,39 @@
|
|
|
1
|
+
require "datagrid/engine"
|
|
1
2
|
require "action_view"
|
|
2
3
|
|
|
3
4
|
module Datagrid
|
|
4
5
|
module Helper
|
|
5
6
|
|
|
6
7
|
def datagrid_format_value(report, column, asset)
|
|
7
|
-
|
|
8
|
-
url = column.options[:url] && column.options[:url].call(asset)
|
|
9
|
-
if url
|
|
10
|
-
link_to(value, url)
|
|
11
|
-
else
|
|
12
|
-
case column.format
|
|
13
|
-
when :url
|
|
14
|
-
link_to(column.label ? asset.send(column.label) : I18n.t("datagrid.table.url_label", :default => "URL"), value)
|
|
15
|
-
else
|
|
16
|
-
_safe(value)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
8
|
+
datagrid_renderer.format_value(report, column, asset)
|
|
19
9
|
end
|
|
20
10
|
|
|
21
11
|
def datagrid_table(report, *args)
|
|
22
|
-
|
|
23
|
-
html = options[:html] || {}
|
|
24
|
-
html[:class] ||= "datagrid"
|
|
25
|
-
assets = args.any? ? args.shift : report.assets
|
|
26
|
-
paginate = options[:paginate]
|
|
27
|
-
assets = assets.paginate(paginate) if paginate
|
|
28
|
-
content = content_tag(:tr, datagrid_header(report, options)) + datagrid_rows(report, assets, options)
|
|
29
|
-
content_tag(:table, content, html)
|
|
12
|
+
datagrid_renderer.table(report, *args)
|
|
30
13
|
end
|
|
31
14
|
|
|
32
|
-
|
|
33
15
|
def datagrid_header(grid, options = {})
|
|
34
|
-
header
|
|
35
|
-
options[:order] = true unless options.has_key?(:order)
|
|
36
|
-
grid.columns.each do |column|
|
|
37
|
-
data = _safe(column.header)
|
|
38
|
-
if options[:order] && column.order
|
|
39
|
-
data << datagrid_order_for(grid, column)
|
|
40
|
-
end
|
|
41
|
-
header << content_tag(:th, data, :class => column.name)
|
|
42
|
-
end
|
|
43
|
-
header
|
|
16
|
+
datagrid_renderer.header(grid, options)
|
|
44
17
|
end
|
|
45
18
|
|
|
46
|
-
def datagrid_rows(report, assets, options)
|
|
47
|
-
|
|
48
|
-
result = assets.map do |asset|
|
|
49
|
-
content = columns.map do |column|
|
|
50
|
-
content_tag(:td, datagrid_format_value(report, column, asset), :class => column.name)
|
|
51
|
-
end.join(empty_string)
|
|
52
|
-
content_tag(:tr, _safe(content), :class => options[:cycle] && cycle(*options[:cycle]))
|
|
53
|
-
end.join(empty_string)
|
|
54
|
-
_safe(result)
|
|
19
|
+
def datagrid_rows(report, assets, options = {})
|
|
20
|
+
datagrid_renderer.rows(report, assets, options)
|
|
55
21
|
end
|
|
56
22
|
|
|
57
23
|
def datagrid_order_for(grid, column)
|
|
58
|
-
|
|
59
|
-
link_to(
|
|
60
|
-
I18n.t("datagrid.table.order.asc", :default => "ASC"),
|
|
61
|
-
url_for(grid.param_name => grid.attributes.merge(:order => column.name, :descending => false)),
|
|
62
|
-
:class => "order asc"
|
|
63
|
-
) + " " + link_to(
|
|
64
|
-
I18n.t("datagrid.table.order.desc", :default => "DESC"),
|
|
65
|
-
url_for(grid.param_name => grid.attributes.merge(:order => column.name, :descending => true )),
|
|
66
|
-
:class => "order desc"
|
|
67
|
-
)
|
|
68
|
-
end
|
|
24
|
+
datagrid_renderer.order_for(grid, column)
|
|
69
25
|
end
|
|
70
26
|
|
|
71
27
|
protected
|
|
72
|
-
|
|
73
|
-
|
|
28
|
+
|
|
29
|
+
def datagrid_renderer
|
|
30
|
+
Renderer.for(self)
|
|
74
31
|
end
|
|
75
32
|
|
|
76
|
-
def
|
|
77
|
-
|
|
33
|
+
def datagrid_column_classes(grid, column)
|
|
34
|
+
order_class = grid.order == column.name ? ["ordered", grid.descending ? "desc" : "asc"] : nil
|
|
35
|
+
[column.name, order_class].compact.join(" ")
|
|
78
36
|
end
|
|
79
37
|
end
|
|
80
|
-
|
|
81
|
-
::ActionView::Base.send(:include, ::Datagrid::Helper)
|
|
82
|
-
|
|
83
38
|
end
|
|
39
|
+
ActionView::Base.send(:include, Datagrid::Helper)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
require "action_view"
|
|
2
|
+
|
|
3
|
+
module Datagrid
|
|
4
|
+
class Renderer
|
|
5
|
+
|
|
6
|
+
def self.for(template)
|
|
7
|
+
new(template)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def initialize(template)
|
|
11
|
+
@template = template
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def format_value(grid, column, asset)
|
|
15
|
+
value = column.html? ? @template.instance_exec(asset, &column.block) : column.value(asset, grid)
|
|
16
|
+
url = column.options[:url] && column.options[:url].call(asset)
|
|
17
|
+
if url
|
|
18
|
+
@template.link_to(value, url)
|
|
19
|
+
else
|
|
20
|
+
case column.format
|
|
21
|
+
when :url
|
|
22
|
+
@template.link_to(column.label ? asset.send(column.label) : I18n.t("datagrid.table.url_label", :default => "URL"), value)
|
|
23
|
+
else
|
|
24
|
+
_safe(value)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def table(grid, *args)
|
|
30
|
+
options = args.extract_options!
|
|
31
|
+
options[:html] ||= {}
|
|
32
|
+
options[:html][:class] ||= "datagrid #{grid.class.to_s.underscore.demodulize}"
|
|
33
|
+
assets = args.any? ? args.shift : grid.assets
|
|
34
|
+
paginate = options[:paginate]
|
|
35
|
+
assets = assets.paginate(paginate) if paginate
|
|
36
|
+
|
|
37
|
+
@template.render :partial => "datagrid/table", :locals => {:grid => grid, :options => options, :assets => assets}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def header(grid, options = {})
|
|
41
|
+
options[:order] = true unless options.has_key?(:order)
|
|
42
|
+
|
|
43
|
+
@template.render :partial => "datagrid/head", :locals => {:grid => grid, :options => options}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def rows(grid, assets, options = {})
|
|
47
|
+
result = assets.map do |asset|
|
|
48
|
+
@template.render :partial => "datagrid/row", :locals => {:grid => grid, :options => options, :asset => asset}
|
|
49
|
+
end.join
|
|
50
|
+
|
|
51
|
+
_safe(result)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def order_for(grid, column)
|
|
55
|
+
@template.content_tag(:div, :class => "order") do
|
|
56
|
+
@template.link_to(
|
|
57
|
+
I18n.t("datagrid.table.order.asc", :default => "ASC"),
|
|
58
|
+
@template.url_for(grid.param_name => grid.attributes.merge(:order => column.name, :descending => false)),
|
|
59
|
+
:class => "order asc"
|
|
60
|
+
) + " " + @template.link_to(
|
|
61
|
+
I18n.t("datagrid.table.order.desc", :default => "DESC"),
|
|
62
|
+
@template.url_for(grid.param_name => grid.attributes.merge(:order => column.name, :descending => true )),
|
|
63
|
+
:class => "order desc"
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _safe(string)
|
|
70
|
+
string.respond_to?(:html_safe) ? string.html_safe : string
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
data/lib/datagrid/rspec.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require "datagrid"
|
|
2
2
|
|
|
3
|
+
#TODO: refactor this experimental shit
|
|
3
4
|
shared_examples_for "Datagrid" do
|
|
4
5
|
describe "as Datagrid" do
|
|
5
6
|
|
|
@@ -9,7 +10,7 @@ shared_examples_for "Datagrid" do
|
|
|
9
10
|
|
|
10
11
|
its(:data) {should_not be_empty}
|
|
11
12
|
|
|
12
|
-
described_class.columns.each do |column|
|
|
13
|
+
described_class.columns(:data => true).each do |column|
|
|
13
14
|
describe "column ##{column.name}" do
|
|
14
15
|
|
|
15
16
|
it "should has value in #data_hash" do
|
data/lib/datagrid/utils.rb
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
namespace :datagrid do
|
|
2
|
+
|
|
3
|
+
desc "Copy table partials into rails application"
|
|
4
|
+
task :copy_partials do
|
|
5
|
+
require "fileutils"
|
|
6
|
+
def copy_template(path)
|
|
7
|
+
gem_app = File.expand_path("../../../app", __FILE__)
|
|
8
|
+
rails_app = (Rails.root + "app").to_s
|
|
9
|
+
full_path = "#{rails_app}/#{File.dirname path}"
|
|
10
|
+
puts "* copy #{full_path}"
|
|
11
|
+
FileUtils.mkdir_p full_path
|
|
12
|
+
FileUtils.cp "#{gem_app}/#{path}", full_path
|
|
13
|
+
end
|
|
14
|
+
copy_template "views/datagrid/_table.html.erb"
|
|
15
|
+
copy_template "views/datagrid/_head.html.erb"
|
|
16
|
+
copy_template "views/datagrid/_row.html.erb"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -13,6 +13,10 @@ describe Datagrid::Columns do
|
|
|
13
13
|
let!(:entry) { Entry.create!(
|
|
14
14
|
:group => group, :name => "Star", :disabled => false, :confirmed => false, :category => "first"
|
|
15
15
|
) }
|
|
16
|
+
|
|
17
|
+
it "should have data columns without html columns" do
|
|
18
|
+
subject.data_columns.size.should == subject.columns.size - 1
|
|
19
|
+
end
|
|
16
20
|
it "should build rows of data" do
|
|
17
21
|
subject.rows.should == [["Pop", "Star"]]
|
|
18
22
|
end
|
|
@@ -34,9 +38,9 @@ describe Datagrid::Columns do
|
|
|
34
38
|
}
|
|
35
39
|
end
|
|
36
40
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
it "should support csv export" do
|
|
42
|
+
subject.to_csv.should == "Group,Name\nPop,Star\n"
|
|
43
|
+
end
|
|
40
44
|
end
|
|
41
45
|
|
|
42
46
|
it "should support columns with model and report arguments" do
|
|
@@ -16,13 +16,4 @@ describe Datagrid::Filters::EnumFilter do
|
|
|
16
16
|
end.class.filter_by_name(:group_id).select.should == [1,2]
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
it "should stack with other filters" do
|
|
20
|
-
Entry.create(:name => "ZZ", :category => "first")
|
|
21
|
-
report = test_report(:name => "Pop", :category => "first") do
|
|
22
|
-
scope { Entry }
|
|
23
|
-
filter(:name)
|
|
24
|
-
filter(:category, :enum, :select => ["first", "second"])
|
|
25
|
-
end
|
|
26
|
-
report.assets.should be_empty
|
|
27
|
-
end
|
|
28
19
|
end
|
|
@@ -9,6 +9,16 @@ describe Datagrid::Filters do
|
|
|
9
9
|
end.created_at.should == Date.today
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
it "should stack with other filters" do
|
|
13
|
+
Entry.create(:name => "ZZ", :category => "first")
|
|
14
|
+
report = test_report(:name => "Pop", :category => "first") do
|
|
15
|
+
scope { Entry }
|
|
16
|
+
filter(:name)
|
|
17
|
+
filter(:category, :enum, :select => ["first", "second"])
|
|
18
|
+
end
|
|
19
|
+
report.assets.should be_empty
|
|
20
|
+
end
|
|
21
|
+
|
|
12
22
|
it "should not support array argument for not multiple filter" do
|
|
13
23
|
report = test_report do
|
|
14
24
|
scope {Entry}
|
|
@@ -20,7 +30,7 @@ describe Datagrid::Filters do
|
|
|
20
30
|
end
|
|
21
31
|
|
|
22
32
|
|
|
23
|
-
it "should initialize report Scope table not exists" do
|
|
33
|
+
it "should initialize when report Scope table not exists" do
|
|
24
34
|
class ModelWithoutTable < ActiveRecord::Base; end
|
|
25
35
|
ModelWithoutTable.should_not be_table_exists
|
|
26
36
|
class TheReport
|
|
@@ -3,15 +3,22 @@ require "will_paginate"
|
|
|
3
3
|
require "active_support/core_ext/hash"
|
|
4
4
|
require "active_support/core_ext/object"
|
|
5
5
|
|
|
6
|
+
require 'datagrid/renderer'
|
|
7
|
+
|
|
6
8
|
describe Datagrid::Helper do
|
|
7
|
-
subject
|
|
9
|
+
subject do
|
|
10
|
+
template = ActionView::Base.new
|
|
11
|
+
template.view_paths << File.expand_path("../../../app/views", __FILE__)
|
|
12
|
+
template.view_paths << File.expand_path("../../support/test_partials", __FILE__)
|
|
13
|
+
template
|
|
14
|
+
end
|
|
8
15
|
|
|
9
16
|
before(:each) do
|
|
10
17
|
subject.stub!(:params).and_return({})
|
|
11
18
|
subject.stub(:url_for) do |options|
|
|
12
19
|
options.to_param
|
|
13
20
|
end
|
|
14
|
-
|
|
21
|
+
|
|
15
22
|
end
|
|
16
23
|
|
|
17
24
|
let(:group) { Group.create!(:name => "Pop") }
|
|
@@ -21,108 +28,119 @@ describe Datagrid::Helper do
|
|
|
21
28
|
let(:grid) { SimpleReport.new }
|
|
22
29
|
|
|
23
30
|
describe ".datagrid_table" do
|
|
24
|
-
|
|
25
|
-
subject.
|
|
31
|
+
it "should have grid class as html class on table" do
|
|
32
|
+
subject.datagrid_table(grid).should match_css_pattern(
|
|
33
|
+
"table.datagrid.simple_report" => 1
|
|
34
|
+
)
|
|
26
35
|
end
|
|
27
36
|
it "should return data table html" do
|
|
28
|
-
subject.datagrid_table(grid)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
<td class="group">Pop</td>
|
|
39
|
-
<td class="name">Star</td>
|
|
40
|
-
</tr>
|
|
41
|
-
</table>
|
|
42
|
-
HTML
|
|
37
|
+
datagrid_table = subject.datagrid_table(grid)
|
|
38
|
+
|
|
39
|
+
datagrid_table.should match_css_pattern({
|
|
40
|
+
"table.datagrid tr th.group div.order" => 1,
|
|
41
|
+
"table.datagrid tr th.group" => /Group.*/,
|
|
42
|
+
"table.datagrid tr th.name div.order" => 1,
|
|
43
|
+
"table.datagrid tr th.name" => /Name.*/,
|
|
44
|
+
"table.datagrid tr td.group" => "Pop",
|
|
45
|
+
"table.datagrid tr td.name" => "Star"
|
|
46
|
+
})
|
|
43
47
|
end
|
|
48
|
+
|
|
44
49
|
it "should support giving assets explicitly" do
|
|
45
50
|
other_entry = Entry.create!(entry.attributes)
|
|
46
|
-
subject.datagrid_table(grid, [entry])
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
<td class="group">Pop</td>
|
|
57
|
-
<td class="name">Star</td>
|
|
58
|
-
</tr>
|
|
59
|
-
</table>
|
|
60
|
-
HTML
|
|
61
|
-
end
|
|
62
|
-
it "should support giving assets implicitly" do
|
|
63
|
-
other_entry = Entry.create!(entry.attributes)
|
|
64
|
-
subject.datagrid_table(grid, [entry]).should equal_to_dom(<<-HTML)
|
|
65
|
-
<table class="datagrid">
|
|
66
|
-
<tr>
|
|
67
|
-
<th class="group">Group<div class="order"></div>
|
|
68
|
-
</th>
|
|
69
|
-
<th class="name">Name<div class="order"></div>
|
|
70
|
-
</th>
|
|
71
|
-
</tr>
|
|
72
|
-
|
|
73
|
-
<tr>
|
|
74
|
-
<td class="group">Pop</td>
|
|
75
|
-
<td class="name">Star</td>
|
|
76
|
-
</tr>
|
|
77
|
-
</table>
|
|
78
|
-
HTML
|
|
51
|
+
datagrid_table = subject.datagrid_table(grid, [entry])
|
|
52
|
+
|
|
53
|
+
datagrid_table.should match_css_pattern({
|
|
54
|
+
"table.datagrid tr th.group div.order" => 1,
|
|
55
|
+
"table.datagrid tr th.group" => /Group.*/,
|
|
56
|
+
"table.datagrid tr th.name div.order" => 1,
|
|
57
|
+
"table.datagrid tr th.name" => /Name.*/,
|
|
58
|
+
"table.datagrid tr td.group" => "Pop",
|
|
59
|
+
"table.datagrid tr td.name" => "Star"
|
|
60
|
+
})
|
|
79
61
|
end
|
|
80
62
|
|
|
81
63
|
it "should support cycle option" do
|
|
82
|
-
subject.datagrid_rows(grid, [entry], :cycle => ["odd", "even"]).should
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
HTML
|
|
64
|
+
subject.datagrid_rows(grid, [entry], :cycle => ["odd", "even"]).should match_css_pattern({
|
|
65
|
+
"tr.odd td.group" => "Pop",
|
|
66
|
+
"tr.odd td.name" => "Star"
|
|
67
|
+
})
|
|
68
|
+
|
|
88
69
|
end
|
|
89
70
|
|
|
90
|
-
it "should support
|
|
91
|
-
|
|
92
|
-
scope { Entry }
|
|
93
|
-
column(:name, :url => lambda {|model| model.name})
|
|
94
|
-
end
|
|
95
|
-
subject.datagrid_rows(rp, [entry], {}).should equal_to_dom(<<-HTML)
|
|
96
|
-
<tr><td class="name"><a href="Star">Star</a></td></tr>
|
|
97
|
-
HTML
|
|
71
|
+
it "should support no order given" do
|
|
72
|
+
subject.datagrid_table(grid, [entry], :order => false).should match_css_pattern("table.datagrid th .order" => 0)
|
|
98
73
|
end
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
74
|
+
|
|
75
|
+
describe ".datagrid_rows" do
|
|
76
|
+
|
|
77
|
+
it "should support urls" do
|
|
78
|
+
rp = test_report do
|
|
79
|
+
scope { Entry }
|
|
80
|
+
column(:name, :url => lambda {|model| model.name})
|
|
81
|
+
end
|
|
82
|
+
subject.datagrid_rows(rp, [entry]).should match_css_pattern(
|
|
83
|
+
"tr td.name a[href=Star]" => "Star"
|
|
84
|
+
)
|
|
85
|
+
end
|
|
86
|
+
it "should support conditional urls" do
|
|
87
|
+
rp = test_report do
|
|
88
|
+
scope { Entry }
|
|
89
|
+
column(:name, :url => lambda {|model| false})
|
|
90
|
+
end
|
|
91
|
+
subject.datagrid_rows(rp, [entry]).should match_css_pattern(
|
|
92
|
+
"tr td.name" => "Star"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
it "should add ordering classes to column" do
|
|
97
|
+
rp = test_report(:order => :name) do
|
|
98
|
+
scope { Entry }
|
|
99
|
+
column(:name)
|
|
100
|
+
end
|
|
101
|
+
subject.datagrid_rows(rp, [entry]).should match_css_pattern(
|
|
102
|
+
"tr td.name.ordered.asc" => "Star"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
it "should add ordering classes to column" do
|
|
107
|
+
rp = test_report(:order => :name, :descending => true) do
|
|
108
|
+
scope { Entry }
|
|
109
|
+
column(:name)
|
|
110
|
+
end
|
|
111
|
+
subject.datagrid_rows(rp, [entry]).should match_css_pattern(
|
|
112
|
+
"tr td.name.ordered.desc" => "Star"
|
|
113
|
+
)
|
|
103
114
|
end
|
|
104
|
-
subject.datagrid_rows(rp, [entry], {}).should equal_to_dom(<<-HTML)
|
|
105
|
-
<tr><td class="name">Star</td></tr>
|
|
106
|
-
HTML
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
115
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
+
it "should render html columns" do
|
|
117
|
+
|
|
118
|
+
rp = test_report do
|
|
119
|
+
scope { Entry }
|
|
120
|
+
column(:name, :html => true) do |model|
|
|
121
|
+
content_tag(:span, model.name)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
subject.datagrid_rows(rp, [entry]).should match_css_pattern(
|
|
125
|
+
"tr td.name span" => "Star"
|
|
126
|
+
)
|
|
116
127
|
end
|
|
117
|
-
|
|
118
|
-
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
describe ".datagrid_order_for" do
|
|
131
|
+
it "should render ordreing layout" do
|
|
132
|
+
class OrderedGrid
|
|
133
|
+
include Datagrid
|
|
134
|
+
scope { Entry }
|
|
135
|
+
column(:category)
|
|
136
|
+
end
|
|
137
|
+
grid = OrderedGrid.new(:descending => true, :order => :category)
|
|
138
|
+
subject.datagrid_order_for(grid, grid.column_by_name(:category)).should equal_to_dom(<<-HTML)
|
|
119
139
|
<div class="order">
|
|
120
140
|
<a href="ordered_grid%5Bdescending%5D=false&ordered_grid%5Border%5D=category" class="order asc">ASC</a> <a href="ordered_grid%5Bdescending%5D=true&ordered_grid%5Border%5D=category" class="order desc">DESC</a>
|
|
121
141
|
</div>
|
|
122
|
-
HTML
|
|
142
|
+
HTML
|
|
143
|
+
end
|
|
123
144
|
end
|
|
124
|
-
|
|
125
145
|
end
|
|
126
|
-
|
|
127
|
-
|
|
128
146
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Datagrid::Utils do
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
describe ".warn_once" do
|
|
7
|
+
it "should work" do
|
|
8
|
+
silence_warnings do
|
|
9
|
+
Datagrid::Utils.warn_once("hello").should be_true
|
|
10
|
+
end
|
|
11
|
+
Datagrid::Utils.warn_once("hello").should be_false
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -19,7 +19,7 @@ require 'datagrid'
|
|
|
19
19
|
require "discover"
|
|
20
20
|
begin
|
|
21
21
|
require 'ruby-debug'
|
|
22
|
-
rescue
|
|
22
|
+
rescue LoadError
|
|
23
23
|
end
|
|
24
24
|
require 'rspec'
|
|
25
25
|
require "logger"
|
|
@@ -27,6 +27,7 @@ require "logger"
|
|
|
27
27
|
File.open('spec.log', "w").close
|
|
28
28
|
TEST_LOGGER = Logger.new('spec.log')
|
|
29
29
|
|
|
30
|
+
|
|
30
31
|
RSpec.configure do |config|
|
|
31
32
|
|
|
32
33
|
|
|
File without changes
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require "nokogiri"
|
|
2
|
+
|
|
3
|
+
def equal_to_dom(text)
|
|
4
|
+
EqualToDom.new(text)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def include_dom(text)
|
|
9
|
+
IncludeDom.new(text)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def match_css_pattern(pattern)
|
|
13
|
+
CssPattern.new(pattern)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class IncludeDom
|
|
18
|
+
def initialize(expectation)
|
|
19
|
+
@expectation = Nokogiri::HTML::DocumentFragment.parse(expectation.strip).to_s
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def matches?(text)
|
|
23
|
+
@matcher = Nokogiri::HTML::DocumentFragment.parse(text.strip).to_s
|
|
24
|
+
@matcher == @expectation
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def failure_message
|
|
28
|
+
"Expected dom \n#{@matcher.inspect}\n to include \n#{@expectation.inspect}\n, but it wasn't"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class EqualToDom
|
|
34
|
+
|
|
35
|
+
def initialize(expectation)
|
|
36
|
+
@expectation = Nokogiri::HTML::DocumentFragment.parse(expectation.strip).to_s
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def matches?(text)
|
|
40
|
+
@matcher = Nokogiri::HTML::DocumentFragment.parse(text.strip).to_s
|
|
41
|
+
@matcher == @expectation
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def failure_message
|
|
45
|
+
"Expected dom #{@matcher} to match #{@expectation}, but it wasn't"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class CssPattern
|
|
51
|
+
def initialize(pattern)
|
|
52
|
+
@css_pattern = pattern
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def error!(message)
|
|
56
|
+
@error_message = message
|
|
57
|
+
false
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def failure_message
|
|
61
|
+
@error_message || ""
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def matches?(text)
|
|
65
|
+
text = text.clone.force_encoding("UTF-8") if "1.9.3".respond_to? :force_encoding
|
|
66
|
+
|
|
67
|
+
@matcher = Nokogiri::HTML::DocumentFragment.parse(text)
|
|
68
|
+
@css_pattern.each do |css, amount_or_pattern_or_string_or_proc|
|
|
69
|
+
path = @matcher.css(css)
|
|
70
|
+
if amount_or_pattern_or_string_or_proc.is_a?(String) or amount_or_pattern_or_string_or_proc.is_a?(Regexp)
|
|
71
|
+
pattern_or_string = amount_or_pattern_or_string_or_proc
|
|
72
|
+
html = path.inner_html
|
|
73
|
+
if !html.match(pattern_or_string)
|
|
74
|
+
return error!("#{css.inspect} did not match #{pattern_or_string.inspect}. It was \n:#{html.inspect}")
|
|
75
|
+
end
|
|
76
|
+
elsif amount_or_pattern_or_string_or_proc.is_a? Fixnum
|
|
77
|
+
expected_amount = amount_or_pattern_or_string_or_proc
|
|
78
|
+
amount = path.size
|
|
79
|
+
if amount != expected_amount
|
|
80
|
+
return error!("did not find #{css.inspect} #{expected_amount.inspect} times. It was #{amount.inspect}")
|
|
81
|
+
end
|
|
82
|
+
elsif amount_or_pattern_or_string_or_proc.is_a? Proc
|
|
83
|
+
if !amount_or_pattern_or_string_or_proc.call(path)
|
|
84
|
+
return error!("#{css.inspect} did not validate (proc must not return a falsy value)")
|
|
85
|
+
end
|
|
86
|
+
else
|
|
87
|
+
raise "Instance of String, Rexexp, Proc or Fixnum required"
|
|
88
|
+
end
|
|
89
|
+
true
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= "No action for #{model.name}" -%>
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: datagrid
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 11
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
version: 0.
|
|
8
|
+
- 5
|
|
9
|
+
- 0
|
|
10
|
+
version: 0.5.0
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Bogdan Gusiev
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date:
|
|
18
|
+
date: 2012-01-03 00:00:00 Z
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|
|
21
21
|
type: :runtime
|
|
@@ -259,6 +259,9 @@ files:
|
|
|
259
259
|
- Rakefile
|
|
260
260
|
- Readme.markdown
|
|
261
261
|
- VERSION
|
|
262
|
+
- app/views/datagrid/_head.html.erb
|
|
263
|
+
- app/views/datagrid/_row.html.erb
|
|
264
|
+
- app/views/datagrid/_table.html.erb
|
|
262
265
|
- datagrid.gemspec
|
|
263
266
|
- lib/datagrid.rb
|
|
264
267
|
- lib/datagrid/active_model.rb
|
|
@@ -269,6 +272,7 @@ files:
|
|
|
269
272
|
- lib/datagrid/drivers/abstract_driver.rb
|
|
270
273
|
- lib/datagrid/drivers/active_record.rb
|
|
271
274
|
- lib/datagrid/drivers/mongoid.rb
|
|
275
|
+
- lib/datagrid/engine.rb
|
|
272
276
|
- lib/datagrid/filters.rb
|
|
273
277
|
- lib/datagrid/filters/base_filter.rb
|
|
274
278
|
- lib/datagrid/filters/boolean_enum_filter.rb
|
|
@@ -283,8 +287,10 @@ files:
|
|
|
283
287
|
- lib/datagrid/form_builder.rb
|
|
284
288
|
- lib/datagrid/helper.rb
|
|
285
289
|
- lib/datagrid/ordering.rb
|
|
290
|
+
- lib/datagrid/renderer.rb
|
|
286
291
|
- lib/datagrid/rspec.rb
|
|
287
292
|
- lib/datagrid/utils.rb
|
|
293
|
+
- lib/tasks/datagrid_tasks.rake
|
|
288
294
|
- spec/datagrid/active_model_spec.rb
|
|
289
295
|
- spec/datagrid/columns_spec.rb
|
|
290
296
|
- spec/datagrid/drivers/active_record_spec.rb
|
|
@@ -296,12 +302,14 @@ files:
|
|
|
296
302
|
- spec/datagrid/form_builder_spec.rb
|
|
297
303
|
- spec/datagrid/helper_spec.rb
|
|
298
304
|
- spec/datagrid/ordering_spec.rb
|
|
305
|
+
- spec/datagrid/utils_spec.rb
|
|
299
306
|
- spec/datagrid_spec.rb
|
|
300
307
|
- spec/spec_helper.rb
|
|
301
|
-
- spec/support/
|
|
308
|
+
- spec/support/active_record.rb
|
|
309
|
+
- spec/support/matchers.rb
|
|
302
310
|
- spec/support/mongoid.rb
|
|
303
|
-
- spec/support/schema.rb
|
|
304
311
|
- spec/support/simple_report.rb
|
|
312
|
+
- spec/support/test_partials/_actions.html.erb
|
|
305
313
|
homepage: http://github.com/bogdan/datagrid
|
|
306
314
|
licenses:
|
|
307
315
|
- MIT
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
require "nokogiri"
|
|
2
|
-
|
|
3
|
-
def equal_to_dom(text)
|
|
4
|
-
EqualToDom.new(text)
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def include_dom(text)
|
|
9
|
-
IncludeDom.new(text)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
class IncludeDom
|
|
13
|
-
def initialize(expectation)
|
|
14
|
-
@expectation = Nokogiri::HTML::DocumentFragment.parse(expectation).to_s
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def matches?(text)
|
|
18
|
-
@matcher = Nokogiri::HTML::DocumentFragment.parse(text).to_s
|
|
19
|
-
@matcher == @expectation
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def failure_message
|
|
23
|
-
"Expected dom \n#{@matcher.inspect}\n to include \n#{@expectation.inspect}\n, but it wasn't"
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class EqualToDom
|
|
29
|
-
|
|
30
|
-
def initialize(expectation)
|
|
31
|
-
@expectation = Nokogiri::HTML::DocumentFragment.parse(expectation).to_s
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def matches?(text)
|
|
35
|
-
@matcher = Nokogiri::HTML::DocumentFragment.parse(text).to_s
|
|
36
|
-
@matcher == @expectation
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def failure_message
|
|
40
|
-
"Expected dom #{@matcher} to match #{@expectation}, but it wasn't"
|
|
41
|
-
end
|
|
42
|
-
end
|