datagrid 0.6.4 → 0.7.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 +0 -1
- data/Readme.markdown +7 -5
- data/VERSION +1 -1
- data/datagrid.gemspec +5 -5
- data/lib/datagrid/columns.rb +22 -11
- data/lib/datagrid/columns/column.rb +11 -4
- data/lib/datagrid/core.rb +1 -1
- data/lib/datagrid/drivers/abstract_driver.rb +4 -0
- data/lib/datagrid/drivers/active_record.rb +2 -2
- data/lib/datagrid/filters.rb +0 -13
- data/lib/datagrid/filters/base_filter.rb +26 -6
- data/lib/datagrid/filters/date_filter.rb +15 -1
- data/lib/datagrid/filters/integer_filter.rb +6 -0
- data/lib/datagrid/filters/ranged_filter.rb +55 -0
- data/lib/datagrid/form_builder.rb +32 -14
- data/lib/datagrid/helper.rb +2 -2
- data/lib/datagrid/ordering.rb +37 -7
- data/lib/datagrid/renderer.rb +14 -5
- data/lib/datagrid/utils.rb +16 -0
- data/spec/datagrid/columns_spec.rb +19 -7
- data/spec/datagrid/filters/date_filter_spec.rb +96 -0
- data/spec/datagrid/filters/integer_filter_spec.rb +96 -0
- data/spec/datagrid/filters_spec.rb +2 -1
- data/spec/datagrid/form_builder_spec.rb +92 -0
- data/spec/datagrid/helper_spec.rb +89 -5
- data/spec/datagrid/ordering_spec.rb +20 -10
- data/spec/spec_helper.rb +0 -1
- data/spec/support/active_record.rb +2 -0
- data/spec/support/simple_report.rb +6 -0
- metadata +6 -19
data/lib/datagrid/helper.rb
CHANGED
@@ -31,8 +31,8 @@ module Datagrid
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def datagrid_column_classes(grid, column)
|
34
|
-
|
35
|
-
[column.name, order_class].compact.join(" ")
|
34
|
+
order_class = grid.order == column.name ? ["ordered", grid.descending ? "desc" : "asc"] : nil
|
35
|
+
[column.name, order_class, column.options[:class]].compact.join(" ")
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
data/lib/datagrid/ordering.rb
CHANGED
@@ -50,8 +50,8 @@ module Datagrid
|
|
50
50
|
|
51
51
|
def assets
|
52
52
|
result = super
|
53
|
-
if
|
54
|
-
column = column_by_name(
|
53
|
+
if order
|
54
|
+
column = column_by_name(order)
|
55
55
|
result = apply_order(result, column)
|
56
56
|
end
|
57
57
|
result
|
@@ -60,19 +60,49 @@ module Datagrid
|
|
60
60
|
private
|
61
61
|
|
62
62
|
def apply_order(assets, column)
|
63
|
-
|
64
|
-
order = column.order
|
65
|
-
if self.descending?
|
63
|
+
if descending?
|
66
64
|
if column.order_desc
|
67
|
-
|
65
|
+
apply_asc_order(assets, column.order_desc)
|
68
66
|
else
|
69
|
-
|
67
|
+
apply_desc_order(assets, column.order)
|
70
68
|
end
|
69
|
+
else
|
70
|
+
apply_asc_order(assets, column.order)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def apply_asc_order(assets, order)
|
75
|
+
if order.respond_to?(:call)
|
76
|
+
apply_block_order(assets, order)
|
71
77
|
else
|
72
78
|
driver.asc(assets, order)
|
73
79
|
end
|
74
80
|
end
|
75
81
|
|
82
|
+
def apply_desc_order(assets, order)
|
83
|
+
if order.respond_to?(:call)
|
84
|
+
reverse_order(apply_asc_order(assets, order))
|
85
|
+
else
|
86
|
+
driver.desc(assets, order)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def reverse_order(assets)
|
91
|
+
driver.reverse_order(assets)
|
92
|
+
rescue NotImplementedError
|
93
|
+
self.class.order_unsupported("Your ORM do not support reverse order: please specify :order_desc option manually")
|
94
|
+
end
|
95
|
+
|
96
|
+
def apply_block_order(assets, order)
|
97
|
+
case order.arity
|
98
|
+
when -1, 0
|
99
|
+
assets.instance_eval(&order)
|
100
|
+
when 1
|
101
|
+
order.call(assets)
|
102
|
+
else
|
103
|
+
self.class.order_unsupported("Order option proc can not handle more than one argument")
|
104
|
+
end
|
105
|
+
end
|
76
106
|
end # InstanceMethods
|
77
107
|
|
78
108
|
end
|
data/lib/datagrid/renderer.rb
CHANGED
@@ -12,15 +12,24 @@ module Datagrid
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def format_value(grid, column, asset)
|
15
|
+
|
15
16
|
value = if column.html?
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
args = []
|
18
|
+
remaining_arity = column.html_block.arity
|
19
|
+
|
20
|
+
if column.data?
|
21
|
+
args << column.value(asset,grid)
|
22
|
+
remaining_arity -= 1
|
20
23
|
end
|
24
|
+
|
25
|
+
args << asset if remaining_arity > 0
|
26
|
+
args << grid if remaining_arity > 1
|
27
|
+
|
28
|
+
@template.instance_exec(*args, &column.html_block)
|
21
29
|
else
|
22
|
-
column.value(asset,
|
30
|
+
column.value(asset,grid)
|
23
31
|
end
|
32
|
+
|
24
33
|
url = column.options[:url] && column.options[:url].call(asset)
|
25
34
|
if url
|
26
35
|
@template.link_to(value, url)
|
data/lib/datagrid/utils.rb
CHANGED
@@ -2,6 +2,7 @@ module Datagrid
|
|
2
2
|
module Utils
|
3
3
|
class << self
|
4
4
|
|
5
|
+
|
5
6
|
TRUTH = [true, 1, "1", "true", "yes", "on"]
|
6
7
|
|
7
8
|
def booleanize(value)
|
@@ -17,6 +18,21 @@ module Datagrid
|
|
17
18
|
@warnings[message] = true
|
18
19
|
end
|
19
20
|
end
|
21
|
+
|
22
|
+
def add_html_classes(options, *classes)
|
23
|
+
options = options.clone
|
24
|
+
options[:class] ||= ""
|
25
|
+
if options[:class].is_a?(Array)
|
26
|
+
options[:class] += classes
|
27
|
+
else
|
28
|
+
# suppose that it is a String
|
29
|
+
options[:class] += " " unless options[:class].blank?
|
30
|
+
options[:class] += classes.join(" ")
|
31
|
+
end
|
32
|
+
options
|
33
|
+
end
|
34
|
+
|
35
|
+
|
20
36
|
end
|
21
37
|
end
|
22
38
|
end
|
@@ -11,17 +11,23 @@ describe Datagrid::Columns do
|
|
11
11
|
describe "basic methods" do
|
12
12
|
|
13
13
|
let!(:entry) { Entry.create!(
|
14
|
-
:group => group,
|
14
|
+
:group => group,
|
15
|
+
:name => "Star",
|
16
|
+
:disabled => false,
|
17
|
+
:confirmed => false,
|
18
|
+
:category => "first",
|
19
|
+
:access_level => 'admin',
|
20
|
+
:pet => 'rottweiler'
|
15
21
|
) }
|
16
22
|
|
17
23
|
it "should have data columns without html columns" do
|
18
24
|
subject.data_columns.size.should == subject.columns.size - 1
|
19
25
|
end
|
20
26
|
it "should build rows of data" do
|
21
|
-
subject.rows.should == [["Pop", "Star"]]
|
27
|
+
subject.rows.should == [["Pop", "Star", "admin", "ROTTWEILER"]]
|
22
28
|
end
|
23
29
|
it "should generate header" do
|
24
|
-
subject.header.should == ["Group", "Name"]
|
30
|
+
subject.header.should == ["Group", "Name", "Access level", "Pet"]
|
25
31
|
end
|
26
32
|
|
27
33
|
it "should generate table data" do
|
@@ -34,12 +40,18 @@ describe Datagrid::Columns do
|
|
34
40
|
it "should generate hash for given asset" do
|
35
41
|
subject.hash_for(entry).should == {
|
36
42
|
:group => "Pop",
|
37
|
-
:name => "Star"
|
43
|
+
:name => "Star",
|
44
|
+
:access_level => 'admin',
|
45
|
+
:pet => 'ROTTWEILER'
|
38
46
|
}
|
39
47
|
end
|
40
48
|
|
41
49
|
it "should support csv export" do
|
42
|
-
subject.to_csv.should == "Group,Name\nPop,Star\n"
|
50
|
+
subject.to_csv.should == "Group,Name,Access level,Pet\nPop,Star,admin,ROTTWEILER\n"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should support csv export of particular columns" do
|
54
|
+
subject.to_csv(:name).should == "Name\nStar\n"
|
43
55
|
end
|
44
56
|
end
|
45
57
|
|
@@ -50,8 +62,8 @@ describe Datagrid::Columns do
|
|
50
62
|
where("category LIKE '%#{value}%'")
|
51
63
|
end
|
52
64
|
|
53
|
-
column(:exact_category) do |entry,
|
54
|
-
entry.category ==
|
65
|
+
column(:exact_category) do |entry, grid|
|
66
|
+
entry.category == grid.category
|
55
67
|
end
|
56
68
|
end
|
57
69
|
Entry.create!(:category => "foo")
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Datagrid::Filters::DateFilter do
|
4
|
+
|
5
|
+
it "should support date range argument" do
|
6
|
+
e1 = Entry.create!(:created_at => 7.days.ago)
|
7
|
+
e2 = Entry.create!(:created_at => 4.days.ago)
|
8
|
+
e3 = Entry.create!(:created_at => 1.day.ago)
|
9
|
+
report = test_report(:created_at => 5.day.ago..3.days.ago) do
|
10
|
+
scope { Entry }
|
11
|
+
filter(:created_at, :date)
|
12
|
+
end
|
13
|
+
report.assets.should_not include(e1)
|
14
|
+
report.assets.should include(e2)
|
15
|
+
report.assets.should_not include(e3)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should support date range given as array argument" do
|
19
|
+
e1 = Entry.create!(:created_at => 7.days.ago)
|
20
|
+
e2 = Entry.create!(:created_at => 4.days.ago)
|
21
|
+
e3 = Entry.create!(:created_at => 1.day.ago)
|
22
|
+
report = test_report(:created_at => [5.day.ago.to_date.to_s, 3.days.ago.to_date.to_s]) do
|
23
|
+
scope { Entry }
|
24
|
+
filter(:created_at, :date, :range => true)
|
25
|
+
end
|
26
|
+
report.assets.should_not include(e1)
|
27
|
+
report.assets.should include(e2)
|
28
|
+
report.assets.should_not include(e3)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should support minimum date argument" do
|
32
|
+
e1 = Entry.create!(:created_at => 7.days.ago)
|
33
|
+
e2 = Entry.create!(:created_at => 4.days.ago)
|
34
|
+
e3 = Entry.create!(:created_at => 1.day.ago)
|
35
|
+
report = test_report(:created_at => [5.day.ago.to_date.to_s, nil]) do
|
36
|
+
scope { Entry }
|
37
|
+
filter(:created_at, :date, :range => true)
|
38
|
+
end
|
39
|
+
report.assets.should_not include(e1)
|
40
|
+
report.assets.should include(e2)
|
41
|
+
report.assets.should include(e3)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should support maximum date argument" do
|
45
|
+
e1 = Entry.create!(:created_at => 7.days.ago)
|
46
|
+
e2 = Entry.create!(:created_at => 4.days.ago)
|
47
|
+
e3 = Entry.create!(:created_at => 1.day.ago)
|
48
|
+
report = test_report(:created_at => [nil, 3.days.ago.to_date.to_s]) do
|
49
|
+
scope { Entry }
|
50
|
+
filter(:created_at, :date, :range => true)
|
51
|
+
end
|
52
|
+
report.assets.should include(e1)
|
53
|
+
report.assets.should include(e2)
|
54
|
+
report.assets.should_not include(e3)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should find something in one day interval" do
|
58
|
+
|
59
|
+
e1 = Entry.create!(:created_at => 7.days.ago)
|
60
|
+
e2 = Entry.create!(:created_at => 4.days.ago)
|
61
|
+
e3 = Entry.create!(:created_at => 1.day.ago)
|
62
|
+
report = test_report(:created_at => (4.days.ago.to_date..4.days.ago.to_date)) do
|
63
|
+
scope { Entry }
|
64
|
+
filter(:created_at, :date, :range => true)
|
65
|
+
end
|
66
|
+
report.assets.should_not include(e1)
|
67
|
+
report.assets.should include(e2)
|
68
|
+
report.assets.should_not include(e3)
|
69
|
+
end
|
70
|
+
it "should support invalid range" do
|
71
|
+
|
72
|
+
e1 = Entry.create!(:created_at => 7.days.ago)
|
73
|
+
e2 = Entry.create!(:created_at => 4.days.ago)
|
74
|
+
e3 = Entry.create!(:created_at => 1.day.ago)
|
75
|
+
report = test_report(:created_at => (1.days.ago.to_date..7.days.ago.to_date)) do
|
76
|
+
scope { Entry }
|
77
|
+
filter(:created_at, :date, :range => true)
|
78
|
+
end
|
79
|
+
report.assets.should_not include(e1)
|
80
|
+
report.assets.should_not include(e2)
|
81
|
+
report.assets.should_not include(e3)
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
it "should support block" do
|
86
|
+
report = test_report(:created_at => Date.today) do
|
87
|
+
scope { Entry }
|
88
|
+
filter(:created_at, :date, :range => true) do |value|
|
89
|
+
where("created_at >= ?", value)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
report.assets.should_not include(Entry.create!(:created_at => 1.day.ago))
|
93
|
+
report.assets.should include(Entry.create!(:created_at => DateTime.now))
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Datagrid::Filters::IntegerFilter do
|
4
|
+
|
5
|
+
it "should support integer range argument" do
|
6
|
+
e1 = Entry.create!(:group_id => 1)
|
7
|
+
e2 = Entry.create!(:group_id => 4)
|
8
|
+
e3 = Entry.create!(:group_id => 7)
|
9
|
+
report = test_report(:group_id => 3..5) do
|
10
|
+
scope { Entry }
|
11
|
+
filter(:group_id, :integer)
|
12
|
+
end
|
13
|
+
report.assets.should_not include(e1)
|
14
|
+
report.assets.should include(e2)
|
15
|
+
report.assets.should_not include(e3)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should support integer range given as array argument" do
|
19
|
+
e1 = Entry.create!(:group_id => 7)
|
20
|
+
e2 = Entry.create!(:group_id => 4)
|
21
|
+
e3 = Entry.create!(:group_id => 1)
|
22
|
+
report = test_report(:group_id => [3.to_s, 5.to_s]) do
|
23
|
+
scope { Entry }
|
24
|
+
filter(:group_id, :integer, :range => true)
|
25
|
+
end
|
26
|
+
report.assets.should_not include(e1)
|
27
|
+
report.assets.should include(e2)
|
28
|
+
report.assets.should_not include(e3)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should support minimum integer argument" do
|
32
|
+
e1 = Entry.create!(:group_id => 1)
|
33
|
+
e2 = Entry.create!(:group_id => 4)
|
34
|
+
e3 = Entry.create!(:group_id => 7)
|
35
|
+
report = test_report(:group_id => [5.to_s, nil]) do
|
36
|
+
scope { Entry }
|
37
|
+
filter(:group_id, :integer, :range => true)
|
38
|
+
end
|
39
|
+
report.assets.should_not include(e1)
|
40
|
+
report.assets.should_not include(e2)
|
41
|
+
report.assets.should include(e3)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should support maximum integer argument" do
|
45
|
+
e1 = Entry.create!(:group_id => 1)
|
46
|
+
e2 = Entry.create!(:group_id => 4)
|
47
|
+
e3 = Entry.create!(:group_id => 7)
|
48
|
+
report = test_report(:group_id => [nil, 5.to_s]) do
|
49
|
+
scope { Entry }
|
50
|
+
filter(:group_id, :integer, :range => true)
|
51
|
+
end
|
52
|
+
report.assets.should include(e1)
|
53
|
+
report.assets.should include(e2)
|
54
|
+
report.assets.should_not include(e3)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should find something in one integer interval" do
|
58
|
+
|
59
|
+
e1 = Entry.create!(:group_id => 7)
|
60
|
+
e2 = Entry.create!(:group_id => 4)
|
61
|
+
e3 = Entry.create!(:group_id => 1)
|
62
|
+
report = test_report(:group_id => (4..4)) do
|
63
|
+
scope { Entry }
|
64
|
+
filter(:group_id, :integer, :range => true)
|
65
|
+
end
|
66
|
+
report.assets.should_not include(e1)
|
67
|
+
report.assets.should include(e2)
|
68
|
+
report.assets.should_not include(e3)
|
69
|
+
end
|
70
|
+
it "should support invalid range" do
|
71
|
+
|
72
|
+
e1 = Entry.create!(:group_id => 7)
|
73
|
+
e2 = Entry.create!(:group_id => 4)
|
74
|
+
e3 = Entry.create!(:group_id => 1)
|
75
|
+
report = test_report(:group_id => (7..1)) do
|
76
|
+
scope { Entry }
|
77
|
+
filter(:group_id, :integer, :range => true)
|
78
|
+
end
|
79
|
+
report.assets.should_not include(e1)
|
80
|
+
report.assets.should_not include(e2)
|
81
|
+
report.assets.should_not include(e3)
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
it "should support block" do
|
86
|
+
report = test_report(:group_id => 5) do
|
87
|
+
scope { Entry }
|
88
|
+
filter(:group_id, :integer, :range => true) do |value|
|
89
|
+
where("group_id >= ?", value)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
report.assets.should_not include(Entry.create!(:group_id => 1))
|
93
|
+
report.assets.should include(Entry.create!(:group_id => 5))
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -50,6 +50,98 @@ describe Datagrid::FormBuilder do
|
|
50
50
|
'<input class="group_id integer_filter" id="report_group_id" name="report[group_id]" size="30" type="text"/>'
|
51
51
|
)}
|
52
52
|
end
|
53
|
+
|
54
|
+
context "with date filter type" do
|
55
|
+
let(:_filter) { :created_at }
|
56
|
+
let(:_grid) {
|
57
|
+
test_report do
|
58
|
+
scope {Entry}
|
59
|
+
filter(:created_at, :date)
|
60
|
+
end
|
61
|
+
}
|
62
|
+
it { should equal_to_dom(
|
63
|
+
'<input class="created_at date_filter" id="report_created_at" name="report[created_at]" size="30" type="text"/>'
|
64
|
+
)}
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with integer filter type and range option" do
|
68
|
+
let(:_filter) { :group_id }
|
69
|
+
let(:_grid) {
|
70
|
+
test_report(:group_id => _range) do
|
71
|
+
scope {Entry}
|
72
|
+
filter(:group_id, :integer, :range => true)
|
73
|
+
end
|
74
|
+
}
|
75
|
+
context "with only left bound" do
|
76
|
+
|
77
|
+
let(:_range) { [10, nil]}
|
78
|
+
it { should equal_to_dom(
|
79
|
+
'<input class="group_id integer_filter from" id="report_group_id" multiple name="report[group_id][]" size="30" type="text" value="10"/>' +
|
80
|
+
'<span class="separator integer"> - </span>' +
|
81
|
+
'<input class="group_id integer_filter to" id="report_group_id" multiple name="report[group_id][]" size="30" type="text"/>'
|
82
|
+
)}
|
83
|
+
it { should be_html_safe }
|
84
|
+
end
|
85
|
+
context "with only right bound" do
|
86
|
+
|
87
|
+
let(:_range) { [nil, 10]}
|
88
|
+
it { should equal_to_dom(
|
89
|
+
'<input class="group_id integer_filter from" id="report_group_id" multiple name="report[group_id][]" size="30" type="text"/>' +
|
90
|
+
'<span class="separator integer"> - </span>' +
|
91
|
+
'<input class="group_id integer_filter to" id="report_group_id" multiple name="report[group_id][]" size="30" type="text" value="10"/>'
|
92
|
+
)}
|
93
|
+
it { should be_html_safe }
|
94
|
+
end
|
95
|
+
|
96
|
+
context "with invalid range value" do
|
97
|
+
let(:_range) { 2..1 }
|
98
|
+
it { should equal_to_dom(
|
99
|
+
'<input class="group_id integer_filter from" id="report_group_id" multiple name="report[group_id][]" size="30" type="text" value="2"/>' +
|
100
|
+
'<span class="separator integer"> - </span>' +
|
101
|
+
'<input class="group_id integer_filter to" id="report_group_id" multiple name="report[group_id][]" size="30" type="text" value="1"/>'
|
102
|
+
)}
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
context "with date filter type and range option" do
|
108
|
+
let(:_filter) { :created_at }
|
109
|
+
let(:_grid) {
|
110
|
+
test_report(:created_at => _range) do
|
111
|
+
scope {Entry}
|
112
|
+
filter(:created_at, :date, :range => true)
|
113
|
+
end
|
114
|
+
}
|
115
|
+
context "with only left bound" do
|
116
|
+
|
117
|
+
let(:_range) { ["2012-01-03", nil]}
|
118
|
+
it { should equal_to_dom(
|
119
|
+
'<input class="created_at date_filter from" id="report_created_at" multiple name="report[created_at][]" size="30" type="text" value="2012-01-03"/>' +
|
120
|
+
'<span class="separator date"> - </span>' +
|
121
|
+
'<input class="created_at date_filter to" id="report_created_at" multiple name="report[created_at][]" size="30" type="text"/>'
|
122
|
+
)}
|
123
|
+
it { should be_html_safe }
|
124
|
+
end
|
125
|
+
context "with only right bound" do
|
126
|
+
|
127
|
+
let(:_range) { [nil, "2012-01-03"]}
|
128
|
+
it { should equal_to_dom(
|
129
|
+
'<input class="created_at date_filter from" id="report_created_at" multiple name="report[created_at][]" size="30" type="text"/>' +
|
130
|
+
'<span class="separator date"> - </span>' +
|
131
|
+
'<input class="created_at date_filter to" id="report_created_at" multiple name="report[created_at][]" size="30" type="text" value="2012-01-03"/>'
|
132
|
+
)}
|
133
|
+
it { should be_html_safe }
|
134
|
+
end
|
135
|
+
|
136
|
+
context "with invalid range value" do
|
137
|
+
let(:_range) { Date.parse('2012-01-02')..Date.parse('2012-01-01') }
|
138
|
+
it { should equal_to_dom(
|
139
|
+
'<input class="created_at date_filter from" id="report_created_at" multiple name="report[created_at][]" size="30" type="text" value="2012-01-02"/>' +
|
140
|
+
'<span class="separator date"> - </span>' +
|
141
|
+
'<input class="created_at date_filter to" id="report_created_at" multiple name="report[created_at][]" size="30" type="text" value="2012-01-01"/>'
|
142
|
+
)}
|
143
|
+
end
|
144
|
+
end
|
53
145
|
context "with enum filter type" do
|
54
146
|
let(:_filter) { :category }
|
55
147
|
let(:_grid) {
|