datagrid 0.8.3 → 0.8.4
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/VERSION +1 -1
- data/datagrid.gemspec +2 -2
- data/lib/datagrid/drivers/abstract_driver.rb +11 -0
- data/lib/datagrid/drivers/active_record.rb +12 -2
- data/lib/datagrid/drivers/array.rb +6 -1
- data/lib/datagrid/drivers/mongo_mapper.rb +5 -0
- data/lib/datagrid/drivers/mongoid.rb +8 -0
- data/lib/datagrid/filters/date_filter.rb +27 -4
- data/spec/datagrid/filters/date_filter_spec.rb +62 -2
- data/spec/datagrid/filters/integer_filter_spec.rb +11 -0
- data/spec/support/configuration.rb +2 -1
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.8.
|
1
|
+
0.8.4
|
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.4"
|
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-05-
|
12
|
+
s.date = "2013-05-22"
|
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 = [
|
@@ -2,6 +2,8 @@ module Datagrid
|
|
2
2
|
module Drivers
|
3
3
|
class AbstractDriver
|
4
4
|
|
5
|
+
TIMESTAMP_CLASSES = [DateTime, Time, ActiveSupport::TimeWithZone]
|
6
|
+
|
5
7
|
class_attribute :subclasses
|
6
8
|
|
7
9
|
def self.inherited(base)
|
@@ -59,6 +61,15 @@ module Datagrid
|
|
59
61
|
def reverse_order(scope)
|
60
62
|
raise NotImplementedError
|
61
63
|
end
|
64
|
+
|
65
|
+
def is_timestamp?(scope, field)
|
66
|
+
raise NotImplementedError
|
67
|
+
end
|
68
|
+
|
69
|
+
protected
|
70
|
+
def timestamp_class?(klass)
|
71
|
+
TIMESTAMP_CLASSES.include?(klass)
|
72
|
+
end
|
62
73
|
end
|
63
74
|
end
|
64
75
|
end
|
@@ -45,11 +45,11 @@ module Datagrid
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def greater_equal(scope, field, value)
|
48
|
-
scope.where(["#{scope
|
48
|
+
scope.where(["#{prefix_table_name(scope, field)} >= ?", value])
|
49
49
|
end
|
50
50
|
|
51
51
|
def less_equal(scope, field, value)
|
52
|
-
scope.where(["#{scope
|
52
|
+
scope.where(["#{prefix_table_name(scope, field)} <= ?", value])
|
53
53
|
end
|
54
54
|
|
55
55
|
def has_column?(scope, column_name)
|
@@ -57,6 +57,16 @@ module Datagrid
|
|
57
57
|
rescue ::ActiveRecord::StatementInvalid
|
58
58
|
false
|
59
59
|
end
|
60
|
+
|
61
|
+
def is_timestamp?(scope, field)
|
62
|
+
has_column?(scope, field) && scope.columns_hash[field.to_s].type == :datetime
|
63
|
+
end
|
64
|
+
|
65
|
+
protected
|
66
|
+
|
67
|
+
def prefix_table_name(scope, field)
|
68
|
+
has_column?(scope, field) ? [scope.table_name, field].join(".") : field
|
69
|
+
end
|
60
70
|
end
|
61
71
|
end
|
62
72
|
end
|
@@ -45,7 +45,12 @@ module Datagrid
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def has_column?(scope, column_name)
|
48
|
-
scope.first.respond_to?(column_name)
|
48
|
+
scope.any? && scope.first.respond_to?(column_name)
|
49
|
+
end
|
50
|
+
|
51
|
+
def is_timestamp?(scope, column_name)
|
52
|
+
has_column?(scope, column_name) &&
|
53
|
+
timestamp_class?(scope.first.send(column_name).class)
|
49
54
|
end
|
50
55
|
end
|
51
56
|
end
|
@@ -16,6 +16,9 @@ module Datagrid
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def where(scope, attribute, value)
|
19
|
+
if value.is_a?(Range)
|
20
|
+
value = {"$gte" => value.first, "$lte" => value.last}
|
21
|
+
end
|
19
22
|
scope.where(attribute => value)
|
20
23
|
end
|
21
24
|
|
@@ -42,6 +45,11 @@ module Datagrid
|
|
42
45
|
def has_column?(scope, column_name)
|
43
46
|
to_scope(scope).klass.fields.keys.include?(column_name.to_s)
|
44
47
|
end
|
48
|
+
|
49
|
+
def is_timestamp?(scope, column_name)
|
50
|
+
has_column?(scope, column_name) &&
|
51
|
+
timestamp_class?(to_scope(scope).klass.fields[column_name.to_s].type)
|
52
|
+
end
|
45
53
|
end
|
46
54
|
end
|
47
55
|
end
|
@@ -14,10 +14,12 @@ class Datagrid::Filters::DateFilter < Datagrid::Filters::BaseFilter
|
|
14
14
|
def parse(value)
|
15
15
|
return nil if value.blank?
|
16
16
|
return value if value.is_a?(Range)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
if value.is_a?(String)
|
18
|
+
formats.each do |format|
|
19
|
+
begin
|
20
|
+
return Date.strptime(value, format)
|
21
|
+
rescue ArgumentError
|
22
|
+
end
|
21
23
|
end
|
22
24
|
end
|
23
25
|
return value.to_date if value.respond_to?(:to_date)
|
@@ -38,5 +40,26 @@ class Datagrid::Filters::DateFilter < Datagrid::Filters::BaseFilter
|
|
38
40
|
super
|
39
41
|
end
|
40
42
|
end
|
43
|
+
|
44
|
+
def default_filter_where(driver, scope, value)
|
45
|
+
if driver.is_timestamp?(scope, name)
|
46
|
+
value = format_value_timestamp(value)
|
47
|
+
end
|
48
|
+
super(driver, scope, value)
|
49
|
+
end
|
50
|
+
|
51
|
+
protected
|
52
|
+
def format_value_timestamp(value)
|
53
|
+
if !value
|
54
|
+
value
|
55
|
+
elsif (range? && value.is_a?(Array))
|
56
|
+
[value.first.try(:beginning_of_day), value.last.try(:end_of_day)]
|
57
|
+
elsif value.is_a?(Range)
|
58
|
+
(value.first.beginning_of_day..value.last.end_of_day)
|
59
|
+
else
|
60
|
+
value.beginning_of_day..value.end_of_day
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
41
64
|
end
|
42
65
|
|
@@ -15,6 +15,43 @@ describe Datagrid::Filters::DateFilter do
|
|
15
15
|
report.assets.should_not include(e3)
|
16
16
|
end
|
17
17
|
|
18
|
+
{:active_record => Entry, :mongoid => MongoidEntry}.each do |orm, klass|
|
19
|
+
describe "with orm #{orm}" do
|
20
|
+
describe "date to timestamp conversion" do
|
21
|
+
let(:klass) { klass }
|
22
|
+
subject do
|
23
|
+
test_report(:created_at => _created_at) do
|
24
|
+
scope { klass }
|
25
|
+
filter(:created_at, :date, :range => true)
|
26
|
+
end.assets.to_a
|
27
|
+
end
|
28
|
+
|
29
|
+
def entry_dated(date)
|
30
|
+
klass.create(:created_at => date)
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when single date paramter given" do
|
34
|
+
let(:_created_at) { Date.today }
|
35
|
+
it { should include(entry_dated(1.second.ago))}
|
36
|
+
it { should include(entry_dated(Date.today.end_of_day))}
|
37
|
+
it { should_not include(entry_dated(Date.today.beginning_of_day - 1.second))}
|
38
|
+
it { should_not include(entry_dated(Date.today.end_of_day + 1.second))}
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when range date range given" do
|
42
|
+
let(:_created_at) { [Date.yesterday, Date.today] }
|
43
|
+
it { should include(entry_dated(1.second.ago))}
|
44
|
+
it { should include(entry_dated(1.day.ago))}
|
45
|
+
it { should include(entry_dated(Date.today.end_of_day))}
|
46
|
+
it { should include(entry_dated(Date.yesterday.beginning_of_day))}
|
47
|
+
it { should_not include(entry_dated(Date.yesterday.beginning_of_day - 1.second))}
|
48
|
+
it { should_not include(entry_dated(Date.today.end_of_day + 1.second))}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
18
55
|
it "should support date range given as array argument" do
|
19
56
|
e1 = Entry.create!(:created_at => 7.days.ago)
|
20
57
|
e2 = Entry.create!(:created_at => 4.days.ago)
|
@@ -93,16 +130,39 @@ describe Datagrid::Filters::DateFilter do
|
|
93
130
|
report.assets.should include(Entry.create!(:created_at => DateTime.now))
|
94
131
|
end
|
95
132
|
|
96
|
-
|
97
|
-
|
133
|
+
|
134
|
+
context "when date format is configured" do
|
135
|
+
around(:each) do |example|
|
136
|
+
with_date_format do
|
137
|
+
example.run
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should have configurable date format" do
|
98
142
|
report = test_report(:created_at => "10/01/2013") do
|
99
143
|
scope {Entry}
|
100
144
|
filter(:created_at, :date)
|
101
145
|
end
|
102
146
|
report.created_at.should == Date.new(2013,10,01)
|
103
147
|
end
|
148
|
+
|
149
|
+
it "should support default explicit date" do
|
150
|
+
report = test_report(:created_at => Date.parse("2013-10-01")) do
|
151
|
+
scope {Entry}
|
152
|
+
filter(:created_at, :date)
|
153
|
+
end
|
154
|
+
report.created_at.should == Date.new(2013,10,01)
|
155
|
+
end
|
104
156
|
end
|
105
157
|
|
158
|
+
|
159
|
+
it "should automatically reverse Array if first more than last" do
|
160
|
+
report = test_report(:created_at => ["2013-01-01", "2012-01-01"]) do
|
161
|
+
scope {Entry}
|
162
|
+
filter(:created_at, :date, :range => true)
|
163
|
+
end
|
164
|
+
report.created_at.should == [Date.new(2012, 01, 01), Date.new(2013, 01, 01)]
|
165
|
+
end
|
106
166
|
it "should automatically reverse Array if first more than last" do
|
107
167
|
report = test_report(:created_at => ["2013-01-01", "2012-01-01"]) do
|
108
168
|
scope {Entry}
|
@@ -92,5 +92,16 @@ describe Datagrid::Filters::IntegerFilter do
|
|
92
92
|
report.assets.should_not include(Entry.create!(:group_id => 1))
|
93
93
|
report.assets.should include(Entry.create!(:group_id => 5))
|
94
94
|
end
|
95
|
+
|
96
|
+
|
97
|
+
it "should not prefix table name if column is joined" do
|
98
|
+
report = test_report(:rating => [4,nil]) do
|
99
|
+
scope { Entry.joins(:group) }
|
100
|
+
filter(:rating, :integer, :range => true)
|
101
|
+
end
|
102
|
+
report.assets.should_not include(Entry.create!(:group => Group.create!(:rating => 3)))
|
103
|
+
report.assets.should include(Entry.create!(:group => Group.create!(:rating => 5)))
|
104
|
+
end
|
105
|
+
|
95
106
|
|
96
107
|
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
def with_date_format(format = "%m/%d/%Y")
|
2
2
|
begin
|
3
|
+
old_format = Datagrid.configuration.date_formats
|
3
4
|
Datagrid.configure do |config|
|
4
5
|
config.date_formats = format
|
5
6
|
end
|
6
7
|
yield
|
7
8
|
ensure
|
8
9
|
Datagrid.configure do |config|
|
9
|
-
config.date_formats =
|
10
|
+
config.date_formats = old_format
|
10
11
|
end
|
11
12
|
end
|
12
13
|
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.4
|
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-05-
|
12
|
+
date: 2013-05-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -335,7 +335,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
335
335
|
version: '0'
|
336
336
|
segments:
|
337
337
|
- 0
|
338
|
-
hash: -
|
338
|
+
hash: -3876339943882620778
|
339
339
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
340
340
|
none: false
|
341
341
|
requirements:
|