datagrid 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8edc6a25bb802b852ce81f90623d3fca8b6fc5e4
4
- data.tar.gz: 8ee50cd8e1a3f759fc5344262c73fc054a47e4d9
3
+ metadata.gz: 89f8357208d93d460caef785e2ebaa7ebbb36280
4
+ data.tar.gz: 32723d7e2ca88ff415c6686d073672e78cb32742
5
5
  SHA512:
6
- metadata.gz: 294214bffac7241ea3f36a40bdb20df4b9efbd9a80b908e352129faf1ca98721d5b9e32d3c857c2e00538d19efbd0a7ded3a08376587647502faa2244a08731e
7
- data.tar.gz: a733509325684ddadd94e9feab83c3e475c8b00a577812da0b7b7d7a394df692f9790b1d87fc713df7b370afcdb7770de955aaa8baa83f47b264bcbf853f3f9c
6
+ metadata.gz: 111f4e212572c21a899ab428e0a4fea23b7a106bcec089508c36b68349384d76e6bdb94fe9ebf1045791a9b9b9f5f0a2423f328853bff0b5df5b47f0ec6c3626
7
+ data.tar.gz: d396415dd9f0d3743ed552fddccb1926e3737f7b5a0a7264414fa51a73abe9c8e43520e5e941a201d2093fd7ded8e16e8f67efc814cc2a36d732f736983bc820
data/Gemfile CHANGED
@@ -9,7 +9,7 @@ group :development do
9
9
 
10
10
 
11
11
  gem "debugger", :platform => "ruby_19"
12
- gem "byebug", :platform => "ruby_20"
12
+ gem "byebug", :platform => ["ruby_20", "ruby_21"]
13
13
  gem "ruby-debug", :platform => "ruby_18"
14
14
 
15
15
  gem "rspec"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.5
1
+ 1.1.0
@@ -2,15 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: datagrid 1.0.5 ruby lib
5
+ # stub: datagrid 1.1.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "datagrid"
9
- s.version = "1.0.5"
9
+ s.version = "1.1.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
12
13
  s.authors = ["Bogdan Gusiev"]
13
- s.date = "2014-01-15"
14
+ s.date = "2014-03-07"
14
15
  s.description = "This allows you to easily build datagrid aka data tables with sortable columns and filters"
15
16
  s.email = "agresso@gmail.com"
16
17
  s.extra_rdoc_files = [
@@ -110,8 +111,7 @@ Gem::Specification.new do |s|
110
111
  ]
111
112
  s.homepage = "http://github.com/bogdan/datagrid"
112
113
  s.licenses = ["MIT"]
113
- s.require_paths = ["lib"]
114
- s.rubygems_version = "2.1.10"
114
+ s.rubygems_version = "2.2.2"
115
115
  s.summary = "Ruby gem to create datagrids"
116
116
 
117
117
  if s.respond_to? :specification_version then
@@ -88,38 +88,46 @@ module Datagrid
88
88
  end
89
89
 
90
90
  # Defines new datagrid column
91
- #
91
+ #
92
92
  # Arguments:
93
93
  #
94
94
  # * <tt>name</tt> - column name
95
+ # * <tt>query</tt> - a string representing the query to select this column (supports only ActiveRecord)
95
96
  # * <tt>options</tt> - hash of options
96
97
  # * <tt>block</tt> - proc to calculate a column value
97
98
  #
98
99
  # Available options:
99
- #
100
+ #
100
101
  # * <tt>:html</tt> - determines if current column should be present in html table and how is it formatted
101
- # * <tt>:order</tt> - determines if this column could be sortable and how.
102
- # The value of order is explicitly passed to ORM ordering method.
102
+ # * <tt>:order</tt> - determines if this column could be sortable and how.
103
+ # The value of order is explicitly passed to ORM ordering method.
103
104
  # Ex: <tt>"created_at, id"</tt> for ActiveRecord, <tt>[:created_at, :id]</tt> for Mongoid
104
- # * <tt>:order_desc</tt> - determines a descending order for given column
105
+ # * <tt>:order_desc</tt> - determines a descending order for given column
105
106
  # (only in case when <tt>:order</tt> can not be easily reversed by ORM)
106
- # * <tt>:order_by_value</tt> - used in case it is easier to perform ordering at ruby level not on database level.
107
- # Warning: using ruby to order large datasets is very unrecommended.
107
+ # * <tt>:order_by_value</tt> - used in case it is easier to perform ordering at ruby level not on database level.
108
+ # Warning: using ruby to order large datasets is very unrecommended.
108
109
  # If set to true - datagrid will use column value to order by this column
109
110
  # If block is given - datagrid will use value returned from block
110
111
  # * <tt>:mandatory</tt> - if true, column will never be hidden with #column_names selection
111
112
  # * <tt>:url</tt> - a proc with one argument, pass this option to easily convert the value into an URL
112
113
  # * <tt>:before</tt> - determines the position of this column, by adding it before the column passed here
113
114
  # * <tt>:after</tt> - determines the position of this column, by adding it after the column passed here
115
+ # * <tt>:if</tt> - the column is shown if the reult of calling this argument is true
116
+ # * <tt>:unless</tt> - the column is shown unless the reult of calling this argument is true
114
117
  #
115
118
  # See: https://github.com/bogdan/datagrid/wiki/Columns for examples
116
- def column(name, options = {}, &block)
119
+ def column(name, options_or_query = {}, options = {}, &block)
120
+ if options_or_query.is_a?(String)
121
+ query = options_or_query
122
+ else
123
+ options = options_or_query
124
+ end
117
125
  check_scope_defined!("Scope should be defined before columns")
118
126
  block ||= lambda do |model|
119
127
  model.send(name)
120
128
  end
121
129
  position = Datagrid::Utils.extract_position_from_options(columns_array, options)
122
- column = Datagrid::Columns::Column.new(self, name, default_column_options.merge(options), &block)
130
+ column = Datagrid::Columns::Column.new(self, name, query, default_column_options.merge(options), &block)
123
131
  columns_array.insert(position, column)
124
132
  end
125
133
 
@@ -148,7 +156,7 @@ module Datagrid
148
156
  end
149
157
  end
150
158
  else
151
- # Ruby Object#format exists.
159
+ # Ruby Object#format exists.
152
160
  # We don't want to change the behaviour and overwrite it.
153
161
  super
154
162
  end
@@ -163,6 +171,10 @@ module Datagrid
163
171
 
164
172
  module InstanceMethods
165
173
 
174
+ def assets
175
+ driver.append_column_queries(super, columns.map(&:query).compact)
176
+ end
177
+
166
178
  # Returns <tt>Array</tt> of human readable column names. See also "Localization" section
167
179
  #
168
180
  # Arguments:
@@ -212,7 +224,7 @@ module Datagrid
212
224
  self.rows(*column_names).unshift(self.header(*column_names))
213
225
  end
214
226
 
215
- # Return Array of Hashes where keys are column names and values are column values
227
+ # Return Array of Hashes where keys are column names and values are column values
216
228
  # for each row in filtered datagrid relation.
217
229
  #
218
230
  # Example:
@@ -267,13 +279,13 @@ module Datagrid
267
279
  # Returns all columns selected in grid instance
268
280
  #
269
281
  # Examples:
270
- #
282
+ #
271
283
  # MyGrid.new.columns # => all defined columns
272
284
  # grid = MyGrid.new(:column_names => [:id, :name])
273
285
  # grid.columns # => id and name columns
274
286
  # grid.columns(:id, :category) # => id and category column
275
287
  def columns(*args)
276
- self.class.columns(*args)
288
+ self.class.columns(*args).select {|column| column.enabled?(self)}
277
289
  end
278
290
 
279
291
  # Returns all columns that can be represented in plain data(non-html) way
@@ -301,7 +313,7 @@ module Datagrid
301
313
  # Gives ability to have a different formatting for CSV and HTML column value.
302
314
  #
303
315
  # Example:
304
- #
316
+ #
305
317
  # column(:name) do |model|
306
318
  # format(model.name) do |value|
307
319
  # content_tag(:strong, value)
@@ -309,7 +321,7 @@ module Datagrid
309
321
  # end
310
322
  #
311
323
  # column(:company) do |model|
312
- # format(model.company.name) do
324
+ # format(model.company.name) do
313
325
  # render :partial => "company_with_logo", :locals => {:company => model.company }
314
326
  # end
315
327
  # end
@@ -317,10 +329,32 @@ module Datagrid
317
329
  if block_given?
318
330
  self.class.format(value, &block)
319
331
  else
332
+ # don't override Object#format method
320
333
  super
321
334
  end
322
335
  end
323
336
 
337
+ # Returns an object representing a table row.
338
+ # Allows to access column values
339
+ #
340
+ # Example:
341
+ #
342
+ # class MyGrid
343
+ # scope { User }
344
+ # column(:id)
345
+ # column(:name)
346
+ # column(:number_of_purchases) do |user|
347
+ # user.purchases.count
348
+ # end
349
+ # end
350
+ #
351
+ # row = MyGrid.new.data_row(User.last)
352
+ # row.id # => user.id
353
+ # row.number_of_purchases # => user.purchases.count
354
+ def data_row(asset)
355
+ ::Datagrid::Columns::DataRow.new(self, asset)
356
+ end
357
+
324
358
  protected
325
359
 
326
360
  def map_with_batches(&block)
@@ -333,5 +367,20 @@ module Datagrid
333
367
 
334
368
  end # InstanceMethods
335
369
 
370
+ class DataRow
371
+
372
+ def initialize(grid, model)
373
+ @grid = grid
374
+ @model = model
375
+ end
376
+
377
+ def method_missing(meth, *args, &blk)
378
+ if column = @grid.column_by_name(meth)
379
+ column.data_value(@model, @grid)
380
+ else
381
+ super
382
+ end
383
+ end
384
+ end
336
385
  end
337
386
  end
@@ -25,9 +25,9 @@ class Datagrid::Columns::Column
25
25
  end
26
26
  end
27
27
 
28
- attr_accessor :grid_class, :options, :data_block, :name, :html_block
28
+ attr_accessor :grid_class, :options, :data_block, :name, :html_block, :query
29
29
 
30
- def initialize(grid_class, name, options = {}, &block)
30
+ def initialize(grid_class, name, query, options = {}, &block)
31
31
  self.grid_class = grid_class
32
32
  self.name = name.to_sym
33
33
  self.options = options
@@ -40,9 +40,13 @@ class Datagrid::Columns::Column
40
40
  self.html_block = options[:html]
41
41
  end
42
42
  end
43
+ self.query = query
44
+ options[:if] = convert_option_to_proc(options[:if])
45
+ options[:unless] = convert_option_to_proc(options[:unless])
43
46
  end
44
47
 
45
48
  def data_value(model, grid)
49
+ raise "no data value for #{name} column" unless data?
46
50
  result = generic_value(model,grid)
47
51
  result.is_a?(ResponseFormat) ? result.data_value : result
48
52
  end
@@ -53,7 +57,7 @@ class Datagrid::Columns::Column
53
57
  end
54
58
 
55
59
  def header
56
- self.options[:header] ||
60
+ self.options[:header] ||
57
61
  I18n.translate(self.name, :scope => "datagrid.#{self.grid_class.param_name}.columns", :default => self.name.to_s.humanize )
58
62
  end
59
63
 
@@ -83,21 +87,25 @@ class Datagrid::Columns::Column
83
87
 
84
88
  def order_desc
85
89
  return nil unless order
86
- self.options[:order_desc]
90
+ self.options[:order_desc]
87
91
  end
88
92
 
89
93
  def html?
90
94
  options[:html] != false
91
95
  end
92
-
96
+
93
97
  def data?
94
98
  self.data_block != nil
95
99
  end
96
-
100
+
97
101
  def mandatory?
98
102
  !! options[:mandatory]
99
103
  end
100
104
 
105
+ def enabled?(grid)
106
+ (!options[:if] || (options[:if] && options[:if].call(grid))) && !options[:unless] || (options[:unless] && !options[:unless].call(grid))
107
+ end
108
+
101
109
  def inspect
102
110
  "#<Datagird::Columns::Column #{grid_class}##{name} #{options.inspect}>"
103
111
  end
@@ -137,10 +145,18 @@ class Datagrid::Columns::Column
137
145
 
138
146
  def generic_value(model, grid)
139
147
  if self.data_block.arity >= 1
140
- Datagrid::Utils.apply_args(model, grid, &data_block)
148
+ Datagrid::Utils.apply_args(model, grid, grid.data_row(model), &data_block)
141
149
  else
142
150
  model.instance_eval(&self.data_block)
143
151
  end
144
152
  end
145
153
 
154
+ private
155
+ def convert_option_to_proc(option)
156
+ if option.is_a?(Proc)
157
+ option
158
+ elsif option
159
+ proc {|object| object.send(option.to_sym) }
160
+ end
161
+ end
146
162
  end
@@ -73,7 +73,7 @@ module Datagrid
73
73
  end
74
74
  end
75
75
 
76
- # Returns a hash of grid attributes including filter values
76
+ # Returns a hash of grid attributes including filter values
77
77
  # and ordering values
78
78
  def attributes
79
79
  result = {}
@@ -120,17 +120,17 @@ module Datagrid
120
120
  end
121
121
 
122
122
  # Redefines scope at instance level
123
- #
123
+ #
124
124
  # class MyGrid
125
125
  # scope { Article.order('created_at desc') }
126
126
  # end
127
- #
127
+ #
128
128
  # grid = MyGrid.new
129
129
  # grid.scope do |scope|
130
130
  # scope.where(:author_id => current_user.id)
131
131
  # end
132
- # grid.assets
133
- # # => SELECT * FROM articles WHERE author_id = ?
132
+ # grid.assets
133
+ # # => SELECT * FROM articles WHERE author_id = ?
134
134
  # # ORDER BY created_at desc
135
135
  #
136
136
  def scope(&block)
@@ -53,7 +53,7 @@ module Datagrid
53
53
  def less_equal(scope, field, value)
54
54
  raise NotImplementedError
55
55
  end
56
-
56
+
57
57
  def has_column?(scope, column_name)
58
58
  raise NotImplementedError
59
59
  end
@@ -82,6 +82,14 @@ module Datagrid
82
82
  raise NotImplementedError
83
83
  end
84
84
 
85
+ def append_column_queries(assets, columns)
86
+ if columns.present?
87
+ raise NotImplementedError
88
+ else
89
+ assets
90
+ end
91
+ end
92
+
85
93
  protected
86
94
  def timestamp_class?(klass)
87
95
  TIMESTAMP_CLASSES.include?(klass)
@@ -4,20 +4,20 @@ module Datagrid
4
4
 
5
5
  def self.match?(scope)
6
6
  return false unless defined?(::ActiveRecord)
7
- if scope.is_a?(Class)
7
+ if scope.is_a?(Class)
8
8
  scope.ancestors.include?(::ActiveRecord::Base)
9
9
  else
10
- scope.is_a?(::ActiveRecord::Relation)
10
+ scope.is_a?(::ActiveRecord::Relation)
11
11
  end
12
12
  end
13
13
 
14
14
  def to_scope(scope)
15
15
  return scope if scope.is_a?(::ActiveRecord::Relation)
16
16
  # Model class or Active record association
17
- # ActiveRecord association class hides itself under an Array
17
+ # ActiveRecord association class hides itself under an Array
18
18
  # We can only reveal it by checking if it respond to some specific
19
19
  # to ActiveRecord method like #scoped
20
- if scope.is_a?(Class)
20
+ if scope.is_a?(Class)
21
21
  Rails.version >= "4.0" ? scope.all : scope.scoped({})
22
22
  elsif scope.respond_to?(:scoped)
23
23
  scope.scoped
@@ -26,6 +26,16 @@ module Datagrid
26
26
  end
27
27
  end
28
28
 
29
+ def append_column_queries(assets, columns)
30
+ if columns.present?
31
+ if assets.select_values.empty?
32
+ assets = assets.select(Arel.respond_to?(:star) ? assets.klass.arel_table[Arel.star] : "#{assets.quoted_table_name}.*")
33
+ end
34
+ assets = assets.select(*columns)
35
+ end
36
+ assets
37
+ end
38
+
29
39
  def where(scope, attribute, value)
30
40
  scope.where(attribute => value)
31
41
  end
@@ -97,7 +107,7 @@ module Datagrid
97
107
  end
98
108
  result
99
109
  end
100
-
110
+
101
111
  protected
102
112
 
103
113
  def prefix_table_name(scope, field)
@@ -105,8 +115,8 @@ module Datagrid
105
115
  end
106
116
 
107
117
  def contains_predicate
108
- defined?(::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) &&
109
- ::ActiveRecord::Base.connection.is_a?(::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) ?
118
+ defined?(::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) &&
119
+ ::ActiveRecord::Base.connection.is_a?(::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) ?
110
120
  'ilike' : 'like'
111
121
  end
112
122
 
@@ -34,14 +34,14 @@ module Datagrid
34
34
 
35
35
  def greater_equal(scope, field, value)
36
36
  scope.select do |object|
37
- compare_value = object.send(field)
37
+ compare_value = object.send(field)
38
38
  compare_value.respond_to?(:>=) && compare_value >= value
39
39
  end
40
40
  end
41
41
 
42
42
  def less_equal(scope, field, value)
43
43
  scope.select do |object|
44
- compare_value = object.send(field)
44
+ compare_value = object.send(field)
45
45
  compare_value.respond_to?(:<=) && compare_value <= value
46
46
  end
47
47
  end
@@ -51,7 +51,7 @@ module Datagrid
51
51
  end
52
52
 
53
53
  def is_timestamp?(scope, column_name)
54
- has_column?(scope, column_name) &&
54
+ has_column?(scope, column_name) &&
55
55
  timestamp_class?(scope.first.send(column_name).class)
56
56
  end
57
57
 
@@ -4,7 +4,7 @@ module Datagrid
4
4
 
5
5
  def self.match?(scope)
6
6
  return false unless defined?(::MongoMapper)
7
- if scope.is_a?(Class)
7
+ if scope.is_a?(Class)
8
8
  scope.ancestors.include?(::MongoMapper::Document)
9
9
  else
10
10
  scope.is_a?(::Plucky::Query)
@@ -4,7 +4,7 @@ module Datagrid
4
4
 
5
5
  def self.match?(scope)
6
6
  return false unless defined?(::Mongoid)
7
- if scope.is_a?(Class)
7
+ if scope.is_a?(Class)
8
8
  scope.ancestors.include?(::Mongoid::Document)
9
9
  else
10
10
  scope.is_a?(::Mongoid::Criteria)
@@ -48,6 +48,7 @@ module Datagrid
48
48
 
49
49
  # Returns filter definition object by name
50
50
  def filter_by_name(attribute)
51
+ return attribute if attribute.is_a?(Datagrid::Filters::BaseFilter)
51
52
  self.filters.find do |filter|
52
53
  filter.name.to_sym == attribute.to_sym
53
54
  end
@@ -133,10 +134,14 @@ module Datagrid
133
134
  end
134
135
 
135
136
  # Returns string representation of filter value
136
- def filter_value_as_string(filter)
137
+ def filter_value_as_string(name)
138
+ filter = filter_by_name(name)
137
139
  value = filter_value(filter)
138
- value = value.is_a?(Array) ? value.join(filter.separator) : value.to_s
139
- value.blank? ? nil : value
140
+ if value.is_a?(Array)
141
+ value.map {|v| filter.format(v) }.join(filter.separator)
142
+ else
143
+ filter.format(value)
144
+ end
140
145
  end
141
146
 
142
147
  # Returns filter object with the given name
@@ -103,7 +103,7 @@ class Datagrid::Filters::BaseFilter #:nodoc:
103
103
  def format(value)
104
104
  value.nil? ? nil : value.to_s
105
105
  end
106
-
106
+
107
107
  def dummy?
108
108
  options[:dummy]
109
109
  end
@@ -31,7 +31,7 @@ describe Datagrid::Columns do
31
31
  it "should generate header" do
32
32
  subject.header.should == ["Shipping date", "Group", "Name", "Access level", "Pet"]
33
33
  end
34
-
34
+
35
35
  it "should return html_columns" do
36
36
  report = test_report do
37
37
  scope {Entry}
@@ -82,6 +82,29 @@ describe Datagrid::Columns do
82
82
  it "should support csv export options" do
83
83
  subject.to_csv(:col_sep => ";").should == "Shipping date;Group;Name;Access level;Pet\n#{date};Pop;Star;admin;ROTTWEILER\n"
84
84
  end
85
+
86
+ it "should support defining a query for a column" do
87
+ report = test_report do
88
+ scope {Entry}
89
+ filter(:name)
90
+ column(:id)
91
+ column(:sum_group_id, 'sum(group_id) sum_group_id')
92
+ end
93
+ report.assets.first.sum_group_id.should == group.id
94
+ end
95
+ it "should support hidding columns through if and unless" do
96
+ report = test_report do
97
+ scope {Entry}
98
+ column(:id, :if => :show?)
99
+ column(:name, :unless => proc {|grid| !grid.show? })
100
+
101
+ def show?
102
+ false
103
+ end
104
+ end
105
+ report.columns(:id).should == []
106
+ report.columns(:name).should == []
107
+ end
85
108
  end
86
109
 
87
110
  it "should support columns with model and report arguments" do
@@ -206,4 +229,45 @@ describe Datagrid::Columns do
206
229
  report.rows
207
230
  end
208
231
  end
232
+
233
+ describe ".data_row" do
234
+ it "should give access to column values via an object" do
235
+ grid = test_report do
236
+ scope { Entry }
237
+ column(:id)
238
+ column(:name) do
239
+ name.capitalize
240
+ end
241
+ column(:actions, html: true) do
242
+ "some link here"
243
+ end
244
+ end
245
+ entry = Entry.create!(name: 'hello')
246
+ row = grid.data_row(entry)
247
+ row.id.should == entry.id
248
+ row.name.should == "Hello"
249
+ proc {
250
+ row.actions
251
+ }.should raise_error
252
+ end
253
+ end
254
+
255
+ describe "column value" do
256
+ it "should support conversion" do
257
+ group = Group.create!
258
+ Entry.create(:group => group)
259
+ Entry.create(:group => group)
260
+ grid = test_report do
261
+ scope { Group }
262
+ column(:entries_count) do |g|
263
+ g.entries.count
264
+ end
265
+ column(:odd_entries) do |_, _, row|
266
+ row.entries_count.odd?
267
+ end
268
+ end
269
+
270
+ grid.row_for(group).should == [2, false]
271
+ end
272
+ end
209
273
  end
@@ -15,5 +15,10 @@ describe Datagrid::Drivers::ActiveRecord do
15
15
  subject.to_scope(Entry.limit(5)).should be_a(ActiveRecord::Relation)
16
16
  subject.to_scope(Group.create!.entries).should be_a(ActiveRecord::Relation)
17
17
  end
18
-
18
+
19
+ it "should support append_column_queries" do
20
+ scope = subject.append_column_queries(Entry.scoped, ['sum(entries.group_id) sum_group_id'])
21
+ scope.select_values.length.should == 2
22
+ scope.select_values.should == ["#{Entry.quoted_table_name}.*", 'sum(entries.group_id) sum_group_id']
23
+ end
19
24
  end
@@ -7,7 +7,7 @@ describe Datagrid::Filters::DateFilter do
7
7
  e2 = Entry.create!(:created_at => 4.days.ago)
8
8
  e3 = Entry.create!(:created_at => 1.day.ago)
9
9
  report = test_report(:created_at => 5.day.ago..3.days.ago) do
10
- scope { Entry }
10
+ scope { Entry }
11
11
  filter(:created_at, :date)
12
12
  end
13
13
  report.assets.should_not include(e1)
@@ -21,7 +21,7 @@ describe Datagrid::Filters::DateFilter do
21
21
  let(:klass) { klass }
22
22
  subject do
23
23
  test_report(:created_at => _created_at) do
24
- scope { klass }
24
+ scope { klass }
25
25
  filter(:created_at, :date, :range => true)
26
26
  end.assets.to_a
27
27
  end
@@ -57,7 +57,7 @@ describe Datagrid::Filters::DateFilter do
57
57
  e2 = Entry.create!(:created_at => 4.days.ago)
58
58
  e3 = Entry.create!(:created_at => 1.day.ago)
59
59
  report = test_report(:created_at => [5.day.ago.to_date.to_s, 3.days.ago.to_date.to_s]) do
60
- scope { Entry }
60
+ scope { Entry }
61
61
  filter(:created_at, :date, :range => true)
62
62
  end
63
63
  report.assets.should_not include(e1)
@@ -70,7 +70,7 @@ describe Datagrid::Filters::DateFilter do
70
70
  e2 = Entry.create!(:created_at => 4.days.ago)
71
71
  e3 = Entry.create!(:created_at => 1.day.ago)
72
72
  report = test_report(:created_at => [5.day.ago.to_date.to_s, nil]) do
73
- scope { Entry }
73
+ scope { Entry }
74
74
  filter(:created_at, :date, :range => true)
75
75
  end
76
76
  report.assets.should_not include(e1)
@@ -83,7 +83,7 @@ describe Datagrid::Filters::DateFilter do
83
83
  e2 = Entry.create!(:created_at => 4.days.ago)
84
84
  e3 = Entry.create!(:created_at => 1.day.ago)
85
85
  report = test_report(:created_at => [nil, 3.days.ago.to_date.to_s]) do
86
- scope { Entry }
86
+ scope { Entry }
87
87
  filter(:created_at, :date, :range => true)
88
88
  end
89
89
  report.assets.should include(e1)
@@ -97,7 +97,7 @@ describe Datagrid::Filters::DateFilter do
97
97
  e2 = Entry.create!(:created_at => 4.days.ago)
98
98
  e3 = Entry.create!(:created_at => 1.day.ago)
99
99
  report = test_report(:created_at => (4.days.ago.to_date..4.days.ago.to_date)) do
100
- scope { Entry }
100
+ scope { Entry }
101
101
  filter(:created_at, :date, :range => true)
102
102
  end
103
103
  report.assets.should_not include(e1)
@@ -110,7 +110,7 @@ describe Datagrid::Filters::DateFilter do
110
110
  e2 = Entry.create!(:created_at => 4.days.ago)
111
111
  e3 = Entry.create!(:created_at => 1.day.ago)
112
112
  report = test_report(:created_at => (1.days.ago.to_date..7.days.ago.to_date)) do
113
- scope { Entry }
113
+ scope { Entry }
114
114
  filter(:created_at, :date, :range => true)
115
115
  end
116
116
  report.assets.should_not include(e1)
@@ -121,7 +121,7 @@ describe Datagrid::Filters::DateFilter do
121
121
 
122
122
  it "should support block" do
123
123
  report = test_report(:created_at => Date.today) do
124
- scope { Entry }
124
+ scope { Entry }
125
125
  filter(:created_at, :date, :range => true) do |value|
126
126
  where("created_at >= ?", value)
127
127
  end
@@ -129,7 +129,7 @@ describe Datagrid::Filters::DateFilter do
129
129
  report.assets.should_not include(Entry.create!(:created_at => 1.day.ago))
130
130
  report.assets.should include(Entry.create!(:created_at => DateTime.now))
131
131
  end
132
-
132
+
133
133
 
134
134
  context "when date format is configured" do
135
135
  around(:each) do |example|
@@ -170,4 +170,15 @@ describe Datagrid::Filters::DateFilter do
170
170
  end
171
171
  report.created_at.should == [Date.new(2012, 01, 01), Date.new(2013, 01, 01)]
172
172
  end
173
+
174
+ it "should properly format date in filter_value_as_string" do
175
+ with_date_format do
176
+ report = test_report(:created_at => "2012-01-02") do
177
+ scope {Entry}
178
+ filter(:created_at, :date)
179
+ end
180
+ report.filter_value_as_string(:created_at).should == "01/02/2012"
181
+ end
182
+ end
183
+
173
184
  end
@@ -63,6 +63,17 @@ describe Datagrid::FormBuilder do
63
63
  it { should equal_to_dom(
64
64
  '<input class="created_at date_filter" id="report_created_at" name="report[created_at]" size="30" type="text"/>'
65
65
  )}
66
+ context "when special date format specified" do
67
+ around(:each) do |example|
68
+ _grid.created_at = Date.parse('2012-01-02')
69
+ with_date_format do
70
+ example.run
71
+ end
72
+ end
73
+ it { should equal_to_dom(
74
+ '<input class="created_at date_filter" id="report_created_at" name="report[created_at]" size="30" type="text" value="01/02/2012"/>'
75
+ )}
76
+ end
66
77
  end
67
78
 
68
79
  context "with integer filter type and range option" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datagrid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bogdan Gusiev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-15 00:00:00.000000000 Z
11
+ date: 2014-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -324,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
324
324
  version: '0'
325
325
  requirements: []
326
326
  rubyforge_project:
327
- rubygems_version: 2.1.10
327
+ rubygems_version: 2.2.2
328
328
  signing_key:
329
329
  specification_version: 4
330
330
  summary: Ruby gem to create datagrids