datagrid 1.0.3 → 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a33a74ea728f66eb12ea5cc90b17d9be026ac0c1
4
+ data.tar.gz: fa60a6ba1ff9812693f313604a6e35a39ad0b84c
5
+ SHA512:
6
+ metadata.gz: cb4e447b826333a3034cbcf6fc44a95e3ff3fa4266c9868295aa12bc0222391bdb458e8ea45568970b85363fd28944dfe4ed2f3550c60c0faa34c7749aacdd52
7
+ data.tar.gz: 2f1bcbe542567a33be0583b8f6c285d249e0c3d9fd88d0e9fa9a0ea1e573f51ba2050954d0cd4b8a6e2e334f8c152f0fdefacf205665cf019c7d6134972b288a
data/Gemfile CHANGED
@@ -9,6 +9,7 @@ group :development do
9
9
 
10
10
 
11
11
  gem "debugger", :platform => "ruby_19"
12
+ gem "byebug", :platform => "ruby_20"
12
13
  gem "ruby-debug", :platform => "ruby_18"
13
14
 
14
15
  gem "rspec"
@@ -38,11 +38,10 @@ class SimpleReport
38
38
  end
39
39
 
40
40
  filter(:category, :enum, :select => ["first", "second"])
41
- filter(:disabled, :eboolean)
42
- filter(:confirmed, :boolean)
41
+ filter(:disabled, :xboolean)
43
42
  filter(:group_id, :integer, :multiple => true)
44
- filter(:logins_count, :integer, :range => true, :before => :group_id)
45
- filter(:group_name, :string, :header => "Group", :after => :category_id) do |value|
43
+ filter(:logins_count, :integer, :range => true)
44
+ filter(:group_name, :string, :header => "Group") do |value|
46
45
  self.joins(:group).where(:groups => {:name => value})
47
46
  end
48
47
 
@@ -61,13 +60,13 @@ Basic grid api:
61
60
 
62
61
  ``` ruby
63
62
  report = SimpleReport.new(
64
- :group_id => [1,2], :from_logins_count => 1,
63
+ :group_id => [1,2], :from_logins_count => 1,
65
64
  :category => "first",
66
65
  :order => :group,
67
66
  :descending => true
68
67
  )
69
68
 
70
- report.assets # => Array of User instances:
69
+ report.assets # => Array of User instances:
71
70
  # SELECT * FROM users WHERE users.group_id in (1,2) AND users.logins_count >= 1 AND users.category = 'first' ORDER BY groups.name DESC
72
71
 
73
72
  report.header # => ["Name", "Group", "Activated"]
@@ -118,8 +117,9 @@ Datagrid supports different type of filters including:
118
117
  * integer
119
118
  * float
120
119
  * date
120
+ * datetime
121
121
  * boolean
122
- * eboolean - the select of "yes", "no" and any
122
+ * xboolean - the select of "yes", "no" and any
123
123
  * enum
124
124
  * string
125
125
  * dynamic
@@ -137,10 +137,10 @@ column(:activated, :header => "Active", :order => "activated", :after => :name)
137
137
  end
138
138
  ```
139
139
 
140
- Some formatting options are also available.
140
+ Some formatting options are also available.
141
141
  Each column is sortable.
142
142
 
143
- [More about columns](https://github.com/bogdan/datagrid/wiki/Columns)
143
+ [More about columns](https://github.com/bogdan/datagrid/wiki/Columns)
144
144
 
145
145
  ### Front end
146
146
 
@@ -178,8 +178,8 @@ All advanced frontend things are described in:
178
178
 
179
179
  ## Self-Promotion
180
180
 
181
- Like datagrid?
181
+ Like datagrid?
182
182
 
183
- Follow the repository on [GitHub](https://github.com/bogdan/datagrid).
183
+ Follow the repository on [GitHub](https://github.com/bogdan/datagrid).
184
184
 
185
185
  Read [author blog](http://gusiev.com).
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.3
1
+ 1.0.4
@@ -96,6 +96,12 @@ table.datagrid
96
96
  .separator
97
97
  float: left
98
98
  margin: 6px 4px 0
99
+ .enum_filter.checkboxes
100
+ float: none
101
+ display: block
102
+ input
103
+ margin: 7px
104
+ margin-left: 150px
99
105
 
100
106
 
101
107
  .datagrid-actions
@@ -2,14 +2,15 @@
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.4 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
8
  s.name = "datagrid"
8
- s.version = "1.0.3"
9
+ s.version = "1.0.4"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
12
  s.authors = ["Bogdan Gusiev"]
12
- s.date = "2013-11-27"
13
+ s.date = "2014-01-15"
13
14
  s.description = "This allows you to easily build datagrid aka data tables with sortable columns and filters"
14
15
  s.email = "agresso@gmail.com"
15
16
  s.extra_rdoc_files = [
@@ -50,9 +51,11 @@ Gem::Specification.new do |s|
50
51
  "lib/datagrid/filters/boolean_filter.rb",
51
52
  "lib/datagrid/filters/composite_filters.rb",
52
53
  "lib/datagrid/filters/date_filter.rb",
54
+ "lib/datagrid/filters/date_time_filter.rb",
53
55
  "lib/datagrid/filters/default_filter.rb",
54
56
  "lib/datagrid/filters/dynamic_filter.rb",
55
57
  "lib/datagrid/filters/enum_filter.rb",
58
+ "lib/datagrid/filters/extended_boolean_filter.rb",
56
59
  "lib/datagrid/filters/float_filter.rb",
57
60
  "lib/datagrid/filters/integer_filter.rb",
58
61
  "lib/datagrid/filters/ranged_filter.rb",
@@ -79,8 +82,10 @@ Gem::Specification.new do |s|
79
82
  "spec/datagrid/filters/boolean_enum_filter_spec.rb",
80
83
  "spec/datagrid/filters/composite_filters_spec.rb",
81
84
  "spec/datagrid/filters/date_filter_spec.rb",
85
+ "spec/datagrid/filters/date_time_filter_spec.rb",
82
86
  "spec/datagrid/filters/dynamic_filter_spec.rb",
83
87
  "spec/datagrid/filters/enum_filter_spec.rb",
88
+ "spec/datagrid/filters/extended_boolean_filter_spec.rb",
84
89
  "spec/datagrid/filters/float_filter_spec.rb",
85
90
  "spec/datagrid/filters/integer_filter_spec.rb",
86
91
  "spec/datagrid/filters/string_filter_spec.rb",
@@ -106,17 +111,18 @@ Gem::Specification.new do |s|
106
111
  s.homepage = "http://github.com/bogdan/datagrid"
107
112
  s.licenses = ["MIT"]
108
113
  s.require_paths = ["lib"]
109
- s.rubygems_version = "1.8.25"
114
+ s.rubygems_version = "2.1.10"
110
115
  s.summary = "Ruby gem to create datagrids"
111
116
 
112
117
  if s.respond_to? :specification_version then
113
- s.specification_version = 3
118
+ s.specification_version = 4
114
119
 
115
120
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
116
121
  s.add_runtime_dependency(%q<rails>, [">= 3.0"])
117
122
  s.add_development_dependency(%q<bundler>, [">= 0"])
118
123
  s.add_development_dependency(%q<jeweler>, [">= 0"])
119
124
  s.add_development_dependency(%q<debugger>, [">= 0"])
125
+ s.add_development_dependency(%q<byebug>, [">= 0"])
120
126
  s.add_development_dependency(%q<ruby-debug>, [">= 0"])
121
127
  s.add_development_dependency(%q<rspec>, [">= 0"])
122
128
  s.add_development_dependency(%q<nokogiri>, [">= 0"])
@@ -131,6 +137,7 @@ Gem::Specification.new do |s|
131
137
  s.add_dependency(%q<bundler>, [">= 0"])
132
138
  s.add_dependency(%q<jeweler>, [">= 0"])
133
139
  s.add_dependency(%q<debugger>, [">= 0"])
140
+ s.add_dependency(%q<byebug>, [">= 0"])
134
141
  s.add_dependency(%q<ruby-debug>, [">= 0"])
135
142
  s.add_dependency(%q<rspec>, [">= 0"])
136
143
  s.add_dependency(%q<nokogiri>, [">= 0"])
@@ -146,6 +153,7 @@ Gem::Specification.new do |s|
146
153
  s.add_dependency(%q<bundler>, [">= 0"])
147
154
  s.add_dependency(%q<jeweler>, [">= 0"])
148
155
  s.add_dependency(%q<debugger>, [">= 0"])
156
+ s.add_dependency(%q<byebug>, [">= 0"])
149
157
  s.add_dependency(%q<ruby-debug>, [">= 0"])
150
158
  s.add_dependency(%q<rspec>, [">= 0"])
151
159
  s.add_dependency(%q<nokogiri>, [">= 0"])
@@ -8,6 +8,6 @@ module Datagrid
8
8
  yield(configuration)
9
9
  end
10
10
 
11
- class Configuration < Struct.new(:date_formats)
11
+ class Configuration < Struct.new(:date_formats, :datetime_formats)
12
12
  end
13
13
  end
@@ -18,7 +18,7 @@ module Datagrid
18
18
  # We can only reveal it by checking if it respond to some specific
19
19
  # to ActiveRecord method like #scoped
20
20
  if scope.is_a?(Class)
21
- scope.scoped({})
21
+ Rails.version >= "4.0" ? scope.all : scope.scoped({})
22
22
  elsif scope.respond_to?(:scoped)
23
23
  scope.scoped
24
24
  else
@@ -6,8 +6,10 @@ module Datagrid
6
6
  require "datagrid/filters/base_filter"
7
7
  require "datagrid/filters/enum_filter"
8
8
  require "datagrid/filters/boolean_enum_filter"
9
+ require "datagrid/filters/extended_boolean_filter"
9
10
  require "datagrid/filters/boolean_filter"
10
11
  require "datagrid/filters/date_filter"
12
+ require "datagrid/filters/date_time_filter"
11
13
  require "datagrid/filters/default_filter"
12
14
  require "datagrid/filters/integer_filter"
13
15
  require "datagrid/filters/composite_filters"
@@ -17,9 +19,11 @@ module Datagrid
17
19
 
18
20
  FILTER_TYPES = {
19
21
  :date => Filters::DateFilter,
22
+ :datetime => Filters::DateTimeFilter,
20
23
  :string => Filters::StringFilter,
21
24
  :default => Filters::DefaultFilter,
22
25
  :eboolean => Filters::BooleanEnumFilter ,
26
+ :xboolean => Filters::ExtendedBooleanFilter ,
23
27
  :boolean => Filters::BooleanFilter ,
24
28
  :integer => Filters::IntegerFilter,
25
29
  :enum => Filters::EnumFilter,
@@ -52,7 +56,7 @@ module Datagrid
52
56
  # Defines new datagrid filter.
53
57
  # This method automatically generates <tt>attr_accessor</tt> for filter name
54
58
  # and adds it to the list of datagrid attributes.
55
- #
59
+ #
56
60
  # Arguments:
57
61
  #
58
62
  # * <tt>name</tt> - filter name
@@ -61,19 +65,19 @@ module Datagrid
61
65
  # * <tt>block</tt> - proc to apply the filter
62
66
  #
63
67
  # Available options:
64
- #
68
+ #
65
69
  # * <tt>:header</tt> - determines the header of the filter
66
70
  # * <tt>:default</tt> - the default filter value. Able to accept a <tt>Proc</tt> in case default should be recalculated
67
- # * <tt>:multiple</tt> - if true multiple values can be assigned to this filter.
68
- # By default multiple values are parsed from string using `,` separator.
71
+ # * <tt>:multiple</tt> - if true multiple values can be assigned to this filter.
72
+ # By default multiple values are parsed from string using `,` separator.
69
73
  # But you can specify a different separator as option value. Default: false.
70
74
  # * <tt>:allow_nil</tt> - determines if the value can be nil
71
75
  # * <tt>:allow_blank</tt> - determines if the value can be blank
72
- # * <tt>:before</tt> - determines the position of this filter,
76
+ # * <tt>:before</tt> - determines the position of this filter,
73
77
  # by adding it before the filter passed here (when using datagrid_form_for helper)
74
- # * <tt>:after</tt> - determines the position of this filter,
78
+ # * <tt>:after</tt> - determines the position of this filter,
75
79
  # by adding it after the filter passed here (when using datagrid_form_for helper)
76
- # * <tt>:dummy</tt> - if true, this filter will not be applied automatically
80
+ # * <tt>:dummy</tt> - if true, this filter will not be applied automatically
77
81
  # and will be just displayed in form. In case you may want to apply it manually.
78
82
  #
79
83
  # See: https://github.com/bogdan/datagrid/wiki/Filters for examples
@@ -16,7 +16,6 @@ class Datagrid::Filters::BaseFilter #:nodoc:
16
16
  raise NotImplementedError, "#parse(value) suppose to be overwritten"
17
17
  end
18
18
 
19
-
20
19
  def unapplicable_value?(value)
21
20
  value.nil? ? !allow_nil? : value.blank? && !allow_blank?
22
21
  end
@@ -87,11 +86,12 @@ class Datagrid::Filters::BaseFilter #:nodoc:
87
86
  def default_filter_block
88
87
  filter = self
89
88
  lambda do |value, scope, grid|
90
- filter.dummy? ? nil : filter.default_filter(value, scope, grid)
89
+ filter.default_filter(value, scope, grid)
91
90
  end
92
91
  end
93
92
 
94
93
  def default_filter(value, scope, grid)
94
+ return nil if dummy?
95
95
  driver = grid.driver
96
96
  if !driver.has_column?(scope, name) && driver.to_scope(scope).respond_to?(name)
97
97
  driver.to_scope(scope).send(name, value)
@@ -10,12 +10,4 @@ class Datagrid::Filters::BooleanEnumFilter < Datagrid::Filters::EnumFilter #:nod
10
10
  super(report, attribute, options, &block)
11
11
  end
12
12
 
13
- def apply(grid_object, scope, value)
14
- super(grid_object, scope, value)
15
- end
16
-
17
- def to_boolean(value)
18
- #TODO decide what to do with conversion
19
- end
20
-
21
13
  end
@@ -0,0 +1,25 @@
1
+ require "datagrid/filters/ranged_filter"
2
+
3
+ class Datagrid::Filters::DateTimeFilter < Datagrid::Filters::BaseFilter
4
+
5
+ include RangedFilter
6
+
7
+ def parse(value)
8
+ Datagrid::Utils.parse_datetime(value)
9
+ end
10
+
11
+ def format(value)
12
+ if formats.any? && value
13
+ value.strftime(formats.first)
14
+ else
15
+ super
16
+ end
17
+ end
18
+
19
+ protected
20
+
21
+ def formats
22
+ Array(Datagrid.configuration.datetime_formats)
23
+ end
24
+ end
25
+
@@ -0,0 +1,23 @@
1
+ class Datagrid::Filters::ExtendedBooleanFilter < Datagrid::Filters::EnumFilter #:nodoc:
2
+
3
+ YES = "YES"
4
+ NO = "NO"
5
+
6
+ def initialize(report, attribute, options = {}, &block)
7
+ options[:select] = [YES, NO].map do |key, value|
8
+ [I18n.t("datagrid.filters.xboolean.#{key.downcase}"), key]
9
+ end
10
+ super(report, attribute, options, &block)
11
+ end
12
+
13
+ def execute(value, scope, grid_object)
14
+ value = value.blank? ? nil : ::Datagrid::Utils.booleanize(value)
15
+ super(value, scope, grid_object)
16
+ end
17
+
18
+ def parse(value)
19
+ return nil if value.blank?
20
+ super(value)
21
+ end
22
+
23
+ end
@@ -11,15 +11,18 @@ module Datagrid
11
11
  end
12
12
 
13
13
  # Returns a form label html for the corresponding filter name
14
- def datagrid_label(filter_or_attribute, options = {})
14
+ def datagrid_label(filter_or_attribute, options = {}, &block)
15
15
  filter = datagrid_get_filter(filter_or_attribute)
16
- self.label(filter.name, filter.header, options)
16
+ label(filter.name, filter.header, options, &block)
17
17
  end
18
18
 
19
19
  protected
20
20
  def datagrid_boolean_enum_filter(attribute_or_filter, options = {})
21
21
  datagrid_enum_filter(attribute_or_filter, options)
22
22
  end
23
+ def datagrid_extended_boolean_filter(attribute_or_filter, options = {})
24
+ datagrid_enum_filter(attribute_or_filter, options)
25
+ end
23
26
 
24
27
  def datagrid_boolean_filter(attribute_or_filter, options = {})
25
28
  check_box(datagrid_get_attribute(attribute_or_filter), options.reverse_merge(datagrid_extra_checkbox_options))
@@ -29,6 +32,10 @@ module Datagrid
29
32
  datagrid_range_filter(:date, attribute_or_filter, options)
30
33
  end
31
34
 
35
+ def datagrid_date_time_filter(attribute_or_filter, options = {})
36
+ datagrid_range_filter(:datetime, attribute_or_filter, options)
37
+ end
38
+
32
39
  def datagrid_default_filter(attribute_or_filter, options = {})
33
40
  filter = datagrid_get_filter(attribute_or_filter)
34
41
  text_field filter.name, options.reverse_merge(:value => object.filter_value_as_string(filter))
@@ -37,6 +44,7 @@ module Datagrid
37
44
  def datagrid_enum_filter(attribute_or_filter, options = {})
38
45
  filter = datagrid_get_filter(attribute_or_filter)
39
46
  if filter.checkboxes?
47
+ options = add_html_classes(options, 'checkboxes')
40
48
  filter.select(object).map do |element|
41
49
  text, value = @template.send(:option_text_and_value, element)
42
50
  id = [object_name, filter.name, value].join('_').underscore
@@ -110,15 +118,15 @@ module Datagrid
110
118
  options[:value] = filter.format(object[filter.name].try(type_method_map[type]))
111
119
  # In case of datagrid ranged filter
112
120
  # from and to input will have same id
113
- options[:id] = if !options.key?(:id)
114
- # Rails provides it's own default id for all inputs
115
- # In order to prevent that we assign no id by default
116
- options[:id] = nil
117
- elsif options[:id].present?
118
- # If the id was given we prefix it
119
- # with from_ and to_ accordingly
120
- options[:id] = [type, options[:id]].join("_")
121
- end
121
+ if !options.key?(:id)
122
+ # Rails provides it's own default id for all inputs
123
+ # In order to prevent that we assign no id by default
124
+ options[:id] = nil
125
+ elsif options[:id].present?
126
+ # If the id was given we prefix it
127
+ # with from_ and to_ accordingly
128
+ options[:id] = [type, options[:id]].join("_")
129
+ end
122
130
  options
123
131
  end
124
132
 
@@ -16,10 +16,18 @@ en:
16
16
  date:
17
17
  range_separator:
18
18
  "<span class=\"separator date\"> - </span>"
19
+ datetime:
20
+ range_separator:
21
+ "<span class=\"separator datetime\"> - </span>"
19
22
 
20
23
  eboolean:
21
24
  "yes": "Yes"
22
25
  "no": "No"
26
+
27
+ xboolean:
28
+ "yes": "Yes"
29
+ "no": "No"
30
+
23
31
  dynamic:
24
32
  operations:
25
33
  ">=": "&ge;"
@@ -8,6 +8,9 @@ class Datagrid::Scaffold < Rails::Generators::NamedBase
8
8
  template "controller.rb.erb", "app/controllers/#{grid_controller_name.underscore}.rb"
9
9
  template "index.html.erb", "app/views/#{grid_controller_short_name}/index.html.erb"
10
10
  route("resources :#{grid_controller_short_name}")
11
+ in_root do
12
+ inject_into_file "app/assets/stylesheets/application.css", " *= require datagrid", {:before => %r{require_self}} # before all
13
+ end
11
14
  end
12
15
 
13
16
  def grid_class_name
@@ -1,4 +1,4 @@
1
- module Datagrid
1
+ module Datagrid
2
2
  module Utils # :nodoc:
3
3
  class << self
4
4
 
@@ -6,6 +6,9 @@ module Datagrid
6
6
  TRUTH = [true, 1, "1", "true", "yes", "on"]
7
7
 
8
8
  def booleanize(value)
9
+ if value.respond_to?(:downcase)
10
+ value = value.downcase
11
+ end
9
12
  TRUTH.include?(value)
10
13
  end
11
14
 
@@ -73,6 +76,24 @@ module Datagrid
73
76
  nil
74
77
  end
75
78
 
79
+ def parse_datetime(value)
80
+ return nil if value.blank?
81
+ return value if value.is_a?(Range)
82
+ if value.is_a?(String)
83
+ Array(Datagrid.configuration.datetime_formats).each do |format|
84
+ begin
85
+ return DateTime.strptime(value, format)
86
+ rescue ::ArgumentError
87
+ end
88
+ end
89
+ end
90
+ return DateTime.parse(value) if value.is_a?(String)
91
+ return value.to_datetime if value.respond_to?(:to_datetime)
92
+ value
93
+ rescue ::ArgumentError
94
+ nil
95
+ end
96
+
76
97
  def format_date_as_timestamp(value)
77
98
  if !value
78
99
  value
@@ -15,7 +15,7 @@ describe Datagrid::Core do
15
15
  context 'in the class' do
16
16
  let(:report) { report_class.new }
17
17
 
18
- it { expect(report.scope).to have(2).item }
18
+ it { expect(report.scope.to_a).to have(2).item }
19
19
  end
20
20
 
21
21
  context 'changes scope on the fly' do
@@ -25,25 +25,25 @@ describe Datagrid::Core do
25
25
  end
26
26
  end
27
27
 
28
- it { expect(report.scope).to have(1).item }
28
+ it { expect(report.scope.to_a).to have(1).item }
29
29
  end
30
30
 
31
31
  context 'overriding scope by initializer' do
32
32
  let(:report) { report_class.new { Entry.limit(1) } }
33
33
 
34
- it { expect(report.scope).to have(1).item }
34
+ it { expect(report.scope.to_a).to have(1).item }
35
35
 
36
36
  context "reset scope to default" do
37
37
  before do
38
38
  report.reset_scope
39
39
  end
40
- it { expect(report.scope).to have(2).item }
40
+ it { expect(report.scope.to_a).to have(2).item }
41
41
  end
42
42
  end
43
43
 
44
44
  context "appending scope by initializer " do
45
45
  let(:report) { report_class.new {|scope| scope.limit(1)} }
46
- it { expect(report.scope).to have(1).item }
46
+ it { expect(report.scope.to_a).to have(1).item }
47
47
  it { expect(report.scope.order_values).to have(1).item }
48
48
  end
49
49
  end
@@ -0,0 +1,150 @@
1
+ require 'spec_helper'
2
+
3
+ describe Datagrid::Filters::DateTimeFilter do
4
+ {:active_record => Entry, :mongoid => MongoidEntry}.each do |orm, klass|
5
+ describe "with orm #{orm}" do
6
+ describe "timestamp to timestamp conversion" do
7
+ let(:klass) { klass }
8
+ subject do
9
+ test_report(:created_at => _created_at) do
10
+ scope { klass }
11
+ filter(:created_at, :datetime, :range => true)
12
+ end.assets.to_a
13
+ end
14
+
15
+ def entry_dated(date)
16
+ klass.create(:created_at => date)
17
+ end
18
+
19
+ context "when single datetime paramter given" do
20
+ let(:_created_at) { DateTime.now }
21
+ it { should include(entry_dated(_created_at))}
22
+ it { should_not include(entry_dated(_created_at - 1.second))}
23
+ it { should_not include(entry_dated(_created_at + 1.second))}
24
+ end
25
+
26
+ context "when range datetime range given" do
27
+ let(:_created_at) { [DateTime.now.beginning_of_day, DateTime.now.end_of_day] }
28
+ it { should include(entry_dated(1.second.ago))}
29
+ it { should include(entry_dated(Date.today.to_datetime))}
30
+ it { should include(entry_dated(Date.today.end_of_day.to_datetime))}
31
+ it { should_not include(entry_dated(Date.yesterday.end_of_day))}
32
+ it { should_not include(entry_dated(Date.tomorrow.beginning_of_day))}
33
+ end
34
+ end
35
+
36
+ end
37
+ end
38
+
39
+ it "should support datetime range given as array argument" do
40
+ e1 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 1, 0))
41
+ e2 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 2, 0))
42
+ e3 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 3, 0))
43
+ report = test_report(:created_at => [DateTime.new(2013, 1, 1, 1, 30).to_s, DateTime.new(2013, 1, 1, 2, 30).to_s]) do
44
+ scope { Entry }
45
+ filter(:created_at, :datetime, :range => true)
46
+ end
47
+ report.assets.should_not include(e1)
48
+ report.assets.should include(e2)
49
+ report.assets.should_not include(e3)
50
+ end
51
+
52
+ it "should support minimum datetime argument" do
53
+ e1 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 1, 0))
54
+ e2 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 2, 0))
55
+ e3 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 3, 0))
56
+ report = test_report(:created_at => [DateTime.new(2013, 1, 1, 1, 30).to_s, nil]) do
57
+ scope { Entry }
58
+ filter(:created_at, :datetime, :range => true)
59
+ end
60
+ report.assets.should_not include(e1)
61
+ report.assets.should include(e2)
62
+ report.assets.should include(e3)
63
+ end
64
+
65
+ it "should support maximum datetime argument" do
66
+ e1 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 1, 0))
67
+ e2 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 2, 0))
68
+ e3 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 3, 0))
69
+ report = test_report(:created_at => [nil, DateTime.new(2013, 1, 1, 2, 30).to_s]) do
70
+ scope { Entry }
71
+ filter(:created_at, :datetime, :range => true)
72
+ end
73
+ report.assets.should include(e1)
74
+ report.assets.should include(e2)
75
+ report.assets.should_not include(e3)
76
+ end
77
+
78
+ it "should find something in one second interval" do
79
+
80
+ e1 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 1, 0))
81
+ e2 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 2, 0))
82
+ e3 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 3, 0))
83
+ report = test_report(:created_at => (DateTime.new(2013, 1, 1, 2, 0)..DateTime.new(2013, 1, 1, 2, 0))) do
84
+ scope { Entry }
85
+ filter(:created_at, :datetime, :range => true)
86
+ end
87
+ report.assets.should_not include(e1)
88
+ report.assets.should include(e2)
89
+ report.assets.should_not include(e3)
90
+ end
91
+ it "should support invalid range" do
92
+
93
+ e1 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 1, 0))
94
+ e2 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 2, 0))
95
+ e3 = Entry.create!(:created_at => DateTime.new(2013, 1, 1, 3, 0))
96
+ report = test_report(:created_at => (DateTime.new(2013, 1, 1, 3, 0)..DateTime.new(2013, 1, 1, 1, 0))) do
97
+ scope { Entry }
98
+ filter(:created_at, :datetime, :range => true)
99
+ end
100
+ report.assets.should_not include(e1)
101
+ report.assets.should_not include(e2)
102
+ report.assets.should_not include(e3)
103
+ end
104
+
105
+
106
+ it "should support block" do
107
+ report = test_report(:created_at => DateTime.now) do
108
+ scope { Entry }
109
+ filter(:created_at, :datetime, :range => true) do |value|
110
+ where("created_at >= ?", value)
111
+ end
112
+ end
113
+ report.assets.should_not include(Entry.create!(:created_at => 1.day.ago))
114
+ report.assets.should include(Entry.create!(:created_at => DateTime.tomorrow))
115
+ end
116
+
117
+
118
+ context "when datetime format is configured" do
119
+ around(:each) do |example|
120
+ with_datetime_format(format = "%m/%d/%Y %H:%M") do
121
+ example.run
122
+ end
123
+ end
124
+
125
+ it "should have configurable datetime format" do
126
+ report = test_report(:created_at => "10/01/2013 01:00") do
127
+ scope {Entry}
128
+ filter(:created_at, :datetime)
129
+ end
130
+ report.created_at.should == DateTime.new(2013,10,01,1,0)
131
+ end
132
+
133
+ it "should support default explicit datetime" do
134
+ report = test_report(:created_at => DateTime.parse("2013-10-01 01:00")) do
135
+ scope {Entry}
136
+ filter(:created_at, :datetime)
137
+ end
138
+ report.created_at.should == DateTime.new(2013,10,01,1,0)
139
+ end
140
+ end
141
+
142
+
143
+ it "should automatically reverse Array if first more than last" do
144
+ report = test_report(:created_at => ["2013-01-01 01:00", "2012-01-01 01:00"]) do
145
+ scope {Entry}
146
+ filter(:created_at, :datetime, :range => true)
147
+ end
148
+ report.created_at.should == [DateTime.new(2012, 01, 01, 1, 0), DateTime.new(2013, 01, 01, 1, 0)]
149
+ end
150
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Datagrid::Filters::ExtendedBooleanFilter do
4
+
5
+ it "should support select option" do
6
+ test_report do
7
+ scope {Entry}
8
+ filter(:disabled, :xboolean)
9
+ end.class.filter_by_name(:disabled).select.should == [["Yes", "YES"], ["No", "NO"]]
10
+ end
11
+
12
+ it "should generate pass boolean value to filter block" do
13
+ grid = test_report do
14
+ scope {Entry}
15
+ filter(:disabled, :xboolean)
16
+ end
17
+
18
+ disabled_entry = Entry.create!(:disabled => true)
19
+ enabled_entry = Entry.create!(:disabled => false)
20
+
21
+ grid.disabled.should be_nil
22
+ grid.assets.should include(disabled_entry, enabled_entry)
23
+ grid.disabled = "YES"
24
+
25
+ grid.disabled.should == "YES"
26
+ grid.assets.should include(disabled_entry)
27
+ grid.assets.should_not include(enabled_entry)
28
+ grid.disabled = "NO"
29
+ grid.disabled.should == "NO"
30
+ grid.assets.should include(enabled_entry)
31
+ grid.assets.should_not include(disabled_entry)
32
+
33
+ end
34
+
35
+ end
@@ -234,12 +234,23 @@ describe Datagrid::FormBuilder do
234
234
  end
235
235
  end
236
236
  let(:_filter) { :category }
237
- it { should equal_to_dom(
238
- '
239
- <label class="category enum_filter" for="report_category_first"><input id="report_category_first" name="report[category][]" type="checkbox" value="first" />first</label>
240
- <label class="category enum_filter" for="report_category_second"><input id="report_category_second" name="report[category][]" type="checkbox" value="second" />second</label>
241
- '
242
- )}
237
+ if Rails.version >= "4.0"
238
+ it { should equal_to_dom(
239
+ '
240
+ <label class="category enum_filter checkboxes" for="report_category_first"><input id="report_category_first" name="report[category][]" type="checkbox" value="first" />first</label>
241
+ <label class="category enum_filter checkboxes" for="report_category_second"><input id="report_category_second" name="report[category][]" type="checkbox" value="second" />second</label>
242
+ '
243
+ )}
244
+ else
245
+ it { should equal_to_dom(
246
+ '
247
+ <label class="category enum_filter checkboxes" for="report_category_first"><input name="report[category][]" type="hidden"><input id="report_category_first" name="report[category][]" type="checkbox" value="first" />first</label>
248
+ <label class="category enum_filter checkboxes" for="report_category_second"><input name="report[category][]" type="hidden"><input id="report_category_second" name="report[category][]" type="checkbox" value="second" />second</label>
249
+ '
250
+ )}
251
+
252
+
253
+ end
243
254
  end
244
255
  end
245
256
 
@@ -457,5 +468,10 @@ describe Datagrid::FormBuilder do
457
468
  '<label class="foo" for="report_name">Name</label>'
458
469
  )
459
470
  end
471
+ it "should support block" do
472
+ view.datagrid_label(:name, :class => 'foo') { 'The Name' }.should equal_to_dom(
473
+ '<label class="foo" for="report_name">The Name</label>'
474
+ )
475
+ end
460
476
  end
461
477
  end
@@ -25,6 +25,14 @@ end
25
25
  require 'rspec'
26
26
  require "logger"
27
27
 
28
+ class DatagridTest < Rails::Application
29
+
30
+ end
31
+
32
+ if I18n.respond_to?(:enforce_available_locales)
33
+ I18n.enforce_available_locales = true
34
+ end
35
+
28
36
  File.open('spec.log', "w").close
29
37
  TEST_LOGGER = Logger.new('spec.log')
30
38
 
@@ -11,3 +11,18 @@ def with_date_format(format = "%m/%d/%Y")
11
11
  end
12
12
  end
13
13
  end
14
+
15
+ def with_datetime_format(format = "%m/%d/%Y")
16
+ begin
17
+ old_format = Datagrid.configuration.datetime_formats
18
+ Datagrid.configure do |config|
19
+ config.datetime_formats = format
20
+ end
21
+ yield
22
+ ensure
23
+ Datagrid.configure do |config|
24
+ config.datetime_formats = old_format
25
+ end
26
+ end
27
+ end
28
+
metadata CHANGED
@@ -1,148 +1,144 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datagrid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
5
- prerelease:
4
+ version: 1.0.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Bogdan Gusiev
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-11-27 00:00:00.000000000 Z
11
+ date: 2014-01-15 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '3.0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '3.0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: bundler
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: jeweler
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: debugger
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
76
81
  - !ruby/object:Gem::Version
77
82
  version: '0'
78
83
  - !ruby/object:Gem::Dependency
79
84
  name: ruby-debug
80
85
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
86
  requirements:
83
- - - ! '>='
87
+ - - '>='
84
88
  - !ruby/object:Gem::Version
85
89
  version: '0'
86
90
  type: :development
87
91
  prerelease: false
88
92
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
93
  requirements:
91
- - - ! '>='
94
+ - - '>='
92
95
  - !ruby/object:Gem::Version
93
96
  version: '0'
94
97
  - !ruby/object:Gem::Dependency
95
98
  name: rspec
96
99
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
100
  requirements:
99
- - - ! '>='
101
+ - - '>='
100
102
  - !ruby/object:Gem::Version
101
103
  version: '0'
102
104
  type: :development
103
105
  prerelease: false
104
106
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
107
  requirements:
107
- - - ! '>='
108
+ - - '>='
108
109
  - !ruby/object:Gem::Version
109
110
  version: '0'
110
111
  - !ruby/object:Gem::Dependency
111
112
  name: nokogiri
112
113
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
114
  requirements:
115
- - - ! '>='
115
+ - - '>='
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
121
  requirements:
123
- - - ! '>='
122
+ - - '>='
124
123
  - !ruby/object:Gem::Version
125
124
  version: '0'
126
125
  - !ruby/object:Gem::Dependency
127
126
  name: sqlite3-ruby
128
127
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
128
  requirements:
131
- - - ! '>='
129
+ - - '>='
132
130
  - !ruby/object:Gem::Version
133
131
  version: '0'
134
132
  type: :development
135
133
  prerelease: false
136
134
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
135
  requirements:
139
- - - ! '>='
136
+ - - '>='
140
137
  - !ruby/object:Gem::Version
141
138
  version: '0'
142
139
  - !ruby/object:Gem::Dependency
143
140
  name: mongoid
144
141
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
142
  requirements:
147
143
  - - '='
148
144
  - !ruby/object:Gem::Version
@@ -150,7 +146,6 @@ dependencies:
150
146
  type: :development
151
147
  prerelease: false
152
148
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
149
  requirements:
155
150
  - - '='
156
151
  - !ruby/object:Gem::Version
@@ -158,23 +153,20 @@ dependencies:
158
153
  - !ruby/object:Gem::Dependency
159
154
  name: mongo_mapper
160
155
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
156
  requirements:
163
- - - ! '>='
157
+ - - '>='
164
158
  - !ruby/object:Gem::Version
165
159
  version: 0.11.0
166
160
  type: :development
167
161
  prerelease: false
168
162
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
163
  requirements:
171
- - - ! '>='
164
+ - - '>='
172
165
  - !ruby/object:Gem::Version
173
166
  version: 0.11.0
174
167
  - !ruby/object:Gem::Dependency
175
168
  name: bson
176
169
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
170
  requirements:
179
171
  - - '='
180
172
  - !ruby/object:Gem::Version
@@ -182,7 +174,6 @@ dependencies:
182
174
  type: :development
183
175
  prerelease: false
184
176
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
177
  requirements:
187
178
  - - '='
188
179
  - !ruby/object:Gem::Version
@@ -190,7 +181,6 @@ dependencies:
190
181
  - !ruby/object:Gem::Dependency
191
182
  name: bson_ext
192
183
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
184
  requirements:
195
185
  - - '='
196
186
  - !ruby/object:Gem::Version
@@ -198,7 +188,6 @@ dependencies:
198
188
  type: :development
199
189
  prerelease: false
200
190
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
191
  requirements:
203
192
  - - '='
204
193
  - !ruby/object:Gem::Version
@@ -206,17 +195,15 @@ dependencies:
206
195
  - !ruby/object:Gem::Dependency
207
196
  name: fastercsv
208
197
  requirement: !ruby/object:Gem::Requirement
209
- none: false
210
198
  requirements:
211
- - - ! '>='
199
+ - - '>='
212
200
  - !ruby/object:Gem::Version
213
201
  version: '0'
214
202
  type: :development
215
203
  prerelease: false
216
204
  version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
205
  requirements:
219
- - - ! '>='
206
+ - - '>='
220
207
  - !ruby/object:Gem::Version
221
208
  version: '0'
222
209
  description: This allows you to easily build datagrid aka data tables with sortable
@@ -261,9 +248,11 @@ files:
261
248
  - lib/datagrid/filters/boolean_filter.rb
262
249
  - lib/datagrid/filters/composite_filters.rb
263
250
  - lib/datagrid/filters/date_filter.rb
251
+ - lib/datagrid/filters/date_time_filter.rb
264
252
  - lib/datagrid/filters/default_filter.rb
265
253
  - lib/datagrid/filters/dynamic_filter.rb
266
254
  - lib/datagrid/filters/enum_filter.rb
255
+ - lib/datagrid/filters/extended_boolean_filter.rb
267
256
  - lib/datagrid/filters/float_filter.rb
268
257
  - lib/datagrid/filters/integer_filter.rb
269
258
  - lib/datagrid/filters/ranged_filter.rb
@@ -290,8 +279,10 @@ files:
290
279
  - spec/datagrid/filters/boolean_enum_filter_spec.rb
291
280
  - spec/datagrid/filters/composite_filters_spec.rb
292
281
  - spec/datagrid/filters/date_filter_spec.rb
282
+ - spec/datagrid/filters/date_time_filter_spec.rb
293
283
  - spec/datagrid/filters/dynamic_filter_spec.rb
294
284
  - spec/datagrid/filters/enum_filter_spec.rb
285
+ - spec/datagrid/filters/extended_boolean_filter_spec.rb
295
286
  - spec/datagrid/filters/float_filter_spec.rb
296
287
  - spec/datagrid/filters/integer_filter_spec.rb
297
288
  - spec/datagrid/filters/string_filter_spec.rb
@@ -316,29 +307,25 @@ files:
316
307
  homepage: http://github.com/bogdan/datagrid
317
308
  licenses:
318
309
  - MIT
310
+ metadata: {}
319
311
  post_install_message:
320
312
  rdoc_options: []
321
313
  require_paths:
322
314
  - lib
323
315
  required_ruby_version: !ruby/object:Gem::Requirement
324
- none: false
325
316
  requirements:
326
- - - ! '>='
317
+ - - '>='
327
318
  - !ruby/object:Gem::Version
328
319
  version: '0'
329
- segments:
330
- - 0
331
- hash: 356271283638718851
332
320
  required_rubygems_version: !ruby/object:Gem::Requirement
333
- none: false
334
321
  requirements:
335
- - - ! '>='
322
+ - - '>='
336
323
  - !ruby/object:Gem::Version
337
324
  version: '0'
338
325
  requirements: []
339
326
  rubyforge_project:
340
- rubygems_version: 1.8.25
327
+ rubygems_version: 2.1.10
341
328
  signing_key:
342
- specification_version: 3
329
+ specification_version: 4
343
330
  summary: Ruby gem to create datagrids
344
331
  test_files: []