datagrid 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []