datagrid 2.0.5 → 2.0.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c86512c8f1419a81e769bc5341867e20071dcf1424ce55200a496e529a3b275c
4
- data.tar.gz: b192c0bd6a90ce4085255de178ef732cbef691c7e529905138b47b6edd122fa1
3
+ metadata.gz: 9d7cb9f6ca20bf850b830352d5acedd8b71c33cd344b27a2ad87ae6a9f78d58f
4
+ data.tar.gz: a6261913da93d1c8e1a875ff1b98efb907e015af43f03603ba4c40d48bca8c30
5
5
  SHA512:
6
- metadata.gz: da1baacc64d7e8502ce8738ff4de3c6346f2e1b486a49337c7194a64fcabbf9c38ba8839e1cd1f1be181419b185b79b41147cc0536581846625ca6386c21e1fd
7
- data.tar.gz: af4ababb2213b465ef1fbac48a406166d336d917becbde4cb58ad0643aa78032f0f23fcf4461c730582cf5a162edfec5817f794bea54d9b3310d9801ba5aca63
6
+ metadata.gz: 4e20609d434f571ba4fcec92f821fd2bf6a9e4995629fd0a3702562d3b2dbd06f647dbac9104cdf45d37a11b622e7d64012f160348493e0f70ab5972900e9a9b
7
+ data.tar.gz: e16a562a395b43cd36da74635ec61bc4b4c800f7b68d64e2e4dfd4713ac6c3bd9fe1b64d9ccb44ba03ae44dbb264c919a03c6e94f7e05f5fa9ae61ac4baa1bee
data/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.7]
4
+
5
+ * Raise `Datagrid::ConfigurationError` when column or filter name
6
+ specified in `before` or `after` option not found.
7
+ * Fixed `as_query` method when dynamic filter is used. Fixes [#344](https://github.com/bogdan/datagrid/issues/344)
8
+
9
+ ``` ruby
10
+ grid = ProductsGrid.new(category: 'dresses', available: true, condition: ["price", ">=", 25])
11
+ # Before
12
+ grid.as_query
13
+ # => {
14
+ # category: 'dresses',
15
+ # available: true,
16
+ # condition: #<Object>
17
+ # }
18
+ # After
19
+ grid.as_query
20
+ # => {
21
+ # "category" => 'dresses',
22
+ # "available" => true,
23
+ # "condition" => { "field" => "price", "operation" => ">=", "value" => "25" }
24
+ # }
25
+ ```
26
+
27
+
28
+ ## [2.0.6]
29
+
30
+ * Validate dummy filter can not accept block
31
+
3
32
  ## [2.0.5]
4
33
 
5
34
  * Add support for timestamptz ActiveRecord column type
@@ -378,6 +378,9 @@ module Datagrid
378
378
  end
379
379
 
380
380
  position = Datagrid::Utils.extract_position_from_options(columns, options)
381
+ unless position
382
+ raise Datagrid::ConfigurationError, "#{self}##{options[:before] || options[:after]} column not found"
383
+ end
381
384
  column = Datagrid::Columns::Column.new(
382
385
  self, name, query, options, &block
383
386
  )
data/lib/datagrid/core.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "datagrid/drivers"
4
4
  require "active_support/core_ext/class/attribute"
5
+ require "active_support/core_ext/object/json"
5
6
  require "active_model/attribute_assignment"
6
7
 
7
8
  module Datagrid
@@ -210,16 +211,15 @@ module Datagrid
210
211
  scope
211
212
  end
212
213
 
213
- # @return [Hash{Symbol => Object}] serializable query arguments skipping all nil values
214
+ # @return [Hash{String => Object}] serializable query arguments skipping all nil values
214
215
  # @example
215
216
  # grid = ProductsGrid.new(category: 'dresses', available: true)
216
217
  # grid.as_query # => {category: 'dresses', available: true}
217
218
  def as_query
218
- attributes = self.attributes.clone
219
- attributes.each do |key, value|
220
- attributes.delete(key) if value.nil?
219
+ self.attributes.reduce({}) do |result, (k,v)|
220
+ result[k.to_s] = v.as_json unless v.nil?
221
+ result
221
222
  end
222
- attributes
223
223
  end
224
224
 
225
225
  # @return [Hash{Symbol => Hash{Symbol => Object}}] query parameters to link this grid from a page
@@ -228,7 +228,18 @@ module Datagrid
228
228
  # Rails.application.routes.url_helpers.products_path(grid.query_params)
229
229
  # # => "/products?products_grid[category]=dresses&products_grid[available]=true"
230
230
  def query_params(attributes = {})
231
- { param_name.to_sym => as_query.merge(attributes) }
231
+ { param_name.to_s => as_query.merge(attributes.stringify_keys) }
232
+ end
233
+
234
+ # @return [Hash{String => Object}] JSON representation of datagrid attributes
235
+ # @example
236
+ # grid = ProductsGrid.new(category: 'dresses', available: true)
237
+ # grid.as_json # => {"category" => 'dresses', "available" => true}
238
+ def as_json(options = nil)
239
+ attributes.reduce({}) do |result, (k,v)|
240
+ result[k.to_s] = v.as_json(options)
241
+ result
242
+ end
232
243
  end
233
244
 
234
245
  # @return [void] redefines scope at instance level
@@ -31,12 +31,10 @@ module Datagrid
31
31
  end
32
32
 
33
33
  def append_column_queries(assets, columns)
34
- if columns.present?
35
- assets = assets.select(assets.klass.arel_table[Arel.star]) if assets.select_values.empty?
36
- columns = columns.map { |c| "#{c.query} AS #{c.name}" }
37
- assets = assets.select(*columns)
38
- end
39
- assets
34
+ return assets if columns.empty?
35
+ assets = assets.select(assets.klass.arel_table[Arel.star]) if assets.select_values.empty?
36
+ columns = columns.map { |c| "#{c.query} AS #{c.name}" }
37
+ assets.select(*columns)
40
38
  end
41
39
 
42
40
  def where(scope, attribute, value)
@@ -89,9 +87,12 @@ module Datagrid
89
87
  end
90
88
 
91
89
  def normalized_column_type(scope, field)
92
- return nil unless scope_has_column?(scope, field)
90
+ builtin_type = scope_has_column?(scope, field) ?
91
+ scope.columns_hash[field.to_s].type :
92
+ scope.connection.select_all(
93
+ scope.unscope(:select, :order).select(field => "custom_field").limit(0).arel
94
+ ).column_types['custom_field']&.type
93
95
 
94
- builtin_type = scope.columns_hash[field.to_s].type
95
96
  {
96
97
  %i[string text time binary] => :string,
97
98
  %i[integer primary_key] => :integer,
@@ -102,6 +103,7 @@ module Datagrid
102
103
  }.each do |keys, value|
103
104
  return value if keys.include?(builtin_type)
104
105
  end
106
+ nil
105
107
  end
106
108
 
107
109
  def batch_each(scope, batch_size, &block)
@@ -17,6 +17,9 @@ module Datagrid
17
17
  self.name = name.to_sym
18
18
  self.options = Datagrid::Utils.callable(grid_class.default_filter_options, self).merge(options)
19
19
  self.block = block
20
+ if dummy? && block
21
+ raise Datagrid::ConfigurationError, "#{grid_class}##{name} filter is dummy and can not accept block"
22
+ end
20
23
  end
21
24
 
22
25
  def parse(value)
@@ -32,7 +35,7 @@ module Datagrid
32
35
  end
33
36
 
34
37
  def apply(grid_object, scope, value)
35
- return scope if unapplicable_value?(value)
38
+ return scope if dummy? || unapplicable_value?(value)
36
39
 
37
40
  result = execute(value, scope, grid_object)
38
41
 
@@ -12,7 +12,9 @@ module Datagrid
12
12
  end
13
13
 
14
14
  def apply(grid_object, scope, value)
15
- value = Datagrid::Utils.format_date_as_timestamp(value) if grid_object.driver.timestamp_column?(scope, name)
15
+ if !dummy? && grid_object.driver.timestamp_column?(scope, name)
16
+ value = Datagrid::Utils.format_date_as_timestamp(value)
17
+ end
16
18
  super
17
19
  end
18
20
 
@@ -128,7 +128,7 @@ module Datagrid
128
128
  end
129
129
 
130
130
  def inspect
131
- { field: field, operation: operation, value: value }
131
+ "#<#{self.class} #{to_h.inspect}>"
132
132
  end
133
133
 
134
134
  def to_ary
@@ -143,6 +143,10 @@ module Datagrid
143
143
  { field: field, operation: operation, value: value }
144
144
  end
145
145
 
146
+ def as_json
147
+ { "field" => field, "operation" => operation, "value" => value }
148
+ end
149
+
146
150
  protected
147
151
 
148
152
  def type_cast(type, value)
@@ -244,6 +244,9 @@ module Datagrid
244
244
  raise ConfigurationError, "filter class #{type.inspect} not found" unless klass
245
245
 
246
246
  position = Datagrid::Utils.extract_position_from_options(filters_array, options)
247
+ unless position
248
+ raise Datagrid::ConfigurationError, "#{self}##{options[:before] || options[:after]} filter not found"
249
+ end
247
250
  filter = klass.new(self, name, **options, &block)
248
251
  filters_array.insert(position, filter)
249
252
 
@@ -436,7 +436,7 @@ module Datagrid
436
436
  query = request&.query_parameters || {}
437
437
  ActionDispatch::Http::URL.path_for(
438
438
  path: request&.path || "/",
439
- params: query.merge(grid.query_params(order: column.name, descending: descending)),
439
+ params: query.merge(grid.query_params("order" => column.name, "descending" => descending)),
440
440
  )
441
441
  end
442
442
 
@@ -4,7 +4,7 @@ module Datagrid
4
4
  # @!visibility private
5
5
  module Utils
6
6
  class << self
7
- TRUTH = [true, 1, "1", "true", "yes", "on"].freeze
7
+ TRUTH = [true, 1, "1", "true", "yes", "on", "y"].freeze
8
8
 
9
9
  def booleanize(value)
10
10
  value = value.downcase if value.respond_to?(:downcase)
@@ -68,7 +68,9 @@ module Datagrid
68
68
  array.index { |c| c.name.to_sym == before }
69
69
  elsif after
70
70
  after = after.to_sym
71
- array.index { |c| c.name.to_sym == after } + 1
71
+ if index = array.index { |c| c.name.to_sym == after }
72
+ index + 1
73
+ end
72
74
  else
73
75
  -1
74
76
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Datagrid
4
- VERSION = "2.0.5"
4
+ VERSION = "2.0.7"
5
5
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datagrid
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.5
4
+ version: 2.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bogdan Gusiev
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2025-11-18 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: railties
@@ -97,6 +98,7 @@ metadata:
97
98
  changelog_uri: https://github.com/bogdan/datagrid/blob/main/CHANGELOG.md
98
99
  source_code_uri: https://github.com/bogdan/datagrid
99
100
  rubygems_mfa_required: 'true'
101
+ post_install_message:
100
102
  rdoc_options: []
101
103
  require_paths:
102
104
  - lib
@@ -111,7 +113,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
113
  - !ruby/object:Gem::Version
112
114
  version: '0'
113
115
  requirements: []
114
- rubygems_version: 3.6.7
116
+ rubygems_version: 3.4.10
117
+ signing_key:
115
118
  specification_version: 4
116
119
  summary: Library that provides DSL to present table like data
117
120
  test_files: []