datagrid 1.8.2 → 2.0.0.pre.alpha

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -1
  3. data/{Readme.markdown → README.md} +44 -27
  4. data/app/assets/stylesheets/datagrid.css +145 -0
  5. data/app/views/datagrid/_enum_checkboxes.html.erb +5 -3
  6. data/app/views/datagrid/_form.html.erb +4 -4
  7. data/app/views/datagrid/_head.html.erb +26 -3
  8. data/app/views/datagrid/_range_filter.html.erb +5 -3
  9. data/app/views/datagrid/_row.html.erb +12 -1
  10. data/app/views/datagrid/_table.html.erb +4 -4
  11. data/datagrid.gemspec +6 -6
  12. data/lib/datagrid/active_model.rb +9 -17
  13. data/lib/datagrid/base.rb +39 -0
  14. data/lib/datagrid/column_names_attribute.rb +9 -11
  15. data/lib/datagrid/columns/column.rb +155 -133
  16. data/lib/datagrid/columns.rb +254 -45
  17. data/lib/datagrid/configuration.rb +23 -10
  18. data/lib/datagrid/core.rb +89 -54
  19. data/lib/datagrid/deprecated_object.rb +20 -0
  20. data/lib/datagrid/drivers/abstract_driver.rb +12 -23
  21. data/lib/datagrid/drivers/active_record.rb +24 -26
  22. data/lib/datagrid/drivers/array.rb +22 -14
  23. data/lib/datagrid/drivers/mongo_mapper.rb +15 -14
  24. data/lib/datagrid/drivers/mongoid.rb +15 -17
  25. data/lib/datagrid/drivers/sequel.rb +14 -19
  26. data/lib/datagrid/drivers.rb +2 -1
  27. data/lib/datagrid/engine.rb +11 -3
  28. data/lib/datagrid/filters/base_filter.rb +166 -142
  29. data/lib/datagrid/filters/boolean_filter.rb +19 -5
  30. data/lib/datagrid/filters/date_filter.rb +33 -35
  31. data/lib/datagrid/filters/date_time_filter.rb +24 -16
  32. data/lib/datagrid/filters/default_filter.rb +9 -3
  33. data/lib/datagrid/filters/dynamic_filter.rb +151 -105
  34. data/lib/datagrid/filters/enum_filter.rb +43 -19
  35. data/lib/datagrid/filters/extended_boolean_filter.rb +39 -30
  36. data/lib/datagrid/filters/float_filter.rb +16 -5
  37. data/lib/datagrid/filters/integer_filter.rb +21 -10
  38. data/lib/datagrid/filters/ranged_filter.rb +66 -45
  39. data/lib/datagrid/filters/select_options.rb +58 -49
  40. data/lib/datagrid/filters/string_filter.rb +9 -4
  41. data/lib/datagrid/filters.rb +190 -57
  42. data/lib/datagrid/form_builder.rb +116 -128
  43. data/lib/datagrid/generators/scaffold.rb +185 -0
  44. data/lib/datagrid/generators/views.rb +20 -0
  45. data/lib/datagrid/helper.rb +397 -22
  46. data/lib/datagrid/ordering.rb +26 -29
  47. data/lib/datagrid/rspec.rb +6 -10
  48. data/lib/datagrid/utils.rb +37 -30
  49. data/lib/datagrid/version.rb +3 -1
  50. data/lib/datagrid.rb +18 -28
  51. data/templates/base.rb.erb +6 -4
  52. data/templates/grid.rb.erb +1 -1
  53. metadata +15 -16
  54. data/app/assets/stylesheets/datagrid.sass +0 -134
  55. data/lib/datagrid/filters/composite_filters.rb +0 -49
  56. data/lib/datagrid/renderer.rb +0 -157
  57. data/lib/datagrid/scaffold.rb +0 -129
  58. data/lib/tasks/datagrid_tasks.rake +0 -15
  59. data/templates/controller.rb.erb +0 -6
  60. data/templates/index.html.erb +0 -5
@@ -1,13 +1,208 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "datagrid/utils"
2
4
  require "active_support/core_ext/class/attribute"
3
5
 
4
6
  module Datagrid
5
-
7
+ # Defines a column to be used for displaying data in a Datagrid.
8
+ #
9
+ # class UserGrid < ApplicationGrid
10
+ # scope do
11
+ # User.order("users.created_at desc").joins(:group)
12
+ # end
13
+ #
14
+ # column(:name)
15
+ # column(:group, order: "groups.name") do
16
+ # self.group.name
17
+ # end
18
+ # column(:active, header: "Activated") do |user|
19
+ # !user.disabled
20
+ # end
21
+ # end
22
+ #
23
+ # Each column is used to generate data for the grid.
24
+ #
25
+ # To create a grid displaying all users:
26
+ #
27
+ # grid = UserGrid.new
28
+ # grid.header # => ["Group", "Name", "Disabled"]
29
+ # grid.rows # => [
30
+ # # ["Steve", "Spammers", true],
31
+ # # ["John", "Spoilers", true],
32
+ # # ["Berry", "Good people", false]
33
+ # # ]
34
+ # grid.data # => Header & Rows
35
+ # grid.data_hash # => [
36
+ # # { name: "Steve", group: "Spammers", active: true },
37
+ # # { name: "John", group: "Spoilers", active: true },
38
+ # # { name: "Berry", group: "Good people", active: false },
39
+ # # ]
40
+ # }
41
+ #
42
+ # ## Column Value
43
+ #
44
+ # The value of a column can be defined by passing a block to `Datagrid.column`.
45
+ #
46
+ # ### Basic Column Value
47
+ #
48
+ # If no block is provided, the column value is generated automatically by sending the column name method to the model.
49
+ #
50
+ # column(:name) # => asset.name
51
+ #
52
+ # Using <tt>instance_eval</tt>:
53
+ #
54
+ # column(:completed) { completed? }
55
+ #
56
+ # Using the asset as an argument:
57
+ #
58
+ # column(:completed) { |asset| asset.completed? }
59
+ #
60
+ # ### Advanced Column Value
61
+ #
62
+ # You can also pass the Datagrid object itself to define more complex column values.
63
+ #
64
+ # Using filters with columns:
65
+ #
66
+ # filter(:category) do |value|
67
+ # where("category LIKE '%#{value}%'")
68
+ # end
69
+ #
70
+ # column(:exactly_matches_category) do |asset, grid|
71
+ # asset.category == grid.category
72
+ # end
73
+ #
74
+ # Combining columns:
75
+ #
76
+ # column(:total_sales) do |merchant|
77
+ # merchant.purchases.sum(:subtotal)
78
+ # end
79
+ # column(:number_of_sales) do |merchant|
80
+ # merchant.purchases.count
81
+ # end
82
+ # column(:average_order_value) do |_, _, row|
83
+ # row.total_sales / row.number_of_sales
84
+ # end
85
+ #
86
+ # ## Using Database Expressions
87
+ #
88
+ # Columns can use database expressions to directly manipulate data in the database.
89
+ #
90
+ # column(:count_of_users, 'count(user_id)')
91
+ # column(:uppercase_name, 'upper(name)')
92
+ #
93
+ # ## HTML Columns
94
+ #
95
+ # Columns can have different formats for HTML and non-HTML representations.
96
+ #
97
+ # column(:name) do |asset|
98
+ # format(asset.name) do |value|
99
+ # content_tag(:strong, value)
100
+ # end
101
+ # end
102
+ #
103
+ # ## Column Value Cache
104
+ #
105
+ # Enables grid-level caching for column values.
106
+ #
107
+ # self.cached = true
108
+ #
109
+ # ## Ordering
110
+ #
111
+ # Columns can specify SQL ordering expressions using the `:order` and `:order_desc` options.
112
+ #
113
+ # Basic ordering:
114
+ #
115
+ # column(:group_name, order: "groups.name") { self.group.name }
116
+ #
117
+ # In example above descending order is automatically inherited from ascending order specified.
118
+ # When such default is not enough, specify both options together:
119
+ #
120
+ # column(
121
+ # :priority,
122
+ # # models with null priority are always on bottom
123
+ # # no matter if sorting ascending or descending
124
+ # order: "priority is not null desc, priority",
125
+ # order_desc: "priority is not null desc, priority desc"
126
+ # )
127
+ #
128
+ # Disable order like this:
129
+ #
130
+ # column(:title, order: false)
131
+ #
132
+ # Order by joined table
133
+ # Allows to join specified table only when order is enabled
134
+ # for performance:
135
+ #
136
+ # column(:profile_updated_at, order: proc { |scope|
137
+ # scope.joins(:profile).order("profiles.updated_at")
138
+ # }) do |model|
139
+ # model.profile.updated_at.to_date
140
+ # end
141
+ #
142
+ # Order by a calculated value
143
+ #
144
+ # column(
145
+ # :duration_request,
146
+ # order: "(requests.finished_at - requests.accepted_at)"
147
+ # ) do |model|
148
+ # Time.at(model.finished_at - model.accepted_at).strftime("%H:%M:%S")
149
+ # end
150
+ #
151
+ # ## Default Column Options
152
+ #
153
+ # Default options for all columns in a grid can be set using `default_column_options`.
154
+ #
155
+ # self.default_column_options = { order: false }
156
+ #
157
+ # ## Columns Visibility
158
+ #
159
+ # Columns can be dynamically shown or hidden based on the grid's `column_names` accessor.
160
+ #
161
+ # grid.column_names = [:id, :name]
162
+ #
163
+ # ## Dynamic Columns
164
+ #
165
+ # Columns can be defined dynamically on a grid instance or based on data.
166
+ #
167
+ # Adding a dynamic column:
168
+ #
169
+ # grid.column(:extra_data) do |model|
170
+ # model.extra_data
171
+ # end
172
+ #
173
+ # ## Localization
174
+ #
175
+ # Column headers can be localized using the `:header` option or through i18n files.
176
+ #
177
+ # column(:active, header: Proc.new { I18n.t("activated") })
178
+ #
179
+ # ## Preloading Associations
180
+ #
181
+ # Preload database associations for better performance.
182
+ #
183
+ # Automatic association preloading:
184
+ #
185
+ # column(:group) do |user|
186
+ # user.group.name
187
+ # end
188
+ #
189
+ # Custom preloading:
190
+ #
191
+ # column(:account_name, preload: { |s| s.includes(:account) })
192
+ #
193
+ # ## Decorator
194
+ #
195
+ # A decorator or presenter class can be used around each object in the `scope`.
196
+ #
197
+ # decorate { UserPresenter }
198
+ # column(:created_at) do |presenter|
199
+ # presenter.user.created_at
200
+ # end
6
201
  module Columns
7
202
  require "datagrid/columns/column"
8
203
 
9
- # @!method default_column_options=
10
- # @param value [Hash] default options passed to #column method call
204
+ # @!method default_column_options=(value)
205
+ # @param [Hash] value default options passed to #column method call
11
206
  # @return [Hash] default options passed to #column method call
12
207
  # @example
13
208
  # # Disable default order
@@ -19,8 +214,8 @@ module Datagrid
19
214
  # @return [Hash]
20
215
  # @see #default_column_options=
21
216
 
22
- # @!method batch_size=
23
- # @param value [Integer] Specify a default batch size when generating CSV or just data. Default: 1000
217
+ # @!method batch_size=(value)
218
+ # @param [Integer] value Specify a default batch size when generating CSV or just data. Default: 1000
24
219
  # @return [Integer] Specify a default batch size when generating CSV or just data.
25
220
  # @example
26
221
  # self.batch_size = 500
@@ -33,8 +228,9 @@ module Datagrid
33
228
  # @see #batch_size=
34
229
 
35
230
  # @visibility private
231
+ # @param [Object] base
36
232
  def self.included(base)
37
- base.extend ClassMethods
233
+ base.extend ClassMethods
38
234
  base.class_eval do
39
235
  include Datagrid::Core
40
236
 
@@ -47,7 +243,6 @@ module Datagrid
47
243
  end
48
244
 
49
245
  module ClassMethods
50
-
51
246
  # @param data [Boolean] if true returns only columns with data representation. Default: false.
52
247
  # @param html [Boolean] if true returns only columns with html columns. Default: false.
53
248
  # @param column_names [Array<String>] list of column names if you want to limit data only to specified columns
@@ -62,7 +257,7 @@ module Datagrid
62
257
  #
63
258
  # @param name [Symbol] column name
64
259
  # @param query [String, nil] a string representing the query to select this column (supports only ActiveRecord)
65
- # @param options [Hash<Symbol, Object>] hash of options
260
+ # @param options [Hash{Symbol => Object}] hash of options
66
261
  # @param block [Block] proc to calculate a column value
67
262
  # @return [Datagrid::Columns::Column]
68
263
  #
@@ -71,7 +266,7 @@ module Datagrid
71
266
  # * <tt>html</tt> - determines if current column should be present in html table and how is it formatted
72
267
  # * <tt>order</tt> - determines if this column could be sortable and how.
73
268
  # The value of order is explicitly passed to ORM ordering method.
74
- # Ex: <tt>"created_at, id"</tt> for ActiveRecord, <tt>[:created_at, :id]</tt> for Mongoid
269
+ # Example: <tt>"created_at, id"</tt> for ActiveRecord, <tt>[:created_at, :id]</tt> for Mongoid
75
270
  # * <tt>order_desc</tt> - determines a descending order for given column
76
271
  # (only in case when <tt>:order</tt> can not be easily reversed by ORM)
77
272
  # * <tt>order_by_value</tt> - used in case it is easier to perform ordering at ruby level not on database level.
@@ -85,6 +280,8 @@ module Datagrid
85
280
  # * <tt>if</tt> - the column is shown if the reult of calling this argument is true
86
281
  # * <tt>unless</tt> - the column is shown unless the reult of calling this argument is true
87
282
  # * <tt>preload</tt> - spefies which associations of the scope should be preloaded for this column
283
+ # * `tag_options` - specify HTML attributes to be set for `<td>` or `<th>` of a column
284
+ # Example: `{ class: "content-align-right", "data-group": "statistics" }`
88
285
  #
89
286
  # @see https://github.com/bogdan/datagrid/wiki/Columns
90
287
  def column(name, query = nil, **options, &block)
@@ -115,7 +312,7 @@ module Datagrid
115
312
  # @example
116
313
  # column(:name) do |model|
117
314
  # format(model.name) do |value|
118
- # content_tag(:strong, value)
315
+ # tag.strong(value)
119
316
  # end
120
317
  # end
121
318
  def format(value, &block)
@@ -146,23 +343,25 @@ module Datagrid
146
343
  end
147
344
  return self.decorator = block unless model
148
345
  return model unless decorator
346
+
149
347
  presenter = ::Datagrid::Utils.apply_args(model, &decorator)
150
- presenter = presenter.is_a?(Class) ? presenter.new(model) : presenter
348
+ presenter = presenter.new(model) if presenter.is_a?(Class)
151
349
  block_given? ? yield(presenter) : presenter
152
350
  end
153
351
 
154
352
  # @!visibility private
155
353
  def inherited(child_class)
156
- super(child_class)
157
- child_class.columns_array = self.columns_array.clone
354
+ super
355
+ child_class.columns_array = columns_array.clone
158
356
  end
159
357
 
160
358
  # @!visibility private
161
359
  def filter_columns(columns_array, *names, data: false, html: false)
162
360
  names.compact!
163
- if names.size >= 1 && names.all? {|n| n.is_a?(Datagrid::Columns::Column) && n.grid_class == self.class}
361
+ if names.size >= 1 && names.all? { |n| n.is_a?(Datagrid::Columns::Column) && n.grid_class == self.class }
164
362
  return names
165
363
  end
364
+
166
365
  names.map!(&:to_sym)
167
366
  columns_array.select do |column|
168
367
  (!data || column.data?) &&
@@ -186,21 +385,21 @@ module Datagrid
186
385
  end
187
386
 
188
387
  # @!visibility private
189
- def find_column_by_name(columns,name)
388
+ def find_column_by_name(columns, name)
190
389
  return name if name.is_a?(Datagrid::Columns::Column)
390
+
191
391
  columns.find do |col|
192
392
  col.name.to_sym == name.to_sym
193
393
  end
194
394
  end
195
-
196
395
  end
197
396
 
198
397
  # @!visibility private
199
398
  def assets
200
399
  append_column_preload(
201
400
  driver.append_column_queries(
202
- super, columns.select(&:query)
203
- )
401
+ super, columns.select(&:query),
402
+ ),
204
403
  )
205
404
  end
206
405
 
@@ -223,7 +422,7 @@ module Datagrid
223
422
  # @return [Hash] A mapping where keys are column names and values are column values for the given asset
224
423
  def hash_for(asset)
225
424
  result = {}
226
- self.data_columns.each do |column|
425
+ data_columns.each do |column|
227
426
  result[column.name] = data_value(column, asset)
228
427
  end
229
428
  result
@@ -233,18 +432,17 @@ module Datagrid
233
432
  # @return [Array<Array<Object>>] with data for each row in datagrid assets without header
234
433
  def rows(*column_names)
235
434
  map_with_batches do |asset|
236
- self.row_for(asset, *column_names)
435
+ row_for(asset, *column_names)
237
436
  end
238
437
  end
239
438
 
240
439
  # @param column_names [Array<String>] list of column names if you want to limit data only to specified columns
241
440
  # @return [Array<Array<Object>>] data for each row in datagrid assets with header.
242
441
  def data(*column_names)
243
- self.rows(*column_names).unshift(self.header(*column_names))
442
+ rows(*column_names).unshift(header(*column_names))
244
443
  end
245
444
 
246
- # Return Array of Hashes where keys are column names and values are column values
247
- # for each row in filtered datagrid relation.
445
+ # @return [Array<Hash{Symbol => Object}>] an array of hashes representing the rows in the filtered datagrid relation
248
446
  #
249
447
  # @example
250
448
  # class MyGrid
@@ -274,9 +472,9 @@ module Datagrid
274
472
  def to_csv(*column_names, **options)
275
473
  require "csv"
276
474
  CSV.generate(
277
- headers: self.header(*column_names),
475
+ headers: header(*column_names),
278
476
  write_headers: true,
279
- **options
477
+ **options,
280
478
  ) do |csv|
281
479
  each_with_batches do |asset|
282
480
  csv << row_for(asset, *column_names)
@@ -284,8 +482,9 @@ module Datagrid
284
482
  end
285
483
  end
286
484
 
287
-
288
485
  # @param column_names [Array<Symbol, String>]
486
+ # @param [Boolean] data return only data columns
487
+ # @param [Boolean] html return only HTML columns
289
488
  # @return [Array<Datagrid::Columns::Column>] all columns selected in grid instance
290
489
  # @example
291
490
  # MyGrid.new.columns # => all defined columns
@@ -294,22 +493,25 @@ module Datagrid
294
493
  # grid.columns(:id, :category) # => id and category column
295
494
  def columns(*column_names, data: false, html: false)
296
495
  self.class.filter_columns(
297
- columns_array, *column_names, data: data, html: html
496
+ columns_array, *column_names, data: data, html: html,
298
497
  ).select do |column|
299
498
  column.enabled?(self)
300
499
  end
301
500
  end
302
501
 
303
- # @param column_names [Array<String, Symbol>] list of column names if you want to limit data only to specified columns
304
- # @return columns that can be represented in plain data(non-html) way
305
- def data_columns(*column_names, **options)
306
- self.columns(*column_names, **options, data: true)
502
+ # @param column_names [Array<String, Symbol>] list of column names
503
+ # if you want to limit data only to specified columns
504
+ # @param [Boolean] html return only HTML columns
505
+ # @return [Array<Datagrid::Columns::Column>] columns that can be represented in plain data(non-html) way
506
+ def data_columns(*column_names, html: false)
507
+ columns(*column_names, html: html, data: true)
307
508
  end
308
509
 
309
510
  # @param column_names [Array<String>] list of column names if you want to limit data only to specified columns
511
+ # @param [Boolean] data return only data columns
310
512
  # @return all columns that can be represented in HTML table
311
- def html_columns(*column_names, **options)
312
- self.columns(*column_names, **options, html: true)
513
+ def html_columns(*column_names, data: false)
514
+ columns(*column_names, data: data, html: true)
313
515
  end
314
516
 
315
517
  # Finds a column definition by name
@@ -324,7 +526,7 @@ module Datagrid
324
526
  # @example
325
527
  # column(:name) do |model|
326
528
  # format(model.name) do |value|
327
- # content_tag(:strong, value)
529
+ # tag.strong(value)
328
530
  # end
329
531
  # end
330
532
  #
@@ -374,7 +576,8 @@ module Datagrid
374
576
  super
375
577
  end
376
578
 
377
- # @return [Array<Datagrid::Columns::Column>] all columns that are possible to be displayed for the current grid object
579
+ # @return [Array<Datagrid::Columns::Column>] all columns
580
+ # that are possible to be displayed for the current grid object
378
581
  #
379
582
  # @example
380
583
  # class MyGrid
@@ -402,6 +605,7 @@ module Datagrid
402
605
  column = column_by_name(column_name)
403
606
  cache(column, asset, :data_value) do
404
607
  raise "no data value for #{column.name} column" unless column.data?
608
+
405
609
  result = generic_value(column, asset)
406
610
  result.is_a?(Datagrid::Columns::Column::ResponseFormat) ? result.call_data : result
407
611
  end
@@ -409,7 +613,7 @@ module Datagrid
409
613
 
410
614
  # @return [Object] a cell HTML value for given column name and asset and view context
411
615
  def html_value(column_name, context, asset)
412
- column = column_by_name(column_name)
616
+ column = column_by_name(column_name)
413
617
  cache(column, asset, :html_value) do
414
618
  if column.html? && column.html_block
415
619
  value_from_html_block(context, asset, column)
@@ -462,9 +666,8 @@ module Datagrid
462
666
  return yield
463
667
  end
464
668
  key = cache_key(asset)
465
- unless key
466
- raise(Datagrid::CacheKeyError, "Datagrid Cache key is #{key.inspect} for #{asset.inspect}.")
467
- end
669
+ raise(Datagrid::CacheKeyError, "Datagrid Cache key is #{key.inspect} for #{asset.inspect}.") unless key
670
+
468
671
  @cache[column.name] ||= {}
469
672
  @cache[column.name][key] ||= {}
470
673
  @cache[column.name][key][type] ||= yield
@@ -477,10 +680,12 @@ module Datagrid
477
680
  driver.default_cache_key(asset)
478
681
  end
479
682
  rescue NotImplementedError
480
- raise Datagrid::ConfigurationError, "#{self} is setup to use cache. But there was appropriate cache key found for #{asset.inspect}. Please set cached option to block with asset as argument and cache key as returning value to resolve the issue."
683
+ raise Datagrid::ConfigurationError,
684
+ <<~MSG
685
+ #{self} is setup to use cache. But there was appropriate cache key found for #{asset.inspect}.
686
+ MSG
481
687
  end
482
688
 
483
-
484
689
  def map_with_batches(&block)
485
690
  result = []
486
691
  each_with_batches do |asset|
@@ -490,7 +695,7 @@ module Datagrid
490
695
  end
491
696
 
492
697
  def each_with_batches(&block)
493
- if batch_size && batch_size > 0
698
+ if batch_size&.positive?
494
699
  driver.batch_each(assets, batch_size, &block)
495
700
  else
496
701
  assets.each(&block)
@@ -500,7 +705,7 @@ module Datagrid
500
705
  def value_from_html_block(context, asset, column)
501
706
  args = []
502
707
  remaining_arity = column.html_block.arity
503
- remaining_arity = 1 if remaining_arity < 0
708
+ remaining_arity = 1 if remaining_arity.negative?
504
709
 
505
710
  asset = decorate(asset)
506
711
 
@@ -509,7 +714,7 @@ module Datagrid
509
714
  remaining_arity -= 1
510
715
  end
511
716
 
512
- args << asset if remaining_arity > 0
717
+ args << asset if remaining_arity.positive?
513
718
  args << self if remaining_arity > 1
514
719
 
515
720
  context.instance_exec(*args, &column.html_block)
@@ -523,9 +728,13 @@ module Datagrid
523
728
  @model = model
524
729
  end
525
730
 
526
- def method_missing(meth, *args, &blk)
731
+ def method_missing(meth, *_args)
527
732
  @grid.data_value(meth, @model)
528
733
  end
734
+
735
+ def respond_to_missing?(meth, include_private = false)
736
+ !!@grid.column_by_name(meth) || super
737
+ end
529
738
  end
530
739
  end
531
740
  end
@@ -1,14 +1,27 @@
1
- module Datagrid
2
-
3
- def self.configuration
4
- @configuration ||= Configuration.new
5
- end
1
+ # frozen_string_literal: true
6
2
 
7
- def self.configure
8
- yield(configuration)
9
- end
10
-
11
- # Datagrid configuration object
3
+ module Datagrid
4
+ # ## Configuration
5
+ #
6
+ # Datagrid provides several configuration options.
7
+ #
8
+ # Here is the API reference and a description of the available options:
9
+ #
10
+ # ``` ruby
11
+ # Datagrid.configure do |config|
12
+ # # Defines date formats that can be used to parse dates.
13
+ # # Note: Multiple formats can be specified. The first format is used to format dates as strings,
14
+ # # while other formats are used only for parsing dates from strings (e.g., if your app supports multiple formats).
15
+ # config.date_formats = ["%m/%d/%Y", "%Y-%m-%d"]
16
+ #
17
+ # # Defines timestamp formats that can be used to parse timestamps.
18
+ # # Note: Multiple formats can be specified. The first format is used to format timestamps as strings,
19
+ # # while other formats are used only for parsing timestamps from strings (e.g., if your app supports multiple formats).
20
+ # config.datetime_formats = ["%m/%d/%Y %h:%M", "%Y-%m-%d %h:%M:%s"]
21
+ # end
22
+ # ```
23
+ #
24
+ # These options can be set globally in your application to customize Datagrid’s behavior.
12
25
  class Configuration
13
26
  # @return [Array<String>] Date parsing formats
14
27
  attr_accessor :date_formats