datagrid 1.8.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -0
  3. data/CHANGELOG.md +11 -1
  4. data/{Readme.markdown → README.md} +44 -29
  5. data/app/assets/stylesheets/datagrid.css +145 -0
  6. data/app/views/datagrid/_enum_checkboxes.html.erb +5 -3
  7. data/app/views/datagrid/_form.html.erb +4 -4
  8. data/app/views/datagrid/_head.html.erb +26 -3
  9. data/app/views/datagrid/_range_filter.html.erb +5 -3
  10. data/app/views/datagrid/_row.html.erb +12 -1
  11. data/app/views/datagrid/_table.html.erb +4 -4
  12. data/datagrid.gemspec +8 -7
  13. data/lib/datagrid/active_model.rb +9 -17
  14. data/lib/datagrid/base.rb +39 -0
  15. data/lib/datagrid/column_names_attribute.rb +9 -11
  16. data/lib/datagrid/columns/column.rb +155 -133
  17. data/lib/datagrid/columns.rb +325 -115
  18. data/lib/datagrid/configuration.rb +33 -4
  19. data/lib/datagrid/core.rb +89 -54
  20. data/lib/datagrid/deprecated_object.rb +20 -0
  21. data/lib/datagrid/drivers/abstract_driver.rb +12 -23
  22. data/lib/datagrid/drivers/active_record.rb +24 -26
  23. data/lib/datagrid/drivers/array.rb +22 -14
  24. data/lib/datagrid/drivers/mongo_mapper.rb +15 -14
  25. data/lib/datagrid/drivers/mongoid.rb +15 -17
  26. data/lib/datagrid/drivers/sequel.rb +14 -19
  27. data/lib/datagrid/drivers.rb +2 -1
  28. data/lib/datagrid/engine.rb +11 -3
  29. data/lib/datagrid/filters/base_filter.rb +166 -143
  30. data/lib/datagrid/filters/boolean_filter.rb +19 -5
  31. data/lib/datagrid/filters/date_filter.rb +33 -35
  32. data/lib/datagrid/filters/date_time_filter.rb +24 -16
  33. data/lib/datagrid/filters/default_filter.rb +9 -3
  34. data/lib/datagrid/filters/dynamic_filter.rb +151 -105
  35. data/lib/datagrid/filters/enum_filter.rb +43 -19
  36. data/lib/datagrid/filters/extended_boolean_filter.rb +39 -31
  37. data/lib/datagrid/filters/float_filter.rb +15 -5
  38. data/lib/datagrid/filters/integer_filter.rb +21 -10
  39. data/lib/datagrid/filters/ranged_filter.rb +66 -45
  40. data/lib/datagrid/filters/select_options.rb +58 -49
  41. data/lib/datagrid/filters/string_filter.rb +9 -4
  42. data/lib/datagrid/filters.rb +204 -79
  43. data/lib/datagrid/form_builder.rb +116 -128
  44. data/lib/datagrid/generators/scaffold.rb +184 -0
  45. data/lib/datagrid/generators/views.rb +20 -0
  46. data/lib/datagrid/helper.rb +436 -69
  47. data/lib/datagrid/ordering.rb +26 -29
  48. data/lib/datagrid/rspec.rb +6 -10
  49. data/lib/datagrid/utils.rb +37 -30
  50. data/lib/datagrid/version.rb +3 -1
  51. data/lib/datagrid.rb +8 -28
  52. data/templates/base.rb.erb +6 -4
  53. data/templates/grid.rb.erb +1 -1
  54. metadata +17 -17
  55. data/app/assets/stylesheets/datagrid.sass +0 -134
  56. data/lib/datagrid/filters/composite_filters.rb +0 -49
  57. data/lib/datagrid/renderer.rb +0 -157
  58. data/lib/datagrid/scaffold.rb +0 -129
  59. data/lib/tasks/datagrid_tasks.rake +0 -15
  60. data/templates/controller.rb.erb +0 -6
  61. data/templates/index.html.erb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df8447e3bdc797a74cbbc4d7aac869bac6c0bcd57500d58bf14c1f3af5db7df9
4
- data.tar.gz: aa0c1a716ad3a7054db53f7605222d1386b73a8378c0eaf3087fd60477361bd3
3
+ metadata.gz: d4f9903c41d2efb4c914ddf949db685228644e1ba071e8e2337491e0b91e0bbd
4
+ data.tar.gz: 937aea06689389c091b3be16aabaa36d8c828b8a8e97f220eaad403975371c6e
5
5
  SHA512:
6
- metadata.gz: 9bffeed51b8a4d994136931096f5c7438243ad73c2c46540c7f20a2a542e25c6644b970ddc1e2fc10673de94b1d1f6a0d1892caf7cdc4fec38bde67324767508
7
- data.tar.gz: d3ccf6646f9b8c21f0b8c2a81853294c9e8069c5a17644617c57d1de675be8bb380237aafb9f5b12e21ac49c909376bbf53d0d4e30e50a96387c070c8919fc59
6
+ metadata.gz: b3a5ef4923f03bd41bc54c2cc8ad6261f4a1e3302c4aad83a58868d539d69527a6cf838ee6efdf621fa0a47dabd023fa041773dde723f35f0feaf59e0b5effe6
7
+ data.tar.gz: 0a4c6aca85619ab3a71c125717d6f6f5209eafcb7a509df76afaac91e70790f199fea2ac796ebb9c05d088c8f4d40b42c16d6a49a28661ae1da7703c86c1ff92
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ --markup=markdown
2
+ --readme=README.md
data/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Changelog
2
2
 
3
- ## master
3
+ ## 2.0.0
4
+
5
+ Version 2 is a major update implementing a lot of major improvements
6
+ at the cost of backward compatibility.
7
+
8
+ [Changes and migration guide](./version-2)
9
+
10
+ ## 1.8.3
11
+
12
+ * Fix rails hooking for version 7.1. [#327](https://github.com/bogdan/datagrid/issues/327)
13
+ * Fix formatting of value for `date` and `datetime-local` input types
4
14
 
5
15
  ## 1.8.2
6
16
 
@@ -1,10 +1,13 @@
1
1
  # Datagrid
2
2
 
3
- [![Build Status](https://github.com/bogdan/datagrid/workflows/CI/badge.svg?branch=master)](https://github.com/bogdan/datagrid/actions)
3
+ Datagrid Version 2.0.0 is here.
4
4
 
5
- [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fbogdan%2Fdatagrid.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fbogdan%2Fdatagrid?ref=badge_shield)
5
+ [Migration Guide](./version-2).
6
6
 
7
- A really mighty and flexible ruby library that generates reports including admin panels, analytics and data representation:
7
+ [![Build Status](https://github.com/bogdan/datagrid/actions/workflows/ci.yml/badge.svg)](https://github.com/bogdan/datagrid/actions/workflows/ci.yml)
8
+
9
+ A really mighty and flexible ruby library that generates reports
10
+ including admin panels, analytics and data browsers:
8
11
 
9
12
  * Filtering
10
13
  * Columns
@@ -12,37 +15,42 @@ A really mighty and flexible ruby library that generates reports including admin
12
15
  * Localization
13
16
  * Export to CSV
14
17
 
15
- ### ORM Support
18
+ ## ORM Support
16
19
 
17
20
  * ActiveRecord
18
21
  * Mongoid
19
22
  * MongoMapper
20
23
  * Sequel
21
- * Array (slow but possible)
24
+ * Array (in-memory data of smaller scale)
25
+
26
+ ## Datagrid Philosophy
22
27
 
23
- [Create an issue](https://github.com/bogdan/datagrid/issues/new) if you want more.
28
+ 1. Expressive DSL complements OOD instead of replacing it.
29
+ 1. Extensible in every way while providing a lot of defaults.
30
+ 1. If your ORM supports that, datagrid also supports that!
24
31
 
25
- ### Documentation
32
+ ## Documentation
26
33
 
27
- * [Readme](/Readme.markdown) - this read-me for basic information
28
- * [Wiki](https://github.com/bogdan/datagrid/wiki) - general reference on how to use the gem
29
- * [Rdoc](https://rubydoc.info/gems/datagrid) - API reference
34
+ * [Rdoc](https://rubydoc.info/gems/datagrid) - full API reference
35
+ * [Scope](https://rubydoc.info/gems/datagrid/Datagrid/Core) - working with datagrid scope
36
+ * [Columns](https://rubydoc.info/gems/datagrid/Datagrid/Columns) - definging datagrid columns
37
+ * [Filters](https://rubydoc.info/gems/datagrid/Datagrid/Filters) - defining datagrid filters
38
+ * [Frontend](https://rubydoc.info/gems/datagrid/Datagrid/Helper) - building a frontend
39
+ * [Configuration](https://rubydoc.info/gems/datagrid/Datagrid/Configuration) - configuring the gem
30
40
 
31
41
  ### Live Demo
32
42
 
33
43
  [Datagrid DEMO application](http://datagrid.herokuapp.com) is available live!
34
44
  [Demo source code](https://github.com/bogdan/datagrid-demo).
35
45
 
36
- <img src="http://datagrid.herokuapp.com/datagrid_demo_screenshot.png" style="margin: 7px; border: 1px solid black">
46
+ <!-- <img src="http://datagrid.herokuapp.com/datagrid_demo_screenshot.png" style="margin: 7px; border: 1px solid black"> -->
37
47
 
38
48
  ### Example
39
49
 
40
50
  In order to create a grid:
41
51
 
42
52
  ``` ruby
43
- class UsersGrid
44
-
45
- include Datagrid
53
+ class UsersGrid < Datagrid::Base
46
54
 
47
55
  scope do
48
56
  User.includes(:group)
@@ -71,7 +79,7 @@ Basic grid api:
71
79
 
72
80
  ``` ruby
73
81
  report = UsersGrid.new(
74
- group_id: [1,2],
82
+ group_id: [1,2],
75
83
  logins_count: [1, nil],
76
84
  category: "first",
77
85
  order: :group,
@@ -79,7 +87,10 @@ report = UsersGrid.new(
79
87
  )
80
88
 
81
89
  report.assets # => Array of User instances:
82
- # SELECT * FROM users WHERE users.group_id in (1,2) AND users.logins_count >= 1 AND users.category = 'first' ORDER BY groups.name DESC
90
+ # SELECT * FROM users WHERE users.group_id in (1,2) AND
91
+ # users.logins_count >= 1 AND
92
+ # users.category = 'first'
93
+ # ORDER BY groups.name DESC
83
94
 
84
95
  report.header # => ["Name", "Group", "Activated"]
85
96
  report.rows # => [
@@ -103,7 +114,8 @@ In order to create a report, you need to define:
103
114
  ### Scope
104
115
 
105
116
  Default scope of objects to filter and display.
106
- In common case it is `ActiveRecord::Base` (or any other supported ORM) subclass with some generic scopes like:
117
+ In common case it is `ActiveRecord::Base` (or any other supported ORM)
118
+ subclass with some generic scopes like:
107
119
 
108
120
  ``` ruby
109
121
  scope do
@@ -111,7 +123,7 @@ scope do
111
123
  end
112
124
  ```
113
125
 
114
- [More about scope](https://github.com/bogdan/datagrid/wiki/Scope)
126
+ [More about scope](https://rubydoc.info/gems/datagrid/Datagrid/Core)
115
127
 
116
128
  ### Filters
117
129
 
@@ -133,9 +145,9 @@ Datagrid supports different type of filters including:
133
145
  * xboolean - the select of "yes", "no" and any
134
146
  * enum - selection of the given values
135
147
  * string
136
- * dynamic - build dynamic SQL condition
148
+ * dynamic - build dynamic SQL condition
137
149
 
138
- [More about filters](https://github.com/bogdan/datagrid/wiki/Filters)
150
+ [More about filters](https://rubydoc.info/gems/datagrid/Datagrid/Filters)
139
151
 
140
152
  ### Columns
141
153
 
@@ -150,11 +162,11 @@ end
150
162
  Some formatting options are also available.
151
163
  Each column is sortable.
152
164
 
153
- [More about columns](https://github.com/bogdan/datagrid/wiki/Columns)
165
+ [More about columns](https://rubydoc.info/gems/datagrid/Datagrid/Columns)
154
166
 
155
167
  ### Front end
156
168
 
157
- ### Using Generator
169
+ #### Using Generator
158
170
 
159
171
  Datagrid has a builtin generator:
160
172
 
@@ -172,27 +184,29 @@ route resources :skills
172
184
  insert app/assets/stylesheet/application.css
173
185
  ```
174
186
 
175
- ### Customize Built-in partials
187
+ #### Customize Built-in views
176
188
 
177
- In order to get a control on datagrid built-in partials run:
189
+ In order to get a control on datagrid built-in views run:
178
190
 
179
191
  ``` sh
180
- rake datagrid:copy_partials
192
+ rails g datagrid::views
181
193
  ```
182
194
 
183
- ### Advanced frontend
195
+ #### Advanced frontend
184
196
 
185
197
  All advanced frontend things are described in:
186
198
 
187
- [Frontend section on wiki](https://github.com/bogdan/datagrid/wiki/Frontend)
199
+ [Frontend section on wiki](https://rubydoc.info/gems/datagrid/Datagrid/Helper)
188
200
 
189
201
  ## Questions & Issues
190
202
 
191
- If you have a question of any kind, just make an issue and describe your problem in details.
203
+ If you have a question of any kind, just make an issue and
204
+ describe your problem in details.
192
205
 
193
206
  ## Contribution
194
207
 
195
- If you are interested in contributing to this project, please follow the [instructions here](CONTRIBUTING.md).
208
+ If you are interested in contributing to this project,
209
+ please follow the [instructions here](CONTRIBUTING.md).
196
210
 
197
211
  ## Self-Promotion
198
212
 
@@ -203,4 +217,5 @@ Follow the repository on [GitHub](https://github.com/bogdan/datagrid).
203
217
  Read [author blog](http://gusiev.com).
204
218
 
205
219
  ## License
220
+
206
221
  [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fbogdan%2Fdatagrid.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fbogdan%2Fdatagrid?ref=badge_large)
@@ -0,0 +1,145 @@
1
+ /* Table */
2
+
3
+ table.datagrid-table {
4
+ background-color: transparent;
5
+ border-collapse: collapse;
6
+ max-width: 100%;
7
+ }
8
+
9
+ table.datagrid-table th {
10
+ background-color: #eee;
11
+ text-align: left;
12
+ vertical-align: top;
13
+ }
14
+
15
+ table.datagrid-table td,
16
+ table.datagrid-table th {
17
+ border: 1px solid #d6d6d6;
18
+ padding: 5px 10px;
19
+ }
20
+
21
+ .datagrid-order-control-asc,
22
+ .datagrid-order-control-desc {
23
+ text-decoration: none;
24
+ font-weight: normal;
25
+ }
26
+
27
+ .datagrid-order-active-asc,
28
+ .datagrid-order-active-desc {
29
+ background-color: #fff7d5;
30
+ }
31
+
32
+ .datagrid-order-active-asc a.datagrid-order-control-asc,
33
+ .datagrid-order-active-desc a.datagrid-order-control-desc {
34
+ font-weight: bold;
35
+ color: #d00;
36
+ }
37
+
38
+ .datagrid-no-results {
39
+ text-align: center;
40
+ }
41
+
42
+ /* Form */
43
+
44
+ .datagrid-form {
45
+ background-color: #f0f0f0;
46
+ border-radius: 5px;
47
+ padding: 20px;
48
+ }
49
+
50
+ .datagrid-filter {
51
+ margin: 10px;
52
+ }
53
+
54
+ .datagrid-filter label {
55
+ width: 150px;
56
+ display: inline-block;
57
+ }
58
+
59
+ .datagrid-filter input, .datagrid-filter select {
60
+ border: 2px solid #ccc;
61
+ border-radius: 4px;
62
+ display: inline-block;
63
+ padding: 5px 12px;
64
+ width: 300px;
65
+ }
66
+
67
+ input.datagrid-range-from, input.datagrid-range-to {
68
+ width: 138px;
69
+ }
70
+
71
+ .datagrid-filter select[multiple] {
72
+ border: 2px solid #ccc;
73
+ border-radius: 5px;
74
+ height: 100px;
75
+ }
76
+
77
+ select.datagrid-dynamic-field {
78
+ width: 228px
79
+ }
80
+
81
+ select.datagrid-dynamic-operation {
82
+ margin-left: 7px;
83
+ width: 60px;
84
+ }
85
+
86
+ .datagrid-dynamic-value {
87
+ margin: 10px 0 0 154px;
88
+ }
89
+
90
+ .datagrid-range-separator {
91
+ display: inline-block;
92
+ margin: 6px 4px 0;
93
+ }
94
+
95
+ .datagrid-enum-checkboxes {
96
+ display: inline-block;
97
+ }
98
+
99
+ .datagrid-enum-checkboxes input {
100
+ margin: 7px;
101
+ width: auto;
102
+ }
103
+
104
+ .datagrid-enum-checkboxes label {
105
+ display: block;
106
+ width: 100%;
107
+ }
108
+
109
+ .datagrid-actions {
110
+ padding-left: calc(150px + 10px);
111
+ }
112
+
113
+ .datagrid-submit {
114
+ background-color: #555;
115
+ border: none;
116
+ border-radius: 5px;
117
+ color: white;
118
+ cursor: pointer;
119
+ font-size: 14px;
120
+ font-weight: bold;
121
+ line-height: normal;
122
+ padding: 7px 15px;
123
+ vertical-align: middle;
124
+ display: inline-block;
125
+ zoom: 1;
126
+ *display: inline;
127
+ }
128
+
129
+ .datagrid-submit:hover,
130
+ .datagrid-submit:focus {
131
+ background-color: #333;
132
+ }
133
+
134
+ .datagrid-submit:active {
135
+ background-color: #000;
136
+ }
137
+
138
+ .datagrid-reset {
139
+ font-size: 14px;
140
+ padding: 7px 15px;
141
+ vertical-align: middle;
142
+ display: inline-block;
143
+ zoom: 1;
144
+ *display: inline;
145
+ }
@@ -2,10 +2,12 @@
2
2
  Indent in this file may cause extra space to appear.
3
3
  You can add indent if whitespace doesn't matter for you
4
4
  %>
5
- <%- elements.each do |value, text, checked| -%>
5
+ <div class="datagrid-enum-checkboxes">
6
+ <%- choices.each do |value, text| -%>
6
7
  <%- id = [form.object_name, filter.name, value].join('_').underscore -%>
7
- <%= form.label filter.name, options.merge(for: id) do -%>
8
- <%= form.check_box(filter.name, {multiple: true, id: id, checked: checked, include_hidden: false}, value.to_s, nil) -%>
8
+ <%= form.datagrid_label(filter.name, for: id, **options) do -%>
9
+ <%= form.datagrid_filter_input(filter.name, id: id, value: value) -%>
9
10
  <%= text -%>
10
11
  <%- end -%>
11
12
  <%- end -%>
13
+ </div>
@@ -1,12 +1,12 @@
1
- <%= form_for grid, options do |f| -%>
1
+ <%= form_with model: grid, html: {class: 'datagrid-form'}, scope: grid.param_name, method: :get, **options do |f| %>
2
2
  <% grid.filters.each do |filter| %>
3
- <div class="datagrid-filter filter">
3
+ <div class="datagrid-filter" data-filter="<%= filter.name %>" data-type="<%= filter.type %>">
4
4
  <%= f.datagrid_label filter %>
5
5
  <%= f.datagrid_filter filter %>
6
6
  </div>
7
7
  <% end %>
8
8
  <div class="datagrid-actions">
9
- <%= f.submit I18n.t("datagrid.form.search").html_safe, class: "datagrid-submit" %>
10
- <%= link_to I18n.t('datagrid.form.reset').html_safe, url_for(grid.to_param => {}), class: "datagrid-reset" %>
9
+ <%= f.submit I18n.t("datagrid.form.search"), class: "datagrid-submit" %>
10
+ <%= link_to I18n.t('datagrid.form.reset'), url_for(grid.to_param => {}), class: "datagrid-reset" %>
11
11
  </div>
12
12
  <% end -%>
@@ -1,8 +1,31 @@
1
1
  <tr>
2
2
  <% grid.html_columns(*options[:columns]).each do |column| %>
3
- <th class="<%= datagrid_column_classes(grid, column) %>">
3
+ <%= tag.th(
4
+ # Consider maintaining consistency with datagrid/rows partial
5
+ "data-column": column.name,
6
+ **column.tag_options,
7
+ class: [
8
+ column.tag_options[:class],
9
+ # Adding HTML classes based on condition
10
+ "datagrid-order-active-asc": grid.ordered_by?(column, false),
11
+ "datagrid-order-active-desc": grid.ordered_by?(column, true),
12
+ ]
13
+ ) do %>
4
14
  <%= column.header %>
5
- <%= datagrid_order_for(grid, column, options) if column.supports_order? && options[:order]%>
6
- </th>
15
+ <% if column.supports_order? && options[:order] -%>
16
+ <div class="datagrid-order">
17
+ <%= link_to(
18
+ I18n.t("datagrid.table.order.asc"),
19
+ datagrid_order_path(grid, column, false),
20
+ class: "datagrid-order-control-asc"
21
+ ) %>
22
+ <%= link_to(
23
+ I18n.t("datagrid.table.order.desc"),
24
+ datagrid_order_path(grid, column, true),
25
+ class: "datagrid-order-control-desc"
26
+ ) %>
27
+ </div>
28
+ <% end -%>
29
+ <% end -%>
7
30
  <% end %>
8
31
  </tr>
@@ -1,3 +1,5 @@
1
- <%= form.datagrid_filter_input(filter, **from_options) %>
2
- <span class="separator <%= filter.type %>"><%= I18n.t('datagrid.filters.range.separator') %></span>
3
- <%= form.datagrid_filter_input(filter, **to_options) %>
1
+ <%= form.datagrid_filter_input(filter, class: 'datagrid-range-from', **from_options) %>
2
+ <span class="datagrid-range-separator"><%= I18n.t('datagrid.filters.range.separator') %></span>
3
+ <%# Generating id only for "from" input to make sure -%>
4
+ <%# there is no duplicate id in DOM and click on label focuses the first input -%>
5
+ <%= form.datagrid_filter_input(filter, class: 'datagrid-range-to', **to_options, id: nil) %>
@@ -1,5 +1,16 @@
1
1
  <tr>
2
2
  <% grid.html_columns(*options[:columns]).each do |column| %>
3
- <td class="<%= datagrid_column_classes(grid, column) %>"><%= datagrid_value(grid, column, asset) %></td>
3
+ <%= tag.td(
4
+ datagrid_value(grid, column, asset),
5
+ # Consider maintaining consistency with datagrid/rows partial
6
+ "data-column": column.name,
7
+ **column.tag_options,
8
+ class: [
9
+ column.tag_options[:class],
10
+ # Adding HTML classes based on condition
11
+ "datagrid-order-active-asc": grid.ordered_by?(column, false),
12
+ "datagrid-order-active-desc": grid.ordered_by?(column, true),
13
+ ]
14
+ ) %>
4
15
  <% end %>
5
16
  </tr>
@@ -5,18 +5,18 @@ Local variables:
5
5
  * options - passed options Hash
6
6
  %>
7
7
  <% if grid.html_columns(*options[:columns]).any? %>
8
- <%= content_tag :table, options[:html] do %>
8
+ <%= tag.table class: 'datagrid-table', **options.fetch(:html, {}) do %>
9
9
  <thead>
10
- <%= datagrid_header(grid, options) %>
10
+ <%= datagrid_header(grid, **options) %>
11
11
  </thead>
12
12
  <tbody>
13
13
  <% if assets.any? %>
14
14
  <%= datagrid_rows(grid, assets, **options) %>
15
15
  <% else %>
16
- <tr><td class="noresults" colspan="100%"><%= I18n.t('datagrid.no_results').html_safe %></td></tr>
16
+ <tr><td class="datagrid-no-results" colspan="100%"><%= I18n.t('datagrid.no_results') %></td></tr>
17
17
  <% end %>
18
18
  </tbody>
19
19
  <% end %>
20
20
  <% else -%>
21
- <%= I18n.t("datagrid.table.no_columns").html_safe %>
21
+ <%= I18n.t("datagrid.table.no_columns") %>
22
22
  <% end %>
data/datagrid.gemspec CHANGED
@@ -12,26 +12,27 @@ Gem::Specification.new do |s|
12
12
  s.email = "agresso@gmail.com"
13
13
  s.extra_rdoc_files = [
14
14
  "LICENSE.txt",
15
- "Readme.markdown"
15
+ "README.md",
16
16
  ]
17
17
  s.files = [
18
18
  "LICENSE.txt",
19
19
  "CHANGELOG.md",
20
- "Readme.markdown",
20
+ "README.md",
21
21
  "datagrid.gemspec",
22
+ ".yardopts",
22
23
  ]
23
24
  s.files += `git ls-files | grep -E '^(app|lib|templates)'`.split("\n")
24
25
  s.homepage = "https://github.com/bogdan/datagrid"
25
26
  s.licenses = ["MIT"]
26
- s.required_ruby_version = Gem::Requirement.new(">= 2.7")
27
+ s.required_ruby_version = Gem::Requirement.new(">= 3.0")
27
28
  s.metadata = {
28
29
  "homepage_uri" => s.homepage,
29
30
  "bug_tracker_uri" => "#{s.homepage}/issues",
30
- "documentation_uri" => "#{s.homepage}/wiki",
31
- "changelog_uri" => "#{s.homepage}/blob/master/CHANGELOG.md",
31
+ "documentation_uri" => "https://rubydoc.info/gems/datagrid",
32
+ "changelog_uri" => "#{s.homepage}/blob/main/CHANGELOG.md",
32
33
  "source_code_uri" => s.homepage,
34
+ "rubygems_mfa_required" => "true",
33
35
  }
34
36
 
35
- s.add_dependency "railties", ">= 6.1"
37
+ s.add_dependency "railties", ">= 7.0"
36
38
  end
37
-
@@ -1,27 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datagrid
2
4
  # Required to be ActiveModel compatible
3
5
  module ActiveModel
4
- # @!visibility private
5
- def self.included(base)
6
- base.extend ClassMethods
7
- base.class_eval do
8
- begin
9
- require 'active_model/naming'
10
- extend ::ActiveModel::Naming
11
- rescue LoadError
12
- end
13
- begin
14
- require 'active_model/attributes_assignment'
15
- extend ::ActiveModel::AttributesAssignment
16
- rescue LoadError
17
- end
18
- end
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ require "active_model/naming"
10
+ extend ::ActiveModel::Naming
19
11
  end
20
12
 
21
13
  module ClassMethods
22
14
  # @return [String] URL query parameter name of the grid class
23
15
  def param_name
24
- self.to_s.underscore.tr('/', '_')
16
+ to_s.underscore.tr("/", "_")
25
17
  end
26
18
  end
27
19
 
@@ -48,7 +40,7 @@ module Datagrid
48
40
  end
49
41
 
50
42
  def to_param
51
- self.param_name
43
+ param_name
52
44
  end
53
45
  end
54
46
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datagrid
4
+ extend ActiveSupport::Autoload
5
+
6
+ autoload :Core
7
+ autoload :ActiveModel
8
+ autoload :Filters
9
+ autoload :Columns
10
+ autoload :ColumnNamesAttribute
11
+ autoload :Ordering
12
+ autoload :Configuration
13
+
14
+ autoload :Helper
15
+ autoload :FormBuilder
16
+
17
+ autoload :Engine
18
+
19
+ # Main datagrid class allowing to define columns and filters on your objects
20
+ #
21
+ # @example
22
+ # class UsersGrid < Datagrid::Base
23
+ # scope { User }
24
+ #
25
+ # filter(:id, :integer)
26
+ # filter(:name, :string)
27
+ #
28
+ # column(:id)
29
+ # column(:name)
30
+ # end
31
+ class Base
32
+ include ::Datagrid::Core
33
+ include ::Datagrid::ActiveModel
34
+ include ::Datagrid::Filters
35
+ include ::Datagrid::Columns
36
+ include ::Datagrid::ColumnNamesAttribute
37
+ include ::Datagrid::Ordering
38
+ end
39
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datagrid
2
4
  module ColumnNamesAttribute
3
5
  extend ActiveSupport::Concern
@@ -21,6 +23,7 @@ module Datagrid
21
23
  # will always present in the grid table and won't be listed
22
24
  # in column names selection
23
25
  # Accepts same options as <tt>:enum</tt> filter
26
+ # @return [Datagrid::Filters::BaseFilter] Defined filter object
24
27
  # @example
25
28
  # column_names_filter(header: "Choose columns")
26
29
  # @see Datagrid::Filters::ClassMethods#filter
@@ -44,7 +47,7 @@ module Datagrid
44
47
  # If no mandatory columns specified than all of them considered mandatory
45
48
  # @return [Array<Datagrid::Columns::Column>]
46
49
  def mandatory_columns
47
- available_columns.select {|c| c.mandatory? }
50
+ available_columns.select(&:mandatory?)
48
51
  end
49
52
 
50
53
  # Returns a list of enabled columns without <tt>mandatory: true</tt> option
@@ -57,7 +60,7 @@ module Datagrid
57
60
  protected
58
61
 
59
62
  def optional_columns_select
60
- optional_columns.map {|c| [c.header, c.name] }
63
+ optional_columns.map { |c| [c.header, c.name] }
61
64
  end
62
65
 
63
66
  def selected_column_names(*args)
@@ -67,19 +70,15 @@ module Datagrid
67
70
  column.is_a?(Datagrid::Columns::Column) ? column.name : column.to_sym
68
71
  end
69
72
  args
73
+ elsif column_names&.any?
74
+ column_names + mandatory_columns.map(&:name)
70
75
  else
71
- if column_names && column_names.any?
72
- column_names + mandatory_columns.map(&:name)
73
- else
74
- columns_enabled_by_default.map(&:name)
75
- end
76
+ columns_enabled_by_default.map(&:name)
76
77
  end
77
78
  end
78
79
 
79
80
  def columns_visibility_enabled?
80
- columns_array.any? do |column|
81
- column.mandatory_explicitly_set?
82
- end
81
+ columns_array.any?(&:mandatory_explicitly_set?)
83
82
  end
84
83
 
85
84
  def columns_enabled_by_default
@@ -87,4 +86,3 @@ module Datagrid
87
86
  end
88
87
  end
89
88
  end
90
-