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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -1
- data/{Readme.markdown → README.md} +44 -27
- data/app/assets/stylesheets/datagrid.css +145 -0
- data/app/views/datagrid/_enum_checkboxes.html.erb +5 -3
- data/app/views/datagrid/_form.html.erb +4 -4
- data/app/views/datagrid/_head.html.erb +26 -3
- data/app/views/datagrid/_range_filter.html.erb +5 -3
- data/app/views/datagrid/_row.html.erb +12 -1
- data/app/views/datagrid/_table.html.erb +4 -4
- data/datagrid.gemspec +6 -6
- data/lib/datagrid/active_model.rb +9 -17
- data/lib/datagrid/base.rb +39 -0
- data/lib/datagrid/column_names_attribute.rb +9 -11
- data/lib/datagrid/columns/column.rb +155 -133
- data/lib/datagrid/columns.rb +254 -45
- data/lib/datagrid/configuration.rb +23 -10
- data/lib/datagrid/core.rb +89 -54
- data/lib/datagrid/deprecated_object.rb +20 -0
- data/lib/datagrid/drivers/abstract_driver.rb +12 -23
- data/lib/datagrid/drivers/active_record.rb +24 -26
- data/lib/datagrid/drivers/array.rb +22 -14
- data/lib/datagrid/drivers/mongo_mapper.rb +15 -14
- data/lib/datagrid/drivers/mongoid.rb +15 -17
- data/lib/datagrid/drivers/sequel.rb +14 -19
- data/lib/datagrid/drivers.rb +2 -1
- data/lib/datagrid/engine.rb +11 -3
- data/lib/datagrid/filters/base_filter.rb +166 -142
- data/lib/datagrid/filters/boolean_filter.rb +19 -5
- data/lib/datagrid/filters/date_filter.rb +33 -35
- data/lib/datagrid/filters/date_time_filter.rb +24 -16
- data/lib/datagrid/filters/default_filter.rb +9 -3
- data/lib/datagrid/filters/dynamic_filter.rb +151 -105
- data/lib/datagrid/filters/enum_filter.rb +43 -19
- data/lib/datagrid/filters/extended_boolean_filter.rb +39 -30
- data/lib/datagrid/filters/float_filter.rb +16 -5
- data/lib/datagrid/filters/integer_filter.rb +21 -10
- data/lib/datagrid/filters/ranged_filter.rb +66 -45
- data/lib/datagrid/filters/select_options.rb +58 -49
- data/lib/datagrid/filters/string_filter.rb +9 -4
- data/lib/datagrid/filters.rb +190 -57
- data/lib/datagrid/form_builder.rb +116 -128
- data/lib/datagrid/generators/scaffold.rb +185 -0
- data/lib/datagrid/generators/views.rb +20 -0
- data/lib/datagrid/helper.rb +397 -22
- data/lib/datagrid/ordering.rb +26 -29
- data/lib/datagrid/rspec.rb +6 -10
- data/lib/datagrid/utils.rb +37 -30
- data/lib/datagrid/version.rb +3 -1
- data/lib/datagrid.rb +18 -28
- data/templates/base.rb.erb +6 -4
- data/templates/grid.rb.erb +1 -1
- metadata +15 -16
- data/app/assets/stylesheets/datagrid.sass +0 -134
- data/lib/datagrid/filters/composite_filters.rb +0 -49
- data/lib/datagrid/renderer.rb +0 -157
- data/lib/datagrid/scaffold.rb +0 -129
- data/lib/tasks/datagrid_tasks.rake +0 -15
- data/templates/controller.rb.erb +0 -6
- data/templates/index.html.erb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37409811e25a50a023aa095fb8854424fea3867e137b8d212d619ba191307abe
|
4
|
+
data.tar.gz: 2485f8f3a8cf9d196011a584e680c345d147430ef3d263b151569ae10fc3ef69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2974b76d03c7a3c014a3b853570ae0a11e2c137f0e4faea6be0dfcff45b49e4c64037298337e0f9e3028ecd64d938747770903469888339e6a43bbcc03330a59
|
7
|
+
data.tar.gz: 52d188d5c0e6a41a3f44061274695b5eee22f7c669c1814f26ae38cfeee364b66c8437ca85c55fa3a73d8fe3333e6c9820fda9b1e2ccee770d48bcba7d72bfe3
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
##
|
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
|
-
|
3
|
+
Datagrid Version 2.0.0 is here.
|
4
4
|
|
5
|
-
[
|
5
|
+
[Migration Guide](./version-2).
|
6
6
|
|
7
|
-
|
7
|
+
[](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,44 @@ A really mighty and flexible ruby library that generates reports including admin
|
|
12
15
|
* Localization
|
13
16
|
* Export to CSV
|
14
17
|
|
15
|
-
|
18
|
+
## ORM Support
|
16
19
|
|
17
20
|
* ActiveRecord
|
18
21
|
* Mongoid
|
19
22
|
* MongoMapper
|
20
23
|
* Sequel
|
21
|
-
* Array (
|
24
|
+
* Array (in-memory data of smaller scale)
|
22
25
|
|
23
26
|
[Create an issue](https://github.com/bogdan/datagrid/issues/new) if you want more.
|
24
27
|
|
25
|
-
|
28
|
+
## Datagrid Philosophy
|
29
|
+
|
30
|
+
1. Expressive DSL complements OOD instead of replacing it.
|
31
|
+
1. Extensible in every way while providing a lot of defaults.
|
32
|
+
1. If your ORM supports that, datagrid also supports that!
|
33
|
+
|
34
|
+
## Documentation
|
26
35
|
|
27
|
-
* [
|
28
|
-
* [
|
29
|
-
* [
|
36
|
+
* [Rdoc](https://rubydoc.info/gems/datagrid) - full API reference
|
37
|
+
* [Scope](https://rubydoc.info/gems/datagrid/Datagrid/Core) - working with datagrid scope
|
38
|
+
* [Columns](https://rubydoc.info/gems/datagrid/Datagrid/Columns) - definging datagrid columns
|
39
|
+
* [Filters](https://rubydoc.info/gems/datagrid/Datagrid/Filters) - defining datagrid filters
|
40
|
+
* [Frontend](https://rubydoc.info/gems/datagrid/Datagrid/Helper) - building a frontend
|
41
|
+
* [Configuration](https://rubydoc.info/gems/datagrid/Datagrid/Configuration) - configuring the gem
|
30
42
|
|
31
43
|
### Live Demo
|
32
44
|
|
33
45
|
[Datagrid DEMO application](http://datagrid.herokuapp.com) is available live!
|
34
46
|
[Demo source code](https://github.com/bogdan/datagrid-demo).
|
35
47
|
|
36
|
-
<img src="http://datagrid.herokuapp.com/datagrid_demo_screenshot.png" style="margin: 7px; border: 1px solid black">
|
48
|
+
<!-- <img src="http://datagrid.herokuapp.com/datagrid_demo_screenshot.png" style="margin: 7px; border: 1px solid black"> -->
|
37
49
|
|
38
50
|
### Example
|
39
51
|
|
40
52
|
In order to create a grid:
|
41
53
|
|
42
54
|
``` ruby
|
43
|
-
class UsersGrid
|
44
|
-
|
45
|
-
include Datagrid
|
55
|
+
class UsersGrid < Datagrid::Base
|
46
56
|
|
47
57
|
scope do
|
48
58
|
User.includes(:group)
|
@@ -71,7 +81,7 @@ Basic grid api:
|
|
71
81
|
|
72
82
|
``` ruby
|
73
83
|
report = UsersGrid.new(
|
74
|
-
group_id: [1,2],
|
84
|
+
group_id: [1,2],
|
75
85
|
logins_count: [1, nil],
|
76
86
|
category: "first",
|
77
87
|
order: :group,
|
@@ -79,7 +89,10 @@ report = UsersGrid.new(
|
|
79
89
|
)
|
80
90
|
|
81
91
|
report.assets # => Array of User instances:
|
82
|
-
# SELECT * FROM users WHERE users.group_id in (1,2) AND
|
92
|
+
# SELECT * FROM users WHERE users.group_id in (1,2) AND
|
93
|
+
# users.logins_count >= 1 AND
|
94
|
+
# users.category = 'first'
|
95
|
+
# ORDER BY groups.name DESC
|
83
96
|
|
84
97
|
report.header # => ["Name", "Group", "Activated"]
|
85
98
|
report.rows # => [
|
@@ -103,7 +116,8 @@ In order to create a report, you need to define:
|
|
103
116
|
### Scope
|
104
117
|
|
105
118
|
Default scope of objects to filter and display.
|
106
|
-
In common case it is `ActiveRecord::Base` (or any other supported ORM)
|
119
|
+
In common case it is `ActiveRecord::Base` (or any other supported ORM)
|
120
|
+
subclass with some generic scopes like:
|
107
121
|
|
108
122
|
``` ruby
|
109
123
|
scope do
|
@@ -111,7 +125,7 @@ scope do
|
|
111
125
|
end
|
112
126
|
```
|
113
127
|
|
114
|
-
[More about scope](https://
|
128
|
+
[More about scope](https://rubydoc.info/gems/datagrid/Datagrid/Core)
|
115
129
|
|
116
130
|
### Filters
|
117
131
|
|
@@ -133,9 +147,9 @@ Datagrid supports different type of filters including:
|
|
133
147
|
* xboolean - the select of "yes", "no" and any
|
134
148
|
* enum - selection of the given values
|
135
149
|
* string
|
136
|
-
* dynamic - build dynamic SQL condition
|
150
|
+
* dynamic - build dynamic SQL condition
|
137
151
|
|
138
|
-
[More about filters](https://
|
152
|
+
[More about filters](https://rubydoc.info/gems/datagrid/Datagrid/Filters)
|
139
153
|
|
140
154
|
### Columns
|
141
155
|
|
@@ -154,7 +168,7 @@ Each column is sortable.
|
|
154
168
|
|
155
169
|
### Front end
|
156
170
|
|
157
|
-
|
171
|
+
#### Using Generator
|
158
172
|
|
159
173
|
Datagrid has a builtin generator:
|
160
174
|
|
@@ -172,27 +186,29 @@ route resources :skills
|
|
172
186
|
insert app/assets/stylesheet/application.css
|
173
187
|
```
|
174
188
|
|
175
|
-
|
189
|
+
#### Customize Built-in views
|
176
190
|
|
177
|
-
In order to get a control on datagrid built-in
|
191
|
+
In order to get a control on datagrid built-in views run:
|
178
192
|
|
179
193
|
``` sh
|
180
|
-
|
194
|
+
rails g datagrid::views
|
181
195
|
```
|
182
196
|
|
183
|
-
|
197
|
+
#### Advanced frontend
|
184
198
|
|
185
199
|
All advanced frontend things are described in:
|
186
200
|
|
187
|
-
[Frontend section on wiki](https://
|
201
|
+
[Frontend section on wiki](https://rubydoc.info/gems/datagrid/Datagrid/Helper)
|
188
202
|
|
189
203
|
## Questions & Issues
|
190
204
|
|
191
|
-
If you have a question of any kind, just make an issue and
|
205
|
+
If you have a question of any kind, just make an issue and
|
206
|
+
describe your problem in details.
|
192
207
|
|
193
208
|
## Contribution
|
194
209
|
|
195
|
-
If you are interested in contributing to this project,
|
210
|
+
If you are interested in contributing to this project,
|
211
|
+
please follow the [instructions here](CONTRIBUTING.md).
|
196
212
|
|
197
213
|
## Self-Promotion
|
198
214
|
|
@@ -203,4 +219,5 @@ Follow the repository on [GitHub](https://github.com/bogdan/datagrid).
|
|
203
219
|
Read [author blog](http://gusiev.com).
|
204
220
|
|
205
221
|
## License
|
222
|
+
|
206
223
|
[](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
|
-
|
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.
|
8
|
-
<%= form.
|
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
|
-
<%=
|
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")
|
10
|
-
<%= link_to I18n.t('datagrid.form.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
|
-
|
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
|
-
|
6
|
-
|
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
|
3
|
-
|
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
|
-
|
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
|
-
<%=
|
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="
|
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")
|
21
|
+
<%= I18n.t("datagrid.table.no_columns") %>
|
22
22
|
<% end %>
|
data/datagrid.gemspec
CHANGED
@@ -12,26 +12,26 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.email = "agresso@gmail.com"
|
13
13
|
s.extra_rdoc_files = [
|
14
14
|
"LICENSE.txt",
|
15
|
-
"
|
15
|
+
"README.md",
|
16
16
|
]
|
17
17
|
s.files = [
|
18
18
|
"LICENSE.txt",
|
19
19
|
"CHANGELOG.md",
|
20
|
-
"
|
20
|
+
"README.md",
|
21
21
|
"datagrid.gemspec",
|
22
22
|
]
|
23
23
|
s.files += `git ls-files | grep -E '^(app|lib|templates)'`.split("\n")
|
24
24
|
s.homepage = "https://github.com/bogdan/datagrid"
|
25
25
|
s.licenses = ["MIT"]
|
26
|
-
s.required_ruby_version = Gem::Requirement.new(">=
|
26
|
+
s.required_ruby_version = Gem::Requirement.new(">= 3.0")
|
27
27
|
s.metadata = {
|
28
28
|
"homepage_uri" => s.homepage,
|
29
29
|
"bug_tracker_uri" => "#{s.homepage}/issues",
|
30
30
|
"documentation_uri" => "#{s.homepage}/wiki",
|
31
|
-
"changelog_uri" => "#{s.homepage}/blob/
|
31
|
+
"changelog_uri" => "#{s.homepage}/blob/main/CHANGELOG.md",
|
32
32
|
"source_code_uri" => s.homepage,
|
33
|
+
"rubygems_mfa_required" => "true",
|
33
34
|
}
|
34
35
|
|
35
|
-
s.add_dependency "railties", ">=
|
36
|
+
s.add_dependency "railties", ">= 7.0"
|
36
37
|
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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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?
|
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
|
-
|