administrate 0.12.0 → 0.13.0
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/app/assets/javascripts/administrate/components/date_time_picker.js +6 -2
- data/app/assets/javascripts/administrate/components/table.js +1 -1
- data/app/assets/stylesheets/administrate/components/_attributes.scss +1 -1
- data/app/assets/stylesheets/administrate/components/_buttons.scss +8 -0
- data/app/assets/stylesheets/administrate/components/_cells.scss +2 -0
- data/app/assets/stylesheets/administrate/components/_field-unit.scss +13 -4
- data/app/assets/stylesheets/administrate/components/_navigation.scss +2 -3
- data/app/helpers/administrate/application_helper.rb +19 -0
- data/app/views/administrate/application/_form.html.erb +1 -1
- data/app/views/administrate/application/_navigation.html.erb +3 -1
- data/app/views/fields/date/_form.html.erb +24 -0
- data/app/views/fields/date/_index.html.erb +21 -0
- data/app/views/fields/date/_show.html.erb +21 -0
- data/app/views/fields/string/_show.html.erb +2 -2
- data/app/views/fields/text/_show.html.erb +2 -3
- data/docs/adding_custom_field_types.md +3 -1
- data/docs/authentication.md +3 -1
- data/docs/authorization.md +5 -3
- data/docs/contributing.md +1 -0
- data/docs/customizing_attribute_partials.md +4 -1
- data/docs/customizing_controller_actions.md +16 -1
- data/docs/customizing_dashboards.md +9 -14
- data/docs/customizing_page_views.md +3 -1
- data/docs/getting_started.md +8 -6
- data/docs/rails_api.md +5 -3
- data/lib/administrate/base_dashboard.rb +1 -0
- data/lib/administrate/field/base.rb +9 -13
- data/lib/administrate/field/date.rb +20 -0
- data/lib/administrate/field/has_one.rb +7 -7
- data/lib/administrate/field/polymorphic.rb +4 -4
- data/lib/administrate/order.rb +15 -7
- data/lib/administrate/page/base.rb +0 -2
- data/lib/administrate/version.rb +1 -1
- data/lib/administrate/view_generator.rb +2 -2
- data/lib/generators/administrate/dashboard/dashboard_generator.rb +1 -1
- data/lib/generators/administrate/dashboard/templates/controller.rb.erb +20 -8
- data/lib/generators/administrate/dashboard/templates/dashboard.rb.erb +1 -1
- data/lib/generators/administrate/install/templates/application_controller.rb.erb +3 -3
- data/lib/generators/administrate/routes/routes_generator.rb +12 -12
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a347d47197b8258a2233e4bed126e17faf34cedf8b87ca21ad61283c7f5b8dcf
|
4
|
+
data.tar.gz: 2a63e64339323c68e2daae8df8c48a50c2a85aa25cfded6a14899a275e523573
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8e751c67ebafc99997f82646120be75a79f021e6a78ea207b1a393e38438abd2c9fe00596a9772514d86e9b079984b6dd110eaef6541517dbf369b27acce590
|
7
|
+
data.tar.gz: ad12aac58cee58d0eb620c0b60627f07bfddaa7853e6c518b0a2cbe4d219c61d64a41b761d7a958bf8b65c4003ecca74b572245ae1db54e2616aafe4420e494c
|
@@ -1,10 +1,14 @@
|
|
1
1
|
$(function () {
|
2
2
|
$('[data-type="time"]').datetimepicker({
|
3
3
|
debug: false,
|
4
|
-
format:
|
4
|
+
format: 'HH:mm:ss',
|
5
5
|
});
|
6
6
|
$('[data-type="datetime"]').datetimepicker({
|
7
7
|
debug: false,
|
8
|
-
format:
|
8
|
+
format: 'YYYY-MM-DD HH:mm:ss',
|
9
|
+
});
|
10
|
+
$('[data-type="date"]').datetimepicker({
|
11
|
+
debug: false,
|
12
|
+
format: 'YYYY-MM-DD',
|
9
13
|
});
|
10
14
|
});
|
@@ -13,7 +13,7 @@ $(function() {
|
|
13
13
|
var dataUrl = $(event.target).closest("tr").data("url");
|
14
14
|
var selection = window.getSelection().toString();
|
15
15
|
if (selection.length === 0 && dataUrl) {
|
16
|
-
window.location = dataUrl;
|
16
|
+
window.location = window.location.protocol + '//' + window.location.host + dataUrl;
|
17
17
|
}
|
18
18
|
}
|
19
19
|
};
|
@@ -17,20 +17,29 @@
|
|
17
17
|
.field-unit__field {
|
18
18
|
float: left;
|
19
19
|
margin-left: 2rem;
|
20
|
-
width:
|
20
|
+
max-width: 50rem;
|
21
|
+
width: 100%;
|
21
22
|
}
|
22
23
|
|
23
24
|
.field-unit--nested {
|
24
25
|
border: $base-border;
|
25
26
|
margin-left: 7.5%;
|
27
|
+
max-width: 60rem;
|
26
28
|
padding: $small-spacing;
|
27
|
-
width:
|
29
|
+
width: 100%;
|
28
30
|
|
29
31
|
.field-unit__field {
|
30
|
-
width:
|
32
|
+
width: 100%;
|
31
33
|
}
|
32
34
|
|
33
35
|
.field-unit__label {
|
34
|
-
width:
|
36
|
+
width: 10rem;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
.field-unit--required {
|
41
|
+
label::after {
|
42
|
+
color: $red;
|
43
|
+
content: " *";
|
35
44
|
}
|
36
45
|
}
|
@@ -2,9 +2,8 @@ $_navigation-link-padding: 0.6em;
|
|
2
2
|
|
3
3
|
.navigation {
|
4
4
|
flex: 1 0 10rem;
|
5
|
-
padding
|
6
|
-
padding-
|
7
|
-
padding-top: $base-spacing;
|
5
|
+
padding: $base-spacing;
|
6
|
+
padding-left: 0;
|
8
7
|
}
|
9
8
|
|
10
9
|
.navigation__link {
|
@@ -15,6 +15,25 @@ module Administrate
|
|
15
15
|
render locals: locals, partial: field.to_partial_path
|
16
16
|
end
|
17
17
|
|
18
|
+
def requireness(field)
|
19
|
+
required_field?(field) ? "required" : "optional"
|
20
|
+
end
|
21
|
+
|
22
|
+
def required_field?(field)
|
23
|
+
has_presence_validator?(field.resource.class, field.attribute)
|
24
|
+
end
|
25
|
+
|
26
|
+
def has_presence_validator?(resource_class, field_name)
|
27
|
+
validators_on(resource_class, field_name).
|
28
|
+
any? { |v| v.class == ActiveRecord::Validations::PresenceValidator }
|
29
|
+
end
|
30
|
+
|
31
|
+
def validators_on(resource_class, field_name)
|
32
|
+
return [] unless resource_class.respond_to?(:validators_on)
|
33
|
+
|
34
|
+
resource_class.validators_on(field_name)
|
35
|
+
end
|
36
|
+
|
18
37
|
def class_from_resource(resource_name)
|
19
38
|
resource_name.to_s.classify.constantize
|
20
39
|
end
|
@@ -34,7 +34,7 @@ and renders all form fields for a resource's editable attributes.
|
|
34
34
|
<% end %>
|
35
35
|
|
36
36
|
<% page.attributes.each do |attribute| -%>
|
37
|
-
<div class="field-unit field-unit--<%= attribute.html_class %>">
|
37
|
+
<div class="field-unit field-unit--<%= attribute.html_class %> field-unit--<%= requireness(attribute) %>">
|
38
38
|
<%= render_field attribute, f: f %>
|
39
39
|
</div>
|
40
40
|
<% end -%>
|
@@ -8,11 +8,13 @@ as defined by the routes in the `admin/` namespace
|
|
8
8
|
%>
|
9
9
|
|
10
10
|
<nav class="navigation" role="navigation">
|
11
|
+
<%= link_to "Back to app", root_url, class: "button button--alt" %>
|
12
|
+
|
11
13
|
<% Administrate::Namespace.new(namespace).resources.each do |resource| %>
|
12
14
|
<%= link_to(
|
13
15
|
display_resource_name(resource),
|
14
16
|
[namespace, resource_index_route_key(resource)],
|
15
17
|
class: "navigation__link navigation__link--#{nav_link_state(resource)}"
|
16
|
-
) %>
|
18
|
+
) if valid_action? :index, resource %>
|
17
19
|
<% end %>
|
18
20
|
</nav>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%#
|
2
|
+
# Date Form Partial
|
3
|
+
|
4
|
+
This partial renders an input element for a date attribute.
|
5
|
+
By default, the input is a text field that is augmented with [DateTimePicker].
|
6
|
+
|
7
|
+
## Local variables:
|
8
|
+
|
9
|
+
- `f`:
|
10
|
+
A Rails form generator, used to help create the appropriate input fields.
|
11
|
+
- `field`:
|
12
|
+
An instance of [Administrate::Field::Date][1].
|
13
|
+
A wrapper around the Date value pulled from the database.
|
14
|
+
|
15
|
+
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/Date
|
16
|
+
[DateTimePicker]: https://github.com/Eonasdan/bootstrap-datetimepicker
|
17
|
+
%>
|
18
|
+
|
19
|
+
<div class="field-unit__label">
|
20
|
+
<%= f.label field.attribute %>
|
21
|
+
</div>
|
22
|
+
<div class="field-unit__field">
|
23
|
+
<%= f.text_field field.attribute, data: { type: 'date' } %>
|
24
|
+
</div>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%#
|
2
|
+
# Date Index Partial
|
3
|
+
|
4
|
+
This partial renders a date attribute,
|
5
|
+
to be displayed on a resource's index page.
|
6
|
+
|
7
|
+
By default, the attribute is rendered
|
8
|
+
as a localized date string.
|
9
|
+
|
10
|
+
## Local variables:
|
11
|
+
|
12
|
+
- `field`:
|
13
|
+
An instance of [Administrate::Field::Date][1].
|
14
|
+
A wrapper around the Date value pulled from the database.
|
15
|
+
|
16
|
+
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/Date
|
17
|
+
%>
|
18
|
+
|
19
|
+
<% if field.data %>
|
20
|
+
<%= field.date %>
|
21
|
+
<% end %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%#
|
2
|
+
# Date Show Partial
|
3
|
+
|
4
|
+
This partial renders a date attribute,
|
5
|
+
to be displayed on a resource's show page.
|
6
|
+
|
7
|
+
By default, the attribute is rendered
|
8
|
+
as a localized date string.
|
9
|
+
|
10
|
+
## Local variables:
|
11
|
+
|
12
|
+
- `field`:
|
13
|
+
An instance of [Administrate::Field::Date][1].
|
14
|
+
A wrapper around the Date value pulled from the database.
|
15
|
+
|
16
|
+
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/Date
|
17
|
+
%>
|
18
|
+
|
19
|
+
<% if field.data %>
|
20
|
+
<%= field.date %>
|
21
|
+
<% end %>
|
@@ -4,7 +4,7 @@
|
|
4
4
|
This partial renders a string attribute,
|
5
5
|
to be displayed on a resource's show page.
|
6
6
|
|
7
|
-
By default, the attribute is rendered as
|
7
|
+
By default, the attribute is rendered as text with whitespace preserved.
|
8
8
|
|
9
9
|
## Local variables:
|
10
10
|
|
@@ -15,4 +15,4 @@ By default, the attribute is rendered as an unformatted string.
|
|
15
15
|
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/String
|
16
16
|
%>
|
17
17
|
|
18
|
-
|
18
|
+
<div class="preserve-whitespace"><%= field.data %></div>
|
@@ -4,8 +4,7 @@
|
|
4
4
|
This partial renders a text attribute,
|
5
5
|
to be displayed on a resource's show page.
|
6
6
|
|
7
|
-
By default, the attribute is rendered as text with
|
8
|
-
whitespace preserved.
|
7
|
+
By default, the attribute is rendered as text with whitespace preserved.
|
9
8
|
|
10
9
|
## Local variables:
|
11
10
|
|
@@ -16,4 +15,4 @@ whitespace preserved.
|
|
16
15
|
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/Text
|
17
16
|
%>
|
18
17
|
|
19
|
-
<
|
18
|
+
<div class="preserve-whitespace"><%= field.data %></div>
|
data/docs/authentication.md
CHANGED
data/docs/authorization.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
---
|
2
|
+
title: Authorization
|
3
|
+
---
|
2
4
|
|
3
5
|
The default configuration of Administrate is "authenticate-only" - once a
|
4
6
|
user is authenticated, that user has access to every action of every object.
|
@@ -37,7 +39,7 @@ class PostPolicy < ApplicationPolicy
|
|
37
39
|
def resolve
|
38
40
|
scope.all
|
39
41
|
end
|
40
|
-
|
42
|
+
|
41
43
|
def resolve_admin
|
42
44
|
scope.where(owner: user)
|
43
45
|
end
|
@@ -62,7 +64,7 @@ def authorize_resource(resource)
|
|
62
64
|
raise "Erg!" unless show_action?(params[:action], resource)
|
63
65
|
end
|
64
66
|
|
65
|
-
# Hide links to actions if the user is not allowed to do them
|
67
|
+
# Hide links to actions if the user is not allowed to do them
|
66
68
|
def show_action?(action, resource)
|
67
69
|
current_user.can? action, resource
|
68
70
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
../CONTRIBUTING.md
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
---
|
2
|
+
title: Customizing attribute partials
|
3
|
+
---
|
2
4
|
|
3
5
|
Occasionally you might want to change how specific types of attributes appear
|
4
6
|
across all dashboards. You can customize the following built in field types:
|
@@ -6,6 +8,7 @@ across all dashboards. You can customize the following built in field types:
|
|
6
8
|
- `belongs_to`
|
7
9
|
- `boolean`
|
8
10
|
- `date_time`
|
11
|
+
- `date`
|
9
12
|
- `email`
|
10
13
|
- `has_many`
|
11
14
|
- `has_one`
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
---
|
2
|
+
title: Customizing controller actions
|
3
|
+
---
|
2
4
|
|
3
5
|
When you install Administrate into your app,
|
4
6
|
we generate empty controllers for each of your resources.
|
@@ -41,3 +43,16 @@ class Admin::FoosController < Admin::ApplicationController
|
|
41
43
|
# end
|
42
44
|
end
|
43
45
|
```
|
46
|
+
|
47
|
+
## Customizing Actions
|
48
|
+
|
49
|
+
To enable or disable certain actions you could override `valid_action?` method in your dashboard controller like this:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
# disable 'edit' and 'destroy' links
|
53
|
+
def valid_action?(name, resource = resource_class)
|
54
|
+
%w[edit destroy].exclude?(name.to_s) && super
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
Action is one of `new`, `edit`, `show`, `destroy`.
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
---
|
2
|
+
title: Customizing Dashboards
|
3
|
+
---
|
2
4
|
|
3
5
|
In order to customize which attributes get displayed for each resource,
|
4
6
|
edit the dashboard file generated by the installation generator.
|
@@ -54,6 +56,7 @@ specify, including:
|
|
54
56
|
- `Field::BelongsTo`
|
55
57
|
- `Field::Boolean`
|
56
58
|
- `Field::DateTime`
|
59
|
+
- `Field::Date`
|
57
60
|
- `Field::Email`
|
58
61
|
- `Field::HasMany`
|
59
62
|
- `Field::HasOne`
|
@@ -190,6 +193,11 @@ objects to display as.
|
|
190
193
|
`:timezone` - Specify which timezone `Date` and `DateTime` objects are based
|
191
194
|
in.
|
192
195
|
|
196
|
+
**Field::Date**
|
197
|
+
|
198
|
+
`:format` - Specify what format, using `strftime` you would like `Date`
|
199
|
+
objects to display as.
|
200
|
+
|
193
201
|
**Field::Select**
|
194
202
|
|
195
203
|
`:collection` - Specify the array or range to select from. Defaults to `[]`.
|
@@ -265,19 +273,6 @@ en:
|
|
265
273
|
other: Happy Customers
|
266
274
|
```
|
267
275
|
|
268
|
-
## Customizing Actions
|
269
|
-
|
270
|
-
To enable or disable certain actions you could override `valid_action?` method in your dashboard controller like this:
|
271
|
-
|
272
|
-
```ruby
|
273
|
-
# disable 'edit' and 'destroy' links
|
274
|
-
def valid_action?(name, resource = resource_class)
|
275
|
-
%w[edit destroy].exclude?(name.to_s) && super
|
276
|
-
end
|
277
|
-
```
|
278
|
-
|
279
|
-
Action is one of `new`, `edit`, `show`, `destroy`.
|
280
|
-
|
281
276
|
## Collection Filters
|
282
277
|
|
283
278
|
Resources can be filtered with pre-set filters. For example if we added:
|
data/docs/getting_started.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
---
|
2
|
+
title: Getting Started
|
3
|
+
---
|
2
4
|
|
3
5
|
Administrate is released as a Ruby gem, and can be installed on Rails
|
4
6
|
applications version 4.2 or greater.
|
@@ -84,8 +86,8 @@ rails generate administrate:install --namespace=supervisor
|
|
84
86
|
|
85
87
|
## Keep Dashboards Updated as Model Attributes Change
|
86
88
|
|
87
|
-
If you've installed Administrate and generated dashboards and _then_
|
88
|
-
subsequently added attributes to your models you'll need to manually add
|
89
|
+
If you've installed Administrate and generated dashboards and _then_
|
90
|
+
subsequently added attributes to your models you'll need to manually add
|
89
91
|
these additions (or removals) to your dashboards.
|
90
92
|
|
91
93
|
Example:
|
@@ -98,7 +100,7 @@ Example:
|
|
98
100
|
the_new_attribute: Field::String,
|
99
101
|
# ...
|
100
102
|
}.freeze
|
101
|
-
|
103
|
+
|
102
104
|
SHOW_PAGE_ATTRIBUTES = [
|
103
105
|
# ...
|
104
106
|
:the_new_attribute,
|
@@ -110,7 +112,7 @@ Example:
|
|
110
112
|
:the_new_attribute,
|
111
113
|
# ...
|
112
114
|
].freeze
|
113
|
-
|
115
|
+
|
114
116
|
COLLECTION_ATTRIBUTES = [
|
115
117
|
# ...
|
116
118
|
:the_new_attribute, # if you want it on the index, also.
|
@@ -118,7 +120,7 @@ Example:
|
|
118
120
|
].freeze
|
119
121
|
```
|
120
122
|
|
121
|
-
It's recommended that you make this change at the same time as you add the
|
123
|
+
It's recommended that you make this change at the same time as you add the
|
122
124
|
attribute to the model.
|
123
125
|
|
124
126
|
The alternative way to handle this is to re-run `rails g administrate:install`
|
data/docs/rails_api.md
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
|
1
|
+
---
|
2
|
+
title: Rails API
|
3
|
+
---
|
2
4
|
|
3
5
|
Since Rails 5.0, we've been able to have API only applications. Yet, sometimes
|
4
|
-
we still want to have an admin.
|
6
|
+
we still want to have an admin.
|
5
7
|
|
6
8
|
To get this working, we recommend updating this config:
|
7
9
|
|
@@ -29,7 +31,7 @@ config.middleware.use ::Rack::MethodOverride
|
|
29
31
|
```
|
30
32
|
|
31
33
|
You must also ensure that all the required controller actions are available
|
32
|
-
and accessible as routes since generators in API-only applications only
|
34
|
+
and accessible as routes since generators in API-only applications only
|
33
35
|
generate some of the required actions. Here is an example:
|
34
36
|
|
35
37
|
```ruby
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "administrate/field/belongs_to"
|
2
2
|
require "administrate/field/boolean"
|
3
3
|
require "administrate/field/date_time"
|
4
|
+
require "administrate/field/date"
|
4
5
|
require "administrate/field/email"
|
5
6
|
require "administrate/field/has_many"
|
6
7
|
require "administrate/field/has_one"
|
@@ -16,6 +16,14 @@ module Administrate
|
|
16
16
|
false
|
17
17
|
end
|
18
18
|
|
19
|
+
def self.field_type
|
20
|
+
to_s.split("::").last.underscore
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.permitted_attribute(attr, _options = nil)
|
24
|
+
attr
|
25
|
+
end
|
26
|
+
|
19
27
|
def initialize(attribute, data, page, options = {})
|
20
28
|
@attribute = attribute
|
21
29
|
@data = data
|
@@ -24,10 +32,6 @@ module Administrate
|
|
24
32
|
@options = options
|
25
33
|
end
|
26
34
|
|
27
|
-
def self.permitted_attribute(attr, _options = nil)
|
28
|
-
attr
|
29
|
-
end
|
30
|
-
|
31
35
|
def html_class
|
32
36
|
self.class.html_class
|
33
37
|
end
|
@@ -40,15 +44,7 @@ module Administrate
|
|
40
44
|
"/fields/#{self.class.field_type}/#{page}"
|
41
45
|
end
|
42
46
|
|
43
|
-
attr_reader :attribute, :data, :page, :resource
|
44
|
-
|
45
|
-
protected
|
46
|
-
|
47
|
-
attr_reader :options
|
48
|
-
|
49
|
-
def self.field_type
|
50
|
-
to_s.split("::").last.underscore
|
51
|
-
end
|
47
|
+
attr_reader :attribute, :data, :options, :page, :resource
|
52
48
|
end
|
53
49
|
end
|
54
50
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class Date < Base
|
6
|
+
def date
|
7
|
+
I18n.localize(
|
8
|
+
data.to_date,
|
9
|
+
format: format,
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def format
|
16
|
+
options.fetch(:format, :default)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -3,13 +3,6 @@ require_relative "associative"
|
|
3
3
|
module Administrate
|
4
4
|
module Field
|
5
5
|
class HasOne < Associative
|
6
|
-
def nested_form
|
7
|
-
@nested_form ||= Administrate::Page::Form.new(
|
8
|
-
resolver.dashboard_class.new,
|
9
|
-
data || resolver.resource_class.new,
|
10
|
-
)
|
11
|
-
end
|
12
|
-
|
13
6
|
def self.permitted_attribute(attr, options = nil)
|
14
7
|
associated_class_name =
|
15
8
|
if options
|
@@ -24,6 +17,13 @@ module Administrate
|
|
24
17
|
{ "#{attr}_attributes": related_dashboard_attributes }
|
25
18
|
end
|
26
19
|
|
20
|
+
def nested_form
|
21
|
+
@nested_form ||= Administrate::Page::Form.new(
|
22
|
+
resolver.dashboard_class.new,
|
23
|
+
data || resolver.resource_class.new,
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
27
|
private
|
28
28
|
|
29
29
|
def resolver
|
@@ -3,6 +3,10 @@ require_relative "associative"
|
|
3
3
|
module Administrate
|
4
4
|
module Field
|
5
5
|
class Polymorphic < BelongsTo
|
6
|
+
def self.permitted_attribute(attr, _options = nil)
|
7
|
+
{ attr => %i{type value} }
|
8
|
+
end
|
9
|
+
|
6
10
|
def associated_resource_grouped_options
|
7
11
|
classes.map do |klass|
|
8
12
|
[klass.to_s, candidate_resources_for(klass).map do |resource|
|
@@ -11,10 +15,6 @@ module Administrate
|
|
11
15
|
end
|
12
16
|
end
|
13
17
|
|
14
|
-
def self.permitted_attribute(attr, _options = nil)
|
15
|
-
{ attr => %i{type value} }
|
16
|
-
end
|
17
|
-
|
18
18
|
def permitted_attribute
|
19
19
|
{ attribute => %i{type value} }
|
20
20
|
end
|
data/lib/administrate/order.rb
CHANGED
@@ -2,7 +2,7 @@ module Administrate
|
|
2
2
|
class Order
|
3
3
|
def initialize(attribute = nil, direction = nil)
|
4
4
|
@attribute = attribute
|
5
|
-
@direction = direction
|
5
|
+
@direction = sanitize_direction(direction)
|
6
6
|
end
|
7
7
|
|
8
8
|
def apply(relation)
|
@@ -11,7 +11,7 @@ module Administrate
|
|
11
11
|
|
12
12
|
order = "#{relation.table_name}.#{attribute} #{direction}"
|
13
13
|
|
14
|
-
return relation.reorder(order) if
|
14
|
+
return relation.reorder(Arel.sql(order)) if
|
15
15
|
relation.columns_hash.keys.include?(attribute.to_s)
|
16
16
|
|
17
17
|
relation
|
@@ -34,6 +34,10 @@ module Administrate
|
|
34
34
|
|
35
35
|
attr_reader :attribute
|
36
36
|
|
37
|
+
def sanitize_direction(direction)
|
38
|
+
%w[asc desc].include?(direction.to_s) ? direction.to_sym : :asc
|
39
|
+
end
|
40
|
+
|
37
41
|
def reversed_direction_param_for(attr)
|
38
42
|
if ordered_by?(attr)
|
39
43
|
opposite_direction
|
@@ -43,7 +47,7 @@ module Administrate
|
|
43
47
|
end
|
44
48
|
|
45
49
|
def opposite_direction
|
46
|
-
direction
|
50
|
+
direction == :asc ? :desc : :asc
|
47
51
|
end
|
48
52
|
|
49
53
|
def order_by_association(relation)
|
@@ -56,13 +60,13 @@ module Administrate
|
|
56
60
|
|
57
61
|
def order_by_count(relation)
|
58
62
|
relation.
|
59
|
-
|
60
|
-
|
61
|
-
|
63
|
+
left_joins(attribute.to_sym).
|
64
|
+
group(:id).
|
65
|
+
reorder("COUNT(#{attribute}.id) #{direction}")
|
62
66
|
end
|
63
67
|
|
64
68
|
def order_by_id(relation)
|
65
|
-
relation.reorder("#{
|
69
|
+
relation.reorder("#{foreign_key(relation)} #{direction}")
|
66
70
|
end
|
67
71
|
|
68
72
|
def has_many_attribute?(relation)
|
@@ -76,5 +80,9 @@ module Administrate
|
|
76
80
|
def reflect_association(relation)
|
77
81
|
relation.klass.reflect_on_association(attribute.to_s)
|
78
82
|
end
|
83
|
+
|
84
|
+
def foreign_key(relation)
|
85
|
+
reflect_association(relation).foreign_key
|
86
|
+
end
|
79
87
|
end
|
80
88
|
end
|
data/lib/administrate/version.rb
CHANGED
@@ -5,8 +5,6 @@ module Administrate
|
|
5
5
|
class ViewGenerator < Rails::Generators::Base
|
6
6
|
include Administrate::GeneratorHelpers
|
7
7
|
|
8
|
-
private
|
9
|
-
|
10
8
|
def self.template_source_path
|
11
9
|
File.expand_path(
|
12
10
|
"../../../app/views/administrate/application",
|
@@ -14,6 +12,8 @@ module Administrate
|
|
14
12
|
)
|
15
13
|
end
|
16
14
|
|
15
|
+
private
|
16
|
+
|
17
17
|
def copy_resource_template(template_name)
|
18
18
|
template_file = "#{template_name}.html.erb"
|
19
19
|
|
@@ -5,7 +5,7 @@ module Administrate
|
|
5
5
|
class DashboardGenerator < Rails::Generators::NamedBase
|
6
6
|
ATTRIBUTE_TYPE_MAPPING = {
|
7
7
|
boolean: "Field::Boolean",
|
8
|
-
date: "Field::
|
8
|
+
date: "Field::Date",
|
9
9
|
datetime: "Field::DateTime",
|
10
10
|
enum: "Field::String",
|
11
11
|
float: "Field::Number",
|
@@ -4,9 +4,8 @@ module <%= namespace.classify %>
|
|
4
4
|
# For example, you may want to send an email after a foo is updated.
|
5
5
|
#
|
6
6
|
# def update
|
7
|
-
#
|
8
|
-
#
|
9
|
-
# send_foo_updated_email
|
7
|
+
# super
|
8
|
+
# send_foo_updated_email(requested_resource)
|
10
9
|
# end
|
11
10
|
|
12
11
|
# Override this method to specify custom lookup behavior.
|
@@ -17,15 +16,28 @@ module <%= namespace.classify %>
|
|
17
16
|
# Foo.find_by!(slug: param)
|
18
17
|
# end
|
19
18
|
|
19
|
+
# The result of this lookup will be available as `requested_resource`
|
20
|
+
|
20
21
|
# Override this if you have certain roles that require a subset
|
21
22
|
# this will be used to set the records shown on the `index` action.
|
22
23
|
#
|
23
24
|
# def scoped_resource
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
25
|
+
# if current_user.super_admin?
|
26
|
+
# resource_class
|
27
|
+
# else
|
28
|
+
# resource_class.with_less_stuff
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
|
32
|
+
# Override `resource_params` if you want to transform the submitted
|
33
|
+
# data before it's persisted. For example, the following would turn all
|
34
|
+
# empty values into nil values. It uses other APIs such as `resource_class`
|
35
|
+
# and `dashboard`:
|
36
|
+
#
|
37
|
+
# def resource_params
|
38
|
+
# params.require(resource_class.model_name.param_key).
|
39
|
+
# permit(dashboard.permitted_attributes).
|
40
|
+
# transform_values { |value| value == "" ? nil : value }
|
29
41
|
# end
|
30
42
|
|
31
43
|
# See https://administrate-prototype.herokuapp.com/customizing_controller_actions
|
@@ -55,7 +55,7 @@ class <%= class_name %>Dashboard < Administrate::BaseDashboard
|
|
55
55
|
# in the search field:
|
56
56
|
#
|
57
57
|
# COLLECTION_FILTERS = {
|
58
|
-
# open: ->(resources) { where(open: true) }
|
58
|
+
# open: ->(resources) { resources.where(open: true) }
|
59
59
|
# }.freeze
|
60
60
|
COLLECTION_FILTERS = {}.freeze
|
61
61
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# All Administrate controllers inherit from this
|
2
|
-
# making it the ideal place to put
|
3
|
-
# before_actions.
|
1
|
+
# All Administrate controllers inherit from this
|
2
|
+
# `Administrate::ApplicationController`, making it the ideal place to put
|
3
|
+
# authentication logic or other before_actions.
|
4
4
|
#
|
5
5
|
# If you want to add pagination or other controller-level concerns,
|
6
6
|
# you're free to overwrite the RESTful controller actions.
|
@@ -20,15 +20,15 @@ module Administrate
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def warn_about_invalid_models
|
23
|
-
|
24
|
-
puts "WARNING: Unable to generate a dashboard for #{
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
invalid_dashboard_models.each do |model|
|
24
|
+
puts "WARNING: Unable to generate a dashboard for #{model}."
|
25
|
+
if namespaced_models.include?(model)
|
26
|
+
puts " - Administrate does not yet support namespaced models."
|
27
|
+
end
|
28
|
+
if models_without_tables.include?(model)
|
29
|
+
puts " - It is not connected to a database table."
|
30
|
+
puts " Make sure your database migrations are up to date."
|
31
|
+
end
|
32
32
|
end
|
33
33
|
|
34
34
|
unnamed_constants.each do |invalid_model|
|
@@ -49,15 +49,15 @@ module Administrate
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def valid_dashboard_models
|
52
|
-
database_models -
|
52
|
+
database_models - invalid_dashboard_models
|
53
53
|
end
|
54
54
|
|
55
55
|
def database_models
|
56
56
|
ActiveRecord::Base.descendants.reject(&:abstract_class?)
|
57
57
|
end
|
58
58
|
|
59
|
-
def
|
60
|
-
models_without_tables + namespaced_models + unnamed_constants
|
59
|
+
def invalid_dashboard_models
|
60
|
+
(models_without_tables + namespaced_models + unnamed_constants).uniq
|
61
61
|
end
|
62
62
|
|
63
63
|
def models_without_tables
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: administrate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Charlton
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-03-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -234,6 +234,9 @@ files:
|
|
234
234
|
- app/views/fields/boolean/_form.html.erb
|
235
235
|
- app/views/fields/boolean/_index.html.erb
|
236
236
|
- app/views/fields/boolean/_show.html.erb
|
237
|
+
- app/views/fields/date/_form.html.erb
|
238
|
+
- app/views/fields/date/_index.html.erb
|
239
|
+
- app/views/fields/date/_show.html.erb
|
237
240
|
- app/views/fields/date_time/_form.html.erb
|
238
241
|
- app/views/fields/date_time/_index.html.erb
|
239
242
|
- app/views/fields/date_time/_show.html.erb
|
@@ -300,6 +303,7 @@ files:
|
|
300
303
|
- docs/adding_custom_field_types.md
|
301
304
|
- docs/authentication.md
|
302
305
|
- docs/authorization.md
|
306
|
+
- docs/contributing.md
|
303
307
|
- docs/customizing_attribute_partials.md
|
304
308
|
- docs/customizing_controller_actions.md
|
305
309
|
- docs/customizing_dashboards.md
|
@@ -313,6 +317,7 @@ files:
|
|
313
317
|
- lib/administrate/field/base.rb
|
314
318
|
- lib/administrate/field/belongs_to.rb
|
315
319
|
- lib/administrate/field/boolean.rb
|
320
|
+
- lib/administrate/field/date.rb
|
316
321
|
- lib/administrate/field/date_time.rb
|
317
322
|
- lib/administrate/field/deferred.rb
|
318
323
|
- lib/administrate/field/email.rb
|