semantic-administrate 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/administrate/application_controller.rb +21 -2
- data/app/controllers/concerns/administrate/punditize.rb +36 -0
- data/app/views/administrate/application/_collection.html.erb +10 -7
- data/app/views/administrate/application/_form.html.erb +5 -2
- data/app/views/administrate/application/edit.html.erb +3 -3
- data/app/views/administrate/application/index.html.erb +5 -2
- data/app/views/administrate/application/new.html.erb +6 -1
- data/app/views/administrate/application/show.html.erb +3 -3
- data/app/views/fields/has_many/_index.html.erb +1 -1
- data/config/locales/administrate.ar.yml +6 -4
- data/config/locales/administrate.bs.yml +6 -4
- data/config/locales/administrate.ca.yml +6 -4
- data/config/locales/administrate.da.yml +6 -4
- data/config/locales/administrate.de.yml +8 -6
- data/config/locales/administrate.en.yml +6 -4
- data/config/locales/administrate.es.yml +6 -4
- data/config/locales/administrate.fr.yml +6 -4
- data/config/locales/administrate.it.yml +6 -4
- data/config/locales/administrate.ja.yml +6 -4
- data/config/locales/administrate.ko.yml +6 -4
- data/config/locales/administrate.nl.yml +6 -4
- data/config/locales/administrate.pl.yml +6 -4
- data/config/locales/administrate.pt-BR.yml +6 -4
- data/config/locales/administrate.pt.yml +6 -4
- data/config/locales/administrate.ru.yml +6 -4
- data/config/locales/administrate.sv.yml +6 -4
- data/config/locales/administrate.uk.yml +6 -4
- data/config/locales/administrate.vi.yml +6 -4
- data/config/locales/administrate.zh-CN.yml +6 -4
- data/config/locales/administrate.zh-TW.yml +6 -4
- data/docs/authorization.md +69 -0
- data/docs/customizing_dashboards.md +18 -7
- data/docs/getting_started.md +42 -0
- data/lib/administrate/field/base.rb +1 -1
- data/lib/administrate/field/belongs_to.rb +1 -1
- data/lib/administrate/field/date_time.rb +13 -2
- data/lib/administrate/field/deferred.rb +3 -2
- data/lib/administrate/field/has_many.rb +2 -2
- data/lib/administrate/field/has_one.rb +16 -8
- data/lib/administrate/field/polymorphic.rb +1 -1
- data/lib/administrate/order.rb +38 -5
- data/lib/administrate/search.rb +1 -1
- data/lib/administrate/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2123d47601bf83f82794fe639a592c0be68130e8
|
4
|
+
data.tar.gz: 4f57f44bea647c725247c42fb9f18e21825ff7bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c52c71169aed4dad7ea08c9f1873bdefa22e0b14a9dd6940cac3aa56f42dd29472744c9ec82f23bc7c2d908d44ed7e95b262900a331384c2b38200d12c144c64
|
7
|
+
data.tar.gz: be36d780bdd94b43d132468d6498f68e40dcff40e3d8642744c8f77886083559fa0f05f570cbe4a19a0b008b3796e3e7e880f6bedba1d8d0040036f28ffe7028
|
@@ -27,8 +27,10 @@ module Administrate
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def new
|
30
|
+
resource = resource_class.new
|
31
|
+
authorize_resource(resource)
|
30
32
|
render locals: {
|
31
|
-
page: Administrate::Page::Form.new(dashboard,
|
33
|
+
page: Administrate::Page::Form.new(dashboard, resource),
|
32
34
|
}
|
33
35
|
end
|
34
36
|
|
@@ -40,6 +42,7 @@ module Administrate
|
|
40
42
|
|
41
43
|
def create
|
42
44
|
resource = resource_class.new(resource_params)
|
45
|
+
authorize_resource(resource)
|
43
46
|
|
44
47
|
if resource.save
|
45
48
|
redirect_to(
|
@@ -103,7 +106,9 @@ module Administrate
|
|
103
106
|
end
|
104
107
|
|
105
108
|
def requested_resource
|
106
|
-
@_requested_resource ||= find_resource(params[:id])
|
109
|
+
@_requested_resource ||= find_resource(params[:id]).tap do |resource|
|
110
|
+
authorize_resource(resource)
|
111
|
+
end
|
107
112
|
end
|
108
113
|
|
109
114
|
def find_resource(param)
|
@@ -158,5 +163,19 @@ module Administrate
|
|
158
163
|
dashboard.collection_attributes
|
159
164
|
).any? { |_name, attribute| attribute.searchable? }
|
160
165
|
end
|
166
|
+
|
167
|
+
def show_action?(action, resource)
|
168
|
+
true
|
169
|
+
end
|
170
|
+
helper_method :show_action?
|
171
|
+
|
172
|
+
def new_resource
|
173
|
+
resource_class.new
|
174
|
+
end
|
175
|
+
helper_method :new_resource
|
176
|
+
|
177
|
+
def authorize_resource(resource)
|
178
|
+
resource
|
179
|
+
end
|
161
180
|
end
|
162
181
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
if Object.const_defined?("Pundit")
|
2
|
+
module Administrate
|
3
|
+
module Punditize
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
include Pundit
|
6
|
+
|
7
|
+
included do
|
8
|
+
def scoped_resource
|
9
|
+
policy_scope_admin super
|
10
|
+
end
|
11
|
+
|
12
|
+
def authorize_resource(resource)
|
13
|
+
authorize resource
|
14
|
+
end
|
15
|
+
|
16
|
+
def show_action?(action, resource)
|
17
|
+
Pundit.policy!(pundit_user, resource).send("#{action}?".to_sym)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# Like the policy_scope method in stock Pundit, but allows the 'resolve'
|
24
|
+
# to be overridden by 'resolve_admin' for a different index scope in Admin
|
25
|
+
# controllers.
|
26
|
+
def policy_scope_admin(scope)
|
27
|
+
ps = Pundit::PolicyFinder.new(scope).scope!.new(pundit_user, scope)
|
28
|
+
if ps.respond_to? :resolve_admin
|
29
|
+
ps.resolve_admin
|
30
|
+
else
|
31
|
+
ps.resolve
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -63,11 +63,13 @@ to display a collection of resources in an HTML table.
|
|
63
63
|
>
|
64
64
|
<% collection_presenter.attributes_for(resource).each do |attribute| %>
|
65
65
|
<td class="cell-data cell-data--<%= attribute.html_class %>">
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
66
|
+
<% if show_action? :show, resource -%>
|
67
|
+
<a href="<%= polymorphic_path([namespace, resource]) -%>"
|
68
|
+
class="action-show"
|
69
|
+
>
|
70
|
+
<%= render_field attribute %>
|
71
|
+
</a>
|
72
|
+
<% end -%>
|
71
73
|
</td>
|
72
74
|
<% end %>
|
73
75
|
|
@@ -75,7 +77,8 @@ to display a collection of resources in an HTML table.
|
|
75
77
|
<td><%= link_to(
|
76
78
|
t("administrate.actions.edit"),
|
77
79
|
[:edit, namespace, resource],
|
78
|
-
|
80
|
+
class: "action-edit",
|
81
|
+
) if show_action? :edit, resource%></td>
|
79
82
|
<% end %>
|
80
83
|
|
81
84
|
<% if valid_action? :destroy, collection_presenter.resource_name %>
|
@@ -84,7 +87,7 @@ to display a collection of resources in an HTML table.
|
|
84
87
|
[namespace, resource],
|
85
88
|
method: :delete,
|
86
89
|
data: { confirm: t("administrate.actions.confirm") }
|
87
|
-
) %></td>
|
90
|
+
) if show_action? :destroy, resource %></td>
|
88
91
|
<% end %>
|
89
92
|
</tr>
|
90
93
|
<% end %>
|
@@ -18,8 +18,11 @@ and renders all form fields for a resource's editable attributes.
|
|
18
18
|
<% if page.resource.errors.any? %>
|
19
19
|
<div id="error_explanation">
|
20
20
|
<h2>
|
21
|
-
<%=
|
22
|
-
|
21
|
+
<%= t(
|
22
|
+
"administrate.form.errors",
|
23
|
+
pluralized_errors: pluralize(page.resource.errors.count, t("administrate.form.error")),
|
24
|
+
resource_name: display_resource_name(page.resource_name)
|
25
|
+
) %>
|
23
26
|
</h2>
|
24
27
|
|
25
28
|
<ul>
|
@@ -15,7 +15,7 @@ It displays a header, and renders the `_form` partial to do the heavy lifting.
|
|
15
15
|
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Form
|
16
16
|
%>
|
17
17
|
|
18
|
-
<% content_for(:title) {
|
18
|
+
<% content_for(:title) { t("administrate.actions.edit_resource", name: page.page_title) } %>
|
19
19
|
|
20
20
|
<header class="main-content__header" role="banner">
|
21
21
|
<h1 class="main-content__page-title">
|
@@ -24,10 +24,10 @@ It displays a header, and renders the `_form` partial to do the heavy lifting.
|
|
24
24
|
|
25
25
|
<div>
|
26
26
|
<%= link_to(
|
27
|
-
|
27
|
+
t("administrate.actions.show_resource", name: page.page_title),
|
28
28
|
[namespace, page.resource],
|
29
29
|
class: "button",
|
30
|
-
) if valid_action? :show %>
|
30
|
+
) if valid_action?(:show) && show_action?(:show, page.resource) %>
|
31
31
|
</div>
|
32
32
|
</header>
|
33
33
|
|
@@ -44,10 +44,13 @@ It renders the `_table` partial to display details about the resources.
|
|
44
44
|
|
45
45
|
<div class="main-content__navs">
|
46
46
|
<%= link_to(
|
47
|
-
|
47
|
+
t(
|
48
|
+
"administrate.actions.new_resource",
|
49
|
+
name: page.resource_name.titleize.downcase
|
50
|
+
),
|
48
51
|
[:new, namespace, page.resource_path],
|
49
52
|
class: "button",
|
50
|
-
) if valid_action? :new %>
|
53
|
+
) if valid_action?(:new) && show_action?(:new, new_resource) %>
|
51
54
|
</div>
|
52
55
|
</header>
|
53
56
|
|
@@ -15,7 +15,12 @@ to do the heavy lifting.
|
|
15
15
|
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Form
|
16
16
|
%>
|
17
17
|
|
18
|
-
<% content_for(:title)
|
18
|
+
<% content_for(:title) do %>
|
19
|
+
<%= t(
|
20
|
+
"administrate.actions.new_resource",
|
21
|
+
name: display_resource_name(page.resource_name).titleize
|
22
|
+
) %>
|
23
|
+
<% end %>
|
19
24
|
|
20
25
|
<header class="main-content__header" role="banner">
|
21
26
|
<h1 class="main-content__page-title">
|
@@ -16,7 +16,7 @@ as well as a link to its edit page.
|
|
16
16
|
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
|
17
17
|
%>
|
18
18
|
|
19
|
-
<% content_for(:title) {
|
19
|
+
<% content_for(:title) { t("administrate.actions.show_resource", name: page.page_title) } %>
|
20
20
|
|
21
21
|
<header class="main-content__header" role="banner">
|
22
22
|
<h1 class="main-content__page-title">
|
@@ -25,10 +25,10 @@ as well as a link to its edit page.
|
|
25
25
|
|
26
26
|
<div>
|
27
27
|
<%= link_to(
|
28
|
-
|
28
|
+
t("administrate.actions.edit_resource", name: page.page_title),
|
29
29
|
[:edit, namespace, page.resource],
|
30
30
|
class: "button",
|
31
|
-
) if valid_action? :edit %>
|
31
|
+
) if valid_action?(:edit) && show_action?(:edit, page.resource) %>
|
32
32
|
</div>
|
33
33
|
</header>
|
34
34
|
|
@@ -16,4 +16,4 @@ as a count of how many objects are associated through the relationship.
|
|
16
16
|
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/HasMany
|
17
17
|
%>
|
18
18
|
|
19
|
-
<%= pluralize(field.data.size, field.attribute.to_s.humanize.downcase) %>
|
19
|
+
<%= pluralize(field.data.size, field.attribute.to_s.humanize.downcase.singularize) %>
|
@@ -5,8 +5,9 @@ ar:
|
|
5
5
|
confirm: "هل أنت متأكد ؟"
|
6
6
|
destroy: "حذف"
|
7
7
|
edit: "تعديل"
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: "تعديل %{name}"
|
9
|
+
show_resource: "إظهار %{name}"
|
10
|
+
new_resource: "جديد %{name}"
|
10
11
|
back: "الى الخلف"
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ ar:
|
|
19
20
|
has_many:
|
20
21
|
more: إظهار %{count} من %{total_count}
|
21
22
|
none: "لا يوجد"
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: مسح البحث
|
26
28
|
label: بحث %{resource}
|
@@ -4,8 +4,9 @@ bs:
|
|
4
4
|
confirm: Jeste li sigurni?
|
5
5
|
destroy: Izbrisati
|
6
6
|
edit: Izmjena
|
7
|
-
|
8
|
-
|
7
|
+
edit_resource: Izmjena %{name}
|
8
|
+
show_resource: Pregled %{name}
|
9
|
+
new_resource: Novi %{name}
|
9
10
|
back: Nazad
|
10
11
|
controller:
|
11
12
|
create:
|
@@ -18,8 +19,9 @@ bs:
|
|
18
19
|
has_many:
|
19
20
|
more: Prikazuje %{count} od %{total_count}
|
20
21
|
none: Niko
|
21
|
-
|
22
|
-
|
22
|
+
form:
|
23
|
+
error: error
|
24
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
23
25
|
search:
|
24
26
|
clear: Izbriši pretraživanje
|
25
27
|
label: Pretraga %{resource}
|
@@ -5,8 +5,9 @@ ca:
|
|
5
5
|
confirm: Estàs segur?
|
6
6
|
destroy: Destruir
|
7
7
|
edit: Editar
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Edita %{name}
|
9
|
+
show_resource: Mostra %{name}
|
10
|
+
new_resource: Nou %{name}
|
10
11
|
back: Tornar
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ ca:
|
|
19
20
|
has_many:
|
20
21
|
more: Mostrant %{count} de %{total_count}
|
21
22
|
none: Cap
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} han impedit que %{resource_name} es guardés amb èxit:"
|
24
26
|
search:
|
25
27
|
clear: Esborrar la cerca
|
26
28
|
label: Cerca %{resource}
|
@@ -5,8 +5,9 @@ da:
|
|
5
5
|
confirm: Er du sikker?
|
6
6
|
destroy: Slet
|
7
7
|
edit: Rediger
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Rediger %{name}
|
9
|
+
show_resource: Vis %{name}
|
10
|
+
new_resource: Ny %{name}
|
10
11
|
back: Tilbage
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ da:
|
|
19
20
|
has_many:
|
20
21
|
more: "Viser %{count} af %{total_count}"
|
21
22
|
none: Ingen
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Ryd søgning
|
26
28
|
label: Søg %{resource}
|
@@ -5,8 +5,9 @@ de:
|
|
5
5
|
confirm: Sind Sie sicher?
|
6
6
|
destroy: Löschen
|
7
7
|
edit: Editieren
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: "%{name} editieren"
|
9
|
+
show_resource: "%{name} anzeigen"
|
10
|
+
new_resource: "%{name} erstellen"
|
10
11
|
back: Zurück
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ de:
|
|
19
20
|
has_many:
|
20
21
|
more: "%{count} von %{total_count}"
|
21
22
|
none: Keine
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} haben das Speichern dieses %{resource_name} verhindert:"
|
24
26
|
search:
|
25
|
-
clear:
|
26
|
-
label:
|
27
|
+
clear: Suche zurücksetzen
|
28
|
+
label: "%{resource} durchsuchen"
|
@@ -5,8 +5,9 @@ en:
|
|
5
5
|
confirm: Are you sure?
|
6
6
|
destroy: Destroy
|
7
7
|
edit: Edit
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Edit %{name}
|
9
|
+
show_resource: Show %{name}
|
10
|
+
new_resource: New %{name}
|
10
11
|
back: Back
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ en:
|
|
19
20
|
has_many:
|
20
21
|
more: Showing %{count} of %{total_count}
|
21
22
|
none: None
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Clear search
|
26
28
|
label: Search %{resource}
|
@@ -5,8 +5,9 @@ es:
|
|
5
5
|
confirm: ¿Estás seguro?
|
6
6
|
destroy: Destruir
|
7
7
|
edit: Editar
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Editar %{name}
|
9
|
+
show_resource: Mostrar %{name}
|
10
|
+
new_resource: Nuevo %{name}
|
10
11
|
back: Volver
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ es:
|
|
19
20
|
has_many:
|
20
21
|
more: Mostrando %{count} de %{total_count}
|
21
22
|
none: Ninguno
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Borrar búsqueda
|
26
28
|
label: Buscar %{resource}
|
@@ -5,8 +5,9 @@ fr:
|
|
5
5
|
confirm: Êtes-vous sûr ?
|
6
6
|
destroy: Supprimer
|
7
7
|
edit: Modifier
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Modifier %{name}
|
9
|
+
show_resource: Détails %{name}
|
10
|
+
new_resource: Création %{name}
|
10
11
|
back: Précédent
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ fr:
|
|
19
20
|
has_many:
|
20
21
|
more: "%{count} sur %{total_count}"
|
21
22
|
none: Aucun
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: erreur
|
25
|
+
errors: "%{pluralized_errors} ont empêchés %{resource_name} d'être sauvergardé :"
|
24
26
|
search:
|
25
27
|
clear: Effacer la recherche
|
26
28
|
label: Chercher %{resource}
|
@@ -5,8 +5,9 @@ it:
|
|
5
5
|
confirm: Sei sicuro?
|
6
6
|
destroy: Elimina
|
7
7
|
edit: Modifica
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Modifica %{name}
|
9
|
+
show_resource: Visualizza %{name}
|
10
|
+
new_resource: Nuovo %{name}
|
10
11
|
back: Indietro
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ it:
|
|
19
20
|
has_many:
|
20
21
|
more: Visualizzo %{count} di %{total_count}
|
21
22
|
none: Nessuno
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Cancella ricerca
|
26
28
|
label: Ricerca %{resource}
|
@@ -5,8 +5,9 @@ ja:
|
|
5
5
|
confirm: 本当によろしいですか?
|
6
6
|
destroy: 削除
|
7
7
|
edit: 編集
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: 編集 %{name}
|
9
|
+
show_resource: 参照 %{name}
|
10
|
+
new_resource: 新規 %{name}
|
10
11
|
back: 戻る
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ ja:
|
|
19
20
|
has_many:
|
20
21
|
more: "%{total_count} 件中 %{count} 件表示"
|
21
22
|
none: データがありません
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: 検索をクリアする
|
26
28
|
label: サーチ %{resource}
|
@@ -5,8 +5,9 @@ ko:
|
|
5
5
|
confirm: 괜찮습니까?
|
6
6
|
destroy: 삭제
|
7
7
|
edit: 편집
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: 편집 %{name}
|
9
|
+
show_resource: 보여주기 %{name}
|
10
|
+
new_resource: 새로운 %{name}
|
10
11
|
back: 뒤로
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ ko:
|
|
19
20
|
has_many:
|
20
21
|
more: "%{total_count} 개 중에서 %{count} 개"
|
21
22
|
none: 없음
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: 검색 초기화
|
26
28
|
label: "%{resource} 검색"
|
@@ -5,8 +5,9 @@ nl:
|
|
5
5
|
confirm: Weet u het zeker?
|
6
6
|
destroy: Verwijder
|
7
7
|
edit: Bewerk
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Bewerk %{name}
|
9
|
+
show_resource: Toon %{name}
|
10
|
+
new_resource: Nieuw %{name}
|
10
11
|
back: Terug
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ nl:
|
|
19
20
|
has_many:
|
20
21
|
more: Resultaat %{count} van %{total_count}
|
21
22
|
none: Geen
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: CDuidelijke zoek
|
26
28
|
label: Zoeken %{resource}
|
@@ -5,8 +5,9 @@ pl:
|
|
5
5
|
confirm: Czy jesteś pewien?
|
6
6
|
destroy: Usuń
|
7
7
|
edit: Edytuj
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Edytuj %{name}
|
9
|
+
show_resource: Wyświetl %{name}
|
10
|
+
new_resource: Nowy %{name}
|
10
11
|
back: Wstecz
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ pl:
|
|
19
20
|
has_many:
|
20
21
|
more: Wyświetlanie %{count} z %{total_count}
|
21
22
|
none: Brak
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Wyczyść wyszukiwanie
|
26
28
|
label: Szukanie %{resource}
|
@@ -6,8 +6,9 @@ pt-BR:
|
|
6
6
|
confirm: Você tem certeza?
|
7
7
|
destroy: Deletar
|
8
8
|
edit: Editar
|
9
|
-
|
10
|
-
|
9
|
+
edit_resource: Editar %{name}
|
10
|
+
show_resource: Visualizar %{name}
|
11
|
+
new_resource: Criar %{name}
|
11
12
|
back: Voltar
|
12
13
|
controller:
|
13
14
|
create:
|
@@ -20,8 +21,9 @@ pt-BR:
|
|
20
21
|
has_many:
|
21
22
|
more: "Exibindo %{count} de %{total_count}"
|
22
23
|
none: Nenhum
|
23
|
-
|
24
|
-
|
24
|
+
form:
|
25
|
+
error: error
|
26
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
25
27
|
search:
|
26
28
|
clear: Limpar pesquisa
|
27
29
|
label: Pesquisa %{resource}
|
@@ -6,8 +6,9 @@ pt:
|
|
6
6
|
confirm: Tem certeza?
|
7
7
|
destroy: Remover
|
8
8
|
edit: Editar
|
9
|
-
|
10
|
-
|
9
|
+
edit_resource: Editar %{name}
|
10
|
+
show_resource: Visualizar %{name}
|
11
|
+
new_resource: Novo %{name}
|
11
12
|
back: Voltar atrás
|
12
13
|
controller:
|
13
14
|
create:
|
@@ -20,8 +21,9 @@ pt:
|
|
20
21
|
has_many:
|
21
22
|
more: "Mostrando %{count} de %{total_count}"
|
22
23
|
none: Nenhum
|
23
|
-
|
24
|
-
|
24
|
+
form:
|
25
|
+
error: error
|
26
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
25
27
|
search:
|
26
28
|
clear: Limpar pesquisa
|
27
29
|
label: Pesquisa %{resource}
|
@@ -5,8 +5,9 @@ ru:
|
|
5
5
|
confirm: Вы уверены?
|
6
6
|
destroy: Удалить
|
7
7
|
edit: Редактировать
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Редактировать %{name}
|
9
|
+
show_resource: Показать %{name}
|
10
|
+
new_resource: Новый %{name}
|
10
11
|
back: Вернуться назад
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ ru:
|
|
19
20
|
has_many:
|
20
21
|
more: "%{count} из %{total_count}"
|
21
22
|
none: Нет
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Очистить поиск
|
26
28
|
label: Поиск %{resource}
|
@@ -5,8 +5,9 @@ sv:
|
|
5
5
|
confirm: Är du säker?
|
6
6
|
destroy: Ta bort
|
7
7
|
edit: Ändra
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Ändra %{name}
|
9
|
+
show_resource: Visa %{name}
|
10
|
+
new_resource: Ny %{name}
|
10
11
|
back: Tillbaka
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ sv:
|
|
19
20
|
has_many:
|
20
21
|
more: "%{count} av %{total_count}"
|
21
22
|
none: Inga
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Rensa sökningen
|
26
28
|
label: Sök %{resource}
|
@@ -5,8 +5,9 @@ uk:
|
|
5
5
|
confirm: Ви впевнені?
|
6
6
|
destroy: Видалити
|
7
7
|
edit: Редагувати
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Редагувати %{name}
|
9
|
+
show_resource: Показати %{name}
|
10
|
+
new_resource: Новий %{name}
|
10
11
|
back: Назад
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ uk:
|
|
19
20
|
has_many:
|
20
21
|
more: "%{count} із %{total_count}"
|
21
22
|
none: Немає
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Очистити пошук
|
26
28
|
label: пошук %{resource}
|
@@ -5,8 +5,9 @@ vi:
|
|
5
5
|
confirm: Bạn có chắc không?
|
6
6
|
destroy: Xóa
|
7
7
|
edit: Sửa
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: Sửa %{name}
|
9
|
+
show_resource: Xem %{name}
|
10
|
+
new_resource: Mới %{name}
|
10
11
|
back: Trở lại
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ vi:
|
|
19
20
|
has_many:
|
20
21
|
more: "%{count} trên %{total_count}"
|
21
22
|
none: Không
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: Tìm kiếm rõ ràng
|
26
28
|
label: Tìm kiếm %{resource}
|
@@ -5,8 +5,9 @@ zh-CN:
|
|
5
5
|
confirm: 确定?
|
6
6
|
destroy: 删除
|
7
7
|
edit: 编辑
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: 编辑 %{name}
|
9
|
+
show_resource: 查看 %{name}
|
10
|
+
new_resource: 新建 %{name}
|
10
11
|
back: 返回
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ zh-CN:
|
|
19
20
|
has_many:
|
20
21
|
more: 显示所有 %{total_count} 中 %{count} 条
|
21
22
|
none: 无
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: 清除搜索
|
26
28
|
label: 搜索 %{resource}
|
@@ -5,8 +5,9 @@ zh-TW:
|
|
5
5
|
confirm: 確定?
|
6
6
|
destroy: 刪除
|
7
7
|
edit: 編輯
|
8
|
-
|
9
|
-
|
8
|
+
edit_resource: 編輯 %{name}
|
9
|
+
show_resource: 檢視 %{name}
|
10
|
+
new_resource: 新增 %{name}
|
10
11
|
back: 返回
|
11
12
|
controller:
|
12
13
|
create:
|
@@ -19,8 +20,9 @@ zh-TW:
|
|
19
20
|
has_many:
|
20
21
|
more: 顯示 %{total_count} 筆中的 %{count} 筆資料
|
21
22
|
none: 無
|
22
|
-
|
23
|
-
|
23
|
+
form:
|
24
|
+
error: error
|
25
|
+
errors: "%{pluralized_errors} prohibited this %{resource_name} from being saved:"
|
24
26
|
search:
|
25
27
|
clear: 清除搜索
|
26
28
|
label: 搜索 %{resource}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Authorization
|
2
|
+
|
3
|
+
The default configuration of Administrate is "authenticate-only" - once a
|
4
|
+
user is authenticated, that user has access to every action of every object.
|
5
|
+
|
6
|
+
You can add more fine-grained authorization by overriding methods in the
|
7
|
+
controller.
|
8
|
+
|
9
|
+
## Using Pundit
|
10
|
+
|
11
|
+
If your app already uses [Pundit](https://github.com/elabs/pundit) for
|
12
|
+
authorization, you just need to add one line to your
|
13
|
+
`Admin::ApplicationController`:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
include Administrate::Punditize
|
17
|
+
```
|
18
|
+
|
19
|
+
This will use all the policies from your main app to determine if the
|
20
|
+
current user is able to view a given record or perform a given action.
|
21
|
+
|
22
|
+
### Further limiting scope
|
23
|
+
|
24
|
+
You may want to limit the scope for a given user beyond what they
|
25
|
+
technically have access to see in the main app. For example, a user may
|
26
|
+
have all public records in their scope, but you want to only show *their*
|
27
|
+
records in the admin interface to reduce confusion.
|
28
|
+
|
29
|
+
In this case, you can add an additional `resolve_admin` to your policy's
|
30
|
+
scope and Administrate will use this instead of the `resolve` method.
|
31
|
+
|
32
|
+
For example:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
class PostPolicy < ApplicationPolicy
|
36
|
+
class Scope < Scope
|
37
|
+
def resolve
|
38
|
+
scope.all
|
39
|
+
end
|
40
|
+
|
41
|
+
def resolve_admin
|
42
|
+
scope.where(owner: user)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
```
|
47
|
+
|
48
|
+
## Authorization without Pundit
|
49
|
+
|
50
|
+
If you use a different authorization library, or you want to roll your own,
|
51
|
+
you just need to override a few methods in your controllers or
|
52
|
+
`Admin::ApplicationController`. For example:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
# Limit the scope of the given resource
|
56
|
+
def scoped_resource
|
57
|
+
super.where(user: current_user)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Raise an exception if the user is not permitted to access this resource
|
61
|
+
def authorize_resource(resource)
|
62
|
+
raise "Erg!" unless show_action?(params[:action], resource)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Hide links to actions if the user is not allowed to do them
|
66
|
+
def show_action?(action, resource)
|
67
|
+
current_user.can? action, resource
|
68
|
+
end
|
69
|
+
```
|
@@ -72,7 +72,13 @@ which are specified through the `.with_options` class method:
|
|
72
72
|
|
73
73
|
**Field::BelongsTo**
|
74
74
|
|
75
|
-
`:order` - order of the dropdown menu, can be ordered by more
|
75
|
+
`:order` - Specifies the order of the dropdown menu, can be ordered by more
|
76
|
+
than one column. e.g.: `"name, email DESC"`.
|
77
|
+
|
78
|
+
`:primary_key` - Specifies object's primary_key. Defaults to `:id`.
|
79
|
+
|
80
|
+
`:foreign_key` - Specifies the name of the foreign key directly.
|
81
|
+
Defaults to `:#{attribute}_id`.
|
76
82
|
|
77
83
|
**Field::HasMany**
|
78
84
|
|
@@ -87,12 +93,6 @@ which are specified through the `.with_options` class method:
|
|
87
93
|
|
88
94
|
`:foreign_key` - Specifies the name of the foreign key directly. Defaults to `:#{attribute}_id`
|
89
95
|
|
90
|
-
**Field::BelongsTo**
|
91
|
-
|
92
|
-
`:primary_key` - Specifies object's primary_key. Defaults to `:id`.
|
93
|
-
|
94
|
-
`:foreign_key` - Specifies the name of the foreign key directly. Defaults to `:#{attribute}_id`
|
95
|
-
|
96
96
|
**Field::Number**
|
97
97
|
|
98
98
|
`:decimals` - Set the number of decimals to display. Defaults to `0`.
|
@@ -124,6 +124,17 @@ Or, to display a distance in kilometers:
|
|
124
124
|
`:classes` - Specify a list of classes whose objects will be used to populate select boxes for editing this polymorphic field.
|
125
125
|
Default is `[]`.
|
126
126
|
|
127
|
+
`:order` - What to sort the association by in the form select.
|
128
|
+
Default is `nil`.
|
129
|
+
|
130
|
+
**Field::DateTime**
|
131
|
+
|
132
|
+
`:format` - Specify what format, using `strftime` you would like `DateTime`
|
133
|
+
objects to display as.
|
134
|
+
|
135
|
+
`:timezone` - Specify which timezone `Date` and `DateTime` objects are based
|
136
|
+
in.
|
137
|
+
|
127
138
|
**Field::Select**
|
128
139
|
|
129
140
|
`:collection` - Specify the array or range to select from. Defaults to `[]`.
|
data/docs/getting_started.md
CHANGED
@@ -73,6 +73,48 @@ namespace :admin do
|
|
73
73
|
end
|
74
74
|
```
|
75
75
|
|
76
|
+
## Keep Dashboards Updated as Model Attributes Change
|
77
|
+
|
78
|
+
If you've installed Administrate and generated dashboards and _then_
|
79
|
+
subsequently added attributes to your models you'll need to manually add
|
80
|
+
these additions (or removals) to your dashboards.
|
81
|
+
|
82
|
+
Example:
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
# app/dashboards/your_model_dashboard.rb
|
86
|
+
|
87
|
+
ATTRIBUTE_TYPES = {
|
88
|
+
# ...
|
89
|
+
the_new_attribute: Field::String,
|
90
|
+
# ...
|
91
|
+
}.freeze
|
92
|
+
|
93
|
+
SHOW_PAGE_ATTRIBUTES = [
|
94
|
+
# ...
|
95
|
+
:the_new_attribute,
|
96
|
+
# ...
|
97
|
+
].freeze
|
98
|
+
|
99
|
+
FORM_ATTRIBUTES = [
|
100
|
+
# ...
|
101
|
+
:the_new_attribute,
|
102
|
+
# ...
|
103
|
+
].freeze
|
104
|
+
|
105
|
+
COLLECTION_ATTRIBUTES = [
|
106
|
+
# ...
|
107
|
+
:the_new_attribute, # if you want it on the index, also.
|
108
|
+
# ...
|
109
|
+
].freeze
|
110
|
+
```
|
111
|
+
|
112
|
+
It's recommended that you make this change at the same time as you add the
|
113
|
+
attribute to the model.
|
114
|
+
|
115
|
+
The alternative way to handle this is to re-run `rails g administrate:install` and
|
116
|
+
carefully pick through the diffs. This latter method is probably more cumbersome.
|
117
|
+
|
76
118
|
## Rails API
|
77
119
|
|
78
120
|
Since Rails 5.0, we've been able to have API only applications. Yet, sometimes
|
@@ -4,11 +4,18 @@ module Administrate
|
|
4
4
|
module Field
|
5
5
|
class DateTime < Base
|
6
6
|
def date
|
7
|
-
I18n.localize(
|
7
|
+
I18n.localize(
|
8
|
+
data.in_time_zone(timezone).to_date,
|
9
|
+
format: format,
|
10
|
+
)
|
8
11
|
end
|
9
12
|
|
10
13
|
def datetime
|
11
|
-
I18n.localize(
|
14
|
+
I18n.localize(
|
15
|
+
data.in_time_zone(timezone),
|
16
|
+
format: format,
|
17
|
+
default: data,
|
18
|
+
)
|
12
19
|
end
|
13
20
|
|
14
21
|
private
|
@@ -16,6 +23,10 @@ module Administrate
|
|
16
23
|
def format
|
17
24
|
options.fetch(:format, :default)
|
18
25
|
end
|
26
|
+
|
27
|
+
def timezone
|
28
|
+
options.fetch(:timezone, "UTC")
|
29
|
+
end
|
19
30
|
end
|
20
31
|
end
|
21
32
|
end
|
@@ -25,8 +25,9 @@ module Administrate
|
|
25
25
|
options.fetch(:searchable, deferred_class.searchable?)
|
26
26
|
end
|
27
27
|
|
28
|
-
def permitted_attribute(attr)
|
29
|
-
options.fetch(:foreign_key,
|
28
|
+
def permitted_attribute(attr, _options = nil)
|
29
|
+
options.fetch(:foreign_key,
|
30
|
+
deferred_class.permitted_attribute(attr, options))
|
30
31
|
end
|
31
32
|
|
32
33
|
delegate :html_class, to: :deferred_class
|
@@ -7,8 +7,8 @@ module Administrate
|
|
7
7
|
class HasMany < Associative
|
8
8
|
DEFAULT_LIMIT = 5
|
9
9
|
|
10
|
-
def self.permitted_attribute(
|
11
|
-
{ "#{
|
10
|
+
def self.permitted_attribute(attr, _options = nil)
|
11
|
+
{ "#{attr.to_s.singularize}_ids".to_sym => [] }
|
12
12
|
end
|
13
13
|
|
14
14
|
def associated_collection
|
@@ -3,25 +3,33 @@ require_relative "associative"
|
|
3
3
|
module Administrate
|
4
4
|
module Field
|
5
5
|
class HasOne < Associative
|
6
|
-
def
|
7
|
-
|
8
|
-
@nested_form = Administrate::Page::Form.new(
|
6
|
+
def nested_form
|
7
|
+
@nested_form ||= Administrate::Page::Form.new(
|
9
8
|
resolver.dashboard_class.new,
|
10
9
|
data || resolver.resource_class.new,
|
11
10
|
)
|
12
|
-
|
13
|
-
super
|
14
11
|
end
|
15
12
|
|
16
|
-
def self.permitted_attribute(attr)
|
13
|
+
def self.permitted_attribute(attr, options = nil)
|
14
|
+
associated_class_name =
|
15
|
+
if options
|
16
|
+
options.fetch(:class_name, attr.to_s.singularize.camelcase)
|
17
|
+
else
|
18
|
+
attr
|
19
|
+
end
|
17
20
|
related_dashboard_attributes =
|
18
|
-
Administrate::ResourceResolver.new("admin/#{
|
21
|
+
Administrate::ResourceResolver.new("admin/#{associated_class_name}").
|
19
22
|
dashboard_class.new.permitted_attributes + [:id]
|
20
23
|
|
21
24
|
{ "#{attr}_attributes": related_dashboard_attributes }
|
22
25
|
end
|
23
26
|
|
24
|
-
|
27
|
+
private
|
28
|
+
|
29
|
+
def resolver
|
30
|
+
@resolver ||=
|
31
|
+
Administrate::ResourceResolver.new("admin/#{associated_class_name}")
|
32
|
+
end
|
25
33
|
end
|
26
34
|
end
|
27
35
|
end
|
data/lib/administrate/order.rb
CHANGED
@@ -6,11 +6,13 @@ module Administrate
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def apply(relation)
|
9
|
-
|
10
|
-
relation.
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
return order_by_association(relation) unless
|
10
|
+
reflect_association(relation).nil?
|
11
|
+
|
12
|
+
return relation.reorder("#{attribute} #{direction}") if
|
13
|
+
relation.columns_hash.keys.include?(attribute.to_s)
|
14
|
+
|
15
|
+
relation
|
14
16
|
end
|
15
17
|
|
16
18
|
def ordered_by?(attr)
|
@@ -41,5 +43,36 @@ module Administrate
|
|
41
43
|
def opposite_direction
|
42
44
|
direction.to_sym == :asc ? :desc : :asc
|
43
45
|
end
|
46
|
+
|
47
|
+
def order_by_association(relation)
|
48
|
+
return order_by_count(relation) if has_many_attribute?(relation)
|
49
|
+
|
50
|
+
return order_by_id(relation) if belongs_to_attribute?(relation)
|
51
|
+
|
52
|
+
relation
|
53
|
+
end
|
54
|
+
|
55
|
+
def order_by_count(relation)
|
56
|
+
relation.
|
57
|
+
left_joins(attribute.to_sym).
|
58
|
+
group(:id).
|
59
|
+
reorder("COUNT(#{attribute}.id) #{direction}")
|
60
|
+
end
|
61
|
+
|
62
|
+
def order_by_id(relation)
|
63
|
+
relation.reorder("#{attribute}_id #{direction}")
|
64
|
+
end
|
65
|
+
|
66
|
+
def has_many_attribute?(relation)
|
67
|
+
reflect_association(relation).macro == :has_many
|
68
|
+
end
|
69
|
+
|
70
|
+
def belongs_to_attribute?(relation)
|
71
|
+
reflect_association(relation).macro == :belongs_to
|
72
|
+
end
|
73
|
+
|
74
|
+
def reflect_association(relation)
|
75
|
+
relation.klass.reflect_on_association(attribute.to_s)
|
76
|
+
end
|
44
77
|
end
|
45
78
|
end
|
data/lib/administrate/search.rb
CHANGED
@@ -24,7 +24,7 @@ module Administrate
|
|
24
24
|
table_name = ActiveRecord::Base.connection.
|
25
25
|
quote_table_name(@scoped_resource.table_name)
|
26
26
|
attr_name = ActiveRecord::Base.connection.quote_column_name(attr)
|
27
|
-
"
|
27
|
+
"LOWER(TEXT(#{table_name}.#{attr_name})) LIKE ?"
|
28
28
|
end.join(" OR ")
|
29
29
|
end
|
30
30
|
|
data/lib/administrate/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: semantic-administrate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
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: 2018-02-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -224,6 +224,7 @@ files:
|
|
224
224
|
- app/assets/stylesheets/administrate/vendor/semantic-ui.scss
|
225
225
|
- app/assets/stylesheets/docs.scss
|
226
226
|
- app/controllers/administrate/application_controller.rb
|
227
|
+
- app/controllers/concerns/administrate/punditize.rb
|
227
228
|
- app/helpers/administrate/application_helper.rb
|
228
229
|
- app/views/administrate/application/_collection.html.erb
|
229
230
|
- app/views/administrate/application/_flashes.html.erb
|
@@ -300,6 +301,7 @@ files:
|
|
300
301
|
- config/unicorn.rb
|
301
302
|
- docs/adding_custom_field_types.md
|
302
303
|
- docs/authentication.md
|
304
|
+
- docs/authorization.md
|
303
305
|
- docs/customizing_attribute_partials.md
|
304
306
|
- docs/customizing_controller_actions.md
|
305
307
|
- docs/customizing_dashboards.md
|