ab_admin 0.4.0 → 0.5.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/ab_admin/components/in_place_edit.js.coffee +27 -12
- data/app/assets/javascripts/ab_admin/components/select2_bridge.js.coffee +39 -20
- data/app/assets/javascripts/ab_admin/core/columns_hider.js.coffee +4 -5
- data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +3 -3
- data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.css.scss +5 -1
- data/app/assets/stylesheets/ab_admin/components/_columns_hider.css.scss +1 -1
- data/app/assets/stylesheets/ab_admin/components/_form.css.scss +1 -1
- data/app/controllers/admin/assets_controller.rb +4 -1
- data/app/controllers/admin/base_controller.rb +28 -10
- data/app/controllers/admin/locators_controller.rb +1 -1
- data/app/controllers/admin/manager_controller.rb +7 -2
- data/app/controllers/admin/static_pages_controller.rb +4 -5
- data/app/controllers/admin/structures_controller.rb +1 -1
- data/app/views/admin/base/create.js.erb +1 -1
- data/app/views/admin/base/edit.js.erb +16 -10
- data/app/views/admin/base/index.html.slim +2 -2
- data/app/views/admin/base/show.js.erb +2 -2
- data/app/views/admin/base/update.js.erb +12 -8
- data/app/views/admin/manager/_form.html.slim +4 -1
- data/app/views/admin/manager/_table.html.slim +2 -2
- data/app/views/admin/shared/_flash.html.slim +1 -1
- data/app/views/admin/structures/_form.html.slim +1 -1
- data/app/views/admin/users/_table.html.slim +1 -1
- data/config/locales/de.yml +18 -36
- data/config/locales/en.yml +20 -36
- data/config/locales/it.yml +12 -30
- data/config/locales/ru.yml +4 -17
- data/config/locales/uk.yml +301 -0
- data/lib/ab_admin.rb +1 -2
- data/lib/ab_admin/concerns/admin_addition.rb +1 -1
- data/lib/ab_admin/concerns/asset_human_names.rb +9 -1
- data/lib/ab_admin/concerns/utilities.rb +2 -6
- data/lib/ab_admin/controllers/tree.rb +2 -2
- data/lib/ab_admin/core_ext/array.rb +6 -5
- data/lib/ab_admin/hooks.rb +7 -32
- data/lib/ab_admin/hooks/{active_model_hooks.rb → active_model_attr_accessible_few_roles.rb} +12 -4
- data/lib/ab_admin/hooks/{globalize_hooks.rb → globalize_locale_suffix_accessors.rb} +1 -9
- data/lib/ab_admin/hooks/globalize_valid_locale.rb +9 -0
- data/lib/ab_admin/hooks/{paginate_hooks.rb → will_paginate_id_prefetch.rb} +7 -22
- data/lib/ab_admin/hooks/will_paginate_no_uri.rb +19 -0
- data/lib/ab_admin/i18n_tools/model_translator.rb +3 -2
- data/lib/ab_admin/menu/base_group.rb +3 -3
- data/lib/ab_admin/menu/item.rb +15 -4
- data/lib/ab_admin/models/asset.rb +6 -0
- data/lib/ab_admin/models/settings.rb +6 -6
- data/lib/ab_admin/models/user.rb +4 -0
- data/lib/ab_admin/utils.rb +16 -7
- data/lib/ab_admin/utils/xls_document.rb +9 -1
- data/lib/ab_admin/version.rb +1 -1
- data/lib/ab_admin/views/admin_helpers.rb +15 -11
- data/lib/ab_admin/views/admin_navigation_helpers.rb +11 -6
- data/lib/ab_admin/views/form_builder.rb +5 -1
- data/lib/ab_admin/views/search_form_builder.rb +1 -1
- data/lib/generators/ab_admin/glob/glob_generator.rb +6 -3
- data/lib/generators/ab_admin/install/install_generator.rb +1 -1
- data/lib/generators/ab_admin/install/templates/config/{unicorn_config.rb → unicorn/production.rb} +6 -9
- data/lib/generators/ab_admin/install/templates/script/unicorn.sh +7 -6
- data/lib/generators/template.rb +0 -1
- data/lib/tasks/assets.rake +7 -1
- metadata +34 -61
- data/app/assets/stylesheets/ab_admin/components/_text_styles.css.scss +0 -47
- data/lib/ab_admin/views/inputs/capture_block_input.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 950054e682380c39155c5f4f1fb1727242ffe375
|
4
|
+
data.tar.gz: 399c85e16c87b277a2f360eaeb4fb1dae08e2c8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d98d2191b2c4b2178f22766d32f248101408f6ed6ee515aa0d5bcd8ae0700a28a9934fe36bc1d9c779459b1084cd137f6e7bb8fdd8106e7e44f09acd0a78e2f
|
7
|
+
data.tar.gz: 95545153ff5019b13e296e08287d50d6a6d1d55c886ac33edab38c385daa7f3c336b8035b63c45388670af508dc42e5dc9cb036e17b047809d328acca00ca432
|
@@ -1,18 +1,22 @@
|
|
1
1
|
EditableForm = $.fn.editableform.Constructor
|
2
2
|
EditableForm.prototype.saveWithUrlHook = (value) ->
|
3
|
-
|
3
|
+
originalUrl = @options.url
|
4
4
|
@options.url = (params) =>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
5
|
+
if typeof originalUrl == 'function'
|
6
|
+
originalUrl.call(@options.scope, params)
|
7
|
+
else
|
8
|
+
params[@options.model] ||= {}
|
9
|
+
params[@options.model][params.name] = params.value
|
10
|
+
params._method = 'PATCH'
|
11
|
+
ajax_opts =
|
12
|
+
url: originalUrl
|
13
|
+
data: params
|
14
|
+
type: 'POST'
|
15
|
+
dataType: 'json'
|
16
|
+
delete params.name
|
17
|
+
delete params.value
|
18
|
+
delete params.pk
|
19
|
+
$.ajax $.extend(ajax_opts, @options.ajaxOptions)
|
16
20
|
@saveWithoutUrlHook(value)
|
17
21
|
EditableForm.prototype.saveWithoutUrlHook = EditableForm.prototype.save
|
18
22
|
EditableForm.prototype.save = EditableForm.prototype.saveWithUrlHook
|
@@ -22,8 +26,19 @@ $(document).on 'admin:init', (e) ->
|
|
22
26
|
onblur: 'submit'
|
23
27
|
placement: 'bottom'
|
24
28
|
emptytext: I18n.lookup('admin.js.empty') || 'Empty'
|
29
|
+
error: (response, newValue) ->
|
30
|
+
log response
|
31
|
+
if response.status == 422
|
32
|
+
flash JSON.parse(response.responseText).errors.join(', ')
|
33
|
+
else
|
34
|
+
response.responseText
|
25
35
|
datetimepicker:
|
26
36
|
format: "dd.mm.yyyy hh:ii"
|
27
37
|
autoclose: true
|
28
38
|
todayBtn: true
|
29
39
|
language: I18n.locale
|
40
|
+
ajaxOptions:
|
41
|
+
xhrFields:
|
42
|
+
withCredentials: true
|
43
|
+
headers:
|
44
|
+
Accept: 'application/json'
|
@@ -8,8 +8,15 @@ class window.Select2Bridge
|
|
8
8
|
@initSortable() if @el.data('sortable')
|
9
9
|
|
10
10
|
initHandlers: ->
|
11
|
-
@el.select2('container').on 'click', '.select2-choices a', (e)
|
11
|
+
@el.select2('container').on 'click', '.select2-choices a', (e) =>
|
12
12
|
e.stopPropagation()
|
13
|
+
$el = $(e.currentTarget)
|
14
|
+
if $el.data('remote')
|
15
|
+
e.preventDefault()
|
16
|
+
@modal.data('target', this)
|
17
|
+
fn = =>
|
18
|
+
@runModal()
|
19
|
+
$.get $el.attr('href'), {modal: true}, fn, 'script'
|
13
20
|
|
14
21
|
buildOptions: ->
|
15
22
|
@options = _.defaults(@el.data('select2_opts') || {}, @defaults())
|
@@ -18,15 +25,27 @@ class window.Select2Bridge
|
|
18
25
|
if @el.data('tags')
|
19
26
|
@options.tokenSeparators = [',']
|
20
27
|
@options.tags = @el.data('tags')
|
28
|
+
if @el.data('data')
|
29
|
+
data = @el.data('data')
|
30
|
+
data = _.map(data, (el) -> {id: el, text: el.toString()} ) if data[0] && !_.isObject(data[0])
|
31
|
+
@options.data = data
|
21
32
|
else if @el.data('collection')
|
22
33
|
@options.data = @el.data('collection')
|
23
34
|
else if @el.data('class')
|
24
35
|
@initAjaxInput()
|
25
36
|
if @el.data('add')
|
26
|
-
@
|
27
|
-
@
|
37
|
+
@initCreateChoiceOnce()
|
38
|
+
@initCreateChoice()
|
39
|
+
if @el.data('create-search-choice')
|
40
|
+
@options.createSearchChoice = (term) ->
|
41
|
+
log 'createSearchChoice'
|
42
|
+
{id: term, text: term}
|
28
43
|
@options
|
29
44
|
|
45
|
+
runModal: ->
|
46
|
+
@el.trigger('select2.modal_open')
|
47
|
+
@modal.modal()
|
48
|
+
|
30
49
|
initSortable: ->
|
31
50
|
@el.select2('container').find('ul.select2-choices').sortable
|
32
51
|
containment: 'parent'
|
@@ -35,43 +54,43 @@ class window.Select2Bridge
|
|
35
54
|
update: =>
|
36
55
|
@el.select2 'onSortEnd'
|
37
56
|
|
38
|
-
|
57
|
+
initCreateChoice: ->
|
39
58
|
@options.createSearchChoice = (term, data) =>
|
40
|
-
@
|
59
|
+
@clearCreateChoice()
|
41
60
|
@cont = @el.select2('container')
|
42
|
-
@btn_add = $("<div class='btn btn-info btn-mini select2-create-
|
61
|
+
@btn_add = $("<div class='btn btn-info btn-mini select2-create-choice'>#{I18n.t('admin.js.add')} - #{term}</div>")
|
43
62
|
@btn_add.prependTo @cont
|
44
63
|
@btn_add.click =>
|
45
64
|
@modal.data('target', this)
|
46
65
|
fn = =>
|
47
66
|
$('#modal_form form input[name$="[name]"]').val(term)
|
48
|
-
@
|
67
|
+
@runModal()
|
49
68
|
$.get @el.data('add'), {modal: true}, fn, 'script'
|
50
69
|
null
|
51
70
|
|
52
|
-
|
53
|
-
return if Select2Bridge.
|
71
|
+
initCreateChoiceOnce: ->
|
72
|
+
return if Select2Bridge.initedCreateChoiceOnce
|
54
73
|
@modal.on 'ajax:success', 'form', =>
|
55
74
|
@modal.modal('hide')
|
56
75
|
that = @modal.data('target')
|
57
|
-
|
58
|
-
that.addItem(
|
59
|
-
that.
|
76
|
+
item = window.ab_admin_last_created || window.ab_admin_last_updated
|
77
|
+
that.addItem(item)
|
78
|
+
that.clearCreateChoice()
|
60
79
|
@el.data("select2-change-triggered", true)
|
61
|
-
@el.trigger('change', [
|
80
|
+
@el.trigger('change', [item])
|
62
81
|
@el.data("select2-change-triggered", false)
|
63
|
-
Select2Bridge.
|
82
|
+
Select2Bridge.initedCreateChoiceOnce = true
|
64
83
|
|
65
84
|
addItem: (item) ->
|
66
85
|
if @el.data('select2').opts.multiple
|
67
|
-
data = @el.select2('data')
|
86
|
+
data = _.reject(@el.select2('data'), (i) -> i.id == item.id)
|
68
87
|
data.push item
|
69
88
|
@el.select2('data', data)
|
70
89
|
else
|
71
90
|
@el.select2('data', item)
|
72
91
|
|
73
|
-
|
74
|
-
@el.select2('container').children('.select2-create-
|
92
|
+
clearCreateChoice: ->
|
93
|
+
@el.select2('container').children('.select2-create-choice').remove()
|
75
94
|
|
76
95
|
defaults: ->
|
77
96
|
opts =
|
@@ -80,12 +99,12 @@ class window.Select2Bridge
|
|
80
99
|
placeholder: ' '
|
81
100
|
allowClear: true
|
82
101
|
escapeMarkup: (m) -> m
|
83
|
-
opts.minimumResultsForSearch = 10 unless fv.test || @el.data('add')
|
102
|
+
opts.minimumResultsForSearch = 10 unless fv.test || @el.data('add') || @el.data('create-search-choice')
|
84
103
|
opts
|
85
104
|
|
86
105
|
initAjaxInput: ->
|
87
106
|
if @el.data('image')
|
88
|
-
@
|
107
|
+
@buildImageOptions()
|
89
108
|
if @el.data('result')
|
90
109
|
@options.formatResult = (item) => fetchTemplate(@el.data('result'))(item)
|
91
110
|
if @el.data('selection')
|
@@ -105,7 +124,7 @@ class window.Select2Bridge
|
|
105
124
|
results: data
|
106
125
|
more: data.length > 0
|
107
126
|
|
108
|
-
|
127
|
+
buildImageOptions: ->
|
109
128
|
@options.formatResult = (item) ->
|
110
129
|
html = '<div class="fancy_select-result">'
|
111
130
|
html += "<img src='#{item.image}' alt='#{item.text}'>" if item.image
|
@@ -3,7 +3,8 @@ class window.ColumnsHider
|
|
3
3
|
@store_key = 'cols'
|
4
4
|
@data_el = $('#columns_hider_data')
|
5
5
|
@column_names = @columnNames()
|
6
|
-
@collection_name =
|
6
|
+
@collection_name = window.location.href.match(/admin\/(\w+)/)?[1]
|
7
|
+
return unless @collection_name
|
7
8
|
@data = @getData()
|
8
9
|
@initDefaults()
|
9
10
|
@initButtons()
|
@@ -32,9 +33,6 @@ class window.ColumnsHider
|
|
32
33
|
data[@collection_name].push(i) if col.disabled
|
33
34
|
data
|
34
35
|
|
35
|
-
fetchData: ->
|
36
|
-
window.localStorage?[@store_key] or $.cookie(@store_key)
|
37
|
-
|
38
36
|
initButtons: ->
|
39
37
|
@data_el.empty()
|
40
38
|
for col, i in @column_names
|
@@ -62,6 +60,7 @@ class window.ColumnsHider
|
|
62
60
|
@showAll()
|
63
61
|
for i in @data[@collection_name]
|
64
62
|
@hideByIndex(i + 1)
|
63
|
+
$(document).trigger('admin:refresh_columns')
|
65
64
|
|
66
65
|
hideByIndex: (i) ->
|
67
66
|
$("#list > thead > tr > th:nth-child(#{i}), #list > tbody > tr > td:nth-child(#{i})").hide()
|
@@ -70,4 +69,4 @@ class window.ColumnsHider
|
|
70
69
|
$("#list > thead > tr > th, #list > tbody > tr > td").show()
|
71
70
|
|
72
71
|
$ ->
|
73
|
-
window.columns_hider = new ColumnsHider()
|
72
|
+
window.columns_hider = new ColumnsHider()
|
@@ -6,10 +6,10 @@ $ ->
|
|
6
6
|
todayBtn: true
|
7
7
|
language: I18n.locale
|
8
8
|
|
9
|
-
|
10
|
-
$('#search_form input.datepicker').datetimepicker
|
9
|
+
search_form_options = _.defaults({pickerPosition: "bottom-left datetimepicker-bottom-left-custom"}, base_options)
|
10
|
+
$('#search_form input.datepicker').datetimepicker search_form_options
|
11
11
|
|
12
|
-
date_picker_options = _.defaults({format: "dd.mm.yyyy"}, base_options)
|
12
|
+
date_picker_options = _.defaults({format: "dd.mm.yyyy", minView: 2}, base_options)
|
13
13
|
$('.simple_form input.date_picker').datetimepicker date_picker_options
|
14
14
|
|
15
15
|
$('.simple_form input.datetime_picker').datetimepicker base_options
|
@@ -16,7 +16,6 @@ $baseLineHeight: 18px !default;
|
|
16
16
|
@import "ab_admin/components/perms";
|
17
17
|
@import "ab_admin/components/admin_comments";
|
18
18
|
@import "ab_admin/components/geo_input";
|
19
|
-
@import "ab_admin/components/text_styles";
|
20
19
|
@import "ab_admin/components/view_layout";
|
21
20
|
@import "ab_admin/components/columns_hider";
|
22
21
|
|
@@ -24,6 +23,10 @@ img {
|
|
24
23
|
max-width: none;
|
25
24
|
}
|
26
25
|
|
26
|
+
.thumbnail.active {
|
27
|
+
@extend a.thumbnail:hover
|
28
|
+
}
|
29
|
+
|
27
30
|
.pagination a {
|
28
31
|
background-color: white;
|
29
32
|
}
|
@@ -106,6 +109,7 @@ ul.nav li.dropdown:hover ul.dropdown-menu {
|
|
106
109
|
margin-bottom: 5px;
|
107
110
|
.nav > li > a {
|
108
111
|
color: #f5f5f5;
|
112
|
+
display: inline-block;
|
109
113
|
}
|
110
114
|
.nav .active > a, .nav .active > a:hover {
|
111
115
|
color: #f5f5f5;
|
@@ -61,7 +61,10 @@ class Admin::AssetsController < ApplicationController
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def prepared_data
|
64
|
-
|
64
|
+
if %w(blob undefined).include? params[:data].original_filename
|
65
|
+
extension = params[:data].content_type.split('/').last
|
66
|
+
params[:data].original_filename = "original.#{extension}"
|
67
|
+
end
|
65
68
|
params[:data]
|
66
69
|
end
|
67
70
|
|
@@ -57,7 +57,7 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
57
57
|
failure.html { render :edit }
|
58
58
|
success.js { render layout: false }
|
59
59
|
failure.js { render :edit, layout: false }
|
60
|
-
unless
|
60
|
+
unless respond_to_format?(:json)
|
61
61
|
success.json { head :no_content }
|
62
62
|
failure.json { head :unprocessable }
|
63
63
|
end
|
@@ -104,6 +104,10 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
104
104
|
|
105
105
|
protected
|
106
106
|
|
107
|
+
def respond_to_format?(format)
|
108
|
+
self.class.mimes_for_respond_to[format]
|
109
|
+
end
|
110
|
+
|
107
111
|
def default_url_options
|
108
112
|
options = {format: nil}
|
109
113
|
options.update instance_exec(&AbAdmin.default_url_options) if AbAdmin.default_url_options
|
@@ -147,10 +151,14 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
147
151
|
base.class_eval do
|
148
152
|
before_create :bind_current_user
|
149
153
|
before_save :bind_current_updater
|
150
|
-
before_save
|
154
|
+
before_save :track_current_action
|
151
155
|
end
|
152
156
|
end
|
153
157
|
|
158
|
+
def track_current_action(*)
|
159
|
+
track_action if settings[:history]
|
160
|
+
end
|
161
|
+
|
154
162
|
def interpolation_options
|
155
163
|
return {} if collection_action? || resource.errors.empty?
|
156
164
|
{errors: resource.errors.full_messages.map { |m| "<br/> - #{m}" }.join.html_safe}
|
@@ -197,7 +205,7 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
197
205
|
end
|
198
206
|
|
199
207
|
def button_scopes
|
200
|
-
self.class.button_scopes ||= self.class.scopes_configuration.except(:
|
208
|
+
self.class.button_scopes ||= self.class.scopes_configuration.except(:by_ids).find_all{|_, s| s[:type] == :boolean }.to_h
|
201
209
|
end
|
202
210
|
|
203
211
|
def add_breadcrumbs
|
@@ -232,9 +240,9 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
232
240
|
|
233
241
|
def search_collection
|
234
242
|
params[:q] ||= {}
|
235
|
-
params[:q][:s] ||= 'id desc'
|
243
|
+
params[:q][:s] ||= settings[:default_order] || 'id desc'
|
236
244
|
@search = end_of_association_chain.accessible_by(current_ability).admin.ransack(params[:q].no_blank)
|
237
|
-
@search.result(distinct:
|
245
|
+
@search.result(distinct: @search.object.joins_values.present?)
|
238
246
|
end
|
239
247
|
|
240
248
|
def collection
|
@@ -242,11 +250,11 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
242
250
|
end
|
243
251
|
|
244
252
|
def per_page
|
245
|
-
|
246
|
-
if
|
247
|
-
params[:per_page] = 1000
|
253
|
+
request_per_page = (params[:per_page].presence || cookies[:pp].presence).to_i
|
254
|
+
if request_per_page.zero?
|
255
|
+
params[:per_page] = current_index_view == 'tree' ? 1000 : 50
|
248
256
|
else
|
249
|
-
params[:per_page] =
|
257
|
+
params[:per_page] = request_per_page
|
250
258
|
end
|
251
259
|
end
|
252
260
|
|
@@ -281,6 +289,8 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
281
289
|
new_resource_path(return_to: params[:return_to])
|
282
290
|
elsif params[:_add_edit]
|
283
291
|
edit_resource_path(resource, return_to: params[:return_to])
|
292
|
+
elsif params[:_save_and_show]
|
293
|
+
resource_path(resource, return_to: params[:return_to])
|
284
294
|
elsif params[:_add_edit_next] || params[:_add_edit_prev]
|
285
295
|
rec = resource.next_prev_by_url(end_of_association_chain.accessible_by(current_ability).unscoped.base, params[:return_to], !!params[:_add_edit_prev])
|
286
296
|
if rec
|
@@ -302,7 +312,7 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
302
312
|
fv.env = Rails.env
|
303
313
|
if AbAdmin.test_env?
|
304
314
|
fv.test = true
|
305
|
-
AbAdmin.test_settings.each { |k, v| fv
|
315
|
+
AbAdmin.test_settings.each { |k, v| fv[k] = v }
|
306
316
|
end
|
307
317
|
end
|
308
318
|
|
@@ -380,4 +390,12 @@ class Admin::BaseController < ::InheritedResources::Base
|
|
380
390
|
end
|
381
391
|
end
|
382
392
|
|
393
|
+
def default_serializer_options
|
394
|
+
if resource_class
|
395
|
+
{root: resource_class.model_name.plural}
|
396
|
+
else
|
397
|
+
{root: false}
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
383
401
|
end
|
@@ -32,7 +32,7 @@ class ::Admin::LocatorsController < ::Admin::BaseController
|
|
32
32
|
|
33
33
|
def reload
|
34
34
|
I18n.reload!
|
35
|
-
Locator.reload_checker.expire
|
35
|
+
Locator.reload_checker.expire if Locator.respond_to?(:reload_checker)
|
36
36
|
flash[:notice] = I18n.t('flash.admin.locators.restart')
|
37
37
|
redirect_to admin_locators_path
|
38
38
|
end
|
@@ -92,13 +92,18 @@ class ::Admin::ManagerController < ::Admin::BaseController
|
|
92
92
|
|
93
93
|
def manager
|
94
94
|
@manager ||= begin
|
95
|
-
|
95
|
+
manager_class_name = "AbAdmin#{resource_class.name}"
|
96
|
+
manager_instance = manager_class_name.constantize.instance
|
96
97
|
unless manager_instance.allow_action?(action_name)
|
97
98
|
raise ActionController::RoutingError.new("AbAdmin action #{action_name} for #{resource_class.name} not found")
|
98
99
|
end
|
99
100
|
manager_instance
|
100
101
|
rescue NameError => e
|
101
|
-
|
102
|
+
if e.message.include?(manager_class_name)
|
103
|
+
raise ActionController::RoutingError.new("AbAdmin manager_model for #{resource_class.name} not found (#{e.message})")
|
104
|
+
else
|
105
|
+
raise
|
106
|
+
end
|
102
107
|
end
|
103
108
|
end
|
104
109
|
|
@@ -1,15 +1,14 @@
|
|
1
1
|
class Admin::StaticPagesController < Admin::BaseController
|
2
2
|
load_and_authorize_resource
|
3
3
|
|
4
|
-
defaults singleton: true
|
4
|
+
defaults singleton: true, class_name: 'Structure'
|
5
5
|
|
6
|
-
belongs_to :structure
|
6
|
+
belongs_to :structure, finder: :friendly_find
|
7
|
+
|
8
|
+
private
|
7
9
|
|
8
10
|
def settings
|
9
11
|
{}
|
10
12
|
end
|
11
13
|
|
12
|
-
def parent_class
|
13
|
-
Structure
|
14
|
-
end
|
15
14
|
end
|