ab_admin 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +1 -1
  4. data/app/assets/javascripts/ab_admin/components/locator.js.coffee +2 -0
  5. data/app/assets/javascripts/ab_admin/components/select2_bridge.js.coffee +8 -7
  6. data/app/assets/javascripts/ab_admin/core/confirmation.js.coffee +1 -1
  7. data/app/assets/javascripts/ab_admin/core/init.js.coffee +6 -5
  8. data/app/assets/javascripts/ab_admin/core/utils.js.coffee +2 -2
  9. data/app/assets/stylesheets/ab_admin/{application.css.scss → application.scss} +0 -0
  10. data/app/assets/stylesheets/ab_admin/{bootstrap_and_overrides.css.scss → bootstrap_and_overrides.scss} +0 -0
  11. data/app/assets/stylesheets/ab_admin/components/{_admin_comments.css.scss → _admin_comments.scss} +0 -0
  12. data/app/assets/stylesheets/ab_admin/components/{_base.css.scss → _base.scss} +0 -0
  13. data/app/assets/stylesheets/ab_admin/components/{_colored_tabs.css.scss → _colored_tabs.scss} +0 -0
  14. data/app/assets/stylesheets/ab_admin/components/{_columns_hider.css.scss → _columns_hider.scss} +0 -0
  15. data/app/assets/stylesheets/ab_admin/components/{_form.css.scss → _form.scss} +0 -0
  16. data/app/assets/stylesheets/ab_admin/components/{_geo_input.css.scss → _geo_input.scss} +0 -0
  17. data/app/assets/stylesheets/ab_admin/components/{_grid_view.css.scss → _grid_view.scss} +0 -0
  18. data/app/assets/stylesheets/ab_admin/components/{_locale_tabs.css.scss → _locale_tabs.scss} +0 -0
  19. data/app/assets/stylesheets/ab_admin/components/{_navigation.css.scss → _navigation.scss} +0 -0
  20. data/app/assets/stylesheets/ab_admin/components/{_perms.css.scss → _perms.scss} +0 -0
  21. data/app/assets/stylesheets/ab_admin/components/{_table_view.css.scss → _table_view.scss} +0 -0
  22. data/app/assets/stylesheets/ab_admin/components/{_translations.css.scss → _translations.scss} +0 -0
  23. data/app/assets/stylesheets/ab_admin/components/{_tree_view.css.scss → _tree_view.scss} +0 -0
  24. data/app/assets/stylesheets/ab_admin/components/{_view_layout.css.scss → _view_layout.scss} +0 -0
  25. data/app/assets/stylesheets/ab_admin/{devise.css.scss → devise.scss} +0 -0
  26. data/app/assets/stylesheets/ab_admin/{fileupload.css.scss → fileupload.scss} +0 -0
  27. data/app/assets/stylesheets/ab_admin/{main.css.scss → main.scss} +0 -0
  28. data/app/controllers/admin/base_controller.rb +26 -11
  29. data/app/views/admin/admin_comments/_comment.html.slim +1 -1
  30. data/app/views/admin/base/_search_layout.html.slim +5 -6
  31. data/app/views/admin/base/index.html.slim +9 -10
  32. data/app/views/admin/fileupload/_container.html.slim +2 -1
  33. data/app/views/admin/locators/edit.html.slim +2 -2
  34. data/app/views/admin/locators/show.html.slim +2 -2
  35. data/app/views/admin/manager/_table.html.slim +2 -2
  36. data/app/views/admin/settings/_form.html.slim +3 -2
  37. data/app/views/admin/shared/_content_actions.html.slim +1 -1
  38. data/app/views/admin/shared/_flash.js.erb +2 -2
  39. data/config/routes.rb +13 -13
  40. data/lib/ab_admin.rb +13 -0
  41. data/lib/ab_admin/abstract_resource.rb +0 -4
  42. data/lib/ab_admin/concerns/admin_addition.rb +5 -1
  43. data/lib/ab_admin/concerns/has_tracking.rb +1 -1
  44. data/lib/ab_admin/concerns/utilities.rb +2 -1
  45. data/lib/ab_admin/devise.rb +0 -2
  46. data/lib/ab_admin/engine.rb +0 -1
  47. data/lib/ab_admin/hooks.rb +1 -1
  48. data/lib/ab_admin/hooks/globalize_locale_suffix_accessors.rb +29 -2
  49. data/lib/ab_admin/i18n_tools/model_translator.rb +1 -1
  50. data/lib/ab_admin/menu/group.rb +10 -1
  51. data/lib/ab_admin/menu/item.rb +5 -4
  52. data/lib/ab_admin/models/asset.rb +2 -1
  53. data/lib/ab_admin/models/settings.rb +24 -22
  54. data/lib/ab_admin/models/user.rb +8 -4
  55. data/lib/ab_admin/utils.rb +4 -4
  56. data/lib/ab_admin/utils/logger.rb +1 -1
  57. data/lib/ab_admin/version.rb +1 -1
  58. data/lib/ab_admin/views/admin_helpers.rb +4 -0
  59. data/lib/ab_admin/views/admin_navigation_helpers.rb +1 -0
  60. data/lib/ab_admin/views/inputs/ckeditor_input.rb +1 -1
  61. data/lib/ab_admin/views/inputs/color_input.rb +1 -1
  62. data/lib/ab_admin/views/inputs/date_time_picker_input.rb +1 -3
  63. data/lib/ab_admin/views/inputs/editor_input.rb +1 -1
  64. data/lib/ab_admin/views/inputs/token_input.rb +1 -3
  65. data/lib/ab_admin/views/inputs/uploader_input.rb +2 -2
  66. data/lib/ab_admin/views/search_form_builder.rb +23 -12
  67. data/lib/generators/ab_admin/install/install_generator.rb +0 -2
  68. data/lib/generators/ab_admin/install/templates/config/ab_admin.rb.erb +3 -5
  69. data/lib/generators/ab_admin/install/templates/config/nginx.conf +2 -1
  70. data/lib/generators/template.rb +2 -6
  71. metadata +29 -31
  72. data/lib/generators/ab_admin/install/templates/config/unicorn/production.rb +0 -49
  73. data/lib/generators/ab_admin/install/templates/script/unicorn.sh +0 -75
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 950054e682380c39155c5f4f1fb1727242ffe375
4
- data.tar.gz: 399c85e16c87b277a2f360eaeb4fb1dae08e2c8e
3
+ metadata.gz: f4b41478c7820e45d9a9deae90db880543e42050
4
+ data.tar.gz: 7c53e52bcde99999c83faf3105c3f7be082176be
5
5
  SHA512:
6
- metadata.gz: 5d98d2191b2c4b2178f22766d32f248101408f6ed6ee515aa0d5bcd8ae0700a28a9934fe36bc1d9c779459b1084cd137f6e7bb8fdd8106e7e44f09acd0a78e2f
7
- data.tar.gz: 95545153ff5019b13e296e08287d50d6a6d1d55c886ac33edab38c385daa7f3c336b8035b63c45388670af508dc42e5dc9cb036e17b047809d328acca00ca432
6
+ metadata.gz: 0e43c703029a62700cf443d0460991011e5a3520569a03640d3e08afe30c59584c4fd5429bff961ce4575efb6630fa1f9fa8066b2afaf394a6298845aaf4a2a4
7
+ data.tar.gz: 520fbc9ebf7047fa5b9dff9ed8f433d2b15dc7e1feef02d933d5839ffe511b4fcc74b02fc2a8f0d92552cc5079b674a3443e1a86a7c5dccc3a6c06b43a3e0bae
data/README.md CHANGED
@@ -7,10 +7,10 @@ Simple and real-life tested Rails::Engine admin interface based on slim, bootstr
7
7
  To build a new Rails application with AbAdmin, run:
8
8
 
9
9
  ```bash
10
- rails new [MyAppName] -m https://raw2.github.com/leschenko/ab_admin/master/lib/generators/template.rb
10
+ rails new [my_app_name] -m https://raw.githubusercontent.com/leschenko/ab_admin/master/lib/generators/template.rb
11
11
  ```
12
12
 
13
- Or add gems from template [list of gems](https://raw2.github.com/leschenko/ab_admin/master/lib/generators/template.rb) to an existing application and run generators:
13
+ Or add gems from template [list of gems](https://raw.githubusercontent.com/leschenko/ab_admin/master/lib/generators/template.rb) to an existing application and run generators:
14
14
 
15
15
  ```bash
16
16
  rails generate devise:install
@@ -16,7 +16,7 @@ class window.AdminAssets extends BaseAssets
16
16
  showErrors: (e, data) ->
17
17
  errors = _.map(data.files,(file) ->
18
18
  [file.name, "<b>#{file.error}</b>"].join(' - ')).join('<br/>')
19
- bootbox.alert(errors)
19
+ bootbox.alert("<h3>#{errors}</h3>")
20
20
 
21
21
  initHandlers: ->
22
22
  super
@@ -37,3 +37,5 @@ class window.Locator
37
37
  text = $el.val().replace(/'/, '\'')
38
38
  $('#locale_data tr').hide()
39
39
  $("#locale_data td:nth-child(#{ind}):contains('#{text}')").parent().show()
40
+
41
+ $('.filter_field[value]').keyup()
@@ -143,26 +143,27 @@ class window.Select2Bridge
143
143
 
144
144
  fetchAjaxParams: (term, page) =>
145
145
  cond = {}
146
- if @el.data('c')
146
+ condData = JSON.parse(@el.attr('data-c') || null)
147
+ if condData
147
148
  for kind in ['with', 'without']
148
- if @el.data('c')[kind]
149
+ if condData[kind]
149
150
  cond[kind] ||= {}
150
- for attr, id of @el.data('c')[kind]
151
+ for attr, id of condData[kind]
151
152
  value = $('#' + id).val()
152
153
  cond[kind][attr] = value if value
153
154
 
154
155
  for kind in ['with_term', 'without_term']
155
- if @el.data('c')[kind]
156
+ if condData[kind]
156
157
  kind_key = kind.replace(/_term$/, '')
157
158
  cond[kind_key] ||= {}
158
- for attr, value of @el.data('c')[kind]
159
+ for attr, value of condData[kind]
159
160
  cond[kind_key][attr] = value if value
160
161
 
161
162
  for kind in ['with_selector', 'without_selector']
162
- if @el.data('c')[kind]
163
+ if condData[kind]
163
164
  kind_key = kind.replace(/_selector$/, '')
164
165
  cond[kind_key] ||= {}
165
- for attr, value of @el.data('c')[kind]
166
+ for attr, value of condData[kind]
166
167
  selectors = value.split(/\s+/)
167
168
  value = @el.closest(selectors[1] || 'html').find(selectors[0]).val()
168
169
  cond[kind_key][attr] = value if value
@@ -1,6 +1,6 @@
1
1
  $.rails.allowAction = (element) ->
2
2
  message = element.data("confirm")
3
3
  return true unless message
4
- bootbox.confirm message, (answer) ->
4
+ bootbox.confirm "<h3>#{message}</h3>", (answer) ->
5
5
  element.data('confirm', null).click() if answer
6
6
  false
@@ -15,7 +15,7 @@ $ ->
15
15
  $(document).trigger('admin:list_init')
16
16
 
17
17
  $('.per_page').click ->
18
- $.cookie('pp', $(this).data('val'))
18
+ $.cookie('pp', $(this).data('val'), {path: window.location.pathname})
19
19
 
20
20
  $('#list').on 'click', 'tr.list_edit .form_cancel', ->
21
21
  e.preventDefault()
@@ -39,10 +39,11 @@ $ ->
39
39
  $(document).trigger({type: 'admin:init', pjax: true})
40
40
  $(document).trigger({type: 'admin:init'})
41
41
 
42
- $(document).on 'dblclick', '#list > tbody > tr', (e) ->
43
- e.preventDefault()
44
- unless $(e.target).closest('#list > tbody > tr > td').hasClass('list_adds')
45
- $(this).find('td a.resource_id_link').toHref()
42
+ if window.fv?.list_dblclick
43
+ $(document).on 'dblclick', '#list > tbody > tr', (e) ->
44
+ e.preventDefault()
45
+ unless $(e.target).closest('#list > tbody > tr > td').hasClass('list_adds')
46
+ $(this).find('td a.resource_id_link').toHref()
46
47
 
47
48
  initFancySelect()
48
49
  initNestedFields()
@@ -161,9 +161,9 @@ window.storeData = (key, data) ->
161
161
  str = JSON.stringify(data)
162
162
  else
163
163
  str = '' + data
164
- if window.localStorage
164
+ try
165
165
  window.localStorage[key] = str
166
- else
166
+ catch
167
167
  $.cookie(key, str, {path: '/'})
168
168
 
169
169
  window.fetchData = (key) ->
@@ -21,7 +21,7 @@ class Admin::BaseController < ::InheritedResources::Base
21
21
 
22
22
  helper_method :button_scopes, :collection_action?, :action_items, :resource_action_items,
23
23
  :preview_resource_path, :get_subject, :settings, :batch_action_list, :tree_node_renderer,
24
- :normalized_index_views, :current_index_view, :pjax?, :xhr?
24
+ :normalized_index_views, :current_index_view, :pjax?, :xhr?, :max_per_page
25
25
 
26
26
  rescue_from ::CanCan::AccessDenied, with: :render_unauthorized
27
27
 
@@ -181,8 +181,15 @@ class Admin::BaseController < ::InheritedResources::Base
181
181
  end
182
182
 
183
183
  def settings
184
- {index_view: 'table', sidebar: collection_action?, well: (collection_action? || %w(show history).include?(action_name)),
185
- search: true, batch: true, hotkeys: true}
184
+ {
185
+ index_view: 'table',
186
+ sidebar: collection_action?,
187
+ well: (collection_action? || %w(show history).include?(action_name)),
188
+ search: true,
189
+ batch: true,
190
+ hotkeys: true,
191
+ list_dblclick: true
192
+ }
186
193
  end
187
194
 
188
195
  def action_items
@@ -246,16 +253,20 @@ class Admin::BaseController < ::InheritedResources::Base
246
253
  end
247
254
 
248
255
  def collection
249
- @collection ||= search_collection.paginate(page: params[:page], per_page: per_page, large: true)
256
+ @collection ||= begin
257
+ result = search_collection
258
+ result = result.paginate(page: params[:page], per_page: per_page, large: true) if action_name != 'batch' && !settings[:skip_pagination]
259
+ result
260
+ end
250
261
  end
251
262
 
252
263
  def per_page
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
256
- else
257
- params[:per_page] = request_per_page
258
- end
264
+ request_per_page = (params[:per_page].presence || cookies[:pp].presence).to_i.nonzero?
265
+ params[:per_page] = [request_per_page || AbAdmin.view_default_per_page[current_index_view.to_sym], max_per_page].min
266
+ end
267
+
268
+ def max_per_page
269
+ settings[:max_per_page] || AbAdmin.max_per_page
259
270
  end
260
271
 
261
272
  def set_layout
@@ -309,7 +320,12 @@ class Admin::BaseController < ::InheritedResources::Base
309
320
  fv.bg_color = current_user.bg_color
310
321
  fv.admin = admin?
311
322
  fv.hotkeys = settings[:hotkeys]
323
+ fv.list_dblclick = settings[:list_dblclick]
312
324
  fv.env = Rails.env
325
+ if resource_class.respond_to?(:model_name)
326
+ fv.resource_plural = resource_class.model_name.plural
327
+ fv.resource_singular = resource_class.model_name.singular
328
+ end
313
329
  if AbAdmin.test_env?
314
330
  fv.test = true
315
331
  AbAdmin.test_settings.each { |k, v| fv[k] = v }
@@ -397,5 +413,4 @@ class Admin::BaseController < ::InheritedResources::Base
397
413
  {root: false}
398
414
  end
399
415
  end
400
-
401
416
  end
@@ -2,7 +2,7 @@
2
2
  .span5
3
3
  strong
4
4
  - if comment.user_id
5
- =' link_to comment.user_name, admin_user_path(id: comment.user_id), target: '_blank'
5
+ => link_to comment.user_name, admin_user_path(id: comment.user_id), target: '_blank'
6
6
  div.muted= l(comment.created_at, format: :long)
7
7
  div= comment.body
8
8
 
@@ -2,9 +2,8 @@
2
2
  #toggle_sidebar_on.btn.btn-large = icon('chevron-right')
3
3
  h3= t('admin.search.title')
4
4
  = search_admin_form_for @search, url: collection_path do |f|
5
- - cache [I18n.locale, 'search_form_inside', resource_class.name, params[:q].hash, current_user.user_role_id] do
6
- = render 'search_form', f: f
7
- br
8
- div
9
- = f.submit t('admin.search.submit'), class: 'btn btn-success btn-large'
10
- = f.submit t('admin.search.cancel'), class: 'btn', id: 'search_cancel'
5
+ = render 'search_form', f: f
6
+ br
7
+ div
8
+ = f.submit t('admin.search.submit'), class: 'btn btn-success btn-large'
9
+ = f.submit t('admin.search.cancel'), class: 'btn', id: 'search_cancel'
@@ -1,18 +1,17 @@
1
- /- if settings[:index_view] == 'table'
2
1
  = form_tag url_for(action: :batch), id: 'batch_action_form', class: 'pjax-form' do
3
2
  input name='batch_action' id='batch_action' type='hidden'
4
3
  = render 'admin/shared/content_actions'
5
4
 
6
5
  #content= render current_index_view
7
- .pagination-wrap.pull-left
8
- = will_paginate collection, renderer: BootstrapPagination::Rails
9
- .pagination_info= pagination_info collection
10
- .btn-toolbar.pull-right.pjax_links
11
- .btn-group
12
- - [50, 100, 500, 1000].each do |c|
13
- a.btn.per_page data-val=c href=url_for(params.merge(per_page: c)) class=('active' if c == collection.per_page) = c
6
+ - unless settings[:skip_pagination]
7
+ .pagination-wrap.pull-left
8
+ = will_paginate collection, renderer: BootstrapPagination::Rails
9
+ .pagination_info= pagination_info collection
10
+ .btn-toolbar.pull-right.pjax_links
11
+ .btn-group
12
+ - per_page_variants.each do |c|
13
+ a.btn.per_page data-val=c href=url_for(params.merge(per_page: c)) class=('active' if c == collection.per_page) = c
14
14
 
15
15
  - if pjax? && flash.present?
16
- - flash.each do |type, message|
17
- = javascript_tag %[flash("#{j message}", "#{type}")]
16
+ script type='text/javascript' = render partial: 'admin/shared/flash', formats: :js, local_assigns: {flash: flash}
18
17
 
@@ -8,7 +8,8 @@
8
8
  .fileupload-edit-button.btn.pull-left= t('admin.actions.edit.link')
9
9
 
10
10
  .fileupload-info
11
- .fileupload-info-extensions= options[:extensions].join(', ')
11
+ - if options[:extensions]
12
+ .fileupload-info-extensions= options[:extensions].join(', ')
12
13
  .fileupload-info-max_size== "#{t('admin.fileupload.max_size')}: <b>#{options[:max_size]}</b> MB"
13
14
 
14
15
  = init_js("new AdminAssets(#{js_options.to_json})")
@@ -20,9 +20,9 @@ table.table.table-bordered.table-striped
20
20
  th = locale_file.locale
21
21
  th = I18n.default_locale
22
22
  tr
23
- - 3.times do
23
+ - [:key_contains, :edit_locale_contains, :main_locale_contains].each do |param|
24
24
  th
25
- input.filter_field type='text' placeholder=t('admin.locators.filter')
25
+ input.filter_field type='text' value=params[param] placeholder=t('admin.locators.filter')
26
26
  = form_tag(admin_locators_path, method: :put) do
27
27
  tbody#locale_data
28
28
  = hidden_field_tag 'edit_locale_name', locale_file.locale
@@ -9,5 +9,5 @@ table.table.table-striped.table-bordered style='width: 1050px;'
9
9
  td= filename.to_s[/\w+/]
10
10
  td= link_to filename, edit_admin_locators_path(filename: filename)
11
11
 
12
- =' link_to t('admin.locators.prepare'), prepare_admin_locators_path, class: 'btn btn-warning', method: :post
13
- =' link_to t('admin.locators.restart'), reload_admin_locators_path, class: 'btn btn-primary', method: :post
12
+ => link_to t('admin.locators.prepare'), prepare_admin_locators_path, class: 'btn btn-warning', method: :post
13
+ => link_to t('admin.locators.restart'), reload_admin_locators_path, class: 'btn btn-primary', method: :post
@@ -16,11 +16,11 @@
16
16
  = list_sort_link field.name, opts
17
17
  - else
18
18
  = field.name.is_a?(Symbol) ? ha(field.name) : field.name
19
- th=t 'admin.table.actions'
19
+ th= t 'admin.table.actions'
20
20
  tbody
21
21
  - is_edit_link = manager.actions.include?(:edit)
22
22
  - collection.each do |item|
23
- tr id=dom_id(item, 'list')
23
+ tr id=dom_id(item, 'list') class=(table_builder.options[:row_class].call(item) if table_builder.options[:row_class])
24
24
  = batch_action_item(item)
25
25
  td= id_link(item, edit: is_edit_link)
26
26
  - table_builder.fields.each do |field|
@@ -21,7 +21,8 @@
21
21
 
22
22
  br
23
23
  br
24
- =' submit_tag(t('admin.form.save'), class: 'btn btn-primary')
25
- =' link_to t('admin.cache_clear'), cache_clear_admin_settings_path, class: 'btn btn-danger', method: :post, remote: true
24
+ - if collection.present?
25
+ => submit_tag(t('admin.form.save'), class: 'btn btn-primary')
26
+ => link_to t('admin.cache_clear'), cache_clear_admin_settings_path, class: 'btn btn-danger', method: :post, remote: true
26
27
 
27
28
  = init_js('$("form ul.nav-tabs li:first, form .tab-pane:first").addClass("active")')
@@ -25,7 +25,7 @@
25
25
  - normalized_index_views.each do |index_view|
26
26
  = index_view_link(index_view)
27
27
 
28
- - if can? :export, resource_class
28
+ - if can?(:export, resource_class) && !settings[:skip_export]
29
29
  .btn-group.downloads
30
30
  = icon('download-alt')
31
31
  /- %w(csv xls json).each do |format|
@@ -1,3 +1,3 @@
1
- <% flash.each do |k, v| %>
2
- flash("<%= j v %>", "<%= k %>");
1
+ <% flash.each do |type, message| %>
2
+ flash("<%= j message.html_safe %>", "<%= type %>");
3
3
  <% end unless flash.empty? %>
@@ -33,24 +33,24 @@ Rails.application.routes.draw do
33
33
 
34
34
  post 'translate' => AbAdmin::I18nTools::TranslateApp
35
35
 
36
- controller 'manager' do
36
+ controller 'manager', constraints: {format: /(html|js|json|xml|csv|xls|xlsx)/} do
37
37
  scope '(/:parent_resource/:parent_resource_id)/:model_name' do
38
- get '/new', to: :new, as: 'new'
39
- post '/batch', to: :batch, as: 'batch'
40
- post '/rebuild', to: :rebuild, as: 'rebuild'
41
- match '/custom_action', to: :custom_action, as: 'collection_action', via: :all
38
+ get '/new', action: :new, as: 'new'
39
+ post '/batch', action: :batch, as: 'batch'
40
+ post '/rebuild', action: :rebuild, as: 'rebuild'
41
+ match '/custom_action', action: :custom_action, as: 'collection_action', via: :all
42
42
 
43
43
  scope ':id' do
44
- get '/edit', to: :edit, as: 'edit'
45
- get '/history', to: :history, as: 'history'
46
- match '/custom_action', to: :custom_action, as: 'member_action', via: :all
47
- get '/', to: :show, as: 'show'
48
- patch '/', to: :update, as: 'update'
49
- delete '/', to: :destroy, as: 'destroy'
44
+ get '/edit', action: :edit, as: 'edit'
45
+ get '/history', action: :history, as: 'history'
46
+ match '/custom_action', action: :custom_action, as: 'member_action', via: :all
47
+ get '/', action: :show, as: 'show'
48
+ patch '/', action: :update, as: 'update'
49
+ delete '/', action: :destroy, as: 'destroy'
50
50
  end
51
51
 
52
- get '/', to: :index, as: 'index'
53
- post '/', to: :create, as: 'create'
52
+ get '/', action: :index, as: 'index'
53
+ post '/', action: :create, as: 'create'
54
54
  end
55
55
  end
56
56
 
@@ -164,6 +164,19 @@ module AbAdmin
164
164
 
165
165
  mattr_accessor :base_url
166
166
 
167
+ mattr_accessor :default_per_page
168
+ @@default_per_page = 50
169
+
170
+ mattr_accessor :view_default_per_page
171
+ @@view_default_per_page = Hash.new { AbAdmin.default_per_page }
172
+ @@view_default_per_page[:tree] = 1000
173
+
174
+ mattr_accessor :max_per_page
175
+ @@max_per_page = Float::INFINITY
176
+
177
+ mattr_accessor :per_page_variants
178
+ @@per_page_variants = [50, 100, 500, 1000]
179
+
167
180
  extend Utils
168
181
 
169
182
  def self.setup
@@ -1,7 +1,5 @@
1
1
  module AbAdmin
2
2
  class AbstractResource
3
- #unloadable
4
-
5
3
  include Singleton
6
4
 
7
5
  unless self.const_defined?(:ACTIONS)
@@ -165,7 +163,5 @@ module AbAdmin
165
163
  def has_module?(module_constant)
166
164
  model.included_modules.include?(module_constant)
167
165
  end
168
-
169
166
  end
170
-
171
167
  end
@@ -6,7 +6,7 @@ module AbAdmin
6
6
  included do
7
7
  scope(:admin, -> { all }) unless respond_to?(:admin)
8
8
  scope(:base, -> { all }) unless respond_to?(:base)
9
- scope :by_ids, lambda { |ids| where("#{quoted_table_name}.id IN (?)", AbAdmin.val_to_array(ids).push(0)) }
9
+ scope :by_ids, lambda { |ids| where("#{quoted_table_name}.id IN (?)", AbAdmin.val_to_array(ids).push(0)) } unless respond_to?(:by_ids)
10
10
 
11
11
  class_attribute :batch_actions, instance_writer: false
12
12
  self.batch_actions = [:destroy]
@@ -27,6 +27,10 @@ module AbAdmin
27
27
  "#{self.class.model_name.human(count: 1)} ##{self.id} #{AbAdmin.safe_display_name(self)}"
28
28
  end
29
29
 
30
+ def translated_any(attr)
31
+ send(attr).presence || translations.detect { |r| r.send(attr).present? }.try!(attr)
32
+ end
33
+
30
34
  def new_changes
31
35
  exclude_attrs = respond_to?(:translated_attribute_names) ? translated_attribute_names.dup : []
32
36
  exclude_attrs << :updated_at