ab_admin 0.6.1 → 0.7.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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +6 -2
  3. data/app/assets/javascripts/ab_admin/components/base_assets.js.coffee +9 -0
  4. data/app/assets/javascripts/ab_admin/components/gmaps.js.coffee +1 -1
  5. data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +6 -0
  6. data/app/assets/javascripts/ab_admin/components/select2_bridge.js.coffee +2 -2
  7. data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +52 -12
  8. data/app/assets/javascripts/ab_admin/core/init.js.coffee +2 -0
  9. data/app/assets/javascripts/ab_admin/core/pjax.js.coffee +3 -2
  10. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +3 -4
  11. data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.scss +4 -0
  12. data/app/assets/stylesheets/ab_admin/components/_colored_tabs.scss +4 -0
  13. data/app/assets/stylesheets/ab_admin/components/_form.scss +36 -3
  14. data/app/controllers/admin/admin_comments_controller.rb +4 -0
  15. data/app/controllers/admin/assets_controller.rb +5 -2
  16. data/app/controllers/admin/base_controller.rb +50 -41
  17. data/app/controllers/admin/locators_controller.rb +1 -1
  18. data/app/controllers/admin/manager_controller.rb +32 -3
  19. data/app/controllers/admin/settings_controller.rb +2 -3
  20. data/app/controllers/admin/static_pages_controller.rb +5 -0
  21. data/app/controllers/admin/structures_controller.rb +10 -4
  22. data/app/controllers/admin/users_controller.rb +9 -2
  23. data/app/views/admin/base/_search_layout.html.slim +0 -1
  24. data/app/views/admin/base/index.html.slim +1 -2
  25. data/app/views/admin/fileupload/_container.html.slim +17 -10
  26. data/app/views/admin/shared/_content_actions.html.slim +18 -6
  27. data/app/views/admin/shared/_locale_tabs.html.slim +3 -3
  28. data/app/views/admin/structures/_form.html.slim +2 -1
  29. data/app/views/layouts/admin/_footer.html.slim +5 -4
  30. data/app/views/layouts/admin/application.html.slim +2 -0
  31. data/config/locales/ru.yml +1 -0
  32. data/config/routes.rb +17 -22
  33. data/lib/ab_admin.rb +11 -1
  34. data/lib/ab_admin/abstract_resource.rb +11 -2
  35. data/lib/ab_admin/carrierwave/base_uploader.rb +45 -25
  36. data/lib/ab_admin/carrierwave/file_size_validator.rb +0 -1
  37. data/lib/ab_admin/carrierwave/glue.rb +2 -4
  38. data/lib/ab_admin/concerns/admin_addition.rb +12 -4
  39. data/lib/ab_admin/concerns/deep_cloneable.rb +0 -1
  40. data/lib/ab_admin/concerns/fileuploads.rb +0 -1
  41. data/lib/ab_admin/concerns/headerable.rb +0 -4
  42. data/lib/ab_admin/concerns/nested_set.rb +2 -3
  43. data/lib/ab_admin/concerns/reloadable.rb +0 -2
  44. data/lib/ab_admin/concerns/silencer.rb +0 -3
  45. data/lib/ab_admin/concerns/utilities.rb +2 -4
  46. data/lib/ab_admin/concerns/validations.rb +1 -1
  47. data/lib/ab_admin/config/base.rb +26 -6
  48. data/lib/ab_admin/controllers/callbacks.rb +6 -6
  49. data/lib/ab_admin/controllers/head_options.rb +0 -1
  50. data/lib/ab_admin/controllers/tree.rb +0 -2
  51. data/lib/ab_admin/core_ext.rb +1 -1
  52. data/lib/ab_admin/core_ext/array.rb +0 -1
  53. data/lib/ab_admin/core_ext/hash.rb +11 -0
  54. data/lib/ab_admin/core_ext/string.rb +0 -1
  55. data/lib/ab_admin/devise.rb +1 -1
  56. data/lib/ab_admin/engine.rb +2 -1
  57. data/lib/ab_admin/hooks/globalize_locale_suffix_accessors.rb +17 -31
  58. data/lib/ab_admin/hooks/will_paginate_no_uri.rb +1 -1
  59. data/lib/ab_admin/i18n_tools/google_translate.rb +0 -1
  60. data/lib/ab_admin/i18n_tools/translate_app.rb +0 -1
  61. data/lib/ab_admin/menu/builder.rb +3 -2
  62. data/lib/ab_admin/menu/group.rb +3 -1
  63. data/lib/ab_admin/models/asset.rb +9 -6
  64. data/lib/ab_admin/models/header.rb +2 -3
  65. data/lib/ab_admin/models/locator.rb +1 -1
  66. data/lib/ab_admin/models/settings.rb +6 -6
  67. data/lib/ab_admin/models/structure.rb +0 -6
  68. data/lib/ab_admin/models/track.rb +12 -3
  69. data/lib/ab_admin/models/type_model.rb +0 -1
  70. data/lib/ab_admin/models/user.rb +0 -1
  71. data/lib/ab_admin/models/validations/all.rb +4 -0
  72. data/lib/ab_admin/models/validations/domain_name_validator.rb +9 -0
  73. data/lib/ab_admin/models/validations/email_validator.rb +9 -0
  74. data/lib/ab_admin/utils.rb +12 -4
  75. data/lib/ab_admin/utils/eval_helpers.rb +1 -1
  76. data/lib/ab_admin/utils/logger.rb +0 -2
  77. data/lib/ab_admin/utils/xls_document.rb +25 -6
  78. data/lib/ab_admin/version.rb +1 -1
  79. data/lib/ab_admin/views/admin_helpers.rb +5 -4
  80. data/lib/ab_admin/views/admin_navigation_helpers.rb +16 -5
  81. data/lib/ab_admin/views/form_builder.rb +41 -10
  82. data/lib/ab_admin/views/helpers.rb +0 -2
  83. data/lib/ab_admin/views/inputs/uploader_input.rb +1 -0
  84. data/lib/ab_admin/views/search_form_builder.rb +33 -7
  85. data/lib/generators/ab_admin/ckeditor_assets/ckeditor_assets_generator.rb +0 -1
  86. data/lib/generators/ab_admin/glob/glob_generator.rb +2 -2
  87. data/lib/generators/ab_admin/glob/templates/migration.erb +1 -1
  88. data/lib/generators/ab_admin/install/install_generator.rb +0 -1
  89. data/lib/generators/ab_admin/install/templates/config/seeds.rb +0 -2
  90. data/lib/generators/ab_admin/install/templates/helpers/admin/structures_helper.rb +1 -4
  91. data/lib/generators/ab_admin/install/templates/models/admin_comment.rb +1 -3
  92. data/lib/generators/ab_admin/install/templates/models/asset.rb +3 -5
  93. data/lib/generators/ab_admin/install/templates/models/header.rb +1 -5
  94. data/lib/generators/ab_admin/install/templates/models/static_page.rb +1 -4
  95. data/lib/generators/ab_admin/install/templates/models/structure.rb +1 -5
  96. data/lib/generators/ab_admin/install/templates/models/track.rb +1 -2
  97. data/lib/generators/ab_admin/install/templates/models/user.rb +1 -9
  98. data/lib/generators/ab_admin/install/templates/uploaders/attachment_file_uploader.rb +1 -1
  99. data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +1 -1
  100. data/lib/generators/ab_admin/install/templates/uploaders/picture_uploader.rb +1 -1
  101. data/lib/generators/ab_admin/model/templates/resource.erb +1 -0
  102. data/lib/generators/template.rb +39 -59
  103. metadata +38 -36
  104. data/lib/ab_admin/hooks/active_model_attr_accessible_few_roles.rb +0 -50
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 07cf0aa2ce7c13f970015d489ec04b5d6bbb3e99
4
- data.tar.gz: 568de144f99ceb62940e015ee41379ce70d76002
3
+ metadata.gz: aaedc8d3ac86c03428e71248fb4dcd4d21f04627
4
+ data.tar.gz: 184c8970705793cb444da77d63d9d96b7f7952fb
5
5
  SHA512:
6
- metadata.gz: 4cb44209d391674ea609b3a3b154d1103f3bbcf56aed44f3f13a6f5a06a176f2189c17ad4fd65f7a9bf5325e542c9d6c2794b7411b11cf769dda97fd0fc0f5d1
7
- data.tar.gz: 426d9d87810a841b6b04b2429d26ba548aae20e8f5e59f38224707d54c57affadf38d1533d5d307b96ac58b72f85e4fc90140cf756a718a202acafc235fda562
6
+ metadata.gz: beb13940643e8e8480cf0cd61b3071722b7ce2fef2cb15669b52bd7e335276d3a565679f002ac619259c9cdb16d24a0e34a449da973d2204233798b0eecaff14
7
+ data.tar.gz: be2111af7a9ebb8462c57acc04f8d66b94b0d96dd42fa26c6bf01f5a5f4114e5013c221daa24b09c2db2fae6e93c5ce173936ee6e55a11e5d0e3e06a50575e9d
@@ -18,6 +18,10 @@ class window.AdminAssets extends BaseAssets
18
18
  [file.name, "<b>#{file.error}</b>"].join(' - ')).join('<br/>')
19
19
  bootbox.alert("<h3>#{errors}</h3>")
20
20
 
21
+ initDisabled: ->
22
+ super
23
+ @initFancybox() if $.fn.fancybox
24
+
21
25
  initHandlers: ->
22
26
  super
23
27
  @initFancybox() if $.fn.fancybox
@@ -25,7 +29,7 @@ class window.AdminAssets extends BaseAssets
25
29
  @initEditMeta() if @options.edit_meta
26
30
 
27
31
  initFancybox: =>
28
- @list.find(" a.fancybox")
32
+ @list.find("a.fancybox")
29
33
  .click (e) ->
30
34
  e.preventDefault()
31
35
  .fancybox
@@ -48,7 +52,7 @@ class window.AdminAssets extends BaseAssets
48
52
  bootbox.dialog(data, [
49
53
  {label: I18n.t('admin.js.cancel'), class: ' '},
50
54
  {label: I18n.t('admin.js.save'), class: 'btn-primary btn-large fileupload-edit-submit', callback: -> $('form.fileupload-edit-form').submit()}
51
- ])
55
+ ], {animate: false})
52
56
  max_h = $(window).height() - 100
53
57
  $('.bootbox.modal').css
54
58
  height: max_h
@@ -3,6 +3,15 @@ class window.BaseAssets
3
3
  @el = $('#' + @options.container_id)
4
4
  @el.data('assets', this)
5
5
  @list = @el.find('.fileupload-list')
6
+ if @options.disabled
7
+ @initDisabled()
8
+ else
9
+ @initEnabled()
10
+
11
+ initDisabled: ->
12
+ @el.find('.destroy_asset, .rotate_image, .main_image').hide()
13
+
14
+ initEnabled: ->
6
15
  @files_in_progress = 0
7
16
  @template = Handlebars.compile($("##{@options.asset_template}_template").html())
8
17
  @initFileupload()
@@ -85,7 +85,7 @@ class window.GeoInput
85
85
  marker_defaults =
86
86
  position: @point,
87
87
  map: @map,
88
- draggable: true
88
+ draggable: !@options.disabled
89
89
 
90
90
  @options.marker_options ||= {}
91
91
  _.defaults(@options.marker_options, marker_defaults)
@@ -42,3 +42,9 @@ $(document).on 'admin:init', (e) ->
42
42
  withCredentials: true
43
43
  headers:
44
44
  Accept: 'application/json'
45
+ $ ->
46
+ _.each $('.editable'), (el) ->
47
+ $el = $(el)
48
+ return unless $el.data('type') == 'select2'
49
+ options = new window.Select2Bridge($el, false).buildOptions()
50
+ $el.data('select2', options)
@@ -1,9 +1,9 @@
1
1
  class window.Select2Bridge
2
- constructor: (@el) ->
2
+ constructor: (@el, init = true) ->
3
3
  return if fv.test && !fv.enable_fancy_select
4
4
  @el.prop('required', null)
5
5
  @modal = $('#modal_form')
6
- @el.select2 @buildOptions()
6
+ @el.select2(@buildOptions()) if init
7
7
  @initHandlers()
8
8
  @initSortable() if @el.data('sortable')
9
9
 
@@ -5,19 +5,46 @@ $ ->
5
5
  checked = $(this).is(":checked")
6
6
  $("#list [name='#{input_name}[]']").attr "checked", checked
7
7
  $('#list tbody tr').toggleClass('active_row', checked)
8
+ $('#list').data('lastChecked', null) unless checked
8
9
 
9
- $(document).on 'click', '#list input.batch_check', ->
10
- $(this).closest('tr').toggleClass('active_row')
10
+ $(document).on 'click', '#list input.batch_check', (e) ->
11
+ $el = $(this).closest('tr')
12
+ $wrap = $('#list')
13
+ if $el.hasClass('active_row')
14
+ $wrap.data('lastChecked', null)
15
+ $el.removeClass('active_row')
16
+ else
17
+ $el.addClass('active_row')
18
+ if e.shiftKey && $wrap.data('lastChecked')
19
+ $prev = $wrap.data('lastChecked')
20
+ idx = [$prev.index(), $el.index()].sort()
21
+ $items = $("#list > tbody > tr:eq(#{idx[0]})").nextUntil("#list > tbody > tr:eq(#{idx[1]})")
22
+ $items.addClass('active_row')
23
+ $items.find('> td:first input').attr('checked', true)
24
+ $wrap.data('lastChecked', $el)
11
25
 
12
- submitBatch = (el) ->
13
- if $("#list [name='#{input_name}[]']:checked")[0]
14
- $el = $(el)
15
- ids = $("#list [name='#{input_name}[]']:checked").map(-> $(this).val()).get()
16
- action = $el.data('action')
17
- $('#batch_action').val(action)
18
- $form = $('#batch_action_form')
19
- $form.append("<input type='checkbox' name='#{input_name}[]' checked='1' value='#{id}' style='display:none;'/>") for id in ids
20
- $form.submit()
26
+ batchIds = ->
27
+ $("#list [name='#{input_name}[]']:checked").map(-> $(this).val()).get()
28
+
29
+ idsInputs = ->
30
+ inputs = ''
31
+ for id in batchIds()
32
+ inputs += "<input type='checkbox' name='#{input_name}[]' checked='1' value='#{id}' style='display:none;'/>"
33
+ $(inputs)
34
+
35
+ submitBatch = (el, $extraData = null) ->
36
+ return unless batchIds().length
37
+ $el = $(el)
38
+ action = $el.data('action')
39
+ $('#batch_action').val(action)
40
+ $form = $('#batch_action_form')
41
+ $idsInputs = idsInputs()
42
+ $form.append($idsInputs)
43
+ $form.append($extraData)
44
+ $form.submit()
45
+ $.fancybox.close()
46
+ $extraData?.remove()
47
+ $idsInputs.remove()
21
48
 
22
49
  $(document).on 'click', '#list > tbody > tr', (e) ->
23
50
  return true unless _.include(['TR', 'TD'], e.target.tagName)
@@ -29,5 +56,18 @@ $ ->
29
56
  $el.find('td:first input').attr 'checked', (i, v) -> !v
30
57
 
31
58
  $(document).on 'click confirm:success', '.batch_action_link', (e) ->
59
+ return unless batchIds().length
60
+ e.preventDefault()
61
+ $el = $(this)
62
+ if $el.data('form')
63
+ $form = $($el.data('form'))
64
+ unless $form.find('.js-batch_form_submit').length
65
+ $form.append("<div class='btn btn-primary js-batch_form_submit' data-form=#{$el.data('form')} data-action=#{$el.data('action')}><i class='icon-ok icon-white'></i></div>")
66
+ $form.append("<div class='btn' onclick='$.fancybox.close()'><i class='icon-remove'></i></div>")
67
+ $.fancybox($form)
68
+ else
69
+ submitBatch(this)
70
+
71
+ $(document).on 'click', '.js-batch_form_submit', (e) ->
32
72
  e.preventDefault()
33
- submitBatch(this)
73
+ submitBatch(this, $($(this).data('form')).find('input,textarea,select').clone())
@@ -8,6 +8,8 @@
8
8
  #= require ab_admin/core/columns_hider
9
9
  #= require ab_admin/core/view_layout
10
10
 
11
+ $.fx.off = true if fv.test
12
+
11
13
  $ ->
12
14
  $(document).on 'admin:init', (e) ->
13
15
  clonePagination()
@@ -1,5 +1,6 @@
1
- window.toggleLoading = (is_loading=true) ->
2
- $('#loading').toggle(is_loading)
1
+ window.toggleLoading = (isLoading=true) ->
2
+ $('#loading').toggle(isLoading)
3
+ $.rails.enableFormElements($('#search_form')) unless isLoading
3
4
 
4
5
  $ ->
5
6
  $(document).on 'click', '.pjax, .pagination a, .pjax_links a', (e) ->
@@ -23,13 +23,12 @@ window.initAcFileds = ->
23
23
  width: 220
24
24
 
25
25
  window.initTooltip = ->
26
- $('.do_tooltip').tooltip
26
+ $('.js-tooltip').tooltip
27
27
  animation: false
28
- placement: 'right'
29
28
 
30
- window.initEditor = ->
29
+ window.initEditor = (baseSelector='form') ->
31
30
  return if fv.test
32
- $('form .do_wysihtml5').each ->
31
+ $("#{baseSelector} .do_wysihtml5").each ->
33
32
  $el = $(this)
34
33
  return if $el.hasClass('wysihtml5_done')
35
34
  editor = $el.wysihtml5({html: true, locale: 'ru'}).data('wysihtml5').editor
@@ -70,6 +70,10 @@ img {
70
70
  margin-left: 20px;
71
71
  }
72
72
 
73
+ .control-group.ckeditor textarea {
74
+ max-width: none;
75
+ }
76
+
73
77
  ul.nav li.dropdown:hover ul.dropdown-menu {
74
78
  display: block;
75
79
  margin: 0;
@@ -27,3 +27,7 @@
27
27
  }
28
28
  margin: 20px 0;
29
29
  }
30
+
31
+ .colored_tabs {
32
+ @include colored_tabs(#999);
33
+ }
@@ -72,12 +72,12 @@ input[type="color"],
72
72
  .input-large { width: 210px; }
73
73
  .input-xlarge { width: 270px; }
74
74
  .input-xxlarge { width: 530px; }
75
+ textarea.cke_source {
76
+ max-width: none;
77
+ }
75
78
  }
76
79
 
77
80
  #search_form {
78
- select.input-small {
79
- margin-right: 30px;
80
- }
81
81
  .right-label {
82
82
  padding: 5px 0 0 130px;
83
83
  }
@@ -87,6 +87,39 @@ input[type="color"],
87
87
  label {
88
88
  margin-top: 5px;
89
89
  }
90
+ .string input {
91
+ width: 100%;
92
+ box-sizing: border-box;
93
+ padding: 13px 4px;
94
+ }
95
+ .number .controls {
96
+ select {
97
+ float: left;
98
+ }
99
+ input {
100
+ float: right;
101
+ }
102
+ }
103
+ .date .controls {
104
+ text-align: center;
105
+ line-height: 2.3;
106
+ input:first-child {
107
+ float: left;
108
+ }
109
+ input {
110
+ float: right;
111
+ }
112
+ }
113
+ .select select {
114
+ width: 100%;
115
+ }
116
+ .tooltip.left {
117
+ -moz-transform: translateX(-10px) translateY(-4px);
118
+ -ms-transform: translateX(-10px) translateY(-4px);
119
+ -o-transform: translateX(-10px) translateY(-4px);
120
+ -webkit-transform: translateX(-10px) translateY(-4px);
121
+ transform: translateX(-10px) translateY(-4px);
122
+ }
90
123
  }
91
124
 
92
125
  .datetimepicker-bottom-left-custom {
@@ -28,4 +28,8 @@ class Admin::AdminCommentsController < Admin::BaseController
28
28
  def commentable
29
29
  @commentable ||= AdminComment.find_resource(params[:resource_type], params[:resource_id])
30
30
  end
31
+
32
+ def permitted_params
33
+ params[:admin_comment].try!(:permit, :body, :resource_id, :resource_type, *AbAdmin.default_permitted_params)
34
+ end
31
35
  end
@@ -7,7 +7,7 @@ class Admin::AssetsController < ApplicationController
7
7
  respond_to :json
8
8
 
9
9
  def create
10
- @asset = build_asset(params[:asset])
10
+ @asset = build_asset(permitted_params)
11
11
  @asset.guid = params[:guid]
12
12
  @asset.data = prepared_data
13
13
  @asset.user = current_user
@@ -52,6 +52,10 @@ class Admin::AssetsController < ApplicationController
52
52
 
53
53
  protected
54
54
 
55
+ def permitted_params
56
+ params[:asset].try!(:permit, :data, :is_main, :original_name, :base_filename, *Asset.all_translated_attribute_names)
57
+ end
58
+
55
59
  def find_asset
56
60
  @asset = Asset.find(params[:id])
57
61
  end
@@ -85,5 +89,4 @@ class Admin::AssetsController < ApplicationController
85
89
  end
86
90
  end
87
91
  end
88
-
89
92
  end
@@ -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?, :max_per_page
24
+ :normalized_index_views, :current_index_view, :pjax?, :xhr?, :max_per_page, :params_for_links
25
25
 
26
26
  rescue_from ::CanCan::AccessDenied, with: :render_unauthorized
27
27
 
@@ -31,13 +31,13 @@ class Admin::BaseController < ::InheritedResources::Base
31
31
  format.csv do
32
32
  authorize! :export, resource_class
33
33
  doc = AbAdmin::Utils::CsvDocument.new(collection, export_options)
34
- send_data(doc.render, filename: doc.filename, type: Mime::CSV, disposition: 'attachment')
34
+ send_data(doc.render, filename: doc.filename, type: Mime[:csv], disposition: 'attachment')
35
35
  end
36
- if defined?(Mime::XLSX)
37
- format.xls do
36
+ if Mime[:xlsx]
37
+ format.xlsx do
38
38
  authorize! :export, resource_class
39
39
  doc = AbAdmin::Utils::XlsDocument.new(collection, export_options)
40
- send_data(doc.render, filename: doc.filename, type: Mime::XLSX, disposition: 'attachment')
40
+ send_data(doc.render, filename: doc.filename, type: Mime[:xlsx], disposition: 'attachment')
41
41
  end
42
42
  end
43
43
  end
@@ -95,10 +95,17 @@ class Admin::BaseController < ::InheritedResources::Base
95
95
  if allow_batch_action?(batch_action) && collection.all?{|item| can?(batch_action, item) }
96
96
  if batch_action.to_s.end_with?('_collection')
97
97
  count = collection.size
98
- resource_class.public_send(batch_action, collection)
99
- collection.each { |item| track_action!("batch_#{batch_action}", item) } if settings[:history]
98
+ resource_class.public_send(batch_action, collection, *[params[:batch_params]].compact)
99
+ if settings[:history]
100
+ if Object.const_defined?('ActiveRecord::Import') && Track.respond_to?(:import)
101
+ tracks = collection.map { |item| track_action("batch_#{batch_action}", item) }
102
+ Track.import_from_batch_collection_action(tracks)
103
+ else
104
+ collection.each { |item| track_action!("batch_#{batch_action}", item) }
105
+ end
106
+ end
100
107
  else
101
- count = collection.inject(0) { |c, item| apply_batch_action(item, batch_action) ? c + 1 : c }
108
+ count = collection.inject(0) { |c, item| apply_batch_action(item, batch_action, *[params[:batch_params]].compact) ? c + 1 : c }
102
109
  end
103
110
  batch_action_name = I18n.t("admin.actions.batch_#{batch_action}.title", default: batch_action.to_s.humanize)
104
111
  flash[:success] = I18n.t('admin.batch_actions.status', count: count, action: batch_action_name)
@@ -110,6 +117,14 @@ class Admin::BaseController < ::InheritedResources::Base
110
117
 
111
118
  protected
112
119
 
120
+ def build_resource_params
121
+ permitted_params || params[resource_class.model_name.param_key]
122
+ end
123
+
124
+ def params_for_links
125
+ params.slice(:q, :s, :model_name, :per_page, :page).permit!
126
+ end
127
+
113
128
  def respond_to_format?(format)
114
129
  self.class.mimes_for_respond_to[format]
115
130
  end
@@ -121,18 +136,18 @@ class Admin::BaseController < ::InheritedResources::Base
121
136
  options
122
137
  end
123
138
 
124
- def apply_batch_action(item, batch_action)
125
- success = item.send(batch_action)
139
+ def apply_batch_action(item, batch_action, *batch_params)
140
+ success = item.send(batch_action, *batch_params)
126
141
  track_action!("batch_#{batch_action}", item) if settings[:history]
127
142
  success
128
143
  end
129
144
 
130
145
  def allow_batch_action?(batch_action)
131
- resource_class.batch_actions.include?(batch_action)
146
+ batch_action_list.detect { |a| a.name == batch_action }
132
147
  end
133
148
 
134
149
  def redirect_to_back_or_root
135
- redirect_to request.env['HTTP_REFERER'] ? :back : admin_root_path
150
+ redirect_back fallback_location: admin_root_path
136
151
  end
137
152
 
138
153
  def track_action(key=nil, item=nil)
@@ -147,6 +162,10 @@ class Admin::BaseController < ::InheritedResources::Base
147
162
  self.class.batch_action_list ||= begin
148
163
  resource_class.batch_actions.map do |a|
149
164
  opts = a == :destroy ? {confirm: I18n.t('admin.delete_confirmation')} : {}
165
+ if a.is_a?(Hash)
166
+ opts.merge!(a.except(:name))
167
+ a = a[:name]
168
+ end
150
169
  AbAdmin::Config::BatchAction.new(a, opts)
151
170
  end
152
171
  end
@@ -165,7 +184,7 @@ class Admin::BaseController < ::InheritedResources::Base
165
184
  track_action if settings[:history]
166
185
  end
167
186
 
168
- def interpolation_options
187
+ def flash_interpolation_options
169
188
  return {} if collection_action? || resource.errors.empty?
170
189
  {errors: resource.errors.full_messages.map { |m| "<br/> - #{m}" }.join.html_safe}
171
190
  end
@@ -217,8 +236,16 @@ class Admin::BaseController < ::InheritedResources::Base
217
236
  %w(index search batch rebuild).include?(action_name)
218
237
  end
219
238
 
239
+ def self.scope(name, options={})
240
+ has_scope name, options.without(:badge)
241
+ options[:badge] = {} if options[:badge] && !options[:badge].is_a?(Hash)
242
+ self.button_scopes ||= []
243
+ self.button_scopes << [name, options]
244
+ end
245
+
220
246
  def button_scopes
221
- self.class.button_scopes ||= self.class.scopes_configuration.except(:by_ids).find_all{|_, s| s[:type] == :boolean }.to_h
247
+ self.class.button_scopes ||= self.class.scopes_configuration.except(:by_ids).find_all{|_, s| s[:type] == :boolean }
248
+ self.class.button_scopes.to_h
222
249
  end
223
250
 
224
251
  def add_breadcrumbs
@@ -252,13 +279,17 @@ class Admin::BaseController < ::InheritedResources::Base
252
279
  end
253
280
 
254
281
  def search_collection
255
- params[:q] ||= {}
282
+ query = params[:q].try!{|q| q.permit!.to_h } || {}
256
283
  nested = resource_class.respond_to?(:acts_as_nested_set_options) && current_index_view == 'tree'
257
- params[:q][:s] ||= settings[:default_order] || ('id desc' unless nested)
258
- @search = end_of_association_chain.accessible_by(current_ability).admin.ransack(params[:q].no_blank)
284
+ query[:s] ||= settings[:default_order] || ('id desc' unless nested)
285
+ @search = with_scopes(end_of_association_chain.accessible_by(current_ability).admin).ransack(query.no_blank)
259
286
  @search.result(distinct: @search.object.joins_values.present?)
260
287
  end
261
288
 
289
+ def with_scopes(relation)
290
+ relation
291
+ end
292
+
262
293
  def collection
263
294
  @collection ||= begin
264
295
  result = search_collection
@@ -339,7 +370,6 @@ class Admin::BaseController < ::InheritedResources::Base
339
370
  end
340
371
  end
341
372
 
342
- # utility methods
343
373
  def pjax?
344
374
  request.headers['X-PJAX']
345
375
  end
@@ -348,7 +378,6 @@ class Admin::BaseController < ::InheritedResources::Base
348
378
  request.xhr?
349
379
  end
350
380
 
351
- # user role logic
352
381
  def moderator?
353
382
  user_signed_in? && current_user.moderator?
354
383
  end
@@ -369,34 +398,14 @@ class Admin::BaseController < ::InheritedResources::Base
369
398
  raise CanCan::AccessDenied unless admin?
370
399
  end
371
400
 
372
- def bind_current_user(*args)
401
+ def bind_current_user(*)
373
402
  resource.user_id = current_user.id if !settings[:skip_bind_current_user] && resource.respond_to?(:user_id)
374
403
  end
375
404
 
376
- def bind_current_updater(*args)
405
+ def bind_current_updater(*)
377
406
  resource.updater_id = current_user.id if !settings[:skip_bind_current_updater] && resource.respond_to?(:updater_id)
378
407
  end
379
408
 
380
- # roles logic
381
- def role_given?
382
- fetch_role
383
- end
384
-
385
- def as_role
386
- {as: fetch_role}
387
- end
388
-
389
- def get_role
390
- return [:default, :moderator, :admin] if admin?
391
- return [:default, :moderator] if moderator?
392
- nil
393
- end
394
-
395
- def fetch_role
396
- return @as_role if defined?(@as_role)
397
- @as_role = get_role
398
- end
399
-
400
409
  def get_subject
401
410
  params[:id] ? resource : resource_class
402
411
  end