ab_admin 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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