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
@@ -3,6 +3,7 @@ module AbAdmin
3
3
  class Group < BaseGroup
4
4
  def initialize(title, options, &block)
5
5
  @menu_tree = []
6
+ @raw_title = title
6
7
  @title = title.is_a?(Symbol) ? I18n.t(title, scope: [:admin, :navigation]) : title
7
8
  @options = options
8
9
  instance_eval &block if block_given?
@@ -12,8 +13,9 @@ module AbAdmin
12
13
  return if @options[:if] && !call_method_or_proc_on(template, @options[:if])
13
14
  return if @options[:unless] && call_method_or_proc_on(template, @options[:unless])
14
15
 
16
+ wrapper_class = "dropdown-wrap-#{@raw_title}" if @raw_title.is_a?(Symbol)
15
17
  <<-HTML.html_safe
16
- <li class="dropdown">
18
+ <li class="dropdown #{wrapper_class}">
17
19
  <a class="dropdown-toggle" href="#{@options[:url] || '#'}" >#{title(template)}<b class="caret"></b></a>
18
20
  <ul class="dropdown-menu">#{render_nested(template)}</ul>
19
21
  <li>
@@ -25,12 +25,12 @@ module AbAdmin
25
25
 
26
26
  module ClassMethods
27
27
  def move_to(index, id)
28
- update_all(['sort_order = ?', index], ['id = ?', id.to_i])
28
+ where(id: id.to_i).update_all(sort_order: index)
29
29
  end
30
30
 
31
31
  def ext_list
32
32
  return unless uploaders[:data]
33
- uploaders[:data].new.extension_white_list
33
+ uploaders[:data].new.extension_whitelist
34
34
  end
35
35
 
36
36
  def clean!
@@ -49,7 +49,7 @@ module AbAdmin
49
49
 
50
50
  def thumb_url
51
51
  return unless image?
52
- data.versions[thumb_size] ? data.url(thumb_size) : data.url
52
+ data.versions[thumb_size] ? url(thumb_size) : url
53
53
  end
54
54
 
55
55
  def format_created_at
@@ -91,7 +91,11 @@ module AbAdmin
91
91
  end
92
92
 
93
93
  def main!
94
- self.class.update_all('is_main=0', ['assetable_type=? AND assetable_id=? AND type=?', assetable_type, assetable_id, type])
94
+ cond = {assetable_type: assetable_type, type: type}
95
+ if assetable_id.to_i.nonzero? || guid.presence
96
+ cond.merge!(assetable_id.to_i.zero? ? {guid: guid} : {assetable_id: assetable_id})
97
+ self.class.where(cond).update_all(is_main: false)
98
+ end
95
99
  update_column(:is_main, true)
96
100
  refresh_assetable
97
101
  self
@@ -127,7 +131,7 @@ module AbAdmin
127
131
  end
128
132
 
129
133
  def full_url(*args)
130
- AbAdmin.full_url data.url(*args)
134
+ AbAdmin.full_url url(*args)
131
135
  end
132
136
 
133
137
  def url_on_fly(version)
@@ -167,7 +171,6 @@ module AbAdmin
167
171
  data.cache_stored_file!
168
172
  end
169
173
  end
170
-
171
174
  end
172
175
  end
173
176
  end
@@ -24,16 +24,15 @@ module AbAdmin
24
24
  end
25
25
 
26
26
  def normalize_html
27
- ::I18n.available_locales.each do |loc|
27
+ ::Globalize.available_locales.each do |loc|
28
28
  %w(title h1 keywords description).each do |attr|
29
29
  send("#{attr}_#{loc}=", send("#{attr}_#{loc}").to_s.no_html)
30
30
  end
31
31
  end
32
- ::I18n.available_locales.each do |loc|
32
+ ::Globalize.available_locales.each do |loc|
33
33
  send("seo_block_#{loc}=", sanitize(send("seo_block_#{loc}").to_s))
34
34
  end
35
35
  end
36
-
37
36
  end
38
37
  end
39
38
  end
@@ -16,6 +16,7 @@ module AbAdmin
16
16
  end
17
17
 
18
18
  def save(path, data)
19
+ data.deep_transform_values! { |v| AbAdmin.normalize_html(v) }
19
20
  File.write path, data.deep_stringify_keys.to_yaml.sub(/\A---\s+/, '').gsub(/:\s+$/, ':').gsub(/^(\s+)(yes|no):/, '\1"\2":')
20
21
  end
21
22
 
@@ -65,7 +66,6 @@ module AbAdmin
65
66
  end
66
67
  {message: message}
67
68
  end
68
-
69
69
  end
70
70
  end
71
71
  end
@@ -6,15 +6,16 @@ module AbAdmin
6
6
  included do
7
7
  extend ActiveModel::Naming
8
8
  extend ActiveRecord::Translation
9
- class_attribute :base_class, :base_paths, :editable_paths
9
+ class_attribute :base_class, :base_dir, :base_paths, :editable_paths
10
10
  self.base_class = self
11
+ self.base_dir = Rails.root.join('config', 'settings')
11
12
  self.base_paths = [
12
- Rails.root.join('config', 'settings', 'settings.yml'),
13
- Rails.root.join('config', 'settings', "#{Rails.env}.yml")
13
+ File.join(base_dir, 'settings.yml'),
14
+ File.join(base_dir, "#{Rails.env}.yml")
14
15
  ]
15
16
  self.editable_paths = [
16
- Rails.root.join('config', 'settings', "#{Rails.env}.local.yml"),
17
- Rails.root.join('config', 'settings', 'settings.local.yml')
17
+ File.join(base_dir, "#{Rails.env}.local.yml"),
18
+ File.join(base_dir, 'settings.local.yml')
18
19
  ]
19
20
  end
20
21
 
@@ -75,7 +76,6 @@ module AbAdmin
75
76
  value
76
77
  end
77
78
  end
78
-
79
79
  end
80
80
  end
81
81
  end
@@ -21,11 +21,6 @@ module AbAdmin
21
21
  scope :with_type, lambda { |structure_type| where(structure_type_id: structure_type.id) }
22
22
  scope :with_depth, lambda { |level| where(depth: level.to_i) }
23
23
  scope :with_position, lambda { |position_type| where(position_type_id: position_type.id).order('lft DESC') }
24
-
25
- scope :with_kind, lambda { |structure_type|
26
- ActiveSupport::Deprecation.warn('with_kind is deprecated, use with_type instead')
27
- with_type.call(structure_type)
28
- }
29
24
  end
30
25
 
31
26
  def redirect?
@@ -35,7 +30,6 @@ module AbAdmin
35
30
  def admin_title
36
31
  [title, structure_type.title, position_type.title, "#{self.class.han(:is_visible)}: #{is_visible ? '+' : '-'}"].join(' | ')
37
32
  end
38
-
39
33
  end
40
34
  end
41
35
  end
@@ -22,6 +22,16 @@ module AbAdmin
22
22
  scope :recently, -> { order('id DESC') }
23
23
  end
24
24
 
25
+ module ClassMethods
26
+ def import_from_batch_collection_action(tracks)
27
+ tracks.each do |track|
28
+ track.run_callbacks(:save) { false }
29
+ track.run_callbacks(:create) { false }
30
+ end
31
+ ::Track.import(tracks)
32
+ end
33
+ end
34
+
25
35
  def action_title(params = {})
26
36
  parts = key.split('.')
27
37
  lookups = []
@@ -52,10 +62,9 @@ module AbAdmin
52
62
  private
53
63
 
54
64
  def make_trackable
55
- self.name ||= trackable.han
56
- self.trackable_changes = trackable.changes.except(:updated_at)
65
+ self.name ||= trackable.han.first(250)
66
+ self.trackable_changes = trackable.saved_changes.except(:updated_at)
57
67
  end
58
-
59
68
  end
60
69
  end
61
70
  end
@@ -51,7 +51,6 @@ module AbAdmin
51
51
  rescue I18n::MissingTranslationData
52
52
  @code.to_s.humanize
53
53
  end
54
-
55
54
  end
56
55
  end
57
56
  end
@@ -89,7 +89,6 @@ module AbAdmin
89
89
  def check_role
90
90
  errors.add(:user_role_id, :invalid) unless ::UserRoleType.valid?(user_role_id)
91
91
  end
92
-
93
92
  end
94
93
  end
95
94
  end
@@ -0,0 +1,4 @@
1
+ Dir["#{File.dirname(__FILE__)}/*.rb"].sort.each do |path|
2
+ next if File.basename(path) == 'all.rb'
3
+ require "ab_admin/models/validations/#{File.basename(path)}"
4
+ end
@@ -0,0 +1,9 @@
1
+ module ActiveModel
2
+ module Validations
3
+ class DomainNameValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ record.errors.add(attribute) unless value.to_s =~ ::AbAdmin::DOMAINNAME_REGEXP
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module ActiveModel
2
+ module Validations
3
+ class EmailValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ record.errors.add(attribute) unless value.to_s =~ ::AbAdmin::EMAIL_REGEXP
6
+ end
7
+ end
8
+ end
9
+ end
@@ -5,6 +5,13 @@ module AbAdmin
5
5
  autoload :Logger, 'ab_admin/utils/logger'
6
6
  autoload :Mysql, 'ab_admin/utils/mysql'
7
7
 
8
+ def all_models
9
+ Kernel.suppress_warnings do
10
+ Dir.glob(Rails.root.to_s + '/app/models/**/*.rb').reject { |path| path =~ /concerns|shared/ }.each { |file| require file }
11
+ end
12
+ ActiveRecord::Base.direct_descendants
13
+ end
14
+
8
15
  def load_files!(base_path = 'lib/utils')
9
16
  Dir[Rails.root.join("#{base_path}/**/*.rb")].each do |path|
10
17
  require_dependency path
@@ -66,10 +73,11 @@ module AbAdmin
66
73
  Rails.application.routes.url_helpers
67
74
  end
68
75
 
69
- def full_url(path)
76
+ def full_url(path, protocol='http://')
70
77
  return path if path =~ %r{^(http|//)}
71
- host = AbAdmin.base_url || Rails.application.config.action_mailer.default_url_options[:host] || 'www.example.com'
72
- "http://#{host}#{path}"
78
+ duo = Rails.application.config.action_mailer.default_url_options
79
+ host = AbAdmin.base_url || [duo[:host], duo[:port]].compact.join(':') || 'www.example.com'
80
+ "#{protocol}#{host}#{path}"
73
81
  end
74
82
 
75
83
  def js_date_data
@@ -142,7 +150,7 @@ module AbAdmin
142
150
  end
143
151
 
144
152
  def friendly_token(n=10)
145
- SecureRandom.base64(n * 2).tr('+/=', 'xyz').first(n)
153
+ SecureRandom.base64(n * 2).tr('+/=', 'xyz').first(n).downcase
146
154
  end
147
155
  end
148
156
  end
@@ -88,7 +88,7 @@ module AbAdmin
88
88
  exec = options[:exec].nil? ? true : options[:exec]
89
89
  case symbol_or_proc
90
90
  when Symbol, String
91
- obj.send(symbol_or_proc.to_sym)
91
+ obj.send(symbol_or_proc.to_sym, *options[:attrs])
92
92
  when Proc
93
93
  if exec
94
94
  obj.instance_exec(&symbol_or_proc)
@@ -1,7 +1,6 @@
1
1
  module AbAdmin
2
2
  module Utils
3
3
  module Logger
4
-
5
4
  class ExtendedLogger < ::Logger
6
5
  def exception(e, options={})
7
6
  message = "#{e.message} #{"DATA:#{options[:data].inspect}" if options && options[:data]}"
@@ -19,7 +18,6 @@ module AbAdmin
19
18
  logger.formatter = ::Logger::Formatter.new
20
19
  logger
21
20
  end
22
-
23
21
  end
24
22
  end
25
23
  end
@@ -1,4 +1,5 @@
1
- require 'ruby2xlsx'
1
+ require 'write_xlsx'
2
+ require 'stringio'
2
3
 
3
4
  module AbAdmin
4
5
  module Utils
@@ -10,9 +11,28 @@ module AbAdmin
10
11
  end
11
12
  end
12
13
 
13
- class XlsDocument < Ruby2xlsx::Base
14
+ class XlsDocument
14
15
  include AbAdmin::Utils::EvalHelpers
15
16
 
17
+ def initialize(source, options = {})
18
+ @source = source
19
+ @options = options
20
+ @compiled = false
21
+ @io = ::StringIO.new
22
+ end
23
+
24
+ def workbook
25
+ @workbook ||= ::WriteXLSX.new(@io)
26
+ end
27
+
28
+ def worksheet
29
+ @worksheet ||= add_worksheet(worksheet_name)
30
+ end
31
+
32
+ def add_worksheet(*args)
33
+ @worksheet = workbook.add_worksheet(*args)
34
+ end
35
+
16
36
  def default_columns
17
37
  @default_columns ||= @klass.column_names
18
38
  end
@@ -26,7 +46,7 @@ module AbAdmin
26
46
  end
27
47
 
28
48
  def filename
29
- @filename ||= [@options[:filename] || "#{@klass.model_name.plural}-#{Time.now.strftime('%Y-%m-%d')}", '.xls'].join
49
+ @filename ||= [@options[:filename] || "#{@klass.model_name.plural}-#{Time.now.strftime('%Y-%m-%d')}", '.xlsx'].join
30
50
  end
31
51
 
32
52
  def render
@@ -55,8 +75,8 @@ module AbAdmin
55
75
  bold = workbook.add_format(bold: 1)
56
76
  worksheet.write('A1', columns_names, bold)
57
77
 
58
- super
59
-
78
+ workbook.close
79
+ @io.string
60
80
  end
61
81
 
62
82
  def worksheet_name
@@ -83,7 +103,6 @@ module AbAdmin
83
103
  end
84
104
  end
85
105
  end
86
-
87
106
  end
88
107
  end
89
108
  end
@@ -1,3 +1,3 @@
1
1
  module AbAdmin
2
- VERSION = '0.6.1'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -42,13 +42,13 @@ module AbAdmin
42
42
  data = {
43
43
  type: options[:type],
44
44
  source: options[:source].try(:to_json),
45
- model: item.class.model_name.singular,
45
+ model: options[:model] || item.class.model_name.singular,
46
46
  url: options[:url] || "/admin/#{item.class.model_name.plural}/#{item.id}",
47
47
  name: attr,
48
48
  value: options[:value] || item[attr],
49
49
  title: options[:title] || item[attr]
50
50
  }
51
- link_to admin_pretty_data(data[:title].to_s).html_safe, '#', class: "editable #{options[:class]}", data: data.update(options[:data] || {})
51
+ link_to admin_pretty_data(data[:title]).html_safe, '#', class: "editable #{options[:class]}", data: data.update(options[:data] || {})
52
52
  end
53
53
 
54
54
  def options_for_ckeditor(options = {})
@@ -121,12 +121,13 @@ module AbAdmin
121
121
  image = item.send(options[:assoc])
122
122
  return nil unless image
123
123
  version = options[:version] || image.class.thumb_size
124
- popover_content = "<img class='image_link_popover popover_#{options[:assoc]}' src='#{image.url(options[:full_version])}'></img>"
124
+ image_url_method = options[:image_url_method] || :url
125
+ popover_content = "<img class='image_link_popover popover_#{options[:assoc]}' src='#{image.send(image_url_method, options[:full_version])}'></img>"
125
126
  popover_data = {content: popover_content, title: AbAdmin.display_name(item)}
126
127
 
127
128
  html_options = options.delete(:html_options) || {}
128
129
  html_options.reverse_merge!(rel: 'popover', remote: options[:remote], data: popover_data)
129
- link_to image_tag(image.url(version)), options[:url], html_options
130
+ link_to image_tag(image.send(image_url_method, version)), options[:url], html_options
130
131
  end
131
132
 
132
133
  def item_image(item, assoc=:photo, size=:thumb)
@@ -9,6 +9,7 @@ module AbAdmin
9
9
  options[:html][:id] ||= 'search_form'
10
10
  options[:html][:class] ||= 'pjax-form'
11
11
  options[:builder] ||= ::AbAdmin::Views::SearchFormBuilder
12
+ options[:compact_labels] = settings.dig(:search_form, :compact_labels)
12
13
  options[:method] ||= :get
13
14
  options[:as] ||= 'q'
14
15
  form_for([:admin, object].flatten, *(args << options), &block)
@@ -28,7 +29,7 @@ module AbAdmin
28
29
  return name unless search
29
30
 
30
31
  options = args.first.is_a?(Hash) ? args.shift.dup : {}
31
- search_params = params[:q] || {}.with_indifferent_access
32
+ search_params = (params[:q] || {}).to_h.with_indifferent_access
32
33
  attr_name = (options.delete(:column) || attribute).to_s
33
34
  default_order = options.delete :default_order
34
35
 
@@ -85,8 +86,13 @@ module AbAdmin
85
86
  when AbAdmin::Config::ActionItem
86
87
  instance_exec(item, &action.data) if action.for_context?(self)
87
88
  else
88
- meth = "#{resource_instance_name}_short_action_link"
89
- send(meth, action, item) if respond_to? meth
89
+ resource_action_link_method = "#{resource_instance_name}_short_action_link"
90
+ list_link_method = "#{resource_instance_name}_#{action}_list_link"
91
+ if respond_to?(list_link_method)
92
+ send(list_link_method, item)
93
+ elsif respond_to?(resource_action_link_method)
94
+ send(resource_action_link_method, action, item)
95
+ end
90
96
  end
91
97
  end
92
98
 
@@ -110,8 +116,13 @@ module AbAdmin
110
116
  when AbAdmin::Config::ActionItem
111
117
  instance_exec(&action.data) if action.for_context?(self)
112
118
  else
113
- meth = "#{resource_instance_name}_action_link"
114
- send(meth, action) if respond_to? meth
119
+ resource_action_link_method = "#{resource_instance_name}_action_link"
120
+ list_link_method = "#{resource_instance_name}_#{action}_link"
121
+ if respond_to?(list_link_method)
122
+ send(list_link_method)
123
+ elsif respond_to?(resource_action_link_method)
124
+ send(resource_action_link_method, action)
125
+ end
115
126
  end
116
127
  end
117
128