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
@@ -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