ab_admin 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. data/Gemfile +1 -0
  2. data/Guardfile +1 -1
  3. data/app/assets/images/admin/flags/b_uk.png +0 -0
  4. data/app/assets/images/admin/preloader.gif +0 -0
  5. data/app/assets/javascripts/ab_admin/application.js +1 -28
  6. data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +29 -6
  7. data/app/assets/javascripts/ab_admin/components/gmaps.js.coffee +120 -91
  8. data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +3 -2
  9. data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +4 -7
  10. data/app/assets/javascripts/ab_admin/core/init.js.coffee +8 -10
  11. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +53 -24
  12. data/app/assets/javascripts/ab_admin/core/utils.js.coffee +7 -0
  13. data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +1 -2
  14. data/app/assets/javascripts/ab_admin/main.js +28 -0
  15. data/app/assets/stylesheets/ab_admin/application.css.scss +1 -10
  16. data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.css.scss +4 -0
  17. data/app/assets/stylesheets/ab_admin/components/_base.css.scss +4 -1
  18. data/app/assets/stylesheets/ab_admin/components/_form.css.scss +10 -13
  19. data/app/assets/stylesheets/ab_admin/components/_geo_input.css.scss +5 -9
  20. data/app/assets/stylesheets/ab_admin/fileupload.css.scss +68 -102
  21. data/app/assets/stylesheets/ab_admin/main.css.scss +8 -0
  22. data/app/controllers/admin/base_controller.rb +18 -14
  23. data/app/controllers/admin/manager_controller.rb +51 -6
  24. data/app/controllers/admin/users_controller.rb +23 -0
  25. data/app/views/admin/fileupload/_asset.html.slim +8 -0
  26. data/app/views/admin/fileupload/_container.html.slim +10 -0
  27. data/app/views/admin/fileupload/_file.html.slim +5 -0
  28. data/app/views/admin/fileupload/_ftmpl.html.slim +6 -0
  29. data/app/views/admin/fileupload/_tmpl.html.slim +9 -0
  30. data/app/views/admin/users/_form.html.slim +1 -0
  31. data/config/locales/en.yml +5 -60
  32. data/config/locales/ru.yml +14 -63
  33. data/config/routes.rb +7 -4
  34. data/features/dsl/custom_actions.feature +62 -0
  35. data/features/dsl/parent_resource.feature +18 -0
  36. data/features/step_definitions/configuration_steps.rb +6 -0
  37. data/features/step_definitions/dsl/parent_resource_steps.rb +8 -0
  38. data/features/step_definitions/settings_steps.rb +1 -1
  39. data/features/step_definitions/web_steps/transforms_steps.rb +3 -0
  40. data/features/support/paths.rb +3 -0
  41. data/lib/ab_admin.rb +5 -0
  42. data/lib/ab_admin/abstract_resource.rb +28 -4
  43. data/lib/ab_admin/carrierwave/base_uploader.rb +22 -22
  44. data/lib/ab_admin/concerns/admin_addition.rb +2 -2
  45. data/lib/ab_admin/concerns/utilities.rb +4 -4
  46. data/lib/ab_admin/config/base.rb +18 -0
  47. data/lib/ab_admin/controllers/head_options.rb +1 -1
  48. data/lib/ab_admin/core_ext/array.rb +4 -0
  49. data/lib/ab_admin/core_ext/string.rb +9 -10
  50. data/lib/ab_admin/hooks/quiet_scope_page.rb +16 -16
  51. data/lib/ab_admin/hooks/simple_form_hooks.rb +13 -13
  52. data/lib/ab_admin/i18n_tools/model_translator.rb +67 -0
  53. data/lib/ab_admin/models/asset.rb +32 -1
  54. data/lib/ab_admin/models/attachment_file.rb +1 -1
  55. data/lib/ab_admin/models/locator.rb +7 -0
  56. data/lib/ab_admin/models/settings.rb +7 -0
  57. data/lib/ab_admin/models/structure.rb +4 -0
  58. data/lib/ab_admin/utils.rb +2 -2
  59. data/lib/ab_admin/version.rb +1 -1
  60. data/lib/ab_admin/views/admin_helpers.rb +3 -3
  61. data/lib/ab_admin/views/admin_navigation_helpers.rb +1 -1
  62. data/lib/ab_admin/views/form_builder.rb +42 -39
  63. data/lib/ab_admin/views/helpers.rb +5 -0
  64. data/lib/ab_admin/views/manager_helpers.rb +10 -0
  65. data/lib/ab_admin/views/search_form_builder.rb +12 -5
  66. data/lib/generators/ab_admin/install/install_generator.rb +1 -1
  67. data/lib/generators/ab_admin/install/templates/config/admin_menu.rb +2 -2
  68. data/lib/generators/ab_admin/install/templates/helpers/admin/structures_helper.rb +1 -1
  69. data/lib/generators/ab_admin/install/templates/models/attachment_file.rb +2 -0
  70. data/lib/generators/ab_admin/install/templates/models/locator.rb +0 -1
  71. data/lib/generators/ab_admin/install/templates/models/settings.rb +0 -1
  72. data/lib/generators/ab_admin/install/templates/models/static_page.rb +1 -0
  73. data/lib/generators/ab_admin/install/templates/{scripts → script}/unicorn.sh +0 -0
  74. data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +4 -0
  75. data/lib/generators/ab_admin/resource/templates/_search_form.haml.erb +1 -1
  76. data/lib/generators/ab_admin/resource/templates/_search_form.slim.erb +1 -1
  77. data/lib/generators/ab_admin/resource/templates/_table.haml.erb +1 -2
  78. data/lib/generators/ab_admin/resource/templates/_table.slim.erb +1 -2
  79. data/lib/generators/template.rb +1 -0
  80. data/lib/tasks/i18n.rake +7 -0
  81. data/spec/dummy/app/models/ab_admin/ab_admin_collection.rb +35 -0
  82. data/spec/dummy/app/models/ab_admin/ab_admin_product.rb +2 -0
  83. data/spec/dummy/app/models/admin_menu.rb +4 -2
  84. data/spec/dummy/app/models/collection.rb +3 -1
  85. data/spec/generators/install_generator_spec.rb +1 -1
  86. data/spec/generators/resource_generator_spec.rb +1 -1
  87. data/spec/models/avatar_spec.rb +29 -2
  88. metadata +25 -12
  89. data/app/views/admin/fileupload/_asset.html.erb +0 -5
  90. data/app/views/admin/fileupload/_container.html.erb +0 -28
  91. data/app/views/admin/fileupload/_fcontainer.html.erb +0 -25
  92. data/app/views/admin/fileupload/_file.html.erb +0 -5
  93. data/app/views/admin/fileupload/_ftmpl.html.erb +0 -7
  94. data/app/views/admin/fileupload/_tmpl.html.erb +0 -9
  95. data/lib/ab_admin/utils/csv_builder.rb +0 -52
@@ -71,6 +71,13 @@ $.fn.loadSelect = (optionsDataArray) ->
71
71
  $.fn.scrollToEl = ->
72
72
  $('html, body').animate({scrollTop: $(this).offset().top}, 'slow')
73
73
 
74
+ $.fn.toHref = ->
75
+ $el = $(this)
76
+ if _.isEmpty($el.data())
77
+ window.location.href = $el.attr('href')
78
+ else
79
+ $el.click()
80
+
74
81
  $.parseQuery = ->
75
82
  window.location.search.replace("?", "").parseQuery()
76
83
 
@@ -19,5 +19,4 @@ $ ->
19
19
  initPickers()
20
20
 
21
21
  $('.simple_form').bind "nested:fieldAdded", =>
22
- initPickers()
23
- initFancySelect()
22
+ initPickers()
@@ -0,0 +1,28 @@
1
+ //= require i18n
2
+ //= require i18n/translations
3
+ //= require jquery_ujs
4
+ //= require jquery.cookie
5
+ //= require jquery.pjax
6
+ //= require jquery.ui.nestedSortable
7
+ //= require jquery_nested_form
8
+ //= require jquery.hotkeys
9
+ //= require bootstrap
10
+ //= require ab_admin/bootstrap-tab-multi
11
+ //= require ab_admin/bootstrap-datepicker/core
12
+ //= require ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ru.js
13
+ //= require ab_admin/bootstrap-timepicker
14
+ //= require bootstrap-wysihtml5
15
+ //= require bootstrap-wysihtml5/locales/ru
16
+ //= require bootstrap-editable-inline
17
+ //= require select2
18
+ //= require fancybox
19
+ //= require jquery.ui.nestedSortable
20
+ //= require ab_admin/components/sortable_tree
21
+ //= require ab_admin/components/google_translate
22
+ //= require ab_admin/components/locator
23
+ //= require ab_admin/components/admin_assets
24
+ //= require ab_admin/components/gmaps
25
+ //= require ab_admin/components/in_place_edit
26
+
27
+ //= require ab_admin/core/init
28
+ //= require ab_admin/inputs/datetime_input
@@ -1,10 +1 @@
1
- //= require ab_admin/bootstrap-datepicker
2
- //= require ab_admin/bootstrap-timepicker
3
- //= require bootstrap-wysihtml5
4
- //= require bootstrap-editable
5
- //= require select2
6
- //= require ab_admin/bootstrap_and_overrides
7
- //= require ab_admin/fileupload
8
-
9
- //q= require jquery.fancybox
10
- //q= require token_input/token-input-facebook
1
+ //= require ab_admin/main
@@ -17,6 +17,10 @@ $iconWhiteSpritePath: asset-url('glyphicons-halflings-white.png', image);
17
17
  @import "ab_admin/components/geo_input";
18
18
  @import "ab_admin/components/sortable_tree";
19
19
 
20
+ .dropdown .caret {
21
+ margin-left: 5px;
22
+ }
23
+
20
24
  .btn .caret {
21
25
  margin-left: 3px;
22
26
  }
@@ -7,9 +7,12 @@
7
7
  float: left;
8
8
  }
9
9
  .sidebar {
10
- width: 220px;
10
+ width: 260px;
11
11
  margin: 0 0 20px -265px;
12
12
  float: left;
13
+ &.well {
14
+ width: 220px;
15
+ }
13
16
  }
14
17
  .content_with_sidebar {
15
18
  margin-right: 280px;
@@ -92,19 +92,16 @@ textarea.do_wysihtml5 {
92
92
  width: 625px;
93
93
  }
94
94
 
95
- .fileupload {
96
- position: relative;
95
+ textarea {
96
+ width: auto;
97
97
  }
98
98
 
99
- .fileupload-drop-area {
100
- position: absolute;
101
- top: 0;
102
- left: 0;
103
- width: 100%;
104
- height: 100%;
105
- min-height: 70px;
106
- z-index: 2;
107
- text-align: center;
108
- color: #999;
109
- font-size: 26px;
99
+ .fancy_select, input.token {
100
+ min-width: 220px;
101
+ }
102
+
103
+ .simple_form {
104
+ .fancy_select, input.token {
105
+ min-width: 400px;
106
+ }
110
107
  }
@@ -1,19 +1,15 @@
1
1
  .admin_map {
2
2
  height: 400px;
3
- margin-left: 10%;
4
- width: 80%;
5
- margin-top: 0.6em;
3
+ width: 800px;
6
4
  img {
7
5
  max-width: none;
8
6
  }
9
7
  }
10
8
  .geo_input {
11
- label {
12
- display: inline-block;
13
- width: 10%;
14
- }
15
9
  input {
16
- display: inline-block;
17
- width: 80% !important;
10
+ width: 400px;
11
+ &.geo_ac {
12
+ width: 800px;
13
+ }
18
14
  }
19
15
  }
@@ -1,120 +1,86 @@
1
- .gray-blocks {
1
+ .fileupload {
2
2
  overflow: hidden;
3
- margin-top: 10px;
4
- .fileupload-file img {
5
- width: 80px;
6
- }
7
- .bg-bl {
8
- background: #d1e6dc;
9
- overflow: hidden;
10
- }
11
- .gr-title {
12
- display: block;
13
- color: #5b6569;
14
- font-size: 1.1em;
15
- padding: 20px 20px 15px 20px;
16
- }
17
- .galery {
18
- display: block;
19
- overflow: hidden;
20
- .ill {
21
- z-index: 3;
22
- display: block;
3
+ position: relative;
4
+ padding-top: 10px;
5
+ padding-left: 10px;
6
+ &.asset_asset_type {
7
+ .asset {
23
8
  float: left;
24
9
  overflow: hidden;
25
- width: 80px;
26
- height: 80px;
27
- margin-right: 1px;
28
- margin-bottom: 1px;
10
+ margin: 3px;
29
11
  position: relative;
30
- .del {
31
- display: block;
12
+ z-index: 3;
13
+ .del_asset, .main_image, .crop_image, .rotate_image {
32
14
  position: absolute;
33
- right: 0px;
34
- top: 0px;
35
- background: image_url("admin/transp_cross.png") no-repeat left top;
36
- width: 17px;
37
- height: 17px;
38
15
  cursor: pointer;
39
- z-index: 1;
40
- img {
41
- width: 17px;
42
- height: 17px;
43
- }
16
+ background: rgba(100, 131, 137, 0.6);
17
+ z-index: 4;
18
+ padding: 1px 3px;
44
19
  }
45
- .main_img {
46
- cursor: pointer;
47
- display: block;
48
- height: 17px;
49
- width: 17px;
50
- text-indent: -2000px;
51
- position: absolute;
52
- padding: 0 0 0 20px;
53
- left: 0;
20
+ .del_asset {
21
+ right: 0;
54
22
  top: 0;
55
- z-index: 1;
56
23
  }
57
-
58
- //checkbox on pic
59
- .main_img {
60
- background: image_url("main_pic.png") no-repeat;
24
+ .main_image {
25
+ right: 0;
26
+ bottom: 0;
61
27
  }
62
- }
63
- }
64
- .ill-bl {
65
- display: block;
66
- overflow: hidden;
67
- padding: 0px 20px 0px 20px;
68
- border-bottom: solid 1px #e7faed;
69
- position: relative;
70
- .r-ill {
71
- margin-left: -90px;
72
- width: 100%;
73
- float: right;
74
- .r-ill-data {
75
- margin-left: 90px;
28
+ .crop_image {
29
+ display: none;
30
+ left: 0;
31
+ bottom: 0;
32
+ }
33
+ .rotate_image {
34
+ left: 0;
35
+ bottm: 0;
76
36
  }
77
37
  }
78
- .l-ill {
79
- float: left;
80
- width: 80px;
81
- overflow: hidden;
82
- }
83
- .file-name {
84
- color: #5b6569;
85
- font-size: 0.9em;
86
- font-weight: bold;
87
- display: block;
38
+ &.one_asset .main_image {
39
+ display: none;
88
40
  }
89
- .del {
90
- display: block;
91
- position: absolute;
92
- right: 20px;
93
- top: 0px;
94
- width: 13px;
95
- height: 13px;
96
- overflow: hidden;
41
+ }
42
+ &.file_asset_type {
43
+ .asset {
44
+ margin-bottom: 10px;
45
+ z-index: 2;
46
+ position: relative;
47
+ .del_asset {
48
+ margin-left: 15px;
49
+ }
97
50
  }
98
51
  }
99
- }
52
+ .file-name {
53
+ color: #5b6569;
54
+ font-size: 0.9em;
55
+ font-weight: bold;
56
+ }
57
+ .file-types {
58
+ overflow: hidden;
59
+ padding-top: 10px;
60
+ padding-left: 5px;
61
+ z-index: 2;
62
+ }
63
+ .fileupload-button {
64
+ z-index: 3;
65
+ }
100
66
 
101
- .file-types {
102
- display: block;
103
- overflow: hidden;
104
- padding: 5px 20px;
105
- }
67
+ .file-types .type-info {
68
+ float: right;
69
+ color: #5b6569;
70
+ font-size: 0.9em;
71
+ text-transform: uppercase;
72
+ }
73
+ .fileupload-drop-area {
74
+ position: absolute;
75
+ top: 0;
76
+ left: 0;
77
+ width: 100%;
78
+ height: 100%;
79
+ min-height: 70px;
80
+ z-index: 1;
81
+ text-align: center;
82
+ color: #999;
83
+ font-size: 18px;
84
+ }
106
85
 
107
- .file-types .type-info {
108
- display: block;
109
- float: right;
110
- color: #5b6569;
111
- font-size: 0.9em;
112
86
  }
113
- .fileupload.file_asset_type {
114
- .fileupload-list .asset {
115
- width: auto !important;
116
- height: auto !important;
117
- float: none;
118
- margin-bottom: 10px;
119
- }
120
- }
@@ -0,0 +1,8 @@
1
+ //= require ab_admin/bootstrap-datepicker
2
+ //= require ab_admin/bootstrap-timepicker
3
+ //= require bootstrap-wysihtml5
4
+ //= require bootstrap-editable
5
+ //= require select2
6
+ //= require fancybox
7
+ //= require ab_admin/bootstrap_and_overrides
8
+ //= require ab_admin/fileupload
@@ -9,17 +9,17 @@ class Admin::BaseController < ::InheritedResources::Base
9
9
  before_filter :authenticate_user!, :require_moderator
10
10
  before_filter :add_breadcrumbs, :set_title, :set_user_vars, :unless => :xhr?
11
11
 
12
- class_attribute :csv_builder, :batch_action_list, :instance_reader => false, :instance_writer => false
12
+ class_attribute :export_builder, :batch_action_list, :instance_reader => false, :instance_writer => false
13
13
  self.batch_action_list = [AbAdmin::Config::BatchAction.new(:destroy, :confirm => I18n.t('admin.delete_confirmation'))]
14
14
 
15
15
  has_scope :ids, :type => :array
16
16
 
17
17
  helper_method :admin?, :moderator?
18
18
 
19
- helper_method :button_scopes, :collection_action?, :action_items, :resource_action_items, :csv_builder,
19
+ helper_method :button_scopes, :collection_action?, :action_items, :resource_action_items,
20
20
  :preview_resource_path, :get_subject, :settings, :batch_action_list, :tree_node_renderer
21
21
 
22
- respond_to :json, :only => [:index, :update]
22
+ respond_to :json
23
23
 
24
24
  rescue_from ::CanCan::AccessDenied, :with => :render_unauthorized
25
25
 
@@ -98,10 +98,6 @@ class Admin::BaseController < ::InheritedResources::Base
98
98
  self.class.batch_action_list
99
99
  end
100
100
 
101
- def export_options
102
- {:column_names => csv_builder.columns.map(&:name), :column_data => csv_builder.columns.map(&:data), :column_separator => csv_builder.column_separator}
103
- end
104
-
105
101
  def self.inherited(base)
106
102
  super
107
103
  base.class_eval do
@@ -114,12 +110,16 @@ class Admin::BaseController < ::InheritedResources::Base
114
110
  {:errors => resource.errors.full_messages.map { |m| "<br/> - #{m}" }.join.html_safe}
115
111
  end
116
112
 
117
- def self.csv(options={}, &block)
118
- self.csv_builder = ::AbAdmin::Utils::CSVBuilder.new(options, &block)
113
+ def self.export(options={}, &block)
114
+ self.export_builder = ::AbAdmin::Config::Export.new(options, &block)
115
+ end
116
+
117
+ def export_builder
118
+ self.class.export_builder ||= ::AbAdmin::Config::Export.default_for_model(resource_class)
119
119
  end
120
120
 
121
- def csv_builder
122
- self.class.csv_builder ||= ::AbAdmin::Utils::CSVBuilder.default_for_resource(resource_class)
121
+ def export_options
122
+ export_builder.render_options
123
123
  end
124
124
 
125
125
  def set_title
@@ -171,8 +171,7 @@ class Admin::BaseController < ::InheritedResources::Base
171
171
  def add_breadcrumbs
172
172
  @breadcrumbs = []
173
173
  if parent?
174
- @breadcrumbs << {:name => parent_class.model_name.human(:count => 9),
175
- :url => {:action => :index, :controller => "admin/#{parent_class.model_name.plural}"}}
174
+ @breadcrumbs << {:name => parent_class.model_name.human(:count => 9), :url => parent_collection_path}
176
175
  @breadcrumbs << {:name => AbAdmin.display_name(parent), :url => parent_path}
177
176
  end
178
177
  @breadcrumbs << {:name => resource_class.model_name.human(:count => 9), :url => collection_path}
@@ -181,6 +180,10 @@ class Admin::BaseController < ::InheritedResources::Base
181
180
  end
182
181
  end
183
182
 
183
+ def parent_collection_path
184
+ {:action => :index, :controller => "admin/#{parent_class.model_name.plural}"}
185
+ end
186
+
184
187
  def tree_node_renderer
185
188
  @tree_node_renderer ||= lambda { |r| link_to AbAdmin.display_name(r), resource_path(r), :class => 'tree-item_link' }
186
189
  end
@@ -277,7 +280,8 @@ class Admin::BaseController < ::InheritedResources::Base
277
280
  end
278
281
 
279
282
  def get_role
280
- return :admin if admin?
283
+ return [:admin, :moderator] if admin?
284
+ return [:moderator] if moderator?
281
285
  nil
282
286
  end
283
287
 
@@ -8,8 +8,53 @@ class ::Admin::ManagerController < ::Admin::BaseController
8
8
 
9
9
  helper_method :manager, :admin_partial_name
10
10
 
11
+ def custom_action
12
+ custom_action = manager.custom_action_for(params[:custom_action], self)
13
+ if custom_action.options[:method] && custom_action.options[:method] != request.method_symbol
14
+ raise ActionController::RoutingError.new("AbAdmin custom action for #{params[:custom_action]} not found")
15
+ end
16
+ instance_exec(&custom_action.data)
17
+ end
18
+
11
19
  protected
12
20
 
21
+ def begin_of_association_chain
22
+ parent
23
+ end
24
+
25
+ def parent
26
+ return @parent if defined?(@parent)
27
+ @parent = begin
28
+ return if !params[:parent_resource] && !params[:parent_id]
29
+ assoc_name, r_id = params[:parent_resource].singularize.to_sym, params[:parent_id]
30
+ parent_config = manager.parent_resources.detect { |conf| conf.name == assoc_name }
31
+ return unless parent_config
32
+ assoc = resource_class.reflect_on_association(parent_config.name)
33
+ return unless assoc
34
+ assoc.klass.find(r_id)
35
+ end
36
+ end
37
+
38
+ def parent?
39
+ !!parent
40
+ end
41
+
42
+ def parent_type
43
+ parent.class.name.underscore.to_sym
44
+ end
45
+
46
+ def parent_class
47
+ parent.class
48
+ end
49
+
50
+ def parent_path
51
+ "/admin/#{parent_class.model_name.plural}/#{parent.id}"
52
+ end
53
+
54
+ def parent_collection_path
55
+ "/admin/#{parent_class.model_name.plural}"
56
+ end
57
+
13
58
  def tree_node_renderer
14
59
  manager.tree_node_renderer || super
15
60
  end
@@ -49,16 +94,16 @@ class ::Admin::ManagerController < ::Admin::BaseController
49
94
  raise ActionController::RoutingError.new("AbAdmin action #{action_name} for #{resource_class.name} not found")
50
95
  end
51
96
  manager_instance
52
- #rescue NameError
53
- # raise ActionController::RoutingError.new("AbAdmin manager_model for #{resource_class.name} not found")
97
+ rescue NameError => e
98
+ raise ActionController::RoutingError.new("AbAdmin manager_model for #{resource_class.name} not found (#{e.message})")
54
99
  end
55
100
  end
56
101
 
57
102
  def resource_class
58
103
  @model ||= begin
59
104
  params[:model_name].singularize.classify.constantize
60
- rescue NameError
61
- raise ActionController::RoutingError.new("AbAdmin model #{params[:model_name]} not found")
105
+ rescue NameError => e
106
+ raise ActionController::RoutingError.new("AbAdmin model #{params[:model_name]} not found (#{e.message})")
62
107
  end
63
108
  end
64
109
 
@@ -98,12 +143,12 @@ class ::Admin::ManagerController < ::Admin::BaseController
98
143
 
99
144
  def edit_resource_path(record=nil, options={})
100
145
  record ||= resource
101
- admin_edit_path(options.merge(:model_name => resource_collection_name, :id => record.id))
146
+ admin_edit_path(options.merge(:model_name => record.class.model_name.plural, :id => record.id))
102
147
  end
103
148
 
104
149
  def resource_path(record=nil, options={})
105
150
  record ||= resource
106
- admin_show_path(options.merge(:model_name => resource_collection_name, :id => record.id))
151
+ admin_show_path(options.merge(:model_name => record.class.model_name.plural, :id => record.id))
107
152
  end
108
153
 
109
154
  def self.cancan_resource_class