ab_admin 0.2.3 → 0.3.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 (221) hide show
  1. data/Gemfile +6 -6
  2. data/Guardfile +6 -6
  3. data/README.md +5 -5
  4. data/app/assets/images/admin/Jcrop.gif +0 -0
  5. data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +20 -19
  6. data/app/assets/javascripts/ab_admin/components/croppable_image.js.coffee +22 -38
  7. data/app/assets/javascripts/ab_admin/components/gmaps.js.coffee +2 -2
  8. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +6 -2
  9. data/app/assets/stylesheets/ab_admin/components/_base.css.scss +17 -1
  10. data/app/assets/stylesheets/ab_admin/components/_form.css.scss +1 -1
  11. data/app/assets/stylesheets/ab_admin/main.css.scss +1 -0
  12. data/app/controllers/admin/assets_controller.rb +10 -10
  13. data/app/controllers/admin/base_controller.rb +39 -37
  14. data/app/controllers/admin/locators_controller.rb +5 -4
  15. data/app/controllers/admin/manager_controller.rb +11 -10
  16. data/app/controllers/admin/settings_controller.rb +4 -3
  17. data/app/controllers/admin/static_pages_controller.rb +1 -1
  18. data/app/controllers/admin/structures_controller.rb +2 -2
  19. data/app/views/ab_admin/devise/passwords/edit.html.slim +5 -5
  20. data/app/views/ab_admin/devise/passwords/new.html.slim +3 -3
  21. data/app/views/ab_admin/devise/sessions/new.html.slim +5 -5
  22. data/app/views/admin/admin_comments/_comment.html.slim +3 -3
  23. data/app/views/admin/admin_comments/_comments.html.slim +2 -2
  24. data/app/views/admin/admin_comments/_form.html.slim +5 -5
  25. data/app/views/admin/admin_comments/create.js.erb +1 -1
  26. data/app/views/admin/base/_form.html.slim +1 -1
  27. data/app/views/admin/base/_search_layout.html.slim +4 -4
  28. data/app/views/admin/base/_tree.html.slim +1 -1
  29. data/app/views/admin/base/create.js.erb +1 -1
  30. data/app/views/admin/base/index.html.slim +3 -3
  31. data/app/views/admin/base/update.js.erb +1 -1
  32. data/app/views/admin/dashboards/index.html.slim +15 -1
  33. data/app/views/admin/fileupload/_asset.html.slim +1 -1
  34. data/app/views/admin/fileupload/_container.html.slim +2 -2
  35. data/app/views/admin/fileupload/_file.html.slim +1 -1
  36. data/app/views/admin/fileupload/_tmpl.html.slim +1 -1
  37. data/app/views/admin/headers/_form.html.slim +3 -3
  38. data/app/views/admin/locators/edit.html.slim +4 -4
  39. data/app/views/admin/locators/show.html.slim +3 -3
  40. data/app/views/admin/manager/_form.html.slim +2 -1
  41. data/app/views/admin/manager/_table.html.slim +6 -3
  42. data/app/views/admin/settings/_form.html.slim +8 -8
  43. data/app/views/admin/shared/_batch_actions.html.slim +1 -1
  44. data/app/views/admin/static_pages/_form.html.slim +3 -3
  45. data/app/views/admin/structures/_form.html.slim +7 -7
  46. data/app/views/admin/users/_form.html.slim +9 -9
  47. data/app/views/admin/users/_search_form.html.slim +4 -4
  48. data/app/views/admin/users/_table.html.slim +3 -3
  49. data/app/views/layouts/admin/_footer.html.slim +4 -0
  50. data/app/views/layouts/admin/_navigation.html.slim +2 -2
  51. data/app/views/layouts/admin/application.html.slim +3 -3
  52. data/app/views/layouts/admin/devise.html.slim +2 -2
  53. data/config/locales/ru.yml +1 -0
  54. data/config/routes.rb +23 -23
  55. data/db/migrate/20130101000001_create_users.rb +11 -11
  56. data/db/migrate/20130101000003_create_assets.rb +8 -8
  57. data/db/migrate/20130101000004_create_headers.rb +3 -3
  58. data/db/migrate/20130101000005_create_static_pages.rb +2 -2
  59. data/db/migrate/20130101000006_create_structures.rb +8 -8
  60. data/db/migrate/20130101000007_base_translations.rb +3 -3
  61. data/db/migrate/20130101000008_create_admin_comments.rb +3 -3
  62. data/features/dsl/action_items.feature +1 -1
  63. data/features/dsl/admin_comments.feature +2 -2
  64. data/features/dsl/batch_actions.feature +1 -1
  65. data/features/dsl/config.feature +2 -2
  66. data/features/dsl/custom_actions.feature +5 -5
  67. data/features/dsl/form.feature +4 -4
  68. data/features/dsl/in_place_edit.feature +1 -1
  69. data/features/dsl/list_edit.feature +1 -1
  70. data/features/dsl/resource_action_items.feature +1 -1
  71. data/features/dsl/table.feature +3 -3
  72. data/features/dsl/tree.feature +3 -3
  73. data/features/locators.feature +1 -1
  74. data/features/menu.feature +3 -3
  75. data/features/step_definitions/dsl/action_items_steps.rb +3 -3
  76. data/features/step_definitions/dsl/admin_comments_steps.rb +1 -1
  77. data/features/step_definitions/dsl/batch_actions_steps.rb +1 -1
  78. data/features/step_definitions/dsl/parent_resource_steps.rb +2 -2
  79. data/features/step_definitions/dsl/table_steps.rb +3 -3
  80. data/features/step_definitions/dsl/tree_steps.rb +3 -3
  81. data/features/step_definitions/menu_steps.rb +3 -3
  82. data/features/step_definitions/structure_steps.rb +1 -1
  83. data/features/step_definitions/user_steps.rb +7 -7
  84. data/features/step_definitions/web_steps/browsing_steps.rb +2 -2
  85. data/features/step_definitions/web_steps/form_steps.rb +7 -7
  86. data/features/support/selectors.rb +5 -5
  87. data/features/support/tolerance_for_selenium_sync_issues.rb +1 -1
  88. data/lib/ab_admin/abstract_resource.rb +3 -3
  89. data/lib/ab_admin/carrierwave/base_uploader.rb +7 -7
  90. data/lib/ab_admin/carrierwave/file_size_validator.rb +4 -4
  91. data/lib/ab_admin/carrierwave/glue.rb +1 -1
  92. data/lib/ab_admin/concerns/admin_addition.rb +17 -13
  93. data/lib/ab_admin/concerns/headerable.rb +2 -2
  94. data/lib/ab_admin/concerns/nested_set.rb +23 -1
  95. data/lib/ab_admin/concerns/reloadable.rb +56 -0
  96. data/lib/ab_admin/concerns/utilities.rb +3 -3
  97. data/lib/ab_admin/concerns/validations.rb +2 -2
  98. data/lib/ab_admin/config/base.rb +5 -5
  99. data/lib/ab_admin/config/optional_display.rb +4 -4
  100. data/lib/ab_admin/controllers/callbacks.rb +1 -1
  101. data/lib/ab_admin/controllers/can_can_manager_resource.rb +1 -1
  102. data/lib/ab_admin/controllers/head_options.rb +5 -9
  103. data/lib/ab_admin/controllers/tree.rb +2 -2
  104. data/lib/ab_admin/core_ext/other.rb +2 -2
  105. data/lib/ab_admin/core_ext/string.rb +2 -2
  106. data/lib/ab_admin/devise.rb +3 -3
  107. data/lib/ab_admin/engine.rb +1 -1
  108. data/lib/ab_admin/hooks/paginate_hooks.rb +2 -2
  109. data/lib/ab_admin/hooks/simple_form_hooks.rb +2 -2
  110. data/lib/ab_admin/i18n_tools/google_translate.rb +5 -5
  111. data/lib/ab_admin/i18n_tools/model_translator.rb +7 -7
  112. data/lib/ab_admin/i18n_tools/translate_app.rb +1 -1
  113. data/lib/ab_admin/menu_builder.rb +3 -3
  114. data/lib/ab_admin/models/asset.rb +14 -6
  115. data/lib/ab_admin/models/attachment_file.rb +2 -2
  116. data/lib/ab_admin/models/header.rb +1 -1
  117. data/lib/ab_admin/models/locator.rb +3 -3
  118. data/lib/ab_admin/models/structure.rb +8 -8
  119. data/lib/ab_admin/models/type_model.rb +3 -3
  120. data/lib/ab_admin/models/user.rb +7 -7
  121. data/lib/ab_admin/utils/csv_document.rb +2 -2
  122. data/lib/ab_admin/utils/logger.rb +1 -1
  123. data/lib/ab_admin/utils/xls_document.rb +4 -4
  124. data/lib/ab_admin/utils.rb +11 -11
  125. data/lib/ab_admin/version.rb +1 -1
  126. data/lib/ab_admin/views/admin_helpers.rb +13 -13
  127. data/lib/ab_admin/views/admin_navigation_helpers.rb +26 -26
  128. data/lib/ab_admin/views/form_builder.rb +36 -22
  129. data/lib/ab_admin/views/helpers.rb +6 -6
  130. data/lib/ab_admin/views/inputs/ckeditor_input.rb +1 -1
  131. data/lib/ab_admin/views/inputs/color_input.rb +1 -1
  132. data/lib/ab_admin/views/inputs/date_time_input.rb +7 -7
  133. data/lib/ab_admin/views/manager_helpers.rb +3 -3
  134. data/lib/ab_admin/views/search_form_builder.rb +18 -18
  135. data/lib/ab_admin/views/url_for_routes.rb +4 -4
  136. data/lib/ab_admin.rb +1 -2
  137. data/lib/generators/ab_admin/glob/glob_generator.rb +1 -1
  138. data/lib/generators/ab_admin/install/install_generator.rb +2 -2
  139. data/lib/generators/ab_admin/install/templates/config/admin_menu.rb +2 -0
  140. data/lib/generators/ab_admin/install/templates/config/seeds.rb +1 -1
  141. data/lib/generators/ab_admin/install/templates/config/unicorn_config.rb +3 -3
  142. data/lib/generators/ab_admin/install/templates/helpers/admin/structures_helper.rb +2 -2
  143. data/lib/generators/ab_admin/install/templates/models/ability.rb +4 -4
  144. data/lib/generators/ab_admin/install/templates/models/admin_comment.rb +4 -4
  145. data/lib/generators/ab_admin/install/templates/models/asset.rb +2 -1
  146. data/lib/generators/ab_admin/install/templates/models/attachment_file.rb +1 -1
  147. data/lib/generators/ab_admin/install/templates/models/avatar.rb +2 -2
  148. data/lib/generators/ab_admin/install/templates/models/locator.rb +3 -0
  149. data/lib/generators/ab_admin/install/templates/models/picture.rb +2 -2
  150. data/lib/generators/ab_admin/install/templates/models/settings.rb +3 -0
  151. data/lib/generators/ab_admin/install/templates/models/static_page.rb +3 -3
  152. data/lib/generators/ab_admin/install/templates/models/structure.rb +2 -2
  153. data/lib/generators/ab_admin/install/templates/models/user.rb +2 -2
  154. data/lib/generators/ab_admin/install/templates/spec/spec_helper.rb +2 -2
  155. data/lib/generators/ab_admin/install/templates/spec/support/shared_connection.rb +1 -1
  156. data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +2 -2
  157. data/lib/generators/ab_admin/install/templates/uploaders/picture_uploader.rb +4 -3
  158. data/lib/generators/ab_admin/model/model_generator.rb +4 -2
  159. data/lib/generators/ab_admin/model/templates/resource.erb +6 -6
  160. data/lib/generators/ab_admin/resource/resource_generator.rb +9 -9
  161. data/lib/generators/ab_admin/resource/templates/_form.haml.erb +10 -14
  162. data/lib/generators/ab_admin/resource/templates/_form.slim.erb +11 -11
  163. data/lib/generators/ab_admin/resource/templates/_search_form.haml.erb +1 -1
  164. data/lib/generators/ab_admin/resource/templates/_search_form.slim.erb +1 -1
  165. data/lib/generators/ab_admin/resource/templates/controller.erb +1 -1
  166. data/lib/generators/template.rb +8 -8
  167. data/lib/tasks/assets.rake +5 -5
  168. data/lib/tasks/cache.rake +1 -1
  169. data/lib/tasks/i18n.rake +1 -1
  170. data/spec/ab_admin_spec.rb +3 -3
  171. data/spec/dummy/app/models/ab_admin/ab_admin_catalogue.rb +1 -1
  172. data/spec/dummy/app/models/ab_admin/ab_admin_collection.rb +6 -6
  173. data/spec/dummy/app/models/ab_admin/ab_admin_product.rb +14 -14
  174. data/spec/dummy/app/models/admin_menu.rb +2 -2
  175. data/spec/dummy/app/models/ckeditor/asset.rb +1 -1
  176. data/spec/dummy/app/models/ckeditor/attachment_file.rb +1 -1
  177. data/spec/dummy/app/models/ckeditor/picture.rb +1 -1
  178. data/spec/dummy/app/models/collection.rb +5 -5
  179. data/spec/dummy/app/models/product.rb +5 -5
  180. data/spec/dummy/app/uploaders/ckeditor_attachment_file_uploader.rb +1 -1
  181. data/spec/dummy/app/uploaders/ckeditor_picture_uploader.rb +3 -3
  182. data/spec/dummy/app/views/layouts/application.html.erb +2 -2
  183. data/spec/dummy/config/application.rb +2 -2
  184. data/spec/dummy/config/environments/test.rb +1 -1
  185. data/spec/dummy/config/initializers/ckeditor.rb +2 -2
  186. data/spec/dummy/config/initializers/devise.rb +5 -5
  187. data/spec/dummy/config/initializers/session_store.rb +1 -1
  188. data/spec/dummy/config/initializers/simple_form.rb +8 -8
  189. data/spec/dummy/config/initializers/simple_form_bootstrap.rb +14 -14
  190. data/spec/dummy/config/initializers/wrap_parameters.rb +1 -1
  191. data/spec/dummy/config/routes.rb +2 -2
  192. data/spec/dummy/db/migrate/20130129151853_create_ckeditor_assets.rb +5 -5
  193. data/spec/dummy/db/migrate/20130130161853_create_collections.rb +2 -2
  194. data/spec/dummy/db/migrate/20130130162046_create_products.rb +2 -2
  195. data/spec/dummy/db/migrate/20130130175446_create_globalize_collection_product.rb +2 -2
  196. data/spec/dummy/db/migrate/20130207224516_create_catalogues.rb +3 -3
  197. data/spec/dummy/db/migrate/20130209223506_add_lat_lon_zoom_to_products.rb +1 -1
  198. data/spec/dummy/db/seeds.rb +5 -5
  199. data/spec/dummy/lib/capybara_irb.rb +10 -10
  200. data/spec/dummy/lib/tasks/cucumber.rake +10 -10
  201. data/spec/dummy/lib/templates/slim/scaffold/_form.html.slim +2 -2
  202. data/spec/factories/assets.rb +9 -9
  203. data/spec/factories/catalogues.rb +1 -1
  204. data/spec/factories/collections.rb +1 -1
  205. data/spec/factories/products.rb +2 -2
  206. data/spec/factories/structures.rb +2 -2
  207. data/spec/generators/ckeditor_assets_generator_spec.rb +1 -1
  208. data/spec/generators/install_generator_spec.rb +1 -1
  209. data/spec/generators/model_generator_spec.rb +2 -2
  210. data/spec/generators/resource_generator_spec.rb +1 -1
  211. data/spec/models/avatar_spec.rb +1 -1
  212. data/spec/models/picture_uploader_spec.rb +1 -1
  213. data/spec/models/structure_spec.rb +2 -2
  214. data/spec/models/user_spec.rb +1 -1
  215. data/spec/spec_helper.rb +3 -3
  216. data/spec/support/shared_connection.rb +1 -1
  217. data/vendor/assets/javascripts/ab_admin/jquery.Jcrop.js +1083 -0
  218. data/vendor/assets/stylesheets/ab_admin/jquery.Jcrop.min.css.scss +28 -0
  219. metadata +8 -6
  220. data/lib/ab_admin/views/inputs/association_input.rb +0 -13
  221. data/lib/ab_admin/views/inputs/tree_select_input.rb +0 -16
@@ -8,29 +8,42 @@ module AbAdmin
8
8
  include ActionView::Helpers::TagHelper
9
9
  include NestedForm::BuilderMixin if defined? NestedForm
10
10
 
11
- map_type :color, :to => ::AbAdmin::Views::Inputs::ColorInput
12
- map_type :ckeditor, :to => ::AbAdmin::Views::Inputs::CkeditorInput
13
- map_type :editor, :to => ::AbAdmin::Views::Inputs::EditorInput
14
- map_type :tree_select, :to => ::AbAdmin::Views::Inputs::TreeSelectInput
15
- map_type :association, :to => ::AbAdmin::Views::Inputs::AssociationInput
16
- map_type :date, :time, :datetime, :to => ::AbAdmin::Views::Inputs::DateTimeInput
17
- map_type :token, :to => ::AbAdmin::Views::Inputs::TokenInput
11
+ map_type :color, to: ::AbAdmin::Views::Inputs::ColorInput
12
+ map_type :ckeditor, to: ::AbAdmin::Views::Inputs::CkeditorInput
13
+ map_type :editor, to: ::AbAdmin::Views::Inputs::EditorInput
14
+ map_type :date, :time, :datetime, to: ::AbAdmin::Views::Inputs::DateTimeInput
15
+ map_type :token, to: ::AbAdmin::Views::Inputs::TokenInput
18
16
 
19
17
  def input(attribute_name, options = {}, &block)
20
- if options[:fancy]
21
- options[:input_html] ||= {}
22
- options[:input_html][:class] = "#{options[:input_html][:class]} fancy_select"
18
+ unless options.key?(:fancy)
19
+ if (!options.key?(:as) || options[:as] == :select) && options[:collection].respond_to?(:size) && options[:collection].size > 10
20
+ options[:input_html] ||= {}
21
+ options[:input_html][:class] = "#{options[:input_html][:class]} fancy_select"
22
+ end
23
23
  end
24
24
 
25
25
  case options[:as]
26
26
  when :uploader
27
- title = options[:title] || I18n.t("admin.#{attribute_name}", :default => object.class.han(attribute_name))
27
+ title = options[:title] || I18n.t("admin.#{attribute_name}", default: object.class.han(attribute_name))
28
28
  return template.input_set(title) { attach_file_field(attribute_name, options) }
29
29
  when :map
30
- title = options[:title] || I18n.t("admin.#{attribute_name}", :default => object.class.han(attribute_name))
30
+ title = options[:title] || I18n.t("admin.#{attribute_name}", default: object.class.han(attribute_name))
31
31
  prefix = options[:prefix] || object.class.model_name.singular
32
32
  data_fields = [:lat, :lon, :zoom].map { |attr| hidden_field(attr) }.join.html_safe
33
33
  return template.input_set(title) { data_fields + geo_input(prefix, options[:js_options]) }
34
+ when :token
35
+ options[:label] ||= object.class.han(attribute_name.to_s.sub(/^token_|_id$/, ''))
36
+ when :association, :tree_select
37
+ unless options[:reflection]
38
+ if options[:as] == :tree_select
39
+ options[:collection] ||= begin
40
+ reflection = object.class.reflect_on_association(attribute_name)
41
+ records = reflection.klass.all(reflection.options.slice(:conditions, :order))
42
+ reflection.klass.nested_opts_with_parent(records, object)
43
+ end
44
+ end
45
+ return association(attribute_name, options.merge(as: :select))
46
+ end
34
47
  end
35
48
 
36
49
  attribute_name = "#{attribute_name}_#{options[:locale]}" if options[:locale]
@@ -41,11 +54,11 @@ module AbAdmin
41
54
  def link_to_add_assoc(assoc, options={})
42
55
  model = @object.class.reflect_on_association(assoc).klass
43
56
  title = [@template.icon('plus', true), I18n.t('admin.add'), model.model_name.human].join(' ').html_safe
44
- link_to_add title, assoc, :class => "btn btn-primary #{options[:class]}"
57
+ link_to_add title, assoc, class: "btn btn-primary #{options[:class]}"
45
58
  end
46
59
 
47
60
  def link_to_remove_assoc
48
- link_to_remove @template.icon('trash', true) + I18n.t('admin.delete'), :class => 'btn btn-danger btn-mini pull-right'
61
+ link_to_remove @template.icon('trash', true) + I18n.t('admin.delete'), class: 'btn btn-danger btn-mini pull-right'
49
62
  end
50
63
 
51
64
  def locale_tabs(&block)
@@ -53,7 +66,7 @@ module AbAdmin
53
66
  Globalize.available_locales.each do |l|
54
67
  loc_html[l] = template.capture { block.call(l) }
55
68
  end
56
- template.render 'admin/shared/locale_tabs', :loc_html => loc_html
69
+ template.render 'admin/shared/locale_tabs', loc_html: loc_html
57
70
  end
58
71
 
59
72
  def save_buttons
@@ -90,10 +103,10 @@ module AbAdmin
90
103
  script_options = (options.delete(:script) || {}).stringify_keys
91
104
 
92
105
  params = {
93
- :method => attribute_name,
94
- :assetable_id => object.new_record? ? nil : object.id,
95
- :assetable_type => object.class.name,
96
- :guid => element_guid
106
+ method: attribute_name,
107
+ assetable_id: object.new_record? ? nil : object.id,
108
+ assetable_type: object.class.name,
109
+ guid: element_guid
97
110
  }.merge(script_options.delete(:params) || {})
98
111
 
99
112
  script_options['action'] ||= '/sunrise/fileupload?' + Rack::Utils.build_query(params)
@@ -129,7 +142,8 @@ module AbAdmin
129
142
  klass: params[:assetable_type],
130
143
  asset: asset_klass.to_s,
131
144
  assoc: params[:method],
132
- multiple: script_options['multiple']
145
+ multiple: script_options['multiple'],
146
+ crop: options[:crop]
133
147
  }
134
148
  }
135
149
 
@@ -138,7 +152,7 @@ module AbAdmin
138
152
  locals[:css_class] << 'error' if locals[:error]
139
153
 
140
154
 
141
- js_opts = [locals[:element_id], template.sort_admin_assets_path(:klass => asset_klass), locals[:multiple]].map(&:inspect).join(', ')
155
+ js_opts = [locals[:element_id], template.sort_admin_assets_path(klass: asset_klass), locals[:multiple]].map(&:inspect).join(', ')
142
156
  locals[:js] = <<-JAVASCRIPT
143
157
  var upl = new qq.FileUploaderInput(#{script_options.to_json});
144
158
  upl._setupDragDrop();
@@ -150,7 +164,7 @@ module AbAdmin
150
164
  template.concat javascript_tag("$(function(){new AssetDescription(#{opts})})")
151
165
  end
152
166
 
153
- template.render(:partial => "admin/fileupload/#{options[:container] || 'container'}", :locals => locals)
167
+ template.render(partial: "admin/fileupload/#{options[:container] || 'container'}", locals: locals)
154
168
  end
155
169
 
156
170
  protected
@@ -36,7 +36,7 @@ module AbAdmin
36
36
 
37
37
  def external_link(raw_link, options={}, &block)
38
38
  return unless raw_link.present?
39
- options.reverse_merge!(:title => raw_link, :target => '_blank', :rel => 'nofollow')
39
+ options.reverse_merge!(title: raw_link, target: '_blank', rel: 'nofollow')
40
40
  link = raw_link =~ /^http[s]?:\/\// ? raw_link : "http://#{raw_link}"
41
41
  if block_given?
42
42
  link_to link, options, &block
@@ -60,15 +60,15 @@ module AbAdmin
60
60
  end
61
61
 
62
62
  def render_title
63
- @page_title || I18n.t("page.title")
63
+ @page_title || I18n.t('page.title')
64
64
  end
65
65
 
66
66
  def render_keywords
67
- @page_keywords || I18n.t("page.keywords")
67
+ @page_keywords || I18n.t('page.keywords')
68
68
  end
69
69
 
70
70
  def render_description
71
- @page_description || I18n.t("page.description")
71
+ @page_description || I18n.t('page.description')
72
72
  end
73
73
 
74
74
  # swf_object
@@ -79,7 +79,7 @@ module AbAdmin
79
79
  attributes = options.delete(:attributes) || {}
80
80
  flashvars = options.delete(:flashvars) || {}
81
81
 
82
- attributes[:classid] ||= "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
82
+ attributes[:classid] ||= 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
83
83
  attributes[:id] ||= id
84
84
  attributes[:name] ||= id
85
85
 
@@ -88,7 +88,7 @@ module AbAdmin
88
88
  if options[:create_div]
89
89
  output_buffer << content_tag(:div,
90
90
  "This website requires <a href='http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&promoid=BIOW' target='_blank'>Flash player</a> #{flash_version} or higher.",
91
- :id => id)
91
+ id: id)
92
92
  end
93
93
 
94
94
  js = []
@@ -8,7 +8,7 @@ module AbAdmin
8
8
  @builder.template.concat @builder.template.javascript_include_tag('/javascripts/ckeditor/init')
9
9
  @builder.template.instance_variable_set(:@ckeditor_init, true)
10
10
  end
11
- input_html_options.reverse_merge!({:width => 800, :height => 200, :toolbar => 'Easy'})
11
+ input_html_options.reverse_merge!({width: 800, height: 200, toolbar: 'Easy'})
12
12
  @builder.cktext_area(attribute_name, input_html_options)
13
13
  end
14
14
  end
@@ -5,7 +5,7 @@ module AbAdmin
5
5
  def input
6
6
  value = @builder.object[attribute_name].to_s.sub(/^#|/, '#')
7
7
  name = "#{@builder.object_name}[#{attribute_name}]"
8
- @builder.template.tag(:input, input_html_options.merge(:type => 'color', :name => name, :value => value))
8
+ @builder.template.tag(:input, input_html_options.merge(type: 'color', name: name, value: value))
9
9
  end
10
10
  end
11
11
  end
@@ -16,14 +16,14 @@ module AbAdmin
16
16
 
17
17
  if [:date, :datetime].include? input_type
18
18
  attr = "#{data_target}_date"
19
- html << template.text_field_tag(attr, object.send(attribute_name).try(:strftime, "%d.%m.%Y"), :id => attr,
20
- :class => 'datepicker input-small', :data => {:target => data_target})
19
+ html << template.text_field_tag(attr, object.send(attribute_name).try(:strftime, '%d.%m.%Y'), id: attr,
20
+ class: 'datepicker input-small', data: {target: data_target})
21
21
  end
22
22
 
23
23
  if [:time, :datetime].include? input_type
24
24
  attr = "#{data_target}_time"
25
- html << template.text_field(attr, object.send(attribute_name).try(:strftime, "%H:%M"), :id => attr,
26
- :class => 'timepicker input-small', :data => {:target => data_target})
25
+ html << template.text_field(attr, object.send(attribute_name).try(:strftime, '%H:%M'), id: attr,
26
+ class: 'timepicker input-small', data: {target: data_target})
27
27
  end
28
28
 
29
29
  html.join.html_safe
@@ -38,11 +38,11 @@ module AbAdmin
38
38
  def value_format
39
39
  case input_type
40
40
  when :date then
41
- "%d.%m.%Y"
41
+ '%d.%m.%Y'
42
42
  when :datetime then
43
- "%d.%m.%Y %H:%M"
43
+ '%d.%m.%Y %H:%M'
44
44
  when :time then
45
- "%H:%M"
45
+ '%H:%M'
46
46
  end
47
47
  end
48
48
 
@@ -11,7 +11,7 @@ module AbAdmin
11
11
  end
12
12
 
13
13
  def form_builder
14
- manager.form ||= ::AbAdmin::Config::Form.default_for_model(resource_class, :skip => [:id, :created_at, :updated_at, :lft, :rgt, :depth])
14
+ manager.form ||= ::AbAdmin::Config::Form.default_for_model(resource_class, skip: [:id, :created_at, :updated_at, :lft, :rgt, :depth])
15
15
  end
16
16
 
17
17
  def show_builder
@@ -21,10 +21,10 @@ module AbAdmin
21
21
  def action_item_admin_path(name, record=nil)
22
22
  custom_action = manager.custom_action_for(name, self)
23
23
  if custom_action.collection?
24
- admin_collection_action_path(:model_name => resource_collection_name, :custom_action => custom_action.name)
24
+ admin_collection_action_path(model_name: resource_collection_name, custom_action: custom_action.name)
25
25
  else
26
26
  record ||= resource
27
- admin_member_action_path(:model_name => resource_collection_name, :id => record.id, :custom_action => custom_action.name)
27
+ admin_member_action_path(model_name: resource_collection_name, id: record.id, custom_action: custom_action.name)
28
28
  end
29
29
  end
30
30
  end
@@ -3,17 +3,17 @@ module AbAdmin
3
3
  class SearchFormBuilder < ::Ransack::Helpers::FormBuilder
4
4
  delegate :content_tag, :tag, :params,
5
5
  :text_field_tag, :check_box_tag, :radio_button_tag, :label_tag, :select_tag,
6
- :options_for_select, :options_from_collection_for_select, :hidden_field_tag, :to => :@template
6
+ :options_for_select, :options_from_collection_for_select, :hidden_field_tag, to: :@template
7
7
 
8
8
  def input(attr, options={})
9
9
  filed_type = filed_type(attr, options)
10
- content_tag :div, :class => "clearfix #{filed_type}" do
10
+ content_tag :div, class: "clearfix #{filed_type}" do
11
11
  send("#{filed_type}_field", attr, options)
12
12
  end
13
13
  end
14
14
 
15
15
  def select_field(attr, options={})
16
- label(attr, options[:label]) + content_tag(:div, :class => 'controls') do
16
+ label(attr, options[:label]) + content_tag(:div, class: 'controls') do
17
17
  param = "#{options[:value_attr] || attr}_eq"
18
18
 
19
19
  if options[:collection].is_a?(Proc)
@@ -31,21 +31,21 @@ module AbAdmin
31
31
  options[:html_options][:class] = [options[:html_options][:class], 'fancy_select'].join(' ')
32
32
  end
33
33
 
34
- html_options = options[:html_options].merge(:include_blank => true, :id => "q_#{attr}")
34
+ html_options = options[:html_options].merge(include_blank: true, id: "q_#{attr}")
35
35
  select_tag("q[#{param}]", options_for_select(collection, params[:q][param]), html_options)
36
36
  end
37
37
  end
38
38
 
39
39
  def date_field(attr, options={})
40
- label(attr, options[:label]) + content_tag(:div, :class => 'controls') do
40
+ label(attr, options[:label]) + content_tag(:div, class: 'controls') do
41
41
  gt_param, lt_param = "#{attr}_gteq", "#{attr}_lteq"
42
- text_field_tag("q[#{gt_param}]", params[:q][gt_param], :class => 'input-small datepicker', :autocomplete => 'off') + ' - ' +
43
- text_field_tag("q[#{lt_param}]", params[:q][lt_param], :class => 'input-small datepicker', :autocomplete => 'off', :id => "q_#{attr}")
42
+ text_field_tag("q[#{gt_param}]", params[:q][gt_param], class: 'input-small datepicker', autocomplete: 'off') + ' - ' +
43
+ text_field_tag("q[#{lt_param}]", params[:q][lt_param], class: 'input-small datepicker', autocomplete: 'off', id: "q_#{attr}")
44
44
  end
45
45
  end
46
46
 
47
47
  def string_field(attr, options={})
48
- label(attr, options[:label]) + content_tag(:div, :class => 'controls') do
48
+ label(attr, options[:label]) + content_tag(:div, class: 'controls') do
49
49
  param = "#{options[:value_attr] || attr}_cont"
50
50
  options[:input_html] ||= {}
51
51
  options[:input_html][:id] = "q_#{attr}"
@@ -54,29 +54,29 @@ module AbAdmin
54
54
  end
55
55
 
56
56
  def ac_string_field(attr, options={})
57
- options.reverse_deep_merge!({:input_html => {:class => 'ac_field', :data => {:class => @object.klass.name}}})
57
+ options.reverse_deep_merge!({input_html: {class: 'ac_field', data: {class: @object.klass.name}}})
58
58
  string_field(attr, options)
59
59
  end
60
60
 
61
61
  def number_field(attr, options={})
62
- label(attr, options[:label]) + content_tag(:div, :class => 'controls') do
62
+ label(attr, options[:label]) + content_tag(:div, class: 'controls') do
63
63
  opts = [['=', 'eq'], ['>', 'gt'], ['<', 'lt']].map { |m| [m[0], "#{attr}_#{m[1]}"] }
64
64
  current_filter = (opts.detect { |m| params[:q][m[1]].present? } || opts.first)[1]
65
- select_tag('', options_for_select(opts, current_filter), :class => 'input-small predicate-select') +
66
- text_field_tag("q[#{current_filter}]", params[:q][current_filter], :class => 'input-small')
65
+ select_tag('', options_for_select(opts, current_filter), class: 'input-small predicate-select') +
66
+ text_field_tag("q[#{current_filter}]", params[:q][current_filter], class: 'input-small')
67
67
  end
68
68
  end
69
69
 
70
70
  def boolean_field(attr, options={})
71
- content_tag(:div, :class => 'pull-left') do
71
+ content_tag(:div, class: 'pull-left') do
72
72
  param = "#{attr}_eq"
73
- content_tag(:label, :class => 'checkbox inline') do
74
- check_box_tag("q[#{param}]", 1, params[:q][param].to_i == 1, :class => 'inline', :id => "q_#{attr}") + I18n.t('simple_form.yes')
73
+ content_tag(:label, class: 'checkbox inline') do
74
+ check_box_tag("q[#{param}]", 1, params[:q][param].to_i == 1, class: 'inline', id: "q_#{attr}") + I18n.t('simple_form.yes')
75
75
  end +
76
- content_tag(:label, :class => 'checkbox inline') do
77
- check_box_tag("q[#{param}]", 0, params[:q][param] && params[:q][param].to_i == 0, :class => 'inline') + I18n.t('simple_form.no')
76
+ content_tag(:label, class: 'checkbox inline') do
77
+ check_box_tag("q[#{param}]", 0, params[:q][param] && params[:q][param].to_i == 0, class: 'inline') + I18n.t('simple_form.no')
78
78
  end
79
- end + label(attr, options[:label], :class => 'right-label')
79
+ end + label(attr, options[:label], class: 'right-label')
80
80
  end
81
81
 
82
82
  def hidden_field(attr, options={})
@@ -8,23 +8,23 @@ module AbAdmin
8
8
 
9
9
  def resource_path(rec=nil, options={})
10
10
  r = rec || resource
11
- options.reverse_merge!(:id => r.id, :action => :show)
11
+ options.reverse_merge!(id: r.id, action: :show)
12
12
  url_for options
13
13
  end
14
14
 
15
15
  def edit_resource_path(rec=nil, options={})
16
16
  r = rec || resource
17
- options.reverse_merge!(:id => r.id, :action => :edit)
17
+ options.reverse_merge!(id: r.id, action: :edit)
18
18
  url_for options
19
19
  end
20
20
 
21
21
  def new_resource_path(options={})
22
- options.reverse_merge!(:action => :new)
22
+ options.reverse_merge!(action: :new)
23
23
  url_for options
24
24
  end
25
25
 
26
26
  def collection_path(options={})
27
- options.reverse_merge!(:action => :index)
27
+ options.reverse_merge!(action: :index)
28
28
  url_for options
29
29
  end
30
30
  end
data/lib/ab_admin.rb CHANGED
@@ -50,6 +50,7 @@ module AbAdmin
50
50
  autoload :Headerable, 'ab_admin/concerns/headerable'
51
51
  autoload :NestedSet, 'ab_admin/concerns/nested_set'
52
52
  autoload :Validations, 'ab_admin/concerns/validations'
53
+ autoload :Reloadable, 'ab_admin/concerns/reloadable'
53
54
  end
54
55
 
55
56
  module Controllers
@@ -88,8 +89,6 @@ module AbAdmin
88
89
  autoload :CkeditorInput, 'ab_admin/views/inputs/ckeditor_input'
89
90
  autoload :ColorInput, 'ab_admin/views/inputs/color_input'
90
91
  autoload :EditorInput, 'ab_admin/views/inputs/editor_input'
91
- autoload :TreeSelectInput, 'ab_admin/views/inputs/tree_select_input'
92
- autoload :AssociationInput, 'ab_admin/views/inputs/association_input'
93
92
  autoload :DateTimeInput, 'ab_admin/views/inputs/date_time_input'
94
93
  autoload :TokenInput, 'ab_admin/views/inputs/token_input'
95
94
  end
@@ -6,7 +6,7 @@ module AbAdmin
6
6
 
7
7
  source_root File.expand_path('../templates', __FILE__)
8
8
 
9
- argument :name, :type => :string, :default => 'fake'
9
+ argument :name, type: :string, default: 'fake'
10
10
 
11
11
  def create_migration
12
12
  migration_template 'migration.erb', "db/migrate/#{migration_name}.rb"
@@ -42,7 +42,7 @@ module AbAdmin
42
42
  # Add devise routes
43
43
  def add_routes
44
44
  route 'devise_for :users, ::AbAdmin::Devise.config'
45
- route %[root :to => redirect('/users/sign_in')]
45
+ route 'root to: redirect(\'/users/sign_in\')'
46
46
  end
47
47
 
48
48
  def autoload_paths
@@ -52,7 +52,7 @@ module AbAdmin
52
52
  code = 'config.autoload_paths += %W(#{config.root}/app/models/defaults #{config.root}/app/models/ab_admin)'
53
53
 
54
54
  in_root do
55
- inject_into_file 'config/application.rb', " #{code}\n", {:after => sentinel, :verbose => false}
55
+ inject_into_file 'config/application.rb', " #{code}\n", {after: sentinel, verbose: false}
56
56
  end
57
57
  end
58
58
 
@@ -1,5 +1,7 @@
1
1
  class AdminMenu < AbAdmin::MenuBuilder
2
2
  draw do
3
+ link :dashboard, '/admin'
4
+
3
5
  model User
4
6
  group :system do
5
7
  model Structure
@@ -20,7 +20,7 @@ end
20
20
  def insert_structures
21
21
  Structure.truncate!
22
22
 
23
- main_page = Structure.create!({:title => 'Главная страница', :slug => 'main-page', :structure_type => StructureType.main, :parent => nil}, :as => :admin)
23
+ main_page = Structure.create!({title: 'Главная страница', slug: 'main-page', structure_type: StructureType.main, parent: nil}, as: :admin)
24
24
  end
25
25
 
26
26
  insert_user
@@ -10,8 +10,8 @@ worker_processes 2
10
10
 
11
11
  working_directory APP_ROOT
12
12
 
13
- listen "#{APP_ROOT}/tmp/sockets/unicorn.sock", :backlog => 64
14
- listen 8080, :tcp_nopush => true
13
+ listen "#{APP_ROOT}/tmp/sockets/unicorn.sock", backlog: 64
14
+ listen 8080, tcp_nopush: true
15
15
 
16
16
  timeout 90
17
17
 
@@ -43,7 +43,7 @@ end
43
43
  after_fork do |server, worker|
44
44
  # per-process listener ports for debugging/admin/migrations
45
45
  # addr = "127.0.0.1:#{9293 + worker.nr}"
46
- # server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => true)
46
+ # server.listen(addr, tries: -1, delay: 5, tcp_nopush: true)
47
47
 
48
48
  defined?(ActiveRecord::Base) and
49
49
  ActiveRecord::Base.establish_connection
@@ -4,9 +4,9 @@ module Admin::StructuresHelper
4
4
  case structure.structure_type
5
5
  when StructureType.static_page
6
6
  if structure.static_page
7
- edit_admin_structure_static_page_path(:structure_id => structure.id)
7
+ edit_admin_structure_static_page_path(structure_id: structure.id)
8
8
  else
9
- new_admin_structure_static_page_path(:structure_id => structure.id)
9
+ new_admin_structure_static_page_path(structure_id: structure.id)
10
10
  end
11
11
  when StructureType.posts
12
12
  '#'
@@ -2,7 +2,7 @@ class Ability
2
2
  include CanCan::Ability
3
3
 
4
4
  def initialize(user)
5
- alias_action :destroy, :to => :delete
5
+ alias_action :destroy, to: :delete
6
6
 
7
7
  @user = user
8
8
 
@@ -33,13 +33,13 @@ class Ability
33
33
  default
34
34
  can :manage, Dashboard
35
35
  can [:read, :create], AdminComment
36
- can :destroy, AdminComment, :author_id => @user.id
37
- cannot :destroy, User, :id => @user.id
36
+ can :destroy, AdminComment, author_id: @user.id
37
+ cannot :destroy, User, id: @user.id
38
38
  end
39
39
 
40
40
  def admin
41
41
  can :manage, :all
42
42
 
43
- cannot :destroy, User, :id => @user.id
43
+ cannot :destroy, User, id: @user.id
44
44
  end
45
45
  end
@@ -1,8 +1,8 @@
1
1
  class AdminComment < ActiveRecord::Base
2
2
  attr_accessible :body, :resource_id, :resource_type
3
3
 
4
- belongs_to :resource, :polymorphic => true
5
- belongs_to :author, :class_name => 'User'
4
+ belongs_to :resource, polymorphic: true
5
+ belongs_to :author, class_name: 'User'
6
6
  belongs_to :user
7
7
 
8
8
  validates_presence_of :resource
@@ -19,11 +19,11 @@ class AdminComment < ActiveRecord::Base
19
19
  end
20
20
 
21
21
  def self.find_for_resource(resource)
22
- where(:resource_type => resource_type(resource), :resource_id => resource.id)
22
+ where(resource_type: resource_type(resource), resource_id: resource.id)
23
23
  end
24
24
 
25
25
  def for_form
26
- {:body => body, :id => id, :author_name => user.try(:name), :author_id => user.try(:id), :created_at => I18n.l(created_at, :format => :long)}
26
+ {body: body, id: id, author_name: user.try(:name), author_id: user.try(:id), created_at: I18n.l(created_at, format: :long)}
27
27
  end
28
28
 
29
29
  end
@@ -6,4 +6,5 @@ class Asset < ActiveRecord::Base
6
6
  validates_presence_of :data
7
7
 
8
8
  default_scope order("#{quoted_table_name}.sort_order")
9
- end
9
+
10
+ end
@@ -2,7 +2,7 @@ class AttachmentFile < Asset
2
2
  include AbAdmin::Models::AttachmentFile
3
3
 
4
4
  sunrise_uploader AttachmentFileUploader
5
- validates_filesize_of :data, :maximum => 150.megabytes
5
+ validates_filesize_of :data, maximum: 150.megabytes
6
6
 
7
7
  self.max_size = 150
8
8
  end
@@ -1,8 +1,8 @@
1
1
  class Avatar < Asset
2
2
  sunrise_uploader AvatarUploader
3
3
 
4
- validates :data_content_type, :inclusion => {:in => AbAdmin.image_types }
4
+ validates :data_content_type, inclusion: {in: AbAdmin.image_types }
5
5
  validates_integrity_of :data
6
- validates_filesize_of :data, :maximum => 1.megabyte
6
+ validates_filesize_of :data, maximum: 1.megabyte
7
7
 
8
8
  end
@@ -4,6 +4,9 @@ require 'ostruct'
4
4
  class Locator
5
5
  include Singleton
6
6
  include AbAdmin::Models::Locator
7
+ include ::AbAdmin::Concerns::Reloadable
8
+
9
+ has_reload_check('i18n_reload_key', Rails.logger) { I18n.reload! }
7
10
 
8
11
  attr_accessor :files, :data
9
12
 
@@ -1,7 +1,7 @@
1
1
  class Picture < Asset
2
2
  sunrise_uploader PictureUploader
3
3
 
4
- validates :data_content_type, :inclusion => {:in => AbAdmin.image_types }
4
+ validates :data_content_type, inclusion: {in: AbAdmin.image_types }
5
5
  validates_integrity_of :data
6
- validates_filesize_of :data, :maximum => 2.megabytes
6
+ validates_filesize_of :data, maximum: 2.megabytes
7
7
  end
@@ -3,6 +3,9 @@ require 'configatron'
3
3
  class Settings
4
4
  include Singleton
5
5
  include AbAdmin::Models::Settings
6
+ include ::AbAdmin::Concerns::Reloadable
7
+
8
+ has_reload_check('settings_reload_key', Rails.logger) { Settings.load }
6
9
 
7
10
  attr_accessor :paths, :data
8
11
 
@@ -3,12 +3,12 @@ class StaticPage < ActiveRecord::Base
3
3
 
4
4
  belongs_to :structure
5
5
 
6
- has_many :pictures, :as => :assetable, :dependent => :destroy
7
- has_many :attachment_files, :as => :assetable, :dependent => :destroy, :autosave => true
6
+ has_many :pictures, as: :assetable, dependent: :destroy
7
+ has_many :attachment_files, as: :assetable, dependent: :destroy, autosave: true
8
8
 
9
9
  validates_presence_of :title, :content
10
10
 
11
- enumerated_attribute :static_page_type, :id_attribute => :kind
11
+ enumerated_attribute :static_page_type, id_attribute: :kind
12
12
 
13
13
  fileuploads :pictures, :attachment_files
14
14
  translates :title, :content
@@ -4,7 +4,7 @@ class Structure < ActiveRecord::Base
4
4
  attr_accessible :kind, :position, :parent_id, :title, :redirect_url, :is_visible,
5
5
  :structure_type, :position_type, :slug, :parent
6
6
 
7
- has_one :picture, :as => :assetable, :dependent => :destroy
7
+ has_one :picture, as: :assetable, dependent: :destroy
8
8
 
9
9
  fileuploads :picture
10
10
  translates :title, :redirect_url
@@ -12,7 +12,7 @@ class Structure < ActiveRecord::Base
12
12
 
13
13
  include AbAdmin::Concerns::AdminAddition
14
14
  extend FriendlyId
15
- friendly_id :title, :use => :slugged
15
+ friendly_id :title, use: :slugged
16
16
 
17
17
  default_scope nested_set.includes(:translations)
18
18
 
@@ -1,14 +1,14 @@
1
1
  class User < ActiveRecord::Base
2
2
  devise :database_authenticatable, :confirmable, :lockable, #:timeoutable,
3
3
  :recoverable, :rememberable, :trackable, :validatable, :registerable,
4
- :encryptable, :encryptor => :sha512
4
+ :encryptable, encryptor: :sha512
5
5
 
6
6
  attr_accessible :password, :password_confirmation, :email, :remember_me,
7
7
  :login, :first_name, :last_name, :patronymic, :phone, :skype, :web_site, :address, :birthday,
8
8
  :time_zone, :locale, :bg_color, :gender
9
9
 
10
10
 
11
- attr_accessible :user_role_id, :trust_state, :as => :admin
11
+ attr_accessible :user_role_id, :trust_state, as: :admin
12
12
 
13
13
  include AbAdmin::Concerns::AdminAddition
14
14
  include AbAdmin::Models::User