ab_admin 0.2.3 → 0.3.0

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