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
@@ -1,13 +1,13 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  ### UTILITY METHODS ###
3
3
  def valid_user
4
- @user ||= {:email => 'test@example.com', :password => '123456'}
4
+ @user ||= {email: 'test@example.com', password: '123456'}
5
5
  end
6
6
 
7
7
  def sign_in(user)
8
8
  visit new_user_session_path
9
- fill_in 'Email', :with => user[:email]
10
- fill_in 'Password', :with => user[:password]
9
+ fill_in 'Email', with: user[:email]
10
+ fill_in 'Password', with: user[:password]
11
11
  click_button 'Sign in'
12
12
  end
13
13
 
@@ -17,7 +17,7 @@ Given /^I am signed out$/ do
17
17
  end
18
18
 
19
19
  Given /^I do not exist as a user$/ do
20
- User.where(:email => valid_user[:email]).first.should be_nil
20
+ User.where(email: valid_user[:email]).first.should be_nil
21
21
  end
22
22
 
23
23
  Given /^I exist as a user$/ do
@@ -38,7 +38,7 @@ Then /^I should be signed out$/ do
38
38
  end
39
39
 
40
40
  When /^I sign in with a wrong password$/ do
41
- sign_in valid_user.merge(:password => 'wrong')
41
+ sign_in valid_user.merge(password: 'wrong')
42
42
  end
43
43
 
44
44
  Then /^I see a successful sign in message$/ do
@@ -46,7 +46,7 @@ Then /^I see a successful sign in message$/ do
46
46
  end
47
47
 
48
48
  Then /^I should see my name$/ do
49
- page.should have_content(User.where(:email => valid_user[:email]).first.try(:name))
49
+ page.should have_content(User.where(email: valid_user[:email]).first.try(:name))
50
50
  end
51
51
 
52
52
  Given /^I am logged in$/ do
@@ -55,7 +55,7 @@ Given /^I am logged in$/ do
55
55
  end
56
56
 
57
57
  Given /^I am logged in as "(.*)"$/ do |email|
58
- @me = FactoryGirl.create(:admin_user, valid_user.merge(:email => email))
58
+ @me = FactoryGirl.create(:admin_user, valid_user.merge(email: email))
59
59
  login_as @me
60
60
  end
61
61
 
@@ -35,14 +35,14 @@ Then /^(?:|I )should see \/([^\/]*)\/([imxo])?$/ do |regexp,flags|
35
35
  regexp_opts = [regexp,flags].compact
36
36
  regexp = Regexp.new(*regexp_opts)
37
37
 
38
- page.should have_xpath('//*', :text => regexp)
38
+ page.should have_xpath('//*', text: regexp)
39
39
  end
40
40
 
41
41
  Then /^(?:|I )should not see \/([^\/]*)\/([imxo])?$/ do |regexp,flags|
42
42
  regexp_opts = [regexp,flags].compact
43
43
  regexp = Regexp.new(*regexp_opts)
44
44
 
45
- page.should have_no_xpath('//*', :text => regexp)
45
+ page.should have_no_xpath('//*', text: regexp)
46
46
  end
47
47
 
48
48
  Then /^(?:|I )should be on (.+)$/ do |page_name|
@@ -42,15 +42,15 @@ When /^(?:|I )fill in the following:$/ do |fields|
42
42
  end
43
43
 
44
44
  When /^(?:|I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
45
- fill_in(field, :with => value)
45
+ fill_in(field, with: value)
46
46
  end
47
47
 
48
48
  When /^(?:|I )fill in "([^"]*)" with:$/ do |field, value|
49
- fill_in(field, :with => value)
49
+ fill_in(field, with: value)
50
50
  end
51
51
 
52
52
  When /^(?:|I )select "([^"]*)" from "([^"]*)"$/ do |value, field|
53
- select(value, :from => field)
53
+ select(value, from: field)
54
54
  end
55
55
 
56
56
  When /^(?:|I )check "([^"]*)"$/ do |field|
@@ -136,7 +136,7 @@ When /^(?:I|i) select following values from "([^"]*)":$/ do |field, values|
136
136
  end
137
137
 
138
138
  values.each do |value|
139
- select(value, :from => field)
139
+ select(value, from: field)
140
140
  end
141
141
  end
142
142
 
@@ -149,7 +149,7 @@ When /^(?:I|i) unselect following values from "([^"]*)":$/ do |field, values|
149
149
  end
150
150
 
151
151
  values.each do |value|
152
- unselect(value, :from => field)
152
+ unselect(value, from: field)
153
153
  end
154
154
  end
155
155
 
@@ -163,7 +163,7 @@ Then /^the following values should be selected in "([^"]*)":$/ do |select_box, v
163
163
 
164
164
  select_box = find_field(select_box)
165
165
  unless select_box['multiple']
166
- raise "this is not multiple select box!"
166
+ raise 'this is not multiple select box!'
167
167
  else
168
168
  values.each do |value|
169
169
  select_box.value.should include(value)
@@ -181,7 +181,7 @@ Then /^the following values should not be selected in "([^"]*)":$/ do |select_bo
181
181
 
182
182
  select_box = find_field(select_box)
183
183
  unless select_box['multiple']
184
- raise "this is not multiple select box!"
184
+ raise 'this is not multiple select box!'
185
185
  else
186
186
  values.each do |value|
187
187
  select_box.value.should_not include(value)
@@ -8,12 +8,12 @@ module HtmlSelectorsHelpers
8
8
  def selector_for(locator)
9
9
  case locator
10
10
 
11
- when "the page"
12
- "html > body"
13
- when "table's header"
14
- "table tbody > tr th"
11
+ when 'the page'
12
+ 'html > body'
13
+ when 'table\'s header'
14
+ 'table tbody > tr th'
15
15
  when /^paragraphs?$/
16
- "p"
16
+ 'p'
17
17
 
18
18
  # Add more mappings here.
19
19
  # Here is an example that pulls values out of the Regexp:
@@ -13,7 +13,7 @@ module ToleranceForSeleniumSyncIssues
13
13
  rescue => e
14
14
  raise e if (Time.now - start_time) >= seconds
15
15
  sleep(0.05)
16
- raise Capybara::FrozenInTime, "time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead" if Time.now == start_time
16
+ raise Capybara::FrozenInTime, 'time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead' if Time.now == start_time
17
17
  retry
18
18
  end
19
19
  else
@@ -12,7 +12,7 @@ module AbAdmin
12
12
 
13
13
  def initialize
14
14
  @actions = ACTIONS
15
- @batch_action_list = [AbAdmin::Config::BatchAction.new(:destroy, :confirm => I18n.t('admin.delete_confirmation'))]
15
+ @batch_action_list = [AbAdmin::Config::BatchAction.new(:destroy, confirm: I18n.t('admin.delete_confirmation'))]
16
16
  @action_items = []
17
17
  @disabled_action_items = []
18
18
  @default_action_items_for = {}
@@ -100,7 +100,7 @@ module AbAdmin
100
100
  def belongs_to(*args)
101
101
  options = args.extract_options!
102
102
  args.each do |name|
103
- instance.parent_resources << OpenStruct.new(:name => name, :options => options)
103
+ instance.parent_resources << OpenStruct.new(name: name, options: options)
104
104
  end
105
105
  end
106
106
 
@@ -109,7 +109,7 @@ module AbAdmin
109
109
  end
110
110
 
111
111
  def collection_action(name, options={}, &block)
112
- instance.custom_actions << AbAdmin::Config::CustomAction.new(name, options.merge(:collection => true), &block)
112
+ instance.custom_actions << AbAdmin::Config::CustomAction.new(name, options.merge(collection: true), &block)
113
113
  end
114
114
  end
115
115
 
@@ -15,10 +15,10 @@ module AbAdmin
15
15
 
16
16
  process :set_content_type
17
17
 
18
- with_options :if => :image? do |img|
18
+ with_options if: :image? do |img|
19
19
  img.process :strip
20
- img.process :cropper => lambda { |model| model.cropper_geometry }
21
- img.process :rotate => lambda { |model| model.rotate_degrees }
20
+ img.process cropper: lambda { |model| model.cropper_geometry }
21
+ img.process rotate: lambda { |model| model.rotate_degrees }
22
22
  end
23
23
 
24
24
  process :set_model_info
@@ -40,7 +40,7 @@ module AbAdmin
40
40
  end
41
41
 
42
42
  # Reduces the quality of the image to the percentage given
43
- # process :quality => 85
43
+ # process quality: 85
44
44
  #
45
45
  def quality(percentage)
46
46
  percentage = normalize_param(percentage)
@@ -55,7 +55,7 @@ module AbAdmin
55
55
  end
56
56
 
57
57
  # Rotate image by degress
58
- # process :rotate => "-90"
58
+ # process rotate: "-90"
59
59
  #
60
60
  def rotate(degrees = nil)
61
61
  degrees = normalize_param(degrees)
@@ -71,8 +71,8 @@ module AbAdmin
71
71
 
72
72
  # Crop image by specific coordinates
73
73
  # http://www.imagemagick.org/script/command-line-processing.php?ImageMagick=6ddk6c680muj4eu2vr54vdveb7#geometry
74
- # process :cropper => [size, offset]
75
- # process :cropper => [800, 600, 10, 20]
74
+ # process cropper: [size, offset]
75
+ # process cropper: [800, 600, 10, 20]
76
76
  #
77
77
  def cropper(*geometry)
78
78
  geometry = normalize_param(geometry[0]) if geometry.size == 1
@@ -2,15 +2,15 @@
2
2
  module AbAdmin
3
3
  module CarrierWave
4
4
  class FileSizeValidator < ActiveModel::EachValidator
5
- MESSAGES = { :is => :wrong_size, :minimum => :size_too_small, :maximum => :size_too_big }.freeze
6
- CHECKS = { :is => :==, :minimum => :>=, :maximum => :<= }.freeze
5
+ MESSAGES = { is: :wrong_size, minimum: :size_too_small, maximum: :size_too_big }.freeze
6
+ CHECKS = { is: :==, minimum: :>=, maximum: :<= }.freeze
7
7
 
8
8
  DEFAULT_TOKENIZER = lambda { |value| value.split(//) }
9
9
  RESERVED_OPTIONS = [:minimum, :maximum, :within, :is, :tokenizer, :too_short, :too_long]
10
10
 
11
11
  def initialize(options)
12
12
  if range = (options.delete(:in) || options.delete(:within))
13
- raise ArgumentError, ":in and :within must be a Range" unless range.is_a?(Range)
13
+ raise ArgumentError, ':in and :within must be a Range' unless range.is_a?(Range)
14
14
  options[:minimum], options[:maximum] = range.begin, range.end
15
15
  options[:maximum] -= 1 if range.exclude_end?
16
16
  end
@@ -35,7 +35,7 @@ module AbAdmin
35
35
  end
36
36
 
37
37
  def validate_each(record, attribute, value)
38
- raise(ArgumentError, "A CarrierWave::Uploader::Base object was expected") unless value.kind_of? ::CarrierWave::Uploader::Base
38
+ raise(ArgumentError, 'A CarrierWave::Uploader::Base object was expected') unless value.kind_of? ::CarrierWave::Uploader::Base
39
39
 
40
40
  value = (options[:tokenizer] || DEFAULT_TOKENIZER).call(value) if value.kind_of?(String)
41
41
 
@@ -6,7 +6,7 @@ module AbAdmin
6
6
 
7
7
  module ClassMethods
8
8
  def sunrise_uploader(uploader=nil, options={}, &block)
9
- options = { :mount_on => :data_file_name }.merge(options)
9
+ options = { mount_on: :data_file_name }.merge(options)
10
10
 
11
11
  mount_uploader(:data, uploader, options, &block)
12
12
 
@@ -9,35 +9,39 @@ module AbAdmin
9
9
  scope(:base, scoped) unless respond_to?(:base)
10
10
  scope :ids, lambda { |ids| where("#{quoted_table_name}.id IN (?)", AbAdmin.val_to_array(ids).push(0)) }
11
11
 
12
- class_attribute :batch_actions, :instance_writer => false
12
+ class_attribute :batch_actions, instance_writer: false
13
13
  self.batch_actions = [:destroy]
14
14
  end
15
15
 
16
16
  module ClassMethods
17
17
  def for_input_token(r, attr='name_ru')
18
- {:id => r.id, :text => r[attr]}
18
+ {id: r.id, text: r[attr]}
19
19
  end
20
20
  end
21
21
 
22
22
  def for_input_token
23
- {:id => self.id, :text => self.name}
23
+ {id: id, text: name}
24
24
  end
25
25
 
26
26
  def token_data(method, options={})
27
27
  assoc = self.class.reflect_on_association(method)
28
- records = self.send(method)
29
- data = Array(records).map(&:for_input_token)
28
+ records = Array(send(method))
29
+ data = records.map(&:for_input_token)
30
30
  data = {
31
- :pre => data.to_json,
32
- :class => assoc.klass.name,
33
- :multi => assoc.collection?,
34
- :c => options.delete(:c)
31
+ pre: data.to_json,
32
+ class: assoc.klass.name,
33
+ multi: assoc.collection?,
34
+ c: options.delete(:c)
35
35
  }
36
36
  if options[:geo_order]
37
+ data[:c] ||= {}
37
38
  singular = self.class.model_name.singular
38
- data[:c] ||= {:with => {:lat => "#{singular}_lat", :lon => "#{singular}_lon"}}.to_json
39
+ data[:c].reverse_deep_merge!({with: {lat: "#{singular}_lat", lon: "#{singular}_lon"}})
39
40
  end
40
- options.reverse_deep_merge!(:class => 'fancy_select', :data => data)
41
+ if data[:c] && !data[:c].is_a?(String)
42
+ data[:c] = data[:c].to_json
43
+ end
44
+ options.reverse_deep_merge!(class: 'fancy_select', data: data, value: records.map(&:id).join(','))
41
45
  end
42
46
 
43
47
  def next_prev_by_url(scope, url, prev=false)
@@ -56,8 +60,8 @@ module AbAdmin
56
60
  predicate = order_mode == 'desc' ? '<' : '>'
57
61
  id_predicate = '>'
58
62
  end
59
- sql = "(#{quoted_order_col} #{predicate} :val OR (#{quoted_order_col} = :val AND #{self.class.quote_column('id')} #{id_predicate} #{self.id}))"
60
- scope.where(sql, :val => self.send(order_col)).ransack(query[:q]).result(:distinct => true).first
63
+ sql = "(#{quoted_order_col} #{predicate} :val OR (#{quoted_order_col} = :val AND #{self.class.quote_column('id')} #{id_predicate} #{id}))"
64
+ scope.where(sql, val: send(order_col)).ransack(query[:q]).result(distinct: true).first
61
65
  end
62
66
 
63
67
  end
@@ -5,11 +5,11 @@ module AbAdmin
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- has_one :header, :as => :headerable, :dependent => :delete
8
+ has_one :header, as: :headerable, dependent: :delete
9
9
 
10
10
  attr_accessible :header_attributes
11
11
 
12
- accepts_nested_attributes_for :header, :reject_if => :all_blank
12
+ accepts_nested_attributes_for :header, reject_if: :all_blank
13
13
 
14
14
  ::Header.all_translated_attribute_names.each do |attr|
15
15
  define_method "header_#{attr}=" do |val|
@@ -12,7 +12,7 @@ module AbAdmin
12
12
 
13
13
  scope :nested_set, order('lft ASC')
14
14
  scope :reversed_nested_set, order('lft DESC')
15
- scope :with_depth, proc { |level| where(:depth => level) }
15
+ scope :with_depth, proc { |level| where(depth: level) }
16
16
  end
17
17
 
18
18
  module ClassMethods
@@ -34,6 +34,7 @@ module AbAdmin
34
34
  end
35
35
 
36
36
  def nested_opts(records, mover=nil)
37
+ mover = nil if mover && !mover.is_a?(self)
37
38
  res = []
38
39
  records.each do |r|
39
40
  next if mover && mover.id == r.id
@@ -41,6 +42,27 @@ module AbAdmin
41
42
  end
42
43
  res
43
44
  end
45
+
46
+ def nested_opts_with_parent(records, mover=nil)
47
+ mover = nil if mover && !mover.is_a?(self)
48
+ res = []
49
+ parents = []
50
+ records.each do |r|
51
+ r.root? ? parents = [] : parents.reject! { |p| p.depth >= r.depth }
52
+
53
+ unless mover && mover.id == r.id
54
+ res << ["#{parents.map { |c| "#{AbAdmin.display_name(c)} - " }.join} <b>#{AbAdmin.display_name(r)}</b>", r.id]
55
+ end
56
+
57
+ parents << r
58
+ end
59
+ res
60
+ end
61
+ end
62
+
63
+ def nested_opts_with_parent(collection=nil)
64
+ collection ||= self.class.all
65
+ self.class.nested_opts_with_parent(collection, self)
44
66
  end
45
67
 
46
68
  def nested_opts(collection=nil)
@@ -0,0 +1,56 @@
1
+ module AbAdmin
2
+ module Concerns
3
+ module Reloadable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ class_attribute :reload_checker
8
+ end
9
+
10
+ module ClassMethods
11
+
12
+ def has_reload_check(key=nil, logger=nil, &block)
13
+ self.reload_checker = ::AbAdmin::Concerns::Reloadable::Reloader.new(key, logger, &block)
14
+ end
15
+
16
+ def check_reload
17
+ self.reload_checker.check
18
+ end
19
+
20
+ end
21
+
22
+ class Reloader
23
+
24
+ def initialize(key=nil, logger=nil, &block)
25
+ @key = key || "#{model_name.singular}_check_reload_key"
26
+ @block = block
27
+ @logger = logger || Rails.logger
28
+ @stamp = fetch_stamp
29
+ log "init #@key with value #@stamp"
30
+ end
31
+
32
+ def fetch_stamp
33
+ Rails.cache.fetch(@key) { Time.now.to_i }
34
+ end
35
+
36
+ def check
37
+ stamp = fetch_stamp
38
+ if @stamp != stamp
39
+ @stamp = stamp
40
+ @block.call()
41
+ log "#@key reloaded to #@stamp"
42
+ end
43
+ end
44
+
45
+ def expire
46
+ log "#@key expire"
47
+ Rails.cache.delete(@key)
48
+ end
49
+
50
+ def log(msg)
51
+ @logger.info "[RELOADER] (#{Process.pid}) #{msg}"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -5,16 +5,16 @@ module AbAdmin
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- delegate :value_to_boolean, :to => ActiveRecord::ConnectionAdapters::Column
8
+ delegate :value_to_boolean, to: ActiveRecord::ConnectionAdapters::Column
9
9
  end
10
10
 
11
11
  module ClassMethods
12
12
  def max_time
13
- Rails.cache.fetch("by_class_#{name}", :expires_in => 60) { maximum(:updated_at).to_i }
13
+ Rails.cache.fetch("by_class_#{name}", expires_in: 60) { maximum(:updated_at).to_i }
14
14
  end
15
15
 
16
16
  def max_time_by_scope(scope)
17
- Rails.cache.fetch("by_class_#{name}_#{scope}", :expires_in => 60) { send(scope).maximum(:updated_at).to_i }
17
+ Rails.cache.fetch("by_class_#{name}_#{scope}", expires_in: 60) { send(scope).maximum(:updated_at).to_i }
18
18
  end
19
19
 
20
20
  def full_truncate
@@ -4,9 +4,9 @@ module AbAdmin
4
4
  class UniqTranslationValidator < ActiveModel::EachValidator
5
5
  def validate_each(record, attribute, value)
6
6
  ::I18n.available_locales.each do |l|
7
- next if record.read_attribute(attribute, :locale => l).blank?
7
+ next if record.read_attribute(attribute, locale: l).blank?
8
8
  records_scope = record.class.const_get(:Translation).where("#{record.class.model_name.foreign_key} != #{record.id || 0}")
9
- same = records_scope.where(:name => record.read_attribute(attribute, :locale => l), :locale => l.to_s).exists?
9
+ same = records_scope.where(name: record.read_attribute(attribute, locale: l), locale: l.to_s).exists?
10
10
  record.errors.add("#{attribute}_#{l}", :taken) if same
11
11
  end
12
12
  end
@@ -3,7 +3,7 @@ module AbAdmin
3
3
  class BaseBuilder
4
4
  attr_reader :options, :fields
5
5
  attr_accessor :partial
6
- class_attribute :field_defaults, :partial_name, :instance_writer => false
6
+ class_attribute :field_defaults, :partial_name, instance_writer: false
7
7
  self.field_defaults = {}
8
8
 
9
9
  def initialize(options={}, &block)
@@ -30,7 +30,7 @@ module AbAdmin
30
30
  end
31
31
 
32
32
  class Table < BaseBuilder
33
- self.field_defaults = {:sortable => true}
33
+ self.field_defaults = {sortable: true}
34
34
  self.partial_name = 'table'
35
35
  end
36
36
 
@@ -40,7 +40,7 @@ module AbAdmin
40
40
 
41
41
  class Export < BaseBuilder
42
42
  def render_options
43
- {:column_names => fields.map(&:name), :column_data => fields.map(&:data), :column_separator => options[:column_separator]}
43
+ {column_names: fields.map(&:name), column_data: fields.map(&:data), column_separator: options[:column_separator]}
44
44
  end
45
45
  end
46
46
 
@@ -53,7 +53,7 @@ module AbAdmin
53
53
  end
54
54
 
55
55
  def locale_tabs(options={}, &block)
56
- @fields << FieldGroup.new(options.update(:localized => true), &block)
56
+ @fields << FieldGroup.new(options.update(localized: true), &block)
57
57
  end
58
58
  end
59
59
 
@@ -73,7 +73,7 @@ module AbAdmin
73
73
 
74
74
  class FieldGroup < BaseBuilder
75
75
  def title
76
- options[:title].is_a?(Symbol) ? I18n.t(options[:title], :scope => [:admin, :form]) : options[:title]
76
+ options[:title].is_a?(Symbol) ? I18n.t(options[:title], scope: [:admin, :form]) : options[:title]
77
77
  end
78
78
 
79
79
  def localized?
@@ -5,10 +5,10 @@ module AbAdmin
5
5
  #
6
6
  # The options hash accepts:
7
7
  #
8
- # :only => :index
9
- # :only => [:index, :show]
10
- # :except => :index
11
- # :except => [:index, :show]
8
+ # only: :index
9
+ # only: [:index, :show]
10
+ # except: :index
11
+ # except: [:index, :show]
12
12
  #
13
13
  # call #normalize_display_options! after @options has been set
14
14
  # to ensure that the display options are setup correctly
@@ -55,7 +55,7 @@ module AbAdmin
55
55
  when Proc
56
56
  instance_exec(*args, &method)
57
57
  else
58
- raise "Please register with callbacks using a symbol or a block/proc."
58
+ raise 'Please register with callbacks using a symbol or a block/proc.'
59
59
  end
60
60
  end
61
61
 
@@ -1,3 +1,3 @@
1
1
  class AbAdmin::Controllers::CanCanManagerResource < CanCan::InheritedResource
2
- delegate :resource_class, :to => :@controller
2
+ delegate :resource_class, to: :@controller
3
3
  end
@@ -6,7 +6,7 @@ module AbAdmin
6
6
  def head_options(record, options = {})
7
7
  return if record.nil?
8
8
 
9
- options = { :spliter => AbAdmin.title_spliter, :append_title => true }.merge(options)
9
+ options = { spliter: AbAdmin.title_spliter, append_title: true }.merge(options)
10
10
 
11
11
  header = options[:header] || (record.respond_to?(:header) ? record.header : nil)
12
12
 
@@ -17,20 +17,16 @@ module AbAdmin
17
17
  end
18
18
 
19
19
  @page_title ||= begin
20
- view_title = if record.respond_to?(:title)
21
- record.title
22
- elsif record.respond_to(:name)
23
- record.name
24
- end
25
-
20
+ view_title = AbAdmin.display_name(record)
21
+
26
22
  page_title = []
27
23
  page_title << options[:title] if options.key?(:title)
28
24
  page_title << view_title
29
- page_title << I18n.t("page.title") if options[:append_title]
25
+ page_title << I18n.t('page.title') if options[:append_title]
30
26
 
31
27
  page_title.flatten.compact.uniq.join(options[:spliter])
32
28
  end
33
- @page_description = [I18n.t("page.prefix"), @page_description].compact.join(' - ')
29
+ @page_description = [I18n.t('page.prefix'), @page_description].compact.join(' - ')
34
30
  end
35
31
 
36
32
  end
@@ -7,7 +7,7 @@ module AbAdmin
7
7
  prev_id = params[:prev_id].to_i
8
8
  next_id = params[:next_id].to_i
9
9
 
10
- render :text => 'Do nothing' and return if parent_id.zero? && prev_id.zero? && next_id.zero?
10
+ render text: 'Do nothing' and return if parent_id.zero? && prev_id.zero? && next_id.zero?
11
11
 
12
12
  if prev_id.zero? && next_id.zero?
13
13
  resource.move_to_child_of resource_class.find(parent_id)
@@ -17,7 +17,7 @@ module AbAdmin
17
17
  resource.move_to_left_of resource_class.find(next_id)
18
18
  end
19
19
 
20
- render(:nothing => true)
20
+ render(nothing: true)
21
21
  end
22
22
 
23
23
  end
@@ -6,11 +6,11 @@ end
6
6
 
7
7
  class Time
8
8
  def formatted_datetime
9
- I18n.l(self, :format => "%d.%m.%Y %H:%M")
9
+ I18n.l(self, format: '%d.%m.%Y %H:%M')
10
10
  end
11
11
 
12
12
  def formatted_date
13
- I18n.l(self, :format => "%d.%m.%Y")
13
+ I18n.l(self, format: '%d.%m.%Y')
14
14
  end
15
15
  end
16
16
 
@@ -3,8 +3,8 @@ class String
3
3
  #LUCENE_ESCAPE_REGEX = /(\+|-|&&|\|\||!|\(|\)|{|}|\[|\]|`|"|~|\?|:|\\)/
4
4
  LUCENE_ESCAPE_REGEX = /(\+|-|&&|\|\||!|\(|\)|{|}|\[|\]|`|"|~|\?|:|\\|\s)/
5
5
  KEYBOARDS = {
6
- :en => %{qwertyuiop[]asdfghjkl;'zxcvbnm,./},
7
- :ru => %{йцукенгшщзхъфывапролджэячсмитьбю/}
6
+ en: 'qwertyuiop[]asdfghjkl;\'zxcvbnm,./',
7
+ ru: 'йцукенгшщзхъфывапролджэячсмитьбю/'
8
8
  }
9
9
 
10
10
  def lucene_escape
@@ -5,9 +5,9 @@ module AbAdmin
5
5
 
6
6
  def self.config
7
7
  {
8
- :controllers => {
9
- :sessions => 'ab_admin/devise/sessions',
10
- :passwords => 'ab_admin/devise/passwords'
8
+ controllers: {
9
+ sessions: 'ab_admin/devise/sessions',
10
+ passwords: 'ab_admin/devise/passwords'
11
11
  }
12
12
  }
13
13
  end
@@ -6,7 +6,7 @@ module AbAdmin
6
6
  engine_name 'ab_admin'
7
7
 
8
8
  initializer 'ab_admin.setup' do
9
- ::Mime::Type.register "application/vnd.ms-excel", :xls
9
+ ::Mime::Type.register 'application/vnd.ms-excel', :xls
10
10
 
11
11
  ActiveSupport.on_load :active_record do
12
12
  ActiveRecord::Base.send :include, AbAdmin::CarrierWave::Glue