obitum-rails_admin 0.0.1

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 (401) hide show
  1. data/Gemfile +57 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +206 -0
  4. data/Rakefile +14 -0
  5. data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
  6. data/app/assets/images/rails_admin/aristo/images/icon_sprite.png +0 -0
  7. data/app/assets/images/rails_admin/aristo/images/progress_bar.gif +0 -0
  8. data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
  9. data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  10. data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  11. data/app/assets/images/rails_admin/bullet_black.png +0 -0
  12. data/app/assets/images/rails_admin/bullet_white.png +0 -0
  13. data/app/assets/images/rails_admin/calendar.png +0 -0
  14. data/app/assets/images/rails_admin/clock.png +0 -0
  15. data/app/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
  16. data/app/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
  17. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
  18. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
  19. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
  20. data/app/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
  21. data/app/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
  22. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
  23. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
  24. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
  25. data/app/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
  26. data/app/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
  27. data/app/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
  28. data/app/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
  29. data/app/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
  30. data/app/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
  31. data/app/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
  32. data/app/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
  33. data/app/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
  34. data/app/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
  35. data/app/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
  36. data/app/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
  37. data/app/assets/images/rails_admin/colorpicker/select.png +0 -0
  38. data/app/assets/images/rails_admin/colorpicker/select2.png +0 -0
  39. data/app/assets/images/rails_admin/colorpicker/slider.png +0 -0
  40. data/app/assets/images/rails_admin/logo.png +0 -0
  41. data/app/assets/images/rails_admin/magnifier.png +0 -0
  42. data/app/assets/images/rails_admin/multiselect/icon_sprite.png +0 -0
  43. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
  44. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png +0 -0
  45. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
  46. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
  47. data/app/assets/javascripts/rails_admin/custom/ui.js +12 -0
  48. data/app/assets/javascripts/rails_admin/jquery-ui-1.8.16.custom.js +5271 -0
  49. data/app/assets/javascripts/rails_admin/jquery.colorpicker.js +484 -0
  50. data/app/assets/javascripts/rails_admin/jquery.pjax.js +266 -0
  51. data/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js +1219 -0
  52. data/app/assets/javascripts/rails_admin/jquery_nested_form.js +58 -0
  53. data/app/assets/javascripts/rails_admin/ra.datetimepicker.js +67 -0
  54. data/app/assets/javascripts/rails_admin/ra.filter-box.js +120 -0
  55. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +280 -0
  56. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +181 -0
  57. data/app/assets/javascripts/rails_admin/ra.remote-form.js +148 -0
  58. data/app/assets/javascripts/rails_admin/rails_admin.js.erb +19 -0
  59. data/app/assets/javascripts/rails_admin/themes/default/ui.js +12 -0
  60. data/app/assets/javascripts/rails_admin/ui.js.coffee +33 -0
  61. data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
  62. data/app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png +0 -0
  63. data/app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif +0 -0
  64. data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
  65. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  66. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  67. data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.css.scss +733 -0
  68. data/app/assets/stylesheets/rails_admin/base/README +2 -0
  69. data/app/assets/stylesheets/rails_admin/base/mixins.css.scss +1 -0
  70. data/app/assets/stylesheets/rails_admin/base/theming.css.scss +145 -0
  71. data/app/assets/stylesheets/rails_admin/base/variables.css.scss +1 -0
  72. data/app/assets/stylesheets/rails_admin/custom/mixins.css.scss +12 -0
  73. data/app/assets/stylesheets/rails_admin/custom/theming.css.scss +13 -0
  74. data/app/assets/stylesheets/rails_admin/custom/variables.css.scss +15 -0
  75. data/app/assets/stylesheets/rails_admin/imports.css.scss.erb +41 -0
  76. data/app/assets/stylesheets/rails_admin/jquery.colorpicker.css.scss +180 -0
  77. data/app/assets/stylesheets/rails_admin/jquery.ui.timepicker.css.scss +53 -0
  78. data/app/assets/stylesheets/rails_admin/ra.calendar-additions.css.scss +25 -0
  79. data/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.css.scss +85 -0
  80. data/app/assets/stylesheets/rails_admin/rails_admin.css +4 -0
  81. data/app/assets/stylesheets/rails_admin/themes/default/mixins.css.scss +8 -0
  82. data/app/assets/stylesheets/rails_admin/themes/default/theming.css.scss +11 -0
  83. data/app/assets/stylesheets/rails_admin/themes/default/variables.css.scss +12 -0
  84. data/app/controllers/rails_admin/application_controller.rb +87 -0
  85. data/app/controllers/rails_admin/main_controller.rb +148 -0
  86. data/app/helpers/rails_admin/application_helper.rb +97 -0
  87. data/app/helpers/rails_admin/form_builder.rb +106 -0
  88. data/app/helpers/rails_admin/main_helper.rb +36 -0
  89. data/app/views/kaminari/twitter-bootstrap/_gap.html.haml +2 -0
  90. data/app/views/kaminari/twitter-bootstrap/_next_page.html.haml +4 -0
  91. data/app/views/kaminari/twitter-bootstrap/_page.html.haml +4 -0
  92. data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +10 -0
  93. data/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml +4 -0
  94. data/app/views/layouts/rails_admin/_navigation.html.haml +17 -0
  95. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +11 -0
  96. data/app/views/layouts/rails_admin/application.html.haml +39 -0
  97. data/app/views/rails_admin/main/_dashboard_history.html.haml +10 -0
  98. data/app/views/rails_admin/main/_delete_notice.html.haml +19 -0
  99. data/app/views/rails_admin/main/_form_colorpicker.html.haml +23 -0
  100. data/app/views/rails_admin/main/_form_datetime.html.haml +4 -0
  101. data/app/views/rails_admin/main/_form_enumeration.html.haml +4 -0
  102. data/app/views/rails_admin/main/_form_field.html.haml +1 -0
  103. data/app/views/rails_admin/main/_form_file_upload.html.haml +17 -0
  104. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +57 -0
  105. data/app/views/rails_admin/main/_form_filtering_select.html.haml +46 -0
  106. data/app/views/rails_admin/main/_form_nested_many.html.haml +6 -0
  107. data/app/views/rails_admin/main/_form_nested_one.html.haml +6 -0
  108. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +34 -0
  109. data/app/views/rails_admin/main/_form_text.html.haml +9 -0
  110. data/app/views/rails_admin/main/_submit_buttons.html.haml +13 -0
  111. data/app/views/rails_admin/main/bulk_delete.html.haml +7 -0
  112. data/app/views/rails_admin/main/dashboard.html.haml +31 -0
  113. data/app/views/rails_admin/main/delete.html.haml +14 -0
  114. data/app/views/rails_admin/main/edit.html.haml +2 -0
  115. data/app/views/rails_admin/main/export.html.haml +71 -0
  116. data/app/views/rails_admin/main/history.html.haml +42 -0
  117. data/app/views/rails_admin/main/index.html.haml +123 -0
  118. data/app/views/rails_admin/main/new.html.haml +2 -0
  119. data/app/views/rails_admin/main/show.html.haml +14 -0
  120. data/config/initializers/active_record_extensions.rb +19 -0
  121. data/config/initializers/devise_patch.rb +9 -0
  122. data/config/initializers/haml.rb +3 -0
  123. data/config/locales/rails_admin.en.yml +129 -0
  124. data/config/routes.rb +12 -0
  125. data/lib/generators/rails_admin/install_generator.rb +84 -0
  126. data/lib/generators/rails_admin/templates/drop.rb +18 -0
  127. data/lib/generators/rails_admin/templates/initializer.erb +101 -0
  128. data/lib/generators/rails_admin/templates/migration.rb +18 -0
  129. data/lib/generators/rails_admin/uninstall_generator.rb +22 -0
  130. data/lib/generators/rails_admin/utils.rb +30 -0
  131. data/lib/rails_admin.rb +39 -0
  132. data/lib/rails_admin/abstract_model.rb +73 -0
  133. data/lib/rails_admin/abstract_object.rb +28 -0
  134. data/lib/rails_admin/adapters/active_record.rb +347 -0
  135. data/lib/rails_admin/config.rb +293 -0
  136. data/lib/rails_admin/config/actions.rb +121 -0
  137. data/lib/rails_admin/config/actions/base.rb +105 -0
  138. data/lib/rails_admin/config/actions/bulk_delete.rb +56 -0
  139. data/lib/rails_admin/config/actions/dashboard.rb +40 -0
  140. data/lib/rails_admin/config/actions/delete.rb +50 -0
  141. data/lib/rails_admin/config/actions/edit.rb +52 -0
  142. data/lib/rails_admin/config/actions/export.rb +37 -0
  143. data/lib/rails_admin/config/actions/history_index.rb +34 -0
  144. data/lib/rails_admin/config/actions/history_show.rb +34 -0
  145. data/lib/rails_admin/config/actions/index.rb +73 -0
  146. data/lib/rails_admin/config/actions/new.rb +60 -0
  147. data/lib/rails_admin/config/actions/show.rb +27 -0
  148. data/lib/rails_admin/config/actions/show_in_app.rb +23 -0
  149. data/lib/rails_admin/config/base.rb +111 -0
  150. data/lib/rails_admin/config/fields.rb +97 -0
  151. data/lib/rails_admin/config/fields/association.rb +115 -0
  152. data/lib/rails_admin/config/fields/base.rb +274 -0
  153. data/lib/rails_admin/config/fields/factories/carrierwave.rb +12 -0
  154. data/lib/rails_admin/config/fields/factories/devise.rb +30 -0
  155. data/lib/rails_admin/config/fields/factories/dragonfly.rb +21 -0
  156. data/lib/rails_admin/config/fields/factories/enum.rb +11 -0
  157. data/lib/rails_admin/config/fields/factories/paperclip.rb +27 -0
  158. data/lib/rails_admin/config/fields/factories/password.rb +17 -0
  159. data/lib/rails_admin/config/fields/group.rb +65 -0
  160. data/lib/rails_admin/config/fields/groupable.rb +25 -0
  161. data/lib/rails_admin/config/fields/types.rb +26 -0
  162. data/lib/rails_admin/config/fields/types/all.rb +23 -0
  163. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +43 -0
  164. data/lib/rails_admin/config/fields/types/boolean.rb +29 -0
  165. data/lib/rails_admin/config/fields/types/carrierwave.rb +40 -0
  166. data/lib/rails_admin/config/fields/types/color.rb +37 -0
  167. data/lib/rails_admin/config/fields/types/date.rb +24 -0
  168. data/lib/rails_admin/config/fields/types/datetime.rb +165 -0
  169. data/lib/rails_admin/config/fields/types/decimal.rb +14 -0
  170. data/lib/rails_admin/config/fields/types/dragonfly.rb +59 -0
  171. data/lib/rails_admin/config/fields/types/enum.rb +35 -0
  172. data/lib/rails_admin/config/fields/types/file_upload.rb +65 -0
  173. data/lib/rails_admin/config/fields/types/float.rb +14 -0
  174. data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +14 -0
  175. data/lib/rails_admin/config/fields/types/has_many_association.rb +37 -0
  176. data/lib/rails_admin/config/fields/types/has_one_association.rb +35 -0
  177. data/lib/rails_admin/config/fields/types/hidden.rb +19 -0
  178. data/lib/rails_admin/config/fields/types/integer.rb +20 -0
  179. data/lib/rails_admin/config/fields/types/paperclip.rb +46 -0
  180. data/lib/rails_admin/config/fields/types/password.rb +42 -0
  181. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +76 -0
  182. data/lib/rails_admin/config/fields/types/string.rb +43 -0
  183. data/lib/rails_admin/config/fields/types/text.rb +38 -0
  184. data/lib/rails_admin/config/fields/types/time.rb +36 -0
  185. data/lib/rails_admin/config/fields/types/timestamp.rb +18 -0
  186. data/lib/rails_admin/config/has_fields.rb +135 -0
  187. data/lib/rails_admin/config/has_groups.rb +23 -0
  188. data/lib/rails_admin/config/hideable.rb +28 -0
  189. data/lib/rails_admin/config/model.rb +82 -0
  190. data/lib/rails_admin/config/proxy.rb +40 -0
  191. data/lib/rails_admin/config/sections.rb +38 -0
  192. data/lib/rails_admin/config/sections/base.rb +19 -0
  193. data/lib/rails_admin/config/sections/create.rb +11 -0
  194. data/lib/rails_admin/config/sections/edit.rb +11 -0
  195. data/lib/rails_admin/config/sections/export.rb +11 -0
  196. data/lib/rails_admin/config/sections/list.rb +27 -0
  197. data/lib/rails_admin/config/sections/nested.rb +10 -0
  198. data/lib/rails_admin/config/sections/show.rb +10 -0
  199. data/lib/rails_admin/config/sections/update.rb +10 -0
  200. data/lib/rails_admin/engine.rb +21 -0
  201. data/lib/rails_admin/extension.rb +29 -0
  202. data/lib/rails_admin/extensions/cancan.rb +5 -0
  203. data/lib/rails_admin/extensions/cancan/authorization_adapter.rb +59 -0
  204. data/lib/rails_admin/extensions/history.rb +5 -0
  205. data/lib/rails_admin/extensions/history/auditing_adapter.rb +37 -0
  206. data/lib/rails_admin/extensions/history/history.rb +68 -0
  207. data/lib/rails_admin/extensions/paper_trail.rb +5 -0
  208. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +92 -0
  209. data/lib/rails_admin/generic_support.rb +18 -0
  210. data/lib/rails_admin/i18n_support.rb +43 -0
  211. data/lib/rails_admin/support/core_extensions.rb +44 -0
  212. data/lib/rails_admin/support/csv_converter.rb +109 -0
  213. data/lib/rails_admin/version.rb +6 -0
  214. data/lib/tasks/prepare_ci_env.rake +27 -0
  215. data/lib/tasks/rails_admin.rake +18 -0
  216. data/spec/ci.sh +2 -0
  217. data/spec/controllers/application_controller_spec.rb +30 -0
  218. data/spec/controllers/main_controller_spec.rb +114 -0
  219. data/spec/database_helpers.rb +15 -0
  220. data/spec/dummy_app/Gemfile +53 -0
  221. data/spec/dummy_app/Rakefile +7 -0
  222. data/spec/dummy_app/app/controllers/application_controller.rb +3 -0
  223. data/spec/dummy_app/app/controllers/players_controller.rb +5 -0
  224. data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
  225. data/spec/dummy_app/app/locales/models.en.yml +16 -0
  226. data/spec/dummy_app/app/models/abstract.rb +5 -0
  227. data/spec/dummy_app/app/models/ball.rb +8 -0
  228. data/spec/dummy_app/app/models/category.rb +3 -0
  229. data/spec/dummy_app/app/models/cms.rb +5 -0
  230. data/spec/dummy_app/app/models/cms/basic_page.rb +7 -0
  231. data/spec/dummy_app/app/models/cms/unscoped_page.rb +3 -0
  232. data/spec/dummy_app/app/models/comment.rb +3 -0
  233. data/spec/dummy_app/app/models/division.rb +8 -0
  234. data/spec/dummy_app/app/models/draft.rb +11 -0
  235. data/spec/dummy_app/app/models/fan.rb +5 -0
  236. data/spec/dummy_app/app/models/field_test.rb +20 -0
  237. data/spec/dummy_app/app/models/hardball.rb +2 -0
  238. data/spec/dummy_app/app/models/league.rb +10 -0
  239. data/spec/dummy_app/app/models/nested_field_test.rb +3 -0
  240. data/spec/dummy_app/app/models/player.rb +23 -0
  241. data/spec/dummy_app/app/models/rel_test.rb +6 -0
  242. data/spec/dummy_app/app/models/team.rb +25 -0
  243. data/spec/dummy_app/app/models/user.rb +21 -0
  244. data/spec/dummy_app/app/uploaders/carrierwave_uploader.rb +53 -0
  245. data/spec/dummy_app/app/views/layouts/application.html.erb +13 -0
  246. data/spec/dummy_app/app/views/players/show.html.haml +1 -0
  247. data/spec/dummy_app/config.ru +4 -0
  248. data/spec/dummy_app/config/application.rb +47 -0
  249. data/spec/dummy_app/config/boot.rb +6 -0
  250. data/spec/dummy_app/config/database.yml +22 -0
  251. data/spec/dummy_app/config/environment.rb +5 -0
  252. data/spec/dummy_app/config/environments/development.rb +27 -0
  253. data/spec/dummy_app/config/environments/production.rb +51 -0
  254. data/spec/dummy_app/config/environments/test.rb +39 -0
  255. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  256. data/spec/dummy_app/config/initializers/devise.rb +142 -0
  257. data/spec/dummy_app/config/initializers/inflections.rb +10 -0
  258. data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
  259. data/spec/dummy_app/config/initializers/quiet_assets.rb +10 -0
  260. data/spec/dummy_app/config/initializers/rails_admin.rb +11 -0
  261. data/spec/dummy_app/config/initializers/secret_token.rb +7 -0
  262. data/spec/dummy_app/config/initializers/session_store.rb +8 -0
  263. data/spec/dummy_app/config/routes.rb +10 -0
  264. data/spec/dummy_app/db/migrate/00000000000001_create_divisions_migration.rb +13 -0
  265. data/spec/dummy_app/db/migrate/00000000000002_create_drafts_migration.rb +19 -0
  266. data/spec/dummy_app/db/migrate/00000000000003_create_leagues_migration.rb +12 -0
  267. data/spec/dummy_app/db/migrate/00000000000004_create_players_migration.rb +20 -0
  268. data/spec/dummy_app/db/migrate/00000000000005_create_teams_migration.rb +22 -0
  269. data/spec/dummy_app/db/migrate/00000000000006_devise_create_users.rb +19 -0
  270. data/spec/dummy_app/db/migrate/00000000000007_create_histories_table.rb +16 -0
  271. data/spec/dummy_app/db/migrate/00000000000008_create_fans_migration.rb +12 -0
  272. data/spec/dummy_app/db/migrate/00000000000009_create_fans_teams_migration.rb +11 -0
  273. data/spec/dummy_app/db/migrate/00000000000010_add_revenue_to_team_migration.rb +9 -0
  274. data/spec/dummy_app/db/migrate/00000000000011_add_suspended_to_player_migration.rb +9 -0
  275. data/spec/dummy_app/db/migrate/00000000000012_add_avatar_columns_to_user.rb +16 -0
  276. data/spec/dummy_app/db/migrate/00000000000013_add_roles_to_user.rb +9 -0
  277. data/spec/dummy_app/db/migrate/00000000000014_add_color_to_team_migration.rb +9 -0
  278. data/spec/dummy_app/db/migrate/20101223222233_create_rel_tests.rb +15 -0
  279. data/spec/dummy_app/db/migrate/20110103205808_create_comments.rb +15 -0
  280. data/spec/dummy_app/db/migrate/20110123042530_rename_histories_to_rails_admin_histories.rb +9 -0
  281. data/spec/dummy_app/db/migrate/20110224184303_create_field_tests.rb +22 -0
  282. data/spec/dummy_app/db/migrate/20110328193014_create_cms_basic_pages.rb +14 -0
  283. data/spec/dummy_app/db/migrate/20110329183136_remove_league_id_from_teams.rb +9 -0
  284. data/spec/dummy_app/db/migrate/20110607152842_add_format_to_field_test.rb +9 -0
  285. data/spec/dummy_app/db/migrate/20110714095433_create_balls.rb +12 -0
  286. data/spec/dummy_app/db/migrate/20110831090841_add_protected_field_and_restricted_field_to_field_tests.rb +6 -0
  287. data/spec/dummy_app/db/migrate/20110901131551_change_division_primary_key.rb +19 -0
  288. data/spec/dummy_app/db/migrate/20110901142530_rename_league_id_foreign_key_on_divisions.rb +5 -0
  289. data/spec/dummy_app/db/migrate/20110901150912_set_primary_key_not_null_for_divisions.rb +21 -0
  290. data/spec/dummy_app/db/migrate/20110901154834_change_length_for_rails_admin_histories.rb +9 -0
  291. data/spec/dummy_app/db/migrate/20111103174459_create_unscoped_pages.rb +9 -0
  292. data/spec/dummy_app/db/migrate/20111108143642_add_dragonfly_and_carrierwave_to_field_tests.rb +7 -0
  293. data/spec/dummy_app/db/migrate/20111115041025_add_type_to_balls.rb +5 -0
  294. data/spec/dummy_app/db/migrate/20111123092549_create_nested_field_tests.rb +10 -0
  295. data/spec/dummy_app/db/migrate/20111130075338_add_dragonfly_asset_name_to_field_tests.rb +5 -0
  296. data/spec/dummy_app/db/migrate/20111215083258_create_foo_bars.rb +8 -0
  297. data/spec/dummy_app/db/migrate/20120117151733_add_custom_field_to_teams.rb +5 -0
  298. data/spec/dummy_app/db/migrate/20120118122004_add_categories.rb +7 -0
  299. data/spec/dummy_app/db/seeds.rb +18 -0
  300. data/spec/dummy_app/foo/Gemfile +17 -0
  301. data/spec/dummy_app/foo/MIT-LICENSE +20 -0
  302. data/spec/dummy_app/foo/README.rdoc +3 -0
  303. data/spec/dummy_app/foo/Rakefile +39 -0
  304. data/spec/dummy_app/foo/app/assets/javascripts/foo/application.js +9 -0
  305. data/spec/dummy_app/foo/app/assets/stylesheets/foo/application.css +7 -0
  306. data/spec/dummy_app/foo/app/controllers/foo/application_controller.rb +4 -0
  307. data/spec/dummy_app/foo/app/helpers/foo/application_helper.rb +4 -0
  308. data/spec/dummy_app/foo/app/models/foo/bar.rb +4 -0
  309. data/spec/dummy_app/foo/app/views/layouts/foo/application.html.erb +14 -0
  310. data/spec/dummy_app/foo/config/routes.rb +2 -0
  311. data/spec/dummy_app/foo/foo.gemspec +23 -0
  312. data/spec/dummy_app/foo/lib/foo.rb +4 -0
  313. data/spec/dummy_app/foo/lib/foo/engine.rb +5 -0
  314. data/spec/dummy_app/foo/lib/foo/version.rb +3 -0
  315. data/spec/dummy_app/foo/lib/tasks/foo_tasks.rake +4 -0
  316. data/spec/dummy_app/foo/script/rails +6 -0
  317. data/spec/dummy_app/foo/test/dummy/Rakefile +7 -0
  318. data/spec/dummy_app/foo/test/dummy/app/assets/javascripts/application.js +9 -0
  319. data/spec/dummy_app/foo/test/dummy/app/assets/stylesheets/application.css +7 -0
  320. data/spec/dummy_app/foo/test/dummy/app/controllers/application_controller.rb +3 -0
  321. data/spec/dummy_app/foo/test/dummy/app/helpers/application_helper.rb +2 -0
  322. data/spec/dummy_app/foo/test/dummy/app/views/layouts/application.html.erb +14 -0
  323. data/spec/dummy_app/foo/test/dummy/config.ru +4 -0
  324. data/spec/dummy_app/foo/test/dummy/config/application.rb +45 -0
  325. data/spec/dummy_app/foo/test/dummy/config/boot.rb +10 -0
  326. data/spec/dummy_app/foo/test/dummy/config/database.yml +25 -0
  327. data/spec/dummy_app/foo/test/dummy/config/environment.rb +5 -0
  328. data/spec/dummy_app/foo/test/dummy/config/environments/development.rb +30 -0
  329. data/spec/dummy_app/foo/test/dummy/config/environments/production.rb +60 -0
  330. data/spec/dummy_app/foo/test/dummy/config/environments/test.rb +39 -0
  331. data/spec/dummy_app/foo/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  332. data/spec/dummy_app/foo/test/dummy/config/initializers/inflections.rb +10 -0
  333. data/spec/dummy_app/foo/test/dummy/config/initializers/mime_types.rb +5 -0
  334. data/spec/dummy_app/foo/test/dummy/config/initializers/secret_token.rb +7 -0
  335. data/spec/dummy_app/foo/test/dummy/config/initializers/session_store.rb +8 -0
  336. data/spec/dummy_app/foo/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  337. data/spec/dummy_app/foo/test/dummy/config/locales/en.yml +5 -0
  338. data/spec/dummy_app/foo/test/dummy/config/routes.rb +4 -0
  339. data/spec/dummy_app/foo/test/dummy/db/schema.rb +21 -0
  340. data/spec/dummy_app/foo/test/dummy/public/404.html +26 -0
  341. data/spec/dummy_app/foo/test/dummy/public/422.html +26 -0
  342. data/spec/dummy_app/foo/test/dummy/public/500.html +26 -0
  343. data/spec/dummy_app/foo/test/dummy/public/favicon.ico +0 -0
  344. data/spec/dummy_app/foo/test/dummy/script/rails +6 -0
  345. data/spec/dummy_app/foo/test/fixtures/foo/bars.yml +11 -0
  346. data/spec/dummy_app/foo/test/foo_test.rb +7 -0
  347. data/spec/dummy_app/foo/test/integration/navigation_test.rb +10 -0
  348. data/spec/dummy_app/foo/test/test_helper.rb +10 -0
  349. data/spec/dummy_app/foo/test/unit/foo/bar_test.rb +9 -0
  350. data/spec/dummy_app/public/404.html +0 -0
  351. data/spec/dummy_app/public/favicon.ico +0 -0
  352. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg +0 -0
  353. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg.meta +1 -0
  354. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg +0 -0
  355. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg.meta +1 -0
  356. data/spec/dummy_app/public/system/paperclip_assets/1/original/Boston City Flow.jpg +0 -0
  357. data/spec/dummy_app/public/system/paperclip_assets/1/thumb/Boston City Flow.jpg +0 -0
  358. data/spec/dummy_app/public/system/paperclip_assets/3/original/Costa Rican Frog.jpg +0 -0
  359. data/spec/dummy_app/public/system/paperclip_assets/3/thumb/Costa Rican Frog.jpg +0 -0
  360. data/spec/dummy_app/public/system/paperclip_assets/6/original/liste-electorale.pdf +0 -0
  361. data/spec/dummy_app/public/system/paperclip_assets/6/thumb/liste-electorale.pdf +148 -0
  362. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/Boston_City_Flow.jpg +0 -0
  363. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/thumb_Boston_City_Flow.jpg +0 -0
  364. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/Costa_Rican_Frog.jpg +0 -0
  365. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/thumb_Costa_Rican_Frog.jpg +0 -0
  366. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/Pensive_Parakeet.jpg +0 -0
  367. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/thumb_Pensive_Parakeet.jpg +0 -0
  368. data/spec/dummy_app/script/rails +6 -0
  369. data/spec/factories.rb +66 -0
  370. data/spec/generator_helpers.rb +30 -0
  371. data/spec/generators/install_generator_spec.rb +85 -0
  372. data/spec/generators/uninstall_generator_spec.rb +35 -0
  373. data/spec/helpers/application_helper_spec.rb +212 -0
  374. data/spec/lib/abstract_object_spec.rb +119 -0
  375. data/spec/lib/custom_field.rb +7 -0
  376. data/spec/lib/rails_admin_spec.rb +301 -0
  377. data/spec/requests/actions.rb +161 -0
  378. data/spec/requests/authorization/cancan_spec.rb +350 -0
  379. data/spec/requests/basic/bulk_action/rails_admin_basic_bulk_action_spec.rb +25 -0
  380. data/spec/requests/basic/bulk_destroy/rails_admin_basic_bulk_destroy_spec.rb +57 -0
  381. data/spec/requests/basic/create/rails_admin_basic_create_spec.rb +143 -0
  382. data/spec/requests/basic/create/rails_admin_namespaced_model_create_spec.rb +39 -0
  383. data/spec/requests/basic/delete/rails_admin_basic_delete_spec.rb +27 -0
  384. data/spec/requests/basic/destroy/rails_admin_basic_destroy_spec.rb +56 -0
  385. data/spec/requests/basic/edit/rails_admin_basic_edit_spec.rb +109 -0
  386. data/spec/requests/basic/export/rails_admin_basic_export_spec.rb +87 -0
  387. data/spec/requests/basic/list/rails_admin_basic_list_spec.rb +417 -0
  388. data/spec/requests/basic/new/rails_admin_basic_new_spec.rb +74 -0
  389. data/spec/requests/basic/new/rails_admin_namespaced_model_new_spec.rb +31 -0
  390. data/spec/requests/basic/show/rails_admin_basic_show_spec.rb +92 -0
  391. data/spec/requests/basic/update/rails_admin_basic_update_spec.rb +191 -0
  392. data/spec/requests/config/edit/rails_admin_config_edit_spec.rb +913 -0
  393. data/spec/requests/config/list/rails_admin_config_list_spec.rb +509 -0
  394. data/spec/requests/config/navigation/rails_admin_config_navigation_spec.rb +107 -0
  395. data/spec/requests/config/rails_admin_config_spec.rb +227 -0
  396. data/spec/requests/config/show/rails_admin_config_show_spec.rb +282 -0
  397. data/spec/requests/history/rails_admin_history_spec.rb +66 -0
  398. data/spec/requests/rails_admin_spec.rb +146 -0
  399. data/spec/requests/relation_spec.rb +26 -0
  400. data/spec/spec_helper.rb +91 -0
  401. metadata +967 -0
@@ -0,0 +1,27 @@
1
+ module RailsAdmin
2
+ module Config
3
+ module Actions
4
+ class Show < RailsAdmin::Config::Actions::Base
5
+ RailsAdmin::Config::Actions.register(self)
6
+
7
+ register_instance_option :member do
8
+ true
9
+ end
10
+
11
+ register_instance_option :route_fragment do
12
+ ''
13
+ end
14
+
15
+ register_instance_option :breadcrumb_parent do
16
+ :index
17
+ end
18
+
19
+ register_instance_option :controller do
20
+ Proc.new do
21
+ render @action.template_name
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ module RailsAdmin
2
+ module Config
3
+ module Actions
4
+ class ShowInApp < RailsAdmin::Config::Actions::Base
5
+ RailsAdmin::Config::Actions.register(self)
6
+
7
+ register_instance_option :member do
8
+ true
9
+ end
10
+
11
+ register_instance_option :visible? do
12
+ bindings[:controller].main_app.url_for(bindings[:object]) rescue false
13
+ end
14
+
15
+ register_instance_option :controller do
16
+ Proc.new do
17
+ redirect_to main_app.url_for(@object)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,111 @@
1
+ require 'rails_admin/config/proxy'
2
+
3
+ module RailsAdmin
4
+ module Config
5
+ # A base class for all configurables.
6
+ #
7
+ # Each configurable has a parent object. This parent object must provide
8
+ # the configurable with abstract_model and bindings.
9
+ #
10
+ # Bindings is a hash of variables bound by the querying context. For
11
+ # example the list view's template will bind an object to key
12
+ # :object for each row it outputs. This object is the actual row object
13
+ # which is then used as the receiver of queries for property values.
14
+ #
15
+ # @see RailsAdmin::AbstractModel
16
+ # @see RailsAdmin::Config::Model#abstract_model
17
+ class Base
18
+ attr_reader :abstract_model, :bindings, :parent, :root
19
+
20
+ def initialize(parent = nil)
21
+ @abstract_model = parent && parent.abstract_model
22
+ @bindings = {}
23
+ @parent = parent
24
+ @root = parent && parent.root
25
+ end
26
+
27
+ def has_option?(name)
28
+ options = self.class.instance_variable_get("@config_options")
29
+ options && options.has_key?(name)
30
+ end
31
+
32
+ # Register an instance option for this object only
33
+ def register_instance_option(option_name, &default)
34
+ scope = class << self; self; end;
35
+ self.class.register_instance_option(option_name, scope, &default)
36
+ end
37
+
38
+ def register_deprecated_instance_option(option_name, replacement_option_name)
39
+ scope = class << self; self; end;
40
+ self.class.register_deprecated_instance_option(option_name, replacement_option_name, scope)
41
+ end
42
+
43
+ def with(bindings = {})
44
+ RailsAdmin::Config::Proxy.new(self, bindings)
45
+ end
46
+
47
+ # Register an instance option. Instance option is a configuration
48
+ # option that stores its value within an instance variable and is
49
+ # accessed by an instance method. Both go by the name of the option.
50
+ def self.register_instance_option(option_name, scope = self, &default)
51
+ unless options = scope.instance_variable_get("@config_options")
52
+ options = scope.instance_variable_set("@config_options", {})
53
+ end
54
+
55
+ option_name = option_name.to_s
56
+
57
+ options[option_name] = nil
58
+
59
+ # If it's a boolean create an alias for it and remove question mark
60
+ if "?" == option_name[-1, 1]
61
+ scope.send(:define_method, "#{option_name.chop!}?") do
62
+ send(option_name)
63
+ end
64
+ end
65
+
66
+ # Define getter/setter by the option name
67
+ scope.send(:define_method, option_name) do |*args, &block|
68
+ if !args[0].nil? || block
69
+ # Invocation with args --> This is the declaration of the option, i.e. setter
70
+ instance_variable_set("@#{option_name}_registered", args[0].nil? ? block : args[0])
71
+ else
72
+ # Invocation without args nor block --> It's the use of the option, i.e. getter
73
+ value = instance_variable_get("@#{option_name}_registered")
74
+ case value
75
+ when Proc
76
+ # Track recursive invocation with an instance variable. This prevents run-away recursion
77
+ # and allows configurations such as
78
+ # label { "#{label}".upcase }
79
+ # This will use the default definition when called recursively.
80
+ if instance_variable_get("@#{option_name}_recurring")
81
+ value = instance_eval &default
82
+ else
83
+ instance_variable_set("@#{option_name}_recurring", true)
84
+ value = instance_eval &value
85
+ instance_variable_set("@#{option_name}_recurring", false)
86
+ end
87
+ when nil
88
+ value = instance_eval &default
89
+ end
90
+ value
91
+ end
92
+ end
93
+ end
94
+
95
+ def self.register_deprecated_instance_option(option_name, replacement_option_name, scope = self)
96
+ scope.send(:define_method, option_name) do |*args, &block|
97
+ ActiveSupport::Deprecation.warn("The #{option_name} configuration option is deprecated, please use #{replacement_option_name}.")
98
+ send(replacement_option_name, *args, &block)
99
+ end
100
+ end
101
+
102
+ # Register a class option. Class option is a configuration
103
+ # option that stores it's value within a class object's instance variable
104
+ # and is accessed by a class method. Both go by the name of the option.
105
+ def self.register_class_option(option_name, &default)
106
+ scope = class << self; self; end;
107
+ self.register_instance_option(option_name, scope, &default)
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,97 @@
1
+ module RailsAdmin
2
+ module Config
3
+ module Fields
4
+ # Default field factory loads fields based on their property type or
5
+ # association type.
6
+ #
7
+ # @see RailsAdmin::Config::Fields.registry
8
+ mattr_reader :default_factory
9
+ @@default_factory = lambda do |parent, properties, fields|
10
+ # If it's an association
11
+ if properties.has_key?(:parent_model)
12
+ association = parent.abstract_model.associations.find {|a| a[:name].to_s == properties[:name].to_s}
13
+ field = RailsAdmin::Config::Fields::Types.load("#{association[:polymorphic] ? :polymorphic : properties[:type]}_association").new(parent, properties[:name], association)
14
+ fields << field
15
+
16
+ # If it's a column
17
+ elsif !properties.has_key?(:parent_model)
18
+ fields << (field = RailsAdmin::Config::Fields::Types.load(properties[:type]).new(parent, properties[:name], properties))
19
+ # hide _type columns (handled as associations)
20
+ if parent.abstract_model.belongs_to_associations.find {|a| a[:foreign_type] == properties[:name] }
21
+ field.hide
22
+ end
23
+ # hide _id column
24
+ if parent.abstract_model.belongs_to_associations.find {|a| a[:child_key] == properties[:name] }
25
+ field.hide
26
+ field.filterable(false) # filtering is handled on the association itself
27
+ end
28
+ end
29
+ end
30
+
31
+ # Registry of field factories.
32
+ #
33
+ # Field factory is an anonymous function that recieves the parent object,
34
+ # an array of field properties and an array of fields already instantiated.
35
+ #
36
+ # If the factory returns true then that property will not be run through
37
+ # the rest of the registered factories. If it returns false then the
38
+ # arguments will be passed to the next factory.
39
+ #
40
+ # By default a basic factory is registered which loads fields by their
41
+ # database column type. Also a password factory is registered which
42
+ # loads fields if their name is password. Third default factory is a
43
+ # devise specific factory which loads fields for devise user models.
44
+ #
45
+ # @see RailsAdmin::Config::Fields.register_factory
46
+ # @see rails_admin/config/fields/factories/password.rb
47
+ # @see rails_admin/config/fields/factories/devise.rb
48
+ @@registry = [@@default_factory]
49
+
50
+ # Build an array of fields by the provided parent object's abstract_model's
51
+ # property and association information. Each property and association is
52
+ # passed to the registered field factories which will populate the fields
53
+ # array that will be returned.
54
+ #
55
+ # @see RailsAdmin::Config::Fields.registry
56
+ def self.factory(parent)
57
+ fields = []
58
+ return fields unless parent.abstract_model.model_store_exists?
59
+ # Load fields for all properties (columns)
60
+
61
+ parent.abstract_model.properties.each do |properties|
62
+ # Unless a previous factory has already loaded current field as well
63
+ unless fields.find {|f| f.name == properties[:name] }
64
+ # Loop through factories until one returns true
65
+ @@registry.find {|factory| factory.call(parent, properties, fields) }
66
+ end
67
+ end
68
+ # Load fields for all associations (relations)
69
+ parent.abstract_model.associations.each do |association|
70
+ # Unless a previous factory has already loaded current field as well
71
+ unless fields.find {|f| f.name == association[:name] }
72
+ # Loop through factories until one returns true
73
+ @@registry.find {|factory| factory.call(parent, association, fields) }
74
+ end
75
+ end
76
+ fields
77
+ end
78
+
79
+ # Register a field factory to be included in the factory stack.
80
+ #
81
+ # Factories are invoked lifo (last in first out).
82
+ #
83
+ # @see RailsAdmin::Config::Fields.registry
84
+ def self.register_factory(&block)
85
+ @@registry.unshift(block)
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ require 'rails_admin/config/fields/types'
92
+ require 'rails_admin/config/fields/factories/password'
93
+ require 'rails_admin/config/fields/factories/enum'
94
+ require 'rails_admin/config/fields/factories/devise'
95
+ require 'rails_admin/config/fields/factories/paperclip'
96
+ require 'rails_admin/config/fields/factories/dragonfly'
97
+ require 'rails_admin/config/fields/factories/carrierwave'
@@ -0,0 +1,115 @@
1
+ require 'rails_admin/config'
2
+ require 'rails_admin/config/fields/base'
3
+
4
+ module RailsAdmin
5
+ module Config
6
+ module Fields
7
+ class Association < RailsAdmin::Config::Fields::Base
8
+
9
+ def self.inherited(klass)
10
+ super(klass)
11
+ end
12
+
13
+ # Reader for the association information hash
14
+ def association
15
+ @properties
16
+ end
17
+
18
+ register_instance_option(:pretty_value) do
19
+ v = bindings[:view]
20
+ [value].flatten.select(&:present?).map do |associated|
21
+ amc = polymorphic? ? RailsAdmin::Config.model(associated) : associated_model_config # perf optimization for non-polymorphic associations
22
+ am = amc.abstract_model
23
+ wording = associated.send(amc.object_label_method)
24
+ can_see = v.authorized?(:show, am, associated)
25
+ can_see = can_see && (show_action = RailsAdmin::Config::Actions.find(:show, { :controller => v.controller, :abstract_model => am, :object => associated }))
26
+ can_see ? v.link_to(wording, v.url_for(:action => show_action.action_name, :model_name => am.to_param, :id => associated.id)) : wording
27
+ end.to_sentence.html_safe
28
+ end
29
+
30
+ register_instance_option(:sortable) do
31
+ false
32
+ end
33
+
34
+ register_instance_option(:searchable) do
35
+ false
36
+ end
37
+
38
+ # Accessor whether association is visible or not. By default
39
+ # association checks whether the child model is excluded in
40
+ # configuration or not.
41
+ register_instance_option(:visible?) do
42
+ @visible ||= !self.associated_model_config.excluded?
43
+ end
44
+
45
+ # use the association name as a key, not the association key anymore!
46
+ register_instance_option(:label) do
47
+ (@label ||= {})[::I18n.locale] ||= abstract_model.model.human_attribute_name association[:name]
48
+ end
49
+
50
+ # scope for possible associable records
51
+ register_instance_option :associated_collection_scope do
52
+ # bindings[:object] & bindings[:controller] available
53
+ associated_collection_scope_limit = (self.associated_collection_cache_all ? nil : 30)
54
+ Proc.new do |scope|
55
+ scope.limit(associated_collection_scope_limit)
56
+ end
57
+ end
58
+
59
+ # preload entire associated collection (per associated_collection_scope) on load
60
+ # Be sure to set limit in associated_collection_scope if set is large
61
+ register_instance_option :associated_collection_cache_all do
62
+ @associated_collection_cache_all ||= (associated_model_config.abstract_model.count < 100)
63
+ end
64
+
65
+ # Reader for the association's child model's configuration
66
+ def associated_model_config
67
+ @associated_model_config ||= RailsAdmin.config(association[:child_model])
68
+ end
69
+
70
+ # Reader for the association's child model object's label method
71
+ def associated_label_method
72
+ @associated_label_method ||= associated_model_config.object_label_method
73
+ end
74
+
75
+ # Reader for the association's child key
76
+ def child_key
77
+ association[:child_key]
78
+ end
79
+
80
+ # Reader for the inverse relationship
81
+ def inverse_of
82
+ association[:inverse_of]
83
+ end
84
+
85
+ # we need to check for validation on method and on association
86
+ register_instance_option :required? do
87
+ @required ||= !!(abstract_model.model.validators_on(name) + abstract_model.model.validators_on(method_name)).find do |v|
88
+ v.is_a?(ActiveModel::Validations::PresenceValidator) && !v.options[:allow_nil] ||
89
+ v.is_a?(ActiveModel::Validations::NumericalityValidator) && !v.options[:allow_nil]
90
+ end
91
+ end
92
+
93
+ # Reader for validation errors of the bound object
94
+ def errors
95
+ bindings[:object].errors[association[:name]] + bindings[:object].errors[child_key]
96
+ end
97
+
98
+ # Reader whether this is a polymorphic association
99
+ def polymorphic?
100
+ association[:polymorphic]
101
+ end
102
+
103
+ # Reader for nested attributes
104
+ register_instance_option :nested_form do
105
+ association[:nested_form]
106
+ end
107
+
108
+ # Reader for the association's value unformatted
109
+ def value
110
+ bindings[:object].send(association[:name])
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,274 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+ require 'rails_admin/config/base'
3
+ require 'rails_admin/config/hideable'
4
+ require 'rails_admin/config/fields'
5
+ require 'rails_admin/config/fields/association'
6
+ require 'rails_admin/config/fields/groupable'
7
+
8
+
9
+ module RailsAdmin
10
+ module Config
11
+ module Fields
12
+ class Base < RailsAdmin::Config::Base
13
+ attr_reader :name, :properties
14
+ attr_accessor :defined, :order, :section
15
+
16
+ def self.inherited(klass)
17
+ klass.instance_variable_set("@view_helper", :text_field)
18
+ end
19
+
20
+ include RailsAdmin::Config::Hideable
21
+
22
+ def initialize(parent, name, properties)
23
+ super(parent)
24
+
25
+ @defined = false
26
+ @name = name
27
+ @order = 0
28
+ @properties = properties
29
+ @section = parent
30
+
31
+ extend RailsAdmin::Config::Fields::Groupable
32
+ end
33
+
34
+ register_instance_option(:css_class) do
35
+ "#{self.name}_field"
36
+ end
37
+
38
+ def type_css_class
39
+ "#{type}_type"
40
+ end
41
+
42
+ def virtual?
43
+ properties.blank?
44
+ end
45
+
46
+ register_instance_option(:column_width) do
47
+ nil
48
+ end
49
+
50
+ register_instance_option(:sortable) do
51
+ !virtual?
52
+ end
53
+
54
+ register_instance_option(:searchable) do
55
+ !virtual?
56
+ end
57
+
58
+ register_instance_option(:queryable?) do
59
+ !!searchable
60
+ end
61
+
62
+ register_instance_option(:filterable?) do
63
+ !!searchable
64
+ end
65
+
66
+ register_instance_option(:search_operator) do
67
+ @search_operator ||= RailsAdmin::Config.default_search_operator
68
+ end
69
+
70
+ # serials and dates are reversed in list, which is more natural (last modified items first).
71
+ register_instance_option(:sort_reverse?) do
72
+ false
73
+ end
74
+
75
+ # list of columns I should search for that field [{ :column => 'table_name.column', :type => field.type }, {..}]
76
+ register_instance_option(:searchable_columns) do
77
+ @searchable_columns ||= case self.searchable
78
+ when true
79
+ [{ :column => "#{self.abstract_model.model.table_name}.#{self.name}", :type => self.type }]
80
+ when false
81
+ []
82
+ when :all # valid only for associations
83
+ table_name = self.associated_model_config.abstract_model.model.table_name
84
+ self.associated_model_config.list.fields.map { |f| { :column => "#{table_name}.#{f.name}", :type => f.type } }
85
+ else
86
+ [self.searchable].flatten.map do |f|
87
+ if f.is_a?(String) && f.include?('.') # table_name.column
88
+ table_name, column = f.split '.'
89
+ type = nil
90
+ elsif f.is_a?(Hash) # <Model|table_name> => <attribute|column>
91
+ am = AbstractModel.new(f.keys.first.to_s.classify)
92
+ table_name = am && am.model.table_name || f.keys.first
93
+ column = f.values.first
94
+ property = am && am.properties.find{ |p| p[:name] == f.values.first.to_sym }
95
+ type = property && property[:type]
96
+ else # <attribute|column>
97
+ am = (self.association? ? self.associated_model_config.abstract_model : self.abstract_model)
98
+ table_name = am.model.table_name
99
+ column = f
100
+ property = am.properties.find{ |p| p[:name] == f.to_sym }
101
+ type = property && property[:type]
102
+ end
103
+
104
+ { :column => "#{table_name}.#{column}", :type => (type || :string) }
105
+ end
106
+ end
107
+ end
108
+
109
+ register_instance_option(:formatted_value) do
110
+ value.to_s
111
+ end
112
+
113
+ # output for pretty printing (show, list)
114
+ register_instance_option(:pretty_value) do
115
+ formatted_value.presence || ' - '
116
+ end
117
+
118
+ # output for printing in export view (developers beware: no bindings[:view] and no data!)
119
+ register_instance_option(:export_value) do
120
+ pretty_value
121
+ end
122
+
123
+
124
+ # Accessor for field's help text displayed below input field.
125
+ register_instance_option(:help) do
126
+ (@help ||= {})[::I18n.locale] ||= (required? ? I18n.translate("admin.form.required") : I18n.translate("admin.form.optional")) + '. '
127
+ end
128
+
129
+ register_instance_option(:html_attributes) do
130
+ {}
131
+ end
132
+
133
+ register_instance_option :default_value do
134
+ nil
135
+ end
136
+
137
+ # Accessor for field's label.
138
+ #
139
+ # @see RailsAdmin::AbstractModel.properties
140
+ register_instance_option(:label) do
141
+ (@label ||= {})[::I18n.locale] ||= abstract_model.model.human_attribute_name name
142
+ end
143
+
144
+ # Accessor for field's maximum length per database.
145
+ #
146
+ # @see RailsAdmin::AbstractModel.properties
147
+ register_instance_option(:length) do
148
+ @length ||= properties && properties[:length]
149
+ end
150
+
151
+ # Accessor for field's length restrictions per validations
152
+ #
153
+ register_instance_option(:valid_length) do
154
+ @valid_length ||= abstract_model.model.validators_on(name).find{|v|
155
+ v.is_a?(ActiveModel::Validations::LengthValidator)}.try{|v| v.options} || {}
156
+ end
157
+
158
+ register_instance_option(:partial) do
159
+ :form_field
160
+ end
161
+
162
+ # Accessor for whether this is field is mandatory.
163
+ #
164
+ # @see RailsAdmin::AbstractModel.properties
165
+ register_instance_option(:required?) do
166
+ @required ||= !!abstract_model.model.validators_on(name).find do |v|
167
+ v.is_a?(ActiveModel::Validations::PresenceValidator) && !v.options[:allow_nil] ||
168
+ v.is_a?(ActiveModel::Validations::NumericalityValidator) && !v.options[:allow_nil]
169
+ end
170
+ end
171
+
172
+ # Accessor for whether this is a serial field (aka. primary key, identifier).
173
+ #
174
+ # @see RailsAdmin::AbstractModel.properties
175
+ register_instance_option(:serial?) do
176
+ properties && properties[:serial?]
177
+ end
178
+
179
+ register_instance_option(:view_helper) do
180
+ @view_helper ||= self.class.instance_variable_get("@view_helper")
181
+ end
182
+
183
+ register_instance_option :read_only do
184
+ not editable
185
+ end
186
+
187
+ register_instance_option :visible? do
188
+ returned = true
189
+ (RailsAdmin.config.default_hidden_fields || {}).each do |section, fields|
190
+ if self.section.is_a?("RailsAdmin::Config::Sections::#{section.to_s.camelize}".constantize)
191
+ returned = false if fields.include?(self.name)
192
+ end
193
+ end
194
+ returned
195
+ end
196
+
197
+ def editable
198
+ return false if @properties && @properties[:read_only]
199
+ role = bindings[:view].controller.send(:_attr_accessible_role)
200
+ klass = bindings[:object].class
201
+ whitelist = klass.accessible_attributes(role).map(&:to_s)
202
+ blacklist = klass.protected_attributes(role).map(&:to_s)
203
+ !self.method_name.to_s.in?(blacklist) && (whitelist.any? ? self.method_name.to_s.in?(whitelist) : true)
204
+ end
205
+
206
+ def render
207
+ bindings[:view].render :partial => partial.to_s, :locals => {:field => self, :form => bindings[:form] }
208
+ end
209
+
210
+ # Is this an association
211
+ def association?
212
+ kind_of?(RailsAdmin::Config::Fields::Association)
213
+ end
214
+
215
+ # Reader for validation errors of the bound object
216
+ def errors
217
+ bindings[:object].errors[name]
218
+ end
219
+
220
+ # Reader whether field is optional.
221
+ #
222
+ # @see RailsAdmin::Config::Fields::Base.register_instance_option(:required?)
223
+ def optional?
224
+ not required
225
+ end
226
+
227
+ # Inverse accessor whether this field is required.
228
+ #
229
+ # @see RailsAdmin::Config::Fields::Base.register_instance_option(:required?)
230
+ def optional(state = nil, &block)
231
+ if !state.nil? || block
232
+ required state.nil? ? proc { false == (instance_eval &block) } : false == state
233
+ else
234
+ optional?
235
+ end
236
+ end
237
+
238
+ # Writer to make field optional.
239
+ #
240
+ # @see RailsAdmin::Config::Fields::Base.optional
241
+ def optional=(state)
242
+ optional(state)
243
+ end
244
+
245
+ # Reader for field's type
246
+ def type
247
+ @type ||= self.class.name.to_s.demodulize.underscore.to_sym
248
+ end
249
+
250
+ # Reader for field's value
251
+ def value
252
+ bindings[:object].safe_send(name)
253
+ end
254
+
255
+ # Reader for nested attributes
256
+ def nested_form
257
+ false
258
+ end
259
+
260
+ def inverse_of
261
+ nil
262
+ end
263
+
264
+ def method_name
265
+ name
266
+ end
267
+
268
+ def _html_attributes
269
+ html_attributes.merge(!default_value.nil? ? { :value => default_value } : {})
270
+ end
271
+ end
272
+ end
273
+ end
274
+ end