admin_assistant 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (377) hide show
  1. data/.gitignore +16 -0
  2. data/Rakefile +34 -6
  3. data/VERSION +1 -0
  4. data/admin_assistant.gemspec +440 -0
  5. data/doc/img/blog_posts-index.png +0 -0
  6. data/install.rb +25 -4
  7. data/lib/admin_assistant/active_record_column.rb +133 -45
  8. data/lib/admin_assistant/association_target.rb +16 -3
  9. data/lib/admin_assistant/belongs_to_column.rb +18 -10
  10. data/lib/admin_assistant/builder.rb +67 -30
  11. data/lib/admin_assistant/column.rb +153 -71
  12. data/lib/admin_assistant/date_time_range_end_point_selector.rb +340 -0
  13. data/lib/admin_assistant/default_search_column.rb +3 -7
  14. data/lib/admin_assistant/form_view.rb +114 -10
  15. data/lib/admin_assistant/has_many_column.rb +56 -0
  16. data/lib/admin_assistant/index.rb +220 -83
  17. data/lib/admin_assistant/polymorphic_belongs_to_column.rb +1 -1
  18. data/lib/admin_assistant/request/base.rb +196 -67
  19. data/lib/admin_assistant/request/create.rb +55 -7
  20. data/lib/admin_assistant/request/edit.rb +1 -2
  21. data/lib/admin_assistant/request/index.rb +16 -9
  22. data/lib/admin_assistant/request/new.rb +19 -7
  23. data/lib/admin_assistant/request/update.rb +28 -13
  24. data/lib/admin_assistant/search.rb +17 -2
  25. data/lib/admin_assistant/virtual_column.rb +15 -7
  26. data/lib/admin_assistant.rb +101 -81
  27. data/lib/javascripts/admin_assistant.js +1 -1
  28. data/lib/stylesheets/activescaffold.css +6 -1
  29. data/lib/stylesheets/default.css +17 -0
  30. data/lib/views/form.html.erb +7 -3
  31. data/lib/views/index.html.erb +13 -8
  32. data/lib/views/multi_form.html.erb +71 -0
  33. data/lib/views/show.html.erb +4 -4
  34. data/test_rails_app/README +256 -0
  35. data/test_rails_app/Rakefile +13 -0
  36. data/test_rails_app/app/controllers/admin/appointments2_controller.rb +15 -0
  37. data/test_rails_app/app/controllers/admin/appointments_controller.rb +11 -0
  38. data/test_rails_app/app/controllers/admin/blog_posts2_controller.rb +138 -0
  39. data/test_rails_app/app/controllers/admin/blog_posts3_controller.rb +76 -0
  40. data/test_rails_app/app/controllers/admin/blog_posts4_controller.rb +21 -0
  41. data/test_rails_app/app/controllers/admin/blog_posts5_controller.rb +27 -0
  42. data/test_rails_app/app/controllers/admin/blog_posts6_controller.rb +10 -0
  43. data/test_rails_app/app/controllers/admin/blog_posts_controller.rb +8 -0
  44. data/test_rails_app/app/controllers/admin/blog_posts_custom_new_and_edit_controller.rb +15 -0
  45. data/test_rails_app/app/controllers/admin/blog_posts_read_only_controller.rb +19 -0
  46. data/test_rails_app/app/controllers/admin/bookmarks_controller.rb +11 -0
  47. data/test_rails_app/app/controllers/admin/comments2_controller.rb +14 -0
  48. data/test_rails_app/app/controllers/admin/comments_controller.rb +12 -0
  49. data/test_rails_app/app/controllers/admin/file_column_images2_controller.rb +10 -0
  50. data/test_rails_app/app/controllers/admin/file_column_images_controller.rb +6 -0
  51. data/test_rails_app/app/controllers/admin/images2_controller.rb +11 -0
  52. data/test_rails_app/app/controllers/admin/images_controller.rb +6 -0
  53. data/test_rails_app/app/controllers/admin/misconfigured1_controller.rb +7 -0
  54. data/test_rails_app/app/controllers/admin/not_migrated_yets_controller.rb +9 -0
  55. data/test_rails_app/app/controllers/admin/product_categories2_controller.rb +7 -0
  56. data/test_rails_app/app/controllers/admin/product_categories_controller.rb +5 -0
  57. data/test_rails_app/app/controllers/admin/products2_controller.rb +15 -0
  58. data/test_rails_app/app/controllers/admin/products_controller.rb +31 -0
  59. data/test_rails_app/app/controllers/admin/television_airings_controller.rb +5 -0
  60. data/test_rails_app/app/controllers/admin/television_time_slots_controller.rb +5 -0
  61. data/test_rails_app/app/controllers/admin/users2_controller.rb +10 -0
  62. data/test_rails_app/app/controllers/admin/users_controller.rb +63 -0
  63. data/test_rails_app/app/controllers/application.rb +16 -0
  64. data/test_rails_app/app/controllers/application_controller.rb +16 -0
  65. data/test_rails_app/app/controllers/blog_posts_controller.rb +5 -0
  66. data/test_rails_app/app/helpers/admin/appointments2_helper.rb +2 -0
  67. data/test_rails_app/app/helpers/admin/appointments_helper.rb +2 -0
  68. data/test_rails_app/app/helpers/admin/blog_posts2_helper.rb +27 -0
  69. data/test_rails_app/app/helpers/admin/blog_posts3_helper.rb +2 -0
  70. data/test_rails_app/app/helpers/admin/blog_posts4_helper.rb +2 -0
  71. data/test_rails_app/app/helpers/admin/blog_posts6_helper.rb +16 -0
  72. data/test_rails_app/app/helpers/admin/blog_posts_custom_new_and_edit_helper.rb +29 -0
  73. data/test_rails_app/app/helpers/admin/blog_posts_helper.rb +2 -0
  74. data/test_rails_app/app/helpers/admin/blog_posts_read_only_helper.rb +2 -0
  75. data/test_rails_app/app/helpers/admin/bookmarks_helper.rb +2 -0
  76. data/test_rails_app/app/helpers/admin/comments2_helper.rb +2 -0
  77. data/test_rails_app/app/helpers/admin/comments_helper.rb +2 -0
  78. data/test_rails_app/app/helpers/admin/file_column_images2_helper.rb +2 -0
  79. data/test_rails_app/app/helpers/admin/file_column_images_helper.rb +2 -0
  80. data/test_rails_app/app/helpers/admin/images2_helper.rb +8 -0
  81. data/test_rails_app/app/helpers/admin/images_helper.rb +2 -0
  82. data/test_rails_app/app/helpers/admin/misconfigured1_helper.rb +2 -0
  83. data/test_rails_app/app/helpers/admin/not_migrated_yets_helper.rb +2 -0
  84. data/test_rails_app/app/helpers/admin/product_categories2_helper.rb +2 -0
  85. data/test_rails_app/app/helpers/admin/product_categories_helper.rb +2 -0
  86. data/test_rails_app/app/helpers/admin/products2_helper.rb +3 -0
  87. data/test_rails_app/app/helpers/admin/products_helper.rb +6 -0
  88. data/test_rails_app/app/helpers/admin/television_airings_helper.rb +2 -0
  89. data/test_rails_app/app/helpers/admin/television_time_slots_helper.rb +2 -0
  90. data/test_rails_app/app/helpers/admin/users2_helper.rb +2 -0
  91. data/test_rails_app/app/helpers/admin/users_helper.rb +25 -0
  92. data/test_rails_app/app/helpers/application_helper.rb +3 -0
  93. data/test_rails_app/app/helpers/blog_posts_helper.rb +2 -0
  94. data/test_rails_app/app/models/appointment.rb +5 -0
  95. data/test_rails_app/app/models/blog_post.rb +14 -0
  96. data/test_rails_app/app/models/blog_post_tag.rb +6 -0
  97. data/test_rails_app/app/models/bookmark.rb +6 -0
  98. data/test_rails_app/app/models/comment.rb +4 -0
  99. data/test_rails_app/app/models/file_column_image.rb +3 -0
  100. data/test_rails_app/app/models/image.rb +3 -0
  101. data/test_rails_app/app/models/not_migrated_yet.rb +2 -0
  102. data/test_rails_app/app/models/product.rb +7 -0
  103. data/test_rails_app/app/models/product_category.rb +9 -0
  104. data/test_rails_app/app/models/tag.rb +4 -0
  105. data/test_rails_app/app/models/television_airing.rb +3 -0
  106. data/test_rails_app/app/models/television_time_slot.rb +11 -0
  107. data/test_rails_app/app/models/user.rb +14 -0
  108. data/test_rails_app/app/views/admin/appointments/_subject_input.html.erb +2 -0
  109. data/test_rails_app/app/views/admin/appointments2/_time_input.html.erb +31 -0
  110. data/test_rails_app/app/views/admin/blog_posts2/_after_form.html.erb +5 -0
  111. data/test_rails_app/app/views/admin/blog_posts2/_after_index.html.erb +1 -0
  112. data/test_rails_app/app/views/admin/blog_posts2/_after_tags_input.html.erb +16 -0
  113. data/test_rails_app/app/views/admin/blog_posts2/_before_index.html.erb +2 -0
  114. data/test_rails_app/app/views/admin/blog_posts5/_after_index_header.html.erb +8 -0
  115. data/test_rails_app/app/views/admin/blog_posts_read_only/_body_for_show.html.erb +1 -0
  116. data/test_rails_app/app/views/admin/products/_name_input.html.erb +2 -0
  117. data/test_rails_app/app/views/admin/products/_percent_off_input.html.erb +2 -0
  118. data/test_rails_app/app/views/admin/products/_price_input.html.erb +10 -0
  119. data/test_rails_app/app/views/blog_posts/show.html.erb +13 -0
  120. data/test_rails_app/app/views/layouts/admin.html.erb +31 -0
  121. data/test_rails_app/config/boot.rb +109 -0
  122. data/test_rails_app/config/database.yml +28 -0
  123. data/test_rails_app/config/environment.rb +78 -0
  124. data/test_rails_app/config/environments/development.rb +17 -0
  125. data/test_rails_app/config/environments/production.rb +24 -0
  126. data/test_rails_app/config/environments/test.rb +24 -0
  127. data/test_rails_app/config/initializers/inflections.rb +10 -0
  128. data/test_rails_app/config/initializers/mime_types.rb +5 -0
  129. data/test_rails_app/config/initializers/new_rails_defaults.rb +17 -0
  130. data/test_rails_app/config/locales/en.yml +5 -0
  131. data/test_rails_app/config/routes.rb +43 -0
  132. data/test_rails_app/db/migrate/20090213215514_create_blog_posts.rb +12 -0
  133. data/test_rails_app/db/migrate/20090217225542_add_body_to_blog_posts.rb +9 -0
  134. data/test_rails_app/db/migrate/20090221220917_create_tags.rb +13 -0
  135. data/test_rails_app/db/migrate/20090221220947_create_blog_post_tags.rb +14 -0
  136. data/test_rails_app/db/migrate/20090222162204_add_textile_to_blog_posts.rb +9 -0
  137. data/test_rails_app/db/migrate/20090222163231_add_published_at_to_blog_posts.rb +9 -0
  138. data/test_rails_app/db/migrate/20090301191722_create_images.rb +16 -0
  139. data/test_rails_app/db/migrate/20090305165345_create_accounts.rb +14 -0
  140. data/test_rails_app/db/migrate/20090307225027_rename_accounts_to_users.rb +9 -0
  141. data/test_rails_app/db/migrate/20090307225750_add_user_id_to_blog_posts.rb +9 -0
  142. data/test_rails_app/db/migrate/20090309185114_change_blog_posts_textile.rb +9 -0
  143. data/test_rails_app/db/migrate/20090309193635_create_products.rb +14 -0
  144. data/test_rails_app/db/migrate/20090309203056_create_comments.rb +15 -0
  145. data/test_rails_app/db/migrate/20090323005947_create_file_column_images.rb +12 -0
  146. data/test_rails_app/db/migrate/20090326160049_add_birthday_to_users.rb +9 -0
  147. data/test_rails_app/db/migrate/20090326223606_add_state_to_users.rb +9 -0
  148. data/test_rails_app/db/migrate/20090503134004_add_file_column_image_to_products.rb +9 -0
  149. data/test_rails_app/db/migrate/20090617173651_create_bookmarks.rb +15 -0
  150. data/test_rails_app/db/migrate/20090624165355_add_tags_string_to_blog_post.rb +9 -0
  151. data/test_rails_app/db/migrate/20090625144313_add_avatar_fields_to_user.rb +11 -0
  152. data/test_rails_app/db/migrate/20090629202956_add_merged_into_to_blog_posts.rb +9 -0
  153. data/test_rails_app/db/migrate/20090701171857_add_force_textile_to_users.rb +9 -0
  154. data/test_rails_app/db/migrate/20090704163647_add_deleted_at_to_products.rb +9 -0
  155. data/test_rails_app/db/migrate/20090704173800_add_sale_fields_to_products.rb +13 -0
  156. data/test_rails_app/db/migrate/20090714024501_create_product_categories.rb +15 -0
  157. data/test_rails_app/db/migrate/20090819162835_add_admin_level_to_users.rb +9 -0
  158. data/test_rails_app/db/migrate/20091115134559_add_first_and_last_names_to_users.rb +11 -0
  159. data/test_rails_app/db/migrate/20091221011256_add_position_to_product_categories.rb +9 -0
  160. data/test_rails_app/db/migrate/20091222160814_create_appointments.rb +14 -0
  161. data/test_rails_app/db/migrate/20091227224547_add_user_id_to_appointments.rb +9 -0
  162. data/test_rails_app/db/migrate/20100214213359_create_television_time_slots.rb +13 -0
  163. data/test_rails_app/db/migrate/20100214213451_create_television_airings.rb +15 -0
  164. data/test_rails_app/doc/README_FOR_APP +5 -0
  165. data/test_rails_app/lib/tasks/rspec.rake +163 -0
  166. data/test_rails_app/public/404.html +30 -0
  167. data/test_rails_app/public/422.html +30 -0
  168. data/test_rails_app/public/500.html +33 -0
  169. data/test_rails_app/public/dispatch.cgi +10 -0
  170. data/test_rails_app/public/dispatch.fcgi +24 -0
  171. data/test_rails_app/public/dispatch.rb +10 -0
  172. data/test_rails_app/public/favicon.ico +0 -0
  173. data/test_rails_app/public/images/rails.png +0 -0
  174. data/test_rails_app/public/index.html +274 -0
  175. data/test_rails_app/public/javascripts/application.js +2 -0
  176. data/test_rails_app/public/javascripts/controls.js +963 -0
  177. data/test_rails_app/public/javascripts/dragdrop.js +973 -0
  178. data/test_rails_app/public/javascripts/effects.js +1128 -0
  179. data/test_rails_app/public/javascripts/prototype.js +4320 -0
  180. data/test_rails_app/public/robots.txt +5 -0
  181. data/test_rails_app/public/stylesheets/admin.css +3 -0
  182. data/test_rails_app/public/stylesheets/scaffold.css +54 -0
  183. data/test_rails_app/script/about +4 -0
  184. data/test_rails_app/script/autospec +5 -0
  185. data/test_rails_app/script/console +3 -0
  186. data/test_rails_app/script/dbconsole +3 -0
  187. data/test_rails_app/script/destroy +3 -0
  188. data/test_rails_app/script/generate +3 -0
  189. data/test_rails_app/script/performance/benchmarker +3 -0
  190. data/test_rails_app/script/performance/profiler +3 -0
  191. data/test_rails_app/script/performance/request +3 -0
  192. data/test_rails_app/script/plugin +3 -0
  193. data/test_rails_app/script/populate_tables.rb +49 -0
  194. data/test_rails_app/script/process/inspector +3 -0
  195. data/test_rails_app/script/process/reaper +3 -0
  196. data/test_rails_app/script/process/spawner +3 -0
  197. data/test_rails_app/script/runner +3 -0
  198. data/test_rails_app/script/server +3 -0
  199. data/test_rails_app/script/spec +5 -0
  200. data/test_rails_app/script/spec_server +125 -0
  201. data/test_rails_app/spec/controllers/admin/appointments2_controller_spec.rb +88 -0
  202. data/test_rails_app/spec/controllers/admin/appointments_controller_spec.rb +419 -0
  203. data/test_rails_app/spec/controllers/admin/blog_posts2_controller_spec.rb +1021 -0
  204. data/test_rails_app/spec/controllers/admin/blog_posts3_controller_spec.rb +532 -0
  205. data/test_rails_app/spec/controllers/admin/blog_posts4_controller_spec.rb +231 -0
  206. data/test_rails_app/spec/controllers/admin/blog_posts5_controller_spec.rb +77 -0
  207. data/test_rails_app/spec/controllers/admin/blog_posts6_controller_spec.rb +49 -0
  208. data/test_rails_app/spec/controllers/admin/blog_posts_controller_spec.rb +987 -0
  209. data/test_rails_app/spec/controllers/admin/blog_posts_custom_new_and_edit_controller_spec.rb +99 -0
  210. data/test_rails_app/spec/controllers/admin/blog_posts_read_only_controller_spec.rb +94 -0
  211. data/test_rails_app/spec/controllers/admin/bookmarks_controller_spec.rb +505 -0
  212. data/test_rails_app/spec/controllers/admin/comments2_controller_spec.rb +70 -0
  213. data/test_rails_app/spec/controllers/admin/comments_controller_spec.rb +82 -0
  214. data/test_rails_app/spec/controllers/admin/file_column_images2_controller_spec.rb +25 -0
  215. data/test_rails_app/spec/controllers/admin/file_column_images_controller_spec.rb +82 -0
  216. data/test_rails_app/spec/controllers/admin/images2_controller_spec.rb +44 -0
  217. data/test_rails_app/spec/controllers/admin/images_controller_spec.rb +97 -0
  218. data/test_rails_app/spec/controllers/admin/misconfigured1_controller_spec.rb +21 -0
  219. data/test_rails_app/spec/controllers/admin/not_migrated_yets_controller_spec.rb +10 -0
  220. data/test_rails_app/spec/controllers/admin/product_categories2_controller_spec.rb +215 -0
  221. data/test_rails_app/spec/controllers/admin/product_categories_controller_spec.rb +19 -0
  222. data/test_rails_app/spec/controllers/admin/products2_controller_spec.rb +203 -0
  223. data/test_rails_app/spec/controllers/admin/products_controller_spec.rb +255 -0
  224. data/test_rails_app/spec/controllers/admin/television_airings_controller_spec.rb +32 -0
  225. data/test_rails_app/spec/controllers/admin/television_time_slots_controller_spec.rb +10 -0
  226. data/test_rails_app/spec/controllers/admin/users2_controller_spec.rb +65 -0
  227. data/test_rails_app/spec/controllers/admin/users_controller_spec.rb +344 -0
  228. data/test_rails_app/spec/controllers/blog_posts_controller_spec.rb +13 -0
  229. data/test_rails_app/spec/data/ruby_throated.jpg +0 -0
  230. data/test_rails_app/spec/data/tweenbot.jpg +0 -0
  231. data/test_rails_app/spec/fixtures/appointments.yml +9 -0
  232. data/test_rails_app/spec/fixtures/blog_post_tags.yml +9 -0
  233. data/test_rails_app/spec/fixtures/blog_posts.yml +7 -0
  234. data/test_rails_app/spec/fixtures/bookmarks.yml +11 -0
  235. data/test_rails_app/spec/fixtures/comments.yml +11 -0
  236. data/test_rails_app/spec/fixtures/file_column_images.yml +7 -0
  237. data/test_rails_app/spec/fixtures/images.yml +7 -0
  238. data/test_rails_app/spec/fixtures/not_migrated_yets.yml +7 -0
  239. data/test_rails_app/spec/fixtures/product_categories.yml +7 -0
  240. data/test_rails_app/spec/fixtures/products.yml +9 -0
  241. data/test_rails_app/spec/fixtures/tags.yml +7 -0
  242. data/test_rails_app/spec/fixtures/television_airings.yml +11 -0
  243. data/test_rails_app/spec/fixtures/television_time_slots.yml +7 -0
  244. data/test_rails_app/spec/fixtures/users.yml +9 -0
  245. data/test_rails_app/spec/helpers/admin/appointments2_helper_spec.rb +11 -0
  246. data/test_rails_app/spec/helpers/admin/appointments_helper_spec.rb +11 -0
  247. data/test_rails_app/spec/helpers/admin/blog_posts2_helper_spec.rb +11 -0
  248. data/test_rails_app/spec/helpers/admin/blog_posts3_helper_spec.rb +11 -0
  249. data/test_rails_app/spec/helpers/admin/blog_posts4_helper_spec.rb +11 -0
  250. data/test_rails_app/spec/helpers/admin/blog_posts_custom_new_and_edit_helper_spec.rb +11 -0
  251. data/test_rails_app/spec/helpers/admin/blog_posts_helper_spec.rb +11 -0
  252. data/test_rails_app/spec/helpers/admin/blog_posts_read_only_helper_spec.rb +11 -0
  253. data/test_rails_app/spec/helpers/admin/bookmarks_helper_spec.rb +11 -0
  254. data/test_rails_app/spec/helpers/admin/comments2_helper_spec.rb +11 -0
  255. data/test_rails_app/spec/helpers/admin/comments_helper_spec.rb +11 -0
  256. data/test_rails_app/spec/helpers/admin/file_column_images2_helper_spec.rb +11 -0
  257. data/test_rails_app/spec/helpers/admin/file_column_images_helper_spec.rb +11 -0
  258. data/test_rails_app/spec/helpers/admin/images2_helper_spec.rb +11 -0
  259. data/test_rails_app/spec/helpers/admin/images_helper_spec.rb +11 -0
  260. data/test_rails_app/spec/helpers/admin/misconfigured1_helper_spec.rb +11 -0
  261. data/test_rails_app/spec/helpers/admin/not_migrated_yets_helper_spec.rb +11 -0
  262. data/test_rails_app/spec/helpers/admin/product_categories2_helper_spec.rb +11 -0
  263. data/test_rails_app/spec/helpers/admin/product_categories_helper_spec.rb +11 -0
  264. data/test_rails_app/spec/helpers/admin/products2_helper_spec.rb +11 -0
  265. data/test_rails_app/spec/helpers/admin/products_helper_spec.rb +11 -0
  266. data/test_rails_app/spec/helpers/admin/television_airings_helper_spec.rb +11 -0
  267. data/test_rails_app/spec/helpers/admin/television_time_slots_helper_spec.rb +11 -0
  268. data/test_rails_app/spec/helpers/admin/users2_helper_spec.rb +11 -0
  269. data/test_rails_app/spec/helpers/admin/users_helper_spec.rb +11 -0
  270. data/test_rails_app/spec/helpers/blog_posts_helper_spec.rb +11 -0
  271. data/test_rails_app/spec/models/appointment_spec.rb +16 -0
  272. data/test_rails_app/spec/models/blog_post_spec.rb +13 -0
  273. data/test_rails_app/spec/models/blog_post_tag_spec.rb +14 -0
  274. data/test_rails_app/spec/models/bookmark_spec.rb +15 -0
  275. data/test_rails_app/spec/models/comment_spec.rb +15 -0
  276. data/test_rails_app/spec/models/file_column_image_spec.rb +12 -0
  277. data/test_rails_app/spec/models/image_spec.rb +12 -0
  278. data/test_rails_app/spec/models/not_migrated_yet_spec.rb +15 -0
  279. data/test_rails_app/spec/models/product_category_spec.rb +15 -0
  280. data/test_rails_app/spec/models/product_spec.rb +14 -0
  281. data/test_rails_app/spec/models/tag_spec.rb +13 -0
  282. data/test_rails_app/spec/models/television_airing_spec.rb +15 -0
  283. data/test_rails_app/spec/models/television_time_slot_spec.rb +13 -0
  284. data/test_rails_app/spec/models/user_spec.rb +14 -0
  285. data/test_rails_app/spec/rcov.opts +2 -0
  286. data/test_rails_app/spec/spec.opts +4 -0
  287. data/test_rails_app/spec/spec_helper.rb +88 -0
  288. data/test_rails_app/spec/spec_or_test_helper.rb +49 -0
  289. data/test_rails_app/test/fixtures/file_column_images.yml +7 -0
  290. data/test_rails_app/test/integration/admin_blog_posts2_integration_test.rb +16 -0
  291. data/test_rails_app/test/integration/admin_blog_posts5_integration_test.rb +19 -0
  292. data/test_rails_app/test/integration/admin_blog_posts_integration_test.rb +25 -0
  293. data/test_rails_app/test/test_helper.rb +28 -0
  294. data/test_rails_app/vendor/plugins/file_column/CHANGELOG +69 -0
  295. data/test_rails_app/vendor/plugins/file_column/README +54 -0
  296. data/test_rails_app/vendor/plugins/file_column/Rakefile +36 -0
  297. data/test_rails_app/vendor/plugins/file_column/TODO +6 -0
  298. data/test_rails_app/vendor/plugins/file_column/init.rb +13 -0
  299. data/test_rails_app/vendor/plugins/file_column/lib/file_column.rb +723 -0
  300. data/test_rails_app/vendor/plugins/file_column/lib/file_column_helper.rb +150 -0
  301. data/test_rails_app/vendor/plugins/file_column/lib/file_compat.rb +28 -0
  302. data/test_rails_app/vendor/plugins/file_column/lib/magick_file_column.rb +260 -0
  303. data/test_rails_app/vendor/plugins/file_column/lib/rails_file_column.rb +19 -0
  304. data/test_rails_app/vendor/plugins/file_column/lib/test_case.rb +124 -0
  305. data/test_rails_app/vendor/plugins/file_column/lib/validations.rb +112 -0
  306. data/test_rails_app/vendor/plugins/file_column/test/abstract_unit.rb +63 -0
  307. data/test_rails_app/vendor/plugins/file_column/test/connection.rb +17 -0
  308. data/test_rails_app/vendor/plugins/file_column/test/file_column_helper_test.rb +97 -0
  309. data/test_rails_app/vendor/plugins/file_column/test/file_column_test.rb +650 -0
  310. data/test_rails_app/vendor/plugins/file_column/test/fixtures/entry.rb +32 -0
  311. data/test_rails_app/vendor/plugins/file_column/test/fixtures/invalid-image.jpg +1 -0
  312. data/test_rails_app/vendor/plugins/file_column/test/fixtures/kerb.jpg +0 -0
  313. data/test_rails_app/vendor/plugins/file_column/test/fixtures/mysql.sql +25 -0
  314. data/test_rails_app/vendor/plugins/file_column/test/fixtures/schema.rb +10 -0
  315. data/test_rails_app/vendor/plugins/file_column/test/fixtures/skanthak.png +0 -0
  316. data/test_rails_app/vendor/plugins/file_column/test/magick_test.rb +380 -0
  317. data/test_rails_app/vendor/plugins/file_column/test/magick_view_only_test.rb +21 -0
  318. data/vendor/ar_query/ar_query.gemspec +16 -0
  319. data/website/_layouts/api.html +39 -0
  320. data/website/_layouts/default.html +34 -0
  321. data/website/api/core.markdown +106 -0
  322. data/website/api/destroy.markdown +25 -0
  323. data/website/api/form.markdown +291 -0
  324. data/website/api/idx.markdown +286 -0
  325. data/website/api/index.markdown +147 -0
  326. data/website/api/search.markdown +108 -0
  327. data/website/api/show.markdown +22 -0
  328. data/website/community.markdown +27 -0
  329. data/website/css/lightbox.css +29 -0
  330. data/website/css/main.css +70 -0
  331. data/website/design_principles.markdown +50 -0
  332. data/website/getting_started.markdown +10 -0
  333. data/website/img/blog_posts-index.png +0 -0
  334. data/website/img/blog_posts-search.png +0 -0
  335. data/website/img/lightbox/bullet.gif +0 -0
  336. data/website/img/lightbox/close.gif +0 -0
  337. data/website/img/lightbox/closelabel.gif +0 -0
  338. data/website/img/lightbox/donate-button.gif +0 -0
  339. data/website/img/lightbox/download-icon.gif +0 -0
  340. data/website/img/lightbox/image-1.jpg +0 -0
  341. data/website/img/lightbox/loading.gif +0 -0
  342. data/website/img/lightbox/nextlabel.gif +0 -0
  343. data/website/img/lightbox/prevlabel.gif +0 -0
  344. data/website/img/lightbox/thumb-1.jpg +0 -0
  345. data/website/img/screen1-thumb.png +0 -0
  346. data/website/img/screen1.png +0 -0
  347. data/website/img/screen10-thumb.png +0 -0
  348. data/website/img/screen10.png +0 -0
  349. data/website/img/screen11-thumb.png +0 -0
  350. data/website/img/screen11.png +0 -0
  351. data/website/img/screen2-thumb.png +0 -0
  352. data/website/img/screen2.png +0 -0
  353. data/website/img/screen3-thumb.png +0 -0
  354. data/website/img/screen3.png +0 -0
  355. data/website/img/screen4-thumb.png +0 -0
  356. data/website/img/screen4.png +0 -0
  357. data/website/img/screen5-thumb.png +0 -0
  358. data/website/img/screen5.png +0 -0
  359. data/website/img/screen6-thumb.png +0 -0
  360. data/website/img/screen6.png +0 -0
  361. data/website/img/screen7-thumb.png +0 -0
  362. data/website/img/screen7.png +0 -0
  363. data/website/img/screen8-thumb.png +0 -0
  364. data/website/img/screen8.png +0 -0
  365. data/website/img/screen9-thumb.png +0 -0
  366. data/website/img/screen9.png +0 -0
  367. data/website/img/user-form.png +0 -0
  368. data/website/index.markdown +35 -0
  369. data/website/js/builder.js +136 -0
  370. data/website/js/effects.js +1122 -0
  371. data/website/js/lightbox.js +497 -0
  372. data/website/js/prototype.js +4221 -0
  373. data/website/js/scriptaculous.js +58 -0
  374. data/website/quick_start.markdown +44 -0
  375. data/website/screenshots.markdown +27 -0
  376. data/website/tutorial.markdown +56 -0
  377. metadata +391 -23
@@ -0,0 +1,147 @@
1
+ ---
2
+ layout: api
3
+ ---
4
+
5
+ ### Reference sections
6
+
7
+ The API reference is broken down into a few sections:
8
+
9
+ * [Core](./core.html): Settings that apply to an admin controller in general.
10
+ * [Destroy](./destroy.html): Settings that apply to destroying records. Note that `destroy` is turned off by default. To turn it on, use the core [actions](./core.html#builder_actions) method.
11
+ * [Form](./form.html): Settings that apply to creating or updating records.
12
+ * [Index](./idx.html): Settings that apply to the index view, which you use to view records, paginate, and sort.
13
+ * [Search](./search.html): Settings that apply to how searches work.
14
+ * [Show](./show.html): Settings that apply to how the show view.
15
+
16
+
17
+ ### Configuration overview
18
+
19
+
20
+ There are a number of ways to configure admin\_assistant:
21
+
22
+ #### Through builder objects
23
+
24
+ `admin_assistant_for` takes a block that yields a core builder object:
25
+
26
+ class Admin::BlogPostsController < ApplicationController
27
+ layout 'admin'
28
+
29
+ admin_assistant_for BlogPost do |aa|
30
+ aa.model_class_name = 'post'
31
+ end
32
+ end
33
+
34
+ For the actions `form` and `index`, you can get a nested builder from the core builder, which can be used to configure those individual action types.
35
+
36
+ admin_assistant_for BlogPost do |aa|
37
+ aa.index do |index|
38
+ index.sort_by "name asc"
39
+ end
40
+ end
41
+
42
+ The nesting is intended to help organize your configuration code, but if you're in a hurry, you can also just chain the calls:
43
+
44
+ admin_assistant_for BlogPost do |aa|
45
+ aa.index.sort_by "name asc"
46
+ end
47
+
48
+ Since `search` is really a subset of `index`, its configuration builder is reached through the index builder.
49
+
50
+ admin_assistant_for BlogPost do |aa|
51
+ aa.index do |index|
52
+ index.search do |search|
53
+ search.columns :id, :title, :body
54
+ end
55
+ end
56
+ end
57
+
58
+ #### Columns on builder objects
59
+
60
+ Columns are specified on the action-types `index`, `form`, or `search`:
61
+
62
+ admin_assistant_for BlogPost do |aa|
63
+ aa.index.columns :id, :title, :body
64
+ end
65
+
66
+ There is no global `columns` setting.
67
+
68
+ These columns can be accessed with `[]`, either globally, or specific to an action-type, depending on what sort of setting is being altered.
69
+
70
+ admin_assistant_for BlogPost do |aa|
71
+ # this will apply to the :title column, both on form and index views
72
+ aa[:title].label = "Headline"
73
+
74
+ aa.form do |form|
75
+ form.columns :id, :title, :body
76
+
77
+ # This will only apply to the :title column in the form view
78
+ form[:title].description = "Enter the headline of your blog post here."
79
+ end
80
+ end
81
+
82
+ If you're dealing with an association, generally speaking, you'll use the column of the association name, not the foreign key ID in the database.
83
+
84
+ admin_assistant_for BlogPost do |aa|
85
+ aa.index.columns :id, :title, :user # as opposed to :user_id
86
+ end
87
+
88
+ #### Protected controller methods
89
+
90
+ For certain types of settings, the `form` and `index` action types can be customized through protected methods on the controller.
91
+
92
+ class Admin::BlogPostsController < ApplicationController
93
+ layout 'admin'
94
+
95
+ admin_assistant_for BlogPost
96
+
97
+ protected
98
+
99
+ # The index action only shows unpublished blog posts, unless somebody has
100
+ # clicked the custom "Show All" link
101
+ def conditions_for_index
102
+ "published_at is null" unless params[:all]
103
+ end
104
+ end
105
+
106
+ Remember to make these methods protected so that Rails won't try to use them as public-facing actions, i.e. `http://www.example.com/admin/blog_posts/conditions_for_index`.
107
+
108
+ In a number of cases, you can get the same customization by passing a block to the builder object. For example, the code below works the same as the previous example:
109
+
110
+ class Admin::BlogPostsController < ApplicationController
111
+ layout 'admin'
112
+
113
+ admin_assistant_for BlogPost do |aa|
114
+ aa.index.conditions do |params|
115
+ "published_at is null" unless params[:all]
116
+ end
117
+ end
118
+ end
119
+
120
+ The trade-off here is that customizing this behavior through a block is probably a little neater---fewer methods scattered all over your controller---but isn't bound to the controller. So if you find yourself needing some convenience methods on, say, `ApplicationController`, you'll be better off using a protected controller method.
121
+
122
+ #### Helper methods and partials
123
+
124
+ Other behaviors can be set by creating certain methods on the helper. Usually these behaviors have to do with presentation.
125
+
126
+ class Admin::UsersHelper
127
+ def password_input(user)
128
+ password_field_tag("user[password]", user.password, :disabled => true)
129
+ end
130
+ end
131
+
132
+ Often you can accomplish the same thing with a partial. For example, the functionality in the above example could also be accomplished with the following saved in `app/views/admin/users/_password_input.html.erb`.
133
+
134
+ <%= password_field_tag("user[password]", user.password, :disabled => true) %>
135
+
136
+ #### Model methods
137
+
138
+ admin\_assistant can also look for methods to be defined on models, themselves. This is generally for behaviors that would apply across all admin controllers.
139
+
140
+ class ProductCategory < ActiveRecord::Base
141
+ def name_for_admin_assistant
142
+ self.category_name
143
+ end
144
+ end
145
+
146
+ Generally speaking there won't be many of these hooks, because in practice this can make the admin\_assistant API sort of invasive. Unless your Rails project is 99% the admin interface, it's going to get annoying to keep tripping over admin\_assistant-specific hooks when you're trying to write some front-facing code.
147
+
@@ -0,0 +1,108 @@
1
+ ---
2
+ layout: api
3
+ title: Search
4
+ ---
5
+
6
+ ![index](../img/blog_posts-search.png)
7
+
8
+ Search restricts the records viewed in [Index] by various criteria. By default, search presents a single text field, and text entered in this field will be compared to all string and text fields in the table. By setting #columns you can have the search form specify which fields are being searched on.
9
+
10
+ Since search is closely related to [Index], its configuration is reached through the index builder:
11
+
12
+ class Admin::BlogPostsController < ApplicationController
13
+ admin_assistant_for BlogPost do |a|
14
+ a.index do |index|
15
+ index.search do |search|
16
+ search.columns :title, :user
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ You can chain calls to get to the search builder more quickly:
23
+
24
+ class Admin::BlogPostsController < ApplicationController
25
+ admin_assistant_for BlogPost do |a|
26
+ a.index.search do |search|
27
+ search.columns :title, :user
28
+ end
29
+ end
30
+ end
31
+
32
+ ### Search config options
33
+
34
+ #### columns
35
+ <a name="builder_columns"></a>
36
+
37
+ search.columns :title, :user
38
+
39
+ Call this method to set the search to supply one input for each column. When you set multiple search columns, users get the option of searching on all entered columns or any of them.
40
+
41
+ You can also call this with Index#search:
42
+
43
+ index.search :title, :user
44
+
45
+ #### default\_search\_matches\_on
46
+
47
+ If you don't specify any columns, the search form is simply one field, and whatever text is entered in that field will be compared to every text and string field on the database table. If there are other fields you'd like the default search to compare with, you can add them using `default_search_matches_on`. For example, to give users the ability to search by ID:
48
+
49
+ index.search.default_search_matches_on :id
50
+
51
+ You can also pass in SQL fragments:
52
+
53
+ index.search.default_search_matches_on \
54
+ "concat_ws(' ', users.first_name, users.last_name)"
55
+
56
+ #### include\_params\_in\_form
57
+
58
+ index.search.include_params_in_form = true
59
+
60
+ This will put any custom page params in the search form to be posted with the search parameters. You might use this if you've got another way of filtering, say, blog posts by user, and you want the search form on that page to only search within blog posts by that user.
61
+
62
+
63
+ ### Column config options
64
+
65
+ These are configurations that can be applied to specific columns in the search.
66
+
67
+ #### comparators
68
+
69
+ search[:price].comparators = false
70
+
71
+ By default, integer and datetime fields are presented with a list of options for comparing to the entered value: "greater than", "greater than or equal to", "equal to", "less than or equal to", and "less than". This way the user can do a search like "show me all products that cost more than $100."
72
+
73
+ To turn this off, set `comparators` to false.
74
+
75
+ #### compare\_to\_range
76
+
77
+ search[:price].compare_to_range = true
78
+
79
+ If you want to offer a ranged search, set `compare_to_range` to true. This will render two fields for greater-than and less-than in the search.
80
+
81
+ #### conditions
82
+
83
+ search[:has_short_title].field_type = :boolean
84
+ search[:has_short_title].conditions do |has_short_title|
85
+ if has_short_title
86
+ "length(title) < 10"
87
+ elsif has_short_title == false
88
+ "length(title) >= 10"
89
+ end
90
+ end
91
+
92
+ To be used with a virtual column in search. The block should return a SQL fragment to add to the final query, or nil to not change anything.
93
+
94
+ #### match\_text\_fields\_for\_association
95
+
96
+ search[:user].match_text_fields_for_association
97
+
98
+ Only applies to belongs-to associations. By default, belongs-to associations will be searchable using a dropdown of the associated records that currently exist. Calling `match_text_fields_for_association` will mean the input for that association will be a text input instead, and that text will be matched against all text or string fields on the associated record.
99
+
100
+ For example, let's say you have a BlogPost that belongs to a User. With this configuration on Admin::BlogPostsController:
101
+
102
+ search.columns :user
103
+ search[:user].match_text_fields_for_association
104
+
105
+ ... the search form will be one field, a text input labeled "User". If the user enters "an" in that field, it will match against all blog posts by the users with the username field of "Andy", "Andrew", and "Frank".
106
+
107
+
108
+ [Index]: ./idx.html
@@ -0,0 +1,22 @@
1
+ ---
2
+ layout: api
3
+ title: Show
4
+ ---
5
+
6
+ Show configuration affects what is displayed in a show page, e.g. `/admin/blog_posts/show/5`.
7
+
8
+ ### Show config options
9
+
10
+ #### columns
11
+
12
+ admin_assistant_for BlogPost do |aa|
13
+ aa.show.columns :user, :title, :body
14
+ end
15
+
16
+ Shows only these columns in the show page.
17
+
18
+ ### Partials
19
+
20
+ #### \_\[column\]\_for_show.html.erb
21
+
22
+ If this partial is present, it will be rendered instead of the default HTML for the column.
@@ -0,0 +1,27 @@
1
+ ---
2
+ layout: default
3
+ title: Community
4
+ ---
5
+
6
+ ### Mailing list
7
+
8
+ We have a mailing list over at [Google Groups](http://groups.google.com/group/admin_assistant). If you have a question, please consider asking it there instead of a direct email, in the hopes that the next person who has the same question might find the answer by just Googling it.
9
+
10
+ <a name="whos_using"></a>
11
+ ### Who's using admin\_assistant?
12
+
13
+ admin\_assistant is being used on the following sites:
14
+
15
+ * [boundlessny.com](http://www.boundlessny.com/) by [Michael Celona][mcelona]
16
+ * [casahelga.com](http://casahelga.com) by [Alex Farrill][afarrill]
17
+ * [fhwang.net](http://fhwang.net) by [Francis Hwang][fhwang]
18
+ * [sling.com](http://www.sling.com) by [Diversion Media](http://www.diversionmedia.com/)
19
+ * [stockblotter.com](http://stockblotter.com) by [Alex Farrill][afarrill]
20
+
21
+ If you're also using admin\_assistant, and would like to be listed here, please get in touch with us on the mailing list.
22
+
23
+
24
+
25
+ [afarrill]: http://www.linkedin.com/in/alexfarrill
26
+ [fhwang]: http://fhwang.net/
27
+ [mcelona]: http://www.linkedin.com/in/mcelona
@@ -0,0 +1,29 @@
1
+ #lightbox{ position: absolute; left: 0; width: 100%; z-index: 100; text-align: center; line-height: 0;}
2
+ #lightbox img{ width: auto; height: auto;}
3
+ #lightbox a img{ border: none; }
4
+
5
+ #lightboxImage { border: 1px solid #008; }
6
+
7
+ #outerImageContainer{ position: relative; background-color: #fff; width: 250px; height: 250px; margin: 0 auto; }
8
+ #imageContainer{ padding: 10px; }
9
+
10
+ #loading{ position: absolute; top: 40%; left: 0%; height: 25%; width: 100%; text-align: center; line-height: 0; }
11
+ #hoverNav{ position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; }
12
+ #imageContainer>#hoverNav{ left: 0;}
13
+ #hoverNav a{ outline: none;}
14
+
15
+ #prevLink, #nextLink{ width: 49%; height: 100%; background-image: url(data:image/gif;base64,AAAA); /* Trick IE into showing hover */ display: block; }
16
+ #prevLink { left: 0; float: left;}
17
+ #nextLink { right: 0; float: right;}
18
+ #prevLink:hover, #prevLink:visited:hover { background: url(../img/lightbox/prevlabel.gif) left 15% no-repeat; }
19
+ #nextLink:hover, #nextLink:visited:hover { background: url(../img/lightbox/nextlabel.gif) right 15% no-repeat; }
20
+
21
+ #imageDataContainer{ font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; margin: 0 auto; line-height: 1.4em; overflow: auto; width: 100% ; }
22
+
23
+ #imageData{ padding:0 10px; color: #666; }
24
+ #imageData #imageDetails{ width: 70%; float: left; text-align: left; }
25
+ #imageData #caption{ font-weight: bold; }
26
+ #imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; }
27
+ #imageData #bottomNavClose{ width: 66px; float: right; padding-bottom: 0.7em; outline: none;}
28
+
29
+ #overlay{ position: absolute; top: 0; left: 0; z-index: 90; width: 100%; height: 500px; background-color: #000; }
@@ -0,0 +1,70 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: Verdana, "Bitstream Vera Sans", sans-serif;
4
+ }
5
+
6
+ h1 {
7
+ width: 900px;
8
+ margin: auto;
9
+ padding: 10px;
10
+ }
11
+
12
+ h1 a, h1 a:visited {
13
+ text-decoration: none;
14
+ color: black;
15
+ }
16
+
17
+ h1 a:hover {
18
+ background: #ff3;
19
+ }
20
+
21
+ code {
22
+ background: #ffd;
23
+ border: #ff6 1px solid;
24
+ font-size: large;
25
+ }
26
+
27
+ pre {
28
+ background: #ffd;
29
+ border: #ff6 1px solid;
30
+ padding: 5px;
31
+ font-size: large;
32
+ }
33
+
34
+ pre code {
35
+ border: none;
36
+ }
37
+
38
+ #body {
39
+ width: 900px;
40
+ margin: auto;
41
+ padding-bottom: 25px;
42
+ }
43
+
44
+ #page_header {
45
+ background: #ffc
46
+ }
47
+
48
+ #page_header .nav {
49
+ width: 900px;
50
+ margin: auto;
51
+ padding-bottom: 10px;
52
+ }
53
+
54
+ #page_header .nav a, #page_header .nav a:visited {
55
+ text-decoration: none;
56
+ color: black;
57
+ }
58
+
59
+ #page_header .nav a:hover {
60
+ background: #ff3;
61
+ }
62
+
63
+ .subnav {
64
+ margin-top: -20px;
65
+ font-size: small;
66
+ }
67
+
68
+ .thumb {
69
+ margin-right: 10px;
70
+ }
@@ -0,0 +1,50 @@
1
+ ---
2
+ layout: default
3
+ title: Design principles
4
+ ---
5
+
6
+ admin\_assistant is built with a few design principles in mind:
7
+
8
+ ### Relentless full-stack testing
9
+
10
+ admin\_assistant is tested against a complete, self-contained Rails app in the `test_rails_app` directory. This app serves as the reference implementation of admin\_assistant, so new features can be added with minimal worry of breaking old features.
11
+
12
+ In addition, this test suite can be run against multiple versions of Rails, making multi-version support possible.
13
+
14
+
15
+ ### Wide support of Rails versions
16
+
17
+ admin\_assistant currently supports six versions of Rails: 2.1.0, 2.1.2, 2.2.2, 2.3.2, 2.3.3, and 2.3.4. We offer this support by writing a test suite that can be run with different versions of Rails. After all, it doesn't make any sense to release a plugin intended for other programmers' convenience, and then tell them to drop everything and spend the next two weeks upgrading their whole app.
18
+
19
+
20
+ ### Deeply customizable API
21
+
22
+ It's great to be able to do the quick boilerplate CRUD operations, but it doesn't take long before you need a lot of custom functionality. So, while admin\_assistant can be set up in a few lines, its real strength is all the hooks it offers you:
23
+
24
+ * Labeling of models and columns
25
+ * Links at a page level, record level, or field level
26
+ * Selection of columns to include in index views and in forms
27
+ * Field value display in index views
28
+ * Custom inputs, submit buttons, descriptions in forms
29
+ * Partials can be rendered before or after forms, or column inputs.
30
+ * Custom options for date selects, datetime selects, textarea tags, etc. can be set up on a per-column level and passed through to the underlying Rails method.
31
+ * Custom redirecting after successful saves
32
+
33
+ If you're copying and pasting something out of `vendor/plugins/admin_assistant`, that's a design flaw.
34
+
35
+
36
+ ### Minimally invasive
37
+
38
+ If you like, you can use admin\_assistant in a very self-contained way, meaning that any admin functionality you add to your application doesn't have to affect any other parts of the code.
39
+
40
+ For example, standard ActiveRecord callbacks like `after_save` and `before_create` can be mimicked in the admin controller, in case you want to contain that code to one particular controller, instead of having to think about how it might affect other code that's using that model.
41
+
42
+ In addition, admin\_assistant doesn't override or `alias_method_chain` anything in Rails core, which greatly reduces the possibility that admin\_assistant would conflict with another plugin.
43
+
44
+
45
+ ### Safe defaults
46
+
47
+ admin\_assistant is opinionated in its own way, much of which has to do with picking the most safe default behavior possible.
48
+
49
+ * The `destroy` action is turned off by default, since the decision to allow a way to erase production data should be taken seriously.
50
+ * Date selects and datetime selects in forms are blank by default, not the current date or time. This helps avoid a situation on models with many fields where dates and datetimes can be set by accident, changing the site's behavior in unexpected ways. The current date or time is usually not a useful default, anyway.
@@ -0,0 +1,10 @@
1
+ ---
2
+ layout: default
3
+ title: Getting started
4
+ ---
5
+
6
+ This page has been [moved](/admin_assistant/quick_start.html).
7
+
8
+ <script>
9
+ window.location.href = "/admin_assistant/quick_start.html";
10
+ </script>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,35 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+
5
+ admin\_assistant is a Rails plugin that automates a lot of features typically needed in admin controllers. It is written and maintained by [Francis Hwang][fhwang].
6
+
7
+ admin\_assistant is in beta, meaning that it is stable, and being used in production sites, but there may be small API changes in the future.
8
+
9
+ It currently supports Rails 2.1.0, 2.1.2, 2.2.2, 2.3.2, 2.3.3, and 2.3.4. There are no plans to support Rails 2.0 or earlier.
10
+
11
+
12
+ ## Features
13
+
14
+ * Built-in model creation, updating, and deletion.
15
+ * Live querying of models, which allows incremental development of controllers without the maintenance problems of generated code.
16
+ * Paginated indexes with built field-ordering.
17
+ * Highly customizable search that allows customization of individual fields, numerical comparators, and boolean operators.
18
+ * Built-in Ajax autocompleters for handling belongs-to associations.
19
+ * Built-in widgets for handling polymorphic belongs-to associations.
20
+ * Built-in support for images with either [Paperclip](http://thoughtbot.com/projects/paperclip) or [FileColumn](http://www.kanthak.net/opensource/file_column/).
21
+ * Heavily hookable interface allows customization of columns, search parameters, form inputs, parameter handling, and model creation.
22
+
23
+
24
+ ## Still not convinced?
25
+
26
+ Check out our [screenshots](./screenshots.html), [who's using admin\_assistant](./community.html#whos_using), or our [design principles](./design_principles.html).
27
+
28
+
29
+ ## Ready to give it a try?
30
+
31
+ [Getting started](./getting_started.html) is easy.
32
+
33
+ [afarrill]: http://github.com/alexfarrill
34
+ [fhwang]: http://fhwang.net/
35
+ [mcelona]: http://github.com/mcelona