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,25 @@
1
+ -- MySQL dump 9.11
2
+ --
3
+ -- Host: localhost Database: file_column_test
4
+ -- ------------------------------------------------------
5
+ -- Server version 4.0.24
6
+
7
+ --
8
+ -- Table structure for table `entries`
9
+ --
10
+
11
+ DROP TABLE IF EXISTS entries;
12
+ CREATE TABLE entries (
13
+ id int(11) NOT NULL auto_increment,
14
+ image varchar(200) default NULL,
15
+ file varchar(200) NOT NULL,
16
+ PRIMARY KEY (id)
17
+ ) TYPE=MyISAM;
18
+
19
+ DROP TABLE IF EXISTS movies;
20
+ CREATE TABLE movies (
21
+ id int(11) NOT NULL auto_increment,
22
+ movie varchar(200) default NULL,
23
+ PRIMARY KEY (id)
24
+ ) TYPE=MyISAM;
25
+
@@ -0,0 +1,10 @@
1
+ ActiveRecord::Schema.define do
2
+ create_table :entries, :force => true do |t|
3
+ t.column :image, :string, :null => true
4
+ t.column :file, :string, :null => false
5
+ end
6
+
7
+ create_table :movies, :force => true do |t|
8
+ t.column :movie, :string
9
+ end
10
+ end
@@ -0,0 +1,380 @@
1
+ require File.dirname(__FILE__) + '/abstract_unit'
2
+ require 'RMagick'
3
+ require File.dirname(__FILE__) + '/fixtures/entry'
4
+
5
+
6
+ class AbstractRMagickTest < Test::Unit::TestCase
7
+ def teardown
8
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/entry/"
9
+ end
10
+
11
+ def test_truth
12
+ assert true
13
+ end
14
+
15
+ private
16
+
17
+ def read_image(path)
18
+ Magick::Image::read(path).first
19
+ end
20
+
21
+ def assert_max_image_size(img, s)
22
+ assert img.columns <= s, "img has #{img.columns} columns, expected: #{s}"
23
+ assert img.rows <= s, "img has #{img.rows} rows, expected: #{s}"
24
+ assert_equal s, [img.columns, img.rows].max
25
+ end
26
+ end
27
+
28
+ class RMagickSimpleTest < AbstractRMagickTest
29
+ def setup
30
+ Entry.file_column :image, :magick => { :geometry => "100x100" }
31
+ end
32
+
33
+ def test_simple_resize_without_save
34
+ e = Entry.new
35
+ e.image = upload(f("kerb.jpg"))
36
+
37
+ img = read_image(e.image)
38
+ assert_max_image_size img, 100
39
+ end
40
+
41
+ def test_simple_resize_with_save
42
+ e = Entry.new
43
+ e.image = upload(f("kerb.jpg"))
44
+ assert e.save
45
+ e.reload
46
+
47
+ img = read_image(e.image)
48
+ assert_max_image_size img, 100
49
+ end
50
+
51
+ def test_resize_on_saved_image
52
+ Entry.file_column :image, :magick => { :geometry => "100x100" }
53
+
54
+ e = Entry.new
55
+ e.image = upload(f("skanthak.png"))
56
+ assert e.save
57
+ e.reload
58
+ old_path = e.image
59
+
60
+ e.image = upload(f("kerb.jpg"))
61
+ assert e.save
62
+ assert "kerb.jpg", File.basename(e.image)
63
+ assert !File.exists?(old_path), "old image '#{old_path}' still exists"
64
+
65
+ img = read_image(e.image)
66
+ assert_max_image_size img, 100
67
+ end
68
+
69
+ def test_invalid_image
70
+ e = Entry.new
71
+ assert_nothing_raised { e.image = upload(f("invalid-image.jpg")) }
72
+ assert !e.valid?
73
+ end
74
+
75
+ def test_serializable
76
+ e = Entry.new
77
+ e.image = upload(f("skanthak.png"))
78
+ assert_nothing_raised {
79
+ flash = Marshal.dump(e)
80
+ e = Marshal.load(flash)
81
+ }
82
+ assert File.exists?(e.image)
83
+ end
84
+
85
+ def test_imagemagick_still_usable
86
+ e = Entry.new
87
+ assert_nothing_raised {
88
+ img = e.load_image_with_rmagick(file_path("skanthak.png"))
89
+ assert img.kind_of?(Magick::Image)
90
+ }
91
+ end
92
+ end
93
+
94
+ class RMagickRequiresImageTest < AbstractRMagickTest
95
+ def setup
96
+ Entry.file_column :image, :magick => {
97
+ :size => "100x100>",
98
+ :image_required => false,
99
+ :versions => {
100
+ :thumb => "80x80>",
101
+ :large => {:size => "200x200>", :lazy => true}
102
+ }
103
+ }
104
+ end
105
+
106
+ def test_image_required_with_image
107
+ e = Entry.new(:image => upload(f("skanthak.png")))
108
+ assert_max_image_size read_image(e.image), 100
109
+ assert e.valid?
110
+ end
111
+
112
+ def test_image_required_with_invalid_image
113
+ e = Entry.new(:image => upload(f("invalid-image.jpg")))
114
+ assert e.valid?, "did not ignore invalid image"
115
+ assert FileUtils.identical?(e.image, f("invalid-image.jpg")), "uploaded file has not been left alone"
116
+ end
117
+
118
+ def test_versions_with_invalid_image
119
+ e = Entry.new(:image => upload(f("invalid-image.jpg")))
120
+ assert e.valid?
121
+
122
+ image_state = e.send(:image_state)
123
+ assert_nil image_state.create_magick_version_if_needed(:thumb)
124
+ assert_nil image_state.create_magick_version_if_needed(:large)
125
+ assert_nil image_state.create_magick_version_if_needed("300x300>")
126
+ end
127
+ end
128
+
129
+ class RMagickCustomAttributesTest < AbstractRMagickTest
130
+ def assert_image_property(img, property, value, text = nil)
131
+ assert File.exists?(img), "the image does not exist"
132
+ assert_equal value, read_image(img).send(property), text
133
+ end
134
+
135
+ def test_simple_attributes
136
+ Entry.file_column :image, :magick => { :attributes => { :quality => 20 } }
137
+ e = Entry.new("image" => upload(f("kerb.jpg")))
138
+ assert_image_property e.image, :quality, 20, "the quality was not set"
139
+ end
140
+
141
+ def test_version_attributes
142
+ Entry.file_column :image, :magick => {
143
+ :versions => {
144
+ :thumb => { :attributes => { :quality => 20 } }
145
+ }
146
+ }
147
+ e = Entry.new("image" => upload(f("kerb.jpg")))
148
+ assert_image_property e.image("thumb"), :quality, 20, "the quality was not set"
149
+ end
150
+
151
+ def test_lazy_attributes
152
+ Entry.file_column :image, :magick => {
153
+ :versions => {
154
+ :thumb => { :attributes => { :quality => 20 }, :lazy => true }
155
+ }
156
+ }
157
+ e = Entry.new("image" => upload(f("kerb.jpg")))
158
+ e.send(:image_state).create_magick_version_if_needed(:thumb)
159
+ assert_image_property e.image("thumb"), :quality, 20, "the quality was not set"
160
+ end
161
+ end
162
+
163
+ class RMagickVersionsTest < AbstractRMagickTest
164
+ def setup
165
+ Entry.file_column :image, :magick => {:geometry => "200x200",
166
+ :versions => {
167
+ :thumb => "50x50",
168
+ :medium => {:geometry => "100x100", :name => "100_100"},
169
+ :large => {:geometry => "150x150", :lazy => true}
170
+ }
171
+ }
172
+ end
173
+
174
+
175
+ def test_should_create_thumb
176
+ e = Entry.new("image" => upload(f("skanthak.png")))
177
+
178
+ assert File.exists?(e.image("thumb")), "thumb-nail not created"
179
+
180
+ assert_max_image_size read_image(e.image("thumb")), 50
181
+ end
182
+
183
+ def test_version_name_can_be_different_from_key
184
+ e = Entry.new("image" => upload(f("skanthak.png")))
185
+
186
+ assert File.exists?(e.image("100_100"))
187
+ assert !File.exists?(e.image("medium"))
188
+ end
189
+
190
+ def test_should_not_create_lazy_versions
191
+ e = Entry.new("image" => upload(f("skanthak.png")))
192
+ assert !File.exists?(e.image("large")), "lazy versions should not be created unless needed"
193
+ end
194
+
195
+ def test_should_create_lazy_version_on_demand
196
+ e = Entry.new("image" => upload(f("skanthak.png")))
197
+
198
+ e.send(:image_state).create_magick_version_if_needed(:large)
199
+
200
+ assert File.exists?(e.image("large")), "lazy version should be created on demand"
201
+
202
+ assert_max_image_size read_image(e.image("large")), 150
203
+ end
204
+
205
+ def test_generated_name_should_not_change
206
+ e = Entry.new("image" => upload(f("skanthak.png")))
207
+
208
+ name1 = e.send(:image_state).create_magick_version_if_needed("50x50")
209
+ name2 = e.send(:image_state).create_magick_version_if_needed("50x50")
210
+ name3 = e.send(:image_state).create_magick_version_if_needed(:geometry => "50x50")
211
+ assert_equal name1, name2, "hash value has changed"
212
+ assert_equal name1, name3, "hash value has changed"
213
+ end
214
+
215
+ def test_should_create_version_with_string
216
+ e = Entry.new("image" => upload(f("skanthak.png")))
217
+
218
+ name = e.send(:image_state).create_magick_version_if_needed("32x32")
219
+
220
+ assert File.exists?(e.image(name))
221
+
222
+ assert_max_image_size read_image(e.image(name)), 32
223
+ end
224
+
225
+ def test_should_create_safe_auto_id
226
+ e = Entry.new("image" => upload(f("skanthak.png")))
227
+
228
+ name = e.send(:image_state).create_magick_version_if_needed("32x32")
229
+
230
+ assert_match /^[a-zA-Z0-9]+$/, name
231
+ end
232
+ end
233
+
234
+ class RMagickCroppingTest < AbstractRMagickTest
235
+ def setup
236
+ Entry.file_column :image, :magick => {:geometry => "200x200",
237
+ :versions => {
238
+ :thumb => {:crop => "1:1", :geometry => "50x50"}
239
+ }
240
+ }
241
+ end
242
+
243
+ def test_should_crop_image_on_upload
244
+ e = Entry.new("image" => upload(f("skanthak.png")))
245
+
246
+ img = read_image(e.image("thumb"))
247
+
248
+ assert_equal 50, img.rows
249
+ assert_equal 50, img.columns
250
+ end
251
+
252
+ end
253
+
254
+ class UrlForImageColumnTest < AbstractRMagickTest
255
+ include FileColumnHelper
256
+
257
+ def setup
258
+ Entry.file_column :image, :magick => {
259
+ :versions => {:thumb => "50x50"}
260
+ }
261
+ @request = RequestMock.new
262
+ end
263
+
264
+ def test_should_use_version_on_symbol_option
265
+ e = Entry.new(:image => upload(f("skanthak.png")))
266
+
267
+ url = url_for_image_column(e, "image", :thumb)
268
+ assert_match %r{^/entry/image/tmp/.+/thumb/skanthak.png$}, url
269
+ end
270
+
271
+ def test_should_use_string_as_size
272
+ e = Entry.new(:image => upload(f("skanthak.png")))
273
+
274
+ url = url_for_image_column(e, "image", "50x50")
275
+
276
+ assert_match %r{^/entry/image/tmp/.+/.+/skanthak.png$}, url
277
+
278
+ url =~ /\/([^\/]+)\/skanthak.png$/
279
+ dirname = $1
280
+
281
+ assert_max_image_size read_image(e.image(dirname)), 50
282
+ end
283
+
284
+ def test_should_accept_version_hash
285
+ e = Entry.new(:image => upload(f("skanthak.png")))
286
+
287
+ url = url_for_image_column(e, "image", :size => "50x50", :crop => "1:1", :name => "small")
288
+
289
+ assert_match %r{^/entry/image/tmp/.+/small/skanthak.png$}, url
290
+
291
+ img = read_image(e.image("small"))
292
+ assert_equal 50, img.rows
293
+ assert_equal 50, img.columns
294
+ end
295
+ end
296
+
297
+ class RMagickPermissionsTest < AbstractRMagickTest
298
+ def setup
299
+ Entry.file_column :image, :magick => {:geometry => "200x200",
300
+ :versions => {
301
+ :thumb => {:crop => "1:1", :geometry => "50x50"}
302
+ }
303
+ }, :permissions => 0616
304
+ end
305
+
306
+ def check_permissions(e)
307
+ assert_equal 0616, (File.stat(e.image).mode & 0777)
308
+ assert_equal 0616, (File.stat(e.image("thumb")).mode & 0777)
309
+ end
310
+
311
+ def test_permissions_with_rmagick
312
+ e = Entry.new(:image => upload(f("skanthak.png")))
313
+
314
+ check_permissions e
315
+
316
+ assert e.save
317
+
318
+ check_permissions e
319
+ end
320
+ end
321
+
322
+ class Entry
323
+ def transform_grey(img)
324
+ img.quantize(256, Magick::GRAYColorspace)
325
+ end
326
+ end
327
+
328
+ class RMagickTransformationTest < AbstractRMagickTest
329
+ def assert_transformed(image)
330
+ assert File.exists?(image), "the image does not exist"
331
+ assert 256 > read_image(image).number_colors, "the number of colors was not changed"
332
+ end
333
+
334
+ def test_simple_transformation
335
+ Entry.file_column :image, :magick => { :transformation => Proc.new { |image| image.quantize(256, Magick::GRAYColorspace) } }
336
+ e = Entry.new("image" => upload(f("skanthak.png")))
337
+ assert_transformed(e.image)
338
+ end
339
+
340
+ def test_simple_version_transformation
341
+ Entry.file_column :image, :magick => {
342
+ :versions => { :thumb => Proc.new { |image| image.quantize(256, Magick::GRAYColorspace) } }
343
+ }
344
+ e = Entry.new("image" => upload(f("skanthak.png")))
345
+ assert_transformed(e.image("thumb"))
346
+ end
347
+
348
+ def test_complex_version_transformation
349
+ Entry.file_column :image, :magick => {
350
+ :versions => {
351
+ :thumb => { :transformation => Proc.new { |image| image.quantize(256, Magick::GRAYColorspace) } }
352
+ }
353
+ }
354
+ e = Entry.new("image" => upload(f("skanthak.png")))
355
+ assert_transformed(e.image("thumb"))
356
+ end
357
+
358
+ def test_lazy_transformation
359
+ Entry.file_column :image, :magick => {
360
+ :versions => {
361
+ :thumb => { :transformation => Proc.new { |image| image.quantize(256, Magick::GRAYColorspace) }, :lazy => true }
362
+ }
363
+ }
364
+ e = Entry.new("image" => upload(f("skanthak.png")))
365
+ e.send(:image_state).create_magick_version_if_needed(:thumb)
366
+ assert_transformed(e.image("thumb"))
367
+ end
368
+
369
+ def test_simple_callback_transformation
370
+ Entry.file_column :image, :magick => :transform_grey
371
+ e = Entry.new(:image => upload(f("skanthak.png")))
372
+ assert_transformed(e.image)
373
+ end
374
+
375
+ def test_complex_callback_transformation
376
+ Entry.file_column :image, :magick => { :transformation => :transform_grey }
377
+ e = Entry.new(:image => upload(f("skanthak.png")))
378
+ assert_transformed(e.image)
379
+ end
380
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/abstract_unit'
2
+ require File.dirname(__FILE__) + '/fixtures/entry'
3
+
4
+ class RMagickViewOnlyTest < Test::Unit::TestCase
5
+ include FileColumnHelper
6
+
7
+ def setup
8
+ Entry.file_column :image
9
+ @request = RequestMock.new
10
+ end
11
+
12
+ def teardown
13
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/entry/"
14
+ end
15
+
16
+ def test_url_for_image_column_without_model_versions
17
+ e = Entry.new(:image => upload(f("skanthak.png")))
18
+
19
+ assert_nothing_raised { url_for_image_column e, "image", "50x50" }
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ require 'rake'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'ar_query'
5
+ s.version = '0.0.1'
6
+ s.date = '2009-02-19'
7
+ s.author = 'Francis Hwang'
8
+ s.description = 'A utility class for building options for ActiveRecord.find.'
9
+ s.summary = 'A utility class for building options for ActiveRecord.find.'
10
+ s.email = 'sera@fhwang.net'
11
+ s.homepage = 'http://github.com/fhwang/ar_query'
12
+ s.files = FileList[
13
+ 'lib/*.rb', 'MIT-LICENSE', 'README', '*.rb', 'spec/*.rb',
14
+ 'tasks/*.rake'
15
+ ].to_a
16
+ end
@@ -0,0 +1,39 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <title>admin_assistant: API{% if page.title != '' %}: {{ page.title }}{% endif% %}</title>
5
+ <link rel="stylesheet" href="../css/main.css" type="text/css" media="screen">
6
+ </head>
7
+
8
+ <body>
9
+ <div id="page_header">
10
+ <h1><a href="../">admin_assistant</a></h1>
11
+ <div class="nav">
12
+ <a href="../screenshots.html">Screenshots</a> |
13
+ <a href="../quick_start.html">Quick start</a> |
14
+ <a href="../tutorial.html">Tutorial</a> |
15
+ <a href="../api/">API&nbsp;reference</a> |
16
+ <a href="../community.html">Community</a> |
17
+ <a href="../design_principles.html">Design&nbsp;principles</a> |
18
+ <a href="http://groups.google.com/group/admin_assistant">Mailing&nbsp;list</a> |
19
+ <a href="http://github.com/fhwang/admin_assistant">Github&nbsp;page</a>
20
+ </div>
21
+ </div>
22
+ <div id="body">
23
+ <h2>
24
+ <a href="../api/">API</a>
25
+ {% if page.title != '' %}: {{page.title}}{% endif %}
26
+ </h2>
27
+ <div class="subnav">
28
+ <a href="../api/core.html">Core</a> |
29
+ <a href="../api/destroy.html">Destroy</a> |
30
+ <a href="../api/form.html">Form</a> |
31
+ <a href="../api/idx.html">Index</a> |
32
+ <a href="../api/search.html">Search</a> |
33
+ <a href="../api/show.html">Show</a>
34
+ </div>
35
+
36
+ {{ content }}
37
+ </div>
38
+ </body>
39
+ </html>
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <title>admin_assistant{% if page.title %}: {{ page.title }}{% endif% %}</title>
5
+ <link rel="stylesheet" href="./css/main.css" type="text/css" media="screen">
6
+
7
+ <script type="text/javascript" src="./js/prototype.js"></script>
8
+ <script type="text/javascript" src="./js/scriptaculous.js?load=effects,builder"></script>
9
+ <script type="text/javascript" src="./js/lightbox.js"></script>
10
+ <link rel="stylesheet" href="./css/lightbox.css" type="text/css" media="screen" />
11
+ </head>
12
+
13
+ <body>
14
+ <div id="page_header">
15
+ <h1><a href="./">admin_assistant</a></h1>
16
+ <div class="nav">
17
+ <a href="./screenshots.html">Screenshots</a> |
18
+ <a href="./quick_start.html">Quick start</a> |
19
+ <a href="./tutorial.html">Tutorial</a> |
20
+ <a href="./api/">API&nbsp;reference</a> |
21
+ <a href="./community.html">Community</a> |
22
+ <a href="./design_principles.html">Design&nbsp;principles</a> |
23
+ <a href="http://groups.google.com/group/admin_assistant">Mailing&nbsp;list</a> |
24
+ <a href="http://github.com/fhwang/admin_assistant">Github&nbsp;page</a>
25
+ </div>
26
+ </div>
27
+ <div id="body">
28
+ {% if page.title != '' %}
29
+ <h2>{{ page.title }}</h2>
30
+ {% endif %}
31
+ {{ content }}
32
+ </div>
33
+ </body>
34
+ </html>
@@ -0,0 +1,106 @@
1
+ ---
2
+ layout: api
3
+ title: Core
4
+ ---
5
+
6
+ ### Includes
7
+
8
+ admin\_assistant comes with its own Javascript and CSS. Call `admin_assistant_includes` in your admin layout to use them:
9
+
10
+ <html>
11
+ <head>
12
+ <%= admin_assistant_includes %>
13
+ </head>
14
+ ...
15
+ </html>
16
+
17
+ You also have the option of making admin\_assistant look very similar to activescaffold CSS-wise, which might come in handy if you're in the process of transition from one to the other:
18
+
19
+ <%= admin_assistant_includes :theme => 'activescaffold' %>
20
+
21
+ Submissions of other themes are welcome.
22
+
23
+ ### Configuring the core builder object
24
+
25
+ <a name="builder_actions"></a>
26
+ #### actions
27
+
28
+ admin\_assistant uses the old-fashioned seven Rails actions: index, show, new/create, edit/update, and destroy. By default, you get all of them except destroy. To add destroy, you can simply append it to the `actions` method:
29
+
30
+ admin_assistant_for User do |aa|
31
+ aa.actions << :destroy
32
+ end
33
+
34
+ You can also send `actions` a list of actions and it will only allow those:
35
+
36
+ # I only want to create or index images, not edit, show or destroy
37
+ admin_assistant_for Image do |aa|
38
+ aa.actions :create, :index
39
+ end
40
+
41
+ ### model\_class\_name
42
+
43
+ Use this to override what the model is named in the interface, in links like "New blog post" or "50 blog posts found". The string passed in should be lowercase.
44
+
45
+ aa.model_class_name = 'post'
46
+
47
+
48
+ ### Column config options
49
+
50
+ #### boolean\_labels
51
+
52
+ aa[:textile].boolean_labels = %w(Yes No)
53
+
54
+ For a boolean fields, will change how the values get displayed, instead of simply "true" and "false".
55
+
56
+ #### label
57
+
58
+ aa[:user].label = 'Author'
59
+
60
+
61
+ Overrides the default label for that column in index, search, and form views.
62
+
63
+ #### polymorphic\_types
64
+
65
+ aa[:bookmarkable].polymorphic_types = [BlogPost, Comment, Product, User]
66
+
67
+ If a column is a polymorphic association, admin\_assistant will offer specific widgets for searching and editing this column. With `polymorphic_types` you can tell it what possible types the association can be set to.
68
+
69
+ #### strftime\_format
70
+
71
+ aa[:published_at].strftime_format = "%b %d, %Y %H:%M:%S"
72
+
73
+ If the column is a date or time, this will use the given strftime format for displaying the column in index and shows views.
74
+
75
+ ### Helper methods
76
+
77
+ #### \[column\]\_value
78
+
79
+ Determines what value is passed to form inputs, index views, etc, for the individual column. This is most useful for a virtual column.
80
+
81
+
82
+
83
+ ### Model methods
84
+
85
+ #### name\_for\_admin\_assistant
86
+
87
+ When dealing with associations, admin\_assistant needs a convenient way to display a given record. By default, it will look for a method with the name `name`, `title`, `login`, or `username`. If you'd like to provide custom functionality across all admin\_assistant controllers, define the method `name_for_admin_assistant` on the model.
88
+
89
+ For example, let's say you have a ProductCategory class with a field `category_name`. With the code below, any time a product category is referred to through an association, admin\_assistant will display the `category_name`, in index views, form selects, etc.
90
+
91
+ class ProductCategory < ActiveRecord::Base
92
+ def name_for_admin_assistant
93
+ self.category_name
94
+ end
95
+ end
96
+
97
+ #### sort\_value\_for\_admin\_assistant
98
+
99
+ When showing associated records, admin\_assistant will sort by the method `sort_value_for_admin_assistant` if it's defined on the model. This comes in handy if you want to specify sorting on form drop-downs for belongs-to associations.
100
+
101
+ class Appointment < ActiveRecord::Base
102
+ def sort_value_for_admin_assistant
103
+ self.time
104
+ end
105
+ end
106
+
@@ -0,0 +1,25 @@
1
+ ---
2
+ layout: api
3
+ title: Destroy
4
+ ---
5
+
6
+ Note that the `destroy` action is turned off by default. To turn it on, use the core [actions](./core.html#builder_actions) method.
7
+
8
+ By default, `destroy` simply retrieves the model instance, and calls `ActiveRecord::Base#destroy`. If you'd like to define your own custom deletion semantics, you can set a block that will be called instead of the model's built-in `destroy` method:
9
+
10
+ admin_assistant_for Product do |a|
11
+ a.actions << :destroy
12
+ a.destroy do |product|
13
+ product.update_attribute :deleted, true
14
+ product.notify_admins_of_deletion
15
+ end
16
+ end
17
+
18
+ You may also find plugins such as [as\_paranoid] or [acts\_as\_paranoid] useful here. If you're using a plugin such as that, which changes the behavior of `ActiveRecord::Base#destroy`, it means that you will probably not need to customize admin\_assistant in this way.
19
+
20
+
21
+
22
+
23
+ [acts_as_paranoid]: http://ar-paranoid.rubyforge.org/
24
+ [as_paranoid]: http://github.com/semanticart/is_paranoid/tree/master
25
+