admin_assistant 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -5,54 +5,43 @@ class AdminAssistant
5
5
  end
6
6
 
7
7
  def add_to_query_condition(ar_query_condition, search)
8
- table_name = search.model_class.table_name
9
- if blank?(search)
10
- ar_query_condition.add_condition do |sub_cond|
11
- sub_cond.boolean_join = :or
12
- sub_cond.sqls << "#{table_name}.#{name} is null"
13
- sub_cond.sqls << "#{table_name}.#{name} = ''"
14
- end
8
+ ConditionUpdate.new(ar_query_condition, search, name, field_type).run
9
+ end
10
+
11
+ def attributes_for_search_object(search_params, compare_to_range)
12
+ attrs = {}
13
+ if compare_to_range
14
+ attrs[name] = range_attribute_for_search_object search_params[name]
15
15
  else
16
- value_for_query = search.send(@ar_column.name)
17
- unless value_for_query.nil?
18
- comp = comparator(search)
19
- unless %w(< <= = >= >).include?(comp)
20
- comp = nil
21
- end
22
- if comp
23
- ar_query_condition.sqls << "#{table_name}.#{name} #{comp} ?"
24
- ar_query_condition.bind_vars << value_for_query
25
- else
16
+ attrs[name] = if field_type == :datetime
17
+ datetime_attributes_for_search_object search_params, name
18
+ else
19
+ terms = search_params[@ar_column.name]
20
+ unless terms.blank?
26
21
  case field_type
27
- when :boolean, :integer
28
- ar_query_condition.sqls << "#{table_name}.#{name} = ?"
29
- ar_query_condition.bind_vars << value_for_query
22
+ when :boolean
23
+ terms.blank? ? nil : (terms == 'true')
30
24
  else
31
- ar_query_condition.sqls << "LOWER(#{table_name}.#{name}) like LOWER(?)"
32
- ar_query_condition.bind_vars << "%#{value_for_query}%"
25
+ terms
33
26
  end
34
27
  end
35
28
  end
36
29
  end
37
- end
38
-
39
- def attributes_for_search_object(search_params)
40
- terms = search_params[@ar_column.name]
41
- value = unless terms.blank?
42
- case field_type
43
- when :boolean
44
- terms.blank? ? nil : (terms == 'true')
45
- else
46
- terms
47
- end
48
- end
49
- {name => value}
30
+ attrs
50
31
  end
51
32
 
52
33
  def contains?(column_name)
53
34
  column_name.to_s == @ar_column.name
54
35
  end
55
36
 
37
+ def datetime_attributes_for_search_object(search_params, prefix)
38
+ begin
39
+ Time.utc(
40
+ *(1..5).to_a.map { |i| search_params["#{prefix}(#{i}i)"].to_i }
41
+ )
42
+ rescue ArgumentError; end
43
+ end
44
+
56
45
  def field_type
57
46
  @ar_column.type
58
47
  end
@@ -61,6 +50,102 @@ class AdminAssistant
61
50
  @ar_column.name
62
51
  end
63
52
 
53
+ def range_attribute_for_search_object(column_params)
54
+ range = {}
55
+ if column_params
56
+ %w(gt lt).each do |comparator|
57
+ if column_params.keys.any? { |k| k.to_s =~ /^#{comparator}/ }
58
+ range[comparator.to_sym] = if field_type == :datetime
59
+ datetime_attributes_for_search_object(column_params, comparator)
60
+ else
61
+ column_params[comparator] unless column_params[comparator].blank?
62
+ end
63
+ end
64
+ end
65
+ end
66
+ range
67
+ end
68
+
69
+ class ConditionUpdate
70
+ def initialize(ar_query_condition, search, name, field_type)
71
+ @ar_query_condition, @search, @name, @field_type =
72
+ ar_query_condition, search, name, field_type
73
+ end
74
+
75
+ def add_blank_condition
76
+ @ar_query_condition.add_condition do |sub_cond|
77
+ sub_cond.boolean_join = :or
78
+ sub_cond.sqls << "#{table_name}.#{@name} is null"
79
+ sub_cond.sqls << "#{table_name}.#{@name} = ''"
80
+ end
81
+ end
82
+
83
+ def add_case_insensitive_string_comparison
84
+ @ar_query_condition.sqls <<
85
+ "LOWER(#{table_name}.#{@name}) like LOWER(?)"
86
+ @ar_query_condition.bind_vars << "%#{value_for_query}%"
87
+ end
88
+
89
+ def add_comparative_condition
90
+ @ar_query_condition.sqls << "#{table_name}.#{@name} #{comparator} ?"
91
+ @ar_query_condition.bind_vars << value_for_query
92
+ end
93
+
94
+ def add_equality_condition
95
+ @ar_query_condition.sqls << "#{table_name}.#{@name} = ?"
96
+ @ar_query_condition.bind_vars << value_for_query
97
+ end
98
+
99
+ def add_range_condition
100
+ if lower_limit = @search.send(@name)[:gt]
101
+ @ar_query_condition.sqls << "#{table_name}.#{@name} > ?"
102
+ @ar_query_condition.bind_vars << lower_limit
103
+ end
104
+ if upper_limit = @search.send(@name)[:lt]
105
+ @ar_query_condition.sqls << "#{table_name}.#{@name} < ?"
106
+ @ar_query_condition.bind_vars << upper_limit
107
+ end
108
+ end
109
+
110
+ def compare_to_range?
111
+ @search.compare_to_range? @name
112
+ end
113
+
114
+ def comparator
115
+ @search.comparator @name
116
+ end
117
+
118
+ def column_is_a_string_type?
119
+ ![:boolean, :integer].include?(@field_type)
120
+ end
121
+
122
+ def run
123
+ if @search.blank?(@name)
124
+ add_blank_condition
125
+ else
126
+ unless value_for_query.nil?
127
+ if comparator
128
+ add_comparative_condition
129
+ elsif compare_to_range?
130
+ add_range_condition
131
+ elsif column_is_a_string_type?
132
+ add_case_insensitive_string_comparison
133
+ else
134
+ add_equality_condition
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ def table_name
141
+ @search.model_class.table_name
142
+ end
143
+
144
+ def value_for_query
145
+ @search.send @name
146
+ end
147
+ end
148
+
64
149
  class FormView < AdminAssistant::Column::View
65
150
  include AdminAssistant::Column::FormViewMethods
66
151
 
@@ -133,17 +218,20 @@ class AdminAssistant
133
218
  end
134
219
 
135
220
  def select_html(form)
136
- # for now only used for boolean fields
137
- value = form.object.send name
138
- selected = if value
139
- '1'
140
- elsif value == false
141
- '0'
221
+ if @select_choices
222
+ form.select name, @select_choices, @select_options
223
+ else
224
+ value = form.object.send name
225
+ selected = if value
226
+ '1'
227
+ elsif value == false
228
+ '0'
229
+ end
230
+ form.select(
231
+ name, [[true, '1'], [false, '0']],
232
+ @select_options.merge(:selected => selected)
233
+ )
142
234
  end
143
- form.select(
144
- name, [[true, '1'], [false, '0']],
145
- @select_options.merge(:selected => selected)
146
- )
147
235
  end
148
236
 
149
237
  def text_area_html(form)
@@ -24,9 +24,22 @@ class AdminAssistant
24
24
 
25
25
  def options_for_select
26
26
  records = @associated_class.find(:all)
27
- if default_name_method
28
- records.sort_by { |model| model.send(default_name_method) }.
29
- map { |model| [model.send(default_name_method), model.id] }
27
+ name_method = default_name_method
28
+ if name_method.nil? and
29
+ records.first.respond_to?(:name_for_admin_assistant)
30
+ name_method = :name_for_admin_assistant
31
+ end
32
+ sort_value_method = nil
33
+ if records.first.respond_to?(:sort_value_for_admin_assistant)
34
+ sort_value_method = :sort_value_for_admin_assistant
35
+ else
36
+ sort_value_method = name_method
37
+ end
38
+ if sort_value_method
39
+ records = records.sort_by { |model| model.send(sort_value_method) }
40
+ end
41
+ if name_method
42
+ records.map { |model| [model.send(name_method), model.id] }
30
43
  else
31
44
  records.map &:id
32
45
  end
@@ -46,7 +46,7 @@ class AdminAssistant
46
46
  @belongs_to_assoc.association_foreign_key
47
47
  end
48
48
 
49
- def attributes_for_search_object(search_params)
49
+ def attributes_for_search_object(search_params, compare_to_range)
50
50
  atts = {}
51
51
  if @match_text_fields_in_search
52
52
  atts[name.to_sym] = search_params[name]
@@ -127,21 +127,29 @@ class AdminAssistant
127
127
 
128
128
  def default_html(form)
129
129
  if associated_class.count > 15
130
- @action_view.send(
131
- :render,
132
- :file => AdminAssistant.template_file('_restricted_autocompleter'),
133
- :use_full_path => false,
134
- :locals => {
135
- :form => form, :column => @column,
136
- :select_options => @select_options
137
- }
138
- )
130
+ render_autocompleter form
139
131
  else
140
132
  form.select(
141
133
  association_foreign_key, options_for_select, @select_options
142
134
  )
143
135
  end
144
136
  end
137
+
138
+ def errors(record)
139
+ record.errors.on @column.association_foreign_key
140
+ end
141
+
142
+ def render_autocompleter(form)
143
+ @action_view.send(
144
+ :render,
145
+ :file => AdminAssistant.template_file('_restricted_autocompleter'),
146
+ :use_full_path => false,
147
+ :locals => {
148
+ :form => form, :column => @column,
149
+ :select_options => @select_options
150
+ }
151
+ )
152
+ end
145
153
  end
146
154
 
147
155
  class IndexView < View
@@ -59,7 +59,7 @@ class AdminAssistant
59
59
  match = $1.to_sym
60
60
  end
61
61
  setting = @settingses.detect { |setting|
62
- setting.column_config_args.keys.include?(match)
62
+ setting.column_config_fields.keys.include?(match)
63
63
  }
64
64
  if setting
65
65
  setting[@column_name].send(meth, *args)
@@ -71,29 +71,33 @@ class AdminAssistant
71
71
  end
72
72
 
73
73
  class ColumnConfig
74
- def initialize(fields_config)
75
- @fields_config = fields_config
74
+ def initialize(fields)
75
+ @fields = {}
76
+ fields.each do |fn, value|
77
+ @fields[fn] = value.is_a?(Array) ? value : [value, nil]
78
+ end
76
79
  @values = {}
77
80
  end
78
81
 
79
82
  def method_missing_matching_fields_config(meth, block, *args)
80
- field_type = @fields_config[meth]
83
+ field_type = @fields[meth].first
81
84
  if field_type == :accessor
82
- @values[meth]
85
+ default_val_or_proc = @fields[meth].last
86
+ if default_val_or_proc.respond_to?(:call)
87
+ default_val_or_proc.call @values[meth]
88
+ else
89
+ @values[meth].nil? ? default_val_or_proc : @values[meth]
90
+ end
83
91
  elsif field_type == :boolean
84
92
  @values[meth] = true
85
93
  elsif field_type == :block
86
- if block
87
- @values[meth] = block
88
- else
89
- @values[meth]
90
- end
94
+ block ? (@values[meth] = block) : @values[meth]
91
95
  end
92
96
  end
93
97
 
94
98
  def find_field_from_method(meth, target_field_type, &block)
95
- @fields_config.detect { |fn, ft|
96
- meth.to_s =~ block.call(fn) && ft == target_field_type
99
+ @fields.detect { |fn, tuple|
100
+ meth.to_s =~ block.call(fn) && tuple.first == target_field_type
97
101
  }.first
98
102
  end
99
103
 
@@ -103,7 +107,7 @@ class AdminAssistant
103
107
  end
104
108
 
105
109
  def method_missing(meth, *args, &block)
106
- if @fields_config[meth]
110
+ if @fields[meth]
107
111
  return method_missing_matching_fields_config(meth, block, *args)
108
112
  elsif meth.to_s =~ /=$/
109
113
  result = method_missing_maybe_setter(meth, *args)
@@ -124,7 +128,7 @@ class AdminAssistant
124
128
  def initialize(admin_assistant)
125
129
  @admin_assistant = admin_assistant
126
130
  @column_configs = HashWithIndifferentAccess.new { |h, k|
127
- h[k] = ColumnConfig.new(column_config_args)
131
+ h[k] = ColumnConfig.new(column_config_fields)
128
132
  }
129
133
  end
130
134
 
@@ -142,27 +146,40 @@ class AdminAssistant
142
146
  @column_configs.values.map(&:polymorphic_types).flatten.compact
143
147
  end
144
148
 
145
- def column_config_args
149
+ def column_config_fields
146
150
  {:boolean_labels => :accessor, :label => :accessor,
147
- :polymorphic_types => :accessor}
151
+ :polymorphic_types => :accessor, :strftime_format => :accessor}
148
152
  end
149
153
  end
150
154
 
151
155
  class FormSettings < AbstractSettings
156
+ attr_writer :multi
152
157
  attr_reader :submit_buttons
153
158
 
154
159
  def initialize(admin_assistant)
155
160
  super
156
161
  @submit_buttons = []
162
+ @multi = false
157
163
  end
158
164
 
159
- def column_config_args
160
- {:clear_link => :accessor, :datetime_select_options => :accessor,
161
- :date_select_options => :accessor, :default => :block,
165
+ def column_config_fields
166
+ {:clear_link => :accessor,
167
+ :datetime_select_options => [:accessor, {}],
168
+ :date_select_options => [:accessor, {}], :default => :block,
162
169
  :description => :accessor, :exclude_blank => :boolean,
163
170
  :image_size => :accessor, :input => :accessor,
164
- :read_only => :boolean, :select_options => :accessor,
165
- :text_area_options => :accessor, :write_once => :boolean
171
+ :read_only => :boolean, :select_choices => :accessor,
172
+ :select_options => [
173
+ :accessor,
174
+ Proc.new { |v|
175
+ v ||= {}
176
+ unless v.has_key?(:include_blank)
177
+ v[:include_blank] = true
178
+ end
179
+ v
180
+ }
181
+ ],
182
+ :text_area_options => [:accessor, {}], :write_once => :boolean
166
183
  }
167
184
  end
168
185
 
@@ -185,6 +202,10 @@ class AdminAssistant
185
202
  def column_names
186
203
  @column_names || @admin_assistant.default_column_names
187
204
  end
205
+
206
+ def multi?
207
+ @multi
208
+ end
188
209
  end
189
210
 
190
211
  class IndexSettings < AbstractSettings
@@ -197,11 +218,16 @@ class AdminAssistant
197
218
  @search_fields = []
198
219
  @search_settings = SearchSettings.new @admin_assistant
199
220
  @sort_by = "#{admin_assistant.model_class.table_name}.id desc"
221
+ @per_page = 25
200
222
  end
201
223
 
202
- def column_config_args
203
- {:image_size => :accessor, :link_to_args => :block,
204
- :sort_by => :accessor}
224
+ def cache_total_entries(time_span = nil)
225
+ time_span ? (@cache_total_entries = time_span) : @cache_total_entries
226
+ end
227
+
228
+ def column_config_fields
229
+ {:ajax_toggle => :accessor, :image_size => :accessor,
230
+ :link_to_args => :block, :sort_by => :accessor}
205
231
  end
206
232
 
207
233
  def conditions(str = nil, &block)
@@ -226,6 +252,14 @@ class AdminAssistant
226
252
  end
227
253
  end
228
254
 
255
+ def per_page(*args)
256
+ if args.empty?
257
+ @per_page
258
+ else
259
+ @per_page = args.first
260
+ end
261
+ end
262
+
229
263
  def search(*columns)
230
264
  if block_given?
231
265
  yield @search_settings
@@ -249,17 +283,20 @@ class AdminAssistant
249
283
  end
250
284
 
251
285
  class SearchSettings < AbstractSettings
286
+ attr_accessor :include_params_in_form
252
287
  attr_reader :column_names
253
288
 
254
289
  def initialize(admin_assistant)
255
290
  super
256
291
  @column_names = []
257
292
  @default_search_includes = []
293
+ @include_params_in_form = false
258
294
  end
259
295
 
260
- def column_config_args
296
+ def column_config_fields
261
297
  {:blank_checkbox => :accessor, :comparators => :accessor,
262
- :conditions => :block, :field_type => :accessor,
298
+ :compare_to_range => :accessor, :conditions => :block,
299
+ :field_type => :accessor,
263
300
  :match_text_fields_for_association => :boolean}
264
301
  end
265
302
 
@@ -267,11 +304,11 @@ class AdminAssistant
267
304
  @column_names = c
268
305
  end
269
306
 
270
- def default_search_includes(*includes)
307
+ def default_search_matches_on(*includes)
271
308
  if includes.empty?
272
- @default_search_includes
309
+ @admin_assistant.default_search_matches_on
273
310
  else
274
- @default_search_includes = includes
311
+ @admin_assistant.default_search_matches_on = includes
275
312
  end
276
313
  end
277
314
  end
@@ -280,7 +317,7 @@ class AdminAssistant
280
317
  class ShowSettings < AbstractSettings
281
318
  attr_reader :model_class_name_block
282
319
 
283
- def column_config_args
320
+ def column_config_fields
284
321
  {}
285
322
  end
286
323