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
@@ -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