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
@@ -2,25 +2,21 @@ class AdminAssistant
2
2
  class DefaultSearchColumn < Column
3
3
  def initialize(model_class, opts)
4
4
  @model_class = model_class
5
- @fields_to_include = opts[:fields_to_include] || []
5
+ @fields_to_match = opts[:fields_to_match] || []
6
6
  end
7
7
 
8
8
  def add_to_query_condition(ar_query_condition, search)
9
9
  unless search.params.blank?
10
10
  ar_query_condition.ar_query.boolean_join = :and
11
11
  ar_query_condition.boolean_join = :or
12
- names_to_search = Model.new(@model_class).searchable_columns.map(
13
- &:name
14
- )
15
- names_to_search.concat @fields_to_include
16
- names_to_search.uniq.each do |field_name|
12
+ @fields_to_match.each do |field_name|
17
13
  ar_query_condition.sqls << "LOWER(#{field_name}) like LOWER(?)"
18
14
  ar_query_condition.bind_vars << "%#{search.params}%"
19
15
  end
20
16
  end
21
17
  end
22
18
 
23
- def attributes_for_search_object(search_params)
19
+ def attributes_for_search_object(search_params, compare_to_range)
24
20
  {}
25
21
  end
26
22
 
@@ -1,10 +1,5 @@
1
1
  class AdminAssistant
2
- class FormView
3
- def initialize(record, admin_assistant, action_view)
4
- @record, @admin_assistant, @action_view =
5
- record, admin_assistant, action_view
6
- end
7
-
2
+ module FormViewMethods
8
3
  def action
9
4
  if %w(new create).include?(controller.action_name)
10
5
  'create'
@@ -13,6 +8,21 @@ class AdminAssistant
13
8
  end
14
9
  end
15
10
 
11
+ def controller
12
+ @action_view.controller
13
+ end
14
+ end
15
+
16
+ class FormView
17
+ include FormViewMethods
18
+
19
+ attr_reader :record
20
+
21
+ def initialize(record, admin_assistant, action_view)
22
+ @record, @admin_assistant, @action_view =
23
+ record, admin_assistant, action_view
24
+ end
25
+
16
26
  def column_names
17
27
  if %w(new create).include?(@action_view.action_name)
18
28
  settings.columns_for_new
@@ -27,10 +37,6 @@ class AdminAssistant
27
37
  }
28
38
  end
29
39
 
30
- def controller
31
- @action_view.controller
32
- end
33
-
34
40
  def extra_submit_buttons
35
41
  settings.submit_buttons
36
42
  end
@@ -60,4 +66,102 @@ class AdminAssistant
60
66
  (@record.id ? "Edit" : "New") + " #{@admin_assistant.model_class_name}"
61
67
  end
62
68
  end
69
+
70
+ class MultiFormView
71
+ include FormViewMethods
72
+
73
+ def initialize(records, admin_assistant, action_view)
74
+ @records, @admin_assistant, @action_view =
75
+ records, admin_assistant, action_view
76
+ @sub_form_views = @records.map { |record|
77
+ AdminAssistant::FormView.new(record, @admin_assistant, @action_view)
78
+ }
79
+ end
80
+
81
+ def columns
82
+ @sub_form_views.first.columns
83
+ end
84
+
85
+ def extra_submit_buttons
86
+ @sub_form_views.first.extra_submit_buttons
87
+ end
88
+
89
+ def form_for_args
90
+ [
91
+ @records.first.class.name.underscore.to_sym,
92
+ @records,
93
+ {
94
+ :url => {:action => action},
95
+ :builder => AdminAssistant::MultiFormView::Builder,
96
+ :sub_form_views => @sub_form_views
97
+ }
98
+ ]
99
+ end
100
+
101
+ def submit_value
102
+ @sub_form_views.first.submit_value
103
+ end
104
+
105
+ def title
106
+ @sub_form_views.first.title
107
+ end
108
+
109
+ class Builder < ::ActionView::Helpers::FormBuilder
110
+ def initialize(object_name, object, template, options, proc)
111
+ super(object_name, object, template, options, proc)
112
+ @sub_form_views = options[:sub_form_views]
113
+ end
114
+
115
+ def each_sub_form
116
+ @object.each_with_index do |obj, i|
117
+ builder = SubFormBuilder.new(
118
+ @object_name, obj, @template, @options, @proc, i
119
+ )
120
+ yield builder, @sub_form_views[i]
121
+ end
122
+ end
123
+
124
+ class SubFormBuilder
125
+ attr_reader :object, :prefix
126
+
127
+ def initialize(object_name, object, template, options, proc, position)
128
+ @object_name, @object, @template, @options, @proc =
129
+ object_name, object, template, options, proc
130
+ @default_options = @options ? @options.slice(:index) : {}
131
+ @prefix = ('a'..'z').to_a[position]
132
+ end
133
+
134
+ def method_missing(meth, *args, &block)
135
+ if my_field_helpers.include?(meth.to_s)
136
+ method = args.shift
137
+ options = args.shift || {}
138
+ @template.send(
139
+ meth,
140
+ "#{@object_name}[#{@prefix}]",
141
+ method,
142
+ objectify_options(options)
143
+ )
144
+ else
145
+ super
146
+ end
147
+ end
148
+
149
+ def my_field_helpers
150
+ ::ActionView::Helpers::FormBuilder.field_helpers -
151
+ %w(label check_box radio_button fields_for) + ['datetime_select']
152
+ end
153
+
154
+ def objectify_options(options)
155
+ @default_options.merge(options.merge(:object => @object))
156
+ end
157
+
158
+ def select(method, choices, options = {}, html_options = {})
159
+ @template.select(
160
+ "#{@object_name}[#{@prefix}]", method, choices,
161
+ objectify_options(options), @default_options.merge(html_options)
162
+ )
163
+ end
164
+ end
165
+ end
166
+ end
63
167
  end
@@ -0,0 +1,56 @@
1
+ class AdminAssistant
2
+ class HasManyColumn < Column
3
+ def initialize(has_many_assoc, opts)
4
+ @has_many_assoc = has_many_assoc
5
+ @match_text_fields_in_search = opts[:match_text_fields_in_search]
6
+ end
7
+
8
+ def add_to_query_condition(ar_query_condition, search)
9
+ if @match_text_fields_in_search
10
+ if (value = search.send(name)) and !value.blank?
11
+ searchable_columns = Model.new(associated_class).searchable_columns
12
+ model_class = @has_many_assoc.active_record
13
+ sanitized_match_value = ActiveRecord::Base.sanitize("%#{value}%")
14
+ searchable_column_comparisons = searchable_columns.map { |column|
15
+ "LOWER(#{associated_class.table_name}.#{column.name}) like LOWER(#{sanitized_match_value})"
16
+ }
17
+ condition_sql = <<-CONDITION_SQL
18
+ #{model_class.table_name}.#{model_class.primary_key} in (select #{@has_many_assoc.primary_key_name} from #{associated_class.table_name} where #{searchable_column_comparisons.join(' or ')})
19
+ CONDITION_SQL
20
+ ar_query_condition.sqls << condition_sql
21
+ end
22
+ end
23
+ end
24
+
25
+ def associated_class
26
+ @has_many_assoc.klass
27
+ end
28
+
29
+ def attributes_for_search_object(search_params, compare_to_range)
30
+ {name.to_sym => search_params[name]}
31
+ end
32
+
33
+ def contains?(column_name)
34
+ column_name.to_s == name
35
+ end
36
+
37
+ def model_class
38
+ @has_many_assoc.active_record
39
+ end
40
+
41
+ def name
42
+ @has_many_assoc.name.to_s
43
+ end
44
+
45
+ class FormView < AdminAssistant::VirtualColumn::FormView
46
+ end
47
+
48
+ class SearchView < AdminAssistant::Column::View
49
+ include AdminAssistant::Column::SearchViewMethods
50
+
51
+ def html(form)
52
+ "<p><label>#{label}</label> <br/>#{form.text_field(name)}</p>"
53
+ end
54
+ end
55
+ end
56
+ end
@@ -2,80 +2,48 @@ require 'ar_query'
2
2
 
3
3
  class AdminAssistant
4
4
  class Index
5
- attr_reader :controller_methods
5
+ attr_reader :admin_assistant, :controller_methods, :url_params
6
6
 
7
7
  def initialize(admin_assistant, url_params = {}, controller_methods = {})
8
8
  @admin_assistant, @url_params, @controller_methods =
9
9
  admin_assistant, url_params, controller_methods
10
10
  end
11
11
 
12
- def belongs_to_sort_column
13
- @admin_assistant.accumulate_belongs_to_columns(column_names).detect { |c|
14
- c.name.to_s == sort
15
- }
12
+ def belongs_to_columns
13
+ @admin_assistant.accumulate_belongs_to_columns column_names
16
14
  end
17
15
 
18
16
  def column_names
19
- settings.column_names || model_class.columns.map(&:name)
17
+ if settings.column_names
18
+ settings.column_names
19
+ else
20
+ model_class.columns.map(&:name).reject { |n|
21
+ %w(created_at updated_at).include?(n)
22
+ }
23
+ end
20
24
  end
21
25
 
22
26
  def columns
23
27
  @admin_assistant.accumulate_columns column_names
24
28
  end
25
-
26
- def conditions_from_settings
27
- settings.conditions
28
- end
29
-
30
- def find_include
31
- fi = settings.include || []
32
- if by_assoc = belongs_to_sort_column
33
- fi << by_assoc.name
29
+
30
+ def hidden_fields_for_search_form
31
+ if @admin_assistant.search_settings.include_params_in_form
32
+ @url_params.reject do |name,value|
33
+ name=="commit" or name=="search" or name=="action" or
34
+ name=="controller"
35
+ end
36
+ else
37
+ []
34
38
  end
35
- fi
36
39
  end
37
40
 
38
41
  def model_class
39
42
  @admin_assistant.model_class
40
43
  end
41
44
 
42
- def order_sql
43
- if (sc = sort_column)
44
- first_part = if (by_assoc = belongs_to_sort_column)
45
- by_assoc.order_sql_field
46
- else
47
- sc.name
48
- end
49
- "#{first_part} #{sort_order}"
50
- else
51
- settings.sort_by
52
- end
53
- end
54
-
55
45
  def records
56
- unless @records
57
- ar_query = ARQuery.new(
58
- :order => order_sql, :include => find_include,
59
- :per_page => 25, :page => @url_params[:page]
60
- )
61
- if @controller_methods[:conditions_for_index]
62
- sql = @controller_methods[:conditions_for_index].call
63
- ar_query.condition_sqls << sql if sql
64
- elsif conditions_from_settings
65
- if conditions_from_settings.respond_to?(:call)
66
- conditions_sql = conditions_from_settings.call @url_params
67
- else
68
- conditions_sql = conditions_from_settings
69
- end
70
- ar_query.condition_sqls << conditions_sql if conditions_sql
71
- end
72
- search.add_to_query(ar_query)
73
- if settings.total_entries
74
- ar_query.total_entries = settings.total_entries.call
75
- end
76
- @records = model_class.paginate :all, ar_query.to_hash
77
- end
78
- @records
46
+ @records ||= RecordFinder.new(self).run
79
47
  end
80
48
 
81
49
  def search
@@ -97,16 +65,6 @@ class AdminAssistant
97
65
  (settings.sort_by.to_s if settings.sort_by.is_a?(Symbol))
98
66
  end
99
67
 
100
- def sort_column
101
- if sort
102
- columns.detect { |c|
103
- c.name.to_s == sort
104
- } || belongs_to_sort_column
105
- elsif settings.sort_by.is_a?(Symbol)
106
- columns.detect { |c| c.name == settings.sort_by.to_s }
107
- end
108
- end
109
-
110
68
  def sort_order
111
69
  @url_params[:sort_order] || 'asc'
112
70
  end
@@ -114,6 +72,116 @@ class AdminAssistant
114
72
  def view(action_view)
115
73
  @view ||= View.new(self, action_view, @admin_assistant)
116
74
  end
75
+
76
+ class RecordFinder
77
+ def initialize(index)
78
+ @index = index
79
+ end
80
+
81
+ def add_base_condition_sqls
82
+ if @index.controller_methods[:conditions_for_index]
83
+ sql = @index.controller_methods[:conditions_for_index].call
84
+ @ar_query.condition_sqls << sql if sql
85
+ elsif conditions_from_settings
86
+ if conditions_from_settings.respond_to?(:call)
87
+ conditions_sql = conditions_from_settings.call @index.url_params
88
+ else
89
+ conditions_sql = conditions_from_settings
90
+ end
91
+ @ar_query.condition_sqls << conditions_sql if conditions_sql
92
+ end
93
+ end
94
+
95
+ def belongs_to_sort_column
96
+ @index.belongs_to_columns.detect { |c| c.name.to_s == @index.sort }
97
+ end
98
+
99
+ def cache_total_entries(total_entries)
100
+ Rails.cache.write(
101
+ total_entries_cache_key, total_entries,
102
+ :expires_in => settings.cache_total_entries
103
+ )
104
+ end
105
+
106
+ def caching_total_entries?
107
+ search.params.empty? && settings.cache_total_entries
108
+ end
109
+
110
+ def conditions_from_settings
111
+ settings.conditions
112
+ end
113
+
114
+ def find_include
115
+ fi = settings.include || []
116
+ if by_assoc = belongs_to_sort_column
117
+ fi << by_assoc.name
118
+ end
119
+ fi
120
+ end
121
+
122
+ def optimized_total_entries
123
+ if settings.total_entries
124
+ settings.total_entries.call
125
+ elsif caching_total_entries?
126
+ Rails.cache.read total_entries_cache_key
127
+ end
128
+ end
129
+
130
+ def order_sql
131
+ if (sc = sort_column)
132
+ first_part = if (by_assoc = belongs_to_sort_column)
133
+ by_assoc.order_sql_field
134
+ else
135
+ sc.name
136
+ end
137
+ "#{first_part} #{@index.sort_order}"
138
+ else
139
+ settings.sort_by
140
+ end
141
+ end
142
+
143
+ def run
144
+ @ar_query = ARQuery.new(
145
+ :order => order_sql, :include => find_include,
146
+ :per_page => settings.per_page, :page => @index.url_params[:page]
147
+ )
148
+ add_base_condition_sqls
149
+ search.add_to_query @ar_query
150
+ @ar_query.total_entries = optimized_total_entries
151
+ records = @index.model_class.paginate(:all, @ar_query.to_hash)
152
+ if caching_total_entries? && @ar_query.to_hash[:total_entries].nil?
153
+ cache_total_entries records.total_entries
154
+ end
155
+ records
156
+ end
157
+
158
+ def search
159
+ @index.search
160
+ end
161
+
162
+ def settings
163
+ @index.settings
164
+ end
165
+
166
+ def sort_column
167
+ if @index.sort
168
+ @index.columns.detect { |c|
169
+ c.name.to_s == @index.sort
170
+ } || belongs_to_sort_column
171
+ elsif settings.sort_by.is_a?(Symbol)
172
+ @index.columns.detect { |c| c.name == settings.sort_by.to_s }
173
+ end
174
+ end
175
+
176
+ def total_entries_cache_key
177
+ key =
178
+ "AdminAssistant::#{@index.admin_assistant.controller_class.name}_count"
179
+ if conditions = @ar_query.to_hash[:conditions]
180
+ key << conditions.gsub(/\W/, '_')
181
+ end
182
+ key
183
+ end
184
+ end
117
185
 
118
186
  class View
119
187
  def initialize(index, action_view, admin_assistant)
@@ -121,6 +189,19 @@ class AdminAssistant
121
189
  index, action_view, admin_assistant
122
190
  end
123
191
 
192
+ def render_after_index_header
193
+ slug = "_after_index_header.html.erb"
194
+ abs_template_file = File.join( Rails.root, 'app/views', @admin_assistant.controller_class.controller_path, slug )
195
+ if File.exist?(abs_template_file)
196
+ template = if RAILS_GEM_VERSION == '2.1.0'
197
+ File.join(@admin_assistant.controller_class.controller_path, slug)
198
+ else
199
+ abs_template_file
200
+ end
201
+ @action_view.render :file => template
202
+ end
203
+ end
204
+
124
205
  def ajax_toggle_allowed?
125
206
  @admin_assistant.update?
126
207
  end
@@ -134,6 +215,17 @@ class AdminAssistant
134
215
  @columns
135
216
  end
136
217
 
218
+ def delete_link(record)
219
+ @action_view.link_to_remote(
220
+ 'Delete',
221
+ :url => {:action => 'destroy', :id => record.id},
222
+ :confirm => 'Are you sure?',
223
+ :success =>
224
+ "Effect.Fade('#{@admin_assistant.model_class.name.underscore}_#{record.id}', {duration: 0.25})",
225
+ :method => :delete
226
+ )
227
+ end
228
+
137
229
  def destroy?
138
230
  @destroy ||= @admin_assistant.destroy?
139
231
  end
@@ -142,6 +234,14 @@ class AdminAssistant
142
234
  @edit ||= @admin_assistant.edit?
143
235
  end
144
236
 
237
+ def edit_link(record)
238
+ @action_view.link_to 'Edit', :action => 'edit', :id => record.id
239
+ end
240
+
241
+ def new?
242
+ @new ||= @admin_assistant.new?
243
+ end
244
+
145
245
  def header
146
246
  if block = @index.settings.header
147
247
  block.call @action_view.params
@@ -149,9 +249,22 @@ class AdminAssistant
149
249
  @admin_assistant.model_class_name.pluralize.capitalize
150
250
  end
151
251
  end
252
+
253
+ def multi_form?
254
+ @admin_assistant.form_settings.multi?
255
+ end
256
+
257
+ def new_link
258
+ new_link_name = if multi_form?
259
+ "New #{@admin_assistant.model_class_name.pluralize}"
260
+ else
261
+ "New #{@admin_assistant.model_class_name}"
262
+ end
263
+ @action_view.link_to new_link_name, @admin_assistant.url_params(:new)
264
+ end
152
265
 
153
266
  def right_column?
154
- edit? or destroy? or show? or !right_column_lambdas.empty?
267
+ edit? or destroy? or show? or !right_column_lambdas.empty? or @action_view.respond_to?(:extra_right_column_links_for_index)
155
268
  end
156
269
 
157
270
  def right_column_lambdas
@@ -160,26 +273,13 @@ class AdminAssistant
160
273
  end
161
274
 
162
275
  def right_column_links(record)
163
- links = ""
164
- if edit?
165
- links << @action_view.link_to(
166
- 'Edit', :action => 'edit', :id => record.id
167
- ) << " "
168
- end
169
- if destroy?
170
- links << @action_view.link_to_remote(
171
- 'Delete',
172
- :url => {:action => 'destroy', :id => record.id},
173
- :confirm => 'Are you sure?',
174
- :success =>
175
- "Effect.Fade('#{@admin_assistant.model_class.name.underscore}_#{record.id}')",
176
- :method => :delete
177
- ) << ' '
178
- end
179
- if show?
276
+ links = []
277
+ links << edit_link(record) if render_edit_link?(record)
278
+ links << delete_link(record) if render_delete_link?(record)
279
+ if render_show_link?(record)
180
280
  links << @action_view.link_to(
181
281
  'Show', :action => 'show', :id => record.id
182
- ) << ' '
282
+ )
183
283
  end
184
284
  right_column_lambdas.each do |lambda|
185
285
  link_args = lambda.call record
@@ -188,14 +288,51 @@ class AdminAssistant
188
288
  if @action_view.respond_to?(:extra_right_column_links_for_index)
189
289
  links << @action_view.extra_right_column_links_for_index(
190
290
  record
191
- ) || ''
291
+ )
192
292
  end
193
- links
293
+ links.join(" &bull; ")
294
+ end
295
+
296
+ def tr_css_classes(record)
297
+ css_classes = [@action_view.cycle('odd', 'even')]
298
+ if @action_view.respond_to?(:css_class_for_index_tr)
299
+ css_classes << @action_view.css_class_for_index_tr(record)
300
+ end
301
+ css_classes.join(' ')
302
+ end
303
+
304
+ def render_new_link?
305
+ return false if @action_view.respond_to?(:link_to_new_in_index?) && !@action_view.link_to_new_in_index?
306
+ new?
307
+ end
308
+
309
+ def render_search_link?
310
+ return false if @action_view.respond_to?(:link_to_search_in_index?) && !@action_view.link_to_search_in_index?
311
+ true
312
+ end
313
+
314
+ def render_edit_link?(record)
315
+ return false if @action_view.respond_to?(:link_to_edit_in_index?) && !@action_view.link_to_edit_in_index?(record)
316
+ edit?
317
+ end
318
+
319
+ def render_delete_link?(record)
320
+ return false if @action_view.respond_to?(:link_to_delete_in_index?) && !@action_view.link_to_delete_in_index?(record)
321
+ destroy?
322
+ end
323
+
324
+ def render_show_link?(record)
325
+ return false if @action_view.respond_to?(:link_to_show_in_index?) && !@action_view.link_to_show_in_index?(record)
326
+ show?
194
327
  end
195
328
 
196
329
  def show?
197
330
  @show ||= @admin_assistant.show?
198
331
  end
332
+
333
+ def show_link(record)
334
+ @action_view.link_to 'Show', :action => 'show', :id => record.id
335
+ end
199
336
  end
200
337
  end
201
338
  end
@@ -24,7 +24,7 @@ class AdminAssistant
24
24
  @belongs_to_assoc.association_foreign_key
25
25
  end
26
26
 
27
- def attributes_for_search_object(search_params)
27
+ def attributes_for_search_object(search_params, compare_to_range)
28
28
  atts = {}
29
29
  atts[association_foreign_key.to_sym] =
30
30
  search_params[association_foreign_key]