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