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
@@ -10,15 +10,23 @@ end
10
10
  require 'will_paginate'
11
11
 
12
12
  class AdminAssistant
13
- attr_reader :base_settings, :controller_class, :form_settings,
14
- :index_settings, :model_class, :show_settings
15
- attr_accessor :actions, :custom_destroy
16
- attr_writer :model_class_name
13
+ cattr_accessor :request_start_time
17
14
 
15
+ def self.profile(msg)
16
+ if self.request_start_time
17
+ Rails.logger.info "#{msg}: #{Time.now - self.request_start_time}"
18
+ end
19
+ end
20
+
18
21
  def self.template_file(template_name)
19
22
  "#{File.dirname(__FILE__)}/views/#{template_name}.html.erb"
20
23
  end
21
24
 
25
+ attr_reader :base_settings, :controller_class, :form_settings,
26
+ :index_settings, :model_class, :show_settings
27
+ attr_accessor :actions, :custom_destroy, :default_search_matches_on
28
+ attr_writer :model_class_name
29
+
22
30
  def initialize(controller_class, model_class)
23
31
  @controller_class, @model_class = controller_class, model_class
24
32
  @model = Model.new model_class
@@ -27,6 +35,7 @@ class AdminAssistant
27
35
  @index_settings = IndexSettings.new self
28
36
  @show_settings = ShowSettings.new self
29
37
  @base_settings = BaseSettings.new self
38
+ @default_search_matches_on = @model.searchable_columns.map &:name
30
39
  end
31
40
 
32
41
  def [](name)
@@ -34,7 +43,7 @@ class AdminAssistant
34
43
  end
35
44
 
36
45
  def accumulate_columns(names)
37
- columns = paperclip_attachments.map { |paperclip_attachment|
46
+ columns = @model.paperclip_attachments.map { |paperclip_attachment|
38
47
  PaperclipColumn.new paperclip_attachment
39
48
  }
40
49
  names.each do |column_name|
@@ -51,34 +60,44 @@ class AdminAssistant
51
60
  end
52
61
 
53
62
  def autocomplete_actions
54
- ac_actions = []
55
- if [:new, :create, :edit, :update].any? { |action|
56
- actions.include?(action)
57
- }
58
- accumulate_belongs_to_columns(default_column_names).each { |column|
59
- ac_actions << "autocomplete_#{column.name}".to_sym
63
+ @autocomplete_actions ||= begin
64
+ ac_actions = []
65
+ if [:new, :create, :edit, :update].any? { |action|
66
+ actions.include?(action)
60
67
  }
61
- end
62
- if actions.include?(:index)
63
- base_settings.all_polymorphic_types.each do |p_type|
64
- ac_actions << "autocomplete_#{p_type.name.underscore.downcase}".to_sym
68
+ defaults = @model.default_column_names
69
+ accumulate_belongs_to_columns(defaults).each { |column|
70
+ ac_actions << "autocomplete_#{column.name}".to_sym
71
+ }
72
+ end
73
+ if actions.include?(:index)
74
+ base_settings.all_polymorphic_types.each do |p_type|
75
+ ac_actions << "autocomplete_#{p_type.name.underscore.downcase}".to_sym
76
+ end
65
77
  end
78
+ ac_actions.uniq
66
79
  end
67
- ac_actions.uniq
80
+ @autocomplete_actions
68
81
  end
69
82
 
70
83
  def column(name)
71
- if file_columns.include?(name.to_s)
84
+ if @model.file_columns.include?(name.to_s)
72
85
  FileColumnColumn.new name
73
- elsif paperclip_attachments.include?(name)
86
+ elsif @model.paperclip_attachments.include?(name)
74
87
  PaperclipColumn.new name
75
- elsif (belongs_to_assoc = belongs_to_assoc(name) or
76
- belongs_to_assoc = belongs_to_assoc_by_foreign_key(name))
88
+ elsif (belongs_to_assoc = @model.belongs_to_assoc(name) or
89
+ belongs_to_assoc = @model.belongs_to_assoc_by_foreign_key(name))
77
90
  column_based_on_belongs_to_assoc name, belongs_to_assoc
78
- elsif belongs_to_assoc = belongs_to_assoc_by_polymorphic_type(name)
91
+ elsif belongs_to_assoc = @model.belongs_to_assoc_by_polymorphic_type(name)
79
92
  # skip it, actually
80
93
  elsif (ar_column = @model_class.columns_hash[name.to_s])
81
94
  ActiveRecordColumn.new ar_column
95
+ elsif has_many_assoc = @model.has_many_assoc(name)
96
+ HasManyColumn.new(
97
+ has_many_assoc,
98
+ :match_text_fields_in_search =>
99
+ search_settings[name].match_text_fields_for_association?
100
+ )
82
101
  else
83
102
  VirtualColumn.new name, @model_class, self
84
103
  end
@@ -109,34 +128,28 @@ class AdminAssistant
109
128
  controller.controller_path.gsub(%r|/|, '_')
110
129
  end
111
130
 
112
- def dispatch_to_request_method(request_class, controller)
113
- controller.instance_variable_set :@admin_assistant, self
114
- @request = request_class.new(self, controller)
115
- @request.call
116
- @request = nil
131
+ def crudful_request_methods
132
+ [:create, :destroy, :edit, :index, :new, :update, :show]
133
+ end
134
+
135
+ def default_column_names
136
+ @model.default_column_names
137
+ end
138
+
139
+ def file_columns
140
+ @model.file_columns
117
141
  end
118
142
 
119
143
  def method_missing(meth, *args)
120
- if @model.respond_to?(meth)
121
- @model.send meth, *args
144
+ if crudful_request_methods.include?(meth) and args.size == 1
145
+ self.class.request_start_time = Time.now if ENV['PROFILE_LOGGING']
146
+ Request.dispatch meth, self, args.first
147
+ elsif autocomplete_actions && autocomplete_actions.include?(meth)
148
+ Request.dispatch :autocomplete, self, args.first
149
+ elsif meth.to_s =~ /(.*)\?/ && crudful_request_methods.include?($1.to_sym)
150
+ supports_action? $1
122
151
  else
123
- request_methods = [
124
- :create, :destroy, :edit, :index, :new, :update, :show
125
- ]
126
- if request_methods.include?(meth) and args.size == 1
127
- request_class = Request.const_get meth.to_s.capitalize
128
- dispatch_to_request_method request_class, args.first
129
- elsif autocomplete_actions && autocomplete_actions.include?(meth)
130
- dispatch_to_request_method Request::Autocomplete, args.first
131
- else
132
- if meth.to_s =~ /(.*)\?/ && request_methods.include?($1.to_sym)
133
- @controller_class.public_instance_methods.include?($1)
134
- elsif @request.respond_to?(meth)
135
- @request.send meth, *args
136
- else
137
- super
138
- end
139
- end
152
+ super
140
153
  end
141
154
  end
142
155
 
@@ -145,16 +158,23 @@ class AdminAssistant
145
158
  @model_class.name.gsub(/([A-Z])/, ' \1')[1..-1].downcase
146
159
  end
147
160
 
148
- def profile(msg)
149
- if @request_start_time
150
- puts "#{msg}: #{Time.now - @request_start_time}"
151
- end
161
+ def paperclip_attachments
162
+ @model.paperclip_attachments
152
163
  end
153
164
 
154
165
  def search_settings
155
166
  @index_settings.search_settings
156
167
  end
157
168
 
169
+ def supports_action?(action)
170
+ @memoized_action_booleans ||= {}
171
+ unless @memoized_action_booleans.has_key?(action)
172
+ @memoized_action_booleans[action] =
173
+ @controller_class.public_instance_methods.include?(action)
174
+ end
175
+ @memoized_action_booleans[action]
176
+ end
177
+
158
178
  def url_params(a = action)
159
179
  {:controller => @controller_class.controller_path, :action => a}
160
180
  end
@@ -168,16 +188,20 @@ class AdminAssistant
168
188
 
169
189
  module ControllerClassMethods
170
190
  def admin_assistant_for(model_class, &block)
171
- self.admin_assistant = AdminAssistant.new(self, model_class)
172
- builder = Builder.new self.admin_assistant
173
- if block
174
- block.call builder
175
- end
176
- self.helper AdminAssistant::Helper
177
- self.admin_assistant.controller_actions.each do |action|
178
- self.send(:define_method, action) do
179
- self.class.admin_assistant.send(action, self)
191
+ begin
192
+ self.admin_assistant = AdminAssistant.new(self, model_class)
193
+ builder = Builder.new self.admin_assistant
194
+ if block
195
+ block.call builder
196
+ end
197
+ self.helper AdminAssistant::Helper
198
+ self.admin_assistant.controller_actions.each do |action|
199
+ self.send(:define_method, action) do
200
+ self.class.admin_assistant.send(action, self)
201
+ end
180
202
  end
203
+ rescue ActiveRecord::StatementInvalid
204
+ Rails.logger.info "Skipping admin_assistant_for for #{self.name} because the table doesn't exist in the DB. Hopefully that's because you're deploying with a migration."
181
205
  end
182
206
  end
183
207
  end
@@ -186,6 +210,13 @@ class AdminAssistant
186
210
  def initialize(ar_model)
187
211
  @ar_model = ar_model
188
212
  end
213
+
214
+ def accessors
215
+ @ar_model.instance_methods.
216
+ select { |m| m =~ /=$/ }.
217
+ map { |m| m.gsub(/=/, '')}.
218
+ select { |m| @ar_model.instance_methods.include?(m) }
219
+ end
189
220
 
190
221
  def belongs_to_associations
191
222
  @ar_model.reflect_on_all_associations.select { |assoc|
@@ -223,26 +254,25 @@ class AdminAssistant
223
254
  unless @file_columns
224
255
  @file_columns = []
225
256
  if @ar_model.respond_to?(:file_column)
226
- names_to_check = @ar_model.columns.map &:name
227
- names_to_check.concat(
228
- @ar_model.instance_methods.
229
- select { |m| m =~ /=$/ }.
230
- map { |m| m.gsub(/=/, '')}.
231
- select { |m| @ar_model.instance_methods.include?(m) }
232
- )
233
- names_to_check.uniq.each do |name|
234
- suffixes = %w( relative_path dir relative_dir temp )
235
- if suffixes.all? { |suffix|
257
+ names_to_check = @ar_model.columns.map(&:name).concat(accessors).uniq
258
+ @file_columns = names_to_check.select { |name|
259
+ %w( relative_path dir relative_dir temp ).all? { |suffix|
236
260
  @ar_model.method_defined? "#{name}_#{suffix}".to_sym
237
261
  }
238
- @file_columns << name
239
- end
240
- end
262
+ }
241
263
  end
242
264
  end
243
265
  @file_columns
244
266
  end
245
267
 
268
+ def has_many_assoc(association_name)
269
+ @ar_model.reflect_on_all_associations.select { |assoc|
270
+ assoc.macro == :has_many
271
+ }.detect { |assoc|
272
+ assoc.name.to_s == association_name.to_s
273
+ }
274
+ end
275
+
246
276
  def paperclip_attachments
247
277
  pa = []
248
278
  if @ar_model.respond_to?(:attachment_definitions)
@@ -265,13 +295,3 @@ end
265
295
 
266
296
  ActionController::Base.send :include, AdminAssistant::ControllerMethods
267
297
 
268
- css_dir = "#{RAILS_ROOT}/public/stylesheets/admin_assistant"
269
- FileUtils.mkdir(css_dir) unless File.exist?(css_dir)
270
- FileUtils.cp_r(Dir.glob("#{File.dirname(__FILE__)}/stylesheets/*"), css_dir)
271
- FileUtils.copy(
272
- "#{File.dirname(__FILE__)}/javascripts/admin_assistant.js",
273
- "#{RAILS_ROOT}/public/javascripts/admin_assistant.js"
274
- )
275
- images_dir = "#{RAILS_ROOT}/public/images/admin_assistant"
276
- FileUtils.mkdir(images_dir) unless File.exist?(images_dir)
277
- FileUtils.cp_r(Dir.glob("#{File.dirname(__FILE__)}/images/*"), images_dir)
@@ -152,7 +152,7 @@ AdminAssistant.RestrictedAutocompleter.prototype = {
152
152
  onHide: this.autocompleteOnHide,
153
153
  parameters: options.parameters,
154
154
  paramName: options.paramName,
155
- partialChars: 1,
155
+ partialChars: 1
156
156
  };
157
157
  if (!options.paletteClonesInputWidth) {
158
158
  ajaxAutocompleterOptions.onShow = this.onShowWithoutCloningInputWidth;
@@ -134,6 +134,7 @@ Don't edit this file: It gets re-copied every time the server starts.
134
134
 
135
135
  .admin_assistant.form label {
136
136
  font-size: 11px;
137
+ display: block;
137
138
  }
138
139
 
139
140
  .admin_assistant.form input[type=text] {
@@ -216,4 +217,8 @@ Don't edit this file: It gets re-copied every time the server starts.
216
217
  font-size: small;
217
218
  }
218
219
 
219
-
220
+ ul.aa_filter li {
221
+ float: left;
222
+ margin: 0 10px 10px 0;
223
+ font-weight: bold;
224
+ }
@@ -67,6 +67,7 @@ Don't edit this file: It gets re-copied every time the server starts.
67
67
 
68
68
  .admin_assistant.form .column .description {
69
69
  font-size: small;
70
+ margin: 0;
70
71
  }
71
72
 
72
73
  .admin_assistant.form input {
@@ -81,6 +82,10 @@ Don't edit this file: It gets re-copied every time the server starts.
81
82
  width: 50px
82
83
  }
83
84
 
85
+ .admin_assistant.form label {
86
+ display: block;
87
+ }
88
+
84
89
  .admin_assistant.form select {
85
90
  font-size: large
86
91
  }
@@ -90,6 +95,18 @@ Don't edit this file: It gets re-copied every time the server starts.
90
95
  font-size: large
91
96
  }
92
97
 
98
+ .admin_assistant.form th {
99
+ font-weight: normal;
100
+ text-align: left;
101
+ }
102
+
103
+ .admin_assistant.multi.form .errorExplanation {
104
+ font-size: small;
105
+ }
106
+
107
+ .admin_assistant.form .fieldWithErrors {
108
+ background: red;
109
+ }
93
110
 
94
111
  .admin_assistant .autocomplete_palette {
95
112
  background: white;
@@ -8,20 +8,24 @@ form_view = AdminAssistant::FormView.new(@record, @admin_assistant, self)
8
8
  <div class="aa_header">
9
9
  <h2><%= h(form_view.title) %></h2>
10
10
  <div class="actions">
11
- <%= link_to('Back to index', :action => 'index') %>
11
+ <%= link_to('Back to index', @origin) %>
12
12
  </div>
13
13
  </div>
14
14
  <% if !@record.errors.empty? %>
15
15
  <%= error_messages_for 'record' %>
16
16
  <% end %>
17
17
  <% form_for(@record, form_view.form_for_args) do |rails_form| %>
18
+ <% if @origin %>
19
+ <%= hidden_field_tag 'origin', @origin %>
20
+ <% end %>
21
+
18
22
  <% form_view.columns.each do |column| %>
19
23
  <div class="column">
20
- <label><%= h(column.label) %></label>
24
+ <label for="<%= column.field_id %>"><%= h(column.label) %></label>
21
25
  <% if column.description %>
22
26
  <p class="description"><%= h(column.description) %></p>
23
27
  <% end %>
24
- <br /><%= column.html(rails_form) %>
28
+ <%= column.html(rails_form) %>
25
29
  </div>
26
30
  <% end %>
27
31
  <div>
@@ -4,15 +4,16 @@
4
4
  %>">
5
5
  <div class="aa_header">
6
6
  <div class="actions">
7
- <%= link_to_function('Search', 'AdminAssistant.show_search_form()') %>
8
- <%= link_to(
9
- "New #{@admin_assistant.model_class_name}", @admin_assistant.url_params(:new)
10
- ) if @admin_assistant.new? %>
7
+ <%= link_to_function('Search', 'AdminAssistant.show_search_form()') if index_view.render_search_link? %>
8
+ <% if index_view.render_new_link? %>
9
+ <%= index_view.new_link %>
10
+ <% end %>
11
11
  <% @admin_assistant.index_settings.actions.each do |action, params| %>
12
12
  <%= link_to_unless_current(action, params) %>
13
13
  <% end %>
14
14
  </div>
15
15
  <h2><%= h(index_view.header) %></h2>
16
+ <%= index_view.render_after_index_header %>
16
17
  </div>
17
18
 
18
19
  <% form_for(
@@ -20,6 +21,9 @@
20
21
  :url => {:action => 'index'},
21
22
  :html => {:id => 'search_form', :style => 'display:none', :method => 'get'}
22
23
  ) do |form| %>
24
+ <% @index.hidden_fields_for_search_form.each do |name, value| -%>
25
+ <%= hidden_field_tag name, value %>
26
+ <% end -%>
23
27
  <% column_views = @index.search.column_views self %>
24
28
  <% if column_views.size > 1 %>
25
29
  Match all conditions <%= radio_button_tag(
@@ -62,12 +66,12 @@
62
66
  </thead>
63
67
  <tbody id="<%= @admin_assistant.model_class.name.underscore.pluralize %>_index_tbody">
64
68
  <% @index.records.each do |record| %>
65
- <tr class="<%= cycle('odd', 'even') %>" id="<%=
69
+ <tr class="<%= index_view.tr_css_classes(record) %>" id="<%=
66
70
  @admin_assistant.model_class.name.underscore
67
71
  %>_<%= record.id %>">
68
- <% @index.view(self).columns.each do |column| %>
69
- <% td_class = column.td_css_class %>
70
- <td<%= " class=\"#{td_class}\"" if td_class %>><%=
72
+ <% index_view.columns.each do |column| %>
73
+ <% td_class = column.td_css_classes(column, record) %>
74
+ <td<%= " class=\"#{td_class}\"" unless td_class.blank? %>><%=
71
75
  column.html(record)
72
76
  %></td>
73
77
  <% end %>
@@ -97,3 +101,4 @@
97
101
  %> found
98
102
  </div>
99
103
  </div>
104
+
@@ -0,0 +1,71 @@
1
+ <%
2
+ multi_form_view = AdminAssistant::MultiFormView.new(
3
+ @records, @admin_assistant, self
4
+ )
5
+ %>
6
+ <div class="admin_assistant form multi <%=
7
+ @admin_assistant.controller_css_class(controller)
8
+ %>">
9
+ <div class="aa_header">
10
+ <h2><%= h(multi_form_view.title) %></h2>
11
+ <div class="actions">
12
+ <%= link_to('Back to index', :action => 'index') %>
13
+ </div>
14
+ </div>
15
+ <% form_for(*multi_form_view.form_for_args) do |rails_form| %>
16
+ <% if @origin %>
17
+ <%= hidden_field_tag 'origin', @origin %>
18
+ <% end %>
19
+ <table>
20
+ <thead>
21
+ <tr>
22
+ <% multi_form_view.columns.each do |column| %>
23
+ <th>
24
+ <label><%= h(column.label) %></label>
25
+ <% if column.description %>
26
+ <p class="description"><%= h(column.description) %></p>
27
+ <% end %>
28
+ </th>
29
+ <% end %>
30
+ </tr>
31
+ </thead>
32
+ <% rails_form.each_sub_form do |rails_sub_form, sub_form_view| %>
33
+ <% record = sub_form_view.record %>
34
+ <% if !sub_form_view.record.errors.empty? %>
35
+ <tr>
36
+ <% sub_form_view.columns.each do |column| %>
37
+ <td class="errorExplanation">
38
+ <% errors = column.errors(record) %>
39
+ <% if errors %>
40
+ <% if errors.is_a?(String) %>
41
+ <%= h(column.label) %> <%= h(errors) %>
42
+ <% else %>
43
+ <ul>
44
+ <% errors.each do |error| %>
45
+ <li><%= h(column.label) %> <%= h(error) %></li>
46
+ <% end %>
47
+ </ul>
48
+ <% end %>
49
+ <% end %>
50
+ </td>
51
+ <% end %>
52
+ </tr>
53
+ <% end %>
54
+ <tr>
55
+ <% sub_form_view.columns.each do |column| %>
56
+ <td<%= " class='fieldWithErrors'" if column.errors(record) %>>
57
+ <%= column.html(rails_sub_form) %>
58
+ </td>
59
+ <% end %>
60
+ </tr>
61
+ <% end %>
62
+ </table>
63
+ <div>
64
+ <%= submit_tag(multi_form_view.submit_value) %>
65
+ <% multi_form_view.extra_submit_buttons.each do |extra_submit_button| %>
66
+ <%= submit_tag(extra_submit_button) %>
67
+ <% end %>
68
+ </div>
69
+ <% end %>
70
+ </div>
71
+
@@ -1,3 +1,4 @@
1
+ <% show_view = AdminAssistant::ShowView.new(@record, @admin_assistant, self) %>
1
2
  <div class="admin_assistant show <%=
2
3
  @admin_assistant.controller_css_class(controller)
3
4
  %>">
@@ -5,11 +6,10 @@
5
6
  <h2><%=
6
7
  h("#{request.model_class_name(@record).capitalize} #{@record.id}")
7
8
  %></h2>
8
- <%= link_to 'Edit', :action => 'edit', :id => @record.id %>
9
+ <% if @admin_assistant.edit? %>
10
+ <%= link_to 'Edit', :action => 'edit', :id => @record.id %>
11
+ <% end %>
9
12
  </div>
10
- <%
11
- show_view = AdminAssistant::ShowView.new(@record, @admin_assistant, self)
12
- %>
13
13
  <% show_view.columns.each do |column| %>
14
14
  <div class="column">
15
15
  <label><%= h(column.label) %></label>