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
@@ -1,14 +1,41 @@
1
1
  class AdminAssistant
2
2
  module Request
3
+ def self.dispatch(action_name, admin_assistant, controller)
4
+ class_name = action_name.to_s.capitalize
5
+ if [:create, :new].include?(action_name)
6
+ if admin_assistant.form_settings.multi?
7
+ class_name = "Multi#{class_name}"
8
+ else
9
+ class_name = "Single#{class_name}"
10
+ end
11
+ end
12
+ const_get(class_name).new(admin_assistant, controller).call
13
+ end
14
+
3
15
  class Base
4
16
  def initialize(admin_assistant, controller)
5
17
  @admin_assistant, @controller = admin_assistant, controller
18
+ controller.instance_variable_set :@admin_assistant, admin_assistant
6
19
  end
7
20
 
8
21
  def action
9
22
  @controller.action_name
10
23
  end
11
24
 
25
+ def after_template_file(template_name)
26
+ File.join(
27
+ RAILS_ROOT, 'app/views/', @controller.controller_path,
28
+ "_after_#{template_name}.html.erb"
29
+ )
30
+ end
31
+
32
+ def before_template_file(template_name)
33
+ File.join(
34
+ RAILS_ROOT, 'app/views/', @controller.controller_path,
35
+ "_before_#{template_name}.html.erb"
36
+ )
37
+ end
38
+
12
39
  def model_class
13
40
  @admin_assistant.model_class
14
41
  end
@@ -17,34 +44,23 @@ class AdminAssistant
17
44
  model_class.name.underscore.to_sym
18
45
  end
19
46
 
20
- def params_for_save
21
- ParamsForSave.new(@controller, @record, model_class_symbol)
47
+ def origin
48
+ @controller.params[:origin] || @controller.request.referer ||
49
+ {:action => 'index'}
22
50
  end
23
51
 
24
- def redirect_after_save
25
- url_params = if @controller.respond_to?(:destination_after_save)
26
- @controller.send(
27
- :destination_after_save, @record, @controller.params
28
- )
29
- end
30
- url_params ||= {:action => 'index'}
31
- @controller.send :redirect_to, url_params
52
+ def render_single_form(record)
53
+ @controller.instance_variable_set :@record, record
54
+ @controller.instance_variable_set :@origin, origin
55
+ render_template_file 'form'
32
56
  end
33
57
 
34
- def after_template_file(template_name)
35
- File.join(
36
- RAILS_ROOT, 'app/views/', @controller.controller_path,
37
- "_after_#{template_name}.html.erb"
38
- )
58
+ def render_multi_form(records)
59
+ @controller.instance_variable_set :@records, records
60
+ @controller.instance_variable_set :@origin, origin
61
+ render_template_file 'multi_form'
39
62
  end
40
63
 
41
- def before_template_file(template_name)
42
- File.join(
43
- RAILS_ROOT, 'app/views/', @controller.controller_path,
44
- "_before_#{template_name}.html.erb"
45
- )
46
- end
47
-
48
64
  def render_template_file(template_name = action, opts_plus = {})
49
65
  html = ''
50
66
  html << render_to_string_if_exists(
@@ -74,48 +90,54 @@ class AdminAssistant
74
90
  ''
75
91
  end
76
92
  end
77
-
78
- def save
79
- if @controller.respond_to?(:before_save)
80
- @controller.send(:before_save, @record)
81
- end
82
- result = @record.save
83
- if result && @controller.respond_to?(:after_save)
84
- @controller.send(:after_save, @record)
85
- end
86
- result
87
- end
88
93
  end
89
94
 
90
95
  class ParamsForSave < Hash
91
- def initialize(controller, record, model_class_symbol)
96
+ attr_reader :errors
97
+
98
+ def initialize(controller, record, record_params=nil)
92
99
  super()
93
- @controller, @record, @model_class_symbol =
94
- controller, record, model_class_symbol
100
+ @controller, @record_params = controller, record_params
101
+ @model_class_symbol = record.class.name.underscore.to_sym
102
+ @record_params ||= @controller.params[@model_class_symbol]
103
+ @model_methods = record.methods
104
+ @model_columns = record.class.columns
105
+ @errors = Errors.new
95
106
  build_from_split_params
96
107
  destroy_params.each do |k,v|
97
- if whole_params[k].blank?
98
- self[k] = nil
99
- mname = "destroy_#{k}_in_attributes"
100
- if controller.respond_to?(mname)
101
- controller.send(mname, self)
102
- end
103
- end
108
+ apply_destroy_param k, v
104
109
  end
105
110
  build_from_whole_params
106
111
  end
107
112
 
113
+ def apply_destroy_param(name, value)
114
+ if whole_params[name].blank?
115
+ self[name] = nil
116
+ mname = "destroy_#{name}_in_attributes"
117
+ if @controller.respond_to?(mname)
118
+ @controller.send(mname, self)
119
+ end
120
+ end
121
+ end
122
+
108
123
  def build_from_split_params
109
- bases = split_params.map { |k, v| k.gsub(/\([0-9]+i\)$/, '') }.uniq
124
+ bases = split_params.map { |k, v| k.gsub(split_param_regex, '') }.uniq
110
125
  bases.each do |b|
111
126
  h = {}
112
- split_params.each { |k, v|
113
- h[k] = split_params.delete(k) if k =~ /#{b}\([0-9]+i\)$/
114
- }
115
127
  from_form_method = "#{b}_from_form".to_sym
116
128
  if @controller.respond_to?(from_form_method)
129
+ split_params.each { |k, v|
130
+ if k =~ /#{b}#{split_param_regex.source}/
131
+ h[$1] = split_params.delete(k)
132
+ end
133
+ }
117
134
  self[b] = @controller.send(from_form_method, h)
118
- elsif @record.respond_to?("#{b}=")
135
+ elsif model_setter?(b)
136
+ split_params.each { |k, v|
137
+ if k =~ /#{b}#{split_param_regex.source}/
138
+ h[k] = split_params.delete(k)
139
+ end
140
+ }
119
141
  self.merge! h
120
142
  end
121
143
  end
@@ -125,20 +147,15 @@ class AdminAssistant
125
147
  whole_params.each do |k, v|
126
148
  from_form_method = "#{k}_from_form".to_sym
127
149
  if @controller.respond_to?(from_form_method)
128
- self[k] = @controller.send(from_form_method, v)
129
- elsif @record.respond_to?("#{k}=")
150
+ args = [v]
151
+ if @controller.method(from_form_method).arity >= 2
152
+ args << @record_params
153
+ end
154
+ args << @errors if @controller.method(from_form_method).arity >= 3
155
+ self[k] = @controller.send(from_form_method, *args)
156
+ elsif model_setter?(k)
130
157
  unless destroy_params[k] && v.blank?
131
- column = @record.class.columns.detect { |c| c.name == k }
132
- if column && column.type == :boolean
133
- if v == '1'
134
- v = true
135
- elsif v == '0'
136
- v = false
137
- else
138
- v = nil
139
- end
140
- end
141
- self[k] = v
158
+ self[k] = value_from_param(k, v)
142
159
  end
143
160
  end
144
161
  end
@@ -146,7 +163,7 @@ class AdminAssistant
146
163
 
147
164
  def destroy_params
148
165
  dp = {}
149
- @controller.params[@model_class_symbol].each do |k,v|
166
+ @record_params.each do |k,v|
150
167
  if k =~ %r|(.*)\(destroy\)|
151
168
  dp[$1] = v
152
169
  end
@@ -154,23 +171,135 @@ class AdminAssistant
154
171
  dp
155
172
  end
156
173
 
174
+ def model_setter?(attr)
175
+ @model_columns.any? { |mc| mc.name.to_s == attr } or
176
+ @model_methods.include?("#{attr}=")
177
+ end
178
+
179
+ def split_param_key?(key)
180
+ key =~ split_param_regex
181
+ end
182
+
183
+ def split_param_regex
184
+ @split_param_regex ||= /\((.+i)\)$/
185
+ end
186
+
157
187
  def split_params
158
188
  sp = {}
159
- @controller.params[@model_class_symbol].each do |k,v|
160
- sp[k] = v if k =~ /\([0-9]+i\)$/
161
- end
189
+ @record_params.each do |k,v| sp[k] = v if split_param_key?(k); end
162
190
  sp
163
191
  end
164
192
 
193
+ def value_from_param(name, str)
194
+ column = @model_columns.detect { |c| c.name == name }
195
+ if column && column.type == :boolean
196
+ if str == '1'
197
+ true
198
+ elsif str == '0'
199
+ false
200
+ else
201
+ nil
202
+ end
203
+ else
204
+ str
205
+ end
206
+ end
207
+
165
208
  def whole_params
166
209
  wp = {}
167
- @controller.params[@model_class_symbol].each do |k,v|
168
- unless k =~ /\([0-9]+i\)$/ || k =~ %r|(.*)\(destroy\)|
210
+ @record_params.each do |k,v|
211
+ unless split_param_key?(k) || k =~ %r|(.*)\(destroy\)|
169
212
  wp[k] = v
170
213
  end
171
214
  end
172
215
  wp
173
216
  end
217
+
218
+ class Error
219
+ attr_reader :message
220
+
221
+ def initialize(attribute, message, options)
222
+ @attribute, @message, @options = attribute, message, options
223
+ end
224
+ end
225
+
226
+ class Errors
227
+ def initialize
228
+ @errors = Hash.new { |h,k| h[k] = []}
229
+ end
230
+
231
+ def add(error_or_attr, message = nil, options = {})
232
+ error, attribute = error_or_attr.is_a?(Error) ? [error_or_attr, error_or_attr.attribute] : [nil, error_or_attr]
233
+ options[:message] = options.delete(:default) if options.has_key?(:default)
234
+
235
+ @errors[attribute.to_s] << (error || Error.new(attribute, message, options))
236
+ end
237
+
238
+ def each
239
+ @errors.each do |attr, ary|
240
+ ary.each do |error|
241
+ yield attr, error.message
242
+ end
243
+ end
244
+ end
245
+
246
+ def each_attribute
247
+ @errors.keys.each do |key| yield key; end
248
+ end
249
+
250
+ def empty?
251
+ @errors.empty?
252
+ end
253
+ end
254
+ end
255
+
256
+ class AbstractSaving
257
+ attr_reader :record
258
+
259
+ def initialize(record, controller)
260
+ @record, @controller = record, controller
261
+ end
262
+
263
+ def params_for_save
264
+ ParamsForSave.new(@controller, @record)
265
+ end
266
+
267
+ def record_and_associations_valid?
268
+ if @controller.respond_to?(:before_validation)
269
+ @controller.send(:before_validation, record)
270
+ end
271
+ params = params_for_save
272
+ prepare_record_to_receive_invalid_association_assignments
273
+ record.attributes = params
274
+ record.valid?
275
+ params.errors.each do |attr, msg| record.errors.add(attr, msg); end
276
+ if @controller.respond_to?(:validate)
277
+ @controller.send(:validate, record)
278
+ end
279
+ record.errors.empty?
280
+ end
281
+
282
+ def redirect_after_save
283
+ url_params = if @controller.respond_to?(:destination_after_save)
284
+ @controller.send(
285
+ :destination_after_save, @record, @controller.params
286
+ )
287
+ end
288
+ url_params ||= @controller.params[:origin]
289
+ url_params ||= {:action => 'index'}
290
+ @controller.send :redirect_to, url_params
291
+ end
292
+
293
+ def save
294
+ if @controller.respond_to?(:before_save)
295
+ @controller.send(:before_save, record)
296
+ end
297
+ result = record.save
298
+ if result && @controller.respond_to?(:after_save)
299
+ @controller.send(:after_save, record)
300
+ end
301
+ result
302
+ end
174
303
  end
175
304
  end
176
305
  end
@@ -1,16 +1,64 @@
1
1
  class AdminAssistant
2
2
  module Request
3
- class Create < Base
3
+ class SingleCreate < Base
4
4
  def call
5
- @record = model_class.new
6
- @record.attributes = params_for_save
7
- if save
8
- redirect_after_save
5
+ if @controller.request.get?
6
+ @controller.send :redirect_to, :action => 'new'
9
7
  else
10
- @controller.instance_variable_set :@record, @record
11
- render_template_file 'form'
8
+ saving = CreateSaving.new model_class.new, @controller
9
+ if saving.record_and_associations_valid?
10
+ saving.save
11
+ saving.redirect_after_save
12
+ else
13
+ render_single_form saving.record
14
+ end
12
15
  end
13
16
  end
17
+ end
18
+
19
+ class MultiCreate < Base
20
+ def call
21
+ savings = ('a'..'j').map { |letter|
22
+ CreateSaving.new(model_class.new, @controller, letter)
23
+ }
24
+ non_blank_savings = savings.reject &:blank?
25
+ if non_blank_savings.map(&:record_and_associations_valid?).all?
26
+ non_blank_savings.each do |s| s.save; end
27
+ redirector = non_blank_savings.first || savings.first
28
+ redirector.redirect_after_save
29
+ else
30
+ render_multi_form(
31
+ savings.sort_by { |s| [(s.blank? ? 1 : 0), s.params_prefix] }.
32
+ map(&:record)
33
+ )
34
+ end
35
+ end
36
+ end
37
+
38
+ class CreateSaving < Request::AbstractSaving
39
+ attr_reader :params_prefix
40
+
41
+ def initialize(record, controller, params_prefix = nil)
42
+ super record, controller
43
+ @params_prefix = params_prefix
44
+ end
45
+
46
+ def blank?
47
+ raw_params.values.all? &:blank?
48
+ end
49
+
50
+ def params_for_save
51
+ ParamsForSave.new @controller, @record, raw_params
52
+ end
53
+
54
+ def prepare_record_to_receive_invalid_association_assignments
55
+ # no preparations necessary for creation
56
+ end
57
+
58
+ def raw_params
59
+ model_class_symbol = @record.class.name.underscore.to_sym
60
+ @controller.params[model_class_symbol][@params_prefix]
61
+ end
14
62
 
15
63
  def save
16
64
  if @controller.respond_to?(:before_create)
@@ -3,8 +3,7 @@ class AdminAssistant
3
3
  class Edit < Base
4
4
  def call
5
5
  @record = model_class.find @controller.params[:id]
6
- @controller.instance_variable_set :@record, @record
7
- render_template_file 'form'
6
+ render_single_form @record
8
7
  end
9
8
  end
10
9
  end
@@ -2,25 +2,32 @@ class AdminAssistant
2
2
  module Request
3
3
  class Index < Base
4
4
  def call
5
- controller_methods = {}
6
- possible_methods = [
7
- :conditions_for_index, :extra_right_column_links_for_index
8
- ]
9
- possible_methods.each do |mname|
10
- if @controller.respond_to?(mname)
11
- controller_methods[mname] = @controller.method mname
12
- end
13
- end
14
5
  index = AdminAssistant::Index.new(
15
6
  @admin_assistant, @controller.params, controller_methods
16
7
  )
17
8
  @controller.instance_variable_set :@index, index
9
+ if @controller.respond_to?(:before_render_for_index)
10
+ @controller.send :before_render_for_index
11
+ end
18
12
  render_template_file
19
13
  end
20
14
 
21
15
  def columns
22
16
  @admin_assistant.index_settings.columns
23
17
  end
18
+
19
+ def controller_methods
20
+ c_methods = {}
21
+ possible_methods = [
22
+ :conditions_for_index, :extra_right_column_links_for_index
23
+ ]
24
+ possible_methods.each do |mname|
25
+ if @controller.respond_to?(mname)
26
+ c_methods[mname] = @controller.method mname
27
+ end
28
+ end
29
+ c_methods
30
+ end
24
31
  end
25
32
  end
26
33
  end
@@ -1,18 +1,30 @@
1
1
  class AdminAssistant
2
2
  module Request
3
- class New < Base
4
- def call
5
- @record = model_class.new
3
+ class AbstractNew < Base
4
+ def new_saving
5
+ saving = CreateSaving.new model_class.new, @controller
6
6
  @admin_assistant.form_settings.columns_for_new.each do |column|
7
7
  if block = @admin_assistant.form_settings[column].default
8
- @record.send("#{column}=", block.call(@controller))
8
+ saving.record.send("#{column}=", block.call(@controller))
9
9
  end
10
10
  end
11
11
  if @controller.params[model_class_symbol]
12
- @record.attributes = params_for_save
12
+ saving.record.attributes = saving.params_for_save
13
13
  end
14
- @controller.instance_variable_set :@record, @record
15
- render_template_file 'form'
14
+ saving
15
+ end
16
+ end
17
+
18
+ class SingleNew < AbstractNew
19
+ def call
20
+ render_single_form new_saving.record
21
+ end
22
+ end
23
+
24
+ class MultiNew < AbstractNew
25
+ def call
26
+ records = (0..9).map { new_saving }.map(&:record)
27
+ render_multi_form records
16
28
  end
17
29
  end
18
30
  end
@@ -2,21 +2,22 @@ class AdminAssistant
2
2
  module Request
3
3
  class Update < Base
4
4
  def call
5
- @record = model_class.find @controller.params[:id]
6
- @record.attributes = params_for_save
7
- if save
5
+ saving = Update::Saving.new(
6
+ model_class.find(@controller.params[:id]), @controller
7
+ )
8
+ if saving.record_and_associations_valid?
9
+ saving.save
8
10
  if @controller.params[:from]
9
- render_response_to_ajax_toggle
11
+ render_response_to_ajax_toggle saving.record
10
12
  else
11
- redirect_after_save
13
+ saving.redirect_after_save
12
14
  end
13
15
  else
14
- @controller.instance_variable_set :@record, @record
15
- render_template_file 'form'
16
+ render_single_form saving.record
16
17
  end
17
18
  end
18
19
 
19
- def render_response_to_ajax_toggle
20
+ def render_response_to_ajax_toggle(record)
20
21
  @controller.params[:from] =~ /#{model_class.name.underscore}_\d+_(.*)/
21
22
  field_name = $1
22
23
  index = AdminAssistant::Index.new @admin_assistant
@@ -28,16 +29,30 @@ class AdminAssistant
28
29
  :render,
29
30
  :inline => erb,
30
31
  :locals => {
31
- :index => index, :field_name => field_name, :record => @record
32
+ :index => index, :field_name => field_name, :record => record
32
33
  }
33
34
  )
34
35
  end
35
36
 
36
- def save
37
- if @controller.respond_to?(:before_update)
38
- @controller.send(:before_update, @record)
37
+ class Saving < Request::AbstractSaving
38
+ def prepare_record_to_receive_invalid_association_assignments
39
+ params_for_save.errors.each_attribute do |attr|
40
+ @record.instance_eval <<-EVAL
41
+ @attempted_attributes ||= {}
42
+ def #{attr}=(ary)
43
+ @attempted_attributes[#{attr.inspect}] = ary
44
+ end
45
+ def #{attr}; @attempted_attributes[#{attr.inspect}]; end
46
+ EVAL
47
+ end
48
+ end
49
+
50
+ def save
51
+ if @controller.respond_to?(:before_update)
52
+ @controller.send(:before_update, @record)
53
+ end
54
+ super
39
55
  end
40
- super
41
56
  end
42
57
  end
43
58
  end
@@ -8,7 +8,9 @@ class AdminAssistant
8
8
  @attributes = HashWithIndifferentAccess.new
9
9
  columns.each do |c|
10
10
  c.verify_for_search
11
- c.attributes_for_search_object(@params).each do |key, value|
11
+ compare_to_range = compare_to_range?(c.name) if c.respond_to?(:name)
12
+ attributes = c.attributes_for_search_object(@params, compare_to_range)
13
+ attributes.each do |key, value|
12
14
  @attributes[key] = value
13
15
  end
14
16
  end
@@ -31,12 +33,16 @@ class AdminAssistant
31
33
  end
32
34
  end
33
35
 
36
+ def blank?(column_name)
37
+ @params["#{column_name}(blank)"] == '1'
38
+ end
39
+
34
40
  def columns
35
41
  column_names = settings.column_names
36
42
  if column_names.empty?
37
43
  [DefaultSearchColumn.new(
38
44
  @admin_assistant.model_class,
39
- :fields_to_include => settings.default_search_includes
45
+ :fields_to_match => @admin_assistant.default_search_matches_on
40
46
  )]
41
47
  else
42
48
  column_names.map { |column_name|
@@ -51,6 +57,15 @@ class AdminAssistant
51
57
  }
52
58
  end
53
59
 
60
+ def comparator(column_name)
61
+ c = @params["#{column_name}(comparator)"]
62
+ c if %w(< <= = >= >).include?(c)
63
+ end
64
+
65
+ def compare_to_range?(column_name)
66
+ settings[column_name].compare_to_range
67
+ end
68
+
54
69
  def id
55
70
  @attributes[:id] if @attributes.has_key?(:id)
56
71
  end
@@ -13,7 +13,7 @@ class AdminAssistant
13
13
  end
14
14
  end
15
15
 
16
- def attributes_for_search_object(search_params)
16
+ def attributes_for_search_object(search_params, compare_to_range)
17
17
  value = if search_params[@name.to_s] == 'true'
18
18
  true
19
19
  elsif search_params[@name.to_s] == 'false'
@@ -42,15 +42,23 @@ class AdminAssistant
42
42
  include AdminAssistant::Column::FormViewMethods
43
43
 
44
44
  def default_html(form)
45
+ object = form.object
45
46
  input_name = "#{@column.model_class.name.underscore}[#{name}]"
46
- if @input
47
- if @input == :check_box
48
- fv = value form.object
49
- check_box_and_hidden_tags(input_name, fv)
50
- end
47
+ input = @input || :text_field
48
+ html = if input == :check_box
49
+ check_box_and_hidden_tags(input_name, value(object))
51
50
  else
52
- @action_view.send(:text_field_tag, input_name, string(form.object))
51
+ @action_view.send("#{input}_tag", input_name, string(object))
53
52
  end
53
+ if has_matching_errors?(object)
54
+ html = "<div class=\"fieldWithErrors\">#{html}</div>"
55
+ end
56
+ html
57
+ end
58
+
59
+ def has_matching_errors?(record)
60
+ record.respond_to?(:errors) && record.errors.respond_to?(:on) &&
61
+ record.errors.on(name)
54
62
  end
55
63
  end
56
64