active_scaffold-sequel 0.3.0

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 (318) hide show
  1. data/CHANGELOG +179 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +36 -0
  4. data/app/assets/images/active_scaffold/add.gif +0 -0
  5. data/app/assets/images/active_scaffold/arrow_down.gif +0 -0
  6. data/app/assets/images/active_scaffold/arrow_up.gif +0 -0
  7. data/app/assets/images/active_scaffold/close.gif +0 -0
  8. data/app/assets/images/active_scaffold/close_touch.png +0 -0
  9. data/app/assets/images/active_scaffold/config.png +0 -0
  10. data/app/assets/images/active_scaffold/cross.png +0 -0
  11. data/app/assets/images/active_scaffold/gears.png +0 -0
  12. data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
  13. data/app/assets/images/active_scaffold/indicator.gif +0 -0
  14. data/app/assets/images/active_scaffold/magnifier.png +0 -0
  15. data/app/assets/javascripts/active_scaffold.js.erb +19 -0
  16. data/app/assets/javascripts/jquery/active_scaffold.js +1057 -0
  17. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +24 -0
  18. data/app/assets/javascripts/jquery/draggable_lists.js +27 -0
  19. data/app/assets/javascripts/jquery/jquery.editinplace.js +743 -0
  20. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +7 -0
  21. data/app/assets/javascripts/prototype/active_scaffold.js +1052 -0
  22. data/app/assets/javascripts/prototype/dhtml_history.js +870 -0
  23. data/app/assets/javascripts/prototype/form_enhancements.js +117 -0
  24. data/app/assets/javascripts/prototype/rico_corner.js +370 -0
  25. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +7 -0
  26. data/app/assets/stylesheets/active_scaffold-ie.css +35 -0
  27. data/app/assets/stylesheets/active_scaffold.css.scss +14 -0
  28. data/app/assets/stylesheets/active_scaffold_colors.css.scss +395 -0
  29. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
  30. data/app/assets/stylesheets/active_scaffold_images.css.scss +43 -0
  31. data/app/assets/stylesheets/active_scaffold_layout.css +912 -0
  32. data/app/assets/stylesheets/blue-theme.css +74 -0
  33. data/config/locales/de.yml +114 -0
  34. data/config/locales/en.yml +118 -0
  35. data/config/locales/es.yml +120 -0
  36. data/config/locales/fr.yml +121 -0
  37. data/config/locales/hu.yml +74 -0
  38. data/config/locales/ja.yml +73 -0
  39. data/config/locales/ru.yml +123 -0
  40. data/frontends/default/views/_action_group.html.erb +24 -0
  41. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  42. data/frontends/default/views/_base_form.html.erb +51 -0
  43. data/frontends/default/views/_create_form.html.erb +8 -0
  44. data/frontends/default/views/_create_form_on_list.html.erb +6 -0
  45. data/frontends/default/views/_field_search.html.erb +32 -0
  46. data/frontends/default/views/_form.html.erb +24 -0
  47. data/frontends/default/views/_form_association.html.erb +15 -0
  48. data/frontends/default/views/_form_association_footer.html.erb +47 -0
  49. data/frontends/default/views/_form_attribute.html.erb +20 -0
  50. data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
  51. data/frontends/default/views/_form_messages.html.erb +5 -0
  52. data/frontends/default/views/_horizontal_subform.html.erb +28 -0
  53. data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
  54. data/frontends/default/views/_horizontal_subform_header.html.erb +11 -0
  55. data/frontends/default/views/_horizontal_subform_record.html.erb +38 -0
  56. data/frontends/default/views/_human_conditions.html.erb +1 -0
  57. data/frontends/default/views/_list.html.erb +18 -0
  58. data/frontends/default/views/_list_actions.html.erb +15 -0
  59. data/frontends/default/views/_list_calculations.html.erb +16 -0
  60. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  61. data/frontends/default/views/_list_header.html.erb +10 -0
  62. data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
  63. data/frontends/default/views/_list_messages.html.erb +30 -0
  64. data/frontends/default/views/_list_pagination.html.erb +11 -0
  65. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  66. data/frontends/default/views/_list_record.html.erb +14 -0
  67. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  68. data/frontends/default/views/_list_with_header.html.erb +36 -0
  69. data/frontends/default/views/_messages.html.erb +10 -0
  70. data/frontends/default/views/_render_field.js.erb +20 -0
  71. data/frontends/default/views/_row.html.erb +6 -0
  72. data/frontends/default/views/_search.html.erb +34 -0
  73. data/frontends/default/views/_search_attribute.html.erb +10 -0
  74. data/frontends/default/views/_show.html.erb +8 -0
  75. data/frontends/default/views/_show_columns.html.erb +15 -0
  76. data/frontends/default/views/_update_actions.html.erb +9 -0
  77. data/frontends/default/views/_update_form.html.erb +6 -0
  78. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  79. data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
  80. data/frontends/default/views/action_confirmation.html.erb +13 -0
  81. data/frontends/default/views/add_existing.js.erb +18 -0
  82. data/frontends/default/views/add_existing_form.html.erb +5 -0
  83. data/frontends/default/views/create.html.erb +5 -0
  84. data/frontends/default/views/delete.html.erb +13 -0
  85. data/frontends/default/views/destroy.js.erb +24 -0
  86. data/frontends/default/views/edit_associated.js.erb +12 -0
  87. data/frontends/default/views/field_search.html.erb +5 -0
  88. data/frontends/default/views/form_messages.js.erb +1 -0
  89. data/frontends/default/views/list.html.erb +1 -0
  90. data/frontends/default/views/on_action_update.js.erb +13 -0
  91. data/frontends/default/views/on_create.js.erb +47 -0
  92. data/frontends/default/views/on_mark_all.js.erb +12 -0
  93. data/frontends/default/views/on_update.js.erb +31 -0
  94. data/frontends/default/views/refresh_list.js.erb +1 -0
  95. data/frontends/default/views/render_field.js.erb +1 -0
  96. data/frontends/default/views/search.html.erb +5 -0
  97. data/frontends/default/views/show.html.erb +5 -0
  98. data/frontends/default/views/update.html.erb +8 -0
  99. data/frontends/default/views/update_column.js.erb +16 -0
  100. data/frontends/default/views/update_row.js.erb +1 -0
  101. data/lib/active_scaffold/actions/common_search.rb +25 -0
  102. data/lib/active_scaffold/actions/core.rb +197 -0
  103. data/lib/active_scaffold/actions/create.rb +148 -0
  104. data/lib/active_scaffold/actions/delete.rb +76 -0
  105. data/lib/active_scaffold/actions/field_search.rb +82 -0
  106. data/lib/active_scaffold/actions/list.rb +196 -0
  107. data/lib/active_scaffold/actions/mark.rb +75 -0
  108. data/lib/active_scaffold/actions/nested.rb +245 -0
  109. data/lib/active_scaffold/actions/search.rb +48 -0
  110. data/lib/active_scaffold/actions/show.rb +61 -0
  111. data/lib/active_scaffold/actions/subform.rb +23 -0
  112. data/lib/active_scaffold/actions/update.rb +150 -0
  113. data/lib/active_scaffold/active_record_permissions.rb +136 -0
  114. data/lib/active_scaffold/attribute_params.rb +208 -0
  115. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +39 -0
  116. data/lib/active_scaffold/bridges/ancestry.rb +5 -0
  117. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +67 -0
  118. data/lib/active_scaffold/bridges/calendar_date_select.rb +24 -0
  119. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +107 -0
  120. data/lib/active_scaffold/bridges/cancan.rb +15 -0
  121. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +31 -0
  122. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +10 -0
  123. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +45 -0
  124. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +17 -0
  125. data/lib/active_scaffold/bridges/carrierwave.rb +12 -0
  126. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +358 -0
  127. data/lib/active_scaffold/bridges/country_helper.rb +9 -0
  128. data/lib/active_scaffold/bridges/date_picker/ext.rb +45 -0
  129. data/lib/active_scaffold/bridges/date_picker/helper.rb +180 -0
  130. data/lib/active_scaffold/bridges/date_picker.rb +23 -0
  131. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +34 -0
  132. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +10 -0
  133. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +27 -0
  134. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +16 -0
  135. data/lib/active_scaffold/bridges/dragonfly.rb +9 -0
  136. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +48 -0
  137. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +57 -0
  138. data/lib/active_scaffold/bridges/file_column/form_ui.rb +34 -0
  139. data/lib/active_scaffold/bridges/file_column/list_ui.rb +26 -0
  140. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  141. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  142. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  143. data/lib/active_scaffold/bridges/file_column.rb +11 -0
  144. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +27 -0
  145. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +16 -0
  146. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +36 -0
  147. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +24 -0
  148. data/lib/active_scaffold/bridges/paperclip.rb +12 -0
  149. data/lib/active_scaffold/bridges/record_select/helpers.rb +86 -0
  150. data/lib/active_scaffold/bridges/record_select.rb +11 -0
  151. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +20 -0
  152. data/lib/active_scaffold/bridges/semantic_attributes.rb +5 -0
  153. data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
  154. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +46 -0
  155. data/lib/active_scaffold/bridges/tiny_mce.rb +17 -0
  156. data/lib/active_scaffold/bridges.rb +61 -0
  157. data/lib/active_scaffold/config/base.rb +71 -0
  158. data/lib/active_scaffold/config/core.rb +219 -0
  159. data/lib/active_scaffold/config/create.rb +44 -0
  160. data/lib/active_scaffold/config/delete.rb +33 -0
  161. data/lib/active_scaffold/config/field_search.rb +76 -0
  162. data/lib/active_scaffold/config/form.rb +48 -0
  163. data/lib/active_scaffold/config/list.rb +196 -0
  164. data/lib/active_scaffold/config/mark.rb +35 -0
  165. data/lib/active_scaffold/config/nested.rb +42 -0
  166. data/lib/active_scaffold/config/search.rb +73 -0
  167. data/lib/active_scaffold/config/show.rb +32 -0
  168. data/lib/active_scaffold/config/subform.rb +35 -0
  169. data/lib/active_scaffold/config/update.rb +41 -0
  170. data/lib/active_scaffold/configurable.rb +29 -0
  171. data/lib/active_scaffold/constraints.rb +170 -0
  172. data/lib/active_scaffold/data_structures/action_columns.rb +140 -0
  173. data/lib/active_scaffold/data_structures/action_link.rb +179 -0
  174. data/lib/active_scaffold/data_structures/action_links.rb +185 -0
  175. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  176. data/lib/active_scaffold/data_structures/bridge.rb +22 -0
  177. data/lib/active_scaffold/data_structures/column.rb +389 -0
  178. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  179. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  180. data/lib/active_scaffold/data_structures/nested_info.rb +130 -0
  181. data/lib/active_scaffold/data_structures/set.rb +57 -0
  182. data/lib/active_scaffold/data_structures/sorting.rb +172 -0
  183. data/lib/active_scaffold/engine.rb +4 -0
  184. data/lib/active_scaffold/extensions/action_controller_rendering.rb +22 -0
  185. data/lib/active_scaffold/extensions/action_view_rendering.rb +115 -0
  186. data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
  187. data/lib/active_scaffold/extensions/array.rb +7 -0
  188. data/lib/active_scaffold/extensions/cache_association.rb +16 -0
  189. data/lib/active_scaffold/extensions/localize.rb +10 -0
  190. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
  191. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
  192. data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
  193. data/lib/active_scaffold/extensions/routing_mapper.rb +48 -0
  194. data/lib/active_scaffold/extensions/to_label.rb +8 -0
  195. data/lib/active_scaffold/extensions/unsaved_associated.rb +60 -0
  196. data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
  197. data/lib/active_scaffold/extensions/usa_state.rb +46 -0
  198. data/lib/active_scaffold/finder.rb +372 -0
  199. data/lib/active_scaffold/helpers/association_helpers.rb +48 -0
  200. data/lib/active_scaffold/helpers/controller_helpers.rb +88 -0
  201. data/lib/active_scaffold/helpers/form_column_helpers.rb +321 -0
  202. data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -0
  203. data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
  204. data/lib/active_scaffold/helpers/list_column_helpers.rb +340 -0
  205. data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
  206. data/lib/active_scaffold/helpers/search_column_helpers.rb +267 -0
  207. data/lib/active_scaffold/helpers/show_column_helpers.rb +50 -0
  208. data/lib/active_scaffold/helpers/view_helpers.rb +342 -0
  209. data/lib/active_scaffold/marked_model.rb +38 -0
  210. data/lib/active_scaffold/paginator.rb +136 -0
  211. data/lib/active_scaffold/responds_to_parent.rb +70 -0
  212. data/lib/active_scaffold/version.rb +9 -0
  213. data/lib/active_scaffold.rb +368 -0
  214. data/lib/active_scaffold_env.rb +11 -0
  215. data/lib/generators/active_scaffold/USAGE +29 -0
  216. data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
  217. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  218. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
  219. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  220. data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
  221. data/public/blank.html +33 -0
  222. data/shoulda_macros/macros.rb +136 -0
  223. data/test/bridges/active_scaffold_dependent_protect_test.rb +34 -0
  224. data/test/bridges/bridge_test.rb +90 -0
  225. data/test/bridges/company.rb +81 -0
  226. data/test/bridges/paperclip_test.rb +68 -0
  227. data/test/bridges/tiny_mce_test.rb +27 -0
  228. data/test/bridges/unobtrusive_date_picker_test.rb +49 -0
  229. data/test/bridges/validation_reflection_test.rb +57 -0
  230. data/test/config/base_test.rb +15 -0
  231. data/test/config/core_test.rb +58 -0
  232. data/test/config/create_test.rb +58 -0
  233. data/test/config/delete_test.rb +33 -0
  234. data/test/config/field_search_test.rb +47 -0
  235. data/test/config/list_test.rb +129 -0
  236. data/test/config/nested_test.rb +62 -0
  237. data/test/config/search_test.rb +60 -0
  238. data/test/config/show_test.rb +43 -0
  239. data/test/config/subform_test.rb +17 -0
  240. data/test/config/update_test.rb +40 -0
  241. data/test/const_mocker.rb +36 -0
  242. data/test/data_structures/action_columns_test.rb +113 -0
  243. data/test/data_structures/action_link_test.rb +78 -0
  244. data/test/data_structures/action_links_test.rb +78 -0
  245. data/test/data_structures/actions_test.rb +25 -0
  246. data/test/data_structures/association_column_test.rb +42 -0
  247. data/test/data_structures/column_test.rb +185 -0
  248. data/test/data_structures/columns_test.rb +69 -0
  249. data/test/data_structures/error_message_test.rb +28 -0
  250. data/test/data_structures/set_test.rb +86 -0
  251. data/test/data_structures/sorting_test.rb +126 -0
  252. data/test/data_structures/standard_column_test.rb +24 -0
  253. data/test/data_structures/virtual_column_test.rb +23 -0
  254. data/test/extensions/active_record_test.rb +45 -0
  255. data/test/extensions/array_test.rb +12 -0
  256. data/test/helpers/form_column_helpers_test.rb +31 -0
  257. data/test/helpers/list_column_helpers_test.rb +42 -0
  258. data/test/helpers/pagination_helpers_test.rb +59 -0
  259. data/test/misc/active_record_permissions_test.rb +154 -0
  260. data/test/misc/attribute_params_test.rb +146 -0
  261. data/test/misc/configurable_test.rb +96 -0
  262. data/test/misc/constraints_test.rb +193 -0
  263. data/test/misc/finder_test.rb +92 -0
  264. data/test/misc/lang_test.rb +11 -0
  265. data/test/mock_app/app/controllers/application_controller.rb +10 -0
  266. data/test/mock_app/app/helpers/application_helper.rb +3 -0
  267. data/test/mock_app/config/boot.rb +110 -0
  268. data/test/mock_app/config/database.yml +16 -0
  269. data/test/mock_app/config/environment.rb +43 -0
  270. data/test/mock_app/config/environments/development.rb +17 -0
  271. data/test/mock_app/config/environments/production.rb +28 -0
  272. data/test/mock_app/config/environments/test.rb +28 -0
  273. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  274. data/test/mock_app/config/initializers/inflections.rb +10 -0
  275. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  276. data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
  277. data/test/mock_app/config/initializers/session_store.rb +15 -0
  278. data/test/mock_app/config/locales/en.yml +5 -0
  279. data/test/mock_app/config/routes.rb +43 -0
  280. data/test/mock_app/db/test.sqlite3 +1 -0
  281. data/test/mock_app/public/blank.html +33 -0
  282. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  283. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  284. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  285. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  286. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  287. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  288. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  289. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  290. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  291. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  292. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
  293. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  294. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
  295. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  296. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  297. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  298. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +848 -0
  299. data/test/model_stub.rb +55 -0
  300. data/test/run_all.rb +8 -0
  301. data/test/test_helper.rb +39 -0
  302. data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  303. data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  304. data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
  305. data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  306. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  307. data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  308. data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  309. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  310. data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  311. data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
  312. data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
  313. data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
  314. data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
  315. data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
  316. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1276 -0
  317. data/vendor/assets/stylesheets/jquery-ui.css +568 -0
  318. metadata +502 -0
@@ -0,0 +1,180 @@
1
+ module ActiveScaffold::Bridges
2
+ class DatePicker
3
+ module Helper
4
+ DATE_FORMAT_CONVERSION = {
5
+ /%a/ => 'D',
6
+ /%A/ => 'DD',
7
+ /%b/ => 'M',
8
+ /%B/ => 'MM',
9
+ /%d/ => 'dd',
10
+ /%e/ => 'd',
11
+ /%j/ => 'oo',
12
+ /%m/ => 'mm',
13
+ /%y/ => 'y',
14
+ /%Y/ => 'yy',
15
+ /%H/ => 'hh', # options ampm => false
16
+ /%I/ => 'hh', # options ampm => true
17
+ /%M/ => 'mm',
18
+ /%p/ => 'tt',
19
+ /%S/ => 'ss',
20
+ /%[cUWwxXZz]/ => ''
21
+ }
22
+
23
+ def self.date_options_for_locales
24
+ I18n.available_locales.collect do |locale|
25
+ locale_date_options = date_options(locale)
26
+ if locale_date_options
27
+ "$.datepicker.regional['#{locale}'] = #{locale_date_options.to_json};"
28
+ else
29
+ nil
30
+ end
31
+ end.compact.join('')
32
+ end
33
+
34
+ def self.date_options(locale)
35
+ begin
36
+ date_picker_options = { :closeText => as_(:close),
37
+ :prevText => as_(:previous),
38
+ :nextText => as_(:next),
39
+ :currentText => as_(:today),
40
+ :monthNames => I18n.translate!('date.month_names', :locale => locale)[1..-1],
41
+ :monthNamesShort => I18n.translate!('date.abbr_month_names', :locale => locale)[1..-1],
42
+ :dayNames => I18n.translate!('date.day_names', :locale => locale),
43
+ :dayNamesShort => I18n.translate!('date.abbr_day_names', :locale => locale),
44
+ :dayNamesMin => I18n.translate!('date.abbr_day_names', :locale => locale),
45
+ :changeYear => true,
46
+ :changeMonth => true,
47
+ }
48
+
49
+ as_date_picker_options = I18n.translate! :date_picker_options, :scope => :active_scaffold, :locale => locale, :default => ''
50
+ date_picker_options.merge!(as_date_picker_options) if as_date_picker_options.is_a? Hash
51
+ Rails.logger.warn "ActiveScaffold: Missing date picker localization for your locale: #{locale}" if as_date_picker_options.blank?
52
+
53
+ js_format = self.to_datepicker_format(I18n.translate!('date.formats.default', :locale => locale, :default => ''))
54
+ date_picker_options[:dateFormat] = js_format unless js_format.blank?
55
+ date_picker_options
56
+ rescue
57
+ raise if locale == I18n.locale
58
+ end
59
+ end
60
+
61
+ def self.datetime_options_for_locales
62
+ I18n.available_locales.collect do |locale|
63
+ locale_datetime_options = datetime_options(locale)
64
+ if locale_datetime_options
65
+ "$.timepicker.regional['#{locale}'] = #{locale_datetime_options.to_json};"
66
+ else
67
+ nil
68
+ end
69
+ end.compact.join('')
70
+ end
71
+
72
+ def self.datetime_options(locale)
73
+ begin
74
+ rails_time_format = I18n.translate! 'time.formats.picker', :locale => locale
75
+ datetime_picker_options = {:ampm => false,
76
+ :hourText => I18n.translate!('datetime.prompts.hour', :locale => locale),
77
+ :minuteText => I18n.translate!('datetime.prompts.minute', :locale => locale),
78
+ :secondText => I18n.translate!('datetime.prompts.second', :locale => locale)
79
+ }
80
+
81
+ as_datetime_picker_options = I18n.translate! :datetime_picker_options, :scope => :active_scaffold, :locale => locale, :default => ''
82
+ datetime_picker_options.merge!(as_datetime_picker_options) if as_datetime_picker_options.is_a? Hash
83
+ Rails.logger.warn "ActiveScaffold: Missing datetime picker localization for your locale: #{locale}" if as_datetime_picker_options.blank?
84
+
85
+ date_format, time_format = self.split_datetime_format(self.to_datepicker_format(rails_time_format))
86
+ datetime_picker_options[:dateFormat] = date_format unless date_format.nil?
87
+ unless time_format.nil?
88
+ datetime_picker_options[:timeFormat] = time_format
89
+ datetime_picker_options[:ampm] = true if rails_time_format.include?('%I')
90
+ end
91
+ datetime_picker_options
92
+ rescue
93
+ raise if locale == I18n.locale
94
+ end
95
+ end
96
+
97
+ def self.to_datepicker_format(rails_format)
98
+ return nil if rails_format.nil?
99
+ if rails_format =~ /%[cUWwxXZz]/
100
+ Rails.logger.warn("AS DatePicker::Helper: rails date format #{rails_format} includes options which can't be converted to jquery datepicker format. Options %c, %U, %W, %w, %x %X, %z, %Z are not supported by datepicker and will be removed")
101
+ nil
102
+ end
103
+ js_format = rails_format.dup
104
+ DATE_FORMAT_CONVERSION.each do |key, value|
105
+ js_format.gsub!(key, value)
106
+ end
107
+ js_format
108
+ end
109
+
110
+ def self.split_datetime_format(datetime_format)
111
+ date_format = datetime_format
112
+ time_format = nil
113
+ time_start_indicators = %w{hh mm tt ss}
114
+ unless datetime_format.nil?
115
+ start_indicator = time_start_indicators.detect {|indicator| datetime_format.include?(indicator)}
116
+ unless start_indicator.nil?
117
+ pos_time_format = datetime_format.index(start_indicator)
118
+ date_format = datetime_format.to(pos_time_format - 1)
119
+ time_format = datetime_format.from(pos_time_format)
120
+ end
121
+ end
122
+ return date_format, time_format
123
+ end
124
+
125
+ module DatepickerColumnHelpers
126
+ def datepicker_split_datetime_format(datetime_format)
127
+ ActiveScaffold::Bridges::DatePicker::Helper.split_datetime_format(datetime_format)
128
+ end
129
+
130
+ def to_datepicker_format(rails_format)
131
+ ActiveScaffold::Bridges::DatePicker::Helper.to_datepicker_format(rails_format)
132
+ end
133
+
134
+ def datepicker_format_options(column, format, options)
135
+ if column.form_ui == :date_picker
136
+ js_format = to_datepicker_format(I18n.translate!("date.formats.#{format}"))
137
+ options['date:dateFormat'] = js_format unless js_format.nil?
138
+ else
139
+ rails_time_format = I18n.translate!("time.formats.#{format}")
140
+ date_format, time_format = datepicker_split_datetime_format(self.to_datepicker_format(rails_time_format))
141
+ options['date:dateFormat'] = date_format unless date_format.nil?
142
+ unless time_format.nil?
143
+ options['time:timeFormat'] = time_format
144
+ options['time:ampm'] = true if rails_time_format.include?('%I')
145
+ end
146
+ end unless format == :default
147
+ end
148
+ end
149
+
150
+ module SearchColumnHelpers
151
+ def active_scaffold_search_date_bridge_calendar_control(column, options, current_search, name)
152
+ if current_search.is_a? Hash
153
+ value = controller.class.condition_value_for_datetime(current_search[name], column.search_ui == :date_picker ? :to_date : :to_time)
154
+ else
155
+ value = current_search
156
+ end
157
+ options = column.options.merge(options).except!(:include_blank, :discard_time, :discard_date, :value)
158
+ options = active_scaffold_input_text_options(options.merge(column.options))
159
+ options[:class] << " #{column.search_ui.to_s}"
160
+ options[:style] = "display:#{(options[:show].nil? || options[:show]) ? '' : 'none'}"
161
+ format = options.delete(:format) || :default
162
+ datepicker_format_options(column, format, options)
163
+ text_field_tag("#{options[:name]}[#{name}]", value ? l(value, :format => format) : nil, options.merge(:id => "#{options[:id]}_#{name}", :name => "#{options[:name]}[#{name}]"))
164
+ end
165
+ end
166
+
167
+ module FormColumnHelpers
168
+ def active_scaffold_input_date_picker(column, options)
169
+ options = active_scaffold_input_text_options(options.merge(column.options))
170
+ options[:class] << " #{column.form_ui.to_s}"
171
+ value = controller.class.condition_value_for_datetime(@record.send(column.name), column.form_ui == :date_picker ? :to_date : :to_time)
172
+ format = options.delete(:format) || :default
173
+ datepicker_format_options(column, format, options)
174
+ options[:value] = (value ? l(value, :format => format) : nil)
175
+ text_field(:record, column.name, options)
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,23 @@
1
+ module ActiveScaffold::Bridges
2
+ class DatePicker < ActiveScaffold::DataStructures::Bridge
3
+ autoload :Helper, 'active_scaffold/bridges/date_picker/helper'
4
+ def self.install
5
+ require File.join(File.dirname(__FILE__), "date_picker/ext.rb")
6
+ end
7
+ def self.install?
8
+ ActiveScaffold.js_framework == :jquery
9
+ end
10
+ def self.localization
11
+ "jQuery(function($){
12
+ if (typeof($.datepicker) === 'object') {
13
+ #{Helper.date_options_for_locales}
14
+ $.datepicker.setDefaults($.datepicker.regional['#{::I18n.locale}']);
15
+ }
16
+ if (typeof($.timepicker) === 'object') {
17
+ #{Helper.datetime_options_for_locales}
18
+ $.timepicker.setDefaults($.timepicker.regional['#{::I18n.locale}']);
19
+ }
20
+ });\n"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ class Dragonfly
4
+ module DragonflyBridge
5
+ def initialize_with_dragonfly(model_id)
6
+ initialize_without_dragonfly(model_id)
7
+ return unless self.model.respond_to?(:dragonfly_attachment_classes) && self.model.dragonfly_attachment_classes.present?
8
+
9
+ self.update.multipart = true
10
+ self.create.multipart = true
11
+
12
+ self.model.dragonfly_attachment_classes.each do |attachment|
13
+ configure_dragonfly_field(attachment.attribute)
14
+ end
15
+ end
16
+
17
+ def self.included(base)
18
+ base.alias_method_chain :initialize, :dragonfly
19
+ end
20
+
21
+ private
22
+ def configure_dragonfly_field(field)
23
+ self.columns << field
24
+ self.columns[field].form_ui ||= :dragonfly
25
+ self.columns[field].params.add "remove_#{field}"
26
+
27
+ [:name, :uid].each do |f|
28
+ self.columns.exclude("#{field}_#{f}".to_sym)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ class Dragonfly
4
+ module DragonflyBridgeHelpers
5
+ mattr_accessor :thumbnail_style
6
+ self.thumbnail_style = 'x30>'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ module FormColumnHelpers
4
+ def active_scaffold_input_dragonfly(column, options)
5
+ options = active_scaffold_input_text_options(options)
6
+ input = file_field(:record, column.name, options)
7
+ dragonfly = @record.send("#{column.name}")
8
+ if dragonfly.present?
9
+ if ActiveScaffold.js_framework == :jquery
10
+ js_remove_file_code = "$(this).prev().val('true'); $(this).parent().hide().next().show(); return false;";
11
+ else
12
+ js_remove_file_code = "$(this).previous().value='true'; $(this).up().hide().next().show(); return false;";
13
+ end
14
+
15
+ content = active_scaffold_column_dragonfly(column, @record)
16
+ content_tag(:div,
17
+ content + " | " +
18
+ hidden_field(:record, "remove_#{column.name}", :value => "false") +
19
+ content_tag(:a, as_(:remove_file), {:href => '#', :onclick => js_remove_file_code})
20
+ ) + content_tag(:div, input, :style => "display: none")
21
+ else
22
+ input
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ module ListColumnHelpers
4
+ def active_scaffold_column_dragonfly(column, record)
5
+ attachment = record.send("#{column.name}")
6
+ return nil unless attachment.present?
7
+ content = if attachment.image?
8
+ image_tag(attachment.thumb(column.options[:thumb] || ActiveScaffold::Bridges::Dragonfly::DragonflyBridgeHelpers.thumbnail_style).url, :border => 0)
9
+ else
10
+ attachment.name
11
+ end
12
+ link_to(content, attachment.remote_url, {'data-popup' => true, :target => '_blank'})
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ class ActiveScaffold::Bridges::Dragonfly < ActiveScaffold::DataStructures::Bridge
2
+ def self.install
3
+ require File.join(File.dirname(__FILE__), "dragonfly/form_ui")
4
+ require File.join(File.dirname(__FILE__), "dragonfly/list_ui")
5
+ require File.join(File.dirname(__FILE__), "dragonfly/dragonfly_bridge_helpers")
6
+ require File.join(File.dirname(__FILE__), "dragonfly/dragonfly_bridge")
7
+ ActiveScaffold::Config::Core.send :include, ActiveScaffold::Bridges::Dragonfly::DragonflyBridge
8
+ end
9
+ end
@@ -0,0 +1,48 @@
1
+ ActiveScaffold::DataStructures::Column.class_eval do
2
+ attr_accessor :file_column_display
3
+ end
4
+
5
+ module ActiveScaffold::Config
6
+ class Core < Base
7
+ attr_accessor :file_column_fields
8
+ def initialize_with_file_column(model_id)
9
+ initialize_without_file_column(model_id)
10
+
11
+ return unless ActiveScaffold::Bridges::FileColumn::FileColumnHelpers.klass_has_file_column_fields?(self.model)
12
+
13
+ self.model.send :extend, ActiveScaffold::Bridges::FileColumn::FileColumnHelpers
14
+
15
+ # include the "delete" helpers for use with active scaffold, unless they are already included
16
+ self.model.generate_delete_helpers
17
+
18
+ # switch on multipart
19
+ self.update.multipart = true
20
+ self.create.multipart = true
21
+
22
+ self.model.file_column_fields.each{ |field|
23
+ configure_file_column_field(field)
24
+ }
25
+ end
26
+
27
+ alias_method_chain :initialize, :file_column unless self.instance_methods.include?("initialize_without_file_column")
28
+
29
+ def configure_file_column_field(field)
30
+ # set list_ui first because it gets its default value from form_ui
31
+ self.columns[field].list_ui ||= self.model.field_has_image_version?(field, "thumb") ? :thumbnail : :download_link_with_filename
32
+ self.columns[field].form_ui ||= :file_column
33
+
34
+ # these 2 parameters are necessary helper attributes for the file column that must be allowed to be set to the model by active scaffold.
35
+ self.columns[field].params.add "#{field}_temp", "delete_#{field}"
36
+
37
+ # set null to false so active_scaffold wont set it to null
38
+ # delete_file_column will take care of deleting a file or not.
39
+ #
40
+ # XXX what a strange hack
41
+ #self.model.columns_hash[field.to_s].instance_variable_set("@null", false)
42
+
43
+ rescue
44
+ false
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,57 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ class FileColumn
4
+ module FileColumnHelpers
5
+ class << self
6
+ def file_column_fields(klass)
7
+ klass.instance_methods.grep(/_just_uploaded\?$/).collect{|m| m[0..-16].to_sym }
8
+ end
9
+
10
+ def generate_delete_helpers(klass)
11
+ file_column_fields(klass).each { |field|
12
+ klass.send :class_eval, <<-EOF, __FILE__, __LINE__ + 1 unless klass.methods.include?("#{field}_with_delete=")
13
+ attr_reader :delete_#{field}
14
+
15
+ def delete_#{field}=(value)
16
+ value = (value=="true") if String===value
17
+ return unless value
18
+
19
+ # passing nil to the file column causes the file to be deleted. Don't delete if we just uploaded a file!
20
+ self.#{field} = nil unless self.#{field}_just_uploaded?
21
+ end
22
+ EOF
23
+ }
24
+ end
25
+
26
+ def klass_has_file_column_fields?(klass)
27
+ true unless file_column_fields(klass).empty?
28
+ end
29
+ end
30
+
31
+ def file_column_fields
32
+ @file_column_fields||=FileColumnHelpers.file_column_fields(self)
33
+ end
34
+
35
+ def options_for_file_column_field(field)
36
+ self.allocate.send("#{field}_options")
37
+ end
38
+
39
+ def field_has_image_version?(field, version="thumb")
40
+ begin
41
+ # the only way to get to the options of a particular field is to use the instance method
42
+ options = options_for_file_column_field(field)
43
+ versions = options[:magick][:versions]
44
+ raise unless versions.stringify_keys[version]
45
+ true
46
+ rescue
47
+ false
48
+ end
49
+ end
50
+
51
+ def generate_delete_helpers
52
+ FileColumnHelpers.generate_delete_helpers(self)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,34 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ # Helpers that assist with the rendering of a Form Column
4
+ module FormColumnHelpers
5
+ def active_scaffold_input_file_column(column, options)
6
+ if @record.send(column.name)
7
+ # we already have a value? display the form for deletion.
8
+ if ActiveScaffold.js_framework == :jquery
9
+ remove_file_js = "$(this).prev().val('true'); $(this).parent().hide().next().show(); return false;";
10
+ else
11
+ remove_file_js = "$(this).previous().value='true'; p=$(this).up(); p.hide(); p.next().show(); return false;";
12
+ end
13
+
14
+ hidden_options = options.dup
15
+ hidden_options[:id] += '_delete'
16
+ hidden_options[:name].sub!("[#{column.name}]", "[delete_#{column.name}]")
17
+ hidden_options[:value] = 'false'
18
+ custom_hidden_field_tag = hidden_field(:record, column.name, hidden_options)
19
+
20
+ content_tag(:div) do
21
+ content_tag(:div) do
22
+ content = get_column_value(@record, column) + " #{custom_hidden_field_tag} | ".html_safe
23
+ content += content_tag(:a, as_(:remove_file), {:href => '#', :onclick => remove_file_js})
24
+ content += content_tag(:div, file_column_field("record", column.name, options), :style => "display: none")
25
+ end
26
+ end
27
+ else
28
+ file_column_field("record", column.name, options)
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ # Helpers that assist with the rendering of a List Column
4
+ module ListColumnHelpers
5
+ def active_scaffold_column_download_link_with_filename(column, record)
6
+ return nil if record.send(column.name).nil?
7
+ active_scaffold_column_download_link(column, record, File.basename(record.send(column.name)))
8
+ end
9
+
10
+ def active_scaffold_column_download_link(column, record, label = nil)
11
+ return nil if record.send(column.name).nil?
12
+ label||=as_(:download)
13
+ link_to( label, url_for_file_column(record, column.name.to_s), :popup => true)
14
+ end
15
+
16
+ def active_scaffold_column_thumbnail(column, record)
17
+ return nil if record.send(column.name).nil?
18
+ link_to(
19
+ image_tag(url_for_file_column(record, column.name.to_s, "thumb"), :border => 0),
20
+ url_for_file_column(record, column.name.to_s),
21
+ :popup => true)
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,43 @@
1
+ require File.join(File.dirname(__FILE__), "../test_helper.rb")
2
+
3
+ class DeleteFileColumnTest < Test::Unit::TestCase
4
+ def setup
5
+ DeleteFileColumn.generate_delete_helpers(MockModel)
6
+ @model = MockModel.new
7
+ @model.band_image = "coolio.jpg"
8
+ end
9
+
10
+ def test__file_column_fields
11
+ assert_equal(1, @model.file_column_fields.length)
12
+ end
13
+
14
+ def test__delete_band_image__boolean__should_delete
15
+ @model.delete_band_image = true
16
+ assert_nil @model.band_image
17
+ end
18
+
19
+ def test__delete_band_image__string__should_delete
20
+ @model.delete_band_image = "true"
21
+ assert_nil @model.band_image
22
+ end
23
+
24
+
25
+ def test__delete_band_image__boolean_false__shouldnt_delete
26
+ @model.delete_band_image = false
27
+ assert_not_nil @model.band_image
28
+ end
29
+
30
+ def test__delete_band_image__string_false__shouldnt_delete
31
+ @model.delete_band_image = "false"
32
+ assert_not_nil @model.band_image
33
+ end
34
+
35
+
36
+ def test__just_uploaded__shouldnt_delete
37
+ @model.band_image_just_uploaded = true
38
+ @model.delete_band_image = "true"
39
+ assert_not_nil(@model.band_image)
40
+ end
41
+
42
+
43
+ end
@@ -0,0 +1,9 @@
1
+ class MockModel
2
+ attr_accessor :name
3
+ attr_accessor :bio
4
+
5
+ attr_accessor :band_image
6
+ attr_accessor :band_image_just_uploaded
7
+ def band_image_just_uploaded?; self.band_image_just_uploaded ? true : false; end
8
+
9
+ end
@@ -0,0 +1,15 @@
1
+ require 'test/unit'
2
+ require "rubygems"
3
+ require 'active_support'
4
+
5
+ for file in ["../lib/delete_file_column.rb", "mock_model.rb"]
6
+ require File.expand_path(File.join(File.dirname(__FILE__), file))
7
+ end
8
+
9
+
10
+
11
+ def dbg
12
+ require 'ruby-debug'
13
+ Debugger.start
14
+ debugger
15
+ end
@@ -0,0 +1,11 @@
1
+ class ActiveScaffold::Bridges::FileColumn < ActiveScaffold::DataStructures::Bridge
2
+ def self.install
3
+ if ActiveScaffold::Config::Core.instance_methods.include?("initialize_with_file_column")
4
+ raise RuntimeError, "We've detected that you have active_scaffold_file_column_bridge installed. This plugin has been moved to core. Please remove active_scaffold_file_column_bridge to prevent any conflicts"
5
+ end
6
+ require File.join(File.dirname(__FILE__), "file_column/as_file_column_bridge")
7
+ require File.join(File.dirname(__FILE__), "file_column/form_ui")
8
+ require File.join(File.dirname(__FILE__), "file_column/list_ui")
9
+ require File.join(File.dirname(__FILE__), "file_column/file_column_helpers")
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ module FormColumnHelpers
4
+ def active_scaffold_input_paperclip(column, options)
5
+ options = active_scaffold_input_text_options(options)
6
+ input = file_field(:record, column.name, options)
7
+ paperclip = @record.send("#{column.name}")
8
+ if paperclip.file?
9
+ if ActiveScaffold.js_framework == :jquery
10
+ js_remove_file_code = "$(this).prev().val('true'); $(this).parent().hide().next().show(); return false;";
11
+ else
12
+ js_remove_file_code = "$(this).previous().value='true'; $(this).up().hide().next().show(); return false;";
13
+ end
14
+
15
+ content = active_scaffold_column_paperclip(column, @record)
16
+ content_tag(:div,
17
+ content + " | " +
18
+ hidden_field(:record, "delete_#{column.name}", :value => "false") +
19
+ content_tag(:a, as_(:remove_file), {:href => '#', :onclick => js_remove_file_code})
20
+ ) + content_tag(:div, input, :style => "display: none")
21
+ else
22
+ input
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ module ListColumnHelpers
4
+ def active_scaffold_column_paperclip(column, record)
5
+ paperclip = record.send("#{column.name}")
6
+ return nil unless paperclip.file?
7
+ content = if paperclip.styles.include?(ActiveScaffold::Bridges::Paperclip::PaperclipBridgeHelpers.thumbnail_style)
8
+ image_tag(paperclip.url(ActiveScaffold::Bridges::Paperclip::PaperclipBridgeHelpers.thumbnail_style), :border => 0)
9
+ else
10
+ paperclip.original_filename
11
+ end
12
+ link_to(content, paperclip.url, {'data-popup' => true, :target => '_blank'})
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ class Paperclip
4
+ module PaperclipBridge
5
+ def initialize_with_paperclip(model_id)
6
+ initialize_without_paperclip(model_id)
7
+ return unless self.model.respond_to?(:attachment_definitions) && !self.model.attachment_definitions.nil?
8
+
9
+ self.update.multipart = true
10
+ self.create.multipart = true
11
+
12
+ self.model.attachment_definitions.keys.each do |field|
13
+ configure_paperclip_field(field.to_sym)
14
+ # define the "delete" helper for use with active scaffold, unless it's already defined
15
+ ActiveScaffold::Bridges::Paperclip::PaperclipBridgeHelpers.generate_delete_helper(self.model, field)
16
+ end
17
+ end
18
+
19
+ def self.included(base)
20
+ base.alias_method_chain :initialize, :paperclip
21
+ end
22
+
23
+ private
24
+ def configure_paperclip_field(field)
25
+ self.columns << field
26
+ self.columns[field].form_ui ||= :paperclip
27
+ self.columns[field].params.add "delete_#{field}"
28
+
29
+ [:file_name, :content_type, :file_size, :updated_at].each do |f|
30
+ self.columns.exclude("#{field}_#{f}".to_sym)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ class Paperclip
4
+ module PaperclipBridgeHelpers
5
+ mattr_accessor :thumbnail_style
6
+ self.thumbnail_style = :thumbnail
7
+
8
+ def self.generate_delete_helper(klass, field)
9
+ klass.class_eval <<-EOF, __FILE__, __LINE__ + 1 unless klass.instance_methods.include?("delete_#{field}=")
10
+ attr_reader :delete_#{field}
11
+
12
+ def delete_#{field}=(value)
13
+ value = (value == "true") if String === value
14
+ return unless value
15
+
16
+ # passing nil to the file column causes the file to be deleted. Don't delete if we just uploaded a file!
17
+ self.#{field} = nil unless self.#{field}.dirty?
18
+ end
19
+ EOF
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end