active_scaffold_san 3.0.18

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 (284) hide show
  1. data/.autotest +27 -0
  2. data/.document +5 -0
  3. data/CHANGELOG +179 -0
  4. data/Gemfile +13 -0
  5. data/Gemfile.lock +20 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README +69 -0
  8. data/Rakefile +53 -0
  9. data/active_scaffold_vho.gemspec +388 -0
  10. data/frontends/default/images/add.gif +0 -0
  11. data/frontends/default/images/arrow_down.gif +0 -0
  12. data/frontends/default/images/arrow_up.gif +0 -0
  13. data/frontends/default/images/close.gif +0 -0
  14. data/frontends/default/images/config.png +0 -0
  15. data/frontends/default/images/cross.png +0 -0
  16. data/frontends/default/images/gears.png +0 -0
  17. data/frontends/default/images/indicator-small.gif +0 -0
  18. data/frontends/default/images/indicator.gif +0 -0
  19. data/frontends/default/images/magnifier.png +0 -0
  20. data/frontends/default/javascripts/jquery/active_scaffold.js +1004 -0
  21. data/frontends/default/javascripts/jquery/jquery.editinplace.js +743 -0
  22. data/frontends/default/javascripts/prototype/active_scaffold.js +1003 -0
  23. data/frontends/default/javascripts/prototype/dhtml_history.js +867 -0
  24. data/frontends/default/javascripts/prototype/form_enhancements.js +117 -0
  25. data/frontends/default/javascripts/prototype/rico_corner.js +370 -0
  26. data/frontends/default/stylesheets/stylesheet-ie.css +35 -0
  27. data/frontends/default/stylesheets/stylesheet.css +973 -0
  28. data/frontends/default/views/_action_group.html.erb +20 -0
  29. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  30. data/frontends/default/views/_base_form.html.erb +51 -0
  31. data/frontends/default/views/_create_form.html.erb +8 -0
  32. data/frontends/default/views/_create_form_on_list.html.erb +6 -0
  33. data/frontends/default/views/_field_search.html.erb +32 -0
  34. data/frontends/default/views/_form.html.erb +24 -0
  35. data/frontends/default/views/_form_association.html.erb +19 -0
  36. data/frontends/default/views/_form_association_footer.html.erb +40 -0
  37. data/frontends/default/views/_form_attribute.html.erb +15 -0
  38. data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
  39. data/frontends/default/views/_form_messages.html.erb +5 -0
  40. data/frontends/default/views/_horizontal_subform.html.erb +29 -0
  41. data/frontends/default/views/_horizontal_subform_header.html.erb +10 -0
  42. data/frontends/default/views/_horizontal_subform_record.html.erb +37 -0
  43. data/frontends/default/views/_human_conditions.html.erb +1 -0
  44. data/frontends/default/views/_list.html.erb +18 -0
  45. data/frontends/default/views/_list_actions.html.erb +15 -0
  46. data/frontends/default/views/_list_calculations.html.erb +16 -0
  47. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  48. data/frontends/default/views/_list_header.html.erb +10 -0
  49. data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
  50. data/frontends/default/views/_list_messages.html.erb +32 -0
  51. data/frontends/default/views/_list_pagination.html.erb +11 -0
  52. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  53. data/frontends/default/views/_list_record.html.erb +14 -0
  54. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  55. data/frontends/default/views/_list_with_header.html.erb +32 -0
  56. data/frontends/default/views/_messages.html.erb +10 -0
  57. data/frontends/default/views/_render_field.js.rjs +10 -0
  58. data/frontends/default/views/_row.html.erb +12 -0
  59. data/frontends/default/views/_search.html.erb +34 -0
  60. data/frontends/default/views/_search_attribute.html.erb +10 -0
  61. data/frontends/default/views/_show.html.erb +8 -0
  62. data/frontends/default/views/_show_columns.html.erb +15 -0
  63. data/frontends/default/views/_update_actions.html.erb +9 -0
  64. data/frontends/default/views/_update_form.html.erb +6 -0
  65. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  66. data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
  67. data/frontends/default/views/action_confirmation.html.erb +13 -0
  68. data/frontends/default/views/add_existing.js.rjs +17 -0
  69. data/frontends/default/views/add_existing_form.html.erb +5 -0
  70. data/frontends/default/views/create.html.erb +5 -0
  71. data/frontends/default/views/delete.html.erb +13 -0
  72. data/frontends/default/views/destroy.js.rjs +23 -0
  73. data/frontends/default/views/edit_associated.js.rjs +11 -0
  74. data/frontends/default/views/field_search.html.erb +5 -0
  75. data/frontends/default/views/form_messages.js.rjs +1 -0
  76. data/frontends/default/views/list.html.erb +1 -0
  77. data/frontends/default/views/list.js.rjs +1 -0
  78. data/frontends/default/views/on_action_update.js.rjs +8 -0
  79. data/frontends/default/views/on_create.js.rjs +41 -0
  80. data/frontends/default/views/on_mark_all.js.rjs +4 -0
  81. data/frontends/default/views/on_update.js.rjs +28 -0
  82. data/frontends/default/views/search.html.erb +5 -0
  83. data/frontends/default/views/show.html.erb +5 -0
  84. data/frontends/default/views/update.html.erb +8 -0
  85. data/frontends/default/views/update_column.js.rjs +13 -0
  86. data/frontends/default/views/update_row.js.rjs +1 -0
  87. data/init.rb +8 -0
  88. data/lib/active_scaffold.rb +360 -0
  89. data/lib/active_scaffold/actions/common_search.rb +22 -0
  90. data/lib/active_scaffold/actions/core.rb +180 -0
  91. data/lib/active_scaffold/actions/create.rb +149 -0
  92. data/lib/active_scaffold/actions/delete.rb +75 -0
  93. data/lib/active_scaffold/actions/field_search.rb +82 -0
  94. data/lib/active_scaffold/actions/list.rb +184 -0
  95. data/lib/active_scaffold/actions/mark.rb +63 -0
  96. data/lib/active_scaffold/actions/nested.rb +250 -0
  97. data/lib/active_scaffold/actions/search.rb +47 -0
  98. data/lib/active_scaffold/actions/show.rb +61 -0
  99. data/lib/active_scaffold/actions/subform.rb +27 -0
  100. data/lib/active_scaffold/actions/update.rb +151 -0
  101. data/lib/active_scaffold/active_record_permissions.rb +134 -0
  102. data/lib/active_scaffold/attribute_params.rb +211 -0
  103. data/lib/active_scaffold/bridges/ancestry/bridge.rb +5 -0
  104. data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +39 -0
  105. data/lib/active_scaffold/bridges/bridge.rb +59 -0
  106. data/lib/active_scaffold/bridges/calendar_date_select/bridge.rb +16 -0
  107. data/lib/active_scaffold/bridges/calendar_date_select/lib/as_cds_bridge.rb +83 -0
  108. data/lib/active_scaffold/bridges/cancan/bridge.rb +12 -0
  109. data/lib/active_scaffold/bridges/cancan/lib/cancan_bridge.rb +107 -0
  110. data/lib/active_scaffold/bridges/carrierwave/bridge.rb +9 -0
  111. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge.rb +33 -0
  112. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge_helpers.rb +12 -0
  113. data/lib/active_scaffold/bridges/carrierwave/lib/form_ui.rb +45 -0
  114. data/lib/active_scaffold/bridges/carrierwave/lib/list_ui.rb +17 -0
  115. data/lib/active_scaffold/bridges/date_picker/bridge.rb +24 -0
  116. data/lib/active_scaffold/bridges/date_picker/lib/datepicker_bridge.rb +225 -0
  117. data/lib/active_scaffold/bridges/date_picker/public/javascripts/date_picker_bridge.js +22 -0
  118. data/lib/active_scaffold/bridges/file_column/bridge.rb +11 -0
  119. data/lib/active_scaffold/bridges/file_column/lib/as_file_column_bridge.rb +46 -0
  120. data/lib/active_scaffold/bridges/file_column/lib/file_column_helpers.rb +59 -0
  121. data/lib/active_scaffold/bridges/file_column/lib/form_ui.rb +37 -0
  122. data/lib/active_scaffold/bridges/file_column/lib/list_ui.rb +26 -0
  123. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  124. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  125. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  126. data/lib/active_scaffold/bridges/paperclip/bridge.rb +12 -0
  127. data/lib/active_scaffold/bridges/paperclip/lib/form_ui.rb +27 -0
  128. data/lib/active_scaffold/bridges/paperclip/lib/list_ui.rb +16 -0
  129. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge.rb +38 -0
  130. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge_helpers.rb +26 -0
  131. data/lib/active_scaffold/bridges/semantic_attributes/bridge.rb +5 -0
  132. data/lib/active_scaffold/bridges/semantic_attributes/lib/semantic_attributes_bridge.rb +20 -0
  133. data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
  134. data/lib/active_scaffold/bridges/tiny_mce/bridge.rb +5 -0
  135. data/lib/active_scaffold/bridges/tiny_mce/lib/tiny_mce_bridge.rb +61 -0
  136. data/lib/active_scaffold/bridges/validation_reflection/bridge.rb +8 -0
  137. data/lib/active_scaffold/bridges/validation_reflection/lib/validation_reflection_bridge.rb +21 -0
  138. data/lib/active_scaffold/config/base.rb +62 -0
  139. data/lib/active_scaffold/config/core.rb +220 -0
  140. data/lib/active_scaffold/config/create.rb +51 -0
  141. data/lib/active_scaffold/config/delete.rb +34 -0
  142. data/lib/active_scaffold/config/field_search.rb +75 -0
  143. data/lib/active_scaffold/config/form.rb +47 -0
  144. data/lib/active_scaffold/config/list.rb +174 -0
  145. data/lib/active_scaffold/config/mark.rb +22 -0
  146. data/lib/active_scaffold/config/nested.rb +44 -0
  147. data/lib/active_scaffold/config/search.rb +69 -0
  148. data/lib/active_scaffold/config/show.rb +35 -0
  149. data/lib/active_scaffold/config/subform.rb +35 -0
  150. data/lib/active_scaffold/config/update.rb +46 -0
  151. data/lib/active_scaffold/configurable.rb +29 -0
  152. data/lib/active_scaffold/constraints.rb +184 -0
  153. data/lib/active_scaffold/data_structures/action_columns.rb +137 -0
  154. data/lib/active_scaffold/data_structures/action_link.rb +175 -0
  155. data/lib/active_scaffold/data_structures/action_links.rb +185 -0
  156. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  157. data/lib/active_scaffold/data_structures/column.rb +355 -0
  158. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  159. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  160. data/lib/active_scaffold/data_structures/nested_info.rb +123 -0
  161. data/lib/active_scaffold/data_structures/set.rb +62 -0
  162. data/lib/active_scaffold/data_structures/sorting.rb +168 -0
  163. data/lib/active_scaffold/extensions/action_controller_rendering.rb +20 -0
  164. data/lib/active_scaffold/extensions/action_view_rendering.rb +123 -0
  165. data/lib/active_scaffold/extensions/action_view_resolver.rb +7 -0
  166. data/lib/active_scaffold/extensions/active_association_reflection.rb +13 -0
  167. data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
  168. data/lib/active_scaffold/extensions/array.rb +7 -0
  169. data/lib/active_scaffold/extensions/localize.rb +10 -0
  170. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
  171. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
  172. data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
  173. data/lib/active_scaffold/extensions/reverse_associations.rb +62 -0
  174. data/lib/active_scaffold/extensions/routing_mapper.rb +34 -0
  175. data/lib/active_scaffold/extensions/to_label.rb +8 -0
  176. data/lib/active_scaffold/extensions/unsaved_associated.rb +61 -0
  177. data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
  178. data/lib/active_scaffold/extensions/usa_state.rb +46 -0
  179. data/lib/active_scaffold/finder.rb +343 -0
  180. data/lib/active_scaffold/helpers/association_helpers.rb +40 -0
  181. data/lib/active_scaffold/helpers/controller_helpers.rb +87 -0
  182. data/lib/active_scaffold/helpers/country_helpers.rb +352 -0
  183. data/lib/active_scaffold/helpers/form_column_helpers.rb +350 -0
  184. data/lib/active_scaffold/helpers/human_condition_helpers.rb +59 -0
  185. data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
  186. data/lib/active_scaffold/helpers/list_column_helpers.rb +361 -0
  187. data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
  188. data/lib/active_scaffold/helpers/search_column_helpers.rb +249 -0
  189. data/lib/active_scaffold/helpers/show_column_helpers.rb +46 -0
  190. data/lib/active_scaffold/helpers/view_helpers.rb +360 -0
  191. data/lib/active_scaffold/locale/de.rb +120 -0
  192. data/lib/active_scaffold/locale/en.rb +119 -0
  193. data/lib/active_scaffold/locale/es.yml +115 -0
  194. data/lib/active_scaffold/locale/fr.rb +122 -0
  195. data/lib/active_scaffold/locale/hu.yml +63 -0
  196. data/lib/active_scaffold/locale/ja.yml +64 -0
  197. data/lib/active_scaffold/locale/ru.yml +119 -0
  198. data/lib/active_scaffold/marked_model.rb +38 -0
  199. data/lib/active_scaffold/paginator.rb +136 -0
  200. data/lib/active_scaffold/responds_to_parent.rb +70 -0
  201. data/lib/active_scaffold/version.rb +9 -0
  202. data/lib/active_scaffold_assets.rb +45 -0
  203. data/lib/active_scaffold_env.rb +14 -0
  204. data/lib/active_scaffold_vho.rb +2 -0
  205. data/lib/generators/active_scaffold/USAGE +29 -0
  206. data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
  207. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  208. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
  209. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  210. data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
  211. data/lib/generators/active_scaffold_setup/USAGE +10 -0
  212. data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +61 -0
  213. data/public/blank.html +33 -0
  214. data/shoulda_macros/macros.rb +136 -0
  215. data/test/bridges/bridge_test.rb +47 -0
  216. data/test/config/base_test.rb +15 -0
  217. data/test/config/create_test.rb +55 -0
  218. data/test/config/list_test.rb +74 -0
  219. data/test/config/show_test.rb +43 -0
  220. data/test/config/update_test.rb +17 -0
  221. data/test/const_mocker.rb +36 -0
  222. data/test/data_structures/action_columns_test.rb +113 -0
  223. data/test/data_structures/action_link_test.rb +78 -0
  224. data/test/data_structures/action_links_test.rb +78 -0
  225. data/test/data_structures/actions_test.rb +25 -0
  226. data/test/data_structures/association_column_test.rb +42 -0
  227. data/test/data_structures/column_test.rb +185 -0
  228. data/test/data_structures/columns_test.rb +69 -0
  229. data/test/data_structures/error_message_test.rb +28 -0
  230. data/test/data_structures/set_test.rb +86 -0
  231. data/test/data_structures/sorting_test.rb +126 -0
  232. data/test/data_structures/standard_column_test.rb +24 -0
  233. data/test/data_structures/virtual_column_test.rb +23 -0
  234. data/test/extensions/active_record_test.rb +45 -0
  235. data/test/extensions/array_test.rb +12 -0
  236. data/test/helpers/form_column_helpers_test.rb +31 -0
  237. data/test/helpers/list_column_helpers_test.rb +31 -0
  238. data/test/helpers/pagination_helpers_test.rb +55 -0
  239. data/test/misc/active_record_permissions_test.rb +154 -0
  240. data/test/misc/attribute_params_test.rb +110 -0
  241. data/test/misc/configurable_test.rb +96 -0
  242. data/test/misc/constraints_test.rb +193 -0
  243. data/test/misc/finder_test.rb +93 -0
  244. data/test/misc/lang_test.rb +12 -0
  245. data/test/mock_app/.gitignore +2 -0
  246. data/test/mock_app/app/controllers/application_controller.rb +10 -0
  247. data/test/mock_app/app/helpers/application_helper.rb +3 -0
  248. data/test/mock_app/config/boot.rb +110 -0
  249. data/test/mock_app/config/database.yml +16 -0
  250. data/test/mock_app/config/environment.rb +43 -0
  251. data/test/mock_app/config/environments/development.rb +17 -0
  252. data/test/mock_app/config/environments/production.rb +28 -0
  253. data/test/mock_app/config/environments/test.rb +28 -0
  254. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  255. data/test/mock_app/config/initializers/inflections.rb +10 -0
  256. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  257. data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
  258. data/test/mock_app/config/initializers/session_store.rb +15 -0
  259. data/test/mock_app/config/locales/en.yml +5 -0
  260. data/test/mock_app/config/routes.rb +43 -0
  261. data/test/mock_app/db/test.sqlite3 +1 -0
  262. data/test/mock_app/public/blank.html +33 -0
  263. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  264. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  265. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  266. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  267. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  268. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  269. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  270. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  271. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  272. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  273. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
  274. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  275. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
  276. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  277. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  278. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  279. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +842 -0
  280. data/test/model_stub.rb +55 -0
  281. data/test/run_all.rb +8 -0
  282. data/test/test_helper.rb +39 -0
  283. data/uninstall.rb +13 -0
  284. metadata +497 -0
@@ -0,0 +1,5 @@
1
+ ActiveScaffold::Bridges.bridge "Ancestry" do
2
+ install do
3
+ require File.join(File.dirname(__FILE__), "lib/ancestry_bridge.rb")
4
+ end
5
+ end
@@ -0,0 +1,39 @@
1
+ ActiveScaffold::Config::Core.class_eval do
2
+ def initialize_with_ancestry(model_id)
3
+ initialize_without_ancestry(model_id)
4
+
5
+ return unless self.model.respond_to? :ancestry_column
6
+
7
+ self.columns << :parent_id
8
+ self.columns[:parent_id].form_ui = :ancestry
9
+ update.columns.exclude :ancestry
10
+ create.columns.exclude :ancestry, :parent_id
11
+ list.columns.exclude :ancestry, :parent_id
12
+ end
13
+
14
+ alias_method_chain :initialize, :ancestry
15
+ end
16
+
17
+ module ActiveScaffold
18
+ module AncestryBridge
19
+ module FormColumnHelpers
20
+ def active_scaffold_input_ancestry(column, options)
21
+ select_options = []
22
+ select_control_options = {:selected => @record.parent_id}
23
+ select_control_options[:include_blank] = as_(:_select_) if @record.parent_id.nil?
24
+ traverse_ancestry = proc do|key, value|
25
+ unless key == @record
26
+ select_options << ["#{'__' * key.depth}#{key.to_label}", key.id]
27
+ value.each(&traverse_ancestry) if value.is_a?(Hash) && !value.empty?
28
+ end
29
+ end
30
+ @record.class.arrange.each(&traverse_ancestry)
31
+ select(:record, :ancestry, select_options, select_control_options, options)
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ ActionView::Base.class_eval do
38
+ include ActiveScaffold::AncestryBridge::FormColumnHelpers
39
+ end
@@ -0,0 +1,59 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ def self.bridge(name, &block)
4
+ ActiveScaffold::Bridges::Bridge.new(name, &block)
5
+ end
6
+
7
+ class Bridge
8
+ attr_accessor :name
9
+ cattr_accessor :bridges
10
+ cattr_accessor :bridges_run
11
+ self.bridges = []
12
+
13
+ def initialize(name, &block)
14
+ self.name = name
15
+ @install = nil
16
+ # by convention and default, use the bridge name as the required constant for installation
17
+ @install_if = lambda { Object.const_defined?(name) }
18
+ self.instance_eval(&block)
19
+
20
+ ActiveScaffold::Bridges::Bridge.bridges << self
21
+ end
22
+
23
+ # Set the install block
24
+ def install(&block)
25
+ @install = block
26
+ end
27
+
28
+ # Set the install_if block (to check to see whether or not to install the block)
29
+ def install?(&block)
30
+ @install_if = block
31
+ end
32
+
33
+
34
+ def run
35
+ raise(ArgumentError, "install and install? not defined for bridge #{name}" ) unless @install && @install_if
36
+ @install.call if @install_if.call
37
+ end
38
+
39
+ def self.run_all
40
+ return false if self.bridges_run
41
+ ActiveScaffold::Bridges::Bridge.bridges.each{|bridge|
42
+ bridge.run
43
+ }
44
+ self.bridges_run=true
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ require File.join(File.dirname(__FILE__), 'shared', 'date_bridge.rb')
51
+ Dir[File.join(File.dirname(__FILE__), "*/bridge.rb")].each{|bridge_require|
52
+ load_bridge = true
53
+ unless ActiveScaffold.exclude_bridges.empty?
54
+ match = bridge_require.match('bridges\/(.*)\/bridge.rb')
55
+ bridge_name = match[1] ? match[1] : nil
56
+ load_bridge = ActiveScaffold.exclude_bridges.exclude?(bridge_name.to_sym) if bridge_name
57
+ end
58
+ require bridge_require if load_bridge == true
59
+ }
@@ -0,0 +1,16 @@
1
+ ActiveScaffold::Bridges.bridge "CalendarDateSelect" do
2
+ install do
3
+ # check to see if the old bridge was installed. If so, warn them
4
+ # we can detect this by checking to see if the bridge was installed before calling this code
5
+
6
+ if ActiveScaffold::Config::Core.instance_methods.include?("initialize_with_calendar_date_select")
7
+ raise RuntimeError, "We've detected that you have active_scaffold_calendar_date_select_bridge installed. This plugin has been moved to core. Please remove active_scaffold_calendar_date_select_bridge to prevent any conflicts"
8
+ end
9
+
10
+ require File.join(File.dirname(__FILE__), "lib/as_cds_bridge.rb")
11
+ end
12
+
13
+ install? do
14
+ Object.const_defined?(name) && ActiveScaffold.js_framework == :prototype
15
+ end
16
+ end
@@ -0,0 +1,83 @@
1
+ module ActiveScaffold::Config
2
+ class Core < Base
3
+
4
+ def initialize_with_calendar_date_select(model_id)
5
+ initialize_without_calendar_date_select(model_id)
6
+
7
+ calendar_date_select_fields = self.model.columns.collect{|c| c.name.to_sym if [:date, :datetime].include?(c.type) }.compact
8
+ # check to see if file column was used on the model
9
+ return if calendar_date_select_fields.empty?
10
+
11
+ # automatically set the forum_ui to a file column
12
+ calendar_date_select_fields.each{|field|
13
+ self.columns[field].form_ui = :calendar_date_select
14
+ }
15
+ end
16
+
17
+ alias_method_chain :initialize, :calendar_date_select
18
+
19
+ end
20
+ end
21
+
22
+
23
+ module ActiveScaffold
24
+ module Bridges
25
+ module CalendarDateSelectBridge
26
+ # Helpers that assist with the rendering of a Form Column
27
+ module FormColumnHelpers
28
+ def active_scaffold_input_calendar_date_select(column, options)
29
+ options[:class] = "#{options[:class]} text-input".strip
30
+ calendar_date_select("record", column.name, options.merge(column.options))
31
+ end
32
+ end
33
+
34
+ module SearchColumnHelpers
35
+ def active_scaffold_search_date_bridge_calendar_control(column, options, current_search, name)
36
+ if current_search.is_a? Hash
37
+ value = controller.class.condition_value_for_datetime(current_search[name], column.column.type == :date ? :to_date : :to_time)
38
+ else
39
+ value = current_search
40
+ end
41
+ calendar_date_select("record", column.name,
42
+ {:name => "#{options[:name]}[#{name}]",
43
+ :value => (value ? l(value) : nil),
44
+ :class => 'text-input',
45
+ :id => "#{options[:id]}_#{name}",
46
+ :time => column_datetime?(column) ? true : false,
47
+ :style => "display:#{(options[:show].nil? || options[:show]) ? '' : 'none'}"})
48
+ end
49
+ end
50
+
51
+ module ViewHelpers
52
+ def self.included(base)
53
+ base.alias_method_chain :active_scaffold_stylesheets, :calendar_date_select
54
+ base.alias_method_chain :active_scaffold_javascripts, :calendar_date_select
55
+ end
56
+ # Provides stylesheets to include with +stylesheet_link_tag+
57
+ def active_scaffold_stylesheets_with_calendar_date_select(frontend = :default)
58
+ active_scaffold_stylesheets_without_calendar_date_select + [calendar_date_select_stylesheets]
59
+ end
60
+
61
+ # Provides stylesheets to include with +stylesheet_link_tag+
62
+ def active_scaffold_javascripts_with_calendar_date_select(frontend = :default)
63
+ active_scaffold_javascripts_without_calendar_date_select + [calendar_date_select_javascripts]
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ ActionView::Base.class_eval do
71
+ include ActiveScaffold::Bridges::CalendarDateSelectBridge::FormColumnHelpers
72
+ include ActiveScaffold::Bridges::Shared::DateBridge::SearchColumnHelpers
73
+ alias_method :active_scaffold_search_calendar_date_select, :active_scaffold_search_date_bridge
74
+ include ActiveScaffold::Bridges::Shared::DateBridge::HumanConditionHelpers
75
+ alias_method :active_scaffold_human_condition_calendar_date_select, :active_scaffold_human_condition_date_bridge
76
+ include ActiveScaffold::Bridges::CalendarDateSelectBridge::SearchColumnHelpers
77
+ include ActiveScaffold::Bridges::CalendarDateSelectBridge::ViewHelpers
78
+ end
79
+
80
+ ActiveScaffold::Finder::ClassMethods.module_eval do
81
+ include ActiveScaffold::Bridges::Shared::DateBridge::Finder::ClassMethods
82
+ alias_method :condition_for_calendar_date_select_type, :condition_for_date_bridge_type
83
+ end
@@ -0,0 +1,12 @@
1
+ ActiveScaffold::Bridges.bridge "CanCan" do
2
+ install do
3
+ require File.join(File.dirname(__FILE__), "lib", "cancan_bridge.rb")
4
+
5
+ ActiveScaffold::ClassMethods.send :include, ActiveScaffold::CancanBridge::ClassMethods
6
+ ActiveScaffold::Actions::Core.send :include, ActiveScaffold::CancanBridge::Actions::Core
7
+ ActiveScaffold::Actions::Nested.send :include, ActiveScaffold::CancanBridge::Actions::Core
8
+ ActionController::Base.send :include, ActiveScaffold::CancanBridge::ModelUserAccess::Controller
9
+ ActiveRecord::Base.send :include, ActiveScaffold::CancanBridge::ModelUserAccess::Model
10
+ ActiveRecord::Base.send :include, ActiveScaffold::CancanBridge::ActiveRecord
11
+ end
12
+ end
@@ -0,0 +1,107 @@
1
+ module ActiveScaffold
2
+ module CancanBridge
3
+
4
+ # controller level authorization
5
+ # As already has callbacks to ensure authorization at controller method via "authorization_method"
6
+ # but let's include this too, just in case, no sure how performance is affected tough :TODO benchmark
7
+ module ClassMethods
8
+ extend ActiveSupport::Concern
9
+ included do
10
+ alias_method_chain :active_scaffold, :cancan
11
+ end
12
+
13
+ def active_scaffold_with_cancan(model_id = nil, &block)
14
+ active_scaffold_without_cancan(model_id, &block)
15
+ authorize_resource(
16
+ :class => active_scaffold_config.model,
17
+ :instance => :record
18
+ )
19
+ end
20
+ end
21
+
22
+ # beginning of chain integration
23
+ module Actions
24
+ module Core
25
+ extend ActiveSupport::Concern
26
+ included do
27
+ alias_method_chain :beginning_of_chain, :cancan
28
+ end
29
+ # :TODO can this be expanded more ?
30
+ def beginning_of_chain_with_cancan
31
+ beginning_of_chain_without_cancan.accessible_by(current_ability)
32
+ end
33
+ end
34
+ end
35
+
36
+ # This is a module aimed at making the current_ability available to ActiveRecord models for permissions.
37
+ module ModelUserAccess
38
+ module Controller
39
+ extend ActiveSupport::Concern
40
+ included do
41
+ prepend_before_filter :assign_current_ability_to_models
42
+ end
43
+
44
+ # We need to give the ActiveRecord classes a handle to the current ability. We don't want to just pass the object,
45
+ # because the object may change (someone may log in or out). So we give ActiveRecord a proc that ties to the
46
+ # current_ability_method on this ApplicationController.
47
+ def assign_current_ability_to_models
48
+ ::ActiveRecord::Base.current_ability_proc = proc {send(:current_ability)}
49
+ end
50
+ end
51
+
52
+ module Model
53
+ extend ActiveSupport::Concern
54
+
55
+ module ClassMethods
56
+ # The proc to call that retrieves the current_ability from the ApplicationController.
57
+ attr_accessor :current_ability_proc
58
+
59
+ # Class-level access to the current ability
60
+ def current_ability
61
+ ::ActiveRecord::Base.current_ability_proc.call if ::ActiveRecord::Base.current_ability_proc
62
+ end
63
+ end
64
+
65
+ # Instance-level access to the current ability
66
+ def current_ability; self.class.current_ability end
67
+ end
68
+ end
69
+
70
+
71
+ # plug into AS#authorized_for calls
72
+ module ActiveRecord
73
+ extend ActiveSupport::Concern
74
+ included do
75
+ extend SecurityMethods
76
+ include SecurityMethods
77
+ alias_method_chain :authorized_for?, :cancan
78
+ class << self
79
+ alias_method_chain :authorized_for?, :cancan
80
+ end
81
+ end
82
+
83
+ module SecurityMethods
84
+ class InvalidArgument < StandardError; end
85
+
86
+ # is usually called with :crud_type and :column, or :action
87
+ # {:crud_type=>:update, :column=>"some_colum_name"}
88
+ # {:action=>"edit"}
89
+ # to allow access cancan must allow both :crud_type and :action
90
+ # if cancan says "no", it delegates to default AS behavior
91
+ def authorized_for_with_cancan?(options = {})
92
+ raise InvalidArgument if options[:crud_type].blank? and options[:action].blank?
93
+ if current_ability.present?
94
+ crud_type_result = options[:crud_type].nil? ? true : current_ability.can?(options[:crud_type], self)
95
+ action_result = options[:action].nil? ? true : current_ability.can?(options[:action].to_sym, self)
96
+ else
97
+ crud_type_result, action_result = false, false
98
+ end
99
+ default_result = authorized_for_without_cancan?(options)
100
+ result = (crud_type_result && action_result) || default_result
101
+ return result
102
+ end
103
+ end
104
+ end
105
+
106
+ end
107
+ end
@@ -0,0 +1,9 @@
1
+ ActiveScaffold::Bridges.bridge "CarrierWave" do
2
+ install do
3
+ require File.join(File.dirname(__FILE__), "lib/form_ui")
4
+ require File.join(File.dirname(__FILE__), "lib/list_ui")
5
+ require File.join(File.dirname(__FILE__), "lib/carrierwave_bridge_helpers")
6
+ require File.join(File.dirname(__FILE__), "lib/carrierwave_bridge")
7
+ ActiveScaffold::Config::Core.send :include, ActiveScaffold::Bridges::Carrierwave::Lib::CarrierwaveBridge
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ module Carrierwave
4
+ module Lib
5
+ module CarrierwaveBridge
6
+ def initialize_with_carrierwave(model_id)
7
+ initialize_without_carrierwave(model_id)
8
+ return unless self.model.respond_to?(:uploaders) && self.model.uploaders.present?
9
+
10
+ self.update.multipart = true
11
+ self.create.multipart = true
12
+
13
+ self.model.uploaders.keys.each do |field|
14
+ configure_carrierwave_field(field.to_sym)
15
+ end
16
+ end
17
+
18
+ def self.included(base)
19
+ base.alias_method_chain :initialize, :carrierwave
20
+ end
21
+
22
+ private
23
+ def configure_carrierwave_field(field)
24
+ self.columns << field
25
+ self.columns[field].form_ui ||= :carrierwave # :TODO thumbnail
26
+ self.columns[field].params.add "#{field}_cache"
27
+ self.columns[field].params.add "remove_#{field}"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,12 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ module Carrierwave
4
+ module Lib
5
+ module CarrierwaveBridgeHelpers
6
+ mattr_accessor :thumbnail_style
7
+ self.thumbnail_style = :thumbnail
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,45 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ module FormColumnHelpers
4
+ def active_scaffold_input_carrierwave(column, options)
5
+ options = active_scaffold_input_text_options(options)
6
+ carrierwave = @record.send("#{column.name}")
7
+ if !carrierwave.file.blank?
8
+
9
+ remove_field_options = {
10
+ :name => options[:name].gsub(/\[#{column.name}\]$/, "[remove_#{column.name}]"),
11
+ :id => 'remove_' + options[:id],
12
+ :value => false
13
+ }
14
+
15
+ cache_field_options = {
16
+ :name => options[:name].gsub(/\[#{column.name}\]$/, "[#{column.name}_cache]"),
17
+ :id => options[:id] + '_cache'
18
+ }
19
+
20
+ if ActiveScaffold.js_framework == :jquery
21
+ js_remove_file_code = "$(this).prev('input#remove_#{options[:id]}').val('true'); $(this).parent().hide().next().show(); return false;";
22
+ js_dont_remove_file_code = "$(this).parents('div.carrierwave_controls').find('input#remove_#{options[:id]}').val('false'); return false;";
23
+ else
24
+ js_remove_file_code = "$(this).previous('input#remove_#{options[:id]}').value='true'; $(this).up().hide().next().show(); return false;";
25
+ js_dont_remove_file_code = "$(this).up('div.carrierwave_controls').down('input#remove_#{options[:id]}').value='false'; return false;";
26
+ end
27
+
28
+ input = file_field(:record, column.name, options.merge(:onchange => js_dont_remove_file_code))
29
+ content_tag( :div,
30
+ content_tag(:div, (
31
+ get_column_value(@record, column) + " | " +
32
+ hidden_field(:record, "#{column.name}_cache", cache_field_options) +
33
+ hidden_field(:record, "remove_#{column.name}", remove_field_options) +
34
+ content_tag(:a, as_(:remove_file), {:href => '#', :onclick => js_remove_file_code})
35
+ ).html_safe
36
+ ) + content_tag(:div, input, :style => "display: none"),
37
+ :class => 'carrierwave_controls'
38
+ )
39
+ else
40
+ file_field(:record, column.name, options)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ module ListColumnHelpers
4
+ def active_scaffold_column_carrierwave(column, record)
5
+ carrierwave = record.send("#{column.name}")
6
+ return nil unless !carrierwave.file.blank?
7
+ thumbnail_style = ActiveScaffold::Bridges::Carrierwave::Lib::CarrierwaveBridgeHelpers.thumbnail_style
8
+ content = if carrierwave.versions.keys.include?(thumbnail_style)
9
+ image_tag(carrierwave.url(thumbnail_style), :border => 0).html_safe
10
+ else
11
+ record.send(record.send(:_mounter, column.name).send(:serialization_column))
12
+ end
13
+ link_to(content, carrierwave.url, :target => '_blank')
14
+ end
15
+ end
16
+ end
17
+ end