active_scaffold 3.2.18 → 3.2.19

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 (246) hide show
  1. data/CHANGELOG +3 -0
  2. data/app/assets/images/active_scaffold/add.png +0 -0
  3. data/app/assets/images/active_scaffold/arrow_down.png +0 -0
  4. data/app/assets/images/active_scaffold/arrow_up.png +0 -0
  5. data/app/assets/images/active_scaffold/close.png +0 -0
  6. data/app/assets/images/active_scaffold/close_touch.png +0 -0
  7. data/app/assets/images/active_scaffold/config.png +0 -0
  8. data/app/assets/images/active_scaffold/cross.png +0 -0
  9. data/app/assets/images/active_scaffold/gears.png +0 -0
  10. data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
  11. data/app/assets/images/active_scaffold/indicator.gif +0 -0
  12. data/app/assets/images/active_scaffold/magnifier.png +0 -0
  13. data/app/assets/javascripts/active_scaffold.js.erb +19 -0
  14. data/app/assets/javascripts/jquery/active_scaffold.js +1113 -0
  15. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +24 -0
  16. data/app/assets/javascripts/jquery/draggable_lists.js +27 -0
  17. data/app/assets/javascripts/jquery/jquery.editinplace.js +743 -0
  18. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +7 -0
  19. data/app/assets/javascripts/prototype/active_scaffold.js +1107 -0
  20. data/app/assets/javascripts/prototype/dhtml_history.js +870 -0
  21. data/app/assets/javascripts/prototype/form_enhancements.js +117 -0
  22. data/app/assets/javascripts/prototype/rico_corner.js +370 -0
  23. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +7 -0
  24. data/app/assets/stylesheets/active_scaffold-ie.css.scss +54 -0
  25. data/app/assets/stylesheets/active_scaffold.css.scss +14 -0
  26. data/app/assets/stylesheets/active_scaffold_colors.css.scss +395 -0
  27. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
  28. data/app/assets/stylesheets/active_scaffold_images.css.scss +40 -0
  29. data/app/assets/stylesheets/active_scaffold_layout.css +936 -0
  30. data/app/assets/stylesheets/blue-theme.css +74 -0
  31. data/config/locales/de.yml +125 -0
  32. data/config/locales/en.yml +127 -0
  33. data/config/locales/es.yml +128 -0
  34. data/config/locales/fr.yml +131 -0
  35. data/config/locales/hu.yml +126 -0
  36. data/config/locales/ja.yml +126 -0
  37. data/config/locales/ru.yml +135 -0
  38. data/frontends/default/views/_action_group.html.erb +24 -0
  39. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  40. data/frontends/default/views/_base_form.html.erb +53 -0
  41. data/frontends/default/views/_create_form.html.erb +8 -0
  42. data/frontends/default/views/_create_form_on_list.html.erb +6 -0
  43. data/frontends/default/views/_field_search.html.erb +32 -0
  44. data/frontends/default/views/_form.html.erb +28 -0
  45. data/frontends/default/views/_form_association.html.erb +17 -0
  46. data/frontends/default/views/_form_association_footer.html.erb +47 -0
  47. data/frontends/default/views/_form_attribute.html.erb +23 -0
  48. data/frontends/default/views/_form_hidden_attribute.html.erb +7 -0
  49. data/frontends/default/views/_form_messages.html.erb +5 -0
  50. data/frontends/default/views/_horizontal_subform.html.erb +22 -0
  51. data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
  52. data/frontends/default/views/_horizontal_subform_header.html.erb +11 -0
  53. data/frontends/default/views/_horizontal_subform_record.html.erb +43 -0
  54. data/frontends/default/views/_human_conditions.html.erb +1 -0
  55. data/frontends/default/views/_list.html.erb +18 -0
  56. data/frontends/default/views/_list_actions.html.erb +15 -0
  57. data/frontends/default/views/_list_calculations.html.erb +16 -0
  58. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  59. data/frontends/default/views/_list_header.html.erb +10 -0
  60. data/frontends/default/views/_list_inline_adapter.html.erb +21 -0
  61. data/frontends/default/views/_list_messages.html.erb +28 -0
  62. data/frontends/default/views/_list_pagination.html.erb +11 -0
  63. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  64. data/frontends/default/views/_list_record.html.erb +13 -0
  65. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  66. data/frontends/default/views/_list_with_header.html.erb +36 -0
  67. data/frontends/default/views/_messages.html.erb +10 -0
  68. data/frontends/default/views/_refresh_list.js.erb +1 -0
  69. data/frontends/default/views/_render_field.js.erb +20 -0
  70. data/frontends/default/views/_row.html.erb +1 -0
  71. data/frontends/default/views/_search.html.erb +34 -0
  72. data/frontends/default/views/_search_attribute.html.erb +10 -0
  73. data/frontends/default/views/_show.html.erb +8 -0
  74. data/frontends/default/views/_show_columns.html.erb +15 -0
  75. data/frontends/default/views/_update_actions.html.erb +9 -0
  76. data/frontends/default/views/_update_calculations.js.erb +4 -0
  77. data/frontends/default/views/_update_form.html.erb +6 -0
  78. data/frontends/default/views/_update_messages.js.erb +2 -0
  79. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  80. data/frontends/default/views/_vertical_subform_record.html.erb +43 -0
  81. data/frontends/default/views/action_confirmation.html.erb +13 -0
  82. data/frontends/default/views/add_existing.js.erb +14 -0
  83. data/frontends/default/views/add_existing_form.html.erb +5 -0
  84. data/frontends/default/views/create.html.erb +5 -0
  85. data/frontends/default/views/delete.html.erb +13 -0
  86. data/frontends/default/views/destroy.js.erb +26 -0
  87. data/frontends/default/views/edit_associated.js.erb +12 -0
  88. data/frontends/default/views/field_search.html.erb +5 -0
  89. data/frontends/default/views/form_messages.js.erb +1 -0
  90. data/frontends/default/views/list.html.erb +1 -0
  91. data/frontends/default/views/on_action_update.js.erb +22 -0
  92. data/frontends/default/views/on_create.js.erb +38 -0
  93. data/frontends/default/views/on_mark.js.erb +6 -0
  94. data/frontends/default/views/on_update.js.erb +29 -0
  95. data/frontends/default/views/refresh_list.js.erb +2 -0
  96. data/frontends/default/views/render_field.js.erb +1 -0
  97. data/frontends/default/views/row.js.erb +2 -0
  98. data/frontends/default/views/search.html.erb +5 -0
  99. data/frontends/default/views/show.html.erb +5 -0
  100. data/frontends/default/views/update.html.erb +8 -0
  101. data/frontends/default/views/update_column.js.erb +15 -0
  102. data/frontends/default/views/update_row.js.erb +1 -0
  103. data/lib/active_scaffold/actions/common_search.rb +22 -0
  104. data/lib/active_scaffold/actions/core.rb +203 -0
  105. data/lib/active_scaffold/actions/create.rb +139 -0
  106. data/lib/active_scaffold/actions/delete.rb +74 -0
  107. data/lib/active_scaffold/actions/field_search.rb +78 -0
  108. data/lib/active_scaffold/actions/list.rb +208 -0
  109. data/lib/active_scaffold/actions/mark.rb +89 -0
  110. data/lib/active_scaffold/actions/nested.rb +244 -0
  111. data/lib/active_scaffold/actions/search.rb +48 -0
  112. data/lib/active_scaffold/actions/show.rb +61 -0
  113. data/lib/active_scaffold/actions/subform.rb +23 -0
  114. data/lib/active_scaffold/actions/update.rb +156 -0
  115. data/lib/active_scaffold/active_record_permissions.rb +135 -0
  116. data/lib/active_scaffold/attribute_params.rb +200 -0
  117. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +39 -0
  118. data/lib/active_scaffold/bridges/ancestry.rb +5 -0
  119. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +37 -0
  120. data/lib/active_scaffold/bridges/bitfields.rb +6 -0
  121. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +66 -0
  122. data/lib/active_scaffold/bridges/calendar_date_select.rb +24 -0
  123. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +127 -0
  124. data/lib/active_scaffold/bridges/cancan.rb +15 -0
  125. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +31 -0
  126. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +10 -0
  127. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +45 -0
  128. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +17 -0
  129. data/lib/active_scaffold/bridges/carrierwave.rb +12 -0
  130. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +358 -0
  131. data/lib/active_scaffold/bridges/country_helper.rb +9 -0
  132. data/lib/active_scaffold/bridges/date_picker/ext.rb +63 -0
  133. data/lib/active_scaffold/bridges/date_picker/helper.rb +180 -0
  134. data/lib/active_scaffold/bridges/date_picker.rb +23 -0
  135. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +34 -0
  136. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +10 -0
  137. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +27 -0
  138. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +16 -0
  139. data/lib/active_scaffold/bridges/dragonfly.rb +9 -0
  140. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +46 -0
  141. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +57 -0
  142. data/lib/active_scaffold/bridges/file_column/form_ui.rb +34 -0
  143. data/lib/active_scaffold/bridges/file_column/list_ui.rb +26 -0
  144. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  145. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  146. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  147. data/lib/active_scaffold/bridges/file_column.rb +11 -0
  148. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +27 -0
  149. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +16 -0
  150. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +36 -0
  151. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +24 -0
  152. data/lib/active_scaffold/bridges/paperclip.rb +12 -0
  153. data/lib/active_scaffold/bridges/record_select/helpers.rb +92 -0
  154. data/lib/active_scaffold/bridges/record_select.rb +11 -0
  155. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +20 -0
  156. data/lib/active_scaffold/bridges/semantic_attributes.rb +5 -0
  157. data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
  158. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +46 -0
  159. data/lib/active_scaffold/bridges/tiny_mce.rb +17 -0
  160. data/lib/active_scaffold/bridges.rb +61 -0
  161. data/lib/active_scaffold/config/base.rb +75 -0
  162. data/lib/active_scaffold/config/core.rb +236 -0
  163. data/lib/active_scaffold/config/create.rb +32 -0
  164. data/lib/active_scaffold/config/delete.rb +32 -0
  165. data/lib/active_scaffold/config/field_search.rb +79 -0
  166. data/lib/active_scaffold/config/form.rb +64 -0
  167. data/lib/active_scaffold/config/list.rb +247 -0
  168. data/lib/active_scaffold/config/mark.rb +30 -0
  169. data/lib/active_scaffold/config/nested.rb +42 -0
  170. data/lib/active_scaffold/config/search.rb +73 -0
  171. data/lib/active_scaffold/config/show.rb +31 -0
  172. data/lib/active_scaffold/config/subform.rb +35 -0
  173. data/lib/active_scaffold/config/update.rb +33 -0
  174. data/lib/active_scaffold/configurable.rb +29 -0
  175. data/lib/active_scaffold/constraints.rb +171 -0
  176. data/lib/active_scaffold/data_structures/action_columns.rb +142 -0
  177. data/lib/active_scaffold/data_structures/action_link.rb +185 -0
  178. data/lib/active_scaffold/data_structures/action_links.rb +191 -0
  179. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  180. data/lib/active_scaffold/data_structures/bridge.rb +22 -0
  181. data/lib/active_scaffold/data_structures/column.rb +402 -0
  182. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  183. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  184. data/lib/active_scaffold/data_structures/nested_info.rb +171 -0
  185. data/lib/active_scaffold/data_structures/set.rb +61 -0
  186. data/lib/active_scaffold/data_structures/sorting.rb +167 -0
  187. data/lib/active_scaffold/engine.rb +4 -0
  188. data/lib/active_scaffold/extensions/action_controller_rendering.rb +20 -0
  189. data/lib/active_scaffold/extensions/action_controller_rescueing.rb +7 -0
  190. data/lib/active_scaffold/extensions/action_view_rendering.rb +115 -0
  191. data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
  192. data/lib/active_scaffold/extensions/array.rb +7 -0
  193. data/lib/active_scaffold/extensions/cache_association.rb +16 -0
  194. data/lib/active_scaffold/extensions/localize.rb +10 -0
  195. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
  196. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
  197. data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
  198. data/lib/active_scaffold/extensions/reverse_associations.rb +64 -0
  199. data/lib/active_scaffold/extensions/routing_mapper.rb +48 -0
  200. data/lib/active_scaffold/extensions/to_label.rb +8 -0
  201. data/lib/active_scaffold/extensions/unsaved_associated.rb +61 -0
  202. data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
  203. data/lib/active_scaffold/extensions/usa_state.rb +46 -0
  204. data/lib/active_scaffold/finder.rb +399 -0
  205. data/lib/active_scaffold/helpers/association_helpers.rb +42 -0
  206. data/lib/active_scaffold/helpers/controller_helpers.rb +94 -0
  207. data/lib/active_scaffold/helpers/form_column_helpers.rb +322 -0
  208. data/lib/active_scaffold/helpers/human_condition_helpers.rb +64 -0
  209. data/lib/active_scaffold/helpers/id_helpers.rb +131 -0
  210. data/lib/active_scaffold/helpers/list_column_helpers.rb +374 -0
  211. data/lib/active_scaffold/helpers/pagination_helpers.rb +62 -0
  212. data/lib/active_scaffold/helpers/search_column_helpers.rb +257 -0
  213. data/lib/active_scaffold/helpers/show_column_helpers.rb +44 -0
  214. data/lib/active_scaffold/helpers/view_helpers.rb +398 -0
  215. data/lib/active_scaffold/marked_model.rb +38 -0
  216. data/lib/active_scaffold/paginator.rb +136 -0
  217. data/lib/active_scaffold/responds_to_parent.rb +70 -0
  218. data/lib/active_scaffold/tableless.rb +83 -0
  219. data/lib/active_scaffold/version.rb +9 -0
  220. data/lib/active_scaffold.rb +373 -0
  221. data/lib/active_scaffold_env.rb +13 -0
  222. data/lib/generators/active_scaffold/USAGE +29 -0
  223. data/lib/generators/active_scaffold/active_scaffold_generator.rb +21 -0
  224. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  225. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
  226. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  227. data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
  228. data/public/blank.html +33 -0
  229. data/shoulda_macros/macros.rb +136 -0
  230. data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  231. data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  232. data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
  233. data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  234. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  235. data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  236. data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  237. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  238. data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  239. data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
  240. data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
  241. data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
  242. data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
  243. data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
  244. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1276 -0
  245. data/vendor/assets/stylesheets/jquery-ui.css +568 -0
  246. metadata +261 -17
@@ -0,0 +1,322 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ # Helpers that assist with the rendering of a Form Column
4
+ module FormColumnHelpers
5
+ # This method decides which input to use for the given column.
6
+ # It does not do any rendering. It only decides which method is responsible for rendering.
7
+ def active_scaffold_input_for(column, scope = nil, options = {})
8
+ options = active_scaffold_input_options(column, scope, options)
9
+ options = update_columns_options(column, scope, options)
10
+ active_scaffold_render_input(column, options)
11
+ end
12
+
13
+ alias form_column active_scaffold_input_for
14
+
15
+ def active_scaffold_render_input(column, options)
16
+ begin
17
+ # first, check if the dev has created an override for this specific field
18
+ if (method = override_form_field(column))
19
+ send(method, @record, options)
20
+ # second, check if the dev has specified a valid form_ui for this column
21
+ elsif column.form_ui and (method = override_input(column.form_ui))
22
+ send(method, column, options)
23
+ # fallback: we get to make the decision
24
+ else
25
+ if column.association
26
+ if column.form_ui.nil?
27
+ # its an association and nothing is specified, we will assume form_ui :select
28
+ active_scaffold_input_select(column, options)
29
+ else
30
+ # if we get here, it's because the column has a form_ui but not one ActiveScaffold knows about.
31
+ raise "Unknown form_ui `#{column.form_ui}' for column `#{column.name}'"
32
+ end
33
+ elsif column.virtual?
34
+ options[:value] = format_number_value(@record.send(column.name), column.options) if column.number?
35
+ active_scaffold_input_virtual(column, options)
36
+
37
+ else # regular model attribute column
38
+ # if we (or someone else) have created a custom render option for the column type, use that
39
+ if (method = override_input(column.column.type))
40
+ send(method, column, options)
41
+ # final ultimate fallback: use rails' generic input method
42
+ else
43
+ # for textual fields we pass different options
44
+ text_types = [:text, :string, :integer, :float, :decimal, :date, :time, :datetime]
45
+ options = active_scaffold_input_text_options(options) if text_types.include?(column.column.type)
46
+ if column.column.type == :string && options[:maxlength].blank?
47
+ options[:maxlength] = column.column.limit
48
+ options[:size] ||= ActionView::Helpers::InstanceTag::DEFAULT_FIELD_OPTIONS["size"]
49
+ end
50
+ options[:include_blank] = true if column.column.null and [:date, :datetime, :time].include?(column.column.type)
51
+ options[:value] = format_number_value(@record.send(column.name), column.options) if column.number?
52
+ text_field(:record, column.name, options.merge(column.options))
53
+ end
54
+ end
55
+ end
56
+ rescue Exception => e
57
+ logger.error Time.now.to_s + "#{e.inspect} -- on the ActiveScaffold column = :#{column.name} in #{controller.class}"
58
+ raise e
59
+ end
60
+ end
61
+
62
+ # the standard active scaffold options used for textual inputs
63
+ def active_scaffold_input_text_options(options = {})
64
+ options[:autocomplete] = 'off'
65
+ options[:class] = "#{options[:class]} text-input".strip
66
+ options
67
+ end
68
+
69
+ # the standard active scaffold options used for class, name and scope
70
+ def active_scaffold_input_options(column, scope = nil, options = {})
71
+ name = scope ? "record#{scope}[#{column.name}]" : "record[#{column.name}]"
72
+
73
+ # Fix for keeping unique IDs in subform
74
+ id_control = "record_#{column.name}_#{[params[:eid], params[:id]].compact.join '_'}"
75
+ id_control += scope_id(scope) if scope
76
+
77
+ classes = "#{column.name}-input"
78
+ classes += ' numeric-input' if column.number?
79
+
80
+ { :name => name, :class => classes, :id => id_control}.merge(options)
81
+ end
82
+
83
+ def update_columns_options(column, scope, options)
84
+ if column.update_columns
85
+ form_action = params[:action] == 'edit' ? :update : :create
86
+ url_params = {:action => 'render_field', :id => params[:id], :column => column.name}
87
+ url_params[:eid] = params[:eid] if params[:eid]
88
+ url_params[:controller] = controller.class.active_scaffold_controller_for(@record.class).controller_path if scope
89
+ url_params[:scope] = scope if scope
90
+
91
+ options[:class] = "#{options[:class]} update_form".strip
92
+ options['data-update_url'] = url_for(url_params)
93
+ options['data-update_send_form'] = true if column.send_form_on_update_column
94
+ options['data-update_send_form_selector'] = column.options[:send_form_selector] if column.options[:send_form_selector]
95
+ end
96
+ options
97
+ end
98
+
99
+ ##
100
+ ## Form input methods
101
+ ##
102
+
103
+ def active_scaffold_translate_select_options(options)
104
+ options[:include_blank] = as_(options[:include_blank]) if options[:include_blank].is_a? Symbol
105
+ options[:prompt] = as_(options[:prompt]) if options[:prompt].is_a? Symbol
106
+ options
107
+ end
108
+
109
+ def active_scaffold_input_singular_association(column, html_options)
110
+ associated = @record.send(column.association.name)
111
+
112
+ select_options = options_for_association(column.association)
113
+ select_options.unshift([ associated.to_label, associated.id ]) unless associated.nil? or select_options.find {|label, id| id == associated.id}
114
+
115
+ method = column.name
116
+ #html_options[:name] += '[id]'
117
+ options = {:selected => associated.try(:id), :include_blank => as_(:_select_)}
118
+
119
+ html_options.update(column.options[:html_options] || {})
120
+ options.update(column.options)
121
+ html_options[:name] = "#{html_options[:name]}[]" if (html_options[:multiple] == true && !html_options[:name].to_s.ends_with?("[]"))
122
+ active_scaffold_translate_select_options(options)
123
+ select(:record, method, select_options.uniq, options, html_options)
124
+ end
125
+
126
+ def active_scaffold_input_plural_association(column, options)
127
+ associated_options = @record.send(column.association.name).collect {|r| [r.to_label, r.id]}
128
+ select_options = associated_options | options_for_association(column.association)
129
+ return content_tag(:span, as_(:no_options), :class => options[:class], :id => options[:id]) if select_options.empty?
130
+
131
+ active_scaffold_checkbox_list(column, select_options, associated_options.collect {|a| a[1]}, options)
132
+ end
133
+
134
+ def active_scaffold_checkbox_list(column, select_options, associated_ids, options)
135
+ html = content_tag :ul, :class => "#{options[:class]} checkbox-list", :id => options[:id] do
136
+ content = hidden_field_tag("#{options[:name]}[]", '')
137
+ select_options.each_with_index do |option, i|
138
+ label, id = option
139
+ this_id = "#{options[:id]}_#{i}_id"
140
+ content << content_tag(:li) do
141
+ check_box_tag("#{options[:name]}[]", id, associated_ids.include?(id), :id => this_id) <<
142
+ content_tag(:label, h(label), :for => this_id)
143
+ end
144
+ end
145
+ content
146
+ end
147
+ html << javascript_tag("ActiveScaffold.draggable_lists('#{options[:id]}')") if column.options[:draggable_lists]
148
+ html
149
+ end
150
+
151
+ def active_scaffold_translated_option(column, text, value = nil)
152
+ value = text if value.nil?
153
+ [(text.is_a?(Symbol) ? column.active_record_class.human_attribute_name(text) : text), value]
154
+ end
155
+
156
+ def active_scaffold_input_enum(column, html_options)
157
+ options = { :selected => @record.send(column.name) }
158
+ options_for_select = column.options[:options].collect do |text, value|
159
+ active_scaffold_translated_option(column, text, value)
160
+ end
161
+ html_options.update(column.options[:html_options] || {})
162
+ options.update(column.options)
163
+ active_scaffold_translate_select_options(options)
164
+ select(:record, column.name, options_for_select, options, html_options)
165
+ end
166
+
167
+ def active_scaffold_input_select(column, html_options)
168
+ if column.singular_association?
169
+ active_scaffold_input_singular_association(column, html_options)
170
+ elsif column.plural_association?
171
+ active_scaffold_input_plural_association(column, html_options)
172
+ else
173
+ active_scaffold_input_enum(column, html_options)
174
+ end
175
+ end
176
+
177
+ def active_scaffold_input_radio(column, html_options)
178
+ html_options.update(column.options[:html_options] || {})
179
+ column.options[:options].inject('') do |html, (text, value)|
180
+ text, value = active_scaffold_translated_option(column, text, value)
181
+ html << content_tag(:label, radio_button(:record, column.name, value, html_options.merge(:id => html_options[:id] + '-' + value.to_s)) + text)
182
+ end.html_safe
183
+ end
184
+
185
+ def active_scaffold_input_checkbox(column, options)
186
+ check_box(:record, column.name, options.merge(column.options))
187
+ end
188
+
189
+ def active_scaffold_input_password(column, options)
190
+ options = active_scaffold_input_text_options(options)
191
+ password_field :record, column.name, options.merge(column.options)
192
+ end
193
+
194
+ def active_scaffold_input_textarea(column, options)
195
+ text_area(:record, column.name, options.merge(:cols => column.options[:cols], :rows => column.options[:rows], :size => column.options[:size]))
196
+ end
197
+
198
+ def active_scaffold_input_virtual(column, options)
199
+ options = active_scaffold_input_text_options(options)
200
+ text_field :record, column.name, options.merge(column.options)
201
+ end
202
+
203
+ #
204
+ # Column.type-based inputs
205
+ #
206
+
207
+ def active_scaffold_input_boolean(column, options)
208
+ select_options = []
209
+ select_options << [as_(:_select_), nil] if !column.virtual? && column.column.null
210
+ select_options << [as_(:true), true]
211
+ select_options << [as_(:false), false]
212
+
213
+ select_tag(options[:name], options_for_select(select_options, @record.send(column.name)), options)
214
+ end
215
+
216
+ def onsubmit
217
+ end
218
+
219
+ ##
220
+ ## Form column override signatures
221
+ ##
222
+
223
+ # add functionality for overriding subform partials from association class path
224
+ def override_subform_partial?(column, subform_partial)
225
+ template_exists?(override_subform_partial(column, subform_partial), true)
226
+ end
227
+
228
+ def override_subform_partial(column, subform_partial)
229
+ File.join(active_scaffold_controller_for(column.association.klass).controller_path, subform_partial) if column_renders_as(column) == :subform
230
+ end
231
+
232
+ def override_form_field_partial?(column)
233
+ template_exists?(override_form_field_partial(column), true)
234
+ end
235
+
236
+ # the naming convention for overriding form fields with helpers
237
+ def override_form_field_partial(column)
238
+ path = active_scaffold_controller_for(column.active_record_class).controller_path
239
+ File.join(path, "#{clean_column_name(column.name)}_form_column")
240
+ end
241
+
242
+ def override_form_field(column)
243
+ override_helper column, 'form_column'
244
+ end
245
+ alias_method :override_form_field?, :override_form_field
246
+
247
+ # the naming convention for overriding form input types with helpers
248
+ def override_input(form_ui)
249
+ method = "active_scaffold_input_#{form_ui}"
250
+ method if respond_to? method
251
+ end
252
+ alias_method :override_input?, :override_input
253
+
254
+ def form_partial_for_column(column, renders_as = nil)
255
+ renders_as ||= column_renders_as(column)
256
+ if override_form_field_partial?(column)
257
+ override_form_field_partial(column)
258
+ elsif renders_as == :field or override_form_field?(column)
259
+ "form_attribute"
260
+ elsif renders_as == :subform
261
+ "form_association"
262
+ elsif renders_as == :hidden
263
+ "form_hidden_attribute"
264
+ end
265
+ end
266
+
267
+ def subform_partial_for_column(column)
268
+ subform_partial = "#{active_scaffold_config_for(column.association.klass).subform.layout}_subform"
269
+ if override_subform_partial?(column, subform_partial)
270
+ override_subform_partial(column, subform_partial)
271
+ else
272
+ subform_partial
273
+ end
274
+ end
275
+
276
+ ##
277
+ ## Macro-level rendering decisions for columns
278
+ ##
279
+
280
+ def column_renders_as(column)
281
+ if column.is_a? ActiveScaffold::DataStructures::ActionColumns
282
+ return :subsection
283
+ elsif column.active_record_class.locking_column.to_s == column.name.to_s or column.form_ui == :hidden
284
+ return :hidden
285
+ elsif column.association.nil? or column.form_ui or !active_scaffold_config_for(column.association.klass).actions.include?(:subform)
286
+ return :field
287
+ else
288
+ return :subform
289
+ end
290
+ end
291
+
292
+ def column_scope(column, scope = nil)
293
+ if column.plural_association?
294
+ "#{scope}[#{column.name}][#{@record.id || generate_temporary_id}]"
295
+ else
296
+ "#{scope}[#{column.name}]"
297
+ end
298
+ end
299
+
300
+ def active_scaffold_add_existing_input(options)
301
+ if ActiveScaffold.js_framework == :prototype && controller.respond_to?(:record_select_config)
302
+ remote_controller = active_scaffold_controller_for(record_select_config.model).controller_path
303
+ options.merge!(:controller => remote_controller)
304
+ options.merge!(active_scaffold_input_text_options)
305
+ record_select_field(options[:name], @record, options)
306
+ else
307
+ select_options = options_for_select(options_for_association(nested.association)) #unless column.through_association?
308
+ select_options ||= options_for_select(active_scaffold_config.model.all.collect {|c| [h(c.to_label), c.id]})
309
+ select_tag 'associated_id', ('<option value="">' + as_(:_select_) + '</option>' + select_options).html_safe unless select_options.empty?
310
+ end
311
+ end
312
+
313
+ def active_scaffold_add_existing_label
314
+ if controller.respond_to?(:record_select_config)
315
+ record_select_config.model.model_name.human
316
+ else
317
+ active_scaffold_config.model.model_name.human
318
+ end
319
+ end
320
+ end
321
+ end
322
+ end
@@ -0,0 +1,64 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ # Helpers that assist with rendering of a human readable search statement
4
+ module HumanConditionHelpers
5
+
6
+ def active_scaffold_human_condition_for(column)
7
+ value = field_search_params[column.name]
8
+ search_ui = column.search_ui
9
+ search_ui ||= column.column.type if column.column
10
+ if override_human_condition_column?(column)
11
+ send(override_human_condition_column(column), value, {})
12
+ elsif search_ui and override_human_condition?(column.search_ui)
13
+ send(override_human_condition(column.search_ui), column, value)
14
+ else
15
+ case search_ui
16
+ when :integer, :decimal, :float
17
+ "#{column.active_record_class.human_attribute_name(column.name)} #{as_(value[:opt].downcase).downcase} #{format_number_value(controller.class.condition_value_for_numeric(column, value[:from]), column.options) if value[:from].present?} #{value[:opt] == 'BETWEEN' ? '- ' + format_number_value(controller.class.condition_value_for_numeric(column, value[:to]), column.options).to_s : ''}"
18
+ when :string
19
+ opt = ActiveScaffold::Finder::StringComparators.index(value[:opt]) || value[:opt]
20
+ "#{column.active_record_class.human_attribute_name(column.name)} #{as_(opt).downcase} '#{value[:from]}' #{opt == 'BETWEEN' ? '- ' + value[:to].to_s : ''}"
21
+ when :date, :time, :datetime, :timestamp
22
+ conversion = column.column.type == :date ? :to_date : :to_time
23
+ from = controller.condition_value_for_datetime(value[:from], conversion)
24
+ to = controller.condition_value_for_datetime(value[:to], conversion)
25
+ "#{column.active_record_class.human_attribute_name(column.name)} #{as_(value[:opt])} #{I18n.l(from)} #{value[:opt] == 'BETWEEN' ? '- ' + I18n.l(to) : ''}"
26
+ when :select, :multi_select, :record_select
27
+ associated = value
28
+ associated = [associated].compact unless associated.is_a? Array
29
+ if column.association
30
+ associated = column.association.klass.where(:id => associated.map(&:to_i)).collect(&:to_label)
31
+ elsif column.options[:options]
32
+ associated = associated.collect do |value|
33
+ text, val = column.options[:options].find {|text, val| (val.nil? ? text : val).to_s == value.to_s}
34
+ value = active_scaffold_translated_option(column, text, val).first if text
35
+ value
36
+ end
37
+ end
38
+ as_(:association, :scope => :human_conditions, :column => column.active_record_class.human_attribute_name(column.name), :value => associated.join(', '))
39
+ when :boolean, :checkbox
40
+ label = column.column.type_cast(value) ? as_(:true) : as_(:false)
41
+ as_(:boolean, :scope => :human_conditions, :column => column.active_record_class.human_attribute_name(column.name), :value => label)
42
+ when :null
43
+ "#{column.active_record_class.human_attribute_name(column.name)} #{as_(value.to_sym)}"
44
+ end
45
+ end unless value.nil?
46
+ end
47
+
48
+ # the naming convention for overriding form fields with helpers
49
+ def override_human_condition_column(column)
50
+ override_helper column, 'human_condition_column'
51
+ end
52
+ alias_method :override_human_condition_column?, :override_human_condition_column
53
+
54
+ def override_human_condition?(search_ui)
55
+ respond_to?(override_human_condition(search_ui))
56
+ end
57
+
58
+ # the naming convention for overriding human condition search_ui types
59
+ def override_human_condition(search_ui)
60
+ "active_scaffold_human_condition_#{search_ui}"
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,131 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ # A bunch of helper methods to produce the common view ids
4
+ module IdHelpers
5
+ def id_from_controller(controller)
6
+ controller.to_s.gsub("/", "__").html_safe
7
+ end
8
+
9
+ def controller_id(controller = (params[:eid] || nested_id || params[:parent_controller] || params[:controller]))
10
+ controller_id ||= 'as_' + id_from_controller(controller)
11
+ end
12
+
13
+ def nested_id
14
+ "#{nested.parent_scaffold.controller_path}-#{nested.parent_id}-#{params[:controller]}" if nested?
15
+ end
16
+
17
+ def active_scaffold_id
18
+ "#{controller_id}-active-scaffold"
19
+ end
20
+
21
+ def active_scaffold_content_id
22
+ "#{controller_id}-content"
23
+ end
24
+
25
+ def active_scaffold_tbody_id
26
+ "#{controller_id}-tbody"
27
+ end
28
+
29
+ def active_scaffold_messages_id(options = {})
30
+ "#{options[:controller_id] || controller_id}-messages"
31
+ end
32
+
33
+ def active_scaffold_calculations_id(options = {})
34
+ "#{options[:controller_id] || controller_id}-calculations#{'-' + options[:column].name.to_s if options[:column]}"
35
+ end
36
+
37
+ def empty_message_id
38
+ "#{controller_id}-empty-message"
39
+ end
40
+
41
+ def before_header_id
42
+ "#{controller_id}-search-container"
43
+ end
44
+
45
+ def search_input_id
46
+ "#{controller_id}-search-input"
47
+ end
48
+
49
+ def action_link_id(link_action,link_id)
50
+ "#{controller_id}-#{link_action}-#{link_id}-link"
51
+ end
52
+
53
+ def active_scaffold_column_header_id(column)
54
+ name = column.respond_to?(:name) ? column.name : column.to_s
55
+ clean_id "#{controller_id}-#{name}-column"
56
+ end
57
+
58
+ def element_row_id(options = {})
59
+ options[:action] ||= params[:action]
60
+ options[:id] ||= params[:id]
61
+ options[:id] ||= params[:parent_id]
62
+ clean_id "#{options[:controller_id] || controller_id}-#{options[:action]}-#{options[:id]}-row"
63
+ end
64
+
65
+ def element_cell_id(options = {})
66
+ options[:action] ||= params[:action]
67
+ options[:id] ||= params[:id]
68
+ options[:id] ||= params[:parent_id]
69
+ options[:name] ||= params[:name]
70
+ clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-#{options[:name]}-cell"
71
+ end
72
+
73
+ def element_form_id(options = {})
74
+ options[:action] ||= params[:action]
75
+ options[:id] ||= params[:id]
76
+ options[:id] ||= params[:parent_id]
77
+ clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-form"
78
+ end
79
+
80
+ def association_subform_id(column)
81
+ klass = column.association.klass.to_s.underscore
82
+ clean_id "#{controller_id}-associated-#{klass}"
83
+ end
84
+
85
+ def loading_indicator_id(options = {})
86
+ options[:action] ||= params[:action]
87
+ clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-loading-indicator"
88
+ end
89
+
90
+ def sub_section_id(options = {})
91
+ options[:id] ||= params[:id]
92
+ options[:id] ||= params[:parent_id]
93
+ clean_id "#{controller_id}-#{options[:id]}-#{options[:sub_section]}-subsection"
94
+ end
95
+
96
+ def sub_form_id(options = {})
97
+ options[:id] ||= params[:id]
98
+ options[:id] ||= params[:parent_id]
99
+ clean_id "#{controller_id}-#{options[:id]}-#{options[:association]}-subform"
100
+ end
101
+
102
+ def sub_form_list_id(options = {})
103
+ options[:id] ||= params[:id]
104
+ options[:id] ||= params[:parent_id]
105
+ clean_id "#{controller_id}-#{options[:id]}-#{options[:association]}-subform-list"
106
+ end
107
+
108
+ def element_messages_id(options = {})
109
+ options[:action] ||= params[:action]
110
+ options[:id] ||= params[:id]
111
+ options[:id] ||= params[:parent_id]
112
+ clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-messages"
113
+ end
114
+
115
+ def action_iframe_id(options)
116
+ "#{controller_id}-#{options[:action]}-#{options[:id]}-iframe"
117
+ end
118
+
119
+ def scope_id(scope)
120
+ scope.gsub(/(\[|\])/, '_').gsub('__', '_').gsub(/_$/, '')
121
+ end
122
+
123
+ private
124
+
125
+ # whitelists id-safe characters
126
+ def clean_id(val)
127
+ val.gsub /[^-_0-9a-zA-Z]/, '-'
128
+ end
129
+ end
130
+ end
131
+ end