active_scaffold 3.0.26 → 3.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (236) hide show
  1. data/CHANGELOG +1 -1
  2. data/{frontends/default → app/assets}/images/add.gif +0 -0
  3. data/{frontends/default → app/assets}/images/arrow_down.gif +0 -0
  4. data/{frontends/default → app/assets}/images/arrow_up.gif +0 -0
  5. data/{frontends/default → app/assets}/images/close.gif +0 -0
  6. data/{frontends/default → app/assets}/images/close_touch.png +0 -0
  7. data/{frontends/default → app/assets}/images/config.png +0 -0
  8. data/{frontends/default → app/assets}/images/cross.png +0 -0
  9. data/{frontends/default → app/assets}/images/gears.png +0 -0
  10. data/{frontends/default → app/assets}/images/indicator-small.gif +0 -0
  11. data/{frontends/default → app/assets}/images/indicator.gif +0 -0
  12. data/{frontends/default → app/assets}/images/magnifier.png +0 -0
  13. data/app/assets/javascripts/active_scaffold.js.erb +16 -0
  14. data/{frontends/default → app/assets}/javascripts/jquery/active_scaffold.js +16 -28
  15. data/app/assets/javascripts/jquery/active_scaffold.js~ +1036 -0
  16. data/{lib/active_scaffold/bridges/date_picker/public/javascripts/date_picker_bridge.js → app/assets/javascripts/jquery/date_picker_bridge.js.erb} +3 -1
  17. data/{frontends/default → app/assets}/javascripts/jquery/jquery.editinplace.js +0 -0
  18. data/app/assets/javascripts/prototype/active_scaffold.js +1033 -0
  19. data/{frontends/default/javascripts/prototype/active_scaffold.js → app/assets/javascripts/prototype/active_scaffold.js~} +1 -0
  20. data/{frontends/default → app/assets}/javascripts/prototype/dhtml_history.js +0 -0
  21. data/{frontends/default → app/assets}/javascripts/prototype/form_enhancements.js +0 -0
  22. data/{frontends/default → app/assets}/javascripts/prototype/rico_corner.js +0 -0
  23. data/{frontends/default/stylesheets/stylesheet-ie.css → app/assets/stylesheets/active_scaffold-ie.css} +0 -0
  24. data/{frontends/default/stylesheets/stylesheet.css → app/assets/stylesheets/active_scaffold.css.erb} +29 -24
  25. data/{lib/active_scaffold/locale → config/locales}/de.yml +3 -0
  26. data/{lib/active_scaffold/locale → config/locales}/en.yml +3 -0
  27. data/{lib/active_scaffold/locale → config/locales}/es.yml +5 -0
  28. data/{lib/active_scaffold/locale → config/locales}/fr.yml +3 -0
  29. data/{lib/active_scaffold/locale → config/locales}/hu.yml +13 -2
  30. data/{lib/active_scaffold/locale → config/locales}/ja.yml +9 -0
  31. data/{lib/active_scaffold/locale → config/locales}/ru.yml +3 -0
  32. data/frontends/default/views/_form.html.erb +1 -1
  33. data/frontends/default/views/_form_association.html.erb +1 -5
  34. data/frontends/default/views/_horizontal_subform.html.erb +7 -4
  35. data/frontends/default/views/_horizontal_subform.html.erb~ +2 -5
  36. data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
  37. data/frontends/default/views/_horizontal_subform_header.html.erb +1 -1
  38. data/frontends/default/views/_horizontal_subform_header.html.erb~ +1 -1
  39. data/frontends/default/views/_horizontal_subform_record.html.erb~ +1 -1
  40. data/frontends/default/views/_list_actions.html.erb +1 -1
  41. data/frontends/default/views/_list_messages.html.erb +1 -3
  42. data/frontends/default/views/_render_field.js.erb +20 -0
  43. data/frontends/default/views/_row.html.erb +3 -9
  44. data/frontends/default/views/_show.html.erb +2 -2
  45. data/frontends/default/views/add_existing.js.erb +20 -0
  46. data/frontends/default/views/destroy.js.erb +24 -0
  47. data/frontends/default/views/{edit_associated.js.rjs → edit_associated.js.erb} +3 -2
  48. data/frontends/default/views/form_messages.js.erb +1 -0
  49. data/frontends/default/views/list.js.erb +1 -0
  50. data/frontends/default/views/mark.js.rjs +6 -0
  51. data/frontends/default/views/on_action_update.js.erb +13 -0
  52. data/frontends/default/views/{on_create.js.erb~ → on_create.js.erb} +0 -0
  53. data/frontends/default/views/on_mark_all.js.erb +12 -0
  54. data/frontends/default/views/{on_update.js.erb~ → on_update.js.erb} +0 -0
  55. data/frontends/default/views/render_field.js.erb +1 -0
  56. data/frontends/default/views/search.html.erb +1 -1
  57. data/frontends/default/views/{update_column.js.erb~ → update_column.js.erb} +3 -3
  58. data/frontends/default/views/update_row.js.erb +1 -0
  59. data/lib/active_scaffold.rb +22 -46
  60. data/lib/active_scaffold/actions/core.rb +14 -6
  61. data/lib/active_scaffold/actions/core.rb~ +3 -3
  62. data/lib/active_scaffold/actions/create.rb +2 -5
  63. data/lib/active_scaffold/actions/create.rb~ +3 -2
  64. data/lib/active_scaffold/actions/delete.rb +1 -0
  65. data/lib/active_scaffold/actions/field_search.rb +1 -1
  66. data/lib/active_scaffold/actions/list.rb +10 -6
  67. data/lib/active_scaffold/actions/list.rb~ +3 -3
  68. data/lib/active_scaffold/actions/mark.rb +8 -8
  69. data/lib/active_scaffold/actions/nested.rb +2 -9
  70. data/lib/active_scaffold/actions/nested.rb~ +5 -7
  71. data/lib/active_scaffold/actions/search.rb +2 -1
  72. data/lib/active_scaffold/actions/subform.rb +1 -5
  73. data/lib/active_scaffold/actions/update.rb +1 -4
  74. data/lib/active_scaffold/actions/update.rb~ +5 -5
  75. data/lib/active_scaffold/attribute_params.rb +15 -26
  76. data/lib/active_scaffold/attribute_params.rb~ +1 -2
  77. data/lib/active_scaffold/bridges.rb +61 -0
  78. data/lib/active_scaffold/bridges/ancestry.rb +5 -0
  79. data/lib/active_scaffold/bridges/ancestry/{lib/ancestry_bridge.rb → ancestry_bridge.rb} +3 -3
  80. data/lib/active_scaffold/bridges/{calendar_date_select/bridge.rb → calendar_date_select.rb} +13 -5
  81. data/lib/active_scaffold/bridges/calendar_date_select/{lib/as_cds_bridge.rb → as_cds_bridge.rb} +4 -20
  82. data/lib/active_scaffold/bridges/cancan.rb +15 -0
  83. data/lib/active_scaffold/bridges/cancan/{lib/cancan_bridge.rb → cancan_bridge.rb} +2 -2
  84. data/lib/active_scaffold/bridges/carrierwave.rb +12 -0
  85. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +31 -0
  86. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +10 -0
  87. data/lib/active_scaffold/bridges/carrierwave/{lib/form_ui.rb → form_ui.rb} +0 -0
  88. data/lib/active_scaffold/bridges/carrierwave/{lib/list_ui.rb → list_ui.rb} +1 -1
  89. data/lib/active_scaffold/bridges/country_helper.rb +9 -0
  90. data/lib/active_scaffold/bridges/country_helper/{lib/country_helper_bridge.rb → country_helper_bridge.rb} +5 -5
  91. data/lib/active_scaffold/bridges/date_picker.rb +23 -0
  92. data/lib/active_scaffold/bridges/date_picker/ext.rb +54 -0
  93. data/lib/active_scaffold/bridges/date_picker/helper.rb +188 -0
  94. data/lib/active_scaffold/bridges/dragonfly.rb +9 -0
  95. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +34 -0
  96. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +10 -0
  97. data/lib/active_scaffold/bridges/dragonfly/{lib/form_ui.rb → form_ui.rb} +0 -0
  98. data/lib/active_scaffold/bridges/dragonfly/{lib/list_ui.rb → list_ui.rb} +2 -2
  99. data/lib/active_scaffold/bridges/file_column.rb +11 -0
  100. data/lib/active_scaffold/bridges/file_column/{lib/as_file_column_bridge.rb → as_file_column_bridge.rb} +2 -2
  101. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +57 -0
  102. data/lib/active_scaffold/bridges/file_column/{lib/form_ui.rb → form_ui.rb} +2 -2
  103. data/lib/active_scaffold/bridges/file_column/{lib/list_ui.rb → list_ui.rb} +0 -0
  104. data/lib/active_scaffold/bridges/paperclip.rb +12 -0
  105. data/lib/active_scaffold/bridges/paperclip/{lib/form_ui.rb → form_ui.rb} +0 -0
  106. data/lib/active_scaffold/bridges/paperclip/{lib/list_ui.rb → list_ui.rb} +3 -3
  107. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +36 -0
  108. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +24 -0
  109. data/lib/active_scaffold/bridges/record_select.rb +11 -0
  110. data/lib/active_scaffold/bridges/record_select/{lib/record_select_bridge.rb → helpers.rb} +5 -16
  111. data/lib/active_scaffold/bridges/record_select/helpers.rb~ +9 -14
  112. data/lib/active_scaffold/bridges/semantic_attributes.rb +5 -0
  113. data/lib/active_scaffold/bridges/semantic_attributes/{lib/semantic_attributes_bridge.rb → column.rb} +3 -3
  114. data/lib/active_scaffold/bridges/tiny_mce.rb +5 -0
  115. data/lib/active_scaffold/bridges/tiny_mce/{lib/tiny_mce_bridge.rb → helpers.rb} +16 -8
  116. data/lib/active_scaffold/config/base.rb +9 -1
  117. data/lib/active_scaffold/config/core.rb +1 -1
  118. data/lib/active_scaffold/config/create.rb +3 -10
  119. data/lib/active_scaffold/config/delete.rb +1 -2
  120. data/lib/active_scaffold/config/field_search.rb +1 -2
  121. data/lib/active_scaffold/config/form.rb +2 -6
  122. data/lib/active_scaffold/config/list.rb +8 -2
  123. data/lib/active_scaffold/config/nested.rb +2 -6
  124. data/lib/active_scaffold/config/search.rb +6 -2
  125. data/lib/active_scaffold/config/show.rb +1 -4
  126. data/lib/active_scaffold/config/subform.rb +1 -1
  127. data/lib/active_scaffold/config/update.rb +1 -6
  128. data/lib/active_scaffold/data_structures/action_columns.rb +3 -0
  129. data/lib/active_scaffold/data_structures/action_link.rb +14 -10
  130. data/lib/active_scaffold/data_structures/bridge.rb +22 -0
  131. data/lib/active_scaffold/data_structures/column.rb +36 -4
  132. data/lib/active_scaffold/data_structures/nested_info.rb +4 -4
  133. data/lib/active_scaffold/data_structures/set.rb +1 -6
  134. data/lib/active_scaffold/data_structures/sorting.rb +2 -2
  135. data/lib/active_scaffold/engine.rb +4 -0
  136. data/lib/active_scaffold/extensions/action_controller_rendering.rb +2 -2
  137. data/lib/active_scaffold/extensions/action_controller_rendering.rb~ +1 -1
  138. data/lib/active_scaffold/extensions/action_view_rendering.rb +90 -93
  139. data/lib/active_scaffold/extensions/action_view_rendering.rb~ +1 -13
  140. data/lib/active_scaffold/extensions/active_association_reflection.rb +16 -7
  141. data/lib/active_scaffold/extensions/cache_association.rb +16 -0
  142. data/lib/active_scaffold/extensions/reverse_associations.rb +15 -13
  143. data/lib/active_scaffold/extensions/unsaved_associated.rb +1 -1
  144. data/lib/active_scaffold/finder.rb +40 -23
  145. data/lib/active_scaffold/finder.rb~ +3 -11
  146. data/lib/active_scaffold/helpers/association_helpers.rb +1 -1
  147. data/lib/active_scaffold/helpers/controller_helpers.rb +9 -1
  148. data/lib/active_scaffold/helpers/controller_helpers.rb~ +12 -5
  149. data/lib/active_scaffold/helpers/form_column_helpers.rb +20 -21
  150. data/lib/active_scaffold/helpers/form_column_helpers.rb~ +2 -1
  151. data/lib/active_scaffold/helpers/id_helpers.rb +5 -5
  152. data/lib/active_scaffold/helpers/list_column_helpers.rb +14 -24
  153. data/lib/active_scaffold/helpers/list_column_helpers.rb~ +15 -20
  154. data/lib/active_scaffold/helpers/search_column_helpers.rb +10 -1
  155. data/lib/active_scaffold/helpers/search_column_helpers.rb~ +1 -1
  156. data/lib/active_scaffold/helpers/view_helpers.rb +14 -40
  157. data/lib/active_scaffold/helpers/view_helpers.rb~ +3 -3
  158. data/lib/active_scaffold/version.rb +2 -2
  159. data/lib/active_scaffold_env.rb +0 -2
  160. data/test/bridges/active_scaffold_dependent_protect_test.rb +34 -0
  161. data/test/bridges/bridge_test.rb +43 -0
  162. data/test/bridges/company.rb +81 -0
  163. data/test/bridges/paperclip_test.rb +68 -0
  164. data/test/bridges/tiny_mce_test.rb +27 -0
  165. data/test/bridges/unobtrusive_date_picker_test.rb +49 -0
  166. data/test/bridges/validation_reflection_test.rb +57 -0
  167. data/test/config/base_test.rb +1 -1
  168. data/test/config/core_test.rb +58 -0
  169. data/test/config/create_test.rb +8 -5
  170. data/test/config/delete_test.rb +33 -0
  171. data/test/config/field_search_test.rb +47 -0
  172. data/test/config/list_test.rb +64 -9
  173. data/test/config/nested_test.rb +62 -0
  174. data/test/config/search_test.rb +60 -0
  175. data/test/config/show_test.rb +5 -5
  176. data/test/config/subform_test.rb +17 -0
  177. data/test/config/update_test.rb +27 -4
  178. data/test/helpers/list_column_helpers_test.rb +16 -5
  179. data/test/helpers/pagination_helpers_test.rb +4 -0
  180. data/test/misc/attribute_params_test.rb +37 -1
  181. data/test/misc/finder_test.rb +0 -1
  182. data/test/misc/lang_test.rb +2 -3
  183. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +2 -2
  184. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +13 -7
  185. metadata +137 -154
  186. data/frontends/default/views/_list_with_header.html.erb~ +0 -32
  187. data/frontends/default/views/_render_field.js.rjs +0 -14
  188. data/frontends/default/views/_show.html.erb~ +0 -8
  189. data/frontends/default/views/_update_form.html.erb~ +0 -6
  190. data/frontends/default/views/add_existing.js.erb~ +0 -18
  191. data/frontends/default/views/add_existing.js.rjs +0 -17
  192. data/frontends/default/views/destroy.js.rjs +0 -23
  193. data/frontends/default/views/form_messages.js.rjs +0 -1
  194. data/frontends/default/views/list.js.rjs +0 -1
  195. data/frontends/default/views/on_action_update.js.rjs +0 -10
  196. data/frontends/default/views/on_create.js.rjs +0 -41
  197. data/frontends/default/views/on_mark_all.js.rjs +0 -12
  198. data/frontends/default/views/on_update.js.rjs +0 -28
  199. data/frontends/default/views/render_field.js.rjs +0 -1
  200. data/frontends/default/views/update_column.js.rjs +0 -13
  201. data/frontends/default/views/update_row.js.rjs +0 -1
  202. data/lib/active_scaffold.rb~ +0 -362
  203. data/lib/active_scaffold/bridges/ancestry/bridge.rb +0 -5
  204. data/lib/active_scaffold/bridges/bridge.rb +0 -59
  205. data/lib/active_scaffold/bridges/cancan/bridge.rb +0 -12
  206. data/lib/active_scaffold/bridges/carrierwave/bridge.rb +0 -9
  207. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge.rb +0 -33
  208. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge_helpers.rb +0 -12
  209. data/lib/active_scaffold/bridges/country_helper/bridge.rb +0 -9
  210. data/lib/active_scaffold/bridges/date_picker/bridge.rb +0 -24
  211. data/lib/active_scaffold/bridges/date_picker/lib/datepicker_bridge.rb +0 -234
  212. data/lib/active_scaffold/bridges/dragonfly/bridge.rb +0 -9
  213. data/lib/active_scaffold/bridges/dragonfly/lib/dragonfly_bridge.rb +0 -36
  214. data/lib/active_scaffold/bridges/dragonfly/lib/dragonfly_bridge_helpers.rb +0 -12
  215. data/lib/active_scaffold/bridges/file_column/bridge.rb +0 -11
  216. data/lib/active_scaffold/bridges/file_column/lib/file_column_helpers.rb +0 -59
  217. data/lib/active_scaffold/bridges/paperclip/bridge.rb +0 -12
  218. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge.rb +0 -38
  219. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge_helpers.rb +0 -26
  220. data/lib/active_scaffold/bridges/record_select/bridge.rb +0 -5
  221. data/lib/active_scaffold/bridges/semantic_attributes/bridge.rb +0 -5
  222. data/lib/active_scaffold/bridges/shared/date_bridge.rb~ +0 -209
  223. data/lib/active_scaffold/bridges/tiny_mce/bridge.rb +0 -5
  224. data/lib/active_scaffold/bridges/validation_reflection/bridge.rb +0 -8
  225. data/lib/active_scaffold/bridges/validation_reflection/lib/validation_reflection_bridge.rb +0 -21
  226. data/lib/active_scaffold/config/base.rb~ +0 -70
  227. data/lib/active_scaffold/config/nested.rb~ +0 -41
  228. data/lib/active_scaffold/constraints.rb~ +0 -186
  229. data/lib/active_scaffold/data_structures/action_link.rb~ +0 -179
  230. data/lib/active_scaffold/data_structures/nested_info.rb~ +0 -123
  231. data/lib/active_scaffold/extensions/action_view_resolver.rb +0 -7
  232. data/lib/active_scaffold/extensions/active_association_reflection.rb~ +0 -22
  233. data/lib/active_scaffold/extensions/unsaved_associated.rb~ +0 -62
  234. data/lib/active_scaffold_assets.rb +0 -45
  235. data/lib/generators/active_scaffold_setup/USAGE +0 -10
  236. data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +0 -59
@@ -1,41 +0,0 @@
1
- module ActiveScaffold::Config
2
- class Nested < Base
3
- self.crud_type = :read
4
-
5
- def initialize(core_config)
6
- super
7
- @label = :add_existing_model
8
- self.shallow_delete = self.class.shallow_delete
9
- @action_group = self.class.action_group.clone if self.class.action_group
10
- end
11
-
12
- # global level configuration
13
- # --------------------------
14
- cattr_accessor :shallow_delete
15
- @@shallow_delete = true
16
-
17
- # instance-level configuration
18
- # ----------------------------
19
- attr_accessor :shallow_delete
20
-
21
- # Add a nested ActionLink
22
- def add_link(attribute, options = {})
23
- column = @core.columns[attribute.to_sym]
24
- unless column.nil? || column.association.nil?
25
- options.reverse_merge! :security_method => :nested_authorized?, :label => column.association.klass.model_name.human({:count => 2, :default => column.association.klass.name.pluralize})
26
- action_link = @core.link_for_association(column, options)
27
- @core.action_links.add_to_group(action_link, action_group) unless action_link.nil?
28
- else
29
-
30
- end
31
- end
32
-
33
- def add_scoped_link(named_scope, options = {})
34
- action_link = @core.link_for_association_as_scope(named_scope.to_sym, options)
35
- @core.action_links.add_to_group(action_link, action_group) unless action_link.nil?
36
- end
37
-
38
- # the label for this Nested action. used for the header.
39
- attr_writer :label
40
- end
41
- end
@@ -1,186 +0,0 @@
1
- module ActiveScaffold
2
- module Constraints
3
-
4
- protected
5
-
6
- # Returns the current constraints
7
- def active_scaffold_constraints
8
- @active_scaffold_constraints ||= active_scaffold_session_storage[:constraints] || {}
9
- end
10
-
11
- def set_active_scaffold_constraints
12
- associations_by_params = {}
13
- active_scaffold_config.model.reflect_on_all_associations.each do |association|
14
- associations_by_params[association.klass.name.foreign_key] = association.name unless association.options[:polymorphic]
15
- end
16
- params.each do |key, value|
17
- active_scaffold_constraints[associations_by_params[key]] = value if associations_by_params.include? key
18
- end
19
- end
20
-
21
- # For each enabled action, adds the constrained columns to the ActionColumns object (if it exists).
22
- # This lets the ActionColumns object skip constrained columns.
23
- #
24
- # If the constraint value is a Hash, then we assume the constraint is a multi-level association constraint (the reverse of a has_many :through) and we do NOT register the constraint column.
25
- def register_constraints_with_action_columns(association_constrained_fields = [], exclude_actions = [])
26
- debugger
27
- constrained_fields = active_scaffold_constraints.reject{|k, v| v.is_a? Hash}.keys.collect{|k| k.to_sym}
28
- constrained_fields = constrained_fields | association_constrained_fields
29
- if self.class.uses_active_scaffold?
30
- # we actually want to do this whether constrained_fields exist or not, so that we can reset the array when they don't
31
- active_scaffold_config.actions.each do |action_name|
32
- next if exclude_actions.include?(action_name)
33
- action = active_scaffold_config.send(action_name)
34
- next unless action.respond_to? :columns
35
- action.columns.constraint_columns = constrained_fields
36
- end
37
- end
38
- end
39
-
40
- # Returns search conditions based on the current scaffold constraints.
41
- #
42
- # Supports constraints based on either a column name (in which case it checks for an association
43
- # or just uses the search_sql) or a database field name.
44
- #
45
- # All of this work is primarily to support nested scaffolds in a manner generally useful for other
46
- # embedded scaffolds.
47
- def conditions_from_constraints
48
- conditions = nil
49
- debugger
50
- active_scaffold_constraints.each do |k, v|
51
- column = active_scaffold_config.columns[k]
52
- constraint_condition = if column
53
- # Assume this is a multi-level association constraint.
54
- # example:
55
- # data model: Park -> Den -> Bear
56
- # constraint: :den => {:park => 5}
57
- if v.is_a? Hash
58
- far_association = column.association.klass.reflect_on_association(v.keys.first)
59
- field = far_association.klass.primary_key
60
- table = far_association.table_name
61
-
62
- active_scaffold_includes.concat([{k => v.keys.first}]) # e.g. {:den => :park}
63
- constraint_condition_for("#{table}.#{field}", v.values.first)
64
-
65
- # association column constraint
66
- elsif column.association
67
- if column.association.macro == :has_and_belongs_to_many
68
- active_scaffold_habtm_joins.concat column.includes
69
- else
70
- active_scaffold_includes.concat column.includes
71
- end
72
- condition_from_association_constraint(column.association, v)
73
-
74
- # regular column constraints
75
- elsif column.searchable?
76
- active_scaffold_includes.concat column.includes
77
- constraint_condition_for(column.search_sql, v)
78
- end
79
- # unknown-to-activescaffold-but-real-database-column constraint
80
- elsif active_scaffold_config.model.column_names.include? k.to_s
81
- constraint_condition_for(k.to_s, v)
82
- else
83
- raise ActiveScaffold::MalformedConstraint, constraint_error(active_scaffold_config.model, k), caller
84
- end
85
-
86
- conditions = merge_conditions(conditions, constraint_condition)
87
- end
88
-
89
- conditions
90
- end
91
-
92
- # We do NOT want to use .search_sql. If anything, search_sql will refer
93
- # to a human-searchable value on the associated record.
94
- def condition_from_association_constraint(association, value)
95
- # when the reverse association is a :belongs_to, the id for the associated object only exists as
96
- # the primary_key on the other table. so for :has_one and :has_many (when the reverse is :belongs_to),
97
- # we have to use the other model's primary_key.
98
- #
99
- # please see the relevant tests for concrete examples.
100
- field = if [:has_one, :has_many].include?(association.macro)
101
- association.klass.primary_key
102
- elsif [:has_and_belongs_to_many].include?(association.macro)
103
- association.association_foreign_key
104
- else
105
- association.options[:foreign_key] || association.name.to_s.foreign_key
106
- end
107
-
108
- table = case association.macro
109
- when :has_and_belongs_to_many
110
- association.options[:join_table]
111
-
112
- when :belongs_to
113
- active_scaffold_config.model.table_name
114
-
115
- else
116
- association.table_name
117
- end
118
-
119
- if association.options[:primary_key]
120
- value = association.klass.find(value).send(association.options[:primary_key])
121
- end
122
-
123
- condition = constraint_condition_for("#{table}.#{field}", value)
124
- if association.options[:polymorphic]
125
- begin
126
- parent_scaffold = "#{session_info[:parent_scaffold].to_s.camelize}Controller".constantize
127
- condition = merge_conditions(
128
- condition,
129
- constraint_condition_for("#{table}.#{association.name}_type", parent_scaffold.active_scaffold_config.model_id.to_s)
130
- )
131
- rescue ActiveScaffold::ControllerNotFound
132
- nil
133
- end
134
- end
135
-
136
- condition
137
- end
138
-
139
- def constraint_error(klass, column_name)
140
- "Malformed constraint `#{klass}##{column_name}'. If it's a legitimate column, and you are using a nested scaffold, please specify or double-check the reverse association name."
141
- end
142
-
143
- # Applies constraints to the given record.
144
- #
145
- # Searches through the known columns for association columns. If the given constraint is an association,
146
- # it assumes that the constraint value is an id. It then does a association.klass.find with the value
147
- # and adds the associated object to the record.
148
- #
149
- # For some operations ActiveRecord will automatically update the database. That's not always ok.
150
- # If it *is* ok (e.g. you're in a transaction), then set :allow_autosave to true.
151
- def apply_constraints_to_record(record, options = {})
152
- options[:allow_autosave] = false if options[:allow_autosave].nil?
153
-
154
- active_scaffold_constraints.each do |k, v|
155
- column = active_scaffold_config.columns[k]
156
- if column and column.association
157
- if column.plural_association?
158
- record.send("#{k}").send(:<<, column.association.klass.find(v))
159
- elsif column.association.options[:polymorphic]
160
- record.send("#{k}=", params[:parent_model].constantize.find(v))
161
- else # regular singular association
162
- record.send("#{k}=", column.association.klass.find(v))
163
-
164
- # setting the belongs_to side of a has_one isn't safe. if the has_one was already
165
- # specified, rails won't automatically clear out the previous associated record.
166
- #
167
- # note that we can't take the extra step to correct this unless we're permitted to
168
- # run operations where activerecord auto-saves the object.
169
- reverse = column.association.klass.reflect_on_association(column.association.reverse)
170
- if reverse.macro == :has_one and options[:allow_autosave]
171
- record.send(k).send("#{column.association.reverse}=", record)
172
- end
173
- end
174
- else
175
- record.send("#{k}=", v)
176
- end
177
- end
178
- end
179
-
180
- private
181
-
182
- def constraint_condition_for(sql, value)
183
- value.nil? ? "#{sql} IS NULL" : ["#{sql} = ?", value]
184
- end
185
- end
186
- end
@@ -1,179 +0,0 @@
1
- module ActiveScaffold::DataStructures
2
- class ActionLink
3
- # provides a quick way to set any property of the object from a hash
4
- def initialize(action, options = {})
5
- # set defaults
6
- self.action = action.to_s
7
- self.label = action
8
- self.confirm = false
9
- self.type = :collection
10
- self.inline = true
11
- self.method = :get
12
- self.crud_type = :delete if [:destroy].include?(action.try(:to_sym))
13
- self.crud_type = :create if [:create, :new].include?(action.try(:to_sym))
14
- self.crud_type = :update if [:edit, :update].include?(action.try(:to_sym))
15
- self.crud_type ||= :read
16
- self.parameters = {}
17
- self.html_options = {}
18
- self.column = nil
19
- self.image = nil
20
- self.dynamic_parameters = nil
21
-
22
- # apply quick properties
23
- options.each_pair do |k, v|
24
- setter = "#{k}="
25
- self.send(setter, v) if self.respond_to? setter
26
- end
27
- end
28
-
29
- # the action-path for this link. what page to request? this is required!
30
- attr_accessor :action
31
-
32
- # the controller for this action link. if nil, the current controller should be assumed.
33
- attr_writer :controller
34
-
35
- def controller
36
- @controller = @controller.call if @controller.is_a?(Proc)
37
- @controller
38
- end
39
-
40
- def static_controller?
41
- !(@controller.is_a?(Proc) || (@controller == :polymorph))
42
- end
43
-
44
- # a hash of request parameters
45
- attr_accessor :parameters
46
-
47
- # a block for dynamic_parameters
48
- attr_accessor :dynamic_parameters
49
-
50
- # the RESTful method
51
- attr_accessor :method
52
-
53
- # what string to use to represent this action
54
- attr_writer :label
55
- def label
56
- @label.is_a?(Symbol) ? as_(@label) : @label
57
- end
58
-
59
- # image to use {:name => 'arrow.png', :size => '16x16'}
60
- attr_accessor :image
61
-
62
- # if the action requires confirmation
63
- def confirm=(value)
64
- @dhtml_confirm = nil if value
65
- @confirm = value
66
- end
67
- def confirm(label = '')
68
- @confirm.is_a?(String) ? @confirm : as_(@confirm, :label => label)
69
- end
70
- def confirm?
71
- !!@confirm
72
- end
73
-
74
- # if the action uses a DHTML based (i.e. 2-phase) confirmation
75
- attr_accessor :dhtml_confirm
76
- def dhtml_confirm=(value)
77
- @confirm = nil if value
78
- @dhtml_confirm = value
79
- end
80
- def dhtml_confirm?
81
- !!@dhtml_confirm
82
- end
83
-
84
- # what method to call on the controller to see if this action_link should be visible
85
- # note that this is only the UI part of the security. to prevent URL hax0rz, you also need security on requests (e.g. don't execute update method unless authorized).
86
- attr_writer :security_method
87
- def security_method
88
- @security_method || "#{self.action}_authorized?"
89
- end
90
-
91
- def security_method_set?
92
- !!@security_method
93
- end
94
-
95
- attr_accessor :ignore_method
96
-
97
- # the crud type of the (eventual?) action. different than :method, because this crud action may not be imminent.
98
- # this is used to determine record-level authorization (e.g. record.authorized_for?(:crud_type => link.crud_type).
99
- # options are :create, :read, :update, and :delete
100
- attr_accessor :crud_type
101
-
102
- # an "inline" link is inserted into the existing page
103
- # exclusive with popup? and page?
104
- def inline=(val)
105
- @inline = (val == true)
106
- self.popup = self.page = false if @inline
107
- end
108
- def inline?; @inline end
109
-
110
- # a "popup" link displays in a separate (browser?) window. this will eventually take arguments.
111
- # exclusive with inline? and page?
112
- def popup=(val)
113
- @popup = (val == true)
114
- if @popup
115
- self.inline = self.page = false
116
-
117
- # the :method parameter doesn't mix with the :popup parameter
118
- # when/if we start using DHTML popups, we can bring :method back
119
- self.method = nil
120
- end
121
- end
122
- def popup?; @popup end
123
-
124
- # a "page" link displays by reloading the current page
125
- # exclusive with inline? and popup?
126
- def page=(val)
127
- @page = (val == true)
128
- if @page
129
- self.inline = self.popup = false
130
-
131
- # when :method is defined, ActionView adds an onclick to use a form ...
132
- # so it's best to just empty out :method whenever possible.
133
- # we only ever need to know @method = :get for things that default to POST.
134
- # the only things that default to POST are forms and ajax calls.
135
- # when @page = true, we don't use ajax.
136
- self.method = nil if method == :get
137
- end
138
- end
139
- def page?; @page end
140
-
141
- # where the result of this action should insert in the display.
142
- # for :type => :collection, supported values are:
143
- # :top
144
- # :bottom
145
- # :replace (for updating the entire table)
146
- # false (no attempt at positioning)
147
- # for :type => :member, supported values are:
148
- # :before
149
- # :replace
150
- # :after
151
- # false (no attempt at positioning)
152
- attr_writer :position
153
- def position
154
- return @position unless @position.nil? or @position == true
155
- return :replace if self.type == :member
156
- return :top if self.type == :collection
157
- raise "what should the default position be for #{self.type}?"
158
- end
159
-
160
- # what type of link this is. currently supported values are :collection and :member.
161
- attr_accessor :type
162
-
163
- # html options for the link
164
- attr_accessor :html_options
165
-
166
- # nested action_links are referencing a column
167
- attr_accessor :column
168
-
169
- # indicates that this a nested_link
170
- def nested_link?
171
- @column || (parameters && parameters[:named_scope])
172
- end
173
-
174
- # Internal use: generated eid for this action_link
175
- attr_accessor :eid
176
-
177
-
178
- end
179
- end
@@ -1,123 +0,0 @@
1
- module ActiveScaffold::DataStructures
2
- class NestedInfo
3
- def self.get(model, session_storage)
4
- if session_storage[:nested].nil?
5
- nil
6
- else
7
- session_info = session_storage[:nested].clone
8
- begin
9
- session_info[:parent_scaffold] = "#{session_info[:parent_scaffold].to_s.camelize}Controller".constantize
10
- session_info[:parent_model] = session_info[:parent_scaffold].active_scaffold_config.model
11
- session_info[:association] = session_info[:parent_model].reflect_on_association(session_info[:name])
12
- unless session_info[:association].nil?
13
- ActiveScaffold::DataStructures::NestedInfoAssociation.new(model, session_info)
14
- else
15
- ActiveScaffold::DataStructures::NestedInfoScope.new(model, session_info)
16
- end
17
- rescue ActiveScaffold::ControllerNotFound
18
- nil
19
- end
20
- end
21
- end
22
-
23
- attr_accessor :association, :child_association, :parent_model, :parent_scaffold, :parent_id, :constrained_fields, :scope
24
-
25
- def initialize(model, session_info)
26
- @parent_model = session_info[:parent_model]
27
- @parent_id = session_info[:parent_id]
28
- @parent_scaffold = session_info[:parent_scaffold]
29
- end
30
-
31
- def new_instance?
32
- result = @new_instance.nil?
33
- @new_instance = false
34
- result
35
- end
36
-
37
- def parent_scope
38
- parent_model.find(parent_id)
39
- end
40
-
41
- def habtm?
42
- false
43
- end
44
-
45
- def belongs_to?
46
- false
47
- end
48
-
49
- def has_one?
50
- false
51
- end
52
-
53
- def readonly?
54
- false
55
- end
56
-
57
- def sorted?
58
- false
59
- end
60
- end
61
-
62
- class NestedInfoAssociation < NestedInfo
63
- def initialize(model, session_info)
64
- super(model, session_info)
65
- @association = session_info[:association]
66
- iterate_model_associations(model)
67
- end
68
-
69
- def habtm?
70
- association.macro == :has_and_belongs_to_many
71
- end
72
-
73
- def belongs_to?
74
- association.belongs_to?
75
- end
76
-
77
- def has_one?
78
- association.macro == :has_one
79
- end
80
-
81
- def readonly?
82
- if association.options.has_key? :readonly
83
- association.options[:readonly]
84
- else
85
- association.options.has_key? :through
86
- end
87
- end
88
-
89
- def sorted?
90
- association.options.has_key? :order
91
- end
92
-
93
- def default_sorting
94
- association.options[:order]
95
- end
96
-
97
- protected
98
-
99
- def iterate_model_associations(model)
100
- @constrained_fields = []
101
- @constrained_fields << association.primary_key_name.to_sym unless association.belongs_to?
102
- model.reflect_on_all_associations.each do |current|
103
- if !current.belongs_to? && association.primary_key_name == current.association_foreign_key
104
- constrained_fields << current.name.to_sym
105
- @child_association = current if current.klass == @parent_model
106
- end
107
- if association.primary_key_name == current.primary_key_name
108
- # show columns for has_many and has_one child associationes
109
- constrained_fields << current.name.to_sym if current.belongs_to?
110
- @child_association = current
111
- end
112
- end
113
- end
114
- end
115
-
116
- class NestedInfoScope < NestedInfo
117
- def initialize(model, session_info)
118
- super(model, session_info)
119
- @scope = session_info[:name]
120
- @constrained_fields = []
121
- end
122
- end
123
- end