active_scaffold 3.3.3 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +39 -0
  3. data/README.md +5 -3
  4. data/app/assets/images/active_scaffold/refresh.png +0 -0
  5. data/app/assets/javascripts/jquery/active_scaffold.js +182 -91
  6. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +14 -16
  7. data/app/assets/javascripts/jquery/draggable_lists.js +33 -26
  8. data/app/assets/javascripts/jquery/jquery.editinplace.js +3 -3
  9. data/app/assets/javascripts/prototype/active_scaffold.js +61 -19
  10. data/app/assets/stylesheets/active_scaffold_colors.css.scss +4 -0
  11. data/app/assets/stylesheets/active_scaffold_images.css.scss +3 -0
  12. data/app/assets/stylesheets/active_scaffold_layout.css +23 -2
  13. data/app/views/active_scaffold_overrides/_add_existing_form.html.erb +1 -3
  14. data/app/views/active_scaffold_overrides/_base_form.html.erb +7 -5
  15. data/app/views/active_scaffold_overrides/_field_search.html.erb +1 -2
  16. data/app/views/active_scaffold_overrides/_form.html.erb +6 -4
  17. data/app/views/active_scaffold_overrides/_form_association.html.erb +4 -3
  18. data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +5 -5
  19. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +8 -6
  20. data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +3 -2
  21. data/app/views/active_scaffold_overrides/_list.html.erb +8 -6
  22. data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +1 -4
  23. data/app/views/active_scaffold_overrides/_list_pagination.html.erb +4 -4
  24. data/app/views/active_scaffold_overrides/_list_pagination_links.html.erb +1 -1
  25. data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -3
  26. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +8 -1
  27. data/app/views/active_scaffold_overrides/_search.html.erb +7 -13
  28. data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
  29. data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
  30. data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +1 -1
  31. data/app/views/active_scaffold_overrides/row.js.erb +1 -1
  32. data/config/locales/de.yml +106 -95
  33. data/config/locales/en.yml +108 -97
  34. data/config/locales/es.yml +109 -98
  35. data/config/locales/fr.yml +108 -97
  36. data/config/locales/hu.yml +109 -98
  37. data/config/locales/ja.yml +100 -89
  38. data/config/locales/ru.yml +115 -104
  39. data/lib/active_scaffold.rb +18 -294
  40. data/lib/active_scaffold/actions/common_search.rb +50 -17
  41. data/lib/active_scaffold/actions/core.rb +93 -22
  42. data/lib/active_scaffold/actions/create.rb +15 -6
  43. data/lib/active_scaffold/actions/field_search.rb +68 -60
  44. data/lib/active_scaffold/actions/list.rb +49 -28
  45. data/lib/active_scaffold/actions/nested.rb +14 -6
  46. data/lib/active_scaffold/actions/search.rb +36 -35
  47. data/lib/active_scaffold/actions/show.rb +9 -4
  48. data/lib/active_scaffold/actions/subform.rb +1 -1
  49. data/lib/active_scaffold/actions/update.rb +22 -7
  50. data/lib/active_scaffold/active_record_permissions.rb +125 -118
  51. data/lib/active_scaffold/attribute_params.rb +84 -66
  52. data/lib/active_scaffold/bridges.rb +3 -3
  53. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +10 -5
  54. data/lib/active_scaffold/bridges/cancan.rb +2 -1
  55. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +13 -2
  56. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -6
  57. data/lib/active_scaffold/bridges/chosen/helpers.rb +2 -2
  58. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +45 -29
  59. data/lib/active_scaffold/bridges/date_picker/ext.rb +11 -6
  60. data/lib/active_scaffold/bridges/date_picker/helper.rb +5 -1
  61. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +10 -5
  62. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -1
  63. data/lib/active_scaffold/bridges/file_column/form_ui.rb +12 -11
  64. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +14 -6
  65. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
  66. data/lib/active_scaffold/bridges/record_select/helpers.rb +15 -12
  67. data/lib/active_scaffold/bridges/shared/date_bridge.rb +7 -8
  68. data/lib/active_scaffold/bridges/tiny_mce.rb +5 -3
  69. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +4 -5
  70. data/lib/active_scaffold/config/base.rb +4 -0
  71. data/lib/active_scaffold/config/core.rb +12 -5
  72. data/lib/active_scaffold/config/delete.rb +0 -2
  73. data/lib/active_scaffold/config/field_search.rb +1 -4
  74. data/lib/active_scaffold/config/form.rb +0 -2
  75. data/lib/active_scaffold/config/list.rb +31 -1
  76. data/lib/active_scaffold/config/search.rb +0 -3
  77. data/lib/active_scaffold/config/show.rb +0 -6
  78. data/lib/active_scaffold/config/subform.rb +1 -0
  79. data/lib/active_scaffold/configurable.rb +2 -2
  80. data/lib/active_scaffold/constraints.rb +11 -14
  81. data/lib/active_scaffold/core.rb +277 -0
  82. data/lib/active_scaffold/data_structures/action_columns.rb +18 -2
  83. data/lib/active_scaffold/data_structures/action_link.rb +25 -6
  84. data/lib/active_scaffold/data_structures/action_links.rb +9 -4
  85. data/lib/active_scaffold/data_structures/actions.rb +1 -1
  86. data/lib/active_scaffold/data_structures/column.rb +6 -6
  87. data/lib/active_scaffold/data_structures/columns.rb +2 -2
  88. data/lib/active_scaffold/data_structures/nested_info.rb +5 -1
  89. data/lib/active_scaffold/data_structures/sorting.rb +15 -5
  90. data/lib/active_scaffold/delayed_setup.rb +30 -0
  91. data/lib/active_scaffold/engine.rb +25 -0
  92. data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
  93. data/lib/active_scaffold/extensions/left_outer_joins.rb +61 -21
  94. data/lib/active_scaffold/extensions/localize.rb +1 -1
  95. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +13 -8
  96. data/lib/active_scaffold/extensions/paginator_extensions.rb +5 -1
  97. data/lib/active_scaffold/extensions/reverse_associations.rb +1 -0
  98. data/lib/active_scaffold/extensions/routing_mapper.rb +1 -1
  99. data/lib/active_scaffold/extensions/unsaved_record.rb +4 -6
  100. data/lib/active_scaffold/finder.rb +79 -27
  101. data/lib/active_scaffold/helpers/association_helpers.rb +48 -18
  102. data/lib/active_scaffold/helpers/controller_helpers.rb +19 -10
  103. data/lib/active_scaffold/helpers/form_column_helpers.rb +185 -87
  104. data/lib/active_scaffold/helpers/human_condition_helpers.rb +2 -1
  105. data/lib/active_scaffold/helpers/id_helpers.rb +14 -8
  106. data/lib/active_scaffold/helpers/list_column_helpers.rb +65 -56
  107. data/lib/active_scaffold/helpers/pagination_helpers.rb +5 -1
  108. data/lib/active_scaffold/helpers/search_column_helpers.rb +21 -18
  109. data/lib/active_scaffold/helpers/view_helpers.rb +102 -64
  110. data/lib/active_scaffold/responds_to_parent.rb +39 -64
  111. data/lib/active_scaffold/tableless.rb +129 -10
  112. data/lib/active_scaffold/version.rb +2 -2
  113. data/test/bridges/bridge_test.rb +1 -1
  114. data/test/bridges/date_picker_test.rb +2 -2
  115. data/test/bridges/paperclip_test.rb +10 -8
  116. data/test/bridges/tiny_mce_test.rb +2 -2
  117. data/test/company.rb +22 -10
  118. data/test/config/base_test.rb +1 -1
  119. data/test/config/core_test.rb +8 -6
  120. data/test/config/create_test.rb +6 -6
  121. data/test/config/delete_test.rb +4 -4
  122. data/test/config/field_search_test.rb +6 -6
  123. data/test/config/list_test.rb +7 -7
  124. data/test/config/nested_test.rb +8 -7
  125. data/test/config/search_test.rb +7 -7
  126. data/test/config/show_test.rb +5 -5
  127. data/test/config/subform_test.rb +1 -1
  128. data/test/config/update_test.rb +5 -4
  129. data/test/data_structures/action_columns_test.rb +15 -16
  130. data/test/data_structures/action_link_test.rb +10 -10
  131. data/test/data_structures/action_links_test.rb +6 -6
  132. data/test/data_structures/actions_test.rb +4 -4
  133. data/test/data_structures/association_column_test.rb +4 -4
  134. data/test/data_structures/column_test.rb +9 -9
  135. data/test/data_structures/columns_test.rb +7 -7
  136. data/test/data_structures/error_message_test.rb +2 -4
  137. data/test/data_structures/set_test.rb +13 -13
  138. data/test/data_structures/sorting_test.rb +8 -8
  139. data/test/data_structures/standard_column_test.rb +2 -2
  140. data/test/data_structures/validation_reflection_test.rb +8 -8
  141. data/test/data_structures/virtual_column_test.rb +5 -5
  142. data/test/extensions/active_record_test.rb +1 -1
  143. data/test/helpers/form_column_helpers_test.rb +5 -5
  144. data/test/helpers/list_column_helpers_test.rb +2 -1
  145. data/test/helpers/pagination_helpers_test.rb +1 -1
  146. data/test/misc/active_record_permissions_test.rb +23 -4
  147. data/test/misc/attribute_params_test.rb +304 -136
  148. data/test/misc/calculation_test.rb +55 -0
  149. data/test/misc/configurable_test.rb +22 -21
  150. data/test/misc/constraints_test.rb +10 -7
  151. data/test/misc/convert_numbers_format_test.rb +149 -0
  152. data/test/misc/finder_test.rb +17 -13
  153. data/test/misc/lang_test.rb +1 -1
  154. data/test/misc/tableless_test.rb +18 -0
  155. data/test/mock_app/app/controllers/addresses_controller.rb +4 -0
  156. data/test/mock_app/app/controllers/buildings_controller.rb +4 -0
  157. data/test/mock_app/app/controllers/cars_controller.rb +4 -0
  158. data/test/mock_app/app/controllers/contacts_controller.rb +4 -0
  159. data/test/mock_app/app/controllers/floors_controller.rb +6 -0
  160. data/test/mock_app/app/controllers/people_controller.rb +4 -0
  161. data/test/mock_app/app/models/address.rb +3 -0
  162. data/test/mock_app/app/models/building.rb +8 -0
  163. data/test/mock_app/app/models/car.rb +3 -0
  164. data/test/mock_app/app/models/contact.rb +3 -0
  165. data/test/mock_app/app/models/file_model.rb +19 -0
  166. data/test/mock_app/app/models/floor.rb +8 -0
  167. data/test/mock_app/app/models/person.rb +11 -0
  168. data/test/mock_app/config/application.rb +2 -0
  169. data/test/mock_app/config/environments/test.rb +1 -1
  170. data/test/mock_app/config/initializers/secret_token.rb +5 -1
  171. data/test/mock_app/config/routes.rb +1 -1
  172. data/test/mock_app/db/schema.rb +51 -0
  173. data/test/model_stub.rb +3 -3
  174. data/test/test_helper.rb +15 -12
  175. metadata +51 -50
  176. data/lib/active_scaffold/extensions/array.rb +0 -7
  177. data/lib/active_scaffold/extensions/cache_association.rb +0 -16
  178. data/lib/active_scaffold/extensions/usa_state.rb +0 -46
  179. data/lib/active_scaffold_env.rb +0 -13
  180. data/test/extensions/array_test.rb +0 -12
  181. data/test/mock_app/public/blank.html +0 -33
  182. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +0 -2
  183. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  184. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  185. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  186. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  187. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  188. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  189. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  190. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  191. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +0 -2
  192. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +0 -532
  193. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +0 -867
  194. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +0 -117
  195. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +0 -370
  196. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +0 -2
  197. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +0 -35
  198. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +0 -848
@@ -56,6 +56,6 @@ module ActiveScaffold
56
56
  end
57
57
  end
58
58
 
59
- (Dir[File.join(File.dirname(__FILE__), "bridges/*.rb")] - [__FILE__]).each{|bridge_require|
60
- ActiveScaffold::Bridges.register bridge_require
61
- }
59
+ Dir[File.join(File.dirname(__FILE__), "bridges/*.rb")].each do |bridge|
60
+ ActiveScaffold::Bridges.register bridge unless bridge == __FILE__
61
+ end
@@ -18,16 +18,21 @@ module ActiveScaffold::Bridges
18
18
  class Ancestry
19
19
  module FormColumnHelpers
20
20
  def active_scaffold_input_ancestry(column, options)
21
+ record = options[:object]
22
+ ActiveSupport::Deprecation.warn "Relying on @record is deprecated, include :object in html_options with record.", caller if record.nil? # TODO Remove when relying on @record is removed
23
+ record ||= @record # TODO Remove when relying on @record is removed
24
+
21
25
  select_options = []
22
- select_control_options = {:selected => @record.parent_id}
23
- select_control_options[:include_blank] = as_(:_select_) if @record.parent_id.nil?
26
+ select_control_options = {:selected => record.parent_id}
27
+ select_control_options[:include_blank] = as_(:_select_) if record.parent_id.nil?
28
+ method = column.options[:label_method] || :to_label
24
29
  traverse_ancestry = proc do|key, value|
25
- unless key == @record
26
- select_options << ["#{'__' * key.depth}#{key.to_label}", key.id]
30
+ unless key == record
31
+ select_options << ["#{'__' * key.depth}#{key.send(method)}", key.id]
27
32
  value.each(&traverse_ancestry) if value.is_a?(Hash) && !value.empty?
28
33
  end
29
34
  end
30
- @record.class.arrange.each(&traverse_ancestry)
35
+ record.class.arrange.each(&traverse_ancestry)
31
36
  select(:record, :ancestry, select_options, select_control_options, options)
32
37
  end
33
38
  end
@@ -2,10 +2,11 @@ class ActiveScaffold::Bridges::Cancan < ActiveScaffold::DataStructures::Bridge
2
2
  def self.install
3
3
  require File.join(File.dirname(__FILE__), "cancan", "cancan_bridge.rb")
4
4
 
5
- ActiveScaffold::ClassMethods.send :include, ActiveScaffold::Bridges::Cancan::ClassMethods
5
+ ActiveScaffold::Core::ClassMethods.send :include, ActiveScaffold::Bridges::Cancan::ClassMethods
6
6
  ActiveScaffold::Actions::Core.send :include, ActiveScaffold::Bridges::Cancan::Actions::Core
7
7
  ActiveScaffold::Actions::Nested.send :include, ActiveScaffold::Bridges::Cancan::Actions::Core
8
8
  ActionController::Base.send :include, ActiveScaffold::Bridges::Cancan::ModelUserAccess::Controller
9
+ ActionView::Base.send :include, ActiveScaffold::Bridges::Cancan::AssociationHelpers
9
10
  ::ActiveRecord::Base.send :include, ActiveScaffold::Bridges::Cancan::ModelUserAccess::Model
10
11
  ::ActiveRecord::Base.send :include, ActiveScaffold::Bridges::Cancan::ActiveRecord
11
12
  end
@@ -10,7 +10,7 @@
10
10
  module CanCan
11
11
  module Ability
12
12
  def as_action_aliases
13
- alias_action :list, :row, :show_search, :render_field, :to => :read
13
+ alias_action :list, :show_search, :render_field, :to => :read
14
14
  alias_action :update_column, :edit_associated, :new_existing, :add_existing, :to => :update
15
15
  alias_action :delete, :destroy_existing, :to => :destroy
16
16
  end
@@ -38,6 +38,12 @@ module ActiveScaffold::Bridges
38
38
  end
39
39
  end
40
40
 
41
+ module AssociationHelpers
42
+ def association_klass_scoped(association, klass, record)
43
+ super.accessible_by(current_ability, :read)
44
+ end
45
+ end
46
+
41
47
  # beginning of chain integration
42
48
  module Actions
43
49
  module Core
@@ -73,7 +79,12 @@ module ActiveScaffold::Bridges
73
79
 
74
80
  module ClassMethods
75
81
  # The proc to call that retrieves the current_ability from the ApplicationController.
76
- attr_accessor :current_ability_proc
82
+ def current_ability_proc
83
+ Thread.current[:current_ability_proc]
84
+ end
85
+ def current_ability_proc=(value)
86
+ Thread.current[:current_ability_proc] = value
87
+ end
77
88
 
78
89
  # Class-level access to the current ability
79
90
  def current_ability
@@ -2,8 +2,12 @@ module ActiveScaffold
2
2
  module Helpers
3
3
  module FormColumnHelpers
4
4
  def active_scaffold_input_carrierwave(column, options)
5
+ record = options[:object]
6
+ ActiveSupport::Deprecation.warn "Relying on @record is deprecated, include :object in html_options with record.", caller if record.nil? # TODO Remove when relying on @record is removed
7
+ record ||= @record # TODO Remove when relying on @record is removed
5
8
  options = active_scaffold_input_text_options(options.merge(column.options))
6
- carrierwave = @record.send("#{column.name}")
9
+
10
+ carrierwave = record.send("#{column.name}")
7
11
  if !carrierwave.file.blank?
8
12
 
9
13
  remove_field_options = {
@@ -17,10 +21,11 @@ module ActiveScaffold
17
21
  :id => options[:id] + '_cache'
18
22
  }
19
23
 
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
+ case ActiveScaffold.js_framework
25
+ when :jquery
26
+ js_remove_file_code = "jQuery(this).prev('input#remove_#{options[:id]}').val('true'); jQuery(this).parent().hide().next().show(); return false;";
27
+ js_dont_remove_file_code = "jQuery(this).parents('div.carrierwave_controls').find('input#remove_#{options[:id]}').val('false'); return false;";
28
+ when :prototype
24
29
  js_remove_file_code = "$(this).previous('input#remove_#{options[:id]}').value='true'; $(this).up().hide().next().show(); return false;";
25
30
  js_dont_remove_file_code = "$(this).up('div.carrierwave_controls').down('input#remove_#{options[:id]}').value='false'; return false;";
26
31
  end
@@ -28,7 +33,7 @@ module ActiveScaffold
28
33
  input = file_field(:record, column.name, options.merge(:onchange => js_dont_remove_file_code))
29
34
  content_tag( :div,
30
35
  content_tag(:div, (
31
- get_column_value(@record, column) + " | " +
36
+ get_column_value(record, column) + " | " +
32
37
  hidden_field(:record, "#{column.name}_cache", cache_field_options) +
33
38
  hidden_field(:record, "remove_#{column.name}", remove_field_options) +
34
39
  content_tag(:a, as_(:remove_file), {:href => '#', :onclick => js_remove_file_code})
@@ -13,7 +13,7 @@ class ActiveScaffold::Bridges::Chosen
13
13
  html_options[:class] << ' chosen'
14
14
  if column.plural_association?
15
15
  associated_options, select_options = active_scaffold_plural_association_options(column)
16
- options = {:selected => associated_options.collect {|a| a[1]}, :include_blank => as_(:_select_)}
16
+ options = {:selected => associated_options.collect {|a| a.id}, :include_blank => as_(:_select_)}
17
17
 
18
18
  html_options.update(:multiple => true).update(column.options[:html_options] || {})
19
19
  options.update(column.options)
@@ -22,7 +22,7 @@ class ActiveScaffold::Bridges::Chosen
22
22
  if optgroup = options.delete(:optgroup)
23
23
  select(:record, column.name, active_scaffold_grouped_options(column, select_options, optgroup), options, html_options)
24
24
  else
25
- collection_select(:record, column.name, select_options, :id, :to_label, options, html_options)
25
+ collection_select(:record, column.name, select_options, :id, column.options[:label_method] || :to_label, options, html_options)
26
26
  end
27
27
  else
28
28
  active_scaffold_input_select(column, html_options)
@@ -1,15 +1,20 @@
1
1
  module ActiveScaffold::Bridges
2
2
  class CountryHelper
3
3
  module CountryHelpers
4
+ def country_select_class
5
+ defined?(ActionView::Helpers::InstanceTag) ? ActionView::Helpers::InstanceTag : ActionView::Helpers::Tags::CountrySelect
6
+ end
4
7
  # Return select and option tags for the given object and method, using country_options_for_select to generate the list of option tags.
5
8
  def country_select(object, method, priority_countries = nil, options = {}, html_options = {})
6
- ActionView::Helpers::InstanceTag.new(object, method, self, options.delete(:object)).to_country_select_tag(priority_countries, options, html_options)
9
+ country_select_class.new(object, method, self, options).to_country_select_tag(priority_countries, options, html_options)
7
10
  end
8
11
 
9
12
  def usa_state_select(object, method, priority_states = nil, options = {}, html_options = {})
10
- ActionView::Helpers::InstanceTag.new(object, method, self, options.delete(:object)).to_usa_state_select_tag(priority_states, options, html_options)
13
+ country_select_class.new(object, method, self, options).to_usa_state_select_tag(priority_states, options, html_options)
11
14
  end
15
+ end
12
16
 
17
+ module CountryOptionsHelpers
13
18
  # Returns a string of option tags for pretty much any country in the world. Supply a country name as +selected+ to
14
19
  # have it marked as the selected option tag. You can also supply an array of countries as +priority_countries+, so
15
20
  # that they will be listed above the rest of the (long) list.
@@ -19,7 +24,7 @@ module ActiveScaffold::Bridges
19
24
  if priority_countries
20
25
  country_options = options_for_select(priority_countries.collect {|country| [I18n.t("countries.#{country}", :default => country.to_s.titleize), country.to_s]} + [['-------------', '']], :selected => selected, :disabled => '')
21
26
  else
22
- country_options = ""
27
+ country_options = options_for_select([])
23
28
  end
24
29
 
25
30
  return country_options + options_for_select(COUNTRIES.collect {|country| [I18n.t("countries.#{country}", :default => country.to_s.titleize), country.to_s]}, :selected => selected)
@@ -33,7 +38,7 @@ module ActiveScaffold::Bridges
33
38
  if priority_states
34
39
  state_options = options_for_select(priority_states + [['-------------', '']], :selected => selected, :disabled => '')
35
40
  else
36
- state_options = ""
41
+ state_options = options_for_select([])
37
42
  end
38
43
 
39
44
  if priority_states && priority_states.include?(selected)
@@ -45,7 +50,7 @@ module ActiveScaffold::Bridges
45
50
  return state_options
46
51
  end
47
52
  # All the countries included in the country_options output.
48
- COUNTRIES = [
53
+ COUNTRIES = [
49
54
  :afghanistan,
50
55
  :aland_islands,
51
56
  :albania,
@@ -293,34 +298,32 @@ module ActiveScaffold::Bridges
293
298
  :zimbabwe] unless const_defined?("COUNTRIES")
294
299
 
295
300
 
296
- USASTATES = [["Alabama", "AL"], ["Alaska", "AK"], ["Arizona", "AZ"], ["Arkansas", "AR"], ["California", "CA"], ["Colorado", "CO"], ["Connecticut", "CT"], ["Delaware", "DE"], ["District of Columbia", "DC"], ["Florida", "FL"], ["Georgia", "GA"], ["Hawaii", "HI"], ["Idaho", "ID"], ["Illinois", "IL"], ["Indiana", "IN"], ["Iowa", "IA"], ["Kansas", "KS"], ["Kentucky", "KY"], ["Louisiana", "LA"], ["Maine", "ME"], ["Maryland", "MD"], ["Massachusetts", "MA"], ["Michigan", "MI"], ["Minnesota", "MN"], ["Mississippi", "MS"], ["Missouri", "MO"], ["Montana", "MT"], ["Nebraska", "NE"], ["Nevada", "NV"], ["New Hampshire", "NH"], ["New Jersey", "NJ"], ["New Mexico", "NM"], ["New York", "NY"], ["North Carolina", "NC"], ["North Dakota", "ND"], ["Ohio", "OH"], ["Oklahoma", "OK"], ["Oregon", "OR"], ["Pennsylvania", "PA"], ["Rhode Island", "RI"], ["South Carolina", "SC"], ["South Dakota", "SD"], ["Tennessee", "TN"], ["Texas", "TX"], ["Utah", "UT"], ["Vermont", "VT"], ["Virginia", "VA"], ["Washington", "WA"], ["Wisconsin", "WI"], ["West Virginia", "WV"], ["Wyoming", "WY"]] unless const_defined?("USASTATES")
297
-
298
- class ActionView::Helpers::InstanceTag #:nodoc:
299
- include CountryHelpers
301
+ USASTATES = [["Alabama", "AL"], ["Alaska", "AK"], ["Arizona", "AZ"], ["Arkansas", "AR"], ["California", "CA"], ["Colorado", "CO"], ["Connecticut", "CT"], ["Delaware", "DE"], ["District of Columbia", "DC"], ["Florida", "FL"], ["Georgia", "GA"], ["Hawaii", "HI"], ["Idaho", "ID"], ["Illinois", "IL"], ["Indiana", "IN"], ["Iowa", "IA"], ["Kansas", "KS"], ["Kentucky", "KY"], ["Louisiana", "LA"], ["Maine", "ME"], ["Maryland", "MD"], ["Massachusetts", "MA"], ["Michigan", "MI"], ["Minnesota", "MN"], ["Mississippi", "MS"], ["Missouri", "MO"], ["Montana", "MT"], ["Nebraska", "NE"], ["Nevada", "NV"], ["New Hampshire", "NH"], ["New Jersey", "NJ"], ["New Mexico", "NM"], ["New York", "NY"], ["North Carolina", "NC"], ["North Dakota", "ND"], ["Ohio", "OH"], ["Oklahoma", "OK"], ["Oregon", "OR"], ["Pennsylvania", "PA"], ["Rhode Island", "RI"], ["South Carolina", "SC"], ["South Dakota", "SD"], ["Tennessee", "TN"], ["Texas", "TX"], ["Utah", "UT"], ["Vermont", "VT"], ["Virginia", "VA"], ["Washington", "WA"], ["Wisconsin", "WI"], ["West Virginia", "WV"], ["Wyoming", "WY"]] unless const_defined?("USASTATES")
302
+ end
300
303
 
301
- def to_country_select_tag(priority_countries, options, html_options)
302
- html_options = html_options.stringify_keys
303
- add_default_name_and_id(html_options)
304
- value = value(object)
305
- selected_value = options.has_key?(:selected) ? options[:selected] : value
306
- content_tag("select",
307
- add_options(
308
- country_options_for_select(selected_value, priority_countries),
309
- options, selected_value
310
- ), html_options
311
- )
312
- end
304
+ module InstanceTagMethods
305
+ def to_country_select_tag(priority_countries, options, html_options)
306
+ html_options = html_options.stringify_keys
307
+ add_default_name_and_id(html_options)
308
+ value = value(object)
309
+ selected_value = options.has_key?(:selected) ? options[:selected] : value
310
+ content_tag("select",
311
+ add_options(
312
+ country_options_for_select(selected_value, priority_countries),
313
+ options, selected_value
314
+ ), html_options
315
+ )
316
+ end
313
317
 
314
- def to_usa_state_select_tag(priority_states, options, html_options)
315
- html_options = html_options.stringify_keys
316
- add_default_name_and_id(html_options)
317
- value = value(object)
318
- selected_value = options.has_key?(:selected) ? options[:selected] : value
319
- content_tag("select", add_options(usa_state_options_for_select(selected_value, priority_states), options, selected_value), html_options)
320
- end
318
+ def to_usa_state_select_tag(priority_states, options, html_options)
319
+ html_options = html_options.stringify_keys
320
+ add_default_name_and_id(html_options)
321
+ value = value(object)
322
+ selected_value = options.has_key?(:selected) ? options[:selected] : value
323
+ content_tag("select", add_options(usa_state_options_for_select(selected_value, priority_states), options, selected_value), html_options)
321
324
  end
322
325
  end
323
-
326
+
324
327
  module FormColumnHelpers
325
328
  def active_scaffold_input_country(column, options)
326
329
  select_options = {:prompt => as_(:_select_)}
@@ -353,6 +356,19 @@ end
353
356
 
354
357
  ActionView::Base.class_eval do
355
358
  include ActiveScaffold::Bridges::CountryHelper::CountryHelpers
359
+ include ActiveScaffold::Bridges::CountryHelper::CountryOptionsHelpers
356
360
  include ActiveScaffold::Bridges::CountryHelper::FormColumnHelpers
357
361
  include ActiveScaffold::Bridges::CountryHelper::SearchColumnHelpers
358
362
  end
363
+ if defined? ActionView::Helpers::InstanceTag
364
+ ActionView::Helpers::InstanceTag.class_eval do
365
+ include ActiveScaffold::Bridges::CountryHelper::CountryOptionsHelpers
366
+ include ActiveScaffold::Bridges::CountryHelper::InstanceTagMethods
367
+ end
368
+ else
369
+ class ActionView::Helpers::Tags::CountrySelect < ActionView::Helpers::Tags::Base #:nodoc:
370
+ include ActiveScaffold::Bridges::CountryHelper::CountryOptionsHelpers
371
+ include ActiveScaffold::Bridges::CountryHelper::InstanceTagMethods
372
+ end
373
+ end
374
+
@@ -26,14 +26,19 @@ ActiveScaffold::Config::Core.class_eval do
26
26
  alias_method_chain :initialize, :date_picker
27
27
  end
28
28
 
29
- ActiveRecord::ConnectionAdapters::Column.class_eval do
30
- class << self
31
- def fallback_string_to_date_with_date_picker(string)
32
- Date.strptime(string, I18n.t('date.formats.default')) rescue fallback_string_to_date_without_date_picker(string)
33
- end
34
- alias_method_chain :fallback_string_to_date, :date_picker
29
+ module ActiveScaffold::Bridges::DatePicker::CastExtension
30
+ def fallback_string_to_date_with_date_picker(string)
31
+ Date.strptime(string, I18n.t('date.formats.default')) rescue fallback_string_to_date_without_date_picker(string)
32
+ end
33
+ def self.included(base)
34
+ base.alias_method_chain :fallback_string_to_date, :date_picker
35
35
  end
36
36
  end
37
+ if defined?(ActiveRecord::ConnectionAdapters::Type)
38
+ ActiveRecord::ConnectionAdapters::Type::Date.send(:include, ActiveScaffold::Bridges::DatePicker::CastExtension)
39
+ else
40
+ ActiveRecord::ConnectionAdapters::Column.extend ActiveScaffold::Bridges::DatePicker::CastExtension
41
+ end
37
42
 
38
43
  ActionView::Base.class_eval do
39
44
  include ActiveScaffold::Bridges::Shared::DateBridge::SearchColumnHelpers
@@ -167,9 +167,13 @@ module ActiveScaffold::Bridges
167
167
 
168
168
  module FormColumnHelpers
169
169
  def active_scaffold_input_date_picker(column, options)
170
+ record = options[:object]
171
+ ActiveSupport::Deprecation.warn "Relying on @record is deprecated, include :object in html_options with record.", caller if record.nil? # TODO Remove when relying on @record is removed
172
+ record ||= @record # TODO Remove when relying on @record is removed
170
173
  options = active_scaffold_input_text_options(options.merge(column.options))
171
174
  options[:class] << " #{column.form_ui.to_s}"
172
- value = controller.class.condition_value_for_datetime(column, @record.send(column.name), column.form_ui == :date_picker ? :to_date : :to_time)
175
+
176
+ value = controller.class.condition_value_for_datetime(column, record.send(column.name), column.form_ui == :date_picker ? :to_date : :to_time)
173
177
  format = options.delete(:format) || (column.form_ui == :date_picker ? :default : :picker)
174
178
  datepicker_format_options(column, format, options)
175
179
  options[:value] = (value ? l(value, :format => format) : nil)
@@ -2,17 +2,22 @@ module ActiveScaffold
2
2
  module Helpers
3
3
  module FormColumnHelpers
4
4
  def active_scaffold_input_dragonfly(column, options)
5
+ record = options[:object]
6
+ ActiveSupport::Deprecation.warn "Relying on @record is deprecated, include :object in html_options with record.", caller if record.nil? # TODO Remove when relying on @record is removed
7
+ record ||= @record # TODO Remove when relying on @record is removed
5
8
  options = active_scaffold_input_text_options(options.merge(column.options))
9
+
6
10
  input = file_field(:record, column.name, options)
7
- dragonfly = @record.send("#{column.name}")
11
+ dragonfly = record.send("#{column.name}")
8
12
  if dragonfly.present?
9
- if ActiveScaffold.js_framework == :jquery
10
- js_remove_file_code = "$(this).prev().val('true'); $(this).parent().hide().next().show(); return false;";
11
- else
13
+ case ActiveScaffold.js_framework
14
+ when :jquery
15
+ js_remove_file_code = "jQuery(this).prev().val('true'); jQuery(this).parent().hide().next().show(); return false;";
16
+ when :prototype
12
17
  js_remove_file_code = "$(this).previous().value='true'; $(this).up().hide().next().show(); return false;";
13
18
  end
14
19
 
15
- content = active_scaffold_column_dragonfly(@record, column)
20
+ content = active_scaffold_column_dragonfly(record, column)
16
21
  content_tag(:div,
17
22
  content + " | " +
18
23
  hidden_field(:record, "remove_#{column.name}", :value => "false") +
@@ -9,7 +9,12 @@ module ActiveScaffold
9
9
  else
10
10
  attachment.name
11
11
  end
12
- link_to(content, attachment.remote_url, {'data-popup' => true, :target => '_blank'})
12
+ link_to(content, dragonfly_url_for_attachment(attachment, record, column), :target => '_blank')
13
+ end
14
+
15
+ def dragonfly_url_for_attachment(attachment, record, column)
16
+ url_method = column.options[:private_store] ? :url : :remote_url
17
+ attachment.send(url_method)
13
18
  end
14
19
  end
15
20
  end
@@ -3,30 +3,31 @@ module ActiveScaffold
3
3
  # Helpers that assist with the rendering of a Form Column
4
4
  module FormColumnHelpers
5
5
  def active_scaffold_input_file_column(column, options)
6
- if @record.send(column.name)
6
+ record = options[:object]
7
+ ActiveSupport::Deprecation.warn "Relying on @record is deprecated, include :object in html_options with record.", caller if record.nil? # TODO Remove when relying on @record is removed
8
+ record ||= @record # TODO Remove when relying on @record is removed
9
+ if record.send(column.name)
7
10
  # we already have a value? display the form for deletion.
8
- if ActiveScaffold.js_framework == :jquery
9
- remove_file_js = "$(this).prev().val('true'); $(this).parent().hide().next().show(); return false;";
10
- else
11
+ case ActiveScaffold.js_framework
12
+ when :jquery
13
+ remove_file_js = "jQuery(this).prev().val('true'); jQuery(this).parent().hide().next().show(); return false;";
14
+ when :prototype
11
15
  remove_file_js = "$(this).previous().value='true'; p=$(this).up(); p.hide(); p.next().show(); return false;";
12
16
  end
13
17
 
14
- hidden_options = options.dup
15
- hidden_options[:id] += '_delete'
16
- hidden_options[:name].sub!("[#{column.name}]", "[delete_#{column.name}]")
17
- hidden_options[:value] = 'false'
18
+ hidden_options = options.merge(:id => options[:id] + '_delete', :name => options[:name].sub("[#{column.name}]", "[delete_#{column.name}]"), :value => 'false')
18
19
  custom_hidden_field_tag = hidden_field(:record, column.name, hidden_options)
19
20
 
20
21
  content_tag(:div) do
21
22
  content_tag(:div) do
22
- content = get_column_value(@record, column) + " #{custom_hidden_field_tag} | ".html_safe
23
+ content = get_column_value(record, column) + " #{custom_hidden_field_tag} | ".html_safe
23
24
  content += content_tag(:a, as_(:remove_file), {:href => '#', :onclick => remove_file_js})
24
25
  content += content_tag(:div, file_column_field("record", column.name, options), :style => "display: none")
25
26
  end
26
27
  end
27
- else
28
+ else
28
29
  file_column_field("record", column.name, options)
29
- end
30
+ end
30
31
  end
31
32
 
32
33
  end
@@ -2,20 +2,28 @@ module ActiveScaffold
2
2
  module Helpers
3
3
  module FormColumnHelpers
4
4
  def active_scaffold_input_paperclip(column, options)
5
+ record = options[:object]
6
+ ActiveSupport::Deprecation.warn "Relying on @record is deprecated, include :object in html_options with record.", caller if record.nil? # TODO Remove when relying on @record is removed
7
+ record ||= @record # TODO Remove when relying on @record is removed
5
8
  options = active_scaffold_input_text_options(options.merge(column.options))
9
+
6
10
  input = file_field(:record, column.name, options)
7
- paperclip = @record.send("#{column.name}")
11
+ paperclip = record.send("#{column.name}")
8
12
  if paperclip.file?
9
- if ActiveScaffold.js_framework == :jquery
10
- js_remove_file_code = "$(this).prev().val('true'); $(this).parent().hide().next().show(); return false;";
11
- else
13
+ case ActiveScaffold.js_framework
14
+ when :jquery
15
+ js_remove_file_code = "jQuery(this).prev().val('true'); jQuery(this).parent().hide().next().show(); return false;";
16
+ when :prototype
12
17
  js_remove_file_code = "$(this).previous().value='true'; $(this).up().hide().next().show(); return false;";
13
18
  end
14
19
 
15
- content = active_scaffold_column_paperclip(@record, column)
20
+ object_name, method = options[:name].split(/\[(#{column.name})\]/)
21
+ method.sub!(/#{column.name}/, 'delete_\0')
22
+
23
+ content = active_scaffold_column_paperclip(record, column)
16
24
  content_tag(:div,
17
25
  content + " | " +
18
- hidden_field(:record, "delete_#{column.name}", :value => "false") +
26
+ hidden_field(object_name, method, :value => "false") +
19
27
  content_tag(:a, as_(:remove_file), {:href => '#', :onclick => js_remove_file_code})
20
28
  ) + content_tag(:div, input, :style => "display: none")
21
29
  else
@@ -9,7 +9,7 @@ module ActiveScaffold
9
9
  else
10
10
  paperclip.original_filename
11
11
  end
12
- link_to(content, paperclip.url, {'data-popup' => true, :target => '_blank'})
12
+ link_to(content, paperclip.url, :target => '_blank')
13
13
  end
14
14
  end
15
15
  end
@@ -10,23 +10,26 @@ class ActiveScaffold::Bridges::RecordSelect
10
10
  module FormColumnHelpers
11
11
  # requires RecordSelect plugin to be installed and configured.
12
12
  def active_scaffold_input_record_select(column, options)
13
+ record = options.delete(:object)
14
+ ActiveSupport::Deprecation.warn "Relying on @record is deprecated, include :object in html_options with record.", caller if record.nil? # TODO Remove when relying on @record is removed
15
+ record ||= @record # TODO Remove when relying on @record is removed
13
16
  if column.singular_association?
14
17
  multiple = false
15
18
  multiple = column.options[:html_options][:multiple] if column.options[:html_options] && column.options[:html_options][:multiple]
16
- active_scaffold_record_select(column, options, @record.send(column.name), multiple)
19
+ active_scaffold_record_select(record, column, options, record.send(column.name), multiple)
17
20
  elsif column.plural_association?
18
- active_scaffold_record_select(column, options, @record.send(column.name), true)
21
+ active_scaffold_record_select(record, column, options, record.send(column.name), true)
19
22
  else
20
- active_scaffold_record_select_autocomplete(column, options)
23
+ active_scaffold_record_select_autocomplete(record, column, options)
21
24
  end
22
25
  end
23
26
 
24
- def active_scaffold_record_select(column, options, value, multiple)
27
+ def active_scaffold_record_select(record, column, options, value, multiple)
25
28
  unless column.association
26
29
  raise ArgumentError, "record_select can only work against associations (and #{column.name} is not). A common mistake is to specify the foreign key field (like :user_id), instead of the association (:user)."
27
30
  end
28
31
  klass = if column.polymorphic_association?
29
- @record.send(column.association.foreign_type).constantize rescue nil
32
+ record.send(column.association.foreign_type).constantize rescue nil
30
33
  else
31
34
  column.association.klass
32
35
  end
@@ -50,16 +53,16 @@ class ActiveScaffold::Bridges::RecordSelect
50
53
  else
51
54
  record_select_field(options[:name], value || klass.new, record_select_options)
52
55
  end
53
- html = self.class.field_error_proc.call(html, self) if @record.errors[column.name].any?
56
+ html = self.class.field_error_proc.call(html, self) if record.errors[column.name].any?
54
57
  html
55
58
  end
56
59
 
57
- def active_scaffold_record_select_autocomplete(column, options)
60
+ def active_scaffold_record_select_autocomplete(record, column, options)
58
61
  record_select_options = active_scaffold_input_text_options(options).merge(
59
- :controller => active_scaffold_controller_for(@record.class).controller_path
60
- )
61
- html = record_select_autocomplete(options[:name], @record, record_select_options)
62
- html = self.class.field_error_proc.call(html, self) if @record.errors[column.name].any?
62
+ :controller => active_scaffold_controller_for(record.class).controller_path
63
+ ).merge(column.options)
64
+ html = record_select_autocomplete(options[:name], record, record_select_options)
65
+ html = self.class.field_error_proc.call(html, self) if record.errors[column.name].any?
63
66
  html
64
67
  end
65
68
  end
@@ -81,7 +84,7 @@ class ActiveScaffold::Bridges::RecordSelect
81
84
  end
82
85
  end
83
86
  rescue Exception => e
84
- logger.error Time.now.to_s + "Sorry, we are not that smart yet. Attempted to restore search values to search fields but instead got -- #{e.inspect} -- on the ActiveScaffold column = :#{column.name} in #{@controller.class}"
87
+ logger.error "#{e.class.name}: #{e.message} -- Sorry, we are not that smart yet. Attempted to restore search values to search fields :#{column.name} in #{controller.class}"
85
88
  raise e
86
89
  end
87
90
  end