active_scaffold 3.3.3 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
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