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.
- checksums.yaml +4 -4
- data/CHANGELOG +39 -0
- data/README.md +5 -3
- data/app/assets/images/active_scaffold/refresh.png +0 -0
- data/app/assets/javascripts/jquery/active_scaffold.js +182 -91
- data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +14 -16
- data/app/assets/javascripts/jquery/draggable_lists.js +33 -26
- data/app/assets/javascripts/jquery/jquery.editinplace.js +3 -3
- data/app/assets/javascripts/prototype/active_scaffold.js +61 -19
- data/app/assets/stylesheets/active_scaffold_colors.css.scss +4 -0
- data/app/assets/stylesheets/active_scaffold_images.css.scss +3 -0
- data/app/assets/stylesheets/active_scaffold_layout.css +23 -2
- data/app/views/active_scaffold_overrides/_add_existing_form.html.erb +1 -3
- data/app/views/active_scaffold_overrides/_base_form.html.erb +7 -5
- data/app/views/active_scaffold_overrides/_field_search.html.erb +1 -2
- data/app/views/active_scaffold_overrides/_form.html.erb +6 -4
- data/app/views/active_scaffold_overrides/_form_association.html.erb +4 -3
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +5 -5
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +8 -6
- data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +3 -2
- data/app/views/active_scaffold_overrides/_list.html.erb +8 -6
- data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +1 -4
- data/app/views/active_scaffold_overrides/_list_pagination.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_list_pagination_links.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +8 -1
- data/app/views/active_scaffold_overrides/_search.html.erb +7 -13
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
- data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
- data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +1 -1
- data/app/views/active_scaffold_overrides/row.js.erb +1 -1
- data/config/locales/de.yml +106 -95
- data/config/locales/en.yml +108 -97
- data/config/locales/es.yml +109 -98
- data/config/locales/fr.yml +108 -97
- data/config/locales/hu.yml +109 -98
- data/config/locales/ja.yml +100 -89
- data/config/locales/ru.yml +115 -104
- data/lib/active_scaffold.rb +18 -294
- data/lib/active_scaffold/actions/common_search.rb +50 -17
- data/lib/active_scaffold/actions/core.rb +93 -22
- data/lib/active_scaffold/actions/create.rb +15 -6
- data/lib/active_scaffold/actions/field_search.rb +68 -60
- data/lib/active_scaffold/actions/list.rb +49 -28
- data/lib/active_scaffold/actions/nested.rb +14 -6
- data/lib/active_scaffold/actions/search.rb +36 -35
- data/lib/active_scaffold/actions/show.rb +9 -4
- data/lib/active_scaffold/actions/subform.rb +1 -1
- data/lib/active_scaffold/actions/update.rb +22 -7
- data/lib/active_scaffold/active_record_permissions.rb +125 -118
- data/lib/active_scaffold/attribute_params.rb +84 -66
- data/lib/active_scaffold/bridges.rb +3 -3
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +10 -5
- data/lib/active_scaffold/bridges/cancan.rb +2 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +13 -2
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -6
- data/lib/active_scaffold/bridges/chosen/helpers.rb +2 -2
- data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +45 -29
- data/lib/active_scaffold/bridges/date_picker/ext.rb +11 -6
- data/lib/active_scaffold/bridges/date_picker/helper.rb +5 -1
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +10 -5
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -1
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +12 -11
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +14 -6
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +15 -12
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +7 -8
- data/lib/active_scaffold/bridges/tiny_mce.rb +5 -3
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +4 -5
- data/lib/active_scaffold/config/base.rb +4 -0
- data/lib/active_scaffold/config/core.rb +12 -5
- data/lib/active_scaffold/config/delete.rb +0 -2
- data/lib/active_scaffold/config/field_search.rb +1 -4
- data/lib/active_scaffold/config/form.rb +0 -2
- data/lib/active_scaffold/config/list.rb +31 -1
- data/lib/active_scaffold/config/search.rb +0 -3
- data/lib/active_scaffold/config/show.rb +0 -6
- data/lib/active_scaffold/config/subform.rb +1 -0
- data/lib/active_scaffold/configurable.rb +2 -2
- data/lib/active_scaffold/constraints.rb +11 -14
- data/lib/active_scaffold/core.rb +277 -0
- data/lib/active_scaffold/data_structures/action_columns.rb +18 -2
- data/lib/active_scaffold/data_structures/action_link.rb +25 -6
- data/lib/active_scaffold/data_structures/action_links.rb +9 -4
- data/lib/active_scaffold/data_structures/actions.rb +1 -1
- data/lib/active_scaffold/data_structures/column.rb +6 -6
- data/lib/active_scaffold/data_structures/columns.rb +2 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +5 -1
- data/lib/active_scaffold/data_structures/sorting.rb +15 -5
- data/lib/active_scaffold/delayed_setup.rb +30 -0
- data/lib/active_scaffold/engine.rb +25 -0
- data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
- data/lib/active_scaffold/extensions/left_outer_joins.rb +61 -21
- data/lib/active_scaffold/extensions/localize.rb +1 -1
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +13 -8
- data/lib/active_scaffold/extensions/paginator_extensions.rb +5 -1
- data/lib/active_scaffold/extensions/reverse_associations.rb +1 -0
- data/lib/active_scaffold/extensions/routing_mapper.rb +1 -1
- data/lib/active_scaffold/extensions/unsaved_record.rb +4 -6
- data/lib/active_scaffold/finder.rb +79 -27
- data/lib/active_scaffold/helpers/association_helpers.rb +48 -18
- data/lib/active_scaffold/helpers/controller_helpers.rb +19 -10
- data/lib/active_scaffold/helpers/form_column_helpers.rb +185 -87
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +2 -1
- data/lib/active_scaffold/helpers/id_helpers.rb +14 -8
- data/lib/active_scaffold/helpers/list_column_helpers.rb +65 -56
- data/lib/active_scaffold/helpers/pagination_helpers.rb +5 -1
- data/lib/active_scaffold/helpers/search_column_helpers.rb +21 -18
- data/lib/active_scaffold/helpers/view_helpers.rb +102 -64
- data/lib/active_scaffold/responds_to_parent.rb +39 -64
- data/lib/active_scaffold/tableless.rb +129 -10
- data/lib/active_scaffold/version.rb +2 -2
- data/test/bridges/bridge_test.rb +1 -1
- data/test/bridges/date_picker_test.rb +2 -2
- data/test/bridges/paperclip_test.rb +10 -8
- data/test/bridges/tiny_mce_test.rb +2 -2
- data/test/company.rb +22 -10
- data/test/config/base_test.rb +1 -1
- data/test/config/core_test.rb +8 -6
- data/test/config/create_test.rb +6 -6
- data/test/config/delete_test.rb +4 -4
- data/test/config/field_search_test.rb +6 -6
- data/test/config/list_test.rb +7 -7
- data/test/config/nested_test.rb +8 -7
- data/test/config/search_test.rb +7 -7
- data/test/config/show_test.rb +5 -5
- data/test/config/subform_test.rb +1 -1
- data/test/config/update_test.rb +5 -4
- data/test/data_structures/action_columns_test.rb +15 -16
- data/test/data_structures/action_link_test.rb +10 -10
- data/test/data_structures/action_links_test.rb +6 -6
- data/test/data_structures/actions_test.rb +4 -4
- data/test/data_structures/association_column_test.rb +4 -4
- data/test/data_structures/column_test.rb +9 -9
- data/test/data_structures/columns_test.rb +7 -7
- data/test/data_structures/error_message_test.rb +2 -4
- data/test/data_structures/set_test.rb +13 -13
- data/test/data_structures/sorting_test.rb +8 -8
- data/test/data_structures/standard_column_test.rb +2 -2
- data/test/data_structures/validation_reflection_test.rb +8 -8
- data/test/data_structures/virtual_column_test.rb +5 -5
- data/test/extensions/active_record_test.rb +1 -1
- data/test/helpers/form_column_helpers_test.rb +5 -5
- data/test/helpers/list_column_helpers_test.rb +2 -1
- data/test/helpers/pagination_helpers_test.rb +1 -1
- data/test/misc/active_record_permissions_test.rb +23 -4
- data/test/misc/attribute_params_test.rb +304 -136
- data/test/misc/calculation_test.rb +55 -0
- data/test/misc/configurable_test.rb +22 -21
- data/test/misc/constraints_test.rb +10 -7
- data/test/misc/convert_numbers_format_test.rb +149 -0
- data/test/misc/finder_test.rb +17 -13
- data/test/misc/lang_test.rb +1 -1
- data/test/misc/tableless_test.rb +18 -0
- data/test/mock_app/app/controllers/addresses_controller.rb +4 -0
- data/test/mock_app/app/controllers/buildings_controller.rb +4 -0
- data/test/mock_app/app/controllers/cars_controller.rb +4 -0
- data/test/mock_app/app/controllers/contacts_controller.rb +4 -0
- data/test/mock_app/app/controllers/floors_controller.rb +6 -0
- data/test/mock_app/app/controllers/people_controller.rb +4 -0
- data/test/mock_app/app/models/address.rb +3 -0
- data/test/mock_app/app/models/building.rb +8 -0
- data/test/mock_app/app/models/car.rb +3 -0
- data/test/mock_app/app/models/contact.rb +3 -0
- data/test/mock_app/app/models/file_model.rb +19 -0
- data/test/mock_app/app/models/floor.rb +8 -0
- data/test/mock_app/app/models/person.rb +11 -0
- data/test/mock_app/config/application.rb +2 -0
- data/test/mock_app/config/environments/test.rb +1 -1
- data/test/mock_app/config/initializers/secret_token.rb +5 -1
- data/test/mock_app/config/routes.rb +1 -1
- data/test/mock_app/db/schema.rb +51 -0
- data/test/model_stub.rb +3 -3
- data/test/test_helper.rb +15 -12
- metadata +51 -50
- data/lib/active_scaffold/extensions/array.rb +0 -7
- data/lib/active_scaffold/extensions/cache_association.rb +0 -16
- data/lib/active_scaffold/extensions/usa_state.rb +0 -46
- data/lib/active_scaffold_env.rb +0 -13
- data/test/extensions/array_test.rb +0 -12
- data/test/mock_app/public/blank.html +0 -33
- data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
- data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +0 -532
- data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +0 -867
- data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +0 -117
- data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +0 -370
- data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +0 -35
- 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
|
-
|
|
60
|
-
ActiveScaffold::Bridges.register
|
|
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 =>
|
|
23
|
-
select_control_options[:include_blank] = as_(:_select_) if
|
|
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 ==
|
|
26
|
-
select_options << ["#{'__' * key.depth}#{key.
|
|
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
|
-
|
|
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, :
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
)
|
|
312
|
-
|
|
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
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
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 =
|
|
11
|
+
dragonfly = record.send("#{column.name}")
|
|
8
12
|
if dragonfly.present?
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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.
|
|
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(
|
|
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
|
-
|
|
28
|
+
else
|
|
28
29
|
file_column_field("record", column.name, options)
|
|
29
|
-
|
|
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 =
|
|
11
|
+
paperclip = record.send("#{column.name}")
|
|
8
12
|
if paperclip.file?
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
@@ -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,
|
|
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,
|
|
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
|
-
|
|
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
|
|
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(
|
|
60
|
-
)
|
|
61
|
-
html = record_select_autocomplete(options[:name],
|
|
62
|
-
html = self.class.field_error_proc.call(html, self) if
|
|
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
|
|
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
|