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.
- 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
|