active_scaffold 3.4.17 → 3.4.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +12 -1
- data/README.md +8 -4
- data/app/assets/javascripts/jquery/active_scaffold.js +82 -67
- data/app/assets/stylesheets/active_scaffold.scss +1 -1
- data/app/assets/stylesheets/active_scaffold_colors.scss +1 -1
- data/app/assets/stylesheets/blue-theme.css +1 -1
- data/app/views/active_scaffold_overrides/_form_association.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
- data/lib/active_scaffold.rb +16 -16
- data/lib/active_scaffold/actions/common_search.rb +13 -11
- data/lib/active_scaffold/actions/core.rb +85 -78
- data/lib/active_scaffold/actions/create.rb +29 -28
- data/lib/active_scaffold/actions/delete.rb +17 -17
- data/lib/active_scaffold/actions/field_search.rb +18 -19
- data/lib/active_scaffold/actions/list.rb +30 -22
- data/lib/active_scaffold/actions/mark.rb +1 -1
- data/lib/active_scaffold/actions/nested.rb +78 -65
- data/lib/active_scaffold/actions/search.rb +13 -10
- data/lib/active_scaffold/actions/show.rb +10 -6
- data/lib/active_scaffold/actions/subform.rb +1 -2
- data/lib/active_scaffold/actions/update.rb +39 -31
- data/lib/active_scaffold/active_record_permissions.rb +14 -15
- data/lib/active_scaffold/attribute_params.rb +42 -43
- data/lib/active_scaffold/bridges.rb +22 -12
- data/lib/active_scaffold/bridges/ancestry.rb +1 -1
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +6 -6
- data/lib/active_scaffold/bridges/bitfields.rb +1 -1
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -13
- data/lib/active_scaffold/bridges/calendar_date_select.rb +5 -5
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +17 -20
- data/lib/active_scaffold/bridges/cancan.rb +1 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +8 -9
- data/lib/active_scaffold/bridges/carrierwave.rb +4 -4
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +7 -6
- data/lib/active_scaffold/bridges/chosen.rb +1 -1
- data/lib/active_scaffold/bridges/chosen/helpers.rb +4 -4
- data/lib/active_scaffold/bridges/country_helper.rb +1 -1
- data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +259 -260
- data/lib/active_scaffold/bridges/date_picker.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker/ext.rb +9 -11
- data/lib/active_scaffold/bridges/date_picker/helper.rb +61 -67
- data/lib/active_scaffold/bridges/dragonfly.rb +4 -4
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -5
- data/lib/active_scaffold/bridges/file_column.rb +5 -5
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +20 -23
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +20 -23
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +13 -14
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +7 -8
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +18 -22
- data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +5 -4
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +2 -10
- data/lib/active_scaffold/bridges/paper_trail.rb +7 -5
- data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +4 -3
- data/lib/active_scaffold/bridges/paperclip.rb +5 -5
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +6 -5
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +10 -9
- data/lib/active_scaffold/bridges/record_select.rb +1 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +28 -28
- data/lib/active_scaffold/bridges/semantic_attributes.rb +1 -1
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +1 -1
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +58 -52
- data/lib/active_scaffold/bridges/tiny_mce.rb +2 -2
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -3
- data/lib/active_scaffold/config/base.rb +9 -10
- data/lib/active_scaffold/config/core.rb +24 -29
- data/lib/active_scaffold/config/create.rb +0 -1
- data/lib/active_scaffold/config/field_search.rb +8 -10
- data/lib/active_scaffold/config/form.rb +5 -5
- data/lib/active_scaffold/config/list.rb +21 -20
- data/lib/active_scaffold/config/mark.rb +3 -3
- data/lib/active_scaffold/config/nested.rb +11 -10
- data/lib/active_scaffold/config/search.rb +2 -3
- data/lib/active_scaffold/config/show.rb +1 -1
- data/lib/active_scaffold/config/update.rb +1 -2
- data/lib/active_scaffold/configurable.rb +9 -11
- data/lib/active_scaffold/constraints.rb +9 -8
- data/lib/active_scaffold/core.rb +72 -84
- data/lib/active_scaffold/data_structures/action_columns.rb +26 -25
- data/lib/active_scaffold/data_structures/action_link.rb +43 -43
- data/lib/active_scaffold/data_structures/action_links.rb +17 -15
- data/lib/active_scaffold/data_structures/actions.rb +5 -5
- data/lib/active_scaffold/data_structures/bridge.rb +6 -3
- data/lib/active_scaffold/data_structures/column.rb +110 -89
- data/lib/active_scaffold/data_structures/columns.rb +3 -3
- data/lib/active_scaffold/data_structures/error_message.rb +4 -6
- data/lib/active_scaffold/data_structures/nested_info.rb +43 -48
- data/lib/active_scaffold/data_structures/set.rb +7 -8
- data/lib/active_scaffold/data_structures/sorting.rb +38 -33
- data/lib/active_scaffold/delayed_setup.rb +5 -6
- data/lib/active_scaffold/engine.rb +4 -4
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +3 -4
- data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +5 -6
- data/lib/active_scaffold/extensions/left_outer_joins.rb +11 -11
- data/lib/active_scaffold/extensions/localize.rb +1 -1
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +1 -1
- data/lib/active_scaffold/extensions/paginator_extensions.rb +2 -5
- data/lib/active_scaffold/extensions/reverse_associations.rb +13 -13
- data/lib/active_scaffold/extensions/routing_mapper.rb +9 -9
- data/lib/active_scaffold/extensions/unsaved_associated.rb +9 -9
- data/lib/active_scaffold/finder.rb +90 -93
- data/lib/active_scaffold/helpers/association_helpers.rb +5 -5
- data/lib/active_scaffold/helpers/controller_helpers.rb +22 -19
- data/lib/active_scaffold/helpers/form_column_helpers.rb +115 -105
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -35
- data/lib/active_scaffold/helpers/id_helpers.rb +6 -6
- data/lib/active_scaffold/helpers/list_column_helpers.rb +89 -94
- data/lib/active_scaffold/helpers/pagination_helpers.rb +9 -9
- data/lib/active_scaffold/helpers/search_column_helpers.rb +47 -44
- data/lib/active_scaffold/helpers/show_column_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/view_helpers.rb +86 -91
- data/lib/active_scaffold/marked_model.rb +10 -10
- data/lib/active_scaffold/paginator.rb +30 -34
- data/lib/active_scaffold/responds_to_parent.rb +27 -28
- data/lib/active_scaffold/tableless.rb +20 -15
- data/lib/active_scaffold/version.rb +1 -1
- data/lib/generators/active_scaffold/active_scaffold_generator.rb +8 -8
- data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +9 -9
- data/shoulda_macros/macros.rb +27 -22
- data/test/bridges/bridge_test.rb +38 -29
- data/test/bridges/date_picker_test.rb +1 -1
- data/test/bridges/paper_trail_test.rb +17 -0
- data/test/bridges/paperclip_test.rb +3 -2
- data/test/bridges/tiny_mce_test.rb +5 -2
- data/test/company.rb +25 -30
- data/test/config/base_test.rb +1 -1
- data/test/config/core_test.rb +9 -9
- data/test/config/create_test.rb +14 -8
- data/test/config/delete_test.rb +4 -4
- data/test/config/field_search_test.rb +6 -6
- data/test/config/list_test.rb +16 -16
- data/test/config/nested_test.rb +4 -4
- data/test/config/search_test.rb +8 -8
- data/test/config/show_test.rb +6 -6
- data/test/config/subform_test.rb +1 -1
- data/test/config/update_test.rb +5 -5
- data/test/const_mocker.rb +4 -4
- data/test/data_structures/action_columns_test.rb +4 -5
- data/test/data_structures/action_link_test.rb +1 -0
- data/test/data_structures/action_links_test.rb +5 -5
- data/test/data_structures/column_test.rb +9 -9
- data/test/data_structures/columns_test.rb +2 -2
- data/test/data_structures/error_message_test.rb +4 -5
- data/test/data_structures/set_test.rb +1 -2
- data/test/data_structures/sorting_test.rb +10 -10
- data/test/data_structures/validation_reflection_test.rb +8 -0
- data/test/extensions/routing_mapper_test.rb +2 -2
- data/test/helpers/list_column_helpers_test.rb +3 -2
- data/test/helpers/pagination_helpers_test.rb +5 -4
- data/test/helpers/search_column_helpers_test.rb +1 -1
- data/test/misc/active_record_permissions_test.rb +63 -50
- data/test/misc/attribute_params_test.rb +28 -26
- data/test/misc/calculation_test.rb +10 -3
- data/test/misc/configurable_test.rb +12 -13
- data/test/misc/constraints_test.rb +6 -6
- data/test/misc/convert_numbers_format_test.rb +7 -6
- data/test/misc/finder_test.rb +17 -12
- data/test/misc/lang_test.rb +3 -4
- data/test/misc/tableless_test.rb +2 -3
- data/test/mock_app/app/controllers/addresses_controller.rb +1 -1
- data/test/mock_app/app/controllers/buildings_controller.rb +1 -1
- data/test/mock_app/app/controllers/cars_controller.rb +1 -1
- data/test/mock_app/app/controllers/contacts_controller.rb +1 -1
- data/test/mock_app/app/controllers/people_controller.rb +1 -1
- data/test/mock_app/app/models/file_model.rb +2 -2
- data/test/mock_app/app/models/person.rb +1 -1
- data/test/mock_app/config/application.rb +3 -3
- data/test/mock_app/config/boot.rb +1 -1
- data/test/mock_app/config/environment.rb +1 -0
- data/test/mock_app/config/environments/development.rb +0 -1
- data/test/mock_app/config/environments/production.rb +1 -1
- data/test/mock_app/db/schema.rb +14 -15
- data/test/model_stub.rb +13 -16
- data/test/run_all.rb +5 -7
- data/test/test_helper.rb +12 -9
- metadata +19 -3
@@ -4,7 +4,7 @@ module ActiveScaffold
|
|
4
4
|
# Cache the options for select
|
5
5
|
def cache_association_options(association, conditions, klass, cache = true)
|
6
6
|
if active_scaffold_config.cache_association_options && cache
|
7
|
-
@_associations_cache ||= Hash.new { |h,k| h[k] = {} }
|
7
|
+
@_associations_cache ||= Hash.new { |h, k| h[k] = {} }
|
8
8
|
key = [association.name, association.active_record.name, klass.name].join('/')
|
9
9
|
@_associations_cache[key][conditions] ||= yield
|
10
10
|
else
|
@@ -14,8 +14,8 @@ module ActiveScaffold
|
|
14
14
|
|
15
15
|
# Provides a way to honor the :conditions on an association while searching the association's klass
|
16
16
|
def association_options_find(association, conditions = nil, klass = nil, record = nil)
|
17
|
-
ActiveSupport::Deprecation.warn
|
18
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
17
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, call with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
18
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
19
19
|
if klass.nil? && association.options[:polymorphic]
|
20
20
|
class_name = record.send(association.foreign_type)
|
21
21
|
if class_name.present?
|
@@ -33,7 +33,7 @@ module ActiveScaffold
|
|
33
33
|
if method(:options_for_association_conditions).arity.abs == 2
|
34
34
|
conditions = options_for_association_conditions(association, record)
|
35
35
|
else
|
36
|
-
ActiveSupport::Deprecation.warn
|
36
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include record in your options_for_association_conditions overrided method.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
37
37
|
conditions = options_for_association_conditions(association)
|
38
38
|
end
|
39
39
|
end
|
@@ -89,7 +89,7 @@ module ActiveScaffold
|
|
89
89
|
if method(:options_for_association_conditions).arity.abs == 2
|
90
90
|
conditions = options_for_association_conditions(association, record)
|
91
91
|
else
|
92
|
-
ActiveSupport::Deprecation.warn
|
92
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include record in your options_for_association_conditions overrided method.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
93
93
|
conditions = options_for_association_conditions(association)
|
94
94
|
end
|
95
95
|
association_options_count(association, conditions)
|
@@ -2,13 +2,13 @@ module ActiveScaffold
|
|
2
2
|
module Helpers
|
3
3
|
module ControllerHelpers
|
4
4
|
def self.included(controller)
|
5
|
-
controller.class_eval { helper_method :params_for, :conditions_from_params, :main_path_to_return, :render_parent?, :render_parent_options, :render_parent_action, :nested_singular_association?, :build_associated, :generate_temporary_id, :generated_id}
|
5
|
+
controller.class_eval { helper_method :params_for, :conditions_from_params, :main_path_to_return, :render_parent?, :render_parent_options, :render_parent_action, :nested_singular_association?, :build_associated, :generate_temporary_id, :generated_id }
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
include ActiveScaffold::Helpers::IdHelpers
|
9
|
-
|
9
|
+
|
10
10
|
def generate_temporary_id(record = nil, generated_id = nil)
|
11
|
-
(generated_id || (Time.now.to_f*1000).to_i.to_s).tap do |id|
|
11
|
+
(generated_id || (Time.now.to_f * 1000).to_i.to_s).tap do |id|
|
12
12
|
(@temporary_ids ||= {})[record.class.name] = id if record
|
13
13
|
end
|
14
14
|
end
|
@@ -25,7 +25,7 @@ module ActiveScaffold
|
|
25
25
|
blacklist = [:adapter, :position, :sort, :sort_direction, :page, :auto_pagination, :record, :commit, :_method, :authenticity_token, :iframe, :associated_id, :dont_close]
|
26
26
|
unless @params_for
|
27
27
|
@params_for = {}
|
28
|
-
params.except(*blacklist).each {|key, value| @params_for[key.to_sym] = value.duplicable? ? value.clone : value}
|
28
|
+
params.except(*blacklist).each { |key, value| @params_for[key.to_sym] = value.duplicable? ? value.clone : value }
|
29
29
|
@params_for[:controller] = '/' + @params_for[:controller].to_s unless @params_for[:controller].to_s.first(1) == '/' # for namespaced controllers
|
30
30
|
@params_for.delete(:id) if @params_for[:id].nil?
|
31
31
|
end
|
@@ -42,14 +42,14 @@ module ActiveScaffold
|
|
42
42
|
if params[:parent_scaffold] && nested? && nested.singular_association?
|
43
43
|
parameters[:controller] = params[:parent_scaffold]
|
44
44
|
exclude_parameters.concat [nested.param_name, :association, :parent_scaffold]
|
45
|
-
#parameters[:eid] = params[:parent_scaffold] # not neeeded anymore?
|
45
|
+
# parameters[:eid] = params[:parent_scaffold] # not neeeded anymore?
|
46
46
|
end
|
47
47
|
parameters.merge! nested.to_params if nested?
|
48
48
|
if params[:parent_sti]
|
49
49
|
parameters[:controller] = params[:parent_sti]
|
50
|
-
#parameters[:eid] = nil # not neeeded anymore?
|
50
|
+
# parameters[:eid] = nil # not neeeded anymore?
|
51
51
|
end
|
52
|
-
parameters[:action] =
|
52
|
+
parameters[:action] = 'index'
|
53
53
|
parameters[:id] = nil
|
54
54
|
params_for(parameters).except(*exclude_parameters)
|
55
55
|
end
|
@@ -73,20 +73,23 @@ module ActiveScaffold
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def render_parent_action
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
76
|
+
if @parent_action.nil?
|
77
|
+
begin
|
78
|
+
@parent_action = :row
|
79
|
+
if params[:parent_sti]
|
80
|
+
parent_controller = "#{params[:parent_sti].to_s.camelize}Controller".constantize
|
81
|
+
@parent_action = :index if action_name == 'create' && parent_controller.active_scaffold_config.actions.include?(:create) && parent_controller.active_scaffold_config.create.refresh_list == true
|
82
|
+
@parent_action = :index if action_name == 'update' && parent_controller.active_scaffold_config.actions.include?(:update) && parent_controller.active_scaffold_config.update.refresh_list == true
|
83
|
+
@parent_action = :index if action_name == 'destroy' && parent_controller.active_scaffold_config.actions.include?(:delete) && parent_controller.active_scaffold_config.delete.refresh_list == true
|
84
|
+
end
|
85
|
+
rescue ActiveScaffold::ControllerNotFound => ex
|
86
|
+
logger.warn "#{ex.message} for parent_sti #{params[:parent_sti]}"
|
83
87
|
end
|
84
|
-
|
85
|
-
end if @parent_action.nil?
|
88
|
+
end
|
86
89
|
@parent_action
|
87
90
|
end
|
88
|
-
|
89
|
-
# build an associated record for association
|
91
|
+
|
92
|
+
# build an associated record for association
|
90
93
|
def build_associated(association, parent_record)
|
91
94
|
if association.options[:through]
|
92
95
|
# build full chain, only check create_associated on initial parent_record
|
@@ -12,14 +12,14 @@ module ActiveScaffold
|
|
12
12
|
|
13
13
|
def active_scaffold_render_input(column, options)
|
14
14
|
record = options[:object]
|
15
|
-
ActiveSupport::Deprecation.warn
|
16
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
15
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include :object in options with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
16
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
17
17
|
|
18
18
|
# first, check if the dev has created an override for this specific field
|
19
19
|
if (method = override_form_field(column))
|
20
20
|
send(method, record, options)
|
21
21
|
# second, check if the dev has specified a valid form_ui for this column
|
22
|
-
elsif column.form_ui
|
22
|
+
elsif column.form_ui && (method = override_input(column.form_ui))
|
23
23
|
send(method, column, options)
|
24
24
|
# fallback: we get to make the decision
|
25
25
|
else
|
@@ -48,20 +48,20 @@ module ActiveScaffold
|
|
48
48
|
options[:maxlength] = column.column.limit
|
49
49
|
options[:size] ||= options[:maxlength].to_i > 30 ? 30 : options[:maxlength]
|
50
50
|
end
|
51
|
-
options[:include_blank] = true if column.column.null
|
51
|
+
options[:include_blank] = true if column.column.null && [:date, :datetime, :time].include?(column.column.type)
|
52
52
|
options[:value] = format_number_value(record.send(column.name), column.options) if column.number?
|
53
53
|
text_field(:record, column.name, options.merge(column.options))
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
|
-
rescue
|
57
|
+
rescue StandardError => e
|
58
58
|
logger.error "#{e.class.name}: #{e.message} -- on the ActiveScaffold column = :#{column.name} in #{controller.class}"
|
59
59
|
raise e
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
def active_scaffold_render_subform_column(column, scope, crud_type, readonly, add_class = false, record = nil)
|
63
|
-
ActiveSupport::Deprecation.warn
|
64
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
63
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, call with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
64
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
65
65
|
if add_class
|
66
66
|
col_class = []
|
67
67
|
col_class << 'required' if column.required?
|
@@ -70,15 +70,15 @@ module ActiveScaffold
|
|
70
70
|
col_class << 'checkbox' if column.form_ui == :checkbox
|
71
71
|
col_class = col_class.join(' ')
|
72
72
|
end
|
73
|
-
|
73
|
+
if readonly && !record.new_record? || !record.authorized_for?(:crud_type => crud_type, :column => column.name)
|
74
|
+
options = active_scaffold_input_options(column, scope).except(:name)
|
75
|
+
options[:class] = "#{options[:class]} #{col_class}" if col_class
|
76
|
+
content_tag :span, get_column_value(record, column), options
|
77
|
+
else
|
74
78
|
renders_as = column_renders_as(column)
|
75
79
|
html = render_column(column, record, renders_as, scope, false, col_class)
|
76
80
|
html = content_tag(:div, html, active_scaffold_subform_attributes(column)) if renders_as == :subform
|
77
81
|
html
|
78
|
-
else
|
79
|
-
options = active_scaffold_input_options(column, scope).except(:name)
|
80
|
-
options[:class] = "#{options[:class]} #{col_class}" if col_class
|
81
|
-
content_tag :span, get_column_value(record, column), options
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
@@ -110,11 +110,11 @@ module ActiveScaffold
|
|
110
110
|
# Fix for keeping unique IDs in subform
|
111
111
|
id_control = "record_#{column.name}_#{[params[:eid], params[:parent_id] || params[:id]].compact.join '_'}"
|
112
112
|
id_control += scope_id(scope) if scope
|
113
|
-
|
113
|
+
|
114
114
|
classes = "#{column.name}-input"
|
115
115
|
classes += ' numeric-input' if column.number?
|
116
116
|
|
117
|
-
{
|
117
|
+
{:name => name, :class => classes, :id => id_control}.merge(options)
|
118
118
|
end
|
119
119
|
|
120
120
|
def current_form_columns(record, scope, subform_controller = nil)
|
@@ -127,8 +127,8 @@ module ActiveScaffold
|
|
127
127
|
|
128
128
|
def update_columns_options(column, scope, options, force = false)
|
129
129
|
record = options[:object]
|
130
|
-
ActiveSupport::Deprecation.warn
|
131
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
130
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include :object in options with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
131
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
132
132
|
subform_controller = controller.class.active_scaffold_controller_for(record.class) if scope
|
133
133
|
form_columns = @main_columns.try(:names) if scope.nil? || subform_controller == controller.class
|
134
134
|
form_columns ||= current_form_columns(record, scope, subform_controller)
|
@@ -154,35 +154,36 @@ module ActiveScaffold
|
|
154
154
|
def field_attributes(column, record)
|
155
155
|
{}
|
156
156
|
end
|
157
|
-
|
157
|
+
|
158
158
|
def render_column(column, record, renders_as, scope = nil, only_value = false, col_class = nil)
|
159
159
|
if override_form_field_partial?(column)
|
160
|
-
render :partial => override_form_field_partial(column), :locals => {
|
160
|
+
render :partial => override_form_field_partial(column), :locals => {:column => column, :only_value => only_value, :scope => scope, :col_class => col_class, :record => record}
|
161
161
|
elsif renders_as == :field || override_form_field?(column)
|
162
162
|
form_attribute(column, record, scope, only_value, col_class)
|
163
163
|
elsif renders_as == :subform
|
164
|
-
render :partial => 'form_association', :locals => {
|
164
|
+
render :partial => 'form_association', :locals => {:column => column, :scope => scope, :parent_record => record}
|
165
165
|
else
|
166
166
|
form_hidden_attribute(column, record, scope)
|
167
167
|
end
|
168
168
|
end
|
169
|
-
|
169
|
+
|
170
170
|
def form_attribute(column, record, scope = nil, only_value = false, col_class = nil)
|
171
171
|
column_options = active_scaffold_input_options(column, scope, :object => record)
|
172
172
|
attributes = field_attributes(column, record)
|
173
173
|
attributes[:class] = "#{attributes[:class]} #{col_class}" if col_class.present?
|
174
|
-
field =
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
174
|
+
field =
|
175
|
+
if only_value
|
176
|
+
content_tag(:span, get_column_value(record, column), column_options.except(:name, :object)) <<
|
177
|
+
hidden_field(:record, column.association ? column.association.foreign_key : column.name, column_options)
|
178
|
+
else
|
179
|
+
active_scaffold_input_for column, scope, column_options
|
180
|
+
end
|
181
|
+
|
181
182
|
content_tag :dl, attributes do
|
182
|
-
|
183
|
+
%(<dt>#{label_tag label_for(column, column_options), column.label}</dt><dd>#{field}
|
183
184
|
#{loading_indicator_tag(:action => :render_field, :id => params[:id]) if column.update_columns}
|
184
185
|
#{content_tag :span, column.description, :class => 'description' if column.description.present?}
|
185
|
-
</dd
|
186
|
+
</dd>).html_safe
|
186
187
|
end
|
187
188
|
end
|
188
189
|
|
@@ -193,11 +194,11 @@ module ActiveScaffold
|
|
193
194
|
def subform_label(column, hidden)
|
194
195
|
column.label unless hidden
|
195
196
|
end
|
196
|
-
|
197
|
+
|
197
198
|
def form_hidden_attribute(column, record, scope = nil)
|
198
|
-
|
199
|
+
%(<dl style="display: none;"><dt></dt><dd>
|
199
200
|
#{hidden_field :record, column.name, active_scaffold_input_options(column, scope).merge(:object => record)}
|
200
|
-
</dd></dl
|
201
|
+
</dd></dl>).html_safe
|
201
202
|
end
|
202
203
|
|
203
204
|
# Should this column be displayed in the subform?
|
@@ -210,13 +211,13 @@ module ActiveScaffold
|
|
210
211
|
# A column shouldn't be in the subform if it's the reverse association to the parent
|
211
212
|
return false if column.association.inverse_for?(parent_record.class)
|
212
213
|
|
213
|
-
|
214
|
+
true
|
214
215
|
end
|
215
216
|
|
216
217
|
def column_show_add_existing(column, record = nil)
|
217
|
-
ActiveSupport::Deprecation.warn
|
218
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
219
|
-
(column.allow_add_existing
|
218
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, call with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
219
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
220
|
+
(column.allow_add_existing && options_for_association_count(column.association, record) > 0)
|
220
221
|
end
|
221
222
|
|
222
223
|
def column_show_add_new(column, associated, record)
|
@@ -228,13 +229,13 @@ module ActiveScaffold
|
|
228
229
|
##
|
229
230
|
## Form input methods
|
230
231
|
##
|
231
|
-
|
232
|
+
|
232
233
|
def active_scaffold_grouped_options(column, select_options, optgroup)
|
233
234
|
group_column = active_scaffold_config_for(column.association.klass).columns[optgroup]
|
234
235
|
group_label = group_column.options[:label_method] if group_column
|
235
236
|
group_label ||= group_column.try(:association) ? :to_label : :to_s
|
236
237
|
select_options.group_by(&optgroup.to_sym).collect do |group, options|
|
237
|
-
[group.send(group_label), options.collect {|r| [r.send(column.options[:label_method] || :to_label), r.id]}]
|
238
|
+
[group.send(group_label), options.collect { |r| [r.send(column.options[:label_method] || :to_label), r.id] }]
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
@@ -243,11 +244,11 @@ module ActiveScaffold
|
|
243
244
|
options[:prompt] = as_(options[:prompt].to_s) if options[:prompt].is_a? Symbol
|
244
245
|
options
|
245
246
|
end
|
246
|
-
|
247
|
+
|
247
248
|
def active_scaffold_input_singular_association(column, html_options)
|
248
249
|
record = html_options.delete(:object)
|
249
|
-
ActiveSupport::Deprecation.warn
|
250
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
250
|
+
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
|
251
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
251
252
|
associated = record.send(column.association.name)
|
252
253
|
|
253
254
|
select_options = sorted_association_options_find(column.association, nil, record)
|
@@ -258,14 +259,15 @@ module ActiveScaffold
|
|
258
259
|
|
259
260
|
html_options.merge!(column.options[:html_options] || {})
|
260
261
|
options.merge!(column.options)
|
261
|
-
html_options[:name] = "#{html_options[:name]}[]" if html_options[:multiple] == true && !html_options[:name].to_s.ends_with?(
|
262
|
+
html_options[:name] = "#{html_options[:name]}[]" if html_options[:multiple] == true && !html_options[:name].to_s.ends_with?('[]')
|
262
263
|
active_scaffold_translate_select_options(options)
|
263
264
|
|
264
|
-
html =
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
265
|
+
html =
|
266
|
+
if (optgroup = options.delete(:optgroup))
|
267
|
+
select(:record, method, active_scaffold_grouped_options(column, select_options, optgroup), options, html_options)
|
268
|
+
else
|
269
|
+
collection_select(:record, method, select_options, :id, column.options[:label_method] || :to_label, options, html_options)
|
270
|
+
end
|
269
271
|
html << active_scaffold_refresh_link(column, html_options, record) if column.options[:refresh_link]
|
270
272
|
html
|
271
273
|
end
|
@@ -284,34 +286,35 @@ module ActiveScaffold
|
|
284
286
|
end
|
285
287
|
|
286
288
|
def active_scaffold_plural_association_options(column, record = nil)
|
287
|
-
ActiveSupport::Deprecation.warn
|
288
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
289
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, call with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
290
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
289
291
|
associated_options = record.send(column.association.name)
|
290
292
|
[associated_options, associated_options | sorted_association_options_find(column.association, nil, record)]
|
291
293
|
end
|
292
294
|
|
293
295
|
def active_scaffold_input_plural_association(column, options)
|
294
296
|
record = options.delete(:object)
|
295
|
-
ActiveSupport::Deprecation.warn
|
296
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
297
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include :object in options with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
298
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
297
299
|
associated_options, select_options = active_scaffold_plural_association_options(column, record)
|
298
|
-
|
299
|
-
html =
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
300
|
+
|
301
|
+
html =
|
302
|
+
if select_options.empty?
|
303
|
+
content_tag(:span, as_(:no_options), :class => "#{options[:class]} no-options", :id => options[:id])
|
304
|
+
else
|
305
|
+
active_scaffold_checkbox_list(column, select_options, associated_options.collect(&:id), options)
|
306
|
+
end
|
304
307
|
html << active_scaffold_refresh_link(column, options, record) if column.options[:refresh_link]
|
305
308
|
html
|
306
309
|
end
|
307
310
|
|
308
311
|
def active_scaffold_checkbox_option(option, label_method, associated_ids, checkbox_options, li_options = {})
|
309
|
-
content_tag(:li, li_options) do
|
312
|
+
content_tag(:li, li_options) do
|
310
313
|
check_box_tag(checkbox_options[:name], option.id, associated_ids.include?(option.id), checkbox_options) <<
|
311
|
-
|
314
|
+
content_tag(:label, option.send(label_method), :for => checkbox_options[:id])
|
312
315
|
end
|
313
316
|
end
|
314
|
-
|
317
|
+
|
315
318
|
def active_scaffold_checkbox_list(column, select_options, associated_ids, options)
|
316
319
|
label_method = column.options[:label_method] || :to_label
|
317
320
|
html = hidden_field_tag("#{options[:name]}[]", '', :id => nil)
|
@@ -329,16 +332,16 @@ module ActiveScaffold
|
|
329
332
|
value = text if value.nil?
|
330
333
|
[(text.is_a?(Symbol) ? column.active_record_class.human_attribute_name(text) : text), value]
|
331
334
|
end
|
332
|
-
|
335
|
+
|
333
336
|
def active_scaffold_enum_options(column, record = nil)
|
334
337
|
column.options[:options]
|
335
338
|
end
|
336
339
|
|
337
340
|
def active_scaffold_input_enum(column, html_options)
|
338
341
|
record = html_options.delete(:object)
|
339
|
-
ActiveSupport::Deprecation.warn
|
340
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
341
|
-
options = {
|
342
|
+
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
|
343
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
344
|
+
options = {:selected => record.send(column.name), :object => record}
|
342
345
|
options_for_select = active_scaffold_enum_options(column, record).collect do |text, value|
|
343
346
|
active_scaffold_translated_option(column, text, value)
|
344
347
|
end
|
@@ -361,16 +364,23 @@ module ActiveScaffold
|
|
361
364
|
def active_scaffold_input_radio(column, html_options)
|
362
365
|
record = html_options[:object]
|
363
366
|
html_options.merge!(column.options[:html_options] || {})
|
364
|
-
options =
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
367
|
+
options =
|
368
|
+
if column.association
|
369
|
+
sorted_association_options_find(column.association, nil, record)
|
370
|
+
else
|
371
|
+
active_scaffold_enum_options(column, record)
|
372
|
+
end
|
369
373
|
id_key = html_options[:"data-id"] ? :"data-id" : :id
|
370
|
-
options
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
+
label_method = column.options[:label_method] || :to_label if column.association
|
375
|
+
|
376
|
+
options.each_with_object('') do |(text, value), html|
|
377
|
+
if column.association
|
378
|
+
text, value = [text.send(label_method), text.id]
|
379
|
+
checked = {:checked => html_options[:object].send(column.association.name).try(:id) == value}
|
380
|
+
else
|
381
|
+
text, value = active_scaffold_translated_option(column, text, value)
|
382
|
+
end
|
383
|
+
|
374
384
|
radio_options = html_options.merge(id_key => html_options[id_key] + '-' + value.to_s)
|
375
385
|
radio_options.merge!(checked) if checked
|
376
386
|
html << content_tag(:label, radio_button(:record, column.name, value, radio_options) + text)
|
@@ -389,7 +399,7 @@ module ActiveScaffold
|
|
389
399
|
def active_scaffold_input_textarea(column, options)
|
390
400
|
text_area(:record, column.name, options.merge(:cols => column.options[:cols], :rows => column.options[:rows], :size => column.options[:size]))
|
391
401
|
end
|
392
|
-
|
402
|
+
|
393
403
|
def active_scaffold_input_virtual(column, options)
|
394
404
|
options = active_scaffold_input_text_options(options)
|
395
405
|
text_field :record, column.name, options.merge(column.options)
|
@@ -436,8 +446,8 @@ module ActiveScaffold
|
|
436
446
|
|
437
447
|
def active_scaffold_input_boolean(column, options)
|
438
448
|
record = options.delete(:object)
|
439
|
-
ActiveSupport::Deprecation.warn
|
440
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
449
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include :object in options with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
450
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
441
451
|
select_options = []
|
442
452
|
select_options << [as_(:_select_), nil] if !column.virtual? && column.column.null
|
443
453
|
select_options << [as_(:true), true]
|
@@ -500,9 +510,9 @@ module ActiveScaffold
|
|
500
510
|
def column_renders_as(column)
|
501
511
|
if column.respond_to? :each
|
502
512
|
return :subsection
|
503
|
-
elsif column.active_record_class.locking_column.to_s == column.name.to_s
|
513
|
+
elsif column.active_record_class.locking_column.to_s == column.name.to_s || column.form_ui == :hidden
|
504
514
|
return :hidden
|
505
|
-
elsif column.association.nil?
|
515
|
+
elsif column.association.nil? || column.form_ui || !active_scaffold_config_for(column.association.klass).actions.include?(:subform) || override_form_field?(column)
|
506
516
|
return :field
|
507
517
|
else
|
508
518
|
return :subform
|
@@ -510,7 +520,7 @@ module ActiveScaffold
|
|
510
520
|
end
|
511
521
|
|
512
522
|
def column_scope(column, scope = nil, record = nil)
|
513
|
-
ActiveSupport::Deprecation.warn
|
523
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, call with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
514
524
|
if column.plural_association?
|
515
525
|
"#{scope}[#{column.name}][#{record.id || generate_temporary_id(record)}]"
|
516
526
|
else
|
@@ -520,9 +530,9 @@ module ActiveScaffold
|
|
520
530
|
|
521
531
|
def active_scaffold_add_existing_input(options)
|
522
532
|
record = options.delete(:object)
|
523
|
-
ActiveSupport::Deprecation.warn
|
524
|
-
record ||= @record # TODO Remove when relying on @record is removed
|
525
|
-
if ActiveScaffold.js_framework
|
533
|
+
ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include :object in options with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
|
534
|
+
record ||= @record # TODO: Remove when relying on @record is removed
|
535
|
+
if !ActiveScaffold.js_framework.nil? && controller.respond_to?(:record_select_config, true)
|
526
536
|
remote_controller = active_scaffold_controller_for(record_select_config.model).controller_path
|
527
537
|
options.merge!(:controller => remote_controller)
|
528
538
|
options.merge!(active_scaffold_input_text_options)
|
@@ -548,51 +558,51 @@ module ActiveScaffold
|
|
548
558
|
if column.numerical_constraints.nil?
|
549
559
|
numerical_constraints = {}
|
550
560
|
validators = column.active_record_class.validators.select do |v|
|
551
|
-
v.is_a?
|
561
|
+
v.is_a?(ActiveModel::Validations::NumericalityValidator) && v.attributes.include?(column.name)
|
552
562
|
end
|
553
|
-
equal_to = (
|
554
|
-
|
563
|
+
equal_to = (val = validators.find { |v| v.options[:equal_to] }) ? val.options[:equal_to] : nil
|
564
|
+
|
555
565
|
# If there is equal_to constraint - use it (unless otherwise specified by user)
|
556
|
-
if equal_to
|
566
|
+
if equal_to && !(options[:min] || options[:max])
|
557
567
|
numerical_constraints[:min] = numerical_constraints[:max] = equal_to
|
558
568
|
else # find minimum and maximum from validators
|
559
569
|
# we can safely modify :min and :max by 1 for :greater_tnan or :less_than value only for integer values
|
560
570
|
only_integer = column.column.type == :integer if column.column
|
561
|
-
only_integer ||=
|
571
|
+
only_integer ||= validators.find { |v| v.options[:only_integer] }.present?
|
562
572
|
margin = only_integer ? 1 : 0
|
563
|
-
|
573
|
+
|
564
574
|
# Minimum
|
565
575
|
unless options[:min]
|
566
|
-
min = validators.map{ |v| v.options[:greater_than_or_equal] }.compact.max
|
567
|
-
greater_than = validators.map{ |v| v.options[:greater_than] }.compact.max
|
568
|
-
numerical_constraints[:min] = [min, (greater_than+margin if greater_than)].compact.max
|
576
|
+
min = validators.map { |v| v.options[:greater_than_or_equal] }.compact.max
|
577
|
+
greater_than = validators.map { |v| v.options[:greater_than] }.compact.max
|
578
|
+
numerical_constraints[:min] = [min, (greater_than + margin if greater_than)].compact.max
|
569
579
|
end
|
570
|
-
|
580
|
+
|
571
581
|
# Maximum
|
572
582
|
unless options[:max]
|
573
|
-
max = validators.map{ |v| v.options[:less_than_or_equal] }.compact.min
|
574
|
-
less_than = validators.map{ |v| v.options[:less_than] }.compact.min
|
575
|
-
numerical_constraints[:max] = [max, (less_than-margin if less_than)].compact.min
|
583
|
+
max = validators.map { |v| v.options[:less_than_or_equal] }.compact.min
|
584
|
+
less_than = validators.map { |v| v.options[:less_than] }.compact.min
|
585
|
+
numerical_constraints[:max] = [max, (less_than - margin if less_than)].compact.min
|
576
586
|
end
|
577
|
-
|
587
|
+
|
578
588
|
# Set step = 2 for column values restricted to be odd or even (but only if minimum is set)
|
579
589
|
unless options[:step]
|
580
|
-
only_odd_valid = validators.any?{ |v| v.options[:odd] }
|
581
|
-
only_even_valid = validators.any?{ |v| v.options[:even] } unless only_odd_valid
|
590
|
+
only_odd_valid = validators.any? { |v| v.options[:odd] }
|
591
|
+
only_even_valid = validators.any? { |v| v.options[:even] } unless only_odd_valid
|
582
592
|
if !only_integer
|
583
|
-
numerical_constraints[:step] ||= "0.#{'0'*(column.column.scale-1)}1" if column.column && column.column.scale.to_i > 0
|
584
|
-
elsif options[:min]
|
593
|
+
numerical_constraints[:step] ||= "0.#{'0' * (column.column.scale - 1)}1" if column.column && column.column.scale.to_i > 0
|
594
|
+
elsif options[:min] && options[:min].respond_to?(:even?) && (only_odd_valid || only_even_valid)
|
585
595
|
numerical_constraints[:step] = 2
|
586
|
-
numerical_constraints[:min] += 1 if only_odd_valid
|
587
|
-
numerical_constraints[:min] += 1 if only_even_valid
|
596
|
+
numerical_constraints[:min] += 1 if only_odd_valid && !options[:min].odd?
|
597
|
+
numerical_constraints[:min] += 1 if only_even_valid && !options[:min].even?
|
588
598
|
end
|
589
599
|
numerical_constraints[:step] ||= 'any' unless only_integer
|
590
600
|
end
|
591
601
|
end
|
592
|
-
|
602
|
+
|
593
603
|
column.numerical_constraints = numerical_constraints
|
594
604
|
end
|
595
|
-
|
605
|
+
column.numerical_constraints.merge(options)
|
596
606
|
end
|
597
607
|
end
|
598
608
|
end
|