active_scaffold 3.4.43 → 3.5.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/{LICENSE → LICENSE.md} +1 -1
- data/README.md +27 -19
- data/app/assets/javascripts/active_scaffold.js.erb +1 -1
- data/app/assets/javascripts/jquery/active_scaffold.js +95 -43
- data/app/assets/javascripts/jquery/tiny_mce_bridge.js +30 -6
- data/app/assets/javascripts/prototype/tiny_mce_bridge.js +11 -1
- data/app/assets/stylesheets/active_scaffold_colors.scss +2 -2
- data/app/assets/stylesheets/active_scaffold_layout.css +36 -28
- data/app/views/active_scaffold_overrides/_base_form.html.erb +2 -3
- data/app/views/active_scaffold_overrides/_field_search.html.erb +8 -7
- data/app/views/active_scaffold_overrides/_form_association.html.erb +9 -9
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +6 -6
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +52 -50
- data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_human_conditions.html.erb +3 -1
- data/app/views/active_scaffold_overrides/_list_calculations.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +2 -0
- data/app/views/active_scaffold_overrides/_list_messages.html.erb +5 -3
- data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -1
- data/app/views/active_scaffold_overrides/_list_with_header.html.erb +9 -9
- data/app/views/active_scaffold_overrides/_messages.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +18 -10
- data/app/views/active_scaffold_overrides/_render_field.js.erb +3 -3
- data/app/views/active_scaffold_overrides/_search.html.erb +7 -6
- data/app/views/active_scaffold_overrides/_show_actions.html.erb +14 -0
- data/app/views/active_scaffold_overrides/_show_association.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_actions.html.erb +6 -2
- data/app/views/active_scaffold_overrides/_update_column.js.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_form.html.erb +1 -1
- data/app/views/active_scaffold_overrides/destroy.js.erb +2 -3
- data/app/views/active_scaffold_overrides/edit_associated.js.erb +4 -3
- data/app/views/active_scaffold_overrides/on_action_update.js.erb +5 -3
- data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
- data/app/views/active_scaffold_overrides/on_update.js.erb +6 -6
- data/app/views/active_scaffold_overrides/show.html.erb +6 -0
- data/app/views/active_scaffold_overrides/update.html.erb +1 -1
- data/app/views/active_scaffold_overrides/update_column.js.erb +1 -1
- data/config/brakeman.ignore +26 -0
- data/config/brakeman.yml +3 -0
- data/config/i18n-tasks.yml +121 -0
- data/config/locales/de.yml +81 -70
- data/config/locales/en.yml +83 -74
- data/config/locales/es.yml +82 -73
- data/config/locales/fr.yml +86 -75
- data/config/locales/hu.yml +81 -70
- data/config/locales/ja.yml +71 -60
- data/config/locales/ru.yml +85 -74
- data/lib/active_scaffold.rb +3 -0
- data/lib/active_scaffold/actions/common_search.rb +11 -7
- data/lib/active_scaffold/actions/core.rb +119 -47
- data/lib/active_scaffold/actions/create.rb +1 -1
- data/lib/active_scaffold/actions/delete.rb +11 -8
- data/lib/active_scaffold/actions/field_search.rb +104 -6
- data/lib/active_scaffold/actions/list.rb +25 -21
- data/lib/active_scaffold/actions/mark.rb +12 -4
- data/lib/active_scaffold/actions/nested.rb +26 -26
- data/lib/active_scaffold/actions/search.rb +2 -2
- data/lib/active_scaffold/actions/show.rb +4 -5
- data/lib/active_scaffold/actions/subform.rb +9 -7
- data/lib/active_scaffold/actions/update.rb +20 -13
- data/lib/active_scaffold/active_record_permissions.rb +24 -5
- data/lib/active_scaffold/attribute_params.rb +68 -49
- data/lib/active_scaffold/bridges.rb +1 -1
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +15 -19
- data/lib/active_scaffold/bridges/bitfields.rb +1 -1
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +10 -14
- data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -7
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +19 -22
- data/lib/active_scaffold/bridges/cancan.rb +4 -3
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +11 -21
- data/lib/active_scaffold/bridges/carrierwave.rb +2 -1
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +2 -6
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +6 -39
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/chosen.rb +4 -1
- data/lib/active_scaffold/bridges/chosen/helpers.rb +3 -2
- data/lib/active_scaffold/bridges/country_select/country_select_bridge_helper.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker.rb +3 -0
- data/lib/active_scaffold/bridges/date_picker/ext.rb +43 -38
- data/lib/active_scaffold/bridges/date_picker/helper.rb +24 -23
- data/lib/active_scaffold/bridges/dragonfly.rb +1 -1
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +3 -25
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +2 -2
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +6 -8
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +0 -2
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +2 -1
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/actions.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/helper.rb +1 -2
- data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/paperclip.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +3 -28
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/record_select.rb +2 -0
- data/lib/active_scaffold/bridges/record_select/helpers.rb +14 -18
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +4 -8
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +20 -20
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +7 -22
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +14 -14
- data/lib/active_scaffold/config/base.rb +9 -6
- data/lib/active_scaffold/config/core.rb +30 -21
- data/lib/active_scaffold/config/create.rb +2 -1
- data/lib/active_scaffold/config/delete.rb +2 -2
- data/lib/active_scaffold/config/field_search.rb +9 -3
- data/lib/active_scaffold/config/form.rb +4 -4
- data/lib/active_scaffold/config/list.rb +27 -23
- data/lib/active_scaffold/config/nested.rb +4 -4
- data/lib/active_scaffold/config/search.rb +6 -6
- data/lib/active_scaffold/config/show.rb +11 -1
- data/lib/active_scaffold/config/subform.rb +1 -1
- data/lib/active_scaffold/config/update.rb +4 -2
- data/lib/active_scaffold/constraints.rb +39 -36
- data/lib/active_scaffold/core.rb +36 -15
- data/lib/active_scaffold/data_structures/action_columns.rb +14 -9
- data/lib/active_scaffold/data_structures/action_link.rb +4 -5
- data/lib/active_scaffold/data_structures/action_links.rb +5 -4
- data/lib/active_scaffold/data_structures/actions.rb +2 -2
- data/lib/active_scaffold/data_structures/association.rb +8 -0
- data/lib/active_scaffold/data_structures/association/abstract.rb +147 -0
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +42 -0
- data/lib/active_scaffold/data_structures/association/active_record.rb +94 -0
- data/lib/active_scaffold/data_structures/association/mongoid.rb +45 -0
- data/lib/active_scaffold/data_structures/bridge.rb +3 -6
- data/lib/active_scaffold/data_structures/column.rb +100 -82
- data/lib/active_scaffold/data_structures/columns.rb +21 -3
- data/lib/active_scaffold/data_structures/nested_info.rb +22 -37
- data/lib/active_scaffold/data_structures/set.rb +4 -4
- data/lib/active_scaffold/data_structures/sorting.rb +29 -15
- data/lib/active_scaffold/engine.rb +3 -1
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +10 -5
- data/lib/active_scaffold/extensions/action_view_rendering.rb +65 -59
- data/lib/active_scaffold/extensions/left_outer_joins.rb +48 -53
- data/lib/active_scaffold/extensions/localize.rb +3 -4
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +7 -11
- data/lib/active_scaffold/extensions/paginator_extensions.rb +20 -18
- data/lib/active_scaffold/extensions/routing_mapper.rb +104 -40
- data/lib/active_scaffold/extensions/to_label.rb +1 -1
- data/lib/active_scaffold/extensions/unsaved_associated.rb +4 -13
- data/lib/active_scaffold/extensions/unsaved_record.rb +12 -1
- data/lib/active_scaffold/finder.rb +200 -134
- data/lib/active_scaffold/helpers/action_link_helpers.rb +398 -0
- data/lib/active_scaffold/helpers/association_helpers.rb +12 -30
- data/lib/active_scaffold/helpers/controller_helpers.rb +74 -24
- data/lib/active_scaffold/helpers/form_column_helpers.rb +205 -112
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +21 -11
- data/lib/active_scaffold/helpers/id_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/list_column_helpers.rb +117 -39
- data/lib/active_scaffold/helpers/pagination_helpers.rb +11 -14
- data/lib/active_scaffold/helpers/search_column_helpers.rb +69 -32
- data/lib/active_scaffold/helpers/show_column_helpers.rb +9 -3
- data/lib/active_scaffold/helpers/view_helpers.rb +41 -426
- data/lib/active_scaffold/orm_checks.rb +109 -0
- data/lib/active_scaffold/paginator.rb +1 -1
- data/lib/active_scaffold/responds_to_parent.rb +12 -10
- data/lib/active_scaffold/tableless.rb +81 -43
- data/lib/active_scaffold/version.rb +2 -2
- data/lib/generators/active_scaffold/controller_generator.rb +49 -0
- data/lib/generators/active_scaffold/install_generator.rb +45 -0
- data/lib/generators/active_scaffold/resource_generator.rb +56 -0
- data/lib/generators/{active_scaffold_controller/templates → templates}/controller.rb +0 -0
- data/lib/generators/{active_scaffold_controller/templates → templates}/helper.rb +0 -0
- data/shoulda_macros/macros.rb +3 -3
- data/test/active_scaffold_config_mock.rb +33 -0
- data/test/bridges/bridge_test.rb +9 -9
- data/test/bridges/date_picker_test.rb +3 -1
- data/test/bridges/paper_trail_test.rb +2 -3
- data/test/bridges/paperclip_test.rb +21 -10
- data/test/bridges/tiny_mce_test.rb +20 -21
- data/test/class_with_finder.rb +42 -0
- data/test/company.rb +6 -4
- data/test/config/core_test.rb +1 -1
- data/test/config/create_test.rb +1 -1
- data/test/config/list_test.rb +3 -3
- data/test/config/update_test.rb +3 -3
- data/test/data_structures/action_columns_test.rb +3 -3
- data/test/data_structures/association_column_test.rb +5 -5
- data/test/data_structures/column_test.rb +14 -14
- data/test/data_structures/columns_test.rb +2 -2
- data/test/data_structures/set_test.rb +2 -2
- data/test/data_structures/sorting_test.rb +6 -4
- data/test/extensions/active_record_test.rb +1 -1
- data/test/extensions/routing_mapper_test.rb +64 -13
- data/test/helpers/form_column_helpers_test.rb +6 -6
- data/test/helpers/list_column_helpers_test.rb +9 -5
- data/test/helpers/pagination_helpers_test.rb +1 -0
- data/test/misc/active_record_permissions_test.rb +18 -1
- data/test/misc/attribute_params_test.rb +26 -17
- data/test/misc/calculation_test.rb +8 -31
- data/test/misc/configurable_test.rb +3 -2
- data/test/misc/constraints_test.rb +33 -22
- data/test/misc/convert_numbers_format_test.rb +28 -10
- data/test/misc/finder_test.rb +6 -29
- data/test/misc/parse_datetime_test.rb +160 -0
- data/test/misc/render_test.rb +1 -1
- data/test/misc/tableless_test.rb +24 -0
- data/test/mock_app/app/models/building.rb +2 -1
- data/test/mock_app/config.ru +1 -1
- data/test/mock_app/config/environments/test.rb +1 -1
- data/test/mock_app/config/routes.rb +11 -3
- data/test/model_stub.rb +11 -6
- data/test/run_all.rb +1 -1
- data/test/test_helper.rb +19 -4
- metadata +42 -23
- data/lib/active_scaffold/data_structures/error_message.rb +0 -22
- data/lib/active_scaffold/extensions/reverse_associations.rb +0 -119
- data/lib/generators/active_scaffold/USAGE +0 -29
- data/lib/generators/active_scaffold/active_scaffold_generator.rb +0 -21
- data/lib/generators/active_scaffold_controller/USAGE +0 -19
- data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +0 -29
- data/test/data_structures/error_message_test.rb +0 -25
@@ -2,7 +2,15 @@ module ActiveScaffold
|
|
2
2
|
module Helpers
|
3
3
|
module ControllerHelpers
|
4
4
|
def self.included(controller)
|
5
|
-
controller.
|
5
|
+
if controller.respond_to? :helper_method
|
6
|
+
controller.class_eval do
|
7
|
+
helper_method :params_for, :conditions_from_params, :render_parent?,
|
8
|
+
:main_path_to_return, :render_parent_options,
|
9
|
+
:render_parent_action, :nested_singular_association?,
|
10
|
+
:main_form_controller, :build_associated,
|
11
|
+
:generate_temporary_id, :generated_id
|
12
|
+
end
|
13
|
+
end
|
6
14
|
end
|
7
15
|
|
8
16
|
include ActiveScaffold::Helpers::IdHelpers
|
@@ -19,7 +27,7 @@ module ActiveScaffold
|
|
19
27
|
|
20
28
|
# These params should not propagate:
|
21
29
|
# :adapter and :position are one-use rendering arguments.
|
22
|
-
# :sort, :sort_direction, and :page are arguments that stored in the session
|
30
|
+
# :sort, :sort_direction, and :page are arguments that stored in the session, if store_user_settings is enabled
|
23
31
|
# and wow. no we don't want to propagate :record.
|
24
32
|
# :commit is a special rails variable for form buttons
|
25
33
|
# :_method is a special rails variable to simulate put, patch and delete actions.
|
@@ -28,16 +36,52 @@ module ActiveScaffold
|
|
28
36
|
# :iframe is used to simulate ajax forms loading form in iframe.
|
29
37
|
# :associated_id used in add_existing
|
30
38
|
# :authenticity_token is sent on some ajax requests
|
31
|
-
|
39
|
+
# :_added is sent on checkbox-list with update_columns
|
40
|
+
# :_removed is sent on checkbox-list with update_columns
|
41
|
+
# :_popstate sent when loading previous page from history, after using history.pushState
|
42
|
+
# :_ jQuery param added for GET requests with cache disabled
|
43
|
+
BLACKLIST_PARAMS = %i[adapter position sort sort_direction page record commit _method dont_close auto_pagination
|
44
|
+
iframe associated_id authenticity_token _added _removed _popstate _].freeze
|
32
45
|
|
33
46
|
def params_for(options = {})
|
34
47
|
unless @params_for
|
35
48
|
@params_for = {}
|
36
|
-
params.except(*BLACKLIST_PARAMS).each
|
49
|
+
params.except(*BLACKLIST_PARAMS).each do |key, value|
|
50
|
+
@params_for[key.to_sym] = copy_param(value)
|
51
|
+
end
|
37
52
|
@params_for[:controller] = '/' + @params_for[:controller].to_s unless @params_for[:controller].to_s.first(1) == '/' # for namespaced controllers
|
38
53
|
@params_for.delete(:id) if @params_for[:id].nil?
|
39
54
|
end
|
40
|
-
|
55
|
+
|
56
|
+
url_options = @params_for.merge(options)
|
57
|
+
if !active_scaffold_config.store_user_settings && controller_requested(url_options[:controller]) == controller_path
|
58
|
+
url_options[:search] ||= copy_param search_params if respond_to?(:search_params, true) && search_params.present?
|
59
|
+
url_options[:page] ||= params[:page]
|
60
|
+
if active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.user.user_sorting?
|
61
|
+
column, direction = active_scaffold_config.list.user.sorting.first
|
62
|
+
url_options[:sort] ||= column.name
|
63
|
+
url_options[:sort_direction] ||= direction
|
64
|
+
end
|
65
|
+
end
|
66
|
+
url_options
|
67
|
+
end
|
68
|
+
|
69
|
+
def controller_requested(controller)
|
70
|
+
if controller.to_s.first(1) == '/'
|
71
|
+
controller[1..-1]
|
72
|
+
else
|
73
|
+
path = controller_path.split('/')[0..-2]
|
74
|
+
path << controller
|
75
|
+
path.join('/')
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def copy_param(value)
|
80
|
+
if controller_params? value
|
81
|
+
params_hash value
|
82
|
+
else
|
83
|
+
value.duplicable? ? value.clone : value
|
84
|
+
end
|
41
85
|
end
|
42
86
|
|
43
87
|
# Parameters to generate url to the main page (override if the ActiveScaffold is used as a component on another controllers page)
|
@@ -45,7 +89,7 @@ module ActiveScaffold
|
|
45
89
|
if params[:return_to]
|
46
90
|
params[:return_to]
|
47
91
|
else
|
48
|
-
exclude_parameters = [
|
92
|
+
exclude_parameters = %i[utf8 associated_id]
|
49
93
|
parameters = {}
|
50
94
|
if params[:parent_scaffold] && nested? && nested.singular_association?
|
51
95
|
parameters[:controller] = params[:parent_scaffold]
|
@@ -67,6 +111,10 @@ module ActiveScaffold
|
|
67
111
|
nested? && (nested.belongs_to? || nested.has_one?)
|
68
112
|
end
|
69
113
|
|
114
|
+
def main_form_controller
|
115
|
+
parent_controller_name.constantize if params[:parent_controller]
|
116
|
+
end
|
117
|
+
|
70
118
|
def render_parent?
|
71
119
|
nested_singular_association? || params[:parent_sti]
|
72
120
|
end
|
@@ -74,24 +122,21 @@ module ActiveScaffold
|
|
74
122
|
def render_parent_options
|
75
123
|
if nested_singular_association?
|
76
124
|
{:controller => nested.parent_scaffold.controller_path, :action => :index, :id => nested.parent_id}
|
77
|
-
elsif
|
78
|
-
options = params_for(:controller =>
|
79
|
-
options.merge(:action => :index, :id => @record.to_param) if render_parent_action == :row
|
125
|
+
elsif parent_sti_controller
|
126
|
+
options = params_for(:controller => parent_sti_controller.controller_path, :action => render_parent_action, :parent_sti => nil)
|
127
|
+
options.merge!(:action => :index, :id => @record.to_param) if render_parent_action == :row
|
128
|
+
options
|
80
129
|
end
|
81
130
|
end
|
82
131
|
|
83
132
|
def render_parent_action
|
84
133
|
if @parent_action.nil?
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
@parent_action = :index if action_name == 'destroy' && parent_controller.active_scaffold_config.actions.include?(:delete) && parent_controller.active_scaffold_config.delete.refresh_list == true
|
92
|
-
end
|
93
|
-
rescue ActiveScaffold::ControllerNotFound => ex
|
94
|
-
logger.warn "#{ex.message} for parent_sti #{params[:parent_sti]}"
|
134
|
+
@parent_action = :row
|
135
|
+
if parent_sti_controller
|
136
|
+
parent_sti_config = parent_sti_controller.active_scaffold_config
|
137
|
+
@parent_action = :index if action_name == 'create' && parent_sti_config.actions.include?(:create) && parent_sti_config.create.refresh_list == true
|
138
|
+
@parent_action = :index if action_name == 'update' && parent_sti_config.actions.include?(:update) && parent_sti_config.update.refresh_list == true
|
139
|
+
@parent_action = :index if action_name == 'destroy' && parent_sti_config.actions.include?(:delete) && parent_sti_config.delete.refresh_list == true
|
95
140
|
end
|
96
141
|
end
|
97
142
|
@parent_action
|
@@ -99,12 +144,17 @@ module ActiveScaffold
|
|
99
144
|
|
100
145
|
# build an associated record for association
|
101
146
|
def build_associated(association, parent_record)
|
102
|
-
if association.
|
147
|
+
if association.through? && association.through_reflection.collection?
|
103
148
|
# build full chain, only check create_associated on initial parent_record
|
104
|
-
parent_record = build_associated(association.through_reflection, parent_record)
|
105
|
-
|
106
|
-
|
149
|
+
parent_record = build_associated(association.class.new(association.through_reflection), parent_record)
|
150
|
+
source_assoc = association.class.new(association.source_reflection)
|
151
|
+
build_associated(source_assoc, parent_record).tap do |record|
|
152
|
+
save_record_to_association(record, source_assoc.reverse_association, parent_record) # set inverse
|
107
153
|
end
|
154
|
+
elsif association.through? # through belongs_to/has_one
|
155
|
+
parent_record = parent_record.send(association.through_reflection.name)
|
156
|
+
source_assoc = association.class.new(association.source_reflection)
|
157
|
+
build_associated(source_assoc, parent_record)
|
108
158
|
elsif association.collection?
|
109
159
|
parent_record.send(association.name).build
|
110
160
|
elsif association.belongs_to? || parent_record.new_record? || parent_record.send(association.name).nil?
|
@@ -113,7 +163,7 @@ module ActiveScaffold
|
|
113
163
|
parent_record.send("build_#{association.name}")
|
114
164
|
else
|
115
165
|
association.klass.new.tap do |record|
|
116
|
-
save_record_to_association(record, association.
|
166
|
+
save_record_to_association(record, association.reverse_association, parent_record) # set inverse
|
117
167
|
end
|
118
168
|
end
|
119
169
|
end
|
@@ -12,8 +12,6 @@ module ActiveScaffold
|
|
12
12
|
|
13
13
|
def active_scaffold_render_input(column, options)
|
14
14
|
record = options[:object]
|
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
15
|
|
18
16
|
# first, check if the dev has created an override for this specific field
|
19
17
|
if (method = override_form_field(column))
|
@@ -42,15 +40,14 @@ module ActiveScaffold
|
|
42
40
|
# final ultimate fallback: use rails' generic input method
|
43
41
|
else
|
44
42
|
# for textual fields we pass different options
|
45
|
-
text_types = [
|
43
|
+
text_types = %i[text string integer float decimal]
|
46
44
|
options = active_scaffold_input_text_options(options) if text_types.include?(column.column.type)
|
47
45
|
if column.column.type == :string && options[:maxlength].blank?
|
48
46
|
options[:maxlength] = column.column.limit
|
49
47
|
options[:size] ||= options[:maxlength].to_i > 30 ? 30 : options[:maxlength]
|
50
48
|
end
|
51
|
-
options[:include_blank] = true if column.column.null && [:date, :datetime, :time].include?(column.column.type)
|
52
49
|
options[:value] = format_number_value(record.send(column.name), column.options) if column.number?
|
53
|
-
text_field(:record, column.name, options.merge(column.options))
|
50
|
+
text_field(:record, column.name, options.merge(column.options).except(:format))
|
54
51
|
end
|
55
52
|
end
|
56
53
|
end
|
@@ -60,8 +57,6 @@ module ActiveScaffold
|
|
60
57
|
end
|
61
58
|
|
62
59
|
def active_scaffold_render_subform_column(column, scope, crud_type, readonly, add_class = false, record = nil)
|
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
60
|
if add_class
|
66
61
|
col_class = []
|
67
62
|
col_class << 'required' if column.required?
|
@@ -120,22 +115,24 @@ module ActiveScaffold
|
|
120
115
|
def current_form_columns(record, scope, subform_controller = nil)
|
121
116
|
if scope
|
122
117
|
subform_controller.active_scaffold_config.subform.columns.names
|
123
|
-
elsif [
|
118
|
+
elsif %i[new create edit update render_field].include? action_name.to_sym
|
119
|
+
# disable update_columns for inplace_edit (GET render_field)
|
120
|
+
return if action_name == 'render_field' && request.get?
|
124
121
|
active_scaffold_config.send(record.new_record? ? :create : :update).columns.names
|
125
122
|
end
|
126
123
|
end
|
127
124
|
|
128
125
|
def update_columns_options(column, scope, options, force = false)
|
129
126
|
record = options[:object]
|
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
127
|
subform_controller = controller.class.active_scaffold_controller_for(record.class) if scope
|
133
128
|
form_columns = @main_columns.try(:names) if scope.nil? || subform_controller == controller.class
|
134
129
|
form_columns ||= current_form_columns(record, scope, subform_controller)
|
135
130
|
if force || (form_columns && column.update_columns && (column.update_columns & form_columns).present?)
|
136
131
|
url_params = params_for(:action => 'render_field', :column => column.name, :id => record.to_param)
|
137
|
-
|
138
|
-
|
132
|
+
if nested? && scope
|
133
|
+
url_params[:nested] = url_params.slice(:parent_scaffold, :association, nested.param_name)
|
134
|
+
url_params = url_params.except(:parent_scaffold, :association, nested.param_name)
|
135
|
+
end
|
139
136
|
if scope
|
140
137
|
url_params[:parent_controller] ||= url_params[:controller].gsub(/^\//, '')
|
141
138
|
url_params[:controller] = subform_controller.controller_path
|
@@ -144,7 +141,7 @@ module ActiveScaffold
|
|
144
141
|
end
|
145
142
|
|
146
143
|
options[:class] = "#{options[:class]} update_form".strip
|
147
|
-
options['data-update_url'] = url_for(url_params
|
144
|
+
options['data-update_url'] = url_for(url_params)
|
148
145
|
options['data-update_send_form'] = column.send_form_on_update_column
|
149
146
|
options['data-update_send_form_selector'] = column.options[:send_form_selector] if column.options[:send_form_selector]
|
150
147
|
end
|
@@ -156,8 +153,8 @@ module ActiveScaffold
|
|
156
153
|
end
|
157
154
|
|
158
155
|
def render_column(column, record, renders_as, scope = nil, only_value = false, col_class = nil)
|
159
|
-
if override_form_field_partial
|
160
|
-
render :partial =>
|
156
|
+
if partial = override_form_field_partial(column)
|
157
|
+
render :partial => partial, :locals => {:column => column, :only_value => only_value, :scope => scope, :col_class => col_class, :record => record}
|
161
158
|
elsif renders_as == :field || override_form_field?(column)
|
162
159
|
form_attribute(column, record, scope, only_value, col_class)
|
163
160
|
elsif renders_as == :subform
|
@@ -171,13 +168,17 @@ module ActiveScaffold
|
|
171
168
|
column_options = active_scaffold_input_options(column, scope, :object => record)
|
172
169
|
attributes = field_attributes(column, record)
|
173
170
|
attributes[:class] = "#{attributes[:class]} #{col_class}" if col_class.present?
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
171
|
+
if only_value
|
172
|
+
field = content_tag(:span, get_column_value(record, column), column_options.except(:name, :object))
|
173
|
+
if column.association.nil? || column.association.belongs_to?
|
174
|
+
# hidden field probably not needed, but leaving it just in case
|
175
|
+
# but it isn't working for assocations which are not belongs_to
|
176
|
+
method = column.association ? column.association.foreign_key : column.name
|
177
|
+
field << hidden_field(:record, method, column_options)
|
180
178
|
end
|
179
|
+
else
|
180
|
+
field = active_scaffold_input_for column, scope, column_options
|
181
|
+
end
|
181
182
|
|
182
183
|
content_tag :dl, attributes do
|
183
184
|
%(<dt>#{label_tag label_for(column, column_options), column.label}</dt><dd>#{field}
|
@@ -188,7 +189,7 @@ module ActiveScaffold
|
|
188
189
|
end
|
189
190
|
|
190
191
|
def label_for(column, options)
|
191
|
-
options[:id] unless column.form_ui == :select && column.
|
192
|
+
options[:id] unless column.form_ui == :select && column.association.try(:collection?)
|
192
193
|
end
|
193
194
|
|
194
195
|
def subform_label(column, hidden)
|
@@ -196,33 +197,60 @@ module ActiveScaffold
|
|
196
197
|
end
|
197
198
|
|
198
199
|
def form_hidden_attribute(column, record, scope = nil)
|
199
|
-
|
200
|
-
|
201
|
-
|
200
|
+
content_tag :dl, style: 'display: none' do
|
201
|
+
content_tag(:dt, '') <<
|
202
|
+
content_tag(:dd, form_hidden_field(column, record, scope))
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def form_hidden_field(column, record, scope)
|
207
|
+
options = active_scaffold_input_options(column, scope)
|
208
|
+
if column.association.try(:collection?)
|
209
|
+
associated = record.send(column.name)
|
210
|
+
if associated.blank?
|
211
|
+
hidden_field_tag options[:name], '', options
|
212
|
+
else
|
213
|
+
options[:name] += '[]'
|
214
|
+
fields = associated.map do |r|
|
215
|
+
hidden_field_tag options[:name], r.id, options.merge(id: options[:id] + "_#{r.id}")
|
216
|
+
end
|
217
|
+
safe_join fields, ''
|
218
|
+
end
|
219
|
+
else
|
220
|
+
hidden_field :record, column.name, options.merge(object: record)
|
221
|
+
end
|
202
222
|
end
|
203
223
|
|
204
224
|
# Should this column be displayed in the subform?
|
205
|
-
def in_subform?(column, parent_record)
|
225
|
+
def in_subform?(column, parent_record, parent_column)
|
206
226
|
return true unless column.association
|
207
227
|
|
208
|
-
|
209
|
-
|
228
|
+
if column.association.reverse.nil?
|
229
|
+
# Polymorphic associations can't appear because they *might* be the reverse association
|
230
|
+
return false if column.association.polymorphic?
|
210
231
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
232
|
+
# A column shouldn't be in the subform if it's the reverse association to the parent
|
233
|
+
!column.association.inverse_for?(parent_record.class)
|
234
|
+
elsif column.association.reverse == parent_column.name
|
235
|
+
if column.association.polymorphic?
|
236
|
+
column.association.name != parent_column.association.as
|
237
|
+
else
|
238
|
+
!column.association.inverse_for?(parent_record.class)
|
239
|
+
end
|
240
|
+
else
|
241
|
+
true
|
242
|
+
end
|
215
243
|
end
|
216
244
|
|
217
245
|
def column_show_add_existing(column, record = nil)
|
218
|
-
|
219
|
-
record ||= @record # TODO: Remove when relying on @record is removed
|
220
|
-
(column.allow_add_existing && options_for_association_count(column.association, record) > 0)
|
246
|
+
column.allow_add_existing && options_for_association_count(column.association, record) > 0
|
221
247
|
end
|
222
248
|
|
223
249
|
def column_show_add_new(column, associated, record)
|
224
|
-
|
225
|
-
value
|
250
|
+
assoc = column.association
|
251
|
+
value = assoc.singular?
|
252
|
+
value ||= assoc.collection? && !assoc.readonly? && (!assoc.through? || !assoc.through_reflection.collection?)
|
253
|
+
value &&= false unless assoc.klass.authorized_for?(:crud_type => :create)
|
226
254
|
value
|
227
255
|
end
|
228
256
|
|
@@ -245,21 +273,25 @@ module ActiveScaffold
|
|
245
273
|
options
|
246
274
|
end
|
247
275
|
|
248
|
-
def
|
276
|
+
def active_scaffold_select_name_with_multiple(options)
|
277
|
+
if options[:multiple] && !options[:name].to_s.ends_with?('[]')
|
278
|
+
options[:name] = "#{options[:name]}[]"
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
def active_scaffold_input_singular_association(column, html_options, options = {})
|
249
283
|
record = html_options.delete(:object)
|
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
|
252
284
|
associated = record.send(column.association.name)
|
253
285
|
|
254
286
|
select_options = sorted_association_options_find(column.association, nil, record)
|
255
287
|
select_options.unshift(associated) unless associated.nil? || select_options.include?(associated)
|
256
288
|
|
257
289
|
method = column.name
|
258
|
-
options
|
290
|
+
options.merge! :selected => associated.try(:id), :include_blank => as_(:_select_), :object => record
|
259
291
|
|
260
292
|
html_options.merge!(column.options[:html_options] || {})
|
261
293
|
options.merge!(column.options)
|
262
|
-
|
294
|
+
active_scaffold_select_name_with_multiple html_options
|
263
295
|
active_scaffold_translate_select_options(options)
|
264
296
|
|
265
297
|
html =
|
@@ -272,6 +304,39 @@ module ActiveScaffold
|
|
272
304
|
html
|
273
305
|
end
|
274
306
|
|
307
|
+
def active_scaffold_file_with_remove_link(column, options, content, remove_file_prefix, controls_class, &block)
|
308
|
+
options = active_scaffold_input_text_options(options.merge(column.options))
|
309
|
+
if content
|
310
|
+
active_scaffold_file_with_content(column, content, options, remove_file_prefix, controls_class, &block)
|
311
|
+
else
|
312
|
+
file_field(:record, column.name, options)
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
def active_scaffold_file_with_content(column, content, options, remove_file_prefix, controls_class)
|
317
|
+
required = options.delete(:required)
|
318
|
+
case ActiveScaffold.js_framework
|
319
|
+
when :jquery
|
320
|
+
js_remove_file_code = "jQuery(this).prev().val('true'); jQuery(this).parent().hide().next().show()#{".find('input').attr('required', 'required')" if required}; return false;"
|
321
|
+
js_dont_remove_file_code = "jQuery(this).parents('div.#{controls_class}').find('input.remove_file').val('false'); return false;"
|
322
|
+
when :prototype
|
323
|
+
js_remove_file_code = "$(this).previous().value='true'; $(this).up().hide().next().show()#{".down().writeAttribute('required', 'required')" if required}; return false;"
|
324
|
+
js_dont_remove_file_code = "jQuery(this).parents('div.#{controls_class}').find('input.remove_file').val('false'); return false;"
|
325
|
+
end
|
326
|
+
|
327
|
+
object_name, method = options[:name].split(/\[(#{column.name})\]/)
|
328
|
+
method.sub!(/#{column.name}/, "#{remove_file_prefix}\\0")
|
329
|
+
fields = block_given? ? yield : ''
|
330
|
+
input = file_field(:record, column.name, options.merge(:onchange => js_dont_remove_file_code))
|
331
|
+
content_tag(:div, class: controls_class) do
|
332
|
+
content_tag(:div) do
|
333
|
+
safe_join [content, ' | ', fields,
|
334
|
+
hidden_field(object_name, method, :value => 'false', class: 'remove_file'),
|
335
|
+
content_tag(:a, as_(:remove_file), :href => '#', :onclick => js_remove_file_code)]
|
336
|
+
end << content_tag(:div, input, :style => 'display: none')
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
275
340
|
def active_scaffold_refresh_link(column, html_options, record)
|
276
341
|
link_options = {:object => record}
|
277
342
|
if html_options['data-update_url']
|
@@ -286,16 +351,12 @@ module ActiveScaffold
|
|
286
351
|
end
|
287
352
|
|
288
353
|
def active_scaffold_plural_association_options(column, record = nil)
|
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
|
291
354
|
associated_options = record.send(column.association.name)
|
292
355
|
[associated_options, associated_options | sorted_association_options_find(column.association, nil, record)]
|
293
356
|
end
|
294
357
|
|
295
358
|
def active_scaffold_input_plural_association(column, options)
|
296
359
|
record = options.delete(:object)
|
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
|
299
360
|
associated_options, select_options = active_scaffold_plural_association_options(column, record)
|
300
361
|
|
301
362
|
html =
|
@@ -339,31 +400,45 @@ module ActiveScaffold
|
|
339
400
|
column.options[:options]
|
340
401
|
end
|
341
402
|
|
342
|
-
def active_scaffold_input_enum(column, html_options)
|
403
|
+
def active_scaffold_input_enum(column, html_options, options = {})
|
343
404
|
record = html_options.delete(:object)
|
344
|
-
|
345
|
-
|
346
|
-
options = {:selected => record.send(column.name), :object => record}
|
405
|
+
options[:selected] = record.send(column.name)
|
406
|
+
options[:object] = record
|
347
407
|
options_for_select = active_scaffold_enum_options(column, record).collect do |text, value|
|
348
408
|
active_scaffold_translated_option(column, text, value)
|
349
409
|
end
|
350
410
|
html_options.merge!(column.options[:html_options] || {})
|
351
411
|
options.merge!(column.options)
|
352
|
-
|
412
|
+
active_scaffold_select_name_with_multiple html_options
|
353
413
|
active_scaffold_translate_select_options(options)
|
354
414
|
select(:record, column.name, options_for_select, options, html_options)
|
355
415
|
end
|
356
416
|
|
357
417
|
def active_scaffold_input_select(column, html_options)
|
358
|
-
if column.
|
418
|
+
if column.association.try :singular?
|
359
419
|
active_scaffold_input_singular_association(column, html_options)
|
360
|
-
elsif column.
|
420
|
+
elsif column.association.try :collection?
|
361
421
|
active_scaffold_input_plural_association(column, html_options)
|
362
422
|
else
|
363
423
|
active_scaffold_input_enum(column, html_options)
|
364
424
|
end
|
365
425
|
end
|
366
426
|
|
427
|
+
def active_scaffold_radio_option(option, selected, column, radio_options)
|
428
|
+
if column.association
|
429
|
+
label_method = column.options[:label_method] || :to_label
|
430
|
+
text, value = [option.send(label_method), option.id]
|
431
|
+
checked = {:checked => selected == value}
|
432
|
+
else
|
433
|
+
text, value = active_scaffold_translated_option(column, *option)
|
434
|
+
end
|
435
|
+
|
436
|
+
id_key = radio_options[:"data-id"] ? :"data-id" : :id
|
437
|
+
radio_options = radio_options.merge(id_key => radio_options[id_key] + '-' + value.to_s.parameterize)
|
438
|
+
radio_options.merge!(checked) if checked
|
439
|
+
content_tag(:label, radio_button(:record, column.name, value, radio_options) + text)
|
440
|
+
end
|
441
|
+
|
367
442
|
def active_scaffold_input_radio(column, html_options)
|
368
443
|
record = html_options[:object]
|
369
444
|
html_options.merge!(column.options[:html_options] || {})
|
@@ -373,21 +448,12 @@ module ActiveScaffold
|
|
373
448
|
else
|
374
449
|
active_scaffold_enum_options(column, record)
|
375
450
|
end
|
376
|
-
id_key = html_options[:"data-id"] ? :"data-id" : :id
|
377
|
-
label_method = column.options[:label_method] || :to_label if column.association
|
378
451
|
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
text, value = active_scaffold_translated_option(column, text, value)
|
385
|
-
end
|
386
|
-
|
387
|
-
radio_options = html_options.merge(id_key => html_options[id_key] + '-' + value.to_s.parameterize)
|
388
|
-
radio_options.merge!(checked) if checked
|
389
|
-
html << content_tag(:label, radio_button(:record, column.name, value, radio_options) + text)
|
390
|
-
end.html_safe
|
452
|
+
selected = record.send(column.association.name).try(:id) if column.association
|
453
|
+
radios = options.map do |option|
|
454
|
+
active_scaffold_radio_option(option, selected, column, html_options)
|
455
|
+
end
|
456
|
+
safe_join radios
|
391
457
|
end
|
392
458
|
|
393
459
|
def active_scaffold_input_checkbox(column, options)
|
@@ -395,8 +461,7 @@ module ActiveScaffold
|
|
395
461
|
end
|
396
462
|
|
397
463
|
def active_scaffold_input_password(column, options)
|
398
|
-
|
399
|
-
password_field :record, column.name, options.merge(column.options)
|
464
|
+
active_scaffold_text_input :password_field, column, options
|
400
465
|
end
|
401
466
|
|
402
467
|
def active_scaffold_input_textarea(column, options)
|
@@ -404,8 +469,7 @@ module ActiveScaffold
|
|
404
469
|
end
|
405
470
|
|
406
471
|
def active_scaffold_input_virtual(column, options)
|
407
|
-
|
408
|
-
text_field :record, column.name, options.merge(column.options)
|
472
|
+
active_scaffold_text_input :text_field, column, options
|
409
473
|
end
|
410
474
|
|
411
475
|
# Some fields from HTML5 (primarily for using in-browser validation)
|
@@ -413,34 +477,54 @@ module ActiveScaffold
|
|
413
477
|
|
414
478
|
# A text box, that accepts only valid email address (in-browser validation)
|
415
479
|
def active_scaffold_input_email(column, options)
|
416
|
-
|
417
|
-
email_field :record, column.name, options.merge(column.options)
|
480
|
+
active_scaffold_text_input :email_field, column, options
|
418
481
|
end
|
419
482
|
|
420
483
|
# A text box, that accepts only valid URI (in-browser validation)
|
421
484
|
def active_scaffold_input_url(column, options)
|
422
|
-
|
423
|
-
url_field :record, column.name, options.merge(column.options)
|
485
|
+
active_scaffold_text_input :url_field, column, options
|
424
486
|
end
|
425
487
|
|
426
488
|
# A text box, that accepts only valid phone-number (in-browser validation)
|
427
489
|
def active_scaffold_input_telephone(column, options)
|
428
|
-
|
429
|
-
telephone_field :record, column.name, options.merge(column.options)
|
490
|
+
active_scaffold_text_input :telephone_field, column, options, :format
|
430
491
|
end
|
431
492
|
|
432
493
|
# A spinbox control for number values (in-browser validation)
|
433
494
|
def active_scaffold_input_number(column, options)
|
434
|
-
|
435
|
-
options = active_scaffold_input_text_options(options)
|
436
|
-
number_field :record, column.name, options.merge(column.options)
|
495
|
+
active_scaffold_number_input :number_field, column, options, :format
|
437
496
|
end
|
438
497
|
|
439
498
|
# A slider control for number values (in-browser validation)
|
440
499
|
def active_scaffold_input_range(column, options)
|
500
|
+
active_scaffold_number_input :range_field, column, options, :format
|
501
|
+
end
|
502
|
+
|
503
|
+
# A slider control for number values (in-browser validation)
|
504
|
+
def active_scaffold_number_input(method, column, options, remove_options = nil)
|
441
505
|
options = numerical_constraints_for_column(column, options)
|
506
|
+
active_scaffold_text_input method, column, options, remove_options
|
507
|
+
end
|
508
|
+
|
509
|
+
def active_scaffold_text_input(method, column, options, remove_options = nil)
|
442
510
|
options = active_scaffold_input_text_options(options)
|
443
|
-
|
511
|
+
options = options.merge(column.options)
|
512
|
+
options = options.except(*remove_options) if remove_options.present?
|
513
|
+
send method, :record, column.name, options
|
514
|
+
end
|
515
|
+
|
516
|
+
# A color picker
|
517
|
+
def active_scaffold_input_color(column, options)
|
518
|
+
options = active_scaffold_input_text_options(options)
|
519
|
+
if column.column.try(:null)
|
520
|
+
no_color = options[:object].send(column.name).nil?
|
521
|
+
method = no_color ? :hidden_field : :color_field
|
522
|
+
html = content_tag(:label, check_box_tag('disable', '1', no_color, id: nil, name: nil, class: 'no-color') << " #{as_ column.options[:no_color] || :no_color}")
|
523
|
+
else
|
524
|
+
method = :color_field
|
525
|
+
html = ''.html_safe
|
526
|
+
end
|
527
|
+
html << send(method, :record, column.name, options.merge(column.options).except(:format, :no_color))
|
444
528
|
end
|
445
529
|
|
446
530
|
#
|
@@ -449,8 +533,6 @@ module ActiveScaffold
|
|
449
533
|
|
450
534
|
def active_scaffold_input_boolean(column, options)
|
451
535
|
record = options.delete(:object)
|
452
|
-
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
|
453
|
-
record ||= @record # TODO: Remove when relying on @record is removed
|
454
536
|
select_options = []
|
455
537
|
select_options << [as_(:_select_), nil] if !column.virtual? && column.column.null
|
456
538
|
select_options << [as_(:true), true]
|
@@ -459,51 +541,65 @@ module ActiveScaffold
|
|
459
541
|
select_tag(options[:name], options_for_select(select_options, record.send(column.name)), options)
|
460
542
|
end
|
461
543
|
|
462
|
-
def
|
544
|
+
def active_scaffold_input_date(column, options)
|
545
|
+
active_scaffold_text_input :date_field, column, options
|
546
|
+
end
|
547
|
+
|
548
|
+
def active_scaffold_input_time(column, options)
|
549
|
+
active_scaffold_text_input :time_field, column, options
|
550
|
+
end
|
551
|
+
|
552
|
+
def active_scaffold_input_datetime(column, options)
|
553
|
+
active_scaffold_text_input :datetime_local_field, column, options
|
554
|
+
end
|
555
|
+
|
556
|
+
def active_scaffold_input_month(column, options)
|
557
|
+
active_scaffold_text_input :month_field, column, options
|
558
|
+
end
|
559
|
+
|
560
|
+
def active_scaffold_input_week(column, options)
|
561
|
+
active_scaffold_text_input :week_field, column, options
|
463
562
|
end
|
464
563
|
|
465
564
|
##
|
466
565
|
## Form column override signatures
|
467
566
|
##
|
468
567
|
|
469
|
-
|
470
|
-
|
471
|
-
|
568
|
+
def partial_for_model(model, partial)
|
569
|
+
controller = active_scaffold_controller_for(model)
|
570
|
+
while controller.uses_active_scaffold?
|
571
|
+
path = File.join(controller.controller_path, partial)
|
572
|
+
return path if template_exists?(path, true)
|
573
|
+
controller = controller.superclass
|
574
|
+
end
|
575
|
+
nil
|
472
576
|
end
|
473
577
|
|
578
|
+
# add functionality for overriding subform partials from association class path
|
474
579
|
def override_subform_partial(column, subform_partial)
|
475
|
-
|
476
|
-
end
|
477
|
-
|
478
|
-
def override_form_field_partial?(column)
|
479
|
-
template_exists?(override_form_field_partial(column), true)
|
580
|
+
partial_for_model(column.association.klass, subform_partial) if column_renders_as(column) == :subform
|
480
581
|
end
|
481
582
|
|
482
583
|
# the naming convention for overriding form fields with helpers
|
483
584
|
def override_form_field_partial(column)
|
484
|
-
|
485
|
-
File.join(path, "#{clean_column_name(column.name)}_form_column")
|
585
|
+
partial_for_model(column.active_record_class, "#{clean_column_name(column.name)}_form_column")
|
486
586
|
end
|
487
587
|
|
488
588
|
def override_form_field(column)
|
489
589
|
override_helper column, 'form_column'
|
490
590
|
end
|
491
|
-
|
591
|
+
alias override_form_field? override_form_field
|
492
592
|
|
493
593
|
# the naming convention for overriding form input types with helpers
|
494
594
|
def override_input(form_ui)
|
495
595
|
method = "active_scaffold_input_#{form_ui}"
|
496
596
|
method if respond_to? method
|
497
597
|
end
|
498
|
-
|
598
|
+
alias override_input? override_input
|
499
599
|
|
500
600
|
def subform_partial_for_column(column)
|
501
601
|
subform_partial = "#{active_scaffold_config_for(column.association.klass).subform.layout}_subform"
|
502
|
-
|
503
|
-
override_subform_partial(column, subform_partial)
|
504
|
-
else
|
505
|
-
subform_partial
|
506
|
-
end
|
602
|
+
override_subform_partial(column, subform_partial) || subform_partial
|
507
603
|
end
|
508
604
|
|
509
605
|
##
|
@@ -512,19 +608,18 @@ module ActiveScaffold
|
|
512
608
|
|
513
609
|
def column_renders_as(column)
|
514
610
|
if column.respond_to? :each
|
515
|
-
|
611
|
+
:subsection
|
516
612
|
elsif column.active_record_class.locking_column.to_s == column.name.to_s || column.form_ui == :hidden
|
517
|
-
|
613
|
+
:hidden
|
518
614
|
elsif column.association.nil? || column.form_ui || !active_scaffold_config_for(column.association.klass).actions.include?(:subform) || override_form_field?(column)
|
519
|
-
|
615
|
+
:field
|
520
616
|
else
|
521
|
-
|
617
|
+
:subform
|
522
618
|
end
|
523
619
|
end
|
524
620
|
|
525
621
|
def column_scope(column, scope = nil, record = nil)
|
526
|
-
|
527
|
-
if column.plural_association?
|
622
|
+
if column.association.try(:collection?)
|
528
623
|
"#{scope}[#{column.name}][#{record.id || generate_temporary_id(record)}]"
|
529
624
|
else
|
530
625
|
"#{scope}[#{column.name}]"
|
@@ -533,11 +628,9 @@ module ActiveScaffold
|
|
533
628
|
|
534
629
|
def active_scaffold_add_existing_input(options)
|
535
630
|
record = options.delete(:object)
|
536
|
-
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
|
537
|
-
record ||= @record # TODO: Remove when relying on @record is removed
|
538
631
|
if !ActiveScaffold.js_framework.nil? && controller.respond_to?(:record_select_config, true)
|
539
632
|
remote_controller = active_scaffold_controller_for(record_select_config.model).controller_path
|
540
|
-
options
|
633
|
+
options[:controller] = remote_controller
|
541
634
|
options.merge!(active_scaffold_input_text_options)
|
542
635
|
record_select_field(options[:name], record, options)
|
543
636
|
else
|
@@ -596,8 +689,8 @@ module ActiveScaffold
|
|
596
689
|
numerical_constraints[:step] ||= "0.#{'0' * (column.column.scale - 1)}1" if column.column && column.column.scale.to_i > 0
|
597
690
|
elsif options[:min] && options[:min].respond_to?(:even?) && (only_odd_valid || only_even_valid)
|
598
691
|
numerical_constraints[:step] = 2
|
599
|
-
numerical_constraints[:min] += 1 if only_odd_valid &&
|
600
|
-
numerical_constraints[:min] += 1 if only_even_valid &&
|
692
|
+
numerical_constraints[:min] += 1 if only_odd_valid && options[:min].even?
|
693
|
+
numerical_constraints[:min] += 1 if only_even_valid && options[:min].odd?
|
601
694
|
end
|
602
695
|
numerical_constraints[:step] ||= 'any' unless only_integer
|
603
696
|
end
|