active_scaffold 3.0.23 → 3.0.24
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.
- data/frontends/default/views/_action_group.html.erb +1 -1
- data/frontends/default/views/_action_group.html.erb~ +24 -0
- data/frontends/default/views/_form.html.erb~ +26 -0
- data/frontends/default/views/_form_association.html.erb~ +19 -0
- data/frontends/default/views/_form_association_footer.html.erb~ +16 -6
- data/frontends/default/views/_horizontal_subform.html.erb~ +29 -0
- data/frontends/default/views/_horizontal_subform_header.html.erb~ +3 -2
- data/frontends/default/views/_list_actions.html.erb~ +15 -0
- data/frontends/default/views/_list_inline_adapter.html.erb~ +10 -0
- data/frontends/default/views/_list_messages.html.erb~ +30 -0
- data/frontends/default/views/_list_pagination.html.erb~ +11 -0
- data/frontends/default/views/_list_pagination_links.html.erb~ +0 -0
- data/frontends/default/views/_render_field.js.erb~ +23 -0
- data/frontends/default/views/_row.html.erb~ +6 -0
- data/frontends/default/views/_vertical_subform.html.erb~ +12 -0
- data/frontends/default/views/edit_associated.js.erb~ +13 -0
- data/frontends/default/views/on_create.js.rjs +2 -2
- data/frontends/default/views/render_field.js.erb~ +1 -0
- data/lib/active_scaffold/actions/core.rb~ +13 -5
- data/lib/active_scaffold/actions/create.rb~ +149 -0
- data/lib/active_scaffold/actions/list.rb~ +196 -0
- data/lib/active_scaffold/actions/nested.rb +6 -2
- data/lib/active_scaffold/actions/nested.rb~ +252 -0
- data/lib/active_scaffold/actions/search.rb~ +49 -0
- data/lib/active_scaffold/actions/subform.rb~ +27 -0
- data/lib/active_scaffold/actions/update.rb~ +149 -0
- data/lib/active_scaffold/attribute_params.rb~ +202 -0
- data/lib/active_scaffold/bridges/record_select/{lib/record_select_bridge.rb~ → helpers.rb~} +7 -16
- data/lib/active_scaffold/bridges/shared/date_bridge.rb~ +209 -0
- data/lib/active_scaffold/config/create.rb +4 -4
- data/lib/active_scaffold/config/nested.rb +1 -0
- data/lib/active_scaffold/config/nested.rb~ +41 -0
- data/lib/active_scaffold/config/search.rb~ +74 -0
- data/lib/active_scaffold/constraints.rb~ +186 -0
- data/lib/active_scaffold/data_structures/action_columns.rb~ +140 -0
- data/lib/active_scaffold/data_structures/action_link.rb +4 -4
- data/lib/active_scaffold/data_structures/action_link.rb~ +179 -0
- data/lib/active_scaffold/data_structures/nested_info.rb~ +124 -0
- data/lib/active_scaffold/extensions/action_controller_rendering.rb~ +22 -0
- data/lib/active_scaffold/extensions/action_view_rendering.rb~ +108 -0
- data/lib/active_scaffold/extensions/cache_association.rb~ +12 -0
- data/lib/active_scaffold/extensions/reverse_associations.rb~ +64 -0
- data/lib/active_scaffold/extensions/routing_mapper.rb~ +34 -0
- data/lib/active_scaffold/extensions/unsaved_associated.rb~ +62 -0
- data/lib/active_scaffold/finder.rb~ +370 -0
- data/lib/active_scaffold/helpers/controller_helpers.rb~ +101 -0
- data/lib/active_scaffold/helpers/form_column_helpers.rb~ +321 -0
- data/lib/active_scaffold/helpers/id_helpers.rb~ +123 -0
- data/lib/active_scaffold/helpers/list_column_helpers.rb +9 -6
- data/lib/active_scaffold/helpers/list_column_helpers.rb~ +368 -0
- data/lib/active_scaffold/helpers/search_column_helpers.rb~ +94 -46
- data/lib/active_scaffold/helpers/view_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/view_helpers.rb~ +353 -0
- data/lib/active_scaffold/version.rb +1 -1
- data/lib/active_scaffold.rb +1 -1
- data/lib/active_scaffold.rb~ +362 -0
- metadata +110 -76
- data/lib/active_scaffold/bridges/dragonfly/bridge.rb~ +0 -12
- data/lib/active_scaffold/bridges/dragonfly/lib/dragonfly_bridge.rb~ +0 -36
- data/lib/active_scaffold/bridges/dragonfly/lib/dragonfly_bridge_helpers.rb~ +0 -12
- data/lib/active_scaffold/bridges/dragonfly/lib/form_ui.rb~ +0 -27
- data/lib/active_scaffold/bridges/dragonfly/lib/list_ui.rb~ +0 -16
@@ -0,0 +1,101 @@
|
|
1
|
+
module ActiveScaffold
|
2
|
+
module Helpers
|
3
|
+
module ControllerHelpers
|
4
|
+
def self.included(controller)
|
5
|
+
controller.class_eval { helper_method :params_for, :main_path_to_return, :render_parent?, :render_parent_options, :render_parent_action, :nested_singular_association?, :build_associated}
|
6
|
+
end
|
7
|
+
|
8
|
+
include ActiveScaffold::Helpers::IdHelpers
|
9
|
+
|
10
|
+
def params_for(options = {})
|
11
|
+
# :adapter and :position are one-use rendering arguments. they should not propagate.
|
12
|
+
# :sort, :sort_direction, and :page are arguments that stored in the session. they need not propagate.
|
13
|
+
# and wow. no we don't want to propagate :record.
|
14
|
+
# :commit is a special rails variable for form buttons
|
15
|
+
blacklist = [:adapter, :position, :sort, :sort_direction, :page, :record, :commit, :_method, :authenticity_token, :iframe]
|
16
|
+
unless @params_for
|
17
|
+
@params_for = {}
|
18
|
+
params.select { |key, value| blacklist.exclude? key.to_sym if key }.each {|key, value| @params_for[key.to_sym] = value.duplicable? ? value.clone : value}
|
19
|
+
@params_for[:controller] = '/' + @params_for[:controller].to_s unless @params_for[:controller].to_s.first(1) == '/' # for namespaced controllers
|
20
|
+
@params_for.delete(:id) if @params_for[:id].nil?
|
21
|
+
end
|
22
|
+
@params_for.merge(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Parameters to generate url to the main page (override if the ActiveScaffold is used as a component on another controllers page)
|
26
|
+
def main_path_to_return
|
27
|
+
if params[:return_to]
|
28
|
+
params[:return_to]
|
29
|
+
else
|
30
|
+
parameters = {}
|
31
|
+
if params[:parent_controller]
|
32
|
+
parameters[:controller] = params[:parent_controller]
|
33
|
+
parameters[:eid] = params[:parent_controller]
|
34
|
+
end
|
35
|
+
if nested?
|
36
|
+
parameters[:controller] = nested.parent_scaffold.controller_path
|
37
|
+
parameters[:eid] = nil
|
38
|
+
end
|
39
|
+
if params[:parent_sti]
|
40
|
+
parameters[:controller] = params[:parent_sti]
|
41
|
+
parameters[:eid] = nil
|
42
|
+
end
|
43
|
+
parameters[:parent_column] = nil
|
44
|
+
parameters[:parent_id] = nil
|
45
|
+
parameters[:action] = "index"
|
46
|
+
parameters[:id] = nil
|
47
|
+
parameters[:associated_id] = nil
|
48
|
+
parameters[:utf8] = nil
|
49
|
+
params_for(parameters)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def nested_singular_association?
|
54
|
+
nested? && (nested.belongs_to? || nested.has_one?)
|
55
|
+
end
|
56
|
+
|
57
|
+
def render_parent?
|
58
|
+
nested_singular_association? || params[:parent_sti]
|
59
|
+
end
|
60
|
+
|
61
|
+
def render_parent_options
|
62
|
+
if nested_singular_association?
|
63
|
+
{:controller => nested.parent_scaffold.controller_path, :action => :row, :id => nested.parent_id}
|
64
|
+
elsif params[:parent_sti]
|
65
|
+
options = {:controller => params[:parent_sti], :action => render_parent_action(params[:parent_sti])}
|
66
|
+
if render_parent_action(params[:parent_sti]) == :index
|
67
|
+
options.merge(params.slice(:eid))
|
68
|
+
else
|
69
|
+
options.merge({:id => @record.id})
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def render_parent_action(controller_path = nil)
|
75
|
+
begin
|
76
|
+
@parent_action = :row
|
77
|
+
parent_controller = "#{controller_path.to_s.camelize}Controller".constantize
|
78
|
+
@parent_action = :index if action_name == 'create' && parent_controller.active_scaffold_config.actions.include?(:create) && parent_controller.active_scaffold_config.create.refresh_list == true
|
79
|
+
@parent_action = :index if action_name == 'update' && parent_controller.active_scaffold_config.actions.include?(:update) && parent_controller.active_scaffold_config.update.refresh_list == true
|
80
|
+
@parent_action = :index if action_name == 'destroy' && parent_controller.active_scaffold_config.actions.include?(:delete) && parent_controller.active_scaffold_config.delete.refresh_list == true
|
81
|
+
rescue ActiveScaffold::ControllerNotFound
|
82
|
+
end if @parent_action.nil?
|
83
|
+
@parent_action
|
84
|
+
end
|
85
|
+
|
86
|
+
def build_associated(column, record)
|
87
|
+
child = column.singular_association? ? record.send(:"build_#{column.name}") : record.send(column.name).build
|
88
|
+
if record.new_record? && (reflection = record.class.reflect_on_association(column.name)).try(:reverse)
|
89
|
+
reverse_macro = child.class.reflect_on_association(reflection.reverse).macro
|
90
|
+
if [:has_one, :belongs_to].include?(reverse_macro) # singular
|
91
|
+
child.send(:"#{reflection.reverse}=", record)
|
92
|
+
# TODO: Might want to extend with this branch in the future
|
93
|
+
# else # plural
|
94
|
+
# child.send(:"#{reflection.reverse}") << record
|
95
|
+
end
|
96
|
+
end
|
97
|
+
child
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,321 @@
|
|
1
|
+
module ActiveScaffold
|
2
|
+
module Helpers
|
3
|
+
# Helpers that assist with the rendering of a Form Column
|
4
|
+
module FormColumnHelpers
|
5
|
+
# This method decides which input to use for the given column.
|
6
|
+
# It does not do any rendering. It only decides which method is responsible for rendering.
|
7
|
+
def active_scaffold_input_for(column, scope = nil, options = {})
|
8
|
+
options = active_scaffold_input_options(column, scope, options)
|
9
|
+
options = update_columns_options(column, scope, options)
|
10
|
+
active_scaffold_render_input(column, options)
|
11
|
+
end
|
12
|
+
|
13
|
+
alias form_column active_scaffold_input_for
|
14
|
+
|
15
|
+
def active_scaffold_render_input(column, options)
|
16
|
+
begin
|
17
|
+
# first, check if the dev has created an override for this specific field
|
18
|
+
if override_form_field?(column)
|
19
|
+
send(override_form_field(column), @record, options)
|
20
|
+
# second, check if the dev has specified a valid form_ui for this column
|
21
|
+
elsif column.form_ui and override_input?(column.form_ui)
|
22
|
+
send(override_input(column.form_ui), column, options)
|
23
|
+
# fallback: we get to make the decision
|
24
|
+
else
|
25
|
+
if column.association
|
26
|
+
if column.form_ui.nil?
|
27
|
+
# its an association and nothing is specified, we will assume form_ui :select
|
28
|
+
active_scaffold_input_select(column, options)
|
29
|
+
else
|
30
|
+
# if we get here, it's because the column has a form_ui but not one ActiveScaffold knows about.
|
31
|
+
raise "Unknown form_ui `#{column.form_ui}' for column `#{column.name}'"
|
32
|
+
end
|
33
|
+
elsif column.virtual?
|
34
|
+
options[:value] = format_number_value(@record.send(column.name), column.options) if column.number?
|
35
|
+
active_scaffold_input_virtual(column, options)
|
36
|
+
|
37
|
+
else # regular model attribute column
|
38
|
+
# if we (or someone else) have created a custom render option for the column type, use that
|
39
|
+
if override_input?(column.column.type)
|
40
|
+
send(override_input(column.column.type), column, options)
|
41
|
+
# final ultimate fallback: use rails' generic input method
|
42
|
+
else
|
43
|
+
# for textual fields we pass different options
|
44
|
+
text_types = [:text, :string, :integer, :float, :decimal, :date, :time, :datetime]
|
45
|
+
options = active_scaffold_input_text_options(options) if text_types.include?(column.column.type)
|
46
|
+
if column.column.type == :string && options[:maxlength].blank?
|
47
|
+
options[:maxlength] = column.column.limit
|
48
|
+
options[:size] ||= ActionView::Helpers::InstanceTag::DEFAULT_FIELD_OPTIONS["size"]
|
49
|
+
end
|
50
|
+
options[:include_blank] = true if column.column.null and [:date, :datetime, :time].include?(column.column.type)
|
51
|
+
options[:value] = format_number_value(@record.send(column.name), column.options) if column.number?
|
52
|
+
text_field(:record, column.name, options.merge(column.options))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
rescue Exception => e
|
57
|
+
logger.error Time.now.to_s + "#{e.inspect} -- on the ActiveScaffold column = :#{column.name} in #{controller.class}"
|
58
|
+
raise e
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# the standard active scaffold options used for textual inputs
|
63
|
+
def active_scaffold_input_text_options(options = {})
|
64
|
+
options[:autocomplete] = 'off'
|
65
|
+
options[:class] = "#{options[:class]} text-input".strip
|
66
|
+
options
|
67
|
+
end
|
68
|
+
|
69
|
+
# the standard active scaffold options used for class, name and scope
|
70
|
+
def active_scaffold_input_options(column, scope = nil, options = {})
|
71
|
+
name = scope ? "record#{scope}[#{column.name}]" : "record[#{column.name}]"
|
72
|
+
|
73
|
+
# Fix for keeping unique IDs in subform
|
74
|
+
id_control = "record_#{column.name}_#{[params[:eid], params[:id]].compact.join '_'}"
|
75
|
+
id_control += scope_id(scope) if scope
|
76
|
+
|
77
|
+
{ :name => name, :class => "#{column.name}-input", :id => id_control}.merge(options)
|
78
|
+
end
|
79
|
+
|
80
|
+
def update_columns_options(column, scope, options)
|
81
|
+
if column.update_columns
|
82
|
+
form_action = params[:action] == 'edit' ? :update : :create
|
83
|
+
url_params = {:action => 'render_field', :id => params[:id], :column => column.name}
|
84
|
+
url_params[:eid] = params[:eid] if params[:eid]
|
85
|
+
url_params[:controller] = controller.class.active_scaffold_controller_for(@record.class).controller_path if scope
|
86
|
+
url_params[:scope] = scope if scope
|
87
|
+
|
88
|
+
options[:class] = "#{options[:class]} update_form".strip
|
89
|
+
options['data-update_url'] = url_for(url_params)
|
90
|
+
options['data-update_send_form'] = true if column.send_form_on_update_column
|
91
|
+
end
|
92
|
+
options
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
## Form input methods
|
97
|
+
##
|
98
|
+
|
99
|
+
def active_scaffold_input_singular_association(column, html_options)
|
100
|
+
associated = @record.send(column.association.name)
|
101
|
+
|
102
|
+
select_options = options_for_association(column.association)
|
103
|
+
select_options.unshift([ associated.to_label, associated.id ]) unless associated.nil? or select_options.find {|label, id| id == associated.id}
|
104
|
+
|
105
|
+
method = column.name
|
106
|
+
#html_options[:name] += '[id]'
|
107
|
+
options = {:selected => associated.try(:id), :include_blank => as_(:_select_)}
|
108
|
+
|
109
|
+
html_options.update(column.options[:html_options] || {})
|
110
|
+
options.update(column.options)
|
111
|
+
html_options[:name] = "#{html_options[:name]}[]" if (html_options[:multiple] == true && !html_options[:name].to_s.ends_with?("[]"))
|
112
|
+
select(:record, method, select_options.uniq, options, html_options)
|
113
|
+
end
|
114
|
+
|
115
|
+
def active_scaffold_input_plural_association(column, options)
|
116
|
+
associated_options = @record.send(column.association.name).collect {|r| [r.to_label, r.id]}
|
117
|
+
select_options = associated_options | options_for_association(column.association)
|
118
|
+
return content_tag(:span, as_(:no_options), :class => options[:class], :id => options[:id]) if select_options.empty?
|
119
|
+
|
120
|
+
active_scaffold_checkbox_list(column, select_options, associated_options.collect {|a| a[1]}, options)
|
121
|
+
end
|
122
|
+
|
123
|
+
def active_scaffold_checkbox_list(column, select_options, associated_ids, options)
|
124
|
+
options[:class] << " checkbox-list"
|
125
|
+
html = content_tag :ul, :class => options[:class], :id => options[:id] do
|
126
|
+
content = "".html_safe
|
127
|
+
select_options.each_with_index do |option, i|
|
128
|
+
label, id = option
|
129
|
+
this_id = "#{options[:id]}_#{i}_id"
|
130
|
+
content << content_tag(:li) do
|
131
|
+
check_box_tag("#{options[:name]}[]", id, associated_ids.include?(id), :id => this_id) <<
|
132
|
+
content_tag(:label, h(label), :for => this_id)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
content
|
136
|
+
end
|
137
|
+
html << javascript_tag("new DraggableLists('#{options[:id]}')") if column.options[:draggable_lists]
|
138
|
+
html
|
139
|
+
end
|
140
|
+
|
141
|
+
def active_scaffold_translated_option(column, text, value = nil)
|
142
|
+
value = text if value.nil?
|
143
|
+
[(text.is_a?(Symbol) ? column.active_record_class.human_attribute_name(text) : text), value]
|
144
|
+
end
|
145
|
+
|
146
|
+
def active_scaffold_input_enum(column, html_options)
|
147
|
+
options = { :selected => @record.send(column.name) }
|
148
|
+
options_for_select = column.options[:options].collect do |text, value|
|
149
|
+
active_scaffold_translated_option(column, text, value)
|
150
|
+
end
|
151
|
+
html_options.update(column.options[:html_options] || {})
|
152
|
+
options.update(column.options)
|
153
|
+
select(:record, column.name, options_for_select, options, html_options)
|
154
|
+
end
|
155
|
+
|
156
|
+
def active_scaffold_input_select(column, html_options)
|
157
|
+
if column.singular_association?
|
158
|
+
active_scaffold_input_singular_association(column, html_options)
|
159
|
+
elsif column.plural_association?
|
160
|
+
active_scaffold_input_plural_association(column, html_options)
|
161
|
+
else
|
162
|
+
active_scaffold_input_enum(column, html_options)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def active_scaffold_input_radio(column, html_options)
|
167
|
+
html_options.update(column.options[:html_options] || {})
|
168
|
+
column.options[:options].inject('') do |html, (text, value)|
|
169
|
+
text, value = active_scaffold_translated_option(column, text, value)
|
170
|
+
html << content_tag(:label, radio_button(:record, column.name, value, html_options.merge(:id => html_options[:id] + '-' + value.to_s)) + text)
|
171
|
+
end.html_safe
|
172
|
+
end
|
173
|
+
|
174
|
+
def active_scaffold_input_checkbox(column, options)
|
175
|
+
check_box(:record, column.name, options.merge(column.options))
|
176
|
+
end
|
177
|
+
|
178
|
+
def active_scaffold_input_password(column, options)
|
179
|
+
options = active_scaffold_input_text_options(options)
|
180
|
+
password_field :record, column.name, options.merge(column.options)
|
181
|
+
end
|
182
|
+
|
183
|
+
def active_scaffold_input_textarea(column, options)
|
184
|
+
text_area(:record, column.name, options.merge(:cols => column.options[:cols], :rows => column.options[:rows], :size => column.options[:size]))
|
185
|
+
end
|
186
|
+
|
187
|
+
def active_scaffold_input_virtual(column, options)
|
188
|
+
options = active_scaffold_input_text_options(options)
|
189
|
+
text_field :record, column.name, options.merge(column.options)
|
190
|
+
end
|
191
|
+
|
192
|
+
#
|
193
|
+
# Column.type-based inputs
|
194
|
+
#
|
195
|
+
|
196
|
+
def active_scaffold_input_boolean(column, options)
|
197
|
+
select_options = []
|
198
|
+
select_options << [as_(:_select_), nil] if !column.virtual? && column.column.null
|
199
|
+
select_options << [as_(:true), true]
|
200
|
+
select_options << [as_(:false), false]
|
201
|
+
|
202
|
+
select_tag(options[:name], options_for_select(select_options, @record.send(column.name)), options)
|
203
|
+
end
|
204
|
+
|
205
|
+
def onsubmit
|
206
|
+
end
|
207
|
+
|
208
|
+
##
|
209
|
+
## Form column override signatures
|
210
|
+
##
|
211
|
+
|
212
|
+
# add functionality for overriding subform partials from association class path
|
213
|
+
def override_subform_partial?(column, subform_partial)
|
214
|
+
template_exists?(override_subform_partial(column, subform_partial), true)
|
215
|
+
end
|
216
|
+
|
217
|
+
def override_subform_partial(column, subform_partial)
|
218
|
+
File.join(active_scaffold_controller_for(column.association.klass).controller_path, subform_partial) if column_renders_as(column) == :subform
|
219
|
+
end
|
220
|
+
|
221
|
+
def override_form_field_partial?(column)
|
222
|
+
template_exists?(override_form_field_partial(column), true)
|
223
|
+
end
|
224
|
+
|
225
|
+
# the naming convention for overriding form fields with helpers
|
226
|
+
def override_form_field_partial(column)
|
227
|
+
path = active_scaffold_controller_for(column.active_record_class).controller_path
|
228
|
+
File.join(path, "#{clean_column_name(column.name)}_form_column")
|
229
|
+
end
|
230
|
+
|
231
|
+
def override_form_field(column)
|
232
|
+
method_with_class = override_form_field_name(column, true)
|
233
|
+
return method_with_class if respond_to?(method_with_class)
|
234
|
+
method = override_form_field_name(column)
|
235
|
+
method if respond_to?(method)
|
236
|
+
end
|
237
|
+
alias_method :override_form_field?, :override_form_field
|
238
|
+
|
239
|
+
# the naming convention for overriding form fields with helpers
|
240
|
+
def override_form_field_name(column, class_prefix = false)
|
241
|
+
"#{clean_class_name(column.active_record_class.name) + '_' if class_prefix}#{clean_column_name(column.name)}_form_column"
|
242
|
+
end
|
243
|
+
|
244
|
+
def override_input?(form_ui)
|
245
|
+
respond_to?(override_input(form_ui))
|
246
|
+
end
|
247
|
+
|
248
|
+
# the naming convention for overriding form input types with helpers
|
249
|
+
def override_input(form_ui)
|
250
|
+
"active_scaffold_input_#{form_ui}"
|
251
|
+
end
|
252
|
+
|
253
|
+
def form_partial_for_column(column, renders_as = nil)
|
254
|
+
renders_as ||= column_renders_as(column)
|
255
|
+
if override_form_field_partial?(column)
|
256
|
+
override_form_field_partial(column)
|
257
|
+
elsif renders_as == :field or override_form_field?(column)
|
258
|
+
"form_attribute"
|
259
|
+
elsif renders_as == :subform
|
260
|
+
"form_association"
|
261
|
+
elsif renders_as == :hidden
|
262
|
+
"form_hidden_attribute"
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def subform_partial_for_column(column)
|
267
|
+
subform_partial = "#{active_scaffold_config_for(column.association.klass).subform.layout}_subform"
|
268
|
+
if override_subform_partial?(column, subform_partial)
|
269
|
+
override_subform_partial(column, subform_partial)
|
270
|
+
else
|
271
|
+
subform_partial
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
##
|
276
|
+
## Macro-level rendering decisions for columns
|
277
|
+
##
|
278
|
+
|
279
|
+
def column_renders_as(column)
|
280
|
+
if column.is_a? ActiveScaffold::DataStructures::ActionColumns
|
281
|
+
return :subsection
|
282
|
+
elsif column.active_record_class.locking_column.to_s == column.name.to_s or column.form_ui == :hidden
|
283
|
+
return :hidden
|
284
|
+
elsif column.association.nil? or column.form_ui or !active_scaffold_config_for(column.association.klass).actions.include?(:subform)
|
285
|
+
return :field
|
286
|
+
else
|
287
|
+
return :subform
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
def column_scope(column)
|
292
|
+
if column.plural_association?
|
293
|
+
"[#{column.name}][#{@record.id || generate_temporary_id}]"
|
294
|
+
else
|
295
|
+
"[#{column.name}]"
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
def active_scaffold_add_existing_input(options)
|
300
|
+
if ActiveScaffold.js_framework == :prototype && controller.respond_to?(:record_select_config)
|
301
|
+
remote_controller = active_scaffold_controller_for(record_select_config.model).controller_path
|
302
|
+
options.merge!(:controller => remote_controller)
|
303
|
+
options.merge!(active_scaffold_input_text_options)
|
304
|
+
record_select_field(options[:name], @record, options)
|
305
|
+
else
|
306
|
+
select_options = options_for_select(options_for_association(nested.association)) #unless column.through_association?
|
307
|
+
select_options ||= options_for_select(active_scaffold_config.model.all.collect {|c| [h(c.to_label), c.id]})
|
308
|
+
select_tag 'associated_id', ('<option value="">' + as_(:_select_) + '</option>' + select_options).html_safe unless select_options.empty?
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
def active_scaffold_add_existing_label
|
313
|
+
if controller.respond_to?(:record_select_config)
|
314
|
+
record_select_config.model.model_name.human
|
315
|
+
else
|
316
|
+
active_scaffold_config.model.model_name.human
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
321
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module ActiveScaffold
|
2
|
+
module Helpers
|
3
|
+
# A bunch of helper methods to produce the common view ids
|
4
|
+
module IdHelpers
|
5
|
+
def id_from_controller(controller)
|
6
|
+
controller.to_s.gsub("/", "__").html_safe
|
7
|
+
end
|
8
|
+
|
9
|
+
def controller_id(controller = (params[:eid] || params[:parent_controller] || params[:controller]))
|
10
|
+
controller_id ||= 'as_' + id_from_controller(controller)
|
11
|
+
end
|
12
|
+
|
13
|
+
def active_scaffold_id
|
14
|
+
"#{controller_id}-active-scaffold"
|
15
|
+
end
|
16
|
+
|
17
|
+
def active_scaffold_content_id
|
18
|
+
"#{controller_id}-content"
|
19
|
+
end
|
20
|
+
|
21
|
+
def active_scaffold_tbody_id
|
22
|
+
"#{controller_id}-tbody"
|
23
|
+
end
|
24
|
+
|
25
|
+
def active_scaffold_messages_id(options = {})
|
26
|
+
"#{options[:controller_id] || controller_id}-messages"
|
27
|
+
end
|
28
|
+
|
29
|
+
def active_scaffold_calculations_id(column = nil)
|
30
|
+
"#{controller_id}-calculations#{'-' + column.name.to_s if column}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def empty_message_id
|
34
|
+
"#{controller_id}-empty-message"
|
35
|
+
end
|
36
|
+
|
37
|
+
def before_header_id
|
38
|
+
"#{controller_id}-search-container"
|
39
|
+
end
|
40
|
+
|
41
|
+
def search_input_id
|
42
|
+
"#{controller_id}-search-input"
|
43
|
+
end
|
44
|
+
|
45
|
+
def action_link_id(link_action,link_id)
|
46
|
+
"#{controller_id}-#{link_action}-#{link_id}-link"
|
47
|
+
end
|
48
|
+
|
49
|
+
def active_scaffold_column_header_id(column)
|
50
|
+
name = column.respond_to?(:name) ? column.name : column.to_s
|
51
|
+
clean_id "#{controller_id}-#{name}-column"
|
52
|
+
end
|
53
|
+
|
54
|
+
def element_row_id(options = {})
|
55
|
+
options[:action] ||= params[:action]
|
56
|
+
options[:id] ||= params[:id]
|
57
|
+
options[:id] ||= params[:parent_id]
|
58
|
+
clean_id "#{options[:controller_id] || controller_id}-#{options[:action]}-#{options[:id]}-row"
|
59
|
+
end
|
60
|
+
|
61
|
+
def element_cell_id(options = {})
|
62
|
+
options[:action] ||= params[:action]
|
63
|
+
options[:id] ||= params[:id]
|
64
|
+
options[:id] ||= params[:parent_id]
|
65
|
+
options[:name] ||= params[:name]
|
66
|
+
clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-#{options[:name]}-cell"
|
67
|
+
end
|
68
|
+
|
69
|
+
def element_form_id(options = {})
|
70
|
+
options[:action] ||= params[:action]
|
71
|
+
options[:id] ||= params[:id]
|
72
|
+
options[:id] ||= params[:parent_id]
|
73
|
+
clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-form"
|
74
|
+
end
|
75
|
+
|
76
|
+
def association_subform_id(column)
|
77
|
+
klass = column.association.klass.to_s.underscore
|
78
|
+
clean_id "#{controller_id}-associated-#{klass}"
|
79
|
+
end
|
80
|
+
|
81
|
+
def loading_indicator_id(options = {})
|
82
|
+
options[:action] ||= params[:action]
|
83
|
+
clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-loading-indicator"
|
84
|
+
end
|
85
|
+
|
86
|
+
def sub_section_id(options = {})
|
87
|
+
options[:id] ||= params[:id]
|
88
|
+
options[:id] ||= params[:parent_id]
|
89
|
+
clean_id "#{controller_id}-#{options[:id]}-#{options[:sub_section]}-subsection"
|
90
|
+
end
|
91
|
+
|
92
|
+
def sub_form_id(options = {})
|
93
|
+
options[:id] ||= params[:id]
|
94
|
+
options[:id] ||= params[:parent_id]
|
95
|
+
clean_id "#{controller_id}-#{options[:id]}-#{options[:association]}-subform"
|
96
|
+
end
|
97
|
+
|
98
|
+
def sub_form_list_id(options = {})
|
99
|
+
options[:id] ||= params[:id]
|
100
|
+
options[:id] ||= params[:parent_id]
|
101
|
+
clean_id "#{controller_id}-#{options[:id]}-#{options[:association]}-subform-list"
|
102
|
+
end
|
103
|
+
|
104
|
+
def element_messages_id(options = {})
|
105
|
+
options[:action] ||= params[:action]
|
106
|
+
options[:id] ||= params[:id]
|
107
|
+
options[:id] ||= params[:parent_id]
|
108
|
+
clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-messages"
|
109
|
+
end
|
110
|
+
|
111
|
+
def action_iframe_id(options)
|
112
|
+
"#{controller_id}-#{options[:action]}-#{options[:id]}-iframe"
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
# whitelists id-safe characters
|
118
|
+
def clean_id(val)
|
119
|
+
val.gsub /[^-_0-9a-zA-Z]/, '-'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -34,13 +34,14 @@ module ActiveScaffold
|
|
34
34
|
if column.link
|
35
35
|
link = column.link
|
36
36
|
associated = record.send(column.association.name) if column.association
|
37
|
-
url_options = params_for(:action => nil, :id => record.id
|
37
|
+
url_options = params_for(:action => nil, :id => record.id)
|
38
38
|
|
39
39
|
# setup automatic link
|
40
40
|
if column.autolink? && column.singular_association? # link to inline form
|
41
|
-
link = action_link_to_inline_form(column, record, associated)
|
42
|
-
return text if link.
|
43
|
-
|
41
|
+
link = action_link_to_inline_form(column, record, associated, text)
|
42
|
+
return text if link.nil?
|
43
|
+
else
|
44
|
+
url_options[:link] = text
|
44
45
|
end
|
45
46
|
|
46
47
|
if column_link_authorized?(link, column, record, associated)
|
@@ -55,8 +56,9 @@ module ActiveScaffold
|
|
55
56
|
end
|
56
57
|
|
57
58
|
# setup the action link to inline form
|
58
|
-
def action_link_to_inline_form(column, record, associated)
|
59
|
+
def action_link_to_inline_form(column, record, associated, text)
|
59
60
|
link = column.link.clone
|
61
|
+
link.label = text
|
60
62
|
if column.polymorphic_association?
|
61
63
|
polymorphic_controller = controller_path_for_activerecord(record.send(column.association.name).class)
|
62
64
|
return link if polymorphic_controller.nil?
|
@@ -70,6 +72,7 @@ module ActiveScaffold
|
|
70
72
|
if actions.include?(:new)
|
71
73
|
link.action = 'new'
|
72
74
|
link.crud_type = :create
|
75
|
+
link.label = as_(:create_new)
|
73
76
|
end
|
74
77
|
elsif actions.include?(:edit)
|
75
78
|
link.action = 'edit'
|
@@ -81,7 +84,7 @@ module ActiveScaffold
|
|
81
84
|
link.action = 'index'
|
82
85
|
link.crud_type = :read
|
83
86
|
end
|
84
|
-
link
|
87
|
+
link if link.action.present?
|
85
88
|
end
|
86
89
|
|
87
90
|
def column_link_authorized?(link, column, record, associated)
|