active_scaffold 3.0.5 → 3.0.11
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/.document +5 -0
- data/Gemfile +11 -2
- data/Gemfile.lock +20 -0
- data/Rakefile +33 -4
- data/active_scaffold.gemspec +378 -17
- data/frontends/default/images/config.png +0 -0
- data/frontends/default/images/gears.png +0 -0
- data/frontends/default/javascripts/jquery/active_scaffold.js +34 -33
- data/frontends/default/javascripts/jquery/jquery.editinplace.js +21 -4
- data/frontends/default/javascripts/prototype/active_scaffold.js +43 -38
- data/frontends/default/stylesheets/stylesheet.css +110 -35
- data/frontends/default/views/_action_group.html.erb +20 -0
- data/frontends/default/views/_base_form.html.erb +7 -3
- data/frontends/default/views/_create_form.html.erb +5 -3
- data/frontends/default/views/_create_form_on_list.html.erb +2 -1
- data/frontends/default/views/_field_search.html.erb +2 -2
- data/frontends/default/views/_form.html.erb +2 -2
- data/frontends/default/views/_form_messages.html.erb +1 -1
- data/frontends/default/views/_horizontal_subform.html.erb +1 -1
- data/frontends/default/views/_list_actions.html.erb +6 -14
- data/frontends/default/views/_list_header.html.erb +4 -6
- data/frontends/default/views/_list_with_header.html.erb +2 -2
- data/frontends/default/views/_messages.html.erb +2 -2
- data/frontends/default/views/_search.html.erb +2 -2
- data/frontends/default/views/_show.html.erb +1 -1
- data/frontends/default/views/_update_form.html.erb +2 -1
- data/frontends/default/views/_vertical_subform.html.erb +1 -1
- data/frontends/default/views/action_confirmation.html.erb +13 -0
- data/frontends/default/views/add_existing.js.rjs +1 -1
- data/frontends/default/views/destroy.js.rjs +21 -3
- data/frontends/default/views/on_action_update.js.rjs +1 -1
- data/frontends/default/views/on_create.js.rjs +30 -13
- data/frontends/default/views/on_update.js.rjs +19 -6
- data/init.rb +6 -0
- data/lib/active_scaffold/actions/core.rb +32 -12
- data/lib/active_scaffold/actions/create.rb +4 -11
- data/lib/active_scaffold/actions/delete.rb +16 -13
- data/lib/active_scaffold/actions/list.rb +58 -2
- data/lib/active_scaffold/actions/mark.rb +1 -1
- data/lib/active_scaffold/actions/nested.rb +24 -15
- data/lib/active_scaffold/actions/show.rb +10 -3
- data/lib/active_scaffold/actions/update.rb +10 -3
- data/lib/{active_record_permissions.rb → active_scaffold/active_record_permissions.rb} +0 -0
- data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/calendar_date_select/lib/as_cds_bridge.rb +8 -4
- data/lib/active_scaffold/bridges/carrierwave/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/lib/list_ui.rb +1 -1
- data/lib/active_scaffold/config/base.rb +8 -0
- data/lib/active_scaffold/config/core.rb +2 -15
- data/lib/active_scaffold/config/create.rb +8 -0
- data/lib/active_scaffold/config/delete.rb +10 -1
- data/lib/active_scaffold/config/field_search.rb +1 -0
- data/lib/active_scaffold/config/form.rb +2 -1
- data/lib/active_scaffold/config/nested.rb +3 -2
- data/lib/active_scaffold/config/search.rb +1 -0
- data/lib/active_scaffold/config/show.rb +1 -0
- data/lib/active_scaffold/config/update.rb +8 -0
- data/lib/active_scaffold/constraints.rb +9 -4
- data/lib/active_scaffold/data_structures/action_columns.rb +1 -1
- data/lib/active_scaffold/data_structures/action_link.rb +10 -1
- data/lib/active_scaffold/data_structures/action_links.rb +62 -22
- data/lib/active_scaffold/data_structures/column.rb +17 -13
- data/lib/active_scaffold/data_structures/nested_info.rb +21 -6
- data/lib/active_scaffold/finder.rb +2 -1
- data/lib/active_scaffold/helpers/association_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/controller_helpers.rb +57 -10
- data/lib/active_scaffold/helpers/form_column_helpers.rb +12 -8
- data/lib/active_scaffold/helpers/id_helpers.rb +5 -9
- data/lib/active_scaffold/helpers/list_column_helpers.rb +26 -28
- data/lib/active_scaffold/helpers/search_column_helpers.rb +8 -3
- data/lib/active_scaffold/helpers/view_helpers.rb +60 -19
- data/lib/active_scaffold/locale/de.rb +13 -6
- data/lib/active_scaffold/locale/en.rb +2 -1
- data/lib/active_scaffold/locale/es.yml +3 -0
- data/lib/active_scaffold/locale/fr.rb +5 -2
- data/lib/active_scaffold/locale/ru.yml +77 -20
- data/lib/active_scaffold/marked_model.rb +5 -5
- data/lib/{paginator.rb → active_scaffold/paginator.rb} +0 -0
- data/lib/{responds_to_parent.rb → active_scaffold/responds_to_parent.rb} +0 -0
- data/lib/active_scaffold/version.rb +9 -0
- data/lib/active_scaffold.rb +60 -84
- data/lib/active_scaffold_assets.rb +45 -0
- data/lib/active_scaffold_env.rb +14 -0
- data/lib/active_scaffold_vho.rb +2 -0
- data/lib/extensions/active_association_reflection.rb +13 -0
- data/lib/extensions/paginator_extensions.rb +1 -1
- data/lib/extensions/routing_mapper.rb +1 -1
- data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +12 -4
- metadata +85 -68
- data/lib/dhtml_confirm.rb +0 -54
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<div id="<%= active_scaffold_id -%>" class="active-scaffold active-scaffold-<%= controller_id %> <%= "#{params[:controller]}-view" %> <%= active_scaffold_config.theme %>-theme"
|
|
1
|
+
<div id="<%= active_scaffold_id -%>" class="active-scaffold active-scaffold-<%= controller_id %> <%= "#{params[:controller]}-view" %> <%= active_scaffold_config.theme %>-theme" <%= "data-eid=#{id_from_controller(params[:eid])}" if params[:eid]%>>
|
|
2
2
|
<div class="active-scaffold-header">
|
|
3
3
|
<%= render :partial => 'list_header' %>
|
|
4
4
|
</div>
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<% end %>
|
|
27
27
|
</tbody>
|
|
28
28
|
</table>
|
|
29
|
-
<div id="<%= active_scaffold_content_id
|
|
29
|
+
<div id="<%= active_scaffold_content_id-%>" class="as_content">
|
|
30
30
|
<%= render :partial => 'list' %>
|
|
31
31
|
</div>
|
|
32
32
|
</div>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<% for name in [:info, :warning, :error] %>
|
|
2
2
|
<% if flash[name] %>
|
|
3
|
-
<
|
|
3
|
+
<div class="<%= "#{name}-message message" %>">
|
|
4
4
|
<%= h flash[name] %>
|
|
5
5
|
<% if request.xhr? %>
|
|
6
6
|
<a href="#" onclick="ActiveScaffold.remove(this.parentNode); return false;" title="<%= as_(:close) %>"><%= as_(:close) %></a>
|
|
7
7
|
<% end %>
|
|
8
|
-
</
|
|
8
|
+
</div>
|
|
9
9
|
<% end %>
|
|
10
10
|
<% end %>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<% live_search = active_scaffold_config.search.live? -%>
|
|
2
2
|
<% url_options = params_for(:action => :index, :escape => false).delete_if{|k,v| k == 'search'} -%>
|
|
3
3
|
<%=
|
|
4
|
-
options = {:id =>
|
|
4
|
+
options = {:id => element_form_id(:action => 'search'),
|
|
5
5
|
:class => "as_form search",
|
|
6
6
|
:remote => true,
|
|
7
7
|
:method => :get}
|
|
@@ -29,6 +29,6 @@ options['data-loading'] = true unless live_search
|
|
|
29
29
|
$(<%= "##{search_input_id}".to_json.html_safe %>).delayedObserver(0.5, function() {
|
|
30
30
|
$(<%= "##{search_input_id}".to_json.html_safe %>).parent().trigger("submit");});
|
|
31
31
|
<% end -%>
|
|
32
|
-
ActiveScaffold.focus_first_element_of_form('<%=
|
|
32
|
+
ActiveScaffold.focus_first_element_of_form('<%= element_form_id(:action => 'search') %>');
|
|
33
33
|
//]]>
|
|
34
34
|
</script>
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
<%= render :partial => 'show_columns', :locals => {:columns => active_scaffold_config.show.columns} -%>
|
|
4
4
|
|
|
5
5
|
<p class="form-footer">
|
|
6
|
-
<%= link_to as_(:close), main_path_to_return, :class => 'as_cancel', :remote =>
|
|
6
|
+
<%= link_to as_(:close), main_path_to_return, :class => 'as_cancel', :remote => request.xhr?, 'data-refresh' => false %>
|
|
7
7
|
<%= loading_indicator_tag(:action => :create, :id => params[:id]) %>
|
|
8
8
|
</p>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
<% cancel_link = true if cancel_link.nil? %>
|
|
1
2
|
<%= render :partial => "base_form", :locals => {:xhr => xhr ||= nil,
|
|
2
3
|
:form_action => form_action ||= :update,
|
|
3
4
|
:method => method ||= :put,
|
|
4
|
-
:cancel_link => cancel_link
|
|
5
|
+
:cancel_link => cancel_link,
|
|
5
6
|
:headline => headline ||= @record.to_label.nil? ? active_scaffold_config.update.label : as_(:update_model, :model => clean_column_value(@record.to_label))} %>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<% @record = associated[index] -%>
|
|
4
4
|
<% if @record.errors.count -%>
|
|
5
5
|
<div class="association-record-errors" id="<%= element_messages_id :action => @record.class.name.underscore, :id => "#{parent_record.id}-#{index}" %>">
|
|
6
|
-
<%=
|
|
6
|
+
<%= active_scaffold_error_messages_for :record, :object_name => @record.class.model_name.human.downcase %>
|
|
7
7
|
</div>
|
|
8
8
|
<% end %>
|
|
9
9
|
<%= render :partial => 'vertical_subform_record', :locals => {:scope => column_scope(column), :parent_record => parent_record, :column => column, :locked => @record.new_record? && @record == associated.last} %>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<div class="active-scaffold">
|
|
2
|
+
<div class="delete-view view">
|
|
3
|
+
<%= form_tag params_for(:action => link.action, :id => params[:id]), { :method => link.method } %>
|
|
4
|
+
<h4><%= link.confirm(record.try(:to_label)) -%></h4>
|
|
5
|
+
|
|
6
|
+
<p class="form-footer">
|
|
7
|
+
<%= submit_tag as_(link.label), :class => 'submit' %>
|
|
8
|
+
<%= link_to as_(:cancel), main_path_to_return, :class => 'cancel' %>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
</form>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
new_row = render :partial => 'list_record', :locals => {:record => @record}
|
|
2
|
-
page << "ActiveScaffold.create_record_row('#{
|
|
2
|
+
page << "ActiveScaffold.create_record_row('#{active_scaffold_id}','#{escape_javascript(new_row)}', #{{:insert_at => :top}.to_json});"
|
|
3
3
|
page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
4
4
|
|
|
5
5
|
if (form_stays_open = true)
|
|
@@ -1,5 +1,23 @@
|
|
|
1
|
+
messages_id = active_scaffold_messages_id
|
|
1
2
|
if controller.send(:successful?)
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
if render_parent? && controller.respond_to?(:render_component_into_view)
|
|
4
|
+
render_parent_options
|
|
5
|
+
if render_parent_action == :row
|
|
6
|
+
# TODO: That s not working with delete....
|
|
7
|
+
page << "ActiveScaffold.delete_record_row('#{element_row_id(:controller_id => "as_#{id_from_controller(params[:eid] || params[:parent_sti])}", :action => 'list', :id => params[:id])}','#{url_for(params_for(:action => :index, :id => nil, :page => [active_scaffold_config.list.user.page.to_i - 1, 1].max, :escape => false))}');"
|
|
8
|
+
messages_id = active_scaffold_messages_id(:controller_id => "as_#{id_from_controller(params[:eid] || params[:parent_sti])}")
|
|
9
|
+
elsif render_parent_action == :index
|
|
10
|
+
parent_rendered = controller.send(:render_component_into_view, render_parent_options)
|
|
11
|
+
page << parent_rendered
|
|
12
|
+
end
|
|
13
|
+
#page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
14
|
+
elsif (active_scaffold_config.delete.refresh_list)
|
|
15
|
+
page.call 'ActiveScaffold.replace_html', active_scaffold_content_id, render(:partial => 'list', :layout => false)
|
|
16
|
+
else
|
|
17
|
+
page << "ActiveScaffold.delete_record_row('#{element_row_id(:action => 'list', :id => params[:id])}','#{url_for(params_for(:action => :index, :id => nil, :page => [active_scaffold_config.list.user.page.to_i - 1, 1].max, :escape => false))}');"
|
|
18
|
+
page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
19
|
+
end
|
|
20
|
+
else
|
|
21
|
+
flash[:error] = active_scaffold_error_messages_for(@record, :object_name => "#{@record.class.model_name.human.downcase}#{@record.new_record? ? '' : ": #{@record.to_label}"}", :header_message => '', :message => "#{@record.class.model_name.human.downcase}#{@record.new_record? ? '' : ": #{@record.to_label}"}", :container_tag => nil, :list_type => :br)
|
|
4
22
|
end
|
|
5
|
-
page.call 'ActiveScaffold.replace_html',
|
|
23
|
+
page.call 'ActiveScaffold.replace_html', messages_id, render(:partial => 'messages')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
page.call 'ActiveScaffold.replace_html', active_scaffold_messages_id, render(:partial => 'messages')
|
|
2
2
|
if controller.send :successful?
|
|
3
|
-
page.call 'ActiveScaffold.
|
|
3
|
+
page.call 'ActiveScaffold.update_row', element_row_id(:action => :list, :id => @record.id), render(:partial => 'list_record', :locals => {:record => @record}) if @record
|
|
4
4
|
page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
5
5
|
else
|
|
6
6
|
page.call 'ActiveScaffold.scroll_to', active_scaffold_messages_id
|
|
@@ -1,22 +1,39 @@
|
|
|
1
1
|
form_selector = "#{element_form_id(:action => :create)}"
|
|
2
|
-
|
|
3
|
-
page << "ActiveScaffold.find_action_link('#{form_selector}')
|
|
2
|
+
insert_at ||= :top
|
|
3
|
+
page << "var action_link = ActiveScaffold.find_action_link('#{form_selector}');"
|
|
4
|
+
page << "action_link.update_flash_messages('#{escape_javascript(render(:partial => 'messages').strip)}');"
|
|
4
5
|
if controller.send :successful?
|
|
5
|
-
if
|
|
6
|
+
if render_parent? && controller.respond_to?(:render_component_into_view)
|
|
7
|
+
parent_rendered = controller.send(:render_component_into_view, render_parent_options)
|
|
8
|
+
if nested_singular_association?
|
|
9
|
+
page << "action_link.close('#{escape_javascript(parent_rendered)}');"
|
|
10
|
+
else
|
|
11
|
+
if render_parent_action == :row
|
|
12
|
+
page << "ActiveScaffold.create_record_row(action_link.scaffold(),'#{escape_javascript(parent_rendered)}', #{{:insert_at => insert_at}.to_json});"
|
|
13
|
+
elsif render_parent_action == :index
|
|
14
|
+
page << parent_rendered
|
|
15
|
+
end
|
|
16
|
+
page << "action_link.close();"
|
|
17
|
+
end
|
|
18
|
+
#page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
19
|
+
elsif (active_scaffold_config.create.refresh_list)
|
|
20
|
+
page.call 'ActiveScaffold.replace_html', active_scaffold_content_id, render(:partial => 'list', :layout => false)
|
|
21
|
+
elsif params[:parent_controller].nil?
|
|
6
22
|
new_row = render :partial => 'list_record', :locals => {:record => @record}
|
|
7
|
-
insert_at
|
|
8
|
-
page << "ActiveScaffold.create_record_row('#{active_scaffold_tbody_id}','#{escape_javascript(new_row)}', #{{:insert_at => insert_at}.to_json});"
|
|
23
|
+
page << "ActiveScaffold.create_record_row(action_link.scaffold(),'#{escape_javascript(new_row)}', #{{:insert_at => insert_at}.to_json});"
|
|
9
24
|
page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
10
25
|
end
|
|
11
26
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
unless render_parent?
|
|
28
|
+
if (active_scaffold_config.create.persistent)
|
|
29
|
+
page << "action_link.reload();"
|
|
30
|
+
else
|
|
31
|
+
page << "action_link.close();"
|
|
32
|
+
end
|
|
33
|
+
if (active_scaffold_config.create.edit_after_create)
|
|
34
|
+
page << "var link = $('#{action_link_id 'edit', @record.id}');"
|
|
35
|
+
page << "if (link) (function() { link.action_link.open() }).defer();"
|
|
36
|
+
end
|
|
20
37
|
end
|
|
21
38
|
else
|
|
22
39
|
page.call 'ActiveScaffold.replace', form_selector, render(:partial => 'create_form', :locals => {:xhr => true})
|
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
form_selector = "#{element_form_id(:action => :update)}"
|
|
2
2
|
|
|
3
|
-
page << "ActiveScaffold.find_action_link('#{form_selector}')
|
|
3
|
+
page << "var action_link = ActiveScaffold.find_action_link('#{form_selector}');"
|
|
4
|
+
page << "action_link.update_flash_messages('#{escape_javascript(render(:partial => 'messages').strip)}');"
|
|
4
5
|
if controller.send :successful?
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
if render_parent? && controller.respond_to?(:render_component_into_view)
|
|
7
|
+
parent_rendered = controller.send(:render_component_into_view, render_parent_options)
|
|
8
|
+
if nested_singular_association?
|
|
9
|
+
page << "action_link.close('#{escape_javascript(parent_rendered)}');"
|
|
10
|
+
else
|
|
11
|
+
if render_parent_action == :row
|
|
12
|
+
page << "action_link.close('#{escape_javascript(parent_rendered)}');"
|
|
13
|
+
elsif render_parent_action == :index
|
|
14
|
+
page << parent_rendered
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
#page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
18
|
+
elsif (active_scaffold_config.update.refresh_list)
|
|
19
|
+
page.call 'ActiveScaffold.replace_html', active_scaffold_content_id, render(:partial => 'list', :layout => false)
|
|
7
20
|
else
|
|
8
|
-
render :partial => 'list_record', :locals => {:record => @record}
|
|
21
|
+
updated_row = render :partial => 'list_record', :locals => {:record => @record}
|
|
22
|
+
page << "action_link.close('#{escape_javascript(updated_row)}');"
|
|
23
|
+
page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
9
24
|
end
|
|
10
|
-
page << "ActiveScaffold.find_action_link('#{form_selector}').close('#{escape_javascript(updated_row)}');"
|
|
11
|
-
page.call 'ActiveScaffold.replace', active_scaffold_calculations_id, render(:partial => 'list_calculations') if active_scaffold_config.list.columns.any? {|c| c.calculation?}
|
|
12
25
|
else
|
|
13
26
|
page.call 'ActiveScaffold.replace', form_selector, render(:partial => 'update_form', :locals => {:xhr => true})
|
|
14
27
|
page.call 'ActiveScaffold.scroll_to', form_selector
|
data/init.rb
CHANGED
|
@@ -8,19 +8,10 @@ module ActiveScaffold::Actions
|
|
|
8
8
|
base.helper_method :beginning_of_chain
|
|
9
9
|
end
|
|
10
10
|
def render_field
|
|
11
|
-
@record ||= if params[:in_place_editing]
|
|
12
|
-
active_scaffold_config.model.find params[:id]
|
|
13
|
-
else
|
|
14
|
-
active_scaffold_config.model.new
|
|
15
|
-
end
|
|
16
|
-
column = active_scaffold_config.columns[params[:column]]
|
|
17
11
|
if params[:in_place_editing]
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@record.send "#{column.name}=", value
|
|
22
|
-
after_render_field(@record, column)
|
|
23
|
-
render :partial => "render_field", :collection => Array(params[:update_columns]), :content_type => 'text/javascript'
|
|
12
|
+
render_field_for_inplace_editing
|
|
13
|
+
else
|
|
14
|
+
render_field_for_update_columns
|
|
24
15
|
end
|
|
25
16
|
end
|
|
26
17
|
|
|
@@ -30,6 +21,23 @@ module ActiveScaffold::Actions
|
|
|
30
21
|
false
|
|
31
22
|
end
|
|
32
23
|
|
|
24
|
+
def render_field_for_inplace_editing
|
|
25
|
+
register_constraints_with_action_columns(nested.constrained_fields, active_scaffold_config.update.hide_nested_column ? [] : [:update]) if nested?
|
|
26
|
+
@record = find_if_allowed(params[:id], :update)
|
|
27
|
+
render :inline => "<%= active_scaffold_input_for(active_scaffold_config.columns[params[:update_column].to_sym]) %>"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def render_field_for_update_columns
|
|
31
|
+
@record = new_model
|
|
32
|
+
column = active_scaffold_config.columns[params[:column]]
|
|
33
|
+
unless column.nil?
|
|
34
|
+
value = column_value_from_param_value(@record, column, params[:value])
|
|
35
|
+
@record.send "#{column.name}=", value
|
|
36
|
+
after_render_field(@record, column)
|
|
37
|
+
render :partial => "render_field", :collection => Array(params[:update_columns]), :content_type => 'text/javascript'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
33
41
|
# override this method if you want to do something after render_field
|
|
34
42
|
def after_render_field(record, column); end
|
|
35
43
|
|
|
@@ -127,6 +135,18 @@ module ActiveScaffold::Actions
|
|
|
127
135
|
end
|
|
128
136
|
conditions
|
|
129
137
|
end
|
|
138
|
+
|
|
139
|
+
def new_model
|
|
140
|
+
model = beginning_of_chain
|
|
141
|
+
if model.columns_hash[model.inheritance_column]
|
|
142
|
+
build_options = {model.inheritance_column.to_sym => active_scaffold_config.model_id} if nested? && nested.association && nested.association.collection?
|
|
143
|
+
params = self.params # in new action inheritance_column must be in params
|
|
144
|
+
params = params[:record] || {} unless params[model.inheritance_column] # in create action must be inside record key
|
|
145
|
+
model = params.delete(model.inheritance_column).camelize.constantize if params[model.inheritance_column]
|
|
146
|
+
end
|
|
147
|
+
model.respond_to?(:build) ? model.build(build_options || {}) : model.new
|
|
148
|
+
end
|
|
149
|
+
|
|
130
150
|
private
|
|
131
151
|
def respond_to_action(action)
|
|
132
152
|
respond_to do |type|
|
|
@@ -14,7 +14,6 @@ module ActiveScaffold::Actions
|
|
|
14
14
|
|
|
15
15
|
def create
|
|
16
16
|
do_create
|
|
17
|
-
@insert_row = !(nested? && nested.belongs_to?) && params[:parent_controller].nil?
|
|
18
17
|
respond_to_action(:create)
|
|
19
18
|
end
|
|
20
19
|
|
|
@@ -62,6 +61,10 @@ module ActiveScaffold::Actions
|
|
|
62
61
|
end
|
|
63
62
|
|
|
64
63
|
def create_respond_to_js
|
|
64
|
+
if successful? && active_scaffold_config.create.refresh_list && !render_parent?
|
|
65
|
+
do_search if respond_to? :do_search
|
|
66
|
+
do_list
|
|
67
|
+
end
|
|
65
68
|
render :action => 'on_create'
|
|
66
69
|
end
|
|
67
70
|
|
|
@@ -111,16 +114,6 @@ module ActiveScaffold::Actions
|
|
|
111
114
|
end
|
|
112
115
|
end
|
|
113
116
|
|
|
114
|
-
def new_model
|
|
115
|
-
model = beginning_of_chain
|
|
116
|
-
if model.columns_hash[model.inheritance_column]
|
|
117
|
-
params = self.params # in new action inheritance_column must be in params
|
|
118
|
-
params = params[:record] || {} unless params[model.inheritance_column] # in create action must be inside record key
|
|
119
|
-
model = params.delete(model.inheritance_column).camelize.constantize if params[model.inheritance_column]
|
|
120
|
-
end
|
|
121
|
-
model.new
|
|
122
|
-
end
|
|
123
|
-
|
|
124
117
|
# override this method if you want to inject data in the record (or its associated objects) before the save
|
|
125
118
|
def before_create_save(record); end
|
|
126
119
|
|
|
@@ -1,29 +1,32 @@
|
|
|
1
1
|
module ActiveScaffold::Actions
|
|
2
2
|
module Delete
|
|
3
3
|
def self.included(base)
|
|
4
|
-
base.before_filter :delete_authorized_filter, :only => [:
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
# this method is for html mode. it provides "the missing action" (http://thelucid.com/articles/2006/07/26/simply-restful-the-missing-action).
|
|
8
|
-
# it also gives us delete confirmation for html mode. woo!
|
|
9
|
-
def delete
|
|
10
|
-
destroy_find_record
|
|
11
|
-
render :action => 'delete'
|
|
4
|
+
base.before_filter :delete_authorized_filter, :only => [:destroy]
|
|
12
5
|
end
|
|
13
6
|
|
|
14
7
|
def destroy
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
params.delete :destroy_action
|
|
9
|
+
process_action_link_action(:destroy) do |record|
|
|
10
|
+
do_destroy
|
|
11
|
+
end
|
|
18
12
|
end
|
|
19
13
|
|
|
20
14
|
protected
|
|
21
15
|
def destroy_respond_to_html
|
|
22
|
-
|
|
16
|
+
if self.successful?
|
|
17
|
+
flash[:info] = as_(:deleted_model, :model => @record.to_label)
|
|
18
|
+
else
|
|
19
|
+
#error_message_for not available in controller...
|
|
20
|
+
#flash[:error] = active_scaffold_error_messages_for(@record, :object_name => "#{@record.class.model_name.human.downcase}#{@record.new_record? ? '' : ": #{@record.to_label}"}", :header_message => '', :message => "#{@record.class.model_name.human.downcase}#{@record.new_record? ? '' : ": #{@record.to_label}"}", :container_tag => nil, :list_type => :br)
|
|
21
|
+
end
|
|
23
22
|
return_to_main
|
|
24
23
|
end
|
|
25
24
|
|
|
26
25
|
def destroy_respond_to_js
|
|
26
|
+
if successful? && active_scaffold_config.delete.refresh_list && !render_parent?
|
|
27
|
+
do_search if respond_to? :do_search
|
|
28
|
+
do_list
|
|
29
|
+
end
|
|
27
30
|
render(:action => 'destroy')
|
|
28
31
|
end
|
|
29
32
|
|
|
@@ -46,7 +49,7 @@ module ActiveScaffold::Actions
|
|
|
46
49
|
# A simple method to handle the actual destroying of a record
|
|
47
50
|
# May be overridden to customize the behavior
|
|
48
51
|
def do_destroy
|
|
49
|
-
destroy_find_record
|
|
52
|
+
@record ||= destroy_find_record
|
|
50
53
|
begin
|
|
51
54
|
self.successful = @record.destroy
|
|
52
55
|
rescue
|
|
@@ -11,7 +11,8 @@ module ActiveScaffold::Actions
|
|
|
11
11
|
|
|
12
12
|
# get just a single row
|
|
13
13
|
def row
|
|
14
|
-
|
|
14
|
+
@record = find_if_allowed(params[:id], :read)
|
|
15
|
+
respond_to_action(:row)
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def list
|
|
@@ -49,6 +50,15 @@ module ActiveScaffold::Actions
|
|
|
49
50
|
def list_respond_to_yaml
|
|
50
51
|
render :text => Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
|
|
51
52
|
end
|
|
53
|
+
|
|
54
|
+
def row_respond_to_html
|
|
55
|
+
render(:partial => 'row', :locals => {:record => @record})
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def row_respond_to_js
|
|
59
|
+
render(:partial => 'row', :locals => {:record => @record})
|
|
60
|
+
end
|
|
61
|
+
|
|
52
62
|
# The actual algorithm to prepare for the list view
|
|
53
63
|
def do_list
|
|
54
64
|
includes_for_list_columns = active_scaffold_config.list.columns.collect{ |c| c.includes }.flatten.uniq.compact
|
|
@@ -75,7 +85,7 @@ module ActiveScaffold::Actions
|
|
|
75
85
|
|
|
76
86
|
def each_record_in_scope
|
|
77
87
|
do_search if respond_to? :do_search
|
|
78
|
-
finder_options = { :order => "#{active_scaffold_config.model.primary_key} ASC",
|
|
88
|
+
finder_options = { :order => "#{active_scaffold_config.model.connection.quote_table_name(active_scaffold_config.model.table_name)}.#{active_scaffold_config.model.primary_key} ASC",
|
|
79
89
|
:conditions => all_conditions,
|
|
80
90
|
:joins => joins_for_finder}
|
|
81
91
|
finder_options.merge! custom_finder_options
|
|
@@ -90,6 +100,45 @@ module ActiveScaffold::Actions
|
|
|
90
100
|
authorized_for?(:crud_type => :read)
|
|
91
101
|
end
|
|
92
102
|
|
|
103
|
+
# call this method in your action_link action to simplify processing of actions
|
|
104
|
+
# eg for member action_link :fire
|
|
105
|
+
# process_action_link_action do |record|
|
|
106
|
+
# record.update_attributes(:fired => true)
|
|
107
|
+
# self.successful = true
|
|
108
|
+
# flash[:info] = 'Player fired'
|
|
109
|
+
# end
|
|
110
|
+
def process_action_link_action(render_action = :action_update)
|
|
111
|
+
if request.get?
|
|
112
|
+
# someone has disabled javascript, we have to show confirmation form first
|
|
113
|
+
@record = find_if_allowed(params[:id], :read) if params[:id] && params[:id] && params[:id].to_i > 0
|
|
114
|
+
respond_to_action(:action_confirmation)
|
|
115
|
+
else
|
|
116
|
+
if params[:id] && params[:id] && params[:id].to_i > 0
|
|
117
|
+
@record = find_if_allowed(params[:id], (request.post? || request.put?) ? :update : :delete)
|
|
118
|
+
unless @record.nil?
|
|
119
|
+
yield @record
|
|
120
|
+
else
|
|
121
|
+
self.successful = false
|
|
122
|
+
flash[:error] = as_(:no_authorization_for_action, :action => action_name)
|
|
123
|
+
end
|
|
124
|
+
else
|
|
125
|
+
yield
|
|
126
|
+
end
|
|
127
|
+
respond_to_action(render_action)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def action_confirmation_respond_to_html(confirm_action = action_name.to_sym)
|
|
132
|
+
link = active_scaffold_config.action_links[confirm_action]
|
|
133
|
+
render :action => 'action_confirmation', :locals => {:record => @record, :link => link}
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def action_update_respond_to_html
|
|
137
|
+
do_search if respond_to? :do_search
|
|
138
|
+
do_list
|
|
139
|
+
redirect_to :action => 'index'
|
|
140
|
+
end
|
|
141
|
+
|
|
93
142
|
def action_update_respond_to_js
|
|
94
143
|
render(:action => 'on_action_update')
|
|
95
144
|
end
|
|
@@ -110,13 +159,20 @@ module ActiveScaffold::Actions
|
|
|
110
159
|
def list_authorized_filter
|
|
111
160
|
raise ActiveScaffold::ActionNotAllowed unless list_authorized?
|
|
112
161
|
end
|
|
162
|
+
|
|
113
163
|
def list_formats
|
|
114
164
|
(default_formats + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
|
|
115
165
|
end
|
|
166
|
+
alias_method :row_formats, :list_formats
|
|
167
|
+
|
|
116
168
|
def action_update_formats
|
|
117
169
|
(default_formats + active_scaffold_config.formats).uniq
|
|
118
170
|
end
|
|
119
171
|
|
|
172
|
+
def action_confirmation_formats
|
|
173
|
+
(default_formats + active_scaffold_config.formats).uniq
|
|
174
|
+
end
|
|
175
|
+
|
|
120
176
|
def list_columns
|
|
121
177
|
active_scaffold_config.list.columns.collect_visible
|
|
122
178
|
end
|
|
@@ -22,7 +22,7 @@ module ActiveScaffold::Actions
|
|
|
22
22
|
# because the object may change. So we give ActiveRecord a proc that ties to the
|
|
23
23
|
# marked_records_method on this ApplicationController.
|
|
24
24
|
def assign_marked_records_to_model
|
|
25
|
-
active_scaffold_config.model.
|
|
25
|
+
active_scaffold_config.model.marked_records = marked_records
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def marked_records
|
|
@@ -16,6 +16,7 @@ module ActiveScaffold::Actions
|
|
|
16
16
|
end
|
|
17
17
|
base.before_filter :include_habtm_actions
|
|
18
18
|
base.helper_method :nested
|
|
19
|
+
base.helper_method :nested_parent_record
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
protected
|
|
@@ -23,7 +24,7 @@ module ActiveScaffold::Actions
|
|
|
23
24
|
@nested ||= ActiveScaffold::DataStructures::NestedInfo.get(active_scaffold_config.model, active_scaffold_session_storage)
|
|
24
25
|
if !@nested.nil? && @nested.new_instance?
|
|
25
26
|
register_constraints_with_action_columns(@nested.constrained_fields)
|
|
26
|
-
active_scaffold_constraints[:id] =
|
|
27
|
+
active_scaffold_constraints[:id] = params[:id] if @nested.belongs_to?
|
|
27
28
|
end
|
|
28
29
|
@nested
|
|
29
30
|
end
|
|
@@ -33,12 +34,12 @@ module ActiveScaffold::Actions
|
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
def set_nested
|
|
36
|
-
if params[:
|
|
37
|
+
if params[:parent_scaffold] && ((params[:association] && params[:assoc_id]) || params[:named_scope])
|
|
37
38
|
@nested = nil
|
|
38
|
-
active_scaffold_session_storage[:nested] = {:
|
|
39
|
+
active_scaffold_session_storage[:nested] = {:parent_scaffold => params[:parent_scaffold].to_s,
|
|
39
40
|
:name => (params[:association] || params[:named_scope]).to_sym,
|
|
40
41
|
:parent_id => params[:assoc_id]}
|
|
41
|
-
params.delete_if {|key, value| [:
|
|
42
|
+
params.delete_if {|key, value| [:parent_scaffold, :association, :named_scope, :assoc_id].include? key.to_sym}
|
|
42
43
|
end
|
|
43
44
|
end
|
|
44
45
|
|
|
@@ -66,7 +67,9 @@ module ActiveScaffold::Actions
|
|
|
66
67
|
active_scaffold_config.action_links.add('new_existing', :label => :add_existing, :type => :collection, :security_method => :add_existing_authorized?) unless active_scaffold_config.action_links['new_existing']
|
|
67
68
|
if active_scaffold_config.nested.shallow_delete
|
|
68
69
|
active_scaffold_config.action_links.add('destroy_existing', :label => :remove, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :position => false, :security_method => :delete_existing_authorized?) unless active_scaffold_config.action_links['destroy_existing']
|
|
69
|
-
active_scaffold_config.
|
|
70
|
+
if active_scaffold_config.actions.include?(:delete)
|
|
71
|
+
active_scaffold_config.action_links.delete("delete") if active_scaffold_config.action_links['delete']
|
|
72
|
+
end
|
|
70
73
|
end
|
|
71
74
|
else
|
|
72
75
|
# Production mode is caching this link into a non nested scaffold
|
|
@@ -74,7 +77,9 @@ module ActiveScaffold::Actions
|
|
|
74
77
|
|
|
75
78
|
if active_scaffold_config.nested.shallow_delete
|
|
76
79
|
active_scaffold_config.action_links.delete("destroy_existing") if active_scaffold_config.action_links['destroy_existing']
|
|
77
|
-
active_scaffold_config.
|
|
80
|
+
if active_scaffold_config.actions.include?(:delete)
|
|
81
|
+
active_scaffold_config.action_links.add(ActiveScaffold::Config::Delete.link) unless active_scaffold_config.action_links['delete']
|
|
82
|
+
end
|
|
78
83
|
end
|
|
79
84
|
end
|
|
80
85
|
end
|
|
@@ -91,18 +96,22 @@ module ActiveScaffold::Actions
|
|
|
91
96
|
end
|
|
92
97
|
|
|
93
98
|
def nested_parent_record(crud = :read)
|
|
94
|
-
find_if_allowed(nested.parent_id, crud, nested.parent_model)
|
|
99
|
+
@nested_parent_record ||= find_if_allowed(nested.parent_id, crud, nested.parent_model)
|
|
95
100
|
end
|
|
96
101
|
|
|
97
102
|
def create_association_with_parent(record)
|
|
98
|
-
if nested?
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
if nested?
|
|
104
|
+
if (nested.belongs_to? || nested.has_one? || nested.habtm?) && nested.child_association
|
|
105
|
+
parent = nested_parent_record(:read)
|
|
106
|
+
case nested.child_association.macro
|
|
107
|
+
when :has_one
|
|
108
|
+
record.send("#{nested.child_association.name}=", parent)
|
|
109
|
+
when :belongs_to
|
|
110
|
+
record.send("#{nested.child_association.name}=", parent)
|
|
111
|
+
when :has_many, :has_and_belongs_to_many
|
|
112
|
+
record.send("#{nested.child_association.name}").send(:<<, parent)
|
|
113
|
+
end unless parent.nil?
|
|
114
|
+
end
|
|
106
115
|
end
|
|
107
116
|
end
|
|
108
117
|
|
|
@@ -5,9 +5,16 @@ module ActiveScaffold::Actions
|
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
def show
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
# rest destroy falls back to rest show in case of disabled javascript
|
|
9
|
+
# just render action_confirmation message for destroy
|
|
10
|
+
unless params.delete :destroy_action
|
|
11
|
+
do_show
|
|
12
|
+
successful?
|
|
13
|
+
respond_to_action(:show)
|
|
14
|
+
else
|
|
15
|
+
@record = find_if_allowed(params[:id], :read) if params[:id] && params[:id] && params[:id].to_i > 0
|
|
16
|
+
action_confirmation_respond_to_html(:destroy)
|
|
17
|
+
end
|
|
11
18
|
end
|
|
12
19
|
|
|
13
20
|
protected
|
|
@@ -49,6 +49,10 @@ module ActiveScaffold::Actions
|
|
|
49
49
|
end
|
|
50
50
|
end
|
|
51
51
|
def update_respond_to_js
|
|
52
|
+
if successful? && active_scaffold_config.update.refresh_list && !render_parent?
|
|
53
|
+
do_search if respond_to? :do_search
|
|
54
|
+
do_list
|
|
55
|
+
end
|
|
52
56
|
render :action => 'on_update'
|
|
53
57
|
end
|
|
54
58
|
def update_respond_to_xml
|
|
@@ -87,10 +91,10 @@ module ActiveScaffold::Actions
|
|
|
87
91
|
end
|
|
88
92
|
rescue ActiveRecord::RecordInvalid
|
|
89
93
|
rescue ActiveRecord::StaleObjectError
|
|
90
|
-
@record.errors.
|
|
94
|
+
@record.errors.add(:base, as_(:version_inconsistency))
|
|
91
95
|
self.successful=false
|
|
92
96
|
rescue ActiveRecord::RecordNotSaved
|
|
93
|
-
@record.errors.
|
|
97
|
+
@record.errors.add(:base, as_(:record_not_saved)) if @record.errors.empty?
|
|
94
98
|
self.successful = false
|
|
95
99
|
end
|
|
96
100
|
end
|
|
@@ -100,7 +104,10 @@ module ActiveScaffold::Actions
|
|
|
100
104
|
if @record.authorized_for?(:crud_type => :update, :column => params[:column])
|
|
101
105
|
column = active_scaffold_config.columns[params[:column].to_sym]
|
|
102
106
|
params[:value] ||= @record.column_for_attribute(params[:column]).default unless @record.column_for_attribute(params[:column]).nil? || @record.column_for_attribute(params[:column]).null
|
|
103
|
-
|
|
107
|
+
unless column.nil?
|
|
108
|
+
params[:value] = column_value_from_param_value(@record, column, params[:value])
|
|
109
|
+
params[:value] = [] if params[:value].nil? && column.form_ui && column.plural_association?
|
|
110
|
+
end
|
|
104
111
|
@record.send("#{params[:column]}=", params[:value])
|
|
105
112
|
before_update_save(@record)
|
|
106
113
|
@record.save
|