active_scaffold 3.3.0.rc3 → 3.3.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.
- data/CHANGELOG +16 -4
- data/README.md +67 -0
- data/app/assets/javascripts/jquery/active_scaffold.js +9 -9
- data/app/views/active_scaffold_overrides/_form.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_form_association.html.erb +3 -2
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +6 -4
- data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list_messages.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +4 -0
- data/app/views/active_scaffold_overrides/_render_field.js.erb +3 -2
- data/app/views/active_scaffold_overrides/_vertical_subform.html.erb +1 -1
- data/app/views/active_scaffold_overrides/edit_associated.js.erb +1 -1
- data/app/views/active_scaffold_overrides/on_create.js.erb +2 -1
- data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +6 -1
- data/config/locales/ru.yml +6 -6
- data/lib/active_scaffold/actions/core.rb +2 -2
- data/lib/active_scaffold/actions/create.rb +1 -0
- data/lib/active_scaffold/actions/field_search.rb +4 -5
- data/lib/active_scaffold/actions/list.rb +13 -13
- data/lib/active_scaffold/actions/mark.rb +1 -1
- data/lib/active_scaffold/actions/search.rb +2 -2
- data/lib/active_scaffold/actions/show.rb +3 -3
- data/lib/active_scaffold/actions/subform.rb +2 -1
- data/lib/active_scaffold/actions/update.rb +1 -0
- data/lib/active_scaffold/attribute_params.rb +6 -2
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +4 -1
- data/lib/active_scaffold/bridges/calendar_date_select.rb +1 -1
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker/helper.rb +1 -1
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +2 -2
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -2
- data/lib/active_scaffold/bridges/file_column.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +2 -2
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip.rb +1 -1
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +1 -1
- data/lib/active_scaffold/config/list.rb +9 -1
- data/lib/active_scaffold/constraints.rb +2 -2
- data/lib/active_scaffold/data_structures/action_columns.rb +2 -2
- data/lib/active_scaffold/data_structures/action_links.rb +3 -3
- data/lib/active_scaffold/data_structures/column.rb +16 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +17 -5
- data/lib/active_scaffold/extensions/left_outer_joins.rb +33 -0
- data/lib/active_scaffold/extensions/paginator_extensions.rb +8 -0
- data/lib/active_scaffold/extensions/unsaved_associated.rb +4 -4
- data/lib/active_scaffold/finder.rb +13 -7
- data/lib/active_scaffold/helpers/controller_helpers.rb +11 -1
- data/lib/active_scaffold/helpers/form_column_helpers.rb +50 -27
- data/lib/active_scaffold/helpers/list_column_helpers.rb +9 -3
- data/lib/active_scaffold/helpers/view_helpers.rb +8 -8
- data/lib/active_scaffold/tableless.rb +8 -0
- data/lib/active_scaffold/version.rb +1 -1
- data/lib/active_scaffold.rb +1 -0
- data/lib/generators/active_scaffold_controller/templates/controller.rb +7 -1
- metadata +7 -10
- data/README +0 -66
- data/app/views/active_scaffold_overrides/_form_attribute.html.erb +0 -27
- data/app/views/active_scaffold_overrides/_form_hidden_attribute.html.erb +0 -7
data/CHANGELOG
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
=
|
|
1
|
+
= 3.3.0
|
|
2
2
|
- Unify field overrides and list_ui method signatures
|
|
3
|
-
- Improve performance removing some partials and adding some caching for helper overrides and UIs, and caching url generation for lists (optional)
|
|
3
|
+
- Improve performance removing some partials and adding some caching for helper overrides and UIs, and caching url generation for lists (caching url is optional)
|
|
4
4
|
- Drop support for rails 3.1
|
|
5
5
|
- Add HTML5 form fields
|
|
6
6
|
- Add :chosen form_ui, and :chosen and :multi_chosen search_ui
|
|
@@ -26,8 +26,20 @@
|
|
|
26
26
|
- Fix multipart persistent update form
|
|
27
27
|
- Support jquery 1.9 (jquery-rails 2.2.0 gem)
|
|
28
28
|
- Reduce usage of session
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
- Allow to include header on list refreshing
|
|
30
|
+
- Add search_joins to columns, so it's possible to do left joins without loading associations only for searching
|
|
31
|
+
- Fix set focus for inplace edit clone and ajax
|
|
32
|
+
- Allow to override label for list column headings with a new helper method column_heading_label
|
|
33
|
+
- Keep focus on last field when render_field is called
|
|
34
|
+
- Add empty create and update methods to tableless
|
|
35
|
+
- Allow multiple subform levels
|
|
36
|
+
|
|
37
|
+
= 3.2.20
|
|
38
|
+
- Some fixes for ruby 1.9
|
|
39
|
+
- Some fixes for rails 3.1
|
|
40
|
+
- Fix detection of empty for has_and_belongs_to_many on subforms
|
|
41
|
+
|
|
42
|
+
= 3.2.19
|
|
31
43
|
- Avoid crashing when between is chosen and from or to is not filled
|
|
32
44
|
|
|
33
45
|
= 3.2.18
|
data/README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Overview
|
|
2
|
+
========
|
|
3
|
+
ActiveScaffold provides a quick and powerful user interfaces for CRUD (create, read, update, delete) operations for Rails applications. It offers additonal features including searching, pagination & layout control.
|
|
4
|
+
|
|
5
|
+
Branch Details
|
|
6
|
+
--------------
|
|
7
|
+
rails-3.2 branch on Github supports Rails 3.1 & 3.2, and is the current source of the 3.2.x line of gems. The master branch (3.3.x) has dropped support for Rails 3.1
|
|
8
|
+
|
|
9
|
+
Quick Start
|
|
10
|
+
-----------
|
|
11
|
+
To get started with a new Rails project
|
|
12
|
+
|
|
13
|
+
Added to Gemfile
|
|
14
|
+
|
|
15
|
+
gem 'active_scaffold'
|
|
16
|
+
|
|
17
|
+
Run the following commands
|
|
18
|
+
|
|
19
|
+
bundle install
|
|
20
|
+
bundle exec rake db:create
|
|
21
|
+
rails g active_scaffold User name:string
|
|
22
|
+
bundle exec rake db:migrate
|
|
23
|
+
|
|
24
|
+
Add the following line to app/assets/javascripts/application.js
|
|
25
|
+
|
|
26
|
+
//= require active_scaffold
|
|
27
|
+
|
|
28
|
+
Add the following line to /app/assets/stylesheets/application.css
|
|
29
|
+
|
|
30
|
+
*= require active_scaffold
|
|
31
|
+
|
|
32
|
+
Run the app and visit localhost:3000/teams
|
|
33
|
+
|
|
34
|
+
Configuration
|
|
35
|
+
-------------
|
|
36
|
+
See Wiki for instructions on customising ActiveScaffold and to find the full API details.
|
|
37
|
+
|
|
38
|
+
Compatability Issues
|
|
39
|
+
--------------------
|
|
40
|
+
jQuery 1.9 deprecates some methods that rails-3.2 branch still uses (NB: jQuery 1.9 is supported in 3.3.x, the master branch). You'll therefore need to ensure you use jQuery 1.8. You can do this by fixing version in your Gemfile:
|
|
41
|
+
|
|
42
|
+
gem 'jquery-rails', '2.1.4'
|
|
43
|
+
|
|
44
|
+
active_scaffold_batch plugin gem (versions 3.2.x) require 3.3.x (master branch). Therefore if you wish to try using active_scaffold_batch with this branch, you'll need to fork the project and edit the runtime dependency in the gemspec file (use at your own discretion)
|
|
45
|
+
|
|
46
|
+
Credits
|
|
47
|
+
-------
|
|
48
|
+
ActiveScaffold grew out of a project named Ajaxscaffold dating back to 2006. It has had numerous contributors including:
|
|
49
|
+
|
|
50
|
+
ActiveScaffold Gem/Plugin by Scott Rutherford (scott@caronsoftware.com), Richard White (rrwhite@gmail.com), Lance Ivy (lance@cainlevy.net), Ed Moss, Tim Harper and Sergio Cambra (sergio@entrecables.com)
|
|
51
|
+
|
|
52
|
+
Uses DhtmlHistory by Brad Neuberg (bkn3@columbia.edu)
|
|
53
|
+
http://codinginparadise.org
|
|
54
|
+
|
|
55
|
+
Uses Querystring by Adam Vandenberg
|
|
56
|
+
http://adamv.com/dev/javascript/querystring
|
|
57
|
+
|
|
58
|
+
Uses Paginator by Bruce Williams
|
|
59
|
+
http://paginator.rubyforge.org/
|
|
60
|
+
|
|
61
|
+
Supports RecordSelect by Lance Ivy
|
|
62
|
+
http://code.google.com/p/recordselect/
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
License
|
|
66
|
+
=======
|
|
67
|
+
Released under the MIT license (included)
|
|
@@ -5,6 +5,7 @@ jQuery(document).ready(function($) {
|
|
|
5
5
|
else alert(error);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
+
jQuery(document).on('focus', ':input', function() { ActiveScaffold.last_focus = this; });
|
|
8
9
|
jQuery(document).click(function(event) {
|
|
9
10
|
jQuery('.action_group.dyn ul').remove();
|
|
10
11
|
});
|
|
@@ -364,6 +365,7 @@ if (typeof(jQuery.fn.delayedObserver) === 'undefined') {
|
|
|
364
365
|
*/
|
|
365
366
|
|
|
366
367
|
var ActiveScaffold = {
|
|
368
|
+
last_focus: null,
|
|
367
369
|
records_for: function(tbody_id) {
|
|
368
370
|
if (typeof(tbody_id) == 'string') tbody_id = '#' + tbody_id;
|
|
369
371
|
return jQuery(tbody_id).children('.record');
|
|
@@ -441,7 +443,7 @@ var ActiveScaffold = {
|
|
|
441
443
|
replace: function(element, html) {
|
|
442
444
|
if (typeof(element) == 'string') element = '#' + element;
|
|
443
445
|
element = jQuery(element);
|
|
444
|
-
var new_element = typeof(html) == 'string' ? jQuery.parseHTML(html.trim()) : html;
|
|
446
|
+
var new_element = typeof(html) == 'string' ? jQuery.parseHTML(html.trim(), true) : html;
|
|
445
447
|
new_element = jQuery(new_element);
|
|
446
448
|
element.replaceWith(new_element);
|
|
447
449
|
new_element.trigger('as:element_updated');
|
|
@@ -554,13 +556,10 @@ var ActiveScaffold = {
|
|
|
554
556
|
row = jQuery(row);
|
|
555
557
|
var tbody = row.closest('tbody.records');
|
|
556
558
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
action_link.close_previous_adapter();
|
|
562
|
-
}
|
|
563
|
-
}
|
|
559
|
+
row.find('a.disabled').each(function() {;
|
|
560
|
+
var action_link = ActiveScaffold.ActionLink.get(this);
|
|
561
|
+
if (action_link) action_link.close();
|
|
562
|
+
});
|
|
564
563
|
|
|
565
564
|
ActiveScaffold.remove(row, function() {
|
|
566
565
|
ActiveScaffold.stripe(tbody);
|
|
@@ -678,7 +677,7 @@ var ActiveScaffold = {
|
|
|
678
677
|
content = jQuery(content);
|
|
679
678
|
if (options.singular == false) {
|
|
680
679
|
if (!(options.id && jQuery('#' + options.id).size() > 0)) {
|
|
681
|
-
var tfoot = element.
|
|
680
|
+
var tfoot = element.children('tfoot');
|
|
682
681
|
if (tfoot.length) tfoot.before(content);
|
|
683
682
|
else element.append(content);
|
|
684
683
|
content.trigger('as:element_created');
|
|
@@ -860,6 +859,7 @@ var ActiveScaffold = {
|
|
|
860
859
|
complete: function(event) {
|
|
861
860
|
element.nextAll('img.loading-indicator').css('visibility','hidden');
|
|
862
861
|
ActiveScaffold.enable_form(as_form);
|
|
862
|
+
if (ActiveScaffold.last_focus) $(ActiveScaffold.last_focus).focus().select();
|
|
863
863
|
},
|
|
864
864
|
error: function (xhr, status, error) {
|
|
865
865
|
var as_div = element.closest("div.active-scaffold");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<%
|
|
2
2
|
scope ||= nil
|
|
3
3
|
subsection_id ||= nil
|
|
4
|
-
show_unauthorized_columns = active_scaffold_config.send(form_action).show_unauthorized_columns
|
|
4
|
+
show_unauthorized_columns = active_scaffold_config.send(form_action).show_unauthorized_columns if active_scaffold_config.actions.include? form_action
|
|
5
5
|
%>
|
|
6
6
|
<ol class="form" <%= "id=#{subsection_id}" unless subsection_id.nil? %> <%= "style=\"display: none;\"".html_safe if columns.collapsed %>>
|
|
7
7
|
<% columns.each :for => @record, :crud_type => (:read if show_unauthorized_columns) do |column| %>
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
<%= render :partial => 'form', :locals => { :columns => column, :subsection_id => subsection_id, :form_action => form_action, :scope => scope } %>
|
|
16
16
|
<%= link_to_visibility_toggle(subsection_id, {:default_visible => !column.collapsed}) -%>
|
|
17
17
|
</li>
|
|
18
|
-
<% elsif renders_as == :subform and
|
|
18
|
+
<% elsif renders_as == :subform and authorized -%>
|
|
19
19
|
<li class="sub-form <%= active_scaffold_config_for(column.association.klass).subform.layout %>-sub-form <%= column_css_class %> <%=column.name%>-sub-form" id="<%= sub_form_id(:association => column.name) %>">
|
|
20
|
-
<%=
|
|
20
|
+
<%= render_column(column, @record, renders_as, scope) %>
|
|
21
21
|
</li>
|
|
22
22
|
<% else -%>
|
|
23
23
|
<li class="form-element <%= 'required' if column.required? %> <%= column_css_class %>">
|
|
24
|
-
<%=
|
|
24
|
+
<%= render_column(column, @record, renders_as, scope, !authorized) %>
|
|
25
25
|
</li>
|
|
26
26
|
<% end -%>
|
|
27
27
|
<% end -%>
|
|
@@ -5,8 +5,9 @@ associated = associated.sort_by {|r| r.new_record? ? 99999999999 : r.id} unless
|
|
|
5
5
|
if show_blank_record = column.show_blank_record?(associated)
|
|
6
6
|
associated << build_associated(column, parent_record)
|
|
7
7
|
end
|
|
8
|
+
disable_required_for_new = @disable_required_for_new
|
|
8
9
|
@disable_required_for_new = show_blank_record unless (column.singular_association? && column.required?)
|
|
9
|
-
subform_div_id = "#{sub_form_id(
|
|
10
|
+
subform_div_id = "#{sub_form_id(:association => column.name, :id => parent_record.id || generated_id(parent_record) || 99999999999)}-div"
|
|
10
11
|
-%>
|
|
11
12
|
<h5><%= column.label -%></h5>
|
|
12
13
|
<div id ="<%= subform_div_id %>" <%= 'style="display: none;"'.html_safe if column.collapsed -%>>
|
|
@@ -18,5 +19,5 @@ subform_div_id = "#{sub_form_id({:association => column.name, :id => parent_reco
|
|
|
18
19
|
<%= link_to_visibility_toggle(subform_div_id, {:default_visible => !column.collapsed}) -%>
|
|
19
20
|
<%
|
|
20
21
|
@record = parent_record
|
|
21
|
-
@disable_required_for_new =
|
|
22
|
+
@disable_required_for_new = disable_required_for_new
|
|
22
23
|
-%>
|
|
@@ -11,8 +11,10 @@ show_add_new = column_show_add_new(column, associated, @record)
|
|
|
11
11
|
|
|
12
12
|
return unless show_add_new or show_add_existing
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
temporary_id = generated_id(parent_record) if parent_record.new_record?
|
|
15
|
+
controller_path = active_scaffold_controller_for(parent_record.class).controller_path
|
|
16
|
+
edit_associated_url = params_for(:controller => controller_path, :action => 'edit_associated', :child_association => column.name, :associated_id => '--ID--', :scope => scope, :id => parent_record.id, :generated_id => temporary_id, :parent_controller => controller.controller_path) if show_add_existing
|
|
17
|
+
add_new_url = params_for(:controller => controller_path, :action => 'edit_associated', :child_association => column.name, :scope => scope, :id => parent_record.id, :generated_id => temporary_id, :parent_controller => controller.controller_path) if show_add_new
|
|
16
18
|
|
|
17
19
|
-%>
|
|
18
20
|
<div class="footer-wrapper">
|
|
@@ -25,7 +27,7 @@ add_new_url = params_for(:action => 'edit_associated', :child_association => col
|
|
|
25
27
|
add_label = as_(:replace_with_new)
|
|
26
28
|
add_class = 'as_replace_with_new'
|
|
27
29
|
end
|
|
28
|
-
create_another_id = "#{sub_form_id(:association => column.name)}-create-another" %>
|
|
30
|
+
create_another_id = "#{sub_form_id(:association => column.name, :id => parent_record.id || temporary_id || 99999999999)}-create-another" %>
|
|
29
31
|
<%= link_to add_label, add_new_url, :id => create_another_id, :remote => true, :class => add_class, :style=> "display: none;" %>
|
|
30
32
|
<%= javascript_tag("ActiveScaffold.show('#{create_another_id}');") %>
|
|
31
33
|
<% end -%>
|
|
@@ -37,7 +39,7 @@ add_new_url = params_for(:action => 'edit_associated', :child_association => col
|
|
|
37
39
|
<%= link_to_record_select as_(:add_existing), remote_controller.controller_path, :onselect => "ActiveScaffold.record_select_onselect(#{url_for(edit_associated_url).to_json}, #{active_scaffold_id.to_json}, id);" -%>
|
|
38
40
|
<% else -%>
|
|
39
41
|
<% select_options = options_from_collection_for_select(sorted_association_options_find(column.association), :id, :to_label)
|
|
40
|
-
add_existing_id = "#{sub_form_id(:association => column.name)}-add-existing"
|
|
42
|
+
add_existing_id = "#{sub_form_id(:association => column.name, :id => parent_record.id || temporary_id || 99999999999)}-add-existing"
|
|
41
43
|
add_existing_label = column.plural_association? ? :add_existing : :replace_existing %>
|
|
42
44
|
<%= select_tag 'associated_id', '<option value="">'.html_safe + as_(:_select_) + '</option>'.html_safe + select_options %>
|
|
43
45
|
<%= link_to as_(add_existing_label), edit_associated_url, :id => add_existing_id, :remote => true, :class=> "as_#{add_existing_label}", :style => "display: none;" %>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<table cellpadding="0" cellspacing="0" id="<%= sub_form_list_id(:association => column.name) %>">
|
|
1
|
+
<table cellpadding="0" cellspacing="0" id="<%= sub_form_list_id(:association => column.name, :id => parent_record.try(:id) || generated_id(parent_record) || 99999999999) %>">
|
|
2
2
|
<% @record = associated.empty? ? build_associated(column, parent_record) : associated.last -%>
|
|
3
3
|
<%= render :partial => 'horizontal_subform_header', :locals => {:parent_record => parent_record, :record => @record} %>
|
|
4
4
|
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
</thead>
|
|
25
25
|
<%= render :partial => 'list_messages', :locals => {:columns => columns} %>
|
|
26
26
|
<tbody class="records" id="<%= active_scaffold_tbody_id %>">
|
|
27
|
-
<% if !@
|
|
27
|
+
<% if !@page.empty? -%>
|
|
28
28
|
<%= render :partial => 'list_record', :collection => @page.items, :locals => {:hidden => false, :columns => columns, :action_links => active_scaffold_config.action_links.member, :data_refresh => url_for(params_for(:action => :row, :id => '--ID--', :_method => :get))} %>
|
|
29
29
|
<% end -%>
|
|
30
30
|
<% if columns.any? {|c| c.calculation?} -%>
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
</div>
|
|
21
21
|
<% end -%>
|
|
22
22
|
</div>
|
|
23
|
-
<p id="<%= empty_message_id %>" class="empty-message" <%= ' style="display:none;" '.html_safe unless @page.
|
|
23
|
+
<p id="<%= empty_message_id %>" class="empty-message" <%= ' style="display:none;" '.html_safe unless @page.empty? %>>
|
|
24
24
|
<%= as_(active_scaffold_config.list.no_entries_message) %>
|
|
25
25
|
</p>
|
|
26
26
|
</td>
|
|
@@ -1 +1,5 @@
|
|
|
1
|
+
<% if active_scaffold_config.list.refresh_with_header -%>
|
|
2
|
+
ActiveScaffold.replace('<%= active_scaffold_id %>', '<%= escape_javascript(render('list_with_header')) %>');
|
|
3
|
+
<% else -%>
|
|
1
4
|
ActiveScaffold.replace_html('<%= active_scaffold_content_id %>', '<%= escape_javascript(render('list')) %>');
|
|
5
|
+
<% end -%>
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
@rendered ||= Set.new
|
|
9
9
|
return if @rendered.include? column.name
|
|
10
10
|
@rendered << column.name
|
|
11
|
-
|
|
11
|
+
renders_as = column_renders_as(column)
|
|
12
|
+
if renders_as == :subform
|
|
12
13
|
options = {:is_subform => true, :field_class => "#{column.name}-sub-form"}
|
|
13
14
|
else
|
|
14
15
|
options = {:is_subform => false, :field_class => "#{column.name}-input"}
|
|
@@ -18,7 +19,7 @@
|
|
|
18
19
|
crud_type = @record.new_record? ? :create : (readonly ? :read : :update)
|
|
19
20
|
active_scaffold_render_subform_column(column, scope, crud_type, readonly, !active_scaffold_config.subform.columns.names_without_auth_check.include?(column.name))
|
|
20
21
|
else
|
|
21
|
-
|
|
22
|
+
render_column(column, @record, renders_as, scope)
|
|
22
23
|
end
|
|
23
24
|
-%>
|
|
24
25
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<div id="<%= sub_form_list_id(:association => column.name) %>">
|
|
1
|
+
<div id="<%= sub_form_list_id(:association => column.name, :id => parent_record.id || generated_id(parent_record) || 99999999999) %>">
|
|
2
2
|
<% associated.each_index do |index| %>
|
|
3
3
|
<% @record = associated[index] -%>
|
|
4
4
|
<%= render :partial => 'form_association_record', :locals => {:scope => column_scope(column, scope), :parent_record => parent_record, :column => column, :locked => show_blank_record && @record.new_record? && @record == associated.last, :index => index} %>
|
|
@@ -9,4 +9,4 @@ else
|
|
|
9
9
|
options[:id] = active_scaffold_input_options(column, @scope)[:id]
|
|
10
10
|
end
|
|
11
11
|
end %>
|
|
12
|
-
ActiveScaffold.create_associated_record_form('<%=sub_form_list_id(:association => @column.name)%>','<%=escape_javascript(associated_form)%>', <%= options.to_json.html_safe %>);
|
|
12
|
+
ActiveScaffold.create_associated_record_form('<%=sub_form_list_id(:association => @column.name, :id => @parent_record.id || generated_id(@parent_record) || 99999999999)%>','<%=escape_javascript(associated_form)%>', <%= options.to_json.html_safe %>);
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
try {
|
|
2
|
+
var action_link;
|
|
2
3
|
<% form_selector = "#{element_form_id(:action => :create)}"
|
|
3
4
|
insert_at ||= :top -%>
|
|
4
5
|
<% if active_scaffold_config.list.always_show_create -%>
|
|
5
6
|
<%= render :partial => 'update_messages' %>
|
|
6
7
|
<% else -%>
|
|
7
|
-
|
|
8
|
+
action_link = ActiveScaffold.find_action_link('<%= form_selector %>');
|
|
8
9
|
action_link.update_flash_messages('<%= escape_javascript(render(:partial => 'messages')) %>');
|
|
9
10
|
<% end -%>
|
|
10
11
|
<% if controller.send :successful? -%>
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
<%
|
|
2
|
+
column = active_scaffold_config.columns[@column.name]
|
|
3
|
+
options = active_scaffold_input_options(column)
|
|
4
|
+
options[:class] = "#{options[:class]} inplace_field"
|
|
5
|
+
-%>
|
|
6
|
+
<%= active_scaffold_input_for(column, nil, options) %>
|
data/config/locales/ru.yml
CHANGED
|
@@ -6,7 +6,7 @@ ru:
|
|
|
6
6
|
add: 'Добавить запись'
|
|
7
7
|
add_existing: 'Добавить существующую запись'
|
|
8
8
|
add_existing_model: '%{model}: добавить существующую запись'
|
|
9
|
-
apply: '
|
|
9
|
+
apply: 'Применить'
|
|
10
10
|
are_you_sure_to_delete: 'Удалить %{label}?'
|
|
11
11
|
cancel: 'Отмена'
|
|
12
12
|
click_to_edit: 'Нажмите для редактирования'
|
|
@@ -30,7 +30,7 @@ ru:
|
|
|
30
30
|
nested_of_model: '%{nested_model} @ %{parent_model}'
|
|
31
31
|
'false': 'Нет'
|
|
32
32
|
filtered: '(Найденное)'
|
|
33
|
-
found:
|
|
33
|
+
found:
|
|
34
34
|
one: 'запись'
|
|
35
35
|
few: 'записи'
|
|
36
36
|
many: 'записей'
|
|
@@ -56,7 +56,7 @@ ru:
|
|
|
56
56
|
refresh: 'Обновить'
|
|
57
57
|
remove: 'Удалить'
|
|
58
58
|
remove_file: 'Удалить или заменить файл'
|
|
59
|
-
replace_existing: '
|
|
59
|
+
replace_existing: 'Заменить существующим'
|
|
60
60
|
replace_with_new: 'Заменить новым'
|
|
61
61
|
revisions_for_model: '%{model}: редакции'
|
|
62
62
|
reset: 'Сброс'
|
|
@@ -111,13 +111,13 @@ ru:
|
|
|
111
111
|
firstDay: 1
|
|
112
112
|
isRTL: false
|
|
113
113
|
showMonthAfterYear: false
|
|
114
|
-
|
|
114
|
+
|
|
115
115
|
datetime_picker_options:
|
|
116
|
-
|
|
116
|
+
|
|
117
117
|
human_conditions:
|
|
118
118
|
boolean: "%{column} = %{value}"
|
|
119
119
|
association: "%{column} = %{value}"
|
|
120
|
-
|
|
120
|
+
|
|
121
121
|
errors:
|
|
122
122
|
template:
|
|
123
123
|
header:
|
|
@@ -8,7 +8,7 @@ module ActiveScaffold::Actions
|
|
|
8
8
|
rescue_from ActiveScaffold::RecordNotAllowed, ActiveScaffold::ActionNotAllowed, :with => :deny_access
|
|
9
9
|
end
|
|
10
10
|
base.helper_method :nested?
|
|
11
|
-
base.helper_method :
|
|
11
|
+
base.helper_method :calculate_query
|
|
12
12
|
base.helper_method :new_model
|
|
13
13
|
end
|
|
14
14
|
def render_field
|
|
@@ -185,7 +185,7 @@ module ActiveScaffold::Actions
|
|
|
185
185
|
respond_to do |type|
|
|
186
186
|
action_formats.each do |format|
|
|
187
187
|
type.send(format) do
|
|
188
|
-
if respond_to?(method_name = "#{action}_respond_to_#{format}")
|
|
188
|
+
if respond_to?(method_name = "#{action}_respond_to_#{format}", true)
|
|
189
189
|
send(method_name)
|
|
190
190
|
end
|
|
191
191
|
end
|
|
@@ -33,6 +33,7 @@ module ActiveScaffold::Actions
|
|
|
33
33
|
|
|
34
34
|
def create_respond_to_html
|
|
35
35
|
if params[:iframe]=='true' # was this an iframe post ?
|
|
36
|
+
do_refresh_list if successful? && active_scaffold_config.create.refresh_list && !render_parent?
|
|
36
37
|
responds_to_parent do
|
|
37
38
|
render :action => 'on_create', :formats => [:js], :layout => false
|
|
38
39
|
end
|
|
@@ -48,19 +48,18 @@ module ActiveScaffold::Actions
|
|
|
48
48
|
columns = active_scaffold_config.field_search.columns
|
|
49
49
|
search_params.each do |key, value|
|
|
50
50
|
next unless columns.include? key
|
|
51
|
-
|
|
51
|
+
column = active_scaffold_config.columns[key]
|
|
52
|
+
search_condition = self.class.condition_for_column(column, value, text_search)
|
|
52
53
|
unless search_condition.blank?
|
|
54
|
+
self.active_scaffold_outer_joins << column.search_joins unless column.includes.present? && list_columns.include?(column)
|
|
53
55
|
self.active_scaffold_conditions << search_condition
|
|
54
|
-
filtered_columns <<
|
|
56
|
+
filtered_columns << column
|
|
55
57
|
end
|
|
56
58
|
end
|
|
57
59
|
unless filtered_columns.blank?
|
|
58
60
|
@filtered = active_scaffold_config.field_search.human_conditions ? filtered_columns : true
|
|
59
61
|
end
|
|
60
62
|
|
|
61
|
-
includes_for_search_columns = columns.collect{ |column| column.includes}.flatten.uniq.compact
|
|
62
|
-
self.active_scaffold_includes.concat includes_for_search_columns
|
|
63
|
-
|
|
64
63
|
active_scaffold_config.list.user.page = nil
|
|
65
64
|
end
|
|
66
65
|
end
|
|
@@ -24,7 +24,7 @@ module ActiveScaffold::Actions
|
|
|
24
24
|
@nested_auto_open = active_scaffold_config.list.nested_auto_open
|
|
25
25
|
respond_to_action(:list)
|
|
26
26
|
end
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
protected
|
|
29
29
|
def list_respond_to_html
|
|
30
30
|
if embedded?
|
|
@@ -49,11 +49,11 @@ module ActiveScaffold::Actions
|
|
|
49
49
|
def list_respond_to_yaml
|
|
50
50
|
render :text => Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
|
|
51
51
|
end
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
def row_respond_to_html
|
|
54
54
|
render(:partial => 'row', :locals => {:record => @record})
|
|
55
55
|
end
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
def row_respond_to_js
|
|
58
58
|
render :action => 'row'
|
|
59
59
|
end
|
|
@@ -61,10 +61,10 @@ module ActiveScaffold::Actions
|
|
|
61
61
|
# The actual algorithm to prepare for the list view
|
|
62
62
|
def set_includes_for_columns(action = :list)
|
|
63
63
|
@cache_associations = true
|
|
64
|
-
includes_for_list_columns = active_scaffold_config.send(action).columns.
|
|
64
|
+
includes_for_list_columns = active_scaffold_config.send(action).columns.collect_visible(:flatten => true){ |c| c.includes }.flatten.uniq.compact
|
|
65
65
|
self.active_scaffold_includes.concat includes_for_list_columns
|
|
66
66
|
end
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
def get_row
|
|
69
69
|
set_includes_for_columns
|
|
70
70
|
klass = beginning_of_chain.includes(active_scaffold_includes)
|
|
@@ -97,23 +97,23 @@ module ActiveScaffold::Actions
|
|
|
97
97
|
end
|
|
98
98
|
@page, @records = page, page.items
|
|
99
99
|
end
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
def do_refresh_list
|
|
102
102
|
params.delete(:id)
|
|
103
|
-
do_search if respond_to? :do_search
|
|
103
|
+
do_search if respond_to? :do_search, true
|
|
104
104
|
do_list
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
def each_record_in_page
|
|
108
108
|
_page = active_scaffold_config.list.user.page
|
|
109
|
-
do_search if respond_to? :do_search
|
|
109
|
+
do_search if respond_to? :do_search, true
|
|
110
110
|
active_scaffold_config.list.user.page = _page
|
|
111
111
|
do_list
|
|
112
112
|
@page.items.each {|record| yield record}
|
|
113
113
|
end
|
|
114
114
|
|
|
115
115
|
def each_record_in_scope
|
|
116
|
-
do_search if respond_to? :do_search
|
|
116
|
+
do_search if respond_to? :do_search, true
|
|
117
117
|
append_to_query(beginning_of_chain, finder_options).all.each {|record| yield record}
|
|
118
118
|
end
|
|
119
119
|
|
|
@@ -133,11 +133,11 @@ module ActiveScaffold::Actions
|
|
|
133
133
|
def process_action_link_action(render_action = :action_update, crud_type = nil)
|
|
134
134
|
if request.get?
|
|
135
135
|
# someone has disabled javascript, we have to show confirmation form first
|
|
136
|
-
@record = find_if_allowed(params[:id], :read) if params[:id] && params[:id]
|
|
136
|
+
@record = find_if_allowed(params[:id], :read) if params[:id] && params[:id].to_i > 0
|
|
137
137
|
respond_to_action(:action_confirmation)
|
|
138
138
|
else
|
|
139
139
|
@action_link = active_scaffold_config.action_links[action_name]
|
|
140
|
-
if params[:id] && params[:id]
|
|
140
|
+
if params[:id] && params[:id].to_i > 0
|
|
141
141
|
crud_type ||= (request.post? || request.put?) ? :update : :delete
|
|
142
142
|
set_includes_for_columns
|
|
143
143
|
klass = beginning_of_chain.includes(active_scaffold_includes)
|
|
@@ -180,7 +180,7 @@ module ActiveScaffold::Actions
|
|
|
180
180
|
def action_update_respond_to_yaml
|
|
181
181
|
render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
|
|
182
182
|
end
|
|
183
|
-
|
|
183
|
+
|
|
184
184
|
private
|
|
185
185
|
def list_authorized_filter
|
|
186
186
|
raise ActiveScaffold::ActionNotAllowed unless list_authorized?
|
|
@@ -204,7 +204,7 @@ module ActiveScaffold::Actions
|
|
|
204
204
|
end
|
|
205
205
|
|
|
206
206
|
def list_columns
|
|
207
|
-
active_scaffold_config.list.columns.collect_visible
|
|
207
|
+
@list_columns ||= active_scaffold_config.list.columns.collect_visible
|
|
208
208
|
end
|
|
209
209
|
|
|
210
210
|
def list_columns_names
|
|
@@ -28,7 +28,7 @@ module ActiveScaffold::Actions
|
|
|
28
28
|
|
|
29
29
|
def mark_respond_to_js
|
|
30
30
|
if params[:id]
|
|
31
|
-
do_search if respond_to? :do_search
|
|
31
|
+
do_search if respond_to? :do_search, true
|
|
32
32
|
set_includes_for_columns if active_scaffold_config.actions.include? :list
|
|
33
33
|
@page = find_page(:pagination => active_scaffold_config.mark.mark_all_mode != :page)
|
|
34
34
|
render :action => 'on_mark'
|
|
@@ -29,8 +29,8 @@ module ActiveScaffold::Actions
|
|
|
29
29
|
@filtered = !search_conditions.blank?
|
|
30
30
|
self.active_scaffold_conditions.concat search_conditions if @filtered
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
self.
|
|
32
|
+
outer_joins = columns.collect{ |column| column.search_joins unless column.includes.present? && list_columns.include?(column)}
|
|
33
|
+
self.active_scaffold_outer_joins.concat outer_joins.flatten.uniq.compact
|
|
34
34
|
|
|
35
35
|
active_scaffold_config.list.user.page = nil
|
|
36
36
|
end
|
|
@@ -11,13 +11,13 @@ module ActiveScaffold::Actions
|
|
|
11
11
|
do_show
|
|
12
12
|
respond_to_action(:show)
|
|
13
13
|
else
|
|
14
|
-
@record = find_if_allowed(params[:id], :read) if params[:id] && params[:id]
|
|
14
|
+
@record = find_if_allowed(params[:id], :read) if params[:id] && params[:id].to_i > 0
|
|
15
15
|
action_confirmation_respond_to_html(:destroy)
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
protected
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
def show_respond_to_json
|
|
22
22
|
render :text => response_object.to_json(:only => active_scaffold_config.show.columns.names), :content_type => Mime::JSON, :status => response_status
|
|
23
23
|
end
|
|
@@ -53,7 +53,7 @@ module ActiveScaffold::Actions
|
|
|
53
53
|
def show_ignore?(record = nil)
|
|
54
54
|
!self.send(:authorized_for?, :crud_type => :read)
|
|
55
55
|
end
|
|
56
|
-
private
|
|
56
|
+
private
|
|
57
57
|
def show_authorized_filter
|
|
58
58
|
link = active_scaffold_config.show.link || active_scaffold_config.show.class.link
|
|
59
59
|
raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
|
|
@@ -9,6 +9,7 @@ module ActiveScaffold::Actions
|
|
|
9
9
|
|
|
10
10
|
def do_edit_associated
|
|
11
11
|
@parent_record = params[:id].nil? ? new_model : find_if_allowed(params[:id], :update)
|
|
12
|
+
generate_temporary_id(@parent_record, params[:generated_id]) if @parent_record.new_record? && params[:generated_id]
|
|
12
13
|
@column = active_scaffold_config.columns[params[:child_association]]
|
|
13
14
|
|
|
14
15
|
# NOTE: we don't check whether the user is allowed to update this record, because if not, we'll still let them associate the record. we'll just refuse to do more than associate, is all.
|
|
@@ -16,7 +17,7 @@ module ActiveScaffold::Actions
|
|
|
16
17
|
@record ||= build_associated(@column, @parent_record)
|
|
17
18
|
|
|
18
19
|
@scope = "#{params[:scope]}[#{@column.name}]"
|
|
19
|
-
@scope +=
|
|
20
|
+
@scope += "[#{@record.id || generate_temporary_id(@record)}]" if @column.plural_association?
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
end
|
|
@@ -34,6 +34,7 @@ module ActiveScaffold::Actions
|
|
|
34
34
|
end
|
|
35
35
|
def update_respond_to_html
|
|
36
36
|
if params[:iframe]=='true' # was this an iframe post ?
|
|
37
|
+
do_refresh_list if successful? && active_scaffold_config.create.refresh_list && !render_parent?
|
|
37
38
|
responds_to_parent do
|
|
38
39
|
render :action => 'on_update', :formats => [:js], :layout => false
|
|
39
40
|
end
|
|
@@ -212,16 +212,20 @@ module ActiveScaffold
|
|
|
212
212
|
next true if column and ignore_column_types.include?(column.type)
|
|
213
213
|
|
|
214
214
|
# defaults are pre-filled on the form. we can't use them to determine if the user intends a new row.
|
|
215
|
-
next true if
|
|
215
|
+
next true if value == column_default_value(column_name, klass, column)
|
|
216
216
|
|
|
217
217
|
if value.is_a?(Hash)
|
|
218
218
|
attributes_hash_is_empty?(value, klass)
|
|
219
219
|
elsif value.is_a?(Array)
|
|
220
|
-
value.
|
|
220
|
+
value.all?(&:blank?)
|
|
221
221
|
else
|
|
222
222
|
value.respond_to?(:empty?) ? value.empty? : false
|
|
223
223
|
end
|
|
224
224
|
end
|
|
225
225
|
end
|
|
226
|
+
|
|
227
|
+
def column_default_value(column_name, klass, column)
|
|
228
|
+
column.default.to_s if column
|
|
229
|
+
end
|
|
226
230
|
end
|
|
227
231
|
end
|
|
@@ -19,7 +19,10 @@ module ActiveScaffold
|
|
|
19
19
|
self.model.bitfields.each do |column_name, options|
|
|
20
20
|
columns = options.keys.sort_by { |column| self.columns[column].weight }
|
|
21
21
|
[:create, :update, :show, :subform].each do |action|
|
|
22
|
-
|
|
22
|
+
if self.actions.include? action
|
|
23
|
+
self.send(action).columns.exclude column_name
|
|
24
|
+
self.send(action).columns.add_subgroup(column_name) { |group| group.add *columns }
|
|
25
|
+
end
|
|
23
26
|
end
|
|
24
27
|
end if self.model.respond_to?(:bitfields) and self.model.bitfields.present?
|
|
25
28
|
|
|
@@ -3,7 +3,7 @@ class ActiveScaffold::Bridges::CalendarDateSelect < ActiveScaffold::DataStructur
|
|
|
3
3
|
# check to see if the old bridge was installed. If so, warn them
|
|
4
4
|
# we can detect this by checking to see if the bridge was installed before calling this code
|
|
5
5
|
|
|
6
|
-
if ActiveScaffold::Config::Core.instance_methods.include?("initialize_with_calendar_date_select")
|
|
6
|
+
if ActiveScaffold::Config::Core.instance_methods.include?("initialize_with_calendar_date_select".send(::ActiveScaffold::METHOD_CONVERSION))
|
|
7
7
|
raise RuntimeError, "We've detected that you have active_scaffold_calendar_date_select_bridge installed. This plugin has been moved to core. Please remove active_scaffold_calendar_date_select_bridge to prevent any conflicts"
|
|
8
8
|
end
|
|
9
9
|
|