active_scaffold 3.3.0.rc3 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|