active_scaffold 3.0.2 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +10 -0
- data/active_scaffold.gemspec +1 -1
- data/environment.rb +3 -1
- data/frontends/default/stylesheets/stylesheet.css +0 -1
- data/frontends/default/views/_list.html.erb +1 -1
- data/frontends/default/views/_list_actions.html.erb +14 -7
- data/frontends/default/views/_list_calculations.html.erb +1 -1
- data/frontends/default/views/_list_header.html.erb +1 -1
- data/frontends/default/views/_list_messages.html.erb +1 -1
- data/frontends/default/views/_list_record.html.erb +1 -1
- data/frontends/default/views/_update_actions.html.erb +1 -1
- data/frontends/default/views/update.html.erb +1 -1
- data/lib/active_scaffold/config/base.rb +4 -4
- data/lib/active_scaffold/config/create.rb +1 -1
- data/lib/active_scaffold/config/field_search.rb +7 -7
- data/lib/active_scaffold/config/form.rb +2 -2
- data/lib/active_scaffold/config/mark.rb +4 -4
- data/lib/active_scaffold/config/nested.rb +3 -3
- data/lib/active_scaffold/config/show.rb +1 -1
- data/lib/active_scaffold/data_structures/action_columns.rb +6 -6
- data/lib/active_scaffold/data_structures/action_link.rb +10 -10
- data/lib/active_scaffold/data_structures/action_links.rb +95 -10
- data/lib/active_scaffold/data_structures/column.rb +9 -9
- data/lib/active_scaffold/data_structures/nested_info.rb +20 -20
- data/lib/active_scaffold/data_structures/set.rb +3 -2
- data/lib/active_scaffold/data_structures/sorting.rb +7 -7
- data/lib/active_scaffold/helpers/list_column_helpers.rb +1 -1
- metadata +4 -4
data/CHANGELOG
CHANGED
data/active_scaffold.gemspec
CHANGED
@@ -2,7 +2,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "active_scaffold"
|
5
|
-
s.version = "3.0.
|
5
|
+
s.version = "3.0.4"
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.authors = ["Many, see README"]
|
8
8
|
s.email = ["activescaffold@googlegroups.com"]
|
data/environment.rb
CHANGED
@@ -3,9 +3,11 @@ require 'active_scaffold'
|
|
3
3
|
# TODO: clean up extensions. some could be organized for autoloading, and others could be removed entirely.
|
4
4
|
Dir["#{File.dirname __FILE__}/lib/extensions/*.rb"].each { |file| require file }
|
5
5
|
#Dir["#{File.dirname __FILE__}/lib/generators/*/*.rb"].each { |file| require file }
|
6
|
-
|
6
|
+
require "#{File.dirname __FILE__}/lib/active_scaffold/data_structures/set.rb"
|
7
7
|
Dir["#{File.dirname __FILE__}/lib/active_scaffold/data_structures/*.rb"].each { |file| require file }
|
8
|
+
Dir["#{File.dirname __FILE__}/lib/active_scaffold/actions/*.rb"].each { |file| require file }
|
8
9
|
Dir["#{File.dirname __FILE__}/lib/active_scaffold/config/*.rb"].each { |file| require file }
|
10
|
+
require "#{File.dirname __FILE__}/lib/active_scaffold/helpers/id_helpers.rb"
|
9
11
|
Dir["#{File.dirname __FILE__}/lib/active_scaffold/helpers/*.rb"].each { |file| require file }
|
10
12
|
|
11
13
|
ActionController::Base.send(:include, ActiveScaffold)
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<%= render :partial => 'list_messages', :locals => {:columns => columns} %>
|
9
9
|
<tbody class="records" id="<%= active_scaffold_tbody_id %>">
|
10
10
|
<% if !@records.empty? -%>
|
11
|
-
<%= render :partial => 'list_record', :collection => @page.items, :locals => { :hidden => false, :columns => columns, :action_links => active_scaffold_config.action_links.
|
11
|
+
<%= render :partial => 'list_record', :collection => @page.items, :locals => { :hidden => false, :columns => columns, :action_links => active_scaffold_config.action_links.member} %>
|
12
12
|
<% end -%>
|
13
13
|
<% if columns.any? {|c| c.calculation?} -%>
|
14
14
|
<%= render :partial => 'list_calculations', :locals => {:columns => columns} %>
|
@@ -1,15 +1,22 @@
|
|
1
|
-
<% action_links ||= active_scaffold_config.action_links %>
|
1
|
+
<% action_links ||= active_scaffold_config.action_links.member %>
|
2
2
|
<td class="actions"><table cellpadding="0" cellspacing="0">
|
3
3
|
<tr>
|
4
4
|
<td class="indicator-container">
|
5
5
|
<%= loading_indicator_tag(:action => :record, :id => record.id) %>
|
6
6
|
</td>
|
7
|
-
|
8
|
-
<%
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
<% level = 0 %>
|
8
|
+
<% action_links.traverse(controller, {:record => record}) do |parent, link, options| -%>
|
9
|
+
<% tag = (level == 0 ? 'td' : 'li') %>
|
10
|
+
<% if (options[:node] == :finished_traversing) -%>
|
11
|
+
<% level -= 1 %>
|
12
|
+
<%= "</ul></#{(level == 0 ? 'td' : 'li')}>".html_safe %>
|
13
|
+
<% elsif (options[:node] == :start_traversing) -%>
|
14
|
+
<%= "<#{tag} #{"class=\"action_list\"" if tag == 'td'}> #{content_tag('span', parent.name)}<ul>".html_safe %>
|
15
|
+
<% level += 1 %>
|
16
|
+
<% else -%>
|
17
|
+
<%= content_tag(tag, options[:authorized] ? render_action_link(link, url_options, record) : action_link_html(link, nil, {:class => "disabled #{link.action}#{link.html_options[:class].blank? ? '' : (' ' + link.html_options[:class])}"})) %>
|
18
|
+
<% end -%>
|
19
|
+
<% end -%>
|
13
20
|
</tr>
|
14
21
|
</table>
|
15
22
|
</td>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
columns ||= list_columns -%>
|
3
3
|
<tr id="<%= active_scaffold_calculations_id %>" class="active-scaffold-calculations">
|
4
4
|
<% columns.each do |column| -%>
|
5
|
-
<td
|
5
|
+
<td <%= "id=#{active_scaffold_calculations_id(column)}" if column.calculation? %>>
|
6
6
|
<% if column.calculation? -%>
|
7
7
|
<%= render_column_calculation(column) %>
|
8
8
|
<% else -%>
|
@@ -21,7 +21,7 @@
|
|
21
21
|
record = active_scaffold_config.model.new
|
22
22
|
record.id = 0
|
23
23
|
action_links.add(search_link) -%>
|
24
|
-
<%= render :partial => 'list_actions', :locals => {:record => record, :url_options => params_for(:escape => false, :search => ''), :action_links => action_links} %>
|
24
|
+
<%= render :partial => 'list_actions', :locals => {:record => record, :url_options => params_for(:escape => false, :search => ''), :action_links => action_links.member} %>
|
25
25
|
<% else %>
|
26
26
|
<td class='actions'><%= '<p class="empty-message"> </p>'.html_safe if @page.items.empty? %></td>
|
27
27
|
<% end -%>
|
@@ -4,7 +4,7 @@ columns ||= list_columns
|
|
4
4
|
tr_class = cycle("", "even-record")
|
5
5
|
tr_class += " #{list_row_class(record)}" if respond_to? :list_row_class
|
6
6
|
url_options = params_for(:action => :list, :id => record.id)
|
7
|
-
action_links ||= active_scaffold_config.action_links.
|
7
|
+
action_links ||= active_scaffold_config.action_links.member
|
8
8
|
-%>
|
9
9
|
|
10
10
|
<tr class="record <%= tr_class %>" id="<%= element_row_id(:action => :list, :id => record.id) %>" data-refresh="<%= url_for(params_for(:action => :row, :id => record.id, :_method => :get, :escape => false)).html_safe %>">
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<div class="active-scaffold-header">
|
2
2
|
<div class="actions">
|
3
|
-
<% active_scaffold_config.action_links.each
|
3
|
+
<% active_scaffold_config.action_links.member.each do |link| -%>
|
4
4
|
<% next unless link.action == 'nested' -%>
|
5
5
|
<% next if skip_action_link(link) -%>
|
6
6
|
<%= record.authorized_for?(:crud_type => link.crud_type, :action => link.action) ? render_action_link(link, url_options, record) : "<a class='disabled'>#{link.label}</a>" -%>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<div class="active-scaffold">
|
2
2
|
<div class="update-view <%= "#{params[:controller]}-view" %> view">
|
3
|
-
<% if active_scaffold_config.update.nested_links and active_scaffold_config.action_links.
|
3
|
+
<% if active_scaffold_config.update.nested_links and active_scaffold_config.action_links.member.empty? -%>
|
4
4
|
<%= render :partial => 'update_actions', :locals => {:record => @record, :url_options => params_for(:action => :list, :id => @record.id)} %>
|
5
5
|
<% end -%>
|
6
6
|
<%= render :partial => 'update_form' -%>
|
@@ -33,17 +33,17 @@ module ActiveScaffold::Config
|
|
33
33
|
@conf = conf
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def formats
|
38
38
|
@formats ||= []
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def formats=(val)
|
42
42
|
@formats=val
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
private
|
46
|
-
|
46
|
+
|
47
47
|
def columns=(val)
|
48
48
|
@columns = ActiveScaffold::DataStructures::ActionColumns.new(*val)
|
49
49
|
@columns.action = self
|
@@ -49,26 +49,26 @@ module ActiveScaffold::Config
|
|
49
49
|
# * false: LIKE ?
|
50
50
|
# Default is :full
|
51
51
|
attr_accessor :text_search
|
52
|
-
|
52
|
+
|
53
53
|
# the ActionLink for this action
|
54
54
|
attr_accessor :link
|
55
|
-
|
55
|
+
|
56
56
|
# rarely searched columns may be placed in a hidden subgroup
|
57
57
|
def optional_columns=(optionals)
|
58
58
|
@optional_columns= Array(optionals)
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
def optional_columns
|
62
62
|
@optional_columns ||= []
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
# default search params
|
66
|
-
# default_params = {:title => {"from"=>"test", "to"=>"", "opt"=>"%?%"}}
|
66
|
+
# default_params = {:title => {"from"=>"test", "to"=>"", "opt"=>"%?%"}}
|
67
67
|
attr_accessor :default_params
|
68
|
-
|
68
|
+
|
69
69
|
# human conditions
|
70
70
|
# instead of just filtered you may show the user a humanized search condition statment
|
71
71
|
attr_accessor :human_conditions
|
72
|
-
|
72
|
+
|
73
73
|
end
|
74
74
|
end
|
@@ -1,22 +1,22 @@
|
|
1
1
|
module ActiveScaffold::Config
|
2
2
|
class Mark < Base
|
3
3
|
self.crud_type = :read
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(core_config)
|
6
6
|
@core = core_config
|
7
7
|
@core.model.send(:include, ActiveScaffold::MarkedModel) unless @core.model.ancestors.include?(ActiveScaffold::MarkedModel)
|
8
8
|
add_mark_column
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
protected
|
12
|
-
|
12
|
+
|
13
13
|
def add_mark_column
|
14
14
|
@core.columns.add :marked
|
15
15
|
@core.columns[:marked].label = 'M'
|
16
16
|
@core.columns[:marked].form_ui = :checkbox
|
17
17
|
@core.columns[:marked].inplace_edit = true
|
18
18
|
@core.columns[:marked].sort = false
|
19
|
-
@core.list.columns = [:marked] + @core.list.columns.names unless @core.list.columns.include? :marked
|
19
|
+
@core.list.columns = [:marked] + @core.list.columns.names unless @core.list.columns.include? :marked
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -20,14 +20,14 @@ module ActiveScaffold::Config
|
|
20
20
|
def add_link(attribute, options = {})
|
21
21
|
column = @core.columns[attribute.to_sym]
|
22
22
|
unless column.nil? || column.association.nil?
|
23
|
-
options.reverse_merge! :security_method => :nested_authorized?, :label => column.association.klass.model_name.human({:count => 2, :default => column.association.klass.name.pluralize})
|
23
|
+
options.reverse_merge! :security_method => :nested_authorized?, :label => column.association.klass.model_name.human({:count => 2, :default => column.association.klass.name.pluralize})
|
24
24
|
action_link = @core.link_for_association(column, options)
|
25
25
|
@core.action_links.add(action_link) unless action_link.nil?
|
26
26
|
else
|
27
|
-
|
27
|
+
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def add_scoped_link(named_scope, options = {})
|
32
32
|
action_link = @core.link_for_association_as_scope(named_scope.to_sym, options)
|
33
33
|
@core.action_links.add(action_link) unless action_link.nil?
|
@@ -15,7 +15,7 @@ module ActiveScaffold::DataStructures
|
|
15
15
|
|
16
16
|
# Whether this column set is collapsed by default in contexts where collapsing is supported
|
17
17
|
attr_accessor :collapsed
|
18
|
-
|
18
|
+
|
19
19
|
# nests a subgroup in the column set
|
20
20
|
def add_subgroup(label, &proc)
|
21
21
|
columns = ActiveScaffold::DataStructures::ActionColumns.new
|
@@ -73,7 +73,7 @@ module ActiveScaffold::DataStructures
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
def collect_visible(options = {}, &proc)
|
78
78
|
columns = []
|
79
79
|
options[:for] ||= @columns.active_record_class
|
@@ -90,8 +90,8 @@ module ActiveScaffold::DataStructures
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
columns
|
93
|
-
end
|
94
|
-
|
93
|
+
end
|
94
|
+
|
95
95
|
def skip_column?(column, options)
|
96
96
|
result = false
|
97
97
|
# skip if this matches a constrained column
|
@@ -119,12 +119,12 @@ module ActiveScaffold::DataStructures
|
|
119
119
|
def constraint_columns
|
120
120
|
@constraint_columns ||= []
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
attr_writer :unauthorized_columns
|
124
124
|
def unauthorized_columns
|
125
125
|
@unauthorized_columns ||= []
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
def length
|
129
129
|
((@set - self.constraint_columns) - self.unauthorized_columns).length
|
130
130
|
end
|
@@ -27,7 +27,7 @@ module ActiveScaffold::DataStructures
|
|
27
27
|
|
28
28
|
# the action-path for this link. what page to request? this is required!
|
29
29
|
attr_accessor :action
|
30
|
-
|
30
|
+
|
31
31
|
# the controller for this action link. if nil, the current controller should be assumed.
|
32
32
|
attr_accessor :controller
|
33
33
|
|
@@ -42,7 +42,7 @@ module ActiveScaffold::DataStructures
|
|
42
42
|
def label
|
43
43
|
@label.is_a?(Symbol) ? as_(@label) : @label
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# image to use {:name => 'arrow.png', :size => '16x16'}
|
47
47
|
attr_accessor :image
|
48
48
|
|
@@ -54,7 +54,7 @@ module ActiveScaffold::DataStructures
|
|
54
54
|
def confirm?
|
55
55
|
@confirm ? true : false
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
# if the action uses a DHTML based (i.e. 2-phase) confirmation
|
59
59
|
attr_writer :dhtml_confirm
|
60
60
|
def dhtml_confirm
|
@@ -74,9 +74,9 @@ module ActiveScaffold::DataStructures
|
|
74
74
|
def security_method_set?
|
75
75
|
!!@security_method
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
attr_accessor :ignore_method
|
79
|
-
|
79
|
+
|
80
80
|
# the crud type of the (eventual?) action. different than :method, because this crud action may not be imminent.
|
81
81
|
# this is used to determine record-level authorization (e.g. record.authorized_for?(:crud_type => link.crud_type).
|
82
82
|
# options are :create, :read, :update, and :delete
|
@@ -145,18 +145,18 @@ module ActiveScaffold::DataStructures
|
|
145
145
|
|
146
146
|
# html options for the link
|
147
147
|
attr_accessor :html_options
|
148
|
-
|
148
|
+
|
149
149
|
# nested action_links are referencing a column
|
150
150
|
attr_accessor :column
|
151
|
-
|
151
|
+
|
152
152
|
# indicates that this a nested_link
|
153
153
|
def nested_link?
|
154
154
|
@column || (parameters && parameters[:named_scope])
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
# Internal use: generated eid for this action_link
|
158
158
|
attr_accessor :eid
|
159
|
-
|
160
|
-
|
159
|
+
|
160
|
+
|
161
161
|
end
|
162
162
|
end
|
@@ -8,11 +8,15 @@ module ActiveScaffold::DataStructures
|
|
8
8
|
|
9
9
|
# adds an ActionLink, creating one from the arguments if need be
|
10
10
|
def add(action, options = {})
|
11
|
-
link = action.is_a?(ActiveScaffold::DataStructures::ActionLink)
|
11
|
+
link = if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || action.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
12
|
+
action
|
13
|
+
else
|
14
|
+
ActiveScaffold::DataStructures::ActionLink.new(action, options)
|
15
|
+
end
|
12
16
|
# NOTE: this duplicate check should be done by defining the comparison operator for an Action data structure
|
13
|
-
existing =
|
17
|
+
existing = find_duplicate(link)
|
14
18
|
unless existing
|
15
|
-
|
19
|
+
subgroup(link.type, link.type).add_to_set(link)
|
16
20
|
link
|
17
21
|
else
|
18
22
|
existing
|
@@ -20,40 +24,121 @@ module ActiveScaffold::DataStructures
|
|
20
24
|
end
|
21
25
|
alias_method :<<, :add
|
22
26
|
|
27
|
+
def add_to_set(link)
|
28
|
+
@set << link
|
29
|
+
end
|
30
|
+
|
23
31
|
# finds an ActionLink by matching the action
|
24
32
|
def [](val)
|
25
|
-
@set.find
|
33
|
+
@set.find do |item|
|
34
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
35
|
+
item[val]
|
36
|
+
else
|
37
|
+
item.action == val.to_s
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def find_duplicate(link)
|
43
|
+
@set.find do |item|
|
44
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
45
|
+
item.find_duplicate(link)
|
46
|
+
else
|
47
|
+
item.action == link.action and item.controller == link.controller and item.parameters == link.parameters
|
48
|
+
end
|
49
|
+
end
|
26
50
|
end
|
27
51
|
|
28
52
|
def delete(val)
|
29
|
-
@set.delete_if
|
53
|
+
@set.delete_if do |item|
|
54
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
55
|
+
delete(val)
|
56
|
+
else
|
57
|
+
item.action == val.to_s
|
58
|
+
end
|
59
|
+
end
|
30
60
|
end
|
31
61
|
|
32
62
|
# iterates over the links, possibly by type
|
33
63
|
def each(type = nil)
|
34
|
-
type = type.to_sym if type
|
35
64
|
@set.each {|item|
|
36
|
-
next if type and item.type != type
|
37
65
|
yield item
|
38
66
|
}
|
39
67
|
end
|
40
|
-
|
68
|
+
|
41
69
|
def collect_by_type(type = nil)
|
42
70
|
links = []
|
43
|
-
each(type) {|link| links << link}
|
71
|
+
subgroup(type).each(type) {|link| links << link}
|
44
72
|
links
|
45
73
|
end
|
46
74
|
|
75
|
+
def traverse(controller, options = {}, &block)
|
76
|
+
@set.each do |link|
|
77
|
+
if link.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
78
|
+
# add top node only if there is anything in the list
|
79
|
+
#yield({:kind => :node, :level => 1, :last => false, :link => link})
|
80
|
+
yield(link, nil, {:node => :start_traversing})
|
81
|
+
link.traverse(options, &block)
|
82
|
+
yield(link, nil, {:node => :finished_traversing})
|
83
|
+
#yield({:kind => :completed_group, :level => 1, :last => false, :link => link})
|
84
|
+
elsif controller.nil? || !skip_action_link(controller, link, options[:record])
|
85
|
+
authorized = options[:for].nil? ? true : options[:for].authorized_for?(:crud_type => link.crud_type, :action => link.action)
|
86
|
+
yield(self, link, {:authorized => authorized})
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def collect
|
92
|
+
@set.collect
|
93
|
+
end
|
94
|
+
|
47
95
|
def empty?
|
48
96
|
@set.size == 0
|
49
97
|
end
|
50
98
|
|
99
|
+
def subgroup(name, label = nil)
|
100
|
+
group = self if name == self.name
|
101
|
+
group ||= @set.find do |item|
|
102
|
+
name == item.name if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
103
|
+
end
|
104
|
+
|
105
|
+
if group.nil?
|
106
|
+
group = ActiveScaffold::DataStructures::ActionLinks.new
|
107
|
+
group.label = label || name
|
108
|
+
group.name = name
|
109
|
+
add_to_set group
|
110
|
+
end
|
111
|
+
group
|
112
|
+
end
|
113
|
+
|
114
|
+
attr_writer :label
|
115
|
+
def label
|
116
|
+
as_(@label) if @label
|
117
|
+
end
|
118
|
+
|
119
|
+
def method_missing(name, *args, &block)
|
120
|
+
class_eval %{
|
121
|
+
def #{name}
|
122
|
+
@#{name} ||= subgroup('#{name}'.to_sym)
|
123
|
+
yield @#{name} if block_given?
|
124
|
+
@#{name}
|
125
|
+
end
|
126
|
+
}
|
127
|
+
send(name, &block)
|
128
|
+
end
|
129
|
+
|
130
|
+
attr_accessor :name
|
131
|
+
|
51
132
|
protected
|
52
133
|
|
134
|
+
def skip_action_link(controller, link, *args)
|
135
|
+
(!link.ignore_method.nil? and controller.try(link.ignore_method, *args)) || ((link.security_method_set? or controller.respond_to? link.security_method) and !controller.send(link.security_method, *args))
|
136
|
+
end
|
137
|
+
|
53
138
|
# called during clone or dup. makes the clone/dup deeper.
|
54
139
|
def initialize_copy(from)
|
55
140
|
@set = []
|
56
141
|
from.instance_variable_get('@set').each { |link| @set << link.clone }
|
57
142
|
end
|
58
143
|
end
|
59
|
-
end
|
144
|
+
end
|
@@ -19,7 +19,7 @@ module ActiveScaffold::DataStructures
|
|
19
19
|
|
20
20
|
# Whether to enable add_existing for this column
|
21
21
|
attr_accessor :allow_add_existing
|
22
|
-
|
22
|
+
|
23
23
|
# Any extra parameters this particular column uses. This is for create/update purposes.
|
24
24
|
def params
|
25
25
|
# lazy initialize
|
@@ -52,9 +52,9 @@ module ActiveScaffold::DataStructures
|
|
52
52
|
def required?
|
53
53
|
@required
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
attr_reader :update_columns
|
57
|
-
|
57
|
+
|
58
58
|
# update dependent columns after value change in form
|
59
59
|
# update_columns = :name
|
60
60
|
# update_columns = [:name, :age]
|
@@ -199,7 +199,7 @@ module ActiveScaffold::DataStructures
|
|
199
199
|
cattr_accessor :actions_for_association_links
|
200
200
|
@@actions_for_association_links = [:new, :edit, :show]
|
201
201
|
attr_accessor :actions_for_association_links
|
202
|
-
|
202
|
+
|
203
203
|
cattr_accessor :association_form_ui
|
204
204
|
@@association_form_ui = nil
|
205
205
|
|
@@ -269,13 +269,13 @@ module ActiveScaffold::DataStructures
|
|
269
269
|
@form_ui = :checkbox if @column and @column.type == :boolean
|
270
270
|
@allow_add_existing = true
|
271
271
|
@form_ui = self.class.association_form_ui if @association && self.class.association_form_ui
|
272
|
-
|
272
|
+
|
273
273
|
# default all the configurable variables
|
274
274
|
self.css_class = ''
|
275
275
|
self.required = active_record_class.validators_on(self.name).map(&:class).include? ActiveModel::Validations::PresenceValidator
|
276
276
|
self.sort = true
|
277
277
|
self.search_sql = true
|
278
|
-
|
278
|
+
|
279
279
|
@weight = estimate_weight
|
280
280
|
|
281
281
|
self.includes = (association and not polymorphic_association?) ? [association.name] : []
|
@@ -308,7 +308,7 @@ module ActiveScaffold::DataStructures
|
|
308
308
|
end
|
309
309
|
end
|
310
310
|
end
|
311
|
-
|
311
|
+
|
312
312
|
def initialize_search_sql
|
313
313
|
self.search_sql = unless self.virtual?
|
314
314
|
if association.nil?
|
@@ -328,13 +328,13 @@ module ActiveScaffold::DataStructures
|
|
328
328
|
def field
|
329
329
|
@field ||= [@active_record_class.connection.quote_column_name(@table), field_name].join('.')
|
330
330
|
end
|
331
|
-
|
331
|
+
|
332
332
|
def estimate_weight
|
333
333
|
if singular_association?
|
334
334
|
400
|
335
335
|
elsif plural_association?
|
336
336
|
500
|
337
|
-
elsif [:created_at, :updated_at].include?(self.name)
|
337
|
+
elsif [:created_at, :updated_at].include?(self.name)
|
338
338
|
600
|
339
339
|
elsif [:name, :label, :title].include?(self.name)
|
340
340
|
100
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveScaffold::DataStructures
|
2
2
|
class NestedInfo
|
3
3
|
def self.get(model, session_storage)
|
4
|
-
if session_storage[:nested].nil?
|
4
|
+
if session_storage[:nested].nil?
|
5
5
|
nil
|
6
6
|
else
|
7
7
|
session_info = session_storage[:nested].clone
|
@@ -13,32 +13,32 @@ module ActiveScaffold::DataStructures
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
attr_accessor :association, :child_association, :parent_model, :parent_id, :constrained_fields, :scope
|
18
|
-
|
18
|
+
|
19
19
|
def initialize(model, session_info)
|
20
20
|
@parent_model = session_info[:parent_model]
|
21
21
|
@parent_id = session_info[:parent_id]
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def new_instance?
|
25
25
|
result = @new_instance.nil?
|
26
26
|
@new_instance = false
|
27
27
|
result
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def parent_scope
|
31
31
|
parent_model.find(parent_id)
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def habtm?
|
35
|
-
false
|
35
|
+
false
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def belongs_to?
|
39
39
|
false
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def readonly?
|
43
43
|
false
|
44
44
|
end
|
@@ -47,22 +47,22 @@ module ActiveScaffold::DataStructures
|
|
47
47
|
false
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
class NestedInfoAssociation < NestedInfo
|
52
52
|
def initialize(model, session_info)
|
53
53
|
super(model, session_info)
|
54
54
|
@association = session_info[:association]
|
55
55
|
iterate_model_associations(model)
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
def habtm?
|
59
|
-
association.macro == :has_and_belongs_to_many
|
59
|
+
association.macro == :has_and_belongs_to_many
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
def belongs_to?
|
63
63
|
association.belongs_to?
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
def readonly?
|
67
67
|
if association.options.has_key? :readonly
|
68
68
|
association.options[:readonly]
|
@@ -78,11 +78,11 @@ module ActiveScaffold::DataStructures
|
|
78
78
|
def default_sorting
|
79
79
|
association.options[:order]
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
protected
|
83
|
-
|
83
|
+
|
84
84
|
def iterate_model_associations(model)
|
85
|
-
@constrained_fields = []
|
85
|
+
@constrained_fields = []
|
86
86
|
@constrained_fields << association.primary_key_name.to_sym unless association.belongs_to?
|
87
87
|
model.reflect_on_all_associations.each do |current|
|
88
88
|
if !current.belongs_to? && association.primary_key_name == current.association_foreign_key
|
@@ -91,18 +91,18 @@ module ActiveScaffold::DataStructures
|
|
91
91
|
end
|
92
92
|
if association.primary_key_name == current.primary_key_name
|
93
93
|
# show columns for has_many and has_one child associationes
|
94
|
-
constrained_fields << current.name.to_sym if current.belongs_to?
|
94
|
+
constrained_fields << current.name.to_sym if current.belongs_to?
|
95
95
|
@child_association = current
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
class NestedInfoScope < NestedInfo
|
102
102
|
def initialize(model, session_info)
|
103
103
|
super(model, session_info)
|
104
104
|
@scope = session_info[:name]
|
105
|
-
@constrained_fields = []
|
105
|
+
@constrained_fields = []
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
@@ -7,7 +7,7 @@ module ActiveScaffold::DataStructures
|
|
7
7
|
@columns = columns
|
8
8
|
@clauses = []
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def set_default_sorting(model)
|
12
12
|
model_scope = model.send(:current_scoped_methods)
|
13
13
|
order_clause = model_scope.arel.order_clauses.join(",") if model_scope
|
@@ -26,7 +26,7 @@ module ActiveScaffold::DataStructures
|
|
26
26
|
clear
|
27
27
|
set_sorting_from_order_clause(order_clause, table_name)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
# add a clause to the sorting, assuming the column is sortable
|
31
31
|
def add(column_name, direction = nil)
|
32
32
|
direction ||= 'ASC'
|
@@ -121,7 +121,7 @@ module ActiveScaffold::DataStructures
|
|
121
121
|
def mixed_sorting?
|
122
122
|
sorts_by_method? and sorts_by_sql?
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
def default_sorting?
|
126
126
|
@default_sorting
|
127
127
|
end
|
@@ -135,7 +135,7 @@ module ActiveScaffold::DataStructures
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
def extract_order_parts(criterion_parts)
|
140
140
|
column_name_part, direction_part = criterion_parts.strip.split(' ')
|
141
141
|
column_name_parts = column_name_part.split('.')
|
@@ -144,11 +144,11 @@ module ActiveScaffold::DataStructures
|
|
144
144
|
order[:table_name] = remove_quotes(column_name_parts[-2]) if column_name_parts.length >= 2
|
145
145
|
order
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
def different_table?(model_table_name, order_table_name)
|
149
149
|
!order_table_name.nil? && model_table_name != order_table_name
|
150
150
|
end
|
151
|
-
|
151
|
+
|
152
152
|
def remove_quotes(sql_name)
|
153
153
|
if sql_name.starts_with?('"') || sql_name.starts_with?('`')
|
154
154
|
sql_name[1, (sql_name.length - 2)]
|
@@ -156,7 +156,7 @@ module ActiveScaffold::DataStructures
|
|
156
156
|
sql_name
|
157
157
|
end
|
158
158
|
end
|
159
|
-
|
159
|
+
|
160
160
|
def extract_direction(direction_part)
|
161
161
|
if direction_part.to_s.upcase == 'DESC'
|
162
162
|
'DESC'
|
@@ -330,7 +330,7 @@ module ActiveScaffold
|
|
330
330
|
|
331
331
|
def column_heading_value(column, sorting, sort_direction)
|
332
332
|
if column.sortable?
|
333
|
-
options = {:id =>
|
333
|
+
options = {:id => nil, :class => "as_sort",
|
334
334
|
'data-page-history' => controller_id,
|
335
335
|
:remote => true, :method => :get}
|
336
336
|
url_options = params_for(:action => :index, :page => 1,
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_scaffold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 3.0.
|
9
|
+
- 4
|
10
|
+
version: 3.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Many, see README
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-20 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|