active_scaffold 3.0.5 → 3.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +11 -2
- data/Gemfile.lock +20 -0
- data/Rakefile +33 -4
- data/active_scaffold.gemspec +378 -17
- data/frontends/default/images/config.png +0 -0
- data/frontends/default/images/gears.png +0 -0
- data/frontends/default/javascripts/jquery/active_scaffold.js +34 -33
- data/frontends/default/javascripts/jquery/jquery.editinplace.js +21 -4
- data/frontends/default/javascripts/prototype/active_scaffold.js +43 -38
- data/frontends/default/stylesheets/stylesheet.css +110 -35
- data/frontends/default/views/_action_group.html.erb +20 -0
- data/frontends/default/views/_base_form.html.erb +7 -3
- data/frontends/default/views/_create_form.html.erb +5 -3
- data/frontends/default/views/_create_form_on_list.html.erb +2 -1
- data/frontends/default/views/_field_search.html.erb +2 -2
- data/frontends/default/views/_form.html.erb +2 -2
- data/frontends/default/views/_form_messages.html.erb +1 -1
- data/frontends/default/views/_horizontal_subform.html.erb +1 -1
- data/frontends/default/views/_list_actions.html.erb +6 -14
- data/frontends/default/views/_list_header.html.erb +4 -6
- data/frontends/default/views/_list_with_header.html.erb +2 -2
- data/frontends/default/views/_messages.html.erb +2 -2
- data/frontends/default/views/_search.html.erb +2 -2
- data/frontends/default/views/_show.html.erb +1 -1
- data/frontends/default/views/_update_form.html.erb +2 -1
- data/frontends/default/views/_vertical_subform.html.erb +1 -1
- data/frontends/default/views/action_confirmation.html.erb +13 -0
- data/frontends/default/views/add_existing.js.rjs +1 -1
- data/frontends/default/views/destroy.js.rjs +21 -3
- data/frontends/default/views/on_action_update.js.rjs +1 -1
- data/frontends/default/views/on_create.js.rjs +30 -13
- data/frontends/default/views/on_update.js.rjs +19 -6
- data/init.rb +6 -0
- data/lib/active_scaffold/actions/core.rb +32 -12
- data/lib/active_scaffold/actions/create.rb +4 -11
- data/lib/active_scaffold/actions/delete.rb +16 -13
- data/lib/active_scaffold/actions/list.rb +58 -2
- data/lib/active_scaffold/actions/mark.rb +1 -1
- data/lib/active_scaffold/actions/nested.rb +24 -15
- data/lib/active_scaffold/actions/show.rb +10 -3
- data/lib/active_scaffold/actions/update.rb +10 -3
- data/lib/{active_record_permissions.rb → active_scaffold/active_record_permissions.rb} +0 -0
- data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/calendar_date_select/lib/as_cds_bridge.rb +8 -4
- data/lib/active_scaffold/bridges/carrierwave/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/lib/list_ui.rb +1 -1
- data/lib/active_scaffold/config/base.rb +8 -0
- data/lib/active_scaffold/config/core.rb +2 -15
- data/lib/active_scaffold/config/create.rb +8 -0
- data/lib/active_scaffold/config/delete.rb +10 -1
- data/lib/active_scaffold/config/field_search.rb +1 -0
- data/lib/active_scaffold/config/form.rb +2 -1
- data/lib/active_scaffold/config/nested.rb +3 -2
- data/lib/active_scaffold/config/search.rb +1 -0
- data/lib/active_scaffold/config/show.rb +1 -0
- data/lib/active_scaffold/config/update.rb +8 -0
- data/lib/active_scaffold/constraints.rb +9 -4
- data/lib/active_scaffold/data_structures/action_columns.rb +1 -1
- data/lib/active_scaffold/data_structures/action_link.rb +10 -1
- data/lib/active_scaffold/data_structures/action_links.rb +62 -22
- data/lib/active_scaffold/data_structures/column.rb +17 -13
- data/lib/active_scaffold/data_structures/nested_info.rb +21 -6
- data/lib/active_scaffold/finder.rb +2 -1
- data/lib/active_scaffold/helpers/association_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/controller_helpers.rb +57 -10
- data/lib/active_scaffold/helpers/form_column_helpers.rb +12 -8
- data/lib/active_scaffold/helpers/id_helpers.rb +5 -9
- data/lib/active_scaffold/helpers/list_column_helpers.rb +26 -28
- data/lib/active_scaffold/helpers/search_column_helpers.rb +8 -3
- data/lib/active_scaffold/helpers/view_helpers.rb +60 -19
- data/lib/active_scaffold/locale/de.rb +13 -6
- data/lib/active_scaffold/locale/en.rb +2 -1
- data/lib/active_scaffold/locale/es.yml +3 -0
- data/lib/active_scaffold/locale/fr.rb +5 -2
- data/lib/active_scaffold/locale/ru.yml +77 -20
- data/lib/active_scaffold/marked_model.rb +5 -5
- data/lib/{paginator.rb → active_scaffold/paginator.rb} +0 -0
- data/lib/{responds_to_parent.rb → active_scaffold/responds_to_parent.rb} +0 -0
- data/lib/active_scaffold/version.rb +9 -0
- data/lib/active_scaffold.rb +60 -84
- data/lib/active_scaffold_assets.rb +45 -0
- data/lib/active_scaffold_env.rb +14 -0
- data/lib/active_scaffold_vho.rb +2 -0
- data/lib/extensions/active_association_reflection.rb +13 -0
- data/lib/extensions/paginator_extensions.rb +1 -1
- data/lib/extensions/routing_mapper.rb +1 -1
- data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +12 -4
- metadata +85 -68
- data/lib/dhtml_confirm.rb +0 -54
File without changes
|
@@ -3,13 +3,12 @@ ActiveScaffold::Config::Core.class_eval do
|
|
3
3
|
initialize_without_ancestry(model_id)
|
4
4
|
|
5
5
|
return unless self.model.respond_to? :ancestry_column
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
6
|
+
|
7
|
+
self.columns << :parent_id
|
8
|
+
self.columns[:parent_id].form_ui = :ancestry
|
9
|
+
update.columns.exclude :ancestry
|
10
|
+
create.columns.exclude :ancestry, :parent_id
|
11
|
+
list.columns.exclude :ancestry, :parent_id
|
13
12
|
end
|
14
13
|
|
15
14
|
alias_method_chain :initialize, :ancestry
|
@@ -20,6 +19,8 @@ module ActiveScaffold
|
|
20
19
|
module FormColumnHelpers
|
21
20
|
def active_scaffold_input_ancestry(column, options)
|
22
21
|
select_options = []
|
22
|
+
select_control_options = {:selected => @record.parent_id}
|
23
|
+
select_control_options[:include_blank] = as_(:_select_) if @record.parent_id.nil?
|
23
24
|
traverse_ancestry = proc do|key, value|
|
24
25
|
unless key == @record
|
25
26
|
select_options << ["#{'__' * key.depth}#{key.to_label}", key.id]
|
@@ -27,7 +28,7 @@ module ActiveScaffold
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
@record.class.arrange.each(&traverse_ancestry)
|
30
|
-
select(:record, :ancestry, select_options,
|
31
|
+
select(:record, :ancestry, select_options, select_control_options, options)
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
@@ -44,7 +44,7 @@ module ActiveScaffold
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
require
|
47
|
+
require File.join(File.dirname(__FILE__), 'shared', 'date_bridge.rb')
|
48
48
|
Dir[File.join(File.dirname(__FILE__), "*/bridge.rb")].each{|bridge_require|
|
49
49
|
require bridge_require
|
50
50
|
}
|
@@ -49,14 +49,18 @@ module ActiveScaffold
|
|
49
49
|
end
|
50
50
|
|
51
51
|
module ViewHelpers
|
52
|
+
def self.included(base)
|
53
|
+
base.alias_method_chain :active_scaffold_stylesheets, :calendar_date_select
|
54
|
+
base.alias_method_chain :active_scaffold_javascripts, :calendar_date_select
|
55
|
+
end
|
52
56
|
# Provides stylesheets to include with +stylesheet_link_tag+
|
53
|
-
def
|
54
|
-
|
57
|
+
def active_scaffold_stylesheets_with_calendar_date_select(frontend = :default)
|
58
|
+
active_scaffold_stylesheets_without_calendar_date_select + [calendar_date_select_stylesheets]
|
55
59
|
end
|
56
60
|
|
57
61
|
# Provides stylesheets to include with +stylesheet_link_tag+
|
58
|
-
def
|
59
|
-
|
62
|
+
def active_scaffold_javascripts_with_calendar_date_select(frontend = :default)
|
63
|
+
active_scaffold_javascripts_without_calendar_date_select + [calendar_date_select_javascripts]
|
60
64
|
end
|
61
65
|
end
|
62
66
|
end
|
@@ -2,8 +2,8 @@ ActiveScaffold::Bridges.bridge "CarrierWave" do
|
|
2
2
|
install do
|
3
3
|
require File.join(File.dirname(__FILE__), "lib/form_ui")
|
4
4
|
require File.join(File.dirname(__FILE__), "lib/list_ui")
|
5
|
-
require File.join(File.dirname(__FILE__), "lib/carrierwave_bridge")
|
6
5
|
require File.join(File.dirname(__FILE__), "lib/carrierwave_bridge_helpers")
|
6
|
+
require File.join(File.dirname(__FILE__), "lib/carrierwave_bridge")
|
7
7
|
ActiveScaffold::Config::Core.send :include, ActiveScaffold::Bridges::Carrierwave::Lib::CarrierwaveBridge
|
8
8
|
end
|
9
9
|
end
|
@@ -5,8 +5,8 @@ ActiveScaffold::Bridges.bridge "Paperclip" do
|
|
5
5
|
end
|
6
6
|
require File.join(File.dirname(__FILE__), "lib/form_ui")
|
7
7
|
require File.join(File.dirname(__FILE__), "lib/list_ui")
|
8
|
-
require File.join(File.dirname(__FILE__), "lib/paperclip_bridge")
|
9
8
|
require File.join(File.dirname(__FILE__), "lib/paperclip_bridge_helpers")
|
9
|
+
require File.join(File.dirname(__FILE__), "lib/paperclip_bridge")
|
10
10
|
ActiveScaffold::Config::Core.send :include, ActiveScaffold::Bridges::Paperclip::Lib::PaperclipBridge
|
11
11
|
end
|
12
12
|
end
|
@@ -17,12 +17,20 @@ module ActiveScaffold::Config
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
20
21
|
# delegate
|
21
22
|
def crud_type; self.class.crud_type end
|
22
23
|
|
23
24
|
# the user property gets set to the instantiation of the local UserSettings class during the automatic instantiation of this class.
|
24
25
|
attr_accessor :user
|
25
26
|
|
27
|
+
# define a default action_group for this action
|
28
|
+
# e.g. 'members.crud'
|
29
|
+
class_inheritable_accessor :action_group
|
30
|
+
|
31
|
+
# action_group this action should belong to
|
32
|
+
attr_accessor :action_group
|
33
|
+
|
26
34
|
class UserSettings
|
27
35
|
def initialize(conf, storage, params)
|
28
36
|
# the session hash relevant to this action
|
@@ -58,6 +58,7 @@ module ActiveScaffold::Config
|
|
58
58
|
|
59
59
|
# lets you specify whether add a create link for each sti child
|
60
60
|
cattr_accessor :sti_create_links
|
61
|
+
@@sti_create_links = true
|
61
62
|
|
62
63
|
# instance-level configuration
|
63
64
|
# ----------------------------
|
@@ -151,21 +152,7 @@ module ActiveScaffold::Config
|
|
151
152
|
self.columns[column].form_ui ||= :select
|
152
153
|
self.columns[column].options ||= {}
|
153
154
|
self.columns[column].options[:options] = self.sti_children.collect do |model_name|
|
154
|
-
[model_name.to_s.camelize.constantize.
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
# To be called after include action modules
|
160
|
-
def _add_sti_create_links
|
161
|
-
new_action_link = @action_links['new']
|
162
|
-
unless new_action_link.nil?
|
163
|
-
@action_links.delete('new')
|
164
|
-
self.sti_children.each do |child|
|
165
|
-
new_sti_link = Marshal.load(Marshal.dump(new_action_link)) # deep clone
|
166
|
-
new_sti_link.label = as_(:create_model, :model => child.to_s.camelize.constantize.human_name)
|
167
|
-
new_sti_link.parameters = {model.inheritance_column => child}
|
168
|
-
@action_links.add(new_sti_link)
|
155
|
+
[model_name.to_s.camelize.constantize.model_name.human, model_name.to_s.camelize]
|
169
156
|
end
|
170
157
|
end
|
171
158
|
end
|
@@ -5,6 +5,7 @@ module ActiveScaffold::Config
|
|
5
5
|
super
|
6
6
|
self.persistent = self.class.persistent
|
7
7
|
self.edit_after_create = self.class.edit_after_create
|
8
|
+
self.refresh_list = self.class.refresh_list
|
8
9
|
end
|
9
10
|
|
10
11
|
# global level configuration
|
@@ -26,6 +27,10 @@ module ActiveScaffold::Config
|
|
26
27
|
cattr_accessor :edit_after_create
|
27
28
|
@@edit_after_create = false
|
28
29
|
|
30
|
+
# whether we should refresh list after create or not
|
31
|
+
cattr_accessor :refresh_list
|
32
|
+
@@refresh_list = false
|
33
|
+
|
29
34
|
# instance-level configuration
|
30
35
|
# ----------------------------
|
31
36
|
# the label= method already exists in the Form base class
|
@@ -39,5 +44,8 @@ module ActiveScaffold::Config
|
|
39
44
|
|
40
45
|
# whether the form stays open after a create or not
|
41
46
|
attr_accessor :edit_after_create
|
47
|
+
|
48
|
+
# whether we should refresh list after create or not
|
49
|
+
attr_accessor :refresh_list
|
42
50
|
end
|
43
51
|
end
|
@@ -7,6 +7,8 @@ module ActiveScaffold::Config
|
|
7
7
|
|
8
8
|
# start with the ActionLink defined globally
|
9
9
|
@link = self.class.link.clone
|
10
|
+
@action_group = self.class.action_group.clone if self.class.action_group
|
11
|
+
self.refresh_list = self.class.refresh_list
|
10
12
|
end
|
11
13
|
|
12
14
|
# global level configuration
|
@@ -14,12 +16,19 @@ module ActiveScaffold::Config
|
|
14
16
|
|
15
17
|
# the ActionLink for this action
|
16
18
|
cattr_accessor :link
|
17
|
-
@@link = ActiveScaffold::DataStructures::ActionLink.new('
|
19
|
+
@@link = ActiveScaffold::DataStructures::ActionLink.new('destroy', :label => :delete, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :crud_type => :delete, :position => false, :parameters => {:destroy_action => true}, :security_method => :delete_authorized?)
|
20
|
+
|
21
|
+
# whether we should refresh list after destroy or not
|
22
|
+
cattr_accessor :refresh_list
|
23
|
+
@@refresh_list = false
|
18
24
|
|
19
25
|
# instance-level configuration
|
20
26
|
# ----------------------------
|
21
27
|
|
22
28
|
# the ActionLink for this action
|
23
29
|
attr_accessor :link
|
30
|
+
|
31
|
+
# whether we should refresh list after destroy or not
|
32
|
+
attr_accessor :refresh_list
|
24
33
|
end
|
25
34
|
end
|
@@ -4,7 +4,8 @@ module ActiveScaffold::Config
|
|
4
4
|
@core = core_config
|
5
5
|
|
6
6
|
# start with the ActionLink defined globally
|
7
|
-
@link = self.class.link.clone
|
7
|
+
@link = self.class.link.clone unless self.class.link.nil?
|
8
|
+
@action_group = self.class.action_group.clone if self.class.action_group
|
8
9
|
|
9
10
|
# no global setting here because multipart should only be set for specific forms
|
10
11
|
@multipart = false
|
@@ -5,6 +5,7 @@ module ActiveScaffold::Config
|
|
5
5
|
def initialize(core_config)
|
6
6
|
@core = core_config
|
7
7
|
self.shallow_delete = self.class.shallow_delete
|
8
|
+
@action_group = self.class.action_group.clone if self.class.action_group
|
8
9
|
end
|
9
10
|
|
10
11
|
# global level configuration
|
@@ -22,7 +23,7 @@ module ActiveScaffold::Config
|
|
22
23
|
unless column.nil? || column.association.nil?
|
23
24
|
options.reverse_merge! :security_method => :nested_authorized?, :label => column.association.klass.model_name.human({:count => 2, :default => column.association.klass.name.pluralize})
|
24
25
|
action_link = @core.link_for_association(column, options)
|
25
|
-
@core.action_links.
|
26
|
+
@core.action_links.add_to_group(action_link, action_group) unless action_link.nil?
|
26
27
|
else
|
27
28
|
|
28
29
|
end
|
@@ -30,7 +31,7 @@ module ActiveScaffold::Config
|
|
30
31
|
|
31
32
|
def add_scoped_link(named_scope, options = {})
|
32
33
|
action_link = @core.link_for_association_as_scope(named_scope.to_sym, options)
|
33
|
-
@core.action_links.
|
34
|
+
@core.action_links.add_to_group(action_link, action_group) unless action_link.nil?
|
34
35
|
end
|
35
36
|
|
36
37
|
# the label for this Nested action. used for the header.
|
@@ -4,6 +4,7 @@ module ActiveScaffold::Config
|
|
4
4
|
def initialize(*args)
|
5
5
|
super
|
6
6
|
self.nested_links = self.class.nested_links
|
7
|
+
self.refresh_list = self.class.refresh_list
|
7
8
|
end
|
8
9
|
|
9
10
|
# global level configuration
|
@@ -17,6 +18,10 @@ module ActiveScaffold::Config
|
|
17
18
|
end
|
18
19
|
@@link = ActiveScaffold::DataStructures::ActionLink.new('edit', :label => :edit, :type => :member, :security_method => :update_authorized?)
|
19
20
|
|
21
|
+
# whether we should refresh list after update or not
|
22
|
+
cattr_accessor :refresh_list
|
23
|
+
@@refresh_list = false
|
24
|
+
|
20
25
|
# instance-level configuration
|
21
26
|
# ----------------------------
|
22
27
|
|
@@ -34,5 +39,8 @@ module ActiveScaffold::Config
|
|
34
39
|
@hide_nested_column.nil? ? true : @hide_nested_column
|
35
40
|
end
|
36
41
|
|
42
|
+
# whether we should refresh list after update or not
|
43
|
+
attr_accessor :refresh_list
|
44
|
+
|
37
45
|
end
|
38
46
|
end
|
@@ -120,10 +120,15 @@ module ActiveScaffold
|
|
120
120
|
|
121
121
|
condition = constraint_condition_for("#{table}.#{field}", value)
|
122
122
|
if association.options[:polymorphic]
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
123
|
+
begin
|
124
|
+
parent_scaffold = "#{session_info[:parent_scaffold].to_s.camelize}Controller".constantize
|
125
|
+
condition = merge_conditions(
|
126
|
+
condition,
|
127
|
+
constraint_condition_for("#{table}.#{association.name}_type", parent_scaffold.active_scaffold_config.model_id.to_s)
|
128
|
+
)
|
129
|
+
rescue ActiveScaffold::ControllerNotFound
|
130
|
+
nil
|
131
|
+
end
|
127
132
|
end
|
128
133
|
|
129
134
|
condition
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module ActiveScaffold::DataStructures
|
2
2
|
# A set of columns. These structures can be nested for organization.
|
3
|
-
class ActionColumns < Set
|
3
|
+
class ActionColumns < ActiveScaffold::DataStructures::Set
|
4
4
|
include ActiveScaffold::Configurable
|
5
5
|
|
6
6
|
# this lets us refer back to the action responsible for this link, if it exists.
|
@@ -29,7 +29,16 @@ module ActiveScaffold::DataStructures
|
|
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_writer :controller
|
33
|
+
|
34
|
+
def controller
|
35
|
+
@controller = @controller.call if @controller.is_a?(Proc)
|
36
|
+
@controller
|
37
|
+
end
|
38
|
+
|
39
|
+
def static_controller?
|
40
|
+
!(@controller.is_a?(Proc) || (@controller == :polymorph))
|
41
|
+
end
|
33
42
|
|
34
43
|
# a hash of request parameters
|
35
44
|
attr_accessor :parameters
|
@@ -4,6 +4,7 @@ module ActiveScaffold::DataStructures
|
|
4
4
|
|
5
5
|
def initialize
|
6
6
|
@set = []
|
7
|
+
@name = :root
|
7
8
|
end
|
8
9
|
|
9
10
|
# adds an ActionLink, creating one from the arguments if need be
|
@@ -16,7 +17,10 @@ module ActiveScaffold::DataStructures
|
|
16
17
|
# NOTE: this duplicate check should be done by defining the comparison operator for an Action data structure
|
17
18
|
existing = find_duplicate(link)
|
18
19
|
unless existing
|
19
|
-
|
20
|
+
# That s for backwards compatibility if we are in root of action_links
|
21
|
+
# we have to move actionlink into members or collection subgroup
|
22
|
+
group = (name == :root ? subgroup(link.type, link.type) : self)
|
23
|
+
group.add_to_set(link)
|
20
24
|
link
|
21
25
|
else
|
22
26
|
existing
|
@@ -28,41 +32,72 @@ module ActiveScaffold::DataStructures
|
|
28
32
|
@set << link
|
29
33
|
end
|
30
34
|
|
35
|
+
# adds a link to a specific group
|
36
|
+
# groups are represented as a string separated by a dot
|
37
|
+
# eg member.crud
|
38
|
+
def add_to_group(link, group = nil)
|
39
|
+
add_to = root
|
40
|
+
add_to = group.split('.').inject(root){|group, group_name| group.send(group_name)} if group
|
41
|
+
add_to << link unless link.nil?
|
42
|
+
end
|
43
|
+
|
31
44
|
# finds an ActionLink by matching the action
|
32
45
|
def [](val)
|
33
|
-
|
46
|
+
links = []
|
47
|
+
@set.each do |item|
|
34
48
|
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
35
|
-
item[val]
|
49
|
+
collected = item[val]
|
50
|
+
links << collected unless collected.nil?
|
36
51
|
else
|
37
|
-
item.action == val.to_s
|
52
|
+
links << item if item.action == val.to_s
|
38
53
|
end
|
39
54
|
end
|
55
|
+
links.first
|
40
56
|
end
|
41
57
|
|
42
58
|
def find_duplicate(link)
|
43
|
-
|
59
|
+
links = []
|
60
|
+
@set.each do |item|
|
44
61
|
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
45
|
-
item.find_duplicate(link)
|
62
|
+
collected = item.find_duplicate(link)
|
63
|
+
links << collected unless collected.nil?
|
46
64
|
else
|
47
|
-
item.action == link.action and item.controller == link.controller and item.parameters == link.parameters
|
65
|
+
links << item if item.action == link.action and item.static_controller? && item.controller == link.controller and item.parameters == link.parameters
|
48
66
|
end
|
49
67
|
end
|
68
|
+
links.first
|
50
69
|
end
|
51
70
|
|
52
71
|
def delete(val)
|
53
|
-
|
54
|
-
if
|
55
|
-
|
56
|
-
else
|
57
|
-
item.action == val.to_s
|
72
|
+
self.each({:include_set => true}) do |link, set|
|
73
|
+
if link.action == val.to_s
|
74
|
+
set.delete_if {|item| item.is_a?(ActiveScaffold::DataStructures::ActionLink) && item.action == val.to_s}
|
58
75
|
end
|
59
76
|
end
|
60
77
|
end
|
61
78
|
|
79
|
+
def delete_group(name)
|
80
|
+
@set.each do |group|
|
81
|
+
if group.name == name
|
82
|
+
@set.delete_if {|item| item.is_a?(ActiveScaffold::DataStructures::ActionLinks) && item.name == name}
|
83
|
+
else
|
84
|
+
group.delete_group(name)
|
85
|
+
end if group.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
62
89
|
# iterates over the links, possibly by type
|
63
|
-
def each(
|
90
|
+
def each(options = {}, &block)
|
64
91
|
@set.each {|item|
|
65
|
-
|
92
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
93
|
+
item.each(options, &block)
|
94
|
+
else
|
95
|
+
if options[:include_set]
|
96
|
+
yield item, @set
|
97
|
+
else
|
98
|
+
yield item
|
99
|
+
end
|
100
|
+
end
|
66
101
|
}
|
67
102
|
end
|
68
103
|
|
@@ -74,19 +109,24 @@ module ActiveScaffold::DataStructures
|
|
74
109
|
|
75
110
|
def traverse(controller, options = {}, &block)
|
76
111
|
traverse_method = options.delete(:reverse).nil? ? :each : :reverse_each
|
112
|
+
options[:level] ||= -1
|
113
|
+
options[:level] += 1
|
114
|
+
first_action = true
|
77
115
|
@set.send(traverse_method) do |link|
|
78
116
|
if link.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
elsif controller.nil? || !skip_action_link(controller, link, options[:
|
117
|
+
unless link.empty?
|
118
|
+
yield(link, nil, {:node => :start_traversing, :first_action => first_action, :level => options[:level]})
|
119
|
+
link.traverse(controller,options, &block)
|
120
|
+
yield(link, nil, {:node => :finished_traversing, :first_action => first_action, :level => options[:level]})
|
121
|
+
first_action = false
|
122
|
+
end
|
123
|
+
elsif controller.nil? || !skip_action_link(controller, link, *(Array(options[:for])))
|
86
124
|
authorized = options[:for].nil? ? true : options[:for].authorized_for?(:crud_type => link.crud_type, :action => link.action)
|
87
|
-
yield(self, link, {:authorized => authorized})
|
125
|
+
yield(self, link, {:authorized => authorized, :first_action => first_action, :level => options[:level]})
|
126
|
+
first_action = false
|
88
127
|
end
|
89
128
|
end
|
129
|
+
options[:level] -= 1
|
90
130
|
end
|
91
131
|
|
92
132
|
def collect
|
@@ -114,22 +114,14 @@ module ActiveScaffold::DataStructures
|
|
114
114
|
@options ||= {}
|
115
115
|
end
|
116
116
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
# set an action_link to nested list or inline form in this column
|
121
|
-
def autolink?
|
122
|
-
@autolink
|
123
|
-
end
|
124
|
-
|
125
|
-
# this should not only delete any existing link but also prevent column links from being automatically added by later routines
|
126
|
-
def clear_link
|
127
|
-
@link = nil
|
128
|
-
@autolink = false
|
117
|
+
def link
|
118
|
+
@link = @link.call(self) if @link.is_a? Proc
|
119
|
+
@link
|
129
120
|
end
|
130
121
|
|
122
|
+
# associate an action_link with this column
|
131
123
|
def set_link(action, options = {})
|
132
|
-
if action.is_a?
|
124
|
+
if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || (action.is_a? Proc)
|
133
125
|
@link = action
|
134
126
|
else
|
135
127
|
options[:label] ||= self.label
|
@@ -139,6 +131,17 @@ module ActiveScaffold::DataStructures
|
|
139
131
|
end
|
140
132
|
end
|
141
133
|
|
134
|
+
# set an action_link to nested list or inline form in this column
|
135
|
+
def autolink?
|
136
|
+
@autolink
|
137
|
+
end
|
138
|
+
|
139
|
+
# this should not only delete any existing link but also prevent column links from being automatically added by later routines
|
140
|
+
def clear_link
|
141
|
+
@link = nil
|
142
|
+
@autolink = false
|
143
|
+
end
|
144
|
+
|
142
145
|
# define a calculation for the column. anything that ActiveRecord::Calculations::ClassMethods#calculate accepts will do.
|
143
146
|
attr_accessor :calculate
|
144
147
|
|
@@ -267,6 +270,7 @@ module ActiveScaffold::DataStructures
|
|
267
270
|
@actions_for_association_links = self.class.actions_for_association_links.clone if @association
|
268
271
|
@options = {:format => :i18n_number} if @column.try(:number?)
|
269
272
|
@form_ui = :checkbox if @column and @column.type == :boolean
|
273
|
+
@form_ui = :textarea if @column and @column.type == :text
|
270
274
|
@allow_add_existing = true
|
271
275
|
@form_ui = self.class.association_form_ui if @association && self.class.association_form_ui
|
272
276
|
|
@@ -5,20 +5,27 @@ module ActiveScaffold::DataStructures
|
|
5
5
|
nil
|
6
6
|
else
|
7
7
|
session_info = session_storage[:nested].clone
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
begin
|
9
|
+
session_info[:parent_scaffold] = "#{session_info[:parent_scaffold].to_s.camelize}Controller".constantize
|
10
|
+
session_info[:parent_model] = session_info[:parent_scaffold].active_scaffold_config.model
|
11
|
+
session_info[:association] = session_info[:parent_model].reflect_on_association(session_info[:name])
|
12
|
+
unless session_info[:association].nil?
|
13
|
+
ActiveScaffold::DataStructures::NestedInfoAssociation.new(model, session_info)
|
14
|
+
else
|
15
|
+
ActiveScaffold::DataStructures::NestedInfoScope.new(model, session_info)
|
16
|
+
end
|
17
|
+
rescue ActiveScaffold::ControllerNotFound
|
18
|
+
nil
|
13
19
|
end
|
14
20
|
end
|
15
21
|
end
|
16
22
|
|
17
|
-
attr_accessor :association, :child_association, :parent_model, :parent_id, :constrained_fields, :scope
|
23
|
+
attr_accessor :association, :child_association, :parent_model, :parent_scaffold, :parent_id, :constrained_fields, :scope
|
18
24
|
|
19
25
|
def initialize(model, session_info)
|
20
26
|
@parent_model = session_info[:parent_model]
|
21
27
|
@parent_id = session_info[:parent_id]
|
28
|
+
@parent_scaffold = session_info[:parent_scaffold]
|
22
29
|
end
|
23
30
|
|
24
31
|
def new_instance?
|
@@ -39,6 +46,10 @@ module ActiveScaffold::DataStructures
|
|
39
46
|
false
|
40
47
|
end
|
41
48
|
|
49
|
+
def has_one?
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
42
53
|
def readonly?
|
43
54
|
false
|
44
55
|
end
|
@@ -63,6 +74,10 @@ module ActiveScaffold::DataStructures
|
|
63
74
|
association.belongs_to?
|
64
75
|
end
|
65
76
|
|
77
|
+
def has_one?
|
78
|
+
association.macro == :has_one
|
79
|
+
end
|
80
|
+
|
66
81
|
def readonly?
|
67
82
|
if association.options.has_key? :readonly
|
68
83
|
association.options[:readonly]
|
@@ -125,7 +125,7 @@ module ActiveScaffold
|
|
125
125
|
native = '.'
|
126
126
|
delimiter = I18n.t('number.format.delimiter')
|
127
127
|
separator = I18n.t('number.format.separator')
|
128
|
-
|
128
|
+
return value if value.blank? || !value.is_a?(String)
|
129
129
|
unless delimiter == native && !value.include?(separator) && value !~ /\.\d{3}$/
|
130
130
|
value.gsub(/[^0-9\-#{I18n.t('number.format.separator')}]/, '').gsub(I18n.t('number.format.separator'), native)
|
131
131
|
else
|
@@ -292,6 +292,7 @@ module ActiveScaffold
|
|
292
292
|
def append_to_query(query, options)
|
293
293
|
options.assert_valid_keys :where, :select, :group, :order, :limit, :offset, :joins, :includes, :lock, :readonly, :from
|
294
294
|
options.reject{|k, v| v.blank?}.inject(query) do |query, (k, v)|
|
295
|
+
query = query.except(:order) if k.to_sym == :order
|
295
296
|
query.send((k.to_sym), v)
|
296
297
|
end
|
297
298
|
end
|
@@ -3,11 +3,11 @@ module ActiveScaffold
|
|
3
3
|
module AssociationHelpers
|
4
4
|
# Provides a way to honor the :conditions on an association while searching the association's klass
|
5
5
|
def association_options_find(association, conditions = nil)
|
6
|
-
association.klass.where(
|
6
|
+
association.klass.where(conditions).where(association.options[:conditions]).all
|
7
7
|
end
|
8
8
|
|
9
9
|
def association_options_count(association, conditions = nil)
|
10
|
-
association.klass.where(
|
10
|
+
association.klass.where(conditions).where(association.options[:conditions]).count
|
11
11
|
end
|
12
12
|
|
13
13
|
# returns options for the given association as a collection of [id, label] pairs intended for the +options_for_select+ helper.
|