active_scaffold 3.0.5 → 3.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/Gemfile +11 -2
- data/Gemfile.lock +20 -0
- data/Rakefile +33 -4
- data/active_scaffold.gemspec +378 -17
- data/frontends/default/images/config.png +0 -0
- data/frontends/default/images/gears.png +0 -0
- data/frontends/default/javascripts/jquery/active_scaffold.js +34 -33
- data/frontends/default/javascripts/jquery/jquery.editinplace.js +21 -4
- data/frontends/default/javascripts/prototype/active_scaffold.js +43 -38
- data/frontends/default/stylesheets/stylesheet.css +110 -35
- data/frontends/default/views/_action_group.html.erb +20 -0
- data/frontends/default/views/_base_form.html.erb +7 -3
- data/frontends/default/views/_create_form.html.erb +5 -3
- data/frontends/default/views/_create_form_on_list.html.erb +2 -1
- data/frontends/default/views/_field_search.html.erb +2 -2
- data/frontends/default/views/_form.html.erb +2 -2
- data/frontends/default/views/_form_messages.html.erb +1 -1
- data/frontends/default/views/_horizontal_subform.html.erb +1 -1
- data/frontends/default/views/_list_actions.html.erb +6 -14
- data/frontends/default/views/_list_header.html.erb +4 -6
- data/frontends/default/views/_list_with_header.html.erb +2 -2
- data/frontends/default/views/_messages.html.erb +2 -2
- data/frontends/default/views/_search.html.erb +2 -2
- data/frontends/default/views/_show.html.erb +1 -1
- data/frontends/default/views/_update_form.html.erb +2 -1
- data/frontends/default/views/_vertical_subform.html.erb +1 -1
- data/frontends/default/views/action_confirmation.html.erb +13 -0
- data/frontends/default/views/add_existing.js.rjs +1 -1
- data/frontends/default/views/destroy.js.rjs +21 -3
- data/frontends/default/views/on_action_update.js.rjs +1 -1
- data/frontends/default/views/on_create.js.rjs +30 -13
- data/frontends/default/views/on_update.js.rjs +19 -6
- data/init.rb +6 -0
- data/lib/active_scaffold/actions/core.rb +32 -12
- data/lib/active_scaffold/actions/create.rb +4 -11
- data/lib/active_scaffold/actions/delete.rb +16 -13
- data/lib/active_scaffold/actions/list.rb +58 -2
- data/lib/active_scaffold/actions/mark.rb +1 -1
- data/lib/active_scaffold/actions/nested.rb +24 -15
- data/lib/active_scaffold/actions/show.rb +10 -3
- data/lib/active_scaffold/actions/update.rb +10 -3
- data/lib/{active_record_permissions.rb → active_scaffold/active_record_permissions.rb} +0 -0
- data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/calendar_date_select/lib/as_cds_bridge.rb +8 -4
- data/lib/active_scaffold/bridges/carrierwave/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/lib/list_ui.rb +1 -1
- data/lib/active_scaffold/config/base.rb +8 -0
- data/lib/active_scaffold/config/core.rb +2 -15
- data/lib/active_scaffold/config/create.rb +8 -0
- data/lib/active_scaffold/config/delete.rb +10 -1
- data/lib/active_scaffold/config/field_search.rb +1 -0
- data/lib/active_scaffold/config/form.rb +2 -1
- data/lib/active_scaffold/config/nested.rb +3 -2
- data/lib/active_scaffold/config/search.rb +1 -0
- data/lib/active_scaffold/config/show.rb +1 -0
- data/lib/active_scaffold/config/update.rb +8 -0
- data/lib/active_scaffold/constraints.rb +9 -4
- data/lib/active_scaffold/data_structures/action_columns.rb +1 -1
- data/lib/active_scaffold/data_structures/action_link.rb +10 -1
- data/lib/active_scaffold/data_structures/action_links.rb +62 -22
- data/lib/active_scaffold/data_structures/column.rb +17 -13
- data/lib/active_scaffold/data_structures/nested_info.rb +21 -6
- data/lib/active_scaffold/finder.rb +2 -1
- data/lib/active_scaffold/helpers/association_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/controller_helpers.rb +57 -10
- data/lib/active_scaffold/helpers/form_column_helpers.rb +12 -8
- data/lib/active_scaffold/helpers/id_helpers.rb +5 -9
- data/lib/active_scaffold/helpers/list_column_helpers.rb +26 -28
- data/lib/active_scaffold/helpers/search_column_helpers.rb +8 -3
- data/lib/active_scaffold/helpers/view_helpers.rb +60 -19
- data/lib/active_scaffold/locale/de.rb +13 -6
- data/lib/active_scaffold/locale/en.rb +2 -1
- data/lib/active_scaffold/locale/es.yml +3 -0
- data/lib/active_scaffold/locale/fr.rb +5 -2
- data/lib/active_scaffold/locale/ru.yml +77 -20
- data/lib/active_scaffold/marked_model.rb +5 -5
- data/lib/{paginator.rb → active_scaffold/paginator.rb} +0 -0
- data/lib/{responds_to_parent.rb → active_scaffold/responds_to_parent.rb} +0 -0
- data/lib/active_scaffold/version.rb +9 -0
- data/lib/active_scaffold.rb +60 -84
- data/lib/active_scaffold_assets.rb +45 -0
- data/lib/active_scaffold_env.rb +14 -0
- data/lib/active_scaffold_vho.rb +2 -0
- data/lib/extensions/active_association_reflection.rb +13 -0
- data/lib/extensions/paginator_extensions.rb +1 -1
- data/lib/extensions/routing_mapper.rb +1 -1
- data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +12 -4
- metadata +85 -68
- data/lib/dhtml_confirm.rb +0 -54
|
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.
|