active_scaffold 3.4.17 → 3.4.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +12 -1
- data/README.md +8 -4
- data/app/assets/javascripts/jquery/active_scaffold.js +82 -67
- data/app/assets/stylesheets/active_scaffold.scss +1 -1
- data/app/assets/stylesheets/active_scaffold_colors.scss +1 -1
- data/app/assets/stylesheets/blue-theme.css +1 -1
- data/app/views/active_scaffold_overrides/_form_association.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
- data/lib/active_scaffold.rb +16 -16
- data/lib/active_scaffold/actions/common_search.rb +13 -11
- data/lib/active_scaffold/actions/core.rb +85 -78
- data/lib/active_scaffold/actions/create.rb +29 -28
- data/lib/active_scaffold/actions/delete.rb +17 -17
- data/lib/active_scaffold/actions/field_search.rb +18 -19
- data/lib/active_scaffold/actions/list.rb +30 -22
- data/lib/active_scaffold/actions/mark.rb +1 -1
- data/lib/active_scaffold/actions/nested.rb +78 -65
- data/lib/active_scaffold/actions/search.rb +13 -10
- data/lib/active_scaffold/actions/show.rb +10 -6
- data/lib/active_scaffold/actions/subform.rb +1 -2
- data/lib/active_scaffold/actions/update.rb +39 -31
- data/lib/active_scaffold/active_record_permissions.rb +14 -15
- data/lib/active_scaffold/attribute_params.rb +42 -43
- data/lib/active_scaffold/bridges.rb +22 -12
- data/lib/active_scaffold/bridges/ancestry.rb +1 -1
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +6 -6
- data/lib/active_scaffold/bridges/bitfields.rb +1 -1
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -13
- data/lib/active_scaffold/bridges/calendar_date_select.rb +5 -5
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +17 -20
- data/lib/active_scaffold/bridges/cancan.rb +1 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +8 -9
- data/lib/active_scaffold/bridges/carrierwave.rb +4 -4
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +7 -6
- data/lib/active_scaffold/bridges/chosen.rb +1 -1
- data/lib/active_scaffold/bridges/chosen/helpers.rb +4 -4
- data/lib/active_scaffold/bridges/country_helper.rb +1 -1
- data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +259 -260
- data/lib/active_scaffold/bridges/date_picker.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker/ext.rb +9 -11
- data/lib/active_scaffold/bridges/date_picker/helper.rb +61 -67
- data/lib/active_scaffold/bridges/dragonfly.rb +4 -4
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -5
- data/lib/active_scaffold/bridges/file_column.rb +5 -5
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +20 -23
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +20 -23
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +13 -14
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +7 -8
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +18 -22
- data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +5 -4
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +2 -10
- data/lib/active_scaffold/bridges/paper_trail.rb +7 -5
- data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +4 -3
- data/lib/active_scaffold/bridges/paperclip.rb +5 -5
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +6 -5
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +10 -9
- data/lib/active_scaffold/bridges/record_select.rb +1 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +28 -28
- data/lib/active_scaffold/bridges/semantic_attributes.rb +1 -1
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +1 -1
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +58 -52
- data/lib/active_scaffold/bridges/tiny_mce.rb +2 -2
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -3
- data/lib/active_scaffold/config/base.rb +9 -10
- data/lib/active_scaffold/config/core.rb +24 -29
- data/lib/active_scaffold/config/create.rb +0 -1
- data/lib/active_scaffold/config/field_search.rb +8 -10
- data/lib/active_scaffold/config/form.rb +5 -5
- data/lib/active_scaffold/config/list.rb +21 -20
- data/lib/active_scaffold/config/mark.rb +3 -3
- data/lib/active_scaffold/config/nested.rb +11 -10
- data/lib/active_scaffold/config/search.rb +2 -3
- data/lib/active_scaffold/config/show.rb +1 -1
- data/lib/active_scaffold/config/update.rb +1 -2
- data/lib/active_scaffold/configurable.rb +9 -11
- data/lib/active_scaffold/constraints.rb +9 -8
- data/lib/active_scaffold/core.rb +72 -84
- data/lib/active_scaffold/data_structures/action_columns.rb +26 -25
- data/lib/active_scaffold/data_structures/action_link.rb +43 -43
- data/lib/active_scaffold/data_structures/action_links.rb +17 -15
- data/lib/active_scaffold/data_structures/actions.rb +5 -5
- data/lib/active_scaffold/data_structures/bridge.rb +6 -3
- data/lib/active_scaffold/data_structures/column.rb +110 -89
- data/lib/active_scaffold/data_structures/columns.rb +3 -3
- data/lib/active_scaffold/data_structures/error_message.rb +4 -6
- data/lib/active_scaffold/data_structures/nested_info.rb +43 -48
- data/lib/active_scaffold/data_structures/set.rb +7 -8
- data/lib/active_scaffold/data_structures/sorting.rb +38 -33
- data/lib/active_scaffold/delayed_setup.rb +5 -6
- data/lib/active_scaffold/engine.rb +4 -4
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +3 -4
- data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +5 -6
- data/lib/active_scaffold/extensions/left_outer_joins.rb +11 -11
- data/lib/active_scaffold/extensions/localize.rb +1 -1
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +1 -1
- data/lib/active_scaffold/extensions/paginator_extensions.rb +2 -5
- data/lib/active_scaffold/extensions/reverse_associations.rb +13 -13
- data/lib/active_scaffold/extensions/routing_mapper.rb +9 -9
- data/lib/active_scaffold/extensions/unsaved_associated.rb +9 -9
- data/lib/active_scaffold/finder.rb +90 -93
- data/lib/active_scaffold/helpers/association_helpers.rb +5 -5
- data/lib/active_scaffold/helpers/controller_helpers.rb +22 -19
- data/lib/active_scaffold/helpers/form_column_helpers.rb +115 -105
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -35
- data/lib/active_scaffold/helpers/id_helpers.rb +6 -6
- data/lib/active_scaffold/helpers/list_column_helpers.rb +89 -94
- data/lib/active_scaffold/helpers/pagination_helpers.rb +9 -9
- data/lib/active_scaffold/helpers/search_column_helpers.rb +47 -44
- data/lib/active_scaffold/helpers/show_column_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/view_helpers.rb +86 -91
- data/lib/active_scaffold/marked_model.rb +10 -10
- data/lib/active_scaffold/paginator.rb +30 -34
- data/lib/active_scaffold/responds_to_parent.rb +27 -28
- data/lib/active_scaffold/tableless.rb +20 -15
- data/lib/active_scaffold/version.rb +1 -1
- data/lib/generators/active_scaffold/active_scaffold_generator.rb +8 -8
- data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +9 -9
- data/shoulda_macros/macros.rb +27 -22
- data/test/bridges/bridge_test.rb +38 -29
- data/test/bridges/date_picker_test.rb +1 -1
- data/test/bridges/paper_trail_test.rb +17 -0
- data/test/bridges/paperclip_test.rb +3 -2
- data/test/bridges/tiny_mce_test.rb +5 -2
- data/test/company.rb +25 -30
- data/test/config/base_test.rb +1 -1
- data/test/config/core_test.rb +9 -9
- data/test/config/create_test.rb +14 -8
- data/test/config/delete_test.rb +4 -4
- data/test/config/field_search_test.rb +6 -6
- data/test/config/list_test.rb +16 -16
- data/test/config/nested_test.rb +4 -4
- data/test/config/search_test.rb +8 -8
- data/test/config/show_test.rb +6 -6
- data/test/config/subform_test.rb +1 -1
- data/test/config/update_test.rb +5 -5
- data/test/const_mocker.rb +4 -4
- data/test/data_structures/action_columns_test.rb +4 -5
- data/test/data_structures/action_link_test.rb +1 -0
- data/test/data_structures/action_links_test.rb +5 -5
- data/test/data_structures/column_test.rb +9 -9
- data/test/data_structures/columns_test.rb +2 -2
- data/test/data_structures/error_message_test.rb +4 -5
- data/test/data_structures/set_test.rb +1 -2
- data/test/data_structures/sorting_test.rb +10 -10
- data/test/data_structures/validation_reflection_test.rb +8 -0
- data/test/extensions/routing_mapper_test.rb +2 -2
- data/test/helpers/list_column_helpers_test.rb +3 -2
- data/test/helpers/pagination_helpers_test.rb +5 -4
- data/test/helpers/search_column_helpers_test.rb +1 -1
- data/test/misc/active_record_permissions_test.rb +63 -50
- data/test/misc/attribute_params_test.rb +28 -26
- data/test/misc/calculation_test.rb +10 -3
- data/test/misc/configurable_test.rb +12 -13
- data/test/misc/constraints_test.rb +6 -6
- data/test/misc/convert_numbers_format_test.rb +7 -6
- data/test/misc/finder_test.rb +17 -12
- data/test/misc/lang_test.rb +3 -4
- data/test/misc/tableless_test.rb +2 -3
- data/test/mock_app/app/controllers/addresses_controller.rb +1 -1
- data/test/mock_app/app/controllers/buildings_controller.rb +1 -1
- data/test/mock_app/app/controllers/cars_controller.rb +1 -1
- data/test/mock_app/app/controllers/contacts_controller.rb +1 -1
- data/test/mock_app/app/controllers/people_controller.rb +1 -1
- data/test/mock_app/app/models/file_model.rb +2 -2
- data/test/mock_app/app/models/person.rb +1 -1
- data/test/mock_app/config/application.rb +3 -3
- data/test/mock_app/config/boot.rb +1 -1
- data/test/mock_app/config/environment.rb +1 -0
- data/test/mock_app/config/environments/development.rb +0 -1
- data/test/mock_app/config/environments/production.rb +1 -1
- data/test/mock_app/db/schema.rb +14 -15
- data/test/model_stub.rb +13 -16
- data/test/run_all.rb +5 -7
- data/test/test_helper.rb +12 -9
- metadata +19 -3
@@ -12,9 +12,11 @@ module ActiveScaffold::DataStructures
|
|
12
12
|
def label
|
13
13
|
as_(@label) if @label
|
14
14
|
end
|
15
|
+
|
15
16
|
def name
|
16
17
|
@label.to_s.underscore
|
17
18
|
end
|
19
|
+
|
18
20
|
def css_class
|
19
21
|
@label.to_s.underscore
|
20
22
|
end
|
@@ -23,7 +25,7 @@ module ActiveScaffold::DataStructures
|
|
23
25
|
def ==(other) #:nodoc:
|
24
26
|
# another ActionColumns
|
25
27
|
if other.class == self.class
|
26
|
-
|
28
|
+
label == other.label
|
27
29
|
else
|
28
30
|
@label.to_s == other.to_s
|
29
31
|
end
|
@@ -31,28 +33,28 @@ module ActiveScaffold::DataStructures
|
|
31
33
|
|
32
34
|
# Whether this column set is collapsed by default in contexts where collapsing is supported
|
33
35
|
attr_accessor :collapsed
|
34
|
-
|
36
|
+
|
35
37
|
# nests a subgroup in the column set
|
36
38
|
def add_subgroup(label, &proc)
|
37
39
|
columns = ActiveScaffold::DataStructures::ActionColumns.new
|
38
40
|
columns.label = label
|
39
|
-
columns.action =
|
40
|
-
columns.configure
|
41
|
-
|
42
|
-
|
41
|
+
columns.action = action
|
42
|
+
columns.configure(&proc)
|
43
|
+
exclude columns.collect_columns
|
44
|
+
add columns
|
43
45
|
end
|
44
46
|
|
45
47
|
def include?(item)
|
46
48
|
@set.each do |c|
|
47
|
-
return true if !c.is_a?
|
49
|
+
return true if !c.is_a?(Symbol) && c.include?(item)
|
48
50
|
return true if c == item.to_sym
|
49
51
|
end
|
50
|
-
|
52
|
+
false
|
51
53
|
end
|
52
54
|
|
53
55
|
def names
|
54
56
|
if @columns
|
55
|
-
|
57
|
+
collect_visible(:flatten => true) { |c| c.name }
|
56
58
|
else
|
57
59
|
names_without_auth_check
|
58
60
|
end
|
@@ -87,35 +89,34 @@ module ActiveScaffold::DataStructures
|
|
87
89
|
end
|
88
90
|
end
|
89
91
|
end
|
90
|
-
|
92
|
+
|
91
93
|
def collect_visible(options = {}, &proc)
|
92
94
|
columns = []
|
93
95
|
options[:for] ||= @columns.active_record_class
|
94
96
|
self.unauthorized_columns = []
|
95
97
|
@set.each do |item|
|
96
|
-
unless item.is_a?
|
98
|
+
unless item.is_a?(ActiveScaffold::DataStructures::ActionColumns) || @columns.nil?
|
97
99
|
item = (@columns[item] || ActiveScaffold::DataStructures::Column.new(item.to_sym, @columns.active_record_class))
|
98
100
|
next if self.skip_column?(item, options)
|
99
101
|
end
|
100
|
-
if item.is_a?
|
102
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionColumns) && options.key?(:flatten) && options[:flatten]
|
101
103
|
columns += item.collect_visible(options, &proc)
|
102
104
|
else
|
103
105
|
columns << (block_given? ? yield(item) : item)
|
104
106
|
end
|
105
107
|
end
|
106
108
|
columns
|
107
|
-
end
|
108
|
-
|
109
|
+
end
|
110
|
+
|
109
111
|
def skip_column?(column, options)
|
110
|
-
result = false
|
111
112
|
# skip if this matches a constrained column
|
112
|
-
|
113
|
+
return true if constraint_columns.include?(column.name.to_sym)
|
113
114
|
# skip this field if it's not authorized
|
114
|
-
unless options[:for].authorized_for?(:action => options[:action], :crud_type => options[:crud_type] ||
|
115
|
-
|
116
|
-
|
115
|
+
unless options[:for].authorized_for?(:action => options[:action], :crud_type => options[:crud_type] || action.try(:crud_type) || :read, :column => column.name)
|
116
|
+
unauthorized_columns << column.name.to_sym
|
117
|
+
return true
|
117
118
|
end
|
118
|
-
|
119
|
+
false
|
119
120
|
end
|
120
121
|
|
121
122
|
# registers a set of column objects (recursively, for all nested ActionColumns)
|
@@ -139,25 +140,25 @@ module ActiveScaffold::DataStructures
|
|
139
140
|
Thread.current[:constraint_columns] ||= {}
|
140
141
|
Thread.current[:constraint_columns][constraint_columns_key] = columns
|
141
142
|
end
|
142
|
-
|
143
|
+
|
143
144
|
def constraint_columns
|
144
145
|
constraints = Thread.current[:constraint_columns]
|
145
146
|
(constraints[constraint_columns_key] if constraints) || []
|
146
147
|
end
|
147
|
-
|
148
|
+
|
148
149
|
attr_writer :unauthorized_columns
|
149
150
|
def unauthorized_columns
|
150
151
|
@unauthorized_columns ||= []
|
151
152
|
end
|
152
|
-
|
153
|
+
|
153
154
|
def length
|
154
|
-
((@set -
|
155
|
+
((@set - constraint_columns) - unauthorized_columns).length
|
155
156
|
end
|
156
157
|
|
157
158
|
protected
|
158
159
|
|
159
160
|
def collect_columns
|
160
|
-
@set.collect {|col| col.is_a?(ActiveScaffold::DataStructures::ActionColumns) ? col.collect_columns : col}
|
161
|
+
@set.collect { |col| col.is_a?(ActiveScaffold::DataStructures::ActionColumns) ? col.collect_columns : col }
|
161
162
|
end
|
162
163
|
|
163
164
|
# called during clone or dup. makes the clone/dup deeper.
|
@@ -21,14 +21,14 @@ module ActiveScaffold::DataStructures
|
|
21
21
|
# apply quick properties
|
22
22
|
options.each_pair do |k, v|
|
23
23
|
setter = "#{k}="
|
24
|
-
|
24
|
+
send(setter, v) if self.respond_to? setter
|
25
25
|
end
|
26
26
|
self.toggle = self.action.try(:to_sym) == :index && (parameters.present? || dynamic_parameters) unless options.include? :toggle
|
27
27
|
end
|
28
28
|
|
29
29
|
def initialize_copy(action_link)
|
30
|
-
self.parameters =
|
31
|
-
self.html_options =
|
30
|
+
self.parameters = parameters.clone if action_link.instance_variable_get(:@parameters)
|
31
|
+
self.html_options = html_options.clone if action_link.instance_variable_get(:@html_options)
|
32
32
|
end
|
33
33
|
|
34
34
|
# the weight for this link in the action links collection, it will be used to sort the collection
|
@@ -36,7 +36,7 @@ module ActiveScaffold::DataStructures
|
|
36
36
|
|
37
37
|
# the action-path for this link. what page to request? this is required!
|
38
38
|
attr_accessor :action
|
39
|
-
|
39
|
+
|
40
40
|
# the controller for this action link. if nil, the current controller should be assumed.
|
41
41
|
attr_writer :controller
|
42
42
|
|
@@ -71,7 +71,7 @@ module ActiveScaffold::DataStructures
|
|
71
71
|
def label
|
72
72
|
@label.is_a?(Symbol) ? as_(@label) : @label
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
# image to use {:name => 'arrow.png', :size => '16x16'}
|
76
76
|
attr_accessor :image
|
77
77
|
|
@@ -80,21 +80,24 @@ module ActiveScaffold::DataStructures
|
|
80
80
|
@dhtml_confirm = nil if value
|
81
81
|
@confirm = value
|
82
82
|
end
|
83
|
+
|
83
84
|
def confirm(label = '')
|
84
85
|
@confirm.is_a?(String) ? @confirm : as_(@confirm, :label => label)
|
85
86
|
end
|
87
|
+
|
86
88
|
def confirm?
|
87
|
-
|
89
|
+
@confirm.present?
|
88
90
|
end
|
89
|
-
|
91
|
+
|
90
92
|
# if the action uses a DHTML based (i.e. 2-phase) confirmation
|
91
93
|
attr_accessor :dhtml_confirm
|
92
94
|
def dhtml_confirm=(value)
|
93
95
|
@confirm = nil if value
|
94
96
|
@dhtml_confirm = value
|
95
97
|
end
|
98
|
+
|
96
99
|
def dhtml_confirm?
|
97
|
-
|
100
|
+
@dhtml_confirm.present?
|
98
101
|
end
|
99
102
|
|
100
103
|
# what method to call on the controller to see if this action_link should be visible
|
@@ -102,20 +105,20 @@ module ActiveScaffold::DataStructures
|
|
102
105
|
# note that this is only the UI part of the security. to prevent URL hax0rz, you also need security on requests (e.g. don't execute update method unless authorized).
|
103
106
|
attr_writer :security_method
|
104
107
|
def security_method
|
105
|
-
@security_method || "#{
|
108
|
+
@security_method || "#{action}_authorized?"
|
106
109
|
end
|
107
110
|
|
108
111
|
def security_method_set?
|
109
|
-
|
112
|
+
@security_method.present?
|
110
113
|
end
|
111
114
|
|
112
115
|
# enable it to refresh the parent row when the view is closed
|
113
116
|
attr_accessor :refresh_on_close
|
114
|
-
|
117
|
+
|
115
118
|
# what method to call on the controller to see if this action_link should be visible
|
116
119
|
# if method return true, link won't be displayed
|
117
120
|
attr_accessor :ignore_method
|
118
|
-
|
121
|
+
|
119
122
|
# the crud type of the (eventual?) action. different than :method, because this crud action may not be imminent.
|
120
123
|
# this is used to determine record-level authorization (e.g. record.authorized_for?(:crud_type => link.crud_type).
|
121
124
|
# options are :create, :read, :update, and :delete
|
@@ -127,38 +130,37 @@ module ActiveScaffold::DataStructures
|
|
127
130
|
@inline = (val == true)
|
128
131
|
self.popup = self.page = false if @inline
|
129
132
|
end
|
130
|
-
|
133
|
+
|
134
|
+
def inline?
|
135
|
+
@inline
|
136
|
+
end
|
131
137
|
|
132
138
|
# a "popup" link displays in a separate (browser?) window. this will eventually take arguments.
|
133
139
|
# exclusive with inline? and page?
|
134
140
|
def popup=(val)
|
135
141
|
@popup = (val == true)
|
136
|
-
|
137
|
-
|
142
|
+
return unless @popup
|
143
|
+
self.inline = self.page = false
|
138
144
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
145
|
+
# the :method parameter doesn't mix with the :popup parameter
|
146
|
+
# when/if we start using DHTML popups, we can bring :method back
|
147
|
+
self.method = nil
|
148
|
+
end
|
149
|
+
|
150
|
+
def popup?
|
151
|
+
@popup
|
143
152
|
end
|
144
|
-
def popup?; @popup end
|
145
153
|
|
146
154
|
# a "page" link displays by reloading the current page
|
147
155
|
# exclusive with inline? and popup?
|
148
156
|
def page=(val)
|
149
157
|
@page = (val == true)
|
150
|
-
if @page
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
# we only ever need to know @method = :get for things that default to POST.
|
156
|
-
# the only things that default to POST are forms and ajax calls.
|
157
|
-
# when @page = true, we don't use ajax.
|
158
|
-
self.method = nil if method == :get
|
159
|
-
end
|
158
|
+
self.inline = self.popup = false if @page
|
159
|
+
end
|
160
|
+
|
161
|
+
def page?
|
162
|
+
@page
|
160
163
|
end
|
161
|
-
def page?; @page end
|
162
164
|
|
163
165
|
# where the result of this action should insert in the display.
|
164
166
|
# for :type => :collection, supported values are:
|
@@ -173,10 +175,10 @@ module ActiveScaffold::DataStructures
|
|
173
175
|
# false (no attempt at positioning)
|
174
176
|
attr_writer :position
|
175
177
|
def position
|
176
|
-
return @position unless @position.nil?
|
177
|
-
return :replace if
|
178
|
-
return :top if
|
179
|
-
raise "what should the default position be for #{
|
178
|
+
return @position unless @position.nil? || @position == true
|
179
|
+
return :replace if type == :member
|
180
|
+
return :top if type == :collection
|
181
|
+
raise "what should the default position be for #{type}?"
|
180
182
|
end
|
181
183
|
|
182
184
|
# what type of link this is. currently supported values are :collection and :member.
|
@@ -187,25 +189,23 @@ module ActiveScaffold::DataStructures
|
|
187
189
|
def html_options
|
188
190
|
@html_options ||= {}
|
189
191
|
end
|
190
|
-
|
192
|
+
|
191
193
|
# nested action_links are referencing a column
|
192
194
|
attr_accessor :column
|
193
|
-
|
194
|
-
# don't close the panel when another action link is open
|
195
|
+
|
196
|
+
# don't close the panel when another action link is open
|
195
197
|
attr_writer :keep_open
|
196
198
|
def keep_open?
|
197
199
|
@keep_open
|
198
200
|
end
|
199
|
-
|
201
|
+
|
200
202
|
# indicates that this a nested_link
|
201
203
|
def nested_link?
|
202
204
|
@column || (parameters && parameters[:named_scope])
|
203
205
|
end
|
204
|
-
|
206
|
+
|
205
207
|
def name_to_cache
|
206
|
-
@name_to_cache ||= "#{controller || 'self'}_#{type}_#{action}#{'_' if parameters.present?}#{parameters.map{|k,v| "#{k}=#{v.is_a?(Array) ? v.join(',') : v}"}.join('_')}"
|
208
|
+
@name_to_cache ||= "#{controller || 'self'}_#{type}_#{action}#{'_' if parameters.present?}#{parameters.map { |k, v| "#{k}=#{v.is_a?(Array) ? v.join(',') : v}" }.join('_')}"
|
207
209
|
end
|
208
|
-
|
209
|
-
|
210
210
|
end
|
211
211
|
end
|
@@ -11,22 +11,24 @@ module ActiveScaffold::DataStructures
|
|
11
11
|
|
12
12
|
# adds an ActionLink, creating one from the arguments if need be
|
13
13
|
def add(action, options = {})
|
14
|
-
link =
|
15
|
-
action
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
link =
|
15
|
+
if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || action.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
16
|
+
action
|
17
|
+
else
|
18
|
+
options[:type] ||= default_type if default_type
|
19
|
+
ActiveScaffold::DataStructures::ActionLink.new(action, options)
|
20
|
+
end
|
20
21
|
# NOTE: this duplicate check should be done by defining the comparison operator for an Action data structure
|
21
22
|
existing = find_duplicate(link)
|
22
|
-
|
23
|
+
|
24
|
+
if existing
|
25
|
+
existing
|
26
|
+
else
|
23
27
|
# That s for backwards compatibility if we are in root of action_links
|
24
28
|
# we have to move actionlink into members or collection subgroup
|
25
29
|
group = (name == :root ? subgroup(link.type, link.type) : self)
|
26
30
|
group.add_to_set(link)
|
27
31
|
link
|
28
|
-
else
|
29
|
-
existing
|
30
32
|
end
|
31
33
|
end
|
32
34
|
alias_method :<<, :add
|
@@ -38,9 +40,9 @@ module ActiveScaffold::DataStructures
|
|
38
40
|
# adds a link to a specific group
|
39
41
|
# groups are represented as a string separated by a dot
|
40
42
|
# eg member.crud
|
41
|
-
def add_to_group(link,
|
43
|
+
def add_to_group(link, group_name = nil)
|
42
44
|
add_to = root
|
43
|
-
add_to =
|
45
|
+
add_to = group_name.split('.').inject(root) { |group, name| group.send(name) } if group_name
|
44
46
|
add_to << link unless link.nil?
|
45
47
|
end
|
46
48
|
|
@@ -65,14 +67,14 @@ module ActiveScaffold::DataStructures
|
|
65
67
|
collected = item.find_duplicate(link)
|
66
68
|
links << collected unless collected.nil?
|
67
69
|
else
|
68
|
-
links << item if item.action == link.action
|
70
|
+
links << item if item.action == link.action && item.static_controller? && item.controller == link.controller && item.parameters == link.parameters
|
69
71
|
end
|
70
72
|
end
|
71
73
|
links.first
|
72
74
|
end
|
73
75
|
|
74
76
|
def delete(val)
|
75
|
-
|
77
|
+
each(:include_set => true) do |link, set|
|
76
78
|
if link.action.to_s == val.to_s
|
77
79
|
set.delete link
|
78
80
|
break
|
@@ -107,10 +109,10 @@ module ActiveScaffold::DataStructures
|
|
107
109
|
end
|
108
110
|
end
|
109
111
|
end
|
110
|
-
|
112
|
+
|
111
113
|
def collect_by_type(type = nil)
|
112
114
|
links = []
|
113
|
-
subgroup(type).each(type) {|link| links << link}
|
115
|
+
subgroup(type).each(type) { |link| links << link }
|
114
116
|
links
|
115
117
|
end
|
116
118
|
|
@@ -3,11 +3,11 @@ class ActiveScaffold::DataStructures::Actions
|
|
3
3
|
|
4
4
|
def initialize(*args)
|
5
5
|
@set = []
|
6
|
-
|
6
|
+
add *args
|
7
7
|
end
|
8
8
|
|
9
9
|
def exclude(*args)
|
10
|
-
args.collect!
|
10
|
+
args.collect!(&:to_sym) # symbolize the args
|
11
11
|
@set.reject! { |m| args.include? m } # reject all actions specified
|
12
12
|
end
|
13
13
|
|
@@ -17,11 +17,11 @@ class ActiveScaffold::DataStructures::Actions
|
|
17
17
|
alias_method :<<, :add
|
18
18
|
|
19
19
|
def each
|
20
|
-
@set.each {|item| yield item}
|
20
|
+
@set.each { |item| yield item }
|
21
21
|
end
|
22
22
|
|
23
23
|
def include?(val)
|
24
|
-
val.is_a?(Symbol) ? super : @set.any?{|item| item.to_s == val.to_s}
|
24
|
+
val.is_a?(Symbol) ? super : @set.any? { |item| item.to_s == val.to_s }
|
25
25
|
end
|
26
26
|
|
27
27
|
# swaps one element in the list with the other.
|
@@ -42,4 +42,4 @@ class ActiveScaffold::DataStructures::Actions
|
|
42
42
|
def initialize_copy(from)
|
43
43
|
@set = from.instance_variable_get('@set').clone
|
44
44
|
end
|
45
|
-
end
|
45
|
+
end
|
@@ -1,14 +1,17 @@
|
|
1
1
|
module ActiveScaffold::DataStructures
|
2
2
|
class Bridge
|
3
3
|
def self.install
|
4
|
-
raise
|
4
|
+
raise RunTimeError, "install not defined for bridge #{name}"
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
|
+
def self.prepare
|
8
|
+
end
|
9
|
+
|
7
10
|
# by convention and default, use the bridge name as the required constant for installation
|
8
11
|
def self.install?
|
9
12
|
Object.const_defined? name.demodulize
|
10
13
|
end
|
11
|
-
|
14
|
+
|
12
15
|
def self.run
|
13
16
|
install if install?
|
14
17
|
end
|