active_scaffold 3.6.0.pre → 3.6.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{CHANGELOG → CHANGELOG.rdoc} +39 -0
- data/app/assets/javascripts/active_scaffold.js.erb +0 -1
- data/app/assets/javascripts/jquery/active_scaffold.js +35 -4
- data/app/assets/stylesheets/active_scaffold_colors.scss +1 -1
- data/app/assets/stylesheets/active_scaffold_layout.css +52 -29
- data/app/views/active_scaffold_overrides/_list_header.html.erb +5 -7
- data/app/views/active_scaffold_overrides/_list_record.html.erb +4 -5
- data/app/views/active_scaffold_overrides/_list_with_header.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +4 -0
- data/config/locales/de.yml +2 -1
- data/config/locales/en.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/fr.yml +2 -1
- data/config/locales/hu.yml +1 -0
- data/config/locales/ja.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/lib/active_scaffold.rb +8 -3
- data/lib/active_scaffold/actions/common_search.rb +11 -8
- data/lib/active_scaffold/actions/core.rb +79 -51
- data/lib/active_scaffold/actions/create.rb +27 -27
- data/lib/active_scaffold/actions/delete.rb +1 -1
- data/lib/active_scaffold/actions/field_search.rb +52 -42
- data/lib/active_scaffold/actions/list.rb +106 -23
- data/lib/active_scaffold/actions/nested.rb +59 -42
- data/lib/active_scaffold/actions/show.rb +3 -3
- data/lib/active_scaffold/actions/subform.rb +9 -16
- data/lib/active_scaffold/actions/update.rb +95 -77
- data/lib/active_scaffold/attribute_params.rb +93 -68
- data/lib/active_scaffold/bridges/active_storage.rb +6 -0
- data/lib/active_scaffold/bridges/active_storage/active_storage_bridge.rb +33 -0
- data/lib/active_scaffold/bridges/active_storage/active_storage_helpers.rb +54 -0
- data/lib/active_scaffold/bridges/active_storage/form_ui.rb +22 -0
- data/lib/active_scaffold/bridges/active_storage/list_ui.rb +36 -0
- data/lib/active_scaffold/bridges/bitfields.rb +1 -0
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -15
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +6 -0
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker/helper.rb +46 -41
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -2
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +3 -3
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +3 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +2 -2
- data/lib/active_scaffold/bridges/record_select/helpers.rb +3 -7
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +19 -18
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -1
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +20 -3
- data/lib/active_scaffold/config/base.rb +58 -34
- data/lib/active_scaffold/config/core.rb +31 -12
- data/lib/active_scaffold/config/delete.rb +12 -1
- data/lib/active_scaffold/config/list.rb +17 -7
- data/lib/active_scaffold/config/mark.rb +1 -1
- data/lib/active_scaffold/configurable.rb +5 -3
- data/lib/active_scaffold/constraints.rb +21 -19
- data/lib/active_scaffold/core.rb +35 -26
- data/lib/active_scaffold/data_structures/action_columns.rb +1 -1
- data/lib/active_scaffold/data_structures/action_link.rb +34 -16
- data/lib/active_scaffold/data_structures/action_links.rb +9 -11
- data/lib/active_scaffold/data_structures/association/abstract.rb +35 -13
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +2 -6
- data/lib/active_scaffold/data_structures/association/active_record.rb +5 -1
- data/lib/active_scaffold/data_structures/association/mongoid.rb +0 -3
- data/lib/active_scaffold/data_structures/column.rb +49 -58
- data/lib/active_scaffold/data_structures/columns.rb +3 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +20 -18
- data/lib/active_scaffold/data_structures/sorting.rb +5 -0
- data/lib/active_scaffold/delayed_setup.rb +16 -6
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +1 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +34 -14
- data/lib/active_scaffold/extensions/cow_proxy.rb +50 -2
- data/lib/active_scaffold/extensions/localize.rb +3 -1
- data/lib/active_scaffold/extensions/routing_mapper.rb +2 -2
- data/lib/active_scaffold/extensions/to_label.rb +3 -2
- data/lib/active_scaffold/finder.rb +81 -46
- data/lib/active_scaffold/helpers/action_link_helpers.rb +47 -21
- data/lib/active_scaffold/helpers/association_helpers.rb +13 -11
- data/lib/active_scaffold/helpers/controller_helpers.rb +14 -11
- data/lib/active_scaffold/helpers/form_column_helpers.rb +133 -99
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/id_helpers.rb +4 -0
- data/lib/active_scaffold/helpers/list_column_helpers.rb +76 -49
- data/lib/active_scaffold/helpers/pagination_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/search_column_helpers.rb +25 -30
- data/lib/active_scaffold/helpers/show_column_helpers.rb +3 -5
- data/lib/active_scaffold/helpers/view_helpers.rb +31 -22
- data/lib/active_scaffold/orm_checks.rb +2 -2
- data/lib/active_scaffold/paginator.rb +1 -3
- data/lib/active_scaffold/registry.rb +11 -0
- data/lib/active_scaffold/responds_to_parent.rb +6 -5
- data/lib/active_scaffold/tableless.rb +6 -8
- data/lib/active_scaffold/version.rb +1 -1
- data/shoulda_macros/macros.rb +3 -1
- data/test/bridges/paperclip_test.rb +1 -1
- data/test/company.rb +2 -2
- data/test/data_structures/action_columns_test.rb +2 -2
- data/test/data_structures/column_test.rb +3 -6
- data/test/data_structures/columns_test.rb +2 -2
- data/test/extensions/active_record_test.rb +4 -4
- data/test/extensions/routing_mapper_test.rb +2 -2
- data/test/helpers/list_column_helpers_test.rb +3 -1
- data/test/misc/active_record_permissions_test.rb +2 -2
- data/test/misc/attribute_params_test.rb +4 -0
- data/test/misc/configurable_test.rb +10 -10
- data/test/misc/convert_numbers_format_test.rb +4 -0
- data/test/mock_app/app/assets/config/manifest.js +0 -0
- data/test/mock_app/app/controllers/cars_controller.rb +1 -0
- data/test/mock_app/app/controllers/people_controller.rb +3 -1
- data/test/mock_app/config/application.rb +1 -0
- data/test/mock_app/config/routes.rb +4 -1
- data/test/mock_app/db/schema.rb +2 -0
- data/test/performance/list_cars_performance_test.rb +34 -0
- data/test/performance/list_people_performance_test.rb +31 -0
- data/test/performance_test_help.rb +3 -0
- data/test/test_helper.rb +2 -1
- metadata +22 -12
- data/app/assets/javascripts/prototype/rico_corner.js +0 -370
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +0 -5
@@ -11,7 +11,7 @@ module ActiveScaffold::Config
|
|
11
11
|
attr_accessor :mark_all_mode
|
12
12
|
|
13
13
|
def initialize(core_config)
|
14
|
-
|
14
|
+
super
|
15
15
|
@mark_all_mode = self.class.mark_all_mode
|
16
16
|
@core.model.send(:include, ActiveScaffold::MarkedModel) unless @core.model < ActiveScaffold::MarkedModel
|
17
17
|
add_mark_column
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module ActiveScaffold
|
2
|
-
# Exposes a +configure+ method that accepts a block and runs all contents of the block in two contexts,
|
2
|
+
# Exposes a +configure+ method that accepts a block and runs all contents of the block in two contexts,
|
3
|
+
# as opposed to the normal one. First, everything gets evaluated as part of the object including Configurable.
|
4
|
+
# Then, as a failover, missing methods and variables are evaluated in the original binding of the block.
|
3
5
|
#
|
4
6
|
# Note that this only works with "barewords". Constants, instance variables, and class variables are not currently supported in both contexts.
|
5
7
|
#
|
@@ -22,8 +24,8 @@ module ActiveScaffold
|
|
22
24
|
end
|
23
25
|
|
24
26
|
def respond_to_missing?(name, include_all = false)
|
25
|
-
if @configuration_binding
|
26
|
-
@configuration_binding
|
27
|
+
if defined? @configuration_binding
|
28
|
+
@configuration_binding&.respond_to?(name, include_all)
|
27
29
|
else
|
28
30
|
super
|
29
31
|
end
|
@@ -61,15 +61,7 @@ module ActiveScaffold
|
|
61
61
|
|
62
62
|
# association column constraint
|
63
63
|
elsif column.association
|
64
|
-
|
65
|
-
active_scaffold_habtm_joins.concat column.includes
|
66
|
-
elsif !column.association.polymorphic?
|
67
|
-
if column.association.belongs_to?
|
68
|
-
active_scaffold_preload.concat column.includes
|
69
|
-
else
|
70
|
-
active_scaffold_references.concat column.includes
|
71
|
-
end
|
72
|
-
end
|
64
|
+
join_from_association_constraint(column)
|
73
65
|
hash_conditions.deep_merge!(condition_from_association_constraint(column.association, v))
|
74
66
|
|
75
67
|
# regular column constraints
|
@@ -78,7 +70,7 @@ module ActiveScaffold
|
|
78
70
|
conditions << [column.search_sql.collect { |search_sql| "#{search_sql} = ?" }.join(' OR '), *([v] * column.search_sql.size)]
|
79
71
|
end
|
80
72
|
# unknown-to-activescaffold-but-real-database-column constraint
|
81
|
-
elsif active_scaffold_config.
|
73
|
+
elsif active_scaffold_config._columns_hash[k.to_s] && params[column.name] != v
|
82
74
|
hash_conditions.deep_merge!(k => v)
|
83
75
|
else
|
84
76
|
raise ActiveScaffold::MalformedConstraint, constraint_error(active_scaffold_config.model, k), caller
|
@@ -87,6 +79,18 @@ module ActiveScaffold
|
|
87
79
|
conditions.reject(&:blank?)
|
88
80
|
end
|
89
81
|
|
82
|
+
def join_from_association_constraint(column)
|
83
|
+
if column.association.habtm?
|
84
|
+
active_scaffold_habtm_joins.concat column.includes
|
85
|
+
elsif !column.association.polymorphic?
|
86
|
+
if column.association.belongs_to?
|
87
|
+
active_scaffold_preload.concat column.includes
|
88
|
+
else
|
89
|
+
active_scaffold_references.concat column.includes
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
90
94
|
# We do NOT want to use .search_sql. If anything, search_sql will refer
|
91
95
|
# to a human-searchable value on the associated record.
|
92
96
|
def condition_from_association_constraint(association, value)
|
@@ -96,17 +100,15 @@ module ActiveScaffold
|
|
96
100
|
#
|
97
101
|
# please see the relevant tests for concrete examples.
|
98
102
|
|
99
|
-
field =
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
+
field =
|
104
|
+
if association.belongs_to?
|
105
|
+
association.foreign_key
|
106
|
+
else
|
107
|
+
association.klass.primary_key
|
103
108
|
end
|
104
109
|
|
105
110
|
table = association.belongs_to? ? active_scaffold_config.model.table_name : association.table_name
|
106
|
-
|
107
|
-
if association.primary_key
|
108
|
-
value = association.klass.find(value).send(association.primary_key)
|
109
|
-
end
|
111
|
+
value = association.klass.find(value).send(association.primary_key) if association.primary_key
|
110
112
|
|
111
113
|
if association.polymorphic?
|
112
114
|
unless value.is_a?(Array) && value.size == 2
|
@@ -151,7 +153,7 @@ module ActiveScaffold
|
|
151
153
|
raise ActiveScaffold::MalformedConstraint, polymorphic_constraint_error(column.association), caller
|
152
154
|
end
|
153
155
|
record.send("#{k}=", v[0].constantize.find(v[1]))
|
154
|
-
|
156
|
+
elsif !column.association.source_reflection&.options&.include?(:through) # regular singular association, or one-level through association
|
155
157
|
record.send("#{k}=", column.association.klass.find(v))
|
156
158
|
|
157
159
|
# setting the belongs_to side of a has_one isn't safe. if the has_one was already
|
data/lib/active_scaffold/core.rb
CHANGED
@@ -7,20 +7,21 @@ module ActiveScaffold
|
|
7
7
|
def setup_user_settings
|
8
8
|
config = self.class.active_scaffold_config
|
9
9
|
config.new_user_settings(user_settings_storage, params)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
10
|
+
return if ActiveScaffold.threadsafe
|
11
|
+
config.actions.each do |action_name|
|
12
|
+
conf_instance = config.send(action_name) rescue next # rubocop:disable Style/RescueModifier
|
13
|
+
config.user.action_user_settings(conf_instance)
|
15
14
|
end
|
16
15
|
end
|
17
16
|
|
18
17
|
def active_scaffold_config
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
@active_scaffold_config ||= begin
|
19
|
+
setup_user_settings unless self.class.active_scaffold_config.user
|
20
|
+
if ActiveScaffold.threadsafe
|
21
|
+
self.class.active_scaffold_config.user
|
22
|
+
else
|
23
|
+
self.class.active_scaffold_config
|
24
|
+
end
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -60,7 +61,13 @@ module ActiveScaffold
|
|
60
61
|
active_scaffold_superclasses_blocks.each { |superblock| active_scaffold_config.configure(&superblock) }
|
61
62
|
active_scaffold_config.sti_children = nil # reset sti_children if set in parent block
|
62
63
|
active_scaffold_config.configure(&block) if block_given?
|
63
|
-
active_scaffold_config.
|
64
|
+
active_scaffold_config.class.after_config_callbacks.each do |callback|
|
65
|
+
if callback.is_a?(Proc)
|
66
|
+
callback.call
|
67
|
+
elsif active_scaffold_config.respond_to?(callback)
|
68
|
+
active_scaffold_config.send(callback)
|
69
|
+
end
|
70
|
+
end
|
64
71
|
|
65
72
|
# defines the attribute read methods on the model, so record.send() doesn't find protected/private methods instead
|
66
73
|
# define_attribute_methods is safe to call multiple times since rails 4.0.4
|
@@ -90,10 +97,9 @@ module ActiveScaffold
|
|
90
97
|
end
|
91
98
|
end
|
92
99
|
_add_sti_create_links if active_scaffold_config.add_sti_create_links?
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end
|
100
|
+
return unless ActiveScaffold.threadsafe
|
101
|
+
active_scaffold_config._cache_lazy_values
|
102
|
+
active_scaffold_config.deep_freeze!
|
97
103
|
end
|
98
104
|
|
99
105
|
module Prefixes
|
@@ -122,7 +128,8 @@ module ActiveScaffold
|
|
122
128
|
end
|
123
129
|
end
|
124
130
|
|
125
|
-
# Create the automatic column links. Note that this has to happen when configuration is *done*,
|
131
|
+
# Create the automatic column links. Note that this has to happen when configuration is *done*,
|
132
|
+
# because otherwise the Nested module could be disabled. Actually, it could still be disabled later, couldn't it?
|
126
133
|
def links_for_associations
|
127
134
|
return unless active_scaffold_config.actions.include?(:list) && active_scaffold_config.actions.include?(:nested)
|
128
135
|
active_scaffold_config.columns.each do |column|
|
@@ -157,10 +164,13 @@ module ActiveScaffold
|
|
157
164
|
else
|
158
165
|
actions = controller.active_scaffold_config.actions unless controller == :polymorph
|
159
166
|
actions ||= %i[create update show]
|
160
|
-
column.actions_for_association_links
|
161
|
-
|
162
|
-
|
163
|
-
|
167
|
+
controller_actions = column.actions_for_association_links
|
168
|
+
controller_actions = controller_actions.dup if controller_actions.frozen?
|
169
|
+
controller_actions.delete :new unless actions.include? :create
|
170
|
+
controller_actions.delete :edit unless actions.include? :update
|
171
|
+
controller_actions.delete :show unless actions.include? :show
|
172
|
+
options.merge!(html_options: {class: column.name}, controller_actions: Set.new(controller_actions))
|
173
|
+
ActiveScaffold::DataStructures::ActionLink.new(nil, options)
|
164
174
|
end
|
165
175
|
end
|
166
176
|
|
@@ -230,12 +240,9 @@ module ActiveScaffold
|
|
230
240
|
controller = "#{namespace}#{controller_name.camelize}Controller".constantize
|
231
241
|
rescue NameError => error
|
232
242
|
# Only rescue NameError associated with the controller constant not existing - not other compile errors
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
else
|
237
|
-
raise
|
238
|
-
end
|
243
|
+
raise unless error.message["uninitialized constant #{controller}"]
|
244
|
+
error_message << "#{namespace}#{controller_name.camelize}Controller"
|
245
|
+
next
|
239
246
|
end
|
240
247
|
raise ActiveScaffold::ControllerNotFound, "#{controller} missing ActiveScaffold", caller unless controller.uses_active_scaffold?
|
241
248
|
unless controller.active_scaffold_config.model.to_s == klass.to_s
|
@@ -258,10 +265,12 @@ module ActiveScaffold
|
|
258
265
|
end
|
259
266
|
|
260
267
|
def self.mongoid_column_type_cast(value, column)
|
268
|
+
return Time.zone.at(value.to_i) if value =~ /\A\d+\z/ && [Time, DateTime].include?(column.type)
|
261
269
|
column.type.evolve value
|
262
270
|
end
|
263
271
|
|
264
272
|
def self.active_record_column_type_cast(value, column)
|
273
|
+
return Time.zone.at(value.to_i) if value =~ /\A\d+\z/ && %i[time datetime].include?(column.type)
|
265
274
|
if Rails.version < '5.0'
|
266
275
|
column.type_cast_from_user value
|
267
276
|
elsif column.type.respond_to? :cast # jruby-jdbc and rails 5
|
@@ -68,7 +68,7 @@ module ActiveScaffold::DataStructures
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def each_column(options = {}, &proc)
|
71
|
-
columns = action.core.columns
|
71
|
+
columns = options[:core_columns] || action.core.columns
|
72
72
|
self.unauthorized_columns = []
|
73
73
|
options[:for] ||= columns.active_record_class
|
74
74
|
|
@@ -5,27 +5,33 @@ module ActiveScaffold::DataStructures
|
|
5
5
|
# provides a quick way to set any property of the object from a hash
|
6
6
|
def initialize(action, options = {})
|
7
7
|
# set defaults
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
@action = action
|
9
|
+
@label = action
|
10
|
+
@confirm = false
|
11
|
+
@type = :collection
|
12
|
+
@method = :get
|
13
|
+
@crud_type =
|
14
|
+
case action&.to_sym
|
15
|
+
when :destroy then :delete
|
16
|
+
when :create, :new then :create
|
17
|
+
when :update, :edit then :update
|
18
|
+
else :read
|
19
|
+
end
|
20
|
+
@column = nil
|
21
|
+
@image = nil
|
22
|
+
@controller = nil
|
23
|
+
@parameters = nil
|
24
|
+
@dynamic_parameters = nil
|
25
|
+
@html_options = nil
|
26
|
+
@weight = 0
|
12
27
|
self.inline = true
|
13
|
-
self.method = :get
|
14
|
-
self.crud_type = :delete if [:destroy].include?(action&.to_sym)
|
15
|
-
self.crud_type = :create if %i[create new].include?(action&.to_sym)
|
16
|
-
self.crud_type = :update if %i[edit update].include?(action&.to_sym)
|
17
|
-
self.crud_type ||= :read
|
18
|
-
self.column = nil
|
19
|
-
self.image = nil
|
20
|
-
self.dynamic_parameters = nil
|
21
|
-
self.weight = 0
|
22
28
|
|
23
29
|
# apply quick properties
|
24
30
|
options.each_pair do |k, v|
|
25
31
|
setter = "#{k}="
|
26
32
|
send(setter, v) if respond_to? setter
|
27
33
|
end
|
28
|
-
self.toggle = self.action&.to_sym == :index && (parameters.present? || dynamic_parameters) unless options.include? :toggle
|
34
|
+
self.toggle = self.action&.to_sym == :index && !position && (parameters.present? || dynamic_parameters) unless options.include? :toggle
|
29
35
|
end
|
30
36
|
|
31
37
|
def initialize_copy(action_link)
|
@@ -72,7 +78,7 @@ module ActiveScaffold::DataStructures
|
|
72
78
|
# what string to use to represent this action
|
73
79
|
attr_writer :label
|
74
80
|
def label
|
75
|
-
@label.is_a?(Symbol) ? as_(@label) : @label
|
81
|
+
@label.is_a?(Symbol) ? ActiveScaffold::Registry.cache(:translations, @label) { as_(@label) } : @label
|
76
82
|
end
|
77
83
|
|
78
84
|
# image to use {:name => 'arrow.png', :size => '16x16'}
|
@@ -85,7 +91,8 @@ module ActiveScaffold::DataStructures
|
|
85
91
|
end
|
86
92
|
|
87
93
|
def confirm(label = '')
|
88
|
-
@confirm
|
94
|
+
return @confirm if !confirm? || @confirm.is_a?(String)
|
95
|
+
ActiveScaffold::Registry.cache(:translations, @confirm) { as_(@confirm) } % {label: label}
|
89
96
|
end
|
90
97
|
|
91
98
|
def confirm?
|
@@ -202,6 +209,11 @@ module ActiveScaffold::DataStructures
|
|
202
209
|
@keep_open
|
203
210
|
end
|
204
211
|
|
212
|
+
# for links in singular associations, copied from
|
213
|
+
# column.actions_for_association_links, excluding
|
214
|
+
# actions not available in association's controller
|
215
|
+
attr_accessor :controller_actions
|
216
|
+
|
205
217
|
# indicates that this a nested_link
|
206
218
|
def nested_link?
|
207
219
|
@column || parameters&.dig(:named_scope)
|
@@ -218,5 +230,11 @@ module ActiveScaffold::DataStructures
|
|
218
230
|
@name_to_cache = name_to_cache unless frozen?
|
219
231
|
end
|
220
232
|
end
|
233
|
+
|
234
|
+
def freeze
|
235
|
+
# force generating cache_key, except for column's link without action, or polymorphic associations
|
236
|
+
name_to_cache if action && !column&.association&.polymorphic?
|
237
|
+
super
|
238
|
+
end
|
221
239
|
end
|
222
240
|
end
|
@@ -53,8 +53,8 @@ module ActiveScaffold::DataStructures
|
|
53
53
|
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
54
54
|
collected = item[val]
|
55
55
|
links << collected unless collected.nil?
|
56
|
-
|
57
|
-
links << item
|
56
|
+
elsif item.action.to_s == val.to_s
|
57
|
+
links << item
|
58
58
|
end
|
59
59
|
end
|
60
60
|
links.first
|
@@ -66,8 +66,8 @@ module ActiveScaffold::DataStructures
|
|
66
66
|
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
67
67
|
collected = item.find_duplicate(link)
|
68
68
|
links << collected unless collected.nil?
|
69
|
-
|
70
|
-
links << item
|
69
|
+
elsif item.action == link.action && item.static_controller? && item.controller == link.controller && item.parameters == link.parameters
|
70
|
+
links << item
|
71
71
|
end
|
72
72
|
end
|
73
73
|
links.first
|
@@ -100,12 +100,10 @@ module ActiveScaffold::DataStructures
|
|
100
100
|
@set.sort_by(&:weight).send(method) do |item|
|
101
101
|
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks) && !options[:groups]
|
102
102
|
item.each(options, &block)
|
103
|
+
elsif options[:include_set]
|
104
|
+
yield item, @set
|
103
105
|
else
|
104
|
-
|
105
|
-
yield item, @set
|
106
|
-
else
|
107
|
-
yield item
|
108
|
-
end
|
106
|
+
yield item
|
109
107
|
end
|
110
108
|
end
|
111
109
|
end
|
@@ -147,13 +145,13 @@ module ActiveScaffold::DataStructures
|
|
147
145
|
|
148
146
|
def method_missing(name, *args, &block)
|
149
147
|
return super if name =~ /[!?]$/
|
150
|
-
class_eval
|
148
|
+
class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
151
149
|
def #{name}(label = nil) # rubocop:disable Style/CommentedKeyword
|
152
150
|
@#{name} ||= subgroup('#{name}'.to_sym, label)
|
153
151
|
yield @#{name} if block_given?
|
154
152
|
@#{name}
|
155
153
|
end
|
156
|
-
|
154
|
+
METHOD
|
157
155
|
send(name, args.first, &block)
|
158
156
|
end
|
159
157
|
|
@@ -10,19 +10,26 @@ module ActiveScaffold::DataStructures::Association
|
|
10
10
|
!polymorphic?
|
11
11
|
end
|
12
12
|
|
13
|
-
def klass
|
14
|
-
|
13
|
+
def klass(record = nil)
|
14
|
+
if polymorphic?
|
15
|
+
record&.send(foreign_type)&.constantize
|
16
|
+
else
|
17
|
+
@association.klass
|
18
|
+
end
|
19
|
+
rescue NameError => e
|
20
|
+
Rails.logger.warn "#{e.message}\n#{e.backtrace.join("\n")}"
|
21
|
+
nil
|
15
22
|
end
|
16
23
|
|
17
24
|
def belongs_to?
|
18
25
|
@association.macro == :belongs_to
|
19
26
|
end
|
20
27
|
|
21
|
-
def has_one?
|
28
|
+
def has_one? # rubocop:disable Naming/PredicateName
|
22
29
|
@association.macro == :has_one
|
23
30
|
end
|
24
31
|
|
25
|
-
def has_many?
|
32
|
+
def has_many? # rubocop:disable Naming/PredicateName
|
26
33
|
@association.macro == :has_many
|
27
34
|
end
|
28
35
|
|
@@ -34,10 +41,22 @@ module ActiveScaffold::DataStructures::Association
|
|
34
41
|
!collection?
|
35
42
|
end
|
36
43
|
|
44
|
+
def collection?
|
45
|
+
has_many? || habtm?
|
46
|
+
end
|
47
|
+
|
37
48
|
def through?
|
38
49
|
false
|
39
50
|
end
|
40
51
|
|
52
|
+
def through_singular?
|
53
|
+
through? && !through_reflection.collection?
|
54
|
+
end
|
55
|
+
|
56
|
+
def through_collection?
|
57
|
+
through? && through_reflection.collection?
|
58
|
+
end
|
59
|
+
|
41
60
|
def polymorphic?
|
42
61
|
false
|
43
62
|
end
|
@@ -52,6 +71,8 @@ module ActiveScaffold::DataStructures::Association
|
|
52
71
|
|
53
72
|
def scope; end
|
54
73
|
|
74
|
+
def as; end
|
75
|
+
|
55
76
|
def respond_to_target?
|
56
77
|
false
|
57
78
|
end
|
@@ -81,12 +102,13 @@ module ActiveScaffold::DataStructures::Association
|
|
81
102
|
end
|
82
103
|
|
83
104
|
def reverse_association(klass = nil)
|
84
|
-
assoc =
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
105
|
+
assoc =
|
106
|
+
if polymorphic?
|
107
|
+
get_reverse(klass) unless klass.nil?
|
108
|
+
else
|
109
|
+
reverse_name = reverse(klass)
|
110
|
+
reflect_on_association(reverse_name) if reverse_name
|
111
|
+
end
|
90
112
|
self.class.new(assoc) if assoc
|
91
113
|
end
|
92
114
|
|
@@ -114,13 +136,13 @@ module ActiveScaffold::DataStructures::Association
|
|
114
136
|
associations = self.class.reflect_on_all_associations(klass)
|
115
137
|
# collect associations that point back to this model and use the same foreign_key
|
116
138
|
associations.each_with_object([]) do |assoc, reverse_matches|
|
117
|
-
reverse_matches << assoc if reverse_match?
|
139
|
+
reverse_matches << assoc if assoc != @association && reverse_match?(assoc)
|
118
140
|
end
|
119
141
|
end
|
120
142
|
|
121
143
|
def reverse_match?(assoc)
|
122
|
-
return
|
123
|
-
return false
|
144
|
+
return assoc.name == as if as || assoc.polymorphic?
|
145
|
+
return false if assoc.class_name != inverse_klass&.name
|
124
146
|
|
125
147
|
if through?
|
126
148
|
reverse_through_match?(assoc)
|