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
@@ -17,18 +17,14 @@ module ActiveScaffold::DataStructures::Association
|
|
17
17
|
%i[belongs_to_record belongs_to_document].include?(@association.macro)
|
18
18
|
end
|
19
19
|
|
20
|
-
def has_one?
|
20
|
+
def has_one? # rubocop:disable Naming/PredicateName
|
21
21
|
%i[has_one_record has_one_document].include?(@association.macro)
|
22
22
|
end
|
23
23
|
|
24
|
-
def has_many?
|
24
|
+
def has_many? # rubocop:disable Naming/PredicateName
|
25
25
|
%i[has_many_records has_many_documents].include?(@association.macro)
|
26
26
|
end
|
27
27
|
|
28
|
-
def collection?
|
29
|
-
%i[has_many_documents has_many_records].include?(@association.macro)
|
30
|
-
end
|
31
|
-
|
32
28
|
def table_name
|
33
29
|
@association.klass < ActiveRecord::Base ? @association.klass.table_name : super
|
34
30
|
end
|
@@ -75,7 +75,11 @@ module ActiveScaffold::DataStructures::Association
|
|
75
75
|
|
76
76
|
def scope_values
|
77
77
|
return {} unless @association.scope
|
78
|
-
@scope_values ||= @association.klass.instance_exec(&@association.scope).values
|
78
|
+
@scope_values ||= @association.klass.instance_exec(&@association.scope).values
|
79
|
+
rescue StandardError => e
|
80
|
+
message = "Error evaluating scope for #{@association.name} in #{@association.klass.name}:"
|
81
|
+
Rails.logger.warn "#{message}\n#{e.message}\n#{e.backtrace.join("\n")}"
|
82
|
+
{}
|
79
83
|
end
|
80
84
|
|
81
85
|
def reverse_through_match?(assoc)
|
@@ -1,9 +1,6 @@
|
|
1
1
|
module ActiveScaffold::DataStructures::Association
|
2
2
|
class Mongoid < Abstract
|
3
3
|
delegate :inverse_klass, :as, :dependent, :inverse, to: :@association
|
4
|
-
def collection?
|
5
|
-
%i[has_many has_and_belongs_to_many].include?(@association.macro)
|
6
|
-
end
|
7
4
|
|
8
5
|
# polymorphic belongs_to
|
9
6
|
def polymorphic?
|
@@ -9,7 +9,7 @@ module ActiveScaffold::DataStructures
|
|
9
9
|
alias model active_record_class
|
10
10
|
|
11
11
|
# this is the name of the getter on the ActiveRecord model. it is the only absolutely required attribute ... all others will be inferred from this name.
|
12
|
-
|
12
|
+
attr_reader :name
|
13
13
|
|
14
14
|
# Whether to enable inplace editing for this column. Currently works for text columns, in the List.
|
15
15
|
attr_reader :inplace_edit
|
@@ -114,16 +114,9 @@ module ActiveScaffold::DataStructures
|
|
114
114
|
# supported options:
|
115
115
|
# * for association columns
|
116
116
|
# * :select - displays a simple <select> or a collection of checkboxes to (dis)associate records
|
117
|
-
|
118
|
-
self.list_method = nil if @list_ui.nil? && value != @form_ui
|
119
|
-
@form_ui = value
|
120
|
-
end
|
121
|
-
attr_reader :form_ui
|
117
|
+
attr_accessor :form_ui
|
122
118
|
|
123
|
-
|
124
|
-
self.list_method = nil if value != @list_ui
|
125
|
-
@list_ui = value
|
126
|
-
end
|
119
|
+
attr_writer :list_ui
|
127
120
|
|
128
121
|
def list_ui
|
129
122
|
@list_ui || form_ui
|
@@ -186,10 +179,11 @@ module ActiveScaffold::DataStructures
|
|
186
179
|
# a collection of associations to pre-load when finding the records on a page
|
187
180
|
attr_reader :includes
|
188
181
|
def includes=(value)
|
189
|
-
@includes =
|
190
|
-
|
191
|
-
|
192
|
-
|
182
|
+
@includes =
|
183
|
+
case value
|
184
|
+
when Array then value
|
185
|
+
else value ? [value] : value # not convert nil to [nil]
|
186
|
+
end
|
193
187
|
end
|
194
188
|
|
195
189
|
# a collection of associations to do left join when this column is included on search
|
@@ -198,10 +192,11 @@ module ActiveScaffold::DataStructures
|
|
198
192
|
end
|
199
193
|
|
200
194
|
def search_joins=(value)
|
201
|
-
@search_joins =
|
202
|
-
|
203
|
-
|
204
|
-
|
195
|
+
@search_joins =
|
196
|
+
case value
|
197
|
+
when Array then value
|
198
|
+
else [value] # automatically convert to an array
|
199
|
+
end
|
205
200
|
end
|
206
201
|
|
207
202
|
# a collection of columns to load when eager loading is disabled, if it's nil all columns will be loaded
|
@@ -245,6 +240,9 @@ module ActiveScaffold::DataStructures
|
|
245
240
|
@associated_number
|
246
241
|
end
|
247
242
|
|
243
|
+
# what string to use to join records from plural associations
|
244
|
+
attr_accessor :association_join_text
|
245
|
+
|
248
246
|
# whether a blank row must be shown in the subform
|
249
247
|
cattr_accessor :show_blank_record, instance_accessor: false
|
250
248
|
@@show_blank_record = true
|
@@ -304,21 +302,26 @@ module ActiveScaffold::DataStructures
|
|
304
302
|
end
|
305
303
|
end
|
306
304
|
|
305
|
+
# cache key to cache column info
|
306
|
+
attr_reader :cache_key
|
307
|
+
|
307
308
|
# instantiation is handled internally through the DataStructures::Columns object
|
308
309
|
def initialize(name, active_record_class, delegated_association = nil) #:nodoc:
|
309
|
-
|
310
|
+
@name = name.to_sym
|
310
311
|
@active_record_class = active_record_class
|
311
312
|
@column = _columns_hash[name.to_s]
|
312
313
|
@delegated_association = delegated_association
|
314
|
+
@cache_key = [@active_record_class.name, name].compact.map(&:to_s).join('#')
|
313
315
|
setup_association_info
|
314
316
|
|
317
|
+
@link = nil
|
315
318
|
@autolink = association.present?
|
316
319
|
@table = _table_name
|
317
320
|
@associated_limit = self.class.associated_limit
|
318
321
|
@associated_number = self.class.associated_number
|
319
322
|
@show_blank_record = self.class.show_blank_record
|
320
323
|
@send_form_on_update_column = self.class.send_form_on_update_column
|
321
|
-
@actions_for_association_links = self.class.actions_for_association_links.
|
324
|
+
@actions_for_association_links = self.class.actions_for_association_links.dup if association
|
322
325
|
@select_columns = default_select_columns
|
323
326
|
|
324
327
|
@text = @column.nil? || [:string, :text, String].include?(column_type)
|
@@ -332,10 +335,11 @@ module ActiveScaffold::DataStructures
|
|
332
335
|
@form_ui = :number
|
333
336
|
@options = {:format => :i18n_number}
|
334
337
|
else
|
335
|
-
@form_ui =
|
336
|
-
|
337
|
-
|
338
|
-
|
338
|
+
@form_ui =
|
339
|
+
case @column.type
|
340
|
+
when :boolean then :checkbox
|
341
|
+
when :text then :textarea
|
342
|
+
end
|
339
343
|
end
|
340
344
|
end
|
341
345
|
@allow_add_existing = true
|
@@ -369,18 +373,23 @@ module ActiveScaffold::DataStructures
|
|
369
373
|
order_weight.nonzero? ? order_weight : name.to_s <=> other.name.to_s
|
370
374
|
end
|
371
375
|
|
376
|
+
def convert_to_native?
|
377
|
+
number? && options[:format] && form_ui != :number
|
378
|
+
end
|
379
|
+
|
372
380
|
def number_to_native(value)
|
373
381
|
return value if value.blank? || !value.is_a?(String)
|
374
382
|
native = '.' # native ruby separator
|
375
383
|
format = {:separator => '', :delimiter => ''}.merge! I18n.t('number.format', :default => {})
|
376
|
-
specific =
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
+
specific =
|
385
|
+
case options[:format]
|
386
|
+
when :currency
|
387
|
+
I18n.t('number.currency.format', :default => nil)
|
388
|
+
when :size
|
389
|
+
I18n.t('number.human.format', :default => nil)
|
390
|
+
when :percentage
|
391
|
+
I18n.t('number.percentage.format', :default => nil)
|
392
|
+
end
|
384
393
|
format.merge! specific unless specific.nil?
|
385
394
|
if format[:separator].blank? || !value.include?(format[:separator]) && value.include?(native) && (format[:delimiter] != native || value !~ /\.\d{3}$/)
|
386
395
|
value
|
@@ -389,27 +398,8 @@ module ActiveScaffold::DataStructures
|
|
389
398
|
end
|
390
399
|
end
|
391
400
|
|
392
|
-
|
393
|
-
|
394
|
-
Rails.cache.fetch(cache_key(:list_method))
|
395
|
-
end
|
396
|
-
|
397
|
-
def list_method=(value)
|
398
|
-
Rails.cache.write(cache_key(:list_method), value)
|
399
|
-
end
|
400
|
-
|
401
|
-
# cache constraints for numeric columns (get in ActiveScaffold::Helpers::FormColumnHelpers::numerical_constraints_for_column)
|
402
|
-
def numerical_constraints
|
403
|
-
Rails.cache.fetch(cache_key(:numerical_constraints))
|
404
|
-
end
|
405
|
-
|
406
|
-
def numerical_constraints=(value)
|
407
|
-
Rails.cache.write(cache_key(:numerical_constraints), value)
|
408
|
-
end
|
409
|
-
|
410
|
-
# cache key to cache column info
|
411
|
-
def cache_key(attr)
|
412
|
-
[@active_record_class.name, name, attr].compact.map(&:to_s).join('#')
|
401
|
+
def default_for_empty_value
|
402
|
+
(column.null ? nil : column.default) if column
|
413
403
|
end
|
414
404
|
|
415
405
|
# the table.field name for this column, if applicable
|
@@ -497,11 +487,12 @@ module ActiveScaffold::DataStructures
|
|
497
487
|
end
|
498
488
|
|
499
489
|
def initialize_sort
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
490
|
+
self.sort =
|
491
|
+
if column && !tableless?
|
492
|
+
{:sql => field}
|
493
|
+
else
|
494
|
+
false
|
495
|
+
end
|
505
496
|
end
|
506
497
|
|
507
498
|
def initialize_search_sql
|
@@ -23,6 +23,7 @@ module ActiveScaffold::DataStructures
|
|
23
23
|
@active_record_class = active_record_class
|
24
24
|
@_inheritable = []
|
25
25
|
@set = []
|
26
|
+
@sorted = nil
|
26
27
|
|
27
28
|
add(*args)
|
28
29
|
end
|
@@ -48,8 +49,8 @@ module ActiveScaffold::DataStructures
|
|
48
49
|
column = self[association]
|
49
50
|
raise ArgumentError, "unknown column #{association}" if column.nil?
|
50
51
|
raise ArgumentError, "column #{association} is not an association" if column.association.nil?
|
51
|
-
raise
|
52
|
-
raise
|
52
|
+
raise ArgumentError, "column #{association} is not singular association" unless column.association.singular?
|
53
|
+
raise ArgumentError, "column #{association} is polymorphic association" if column.association.polymorphic?
|
53
54
|
|
54
55
|
klass = column.association.klass
|
55
56
|
columns.each do |col|
|
@@ -31,7 +31,7 @@ module ActiveScaffold::DataStructures
|
|
31
31
|
false
|
32
32
|
end
|
33
33
|
|
34
|
-
def has_many?
|
34
|
+
def has_many? # rubocop:disable Naming/PredicateName
|
35
35
|
false
|
36
36
|
end
|
37
37
|
|
@@ -39,7 +39,7 @@ module ActiveScaffold::DataStructures
|
|
39
39
|
false
|
40
40
|
end
|
41
41
|
|
42
|
-
def has_one?
|
42
|
+
def has_one? # rubocop:disable Naming/PredicateName
|
43
43
|
false
|
44
44
|
end
|
45
45
|
|
@@ -83,15 +83,17 @@ module ActiveScaffold::DataStructures
|
|
83
83
|
|
84
84
|
# A through association with has_one or has_many as source association
|
85
85
|
# create cannot be called in nested through associations, and not-nested through associations
|
86
|
-
# unless create columns include through reflection of reverse association
|
86
|
+
# unless is through singular or create columns include through reflection of reverse association
|
87
87
|
# e.g. customer -> networks -> firewall, reverse is firewall -> network -> customer,
|
88
88
|
# firewall can be created if create columns include network
|
89
89
|
def readonly_through_association?(columns)
|
90
90
|
return false unless through_association?
|
91
|
-
return true if association.through_reflection.options[:through]
|
92
|
-
|
93
|
-
|
94
|
-
|
91
|
+
return true if association.through_reflection.options[:through] # create not possible, too many levels
|
92
|
+
return true if association.source_reflection.options[:through] # create not possible, too many levels
|
93
|
+
return false if association.through_singular? # create allowed, AS has code for this
|
94
|
+
|
95
|
+
# create allowed only if through reflection in record to be created is included in create columns
|
96
|
+
!child_association || !columns.include?(child_association.through_reflection.name)
|
95
97
|
end
|
96
98
|
|
97
99
|
def through_association?
|
@@ -104,25 +106,25 @@ module ActiveScaffold::DataStructures
|
|
104
106
|
|
105
107
|
def default_sorting(chain)
|
106
108
|
return @default_sorting if defined? @default_sorting
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
end
|
109
|
+
return unless association.scope.is_a?(Proc) && chain.respond_to?(:values) && chain.values[:order]
|
110
|
+
@default_sorting = chain.values[:order]
|
111
|
+
@default_sorting = @default_sorting.map(&:to_sql) if @default_sorting[0].is_a? Arel::Nodes::Node
|
112
|
+
@default_sorting = @default_sorting.join(', ')
|
112
113
|
end
|
113
114
|
|
114
115
|
def to_params
|
115
|
-
super.merge(:association => @association.name,
|
116
|
+
super.merge(:association => @association.name, @param_name => parent_id)
|
116
117
|
end
|
117
118
|
|
118
119
|
protected
|
119
120
|
|
120
121
|
def setup_constrained_fields
|
121
|
-
@constrained_fields =
|
122
|
-
@constrained_fields
|
123
|
-
|
124
|
-
|
125
|
-
|
122
|
+
@constrained_fields = Array(association.foreign_key).map(&:to_sym) unless association.belongs_to?
|
123
|
+
@constrained_fields ||= []
|
124
|
+
return unless child_association && child_association != association
|
125
|
+
|
126
|
+
@constrained_fields << child_association.name
|
127
|
+
@constrained_fields << child_association.foreign_type.to_sym if child_association.polymorphic?
|
126
128
|
end
|
127
129
|
end
|
128
130
|
|
@@ -14,6 +14,7 @@ module ActiveScaffold::DataStructures
|
|
14
14
|
@clauses = []
|
15
15
|
@constraint_columns = []
|
16
16
|
@model = model
|
17
|
+
@sorting_by_primary_key = false
|
17
18
|
end
|
18
19
|
|
19
20
|
def set_default_sorting
|
@@ -106,6 +107,10 @@ module ActiveScaffold::DataStructures
|
|
106
107
|
@clauses.each { |clause| yield clause }
|
107
108
|
end
|
108
109
|
|
110
|
+
def each_column
|
111
|
+
@clauses.each { |clause| yield clause[0] }
|
112
|
+
end
|
113
|
+
|
109
114
|
# provides quick access to the first (and sometimes only) clause
|
110
115
|
def first
|
111
116
|
@clauses.first
|
@@ -11,15 +11,25 @@ module ActiveScaffold
|
|
11
11
|
|
12
12
|
module ClassMethods
|
13
13
|
def active_scaffold(model_id = nil, &block)
|
14
|
-
@
|
14
|
+
@delayed_monitor ||= Monitor.new
|
15
|
+
@active_scaffold_delayed = proc do
|
16
|
+
begin
|
17
|
+
@_prefixes = nil # clean prefixes in case is already cached, so our local_prefixes override is picked up
|
18
|
+
super(model_id, &block)
|
19
|
+
@active_scaffold_delayed = @delayed_monitor = nil # after configuring, no need to keep proc or monitor
|
20
|
+
rescue StandardError
|
21
|
+
# clear config variable if failed, so next request tries again
|
22
|
+
@active_scaffold_config = nil
|
23
|
+
raise
|
24
|
+
end
|
25
|
+
end
|
15
26
|
end
|
16
27
|
|
17
28
|
def config_active_scaffold_delayed
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
block.call
|
29
|
+
@delayed_monitor&.synchronize do
|
30
|
+
# if called in same thread while running config, do nothing
|
31
|
+
@active_scaffold_delayed&.call unless @active_scaffold_config
|
32
|
+
end
|
23
33
|
end
|
24
34
|
|
25
35
|
def active_scaffold_config
|
@@ -8,7 +8,7 @@ module ActiveScaffold
|
|
8
8
|
opts = args.any? ? args.first : {}
|
9
9
|
|
10
10
|
render :partial => params[:adapter][1..-1],
|
11
|
-
:locals => {:payload => render_to_string(opts.merge(:layout => false), &block).html_safe},
|
11
|
+
:locals => {:payload => render_to_string(opts.merge(:layout => false), &block).html_safe}, # rubocop:disable Rails/OutputSafety
|
12
12
|
:use_full_path => true, :layout => false, :content_type => :html
|
13
13
|
@rendering_adapter = nil # recursion control
|
14
14
|
else
|
@@ -39,8 +39,12 @@ module ActiveScaffold #:nodoc:
|
|
39
39
|
if args.first.is_a?(Hash) && args.first[:active_scaffold]
|
40
40
|
render_embedded args.first
|
41
41
|
elsif args.first == :super
|
42
|
-
@
|
43
|
-
|
42
|
+
if @lookup_context # rails 6
|
43
|
+
@_lookup_context ||= lookup_context
|
44
|
+
else # rails < 6
|
45
|
+
@_view_paths ||= lookup_context.view_paths.clone
|
46
|
+
@_last_template ||= lookup_context.last_template
|
47
|
+
end
|
44
48
|
parts = @virtual_path.split('/')
|
45
49
|
template = parts.pop
|
46
50
|
prefix = parts.join('/')
|
@@ -58,22 +62,34 @@ module ActiveScaffold #:nodoc:
|
|
58
62
|
else
|
59
63
|
options[:prefixes] = ['active_scaffold_overrides']
|
60
64
|
last_view_path = File.expand_path(File.dirname(File.dirname(lookup_context.last_template.inspect)), Rails.root)
|
61
|
-
|
65
|
+
new_view_paths = view_paths.drop(view_paths.find_index { |path| path.to_s == last_view_path } + 1)
|
66
|
+
if @lookup_context
|
67
|
+
@lookup_context = build_lookup_context(new_view_paths)
|
68
|
+
else
|
69
|
+
lookup_context.view_paths = new_view_paths
|
70
|
+
end
|
62
71
|
end
|
63
72
|
result = super options
|
64
|
-
lookup_context
|
65
|
-
lookup_context.
|
73
|
+
@lookup_context = @_lookup_context if @_lookup_context # rails 6
|
74
|
+
lookup_context.view_paths = @_view_paths if @_view_paths # rails < 6
|
75
|
+
lookup_context.last_template = @_last_template if @_last_template # rails < 6
|
66
76
|
result
|
67
77
|
else
|
68
|
-
@
|
78
|
+
if @lookup_context # rails 6
|
79
|
+
@_lookup_context ||= lookup_context
|
80
|
+
else # rails < 6
|
81
|
+
@_view_paths ||= lookup_context.view_paths.clone
|
82
|
+
end
|
69
83
|
last_template = lookup_context.last_template
|
70
|
-
current_view =
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
84
|
+
current_view =
|
85
|
+
if args[0].is_a?(Hash)
|
86
|
+
{locals: args[0][:locals], object: args[0][:object]}
|
87
|
+
else # call is render 'partial', locals_hash
|
88
|
+
{locals: args[1]}
|
89
|
+
end
|
75
90
|
view_stack << current_view if current_view
|
76
|
-
lookup_context
|
91
|
+
@lookup_context = @_lookup_context if @_lookup_context # rails 6, reset lookup_context in case a view render :super, and then render :partial
|
92
|
+
lookup_context.view_paths = @_view_paths if @_view_paths # rails < 6, reset view_paths in case a view render :super, and then render :partial
|
77
93
|
result = super
|
78
94
|
view_stack.pop if current_view.present?
|
79
95
|
lookup_context.last_template = last_template
|
@@ -114,9 +130,13 @@ module ActiveScaffold #:nodoc:
|
|
114
130
|
content_tag(:div, :id => id, :class => 'active-scaffold-component', :data => {:refresh => url}) do
|
115
131
|
# parse the ActiveRecord model name from the controller path, which
|
116
132
|
# might be a namespaced controller (e.g., 'admin/admins')
|
117
|
-
model = remote_controller.to_s.sub(%r{
|
133
|
+
model = remote_controller.to_s.sub(%r{.*/}, '').singularize
|
118
134
|
content_tag(:div, :class => 'active-scaffold-header') do
|
119
|
-
content_tag
|
135
|
+
content_tag(:h2) do
|
136
|
+
link_label = options[:label] || active_scaffold_config_for(model).list.label
|
137
|
+
link_to(link_label, url, remote: true, class: 'load-embedded', data: {error_msg: as_(:error_500)}) <<
|
138
|
+
loading_indicator_tag(url_options)
|
139
|
+
end
|
120
140
|
end
|
121
141
|
end
|
122
142
|
end
|