active_scaffold 3.6.0.pre → 3.6.0.rc1
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.
- 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
|