active_scaffold 3.5.2 → 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} +66 -0
- data/README.md +17 -7
- data/app/assets/javascripts/active_scaffold.js.erb +0 -1
- data/app/assets/javascripts/jquery/active_scaffold.js +63 -6
- 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/_base_form.html.erb +2 -2
- data/app/views/active_scaffold_overrides/_form.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +3 -2
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +6 -6
- data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list.html.erb +2 -1
- data/app/views/active_scaffold_overrides/_list_header.html.erb +5 -7
- data/app/views/active_scaffold_overrides/_list_messages.html.erb +1 -0
- 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/_messages.html.erb +1 -0
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +4 -0
- data/app/views/active_scaffold_overrides/_render_field.js.erb +2 -1
- data/app/views/active_scaffold_overrides/_show_association_horizontal.html.erb +2 -1
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +2 -2
- data/app/views/active_scaffold_overrides/_show_horizontal_record.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_update_calculations.js.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_column.js.erb +2 -2
- data/app/views/active_scaffold_overrides/action_confirmation.html.erb +2 -2
- data/app/views/active_scaffold_overrides/delete.html.erb +2 -2
- data/app/views/active_scaffold_overrides/on_action_update.js.erb +16 -6
- data/app/views/active_scaffold_overrides/on_update.js.erb +1 -1
- data/app/views/active_scaffold_overrides/row.js.erb +1 -1
- data/app/views/active_scaffold_overrides/update_column.js.erb +1 -1
- 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 +19 -16
- data/lib/active_scaffold/actions/common_search.rb +11 -8
- data/lib/active_scaffold/actions/core.rb +89 -71
- data/lib/active_scaffold/actions/create.rb +28 -28
- data/lib/active_scaffold/actions/delete.rb +3 -3
- data/lib/active_scaffold/actions/field_search.rb +53 -43
- data/lib/active_scaffold/actions/list.rb +111 -27
- data/lib/active_scaffold/actions/nested.rb +65 -48
- data/lib/active_scaffold/actions/search.rb +1 -1
- data/lib/active_scaffold/actions/show.rb +4 -4
- data/lib/active_scaffold/actions/subform.rb +12 -17
- data/lib/active_scaffold/actions/update.rb +96 -77
- data/lib/active_scaffold/active_record_permissions.rb +2 -11
- data/lib/active_scaffold/attribute_params.rb +104 -86
- data/lib/active_scaffold/bridges.rb +8 -8
- 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/calendar_date_select/as_cds_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +9 -12
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +2 -2
- data/lib/active_scaffold/bridges/chosen/helpers.rb +11 -9
- data/lib/active_scaffold/bridges/date_picker/ext.rb +0 -13
- data/lib/active_scaffold/bridges/date_picker/helper.rb +49 -44
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +3 -3
- 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 +10 -7
- data/lib/active_scaffold/bridges/paper_trail.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +2 -2
- data/lib/active_scaffold/bridges/record_select/helpers.rb +12 -16
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +20 -19
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -1
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +21 -4
- data/lib/active_scaffold/config/base.rb +133 -41
- data/lib/active_scaffold/config/core.rb +146 -18
- data/lib/active_scaffold/config/delete.rb +14 -1
- data/lib/active_scaffold/config/field_search.rb +7 -1
- data/lib/active_scaffold/config/form.rb +10 -1
- data/lib/active_scaffold/config/list.rb +39 -13
- data/lib/active_scaffold/config/mark.rb +4 -2
- data/lib/active_scaffold/config/nested.rb +16 -17
- data/lib/active_scaffold/config/search.rb +9 -0
- data/lib/active_scaffold/config/show.rb +4 -0
- data/lib/active_scaffold/config/update.rb +4 -0
- data/lib/active_scaffold/configurable.rb +14 -7
- data/lib/active_scaffold/constraints.rb +22 -20
- data/lib/active_scaffold/core.rb +68 -29
- data/lib/active_scaffold/data_structures/action_columns.rb +50 -59
- data/lib/active_scaffold/data_structures/action_link.rb +50 -20
- data/lib/active_scaffold/data_structures/action_links.rb +15 -13
- data/lib/active_scaffold/data_structures/association/abstract.rb +41 -15
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +2 -6
- data/lib/active_scaffold/data_structures/association/active_record.rb +6 -2
- data/lib/active_scaffold/data_structures/association/mongoid.rb +0 -3
- data/lib/active_scaffold/data_structures/column.rb +75 -66
- data/lib/active_scaffold/data_structures/columns.rb +3 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +21 -19
- data/lib/active_scaffold/data_structures/set.rb +8 -0
- data/lib/active_scaffold/data_structures/sorting.rb +10 -2
- data/lib/active_scaffold/delayed_setup.rb +16 -5
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +3 -2
- data/lib/active_scaffold/extensions/action_view_rendering.rb +34 -14
- data/lib/active_scaffold/extensions/cow_proxy.rb +91 -0
- data/lib/active_scaffold/extensions/ice_nine.rb +36 -0
- data/lib/active_scaffold/extensions/left_outer_joins.rb +8 -33
- data/lib/active_scaffold/extensions/localize.rb +3 -1
- data/lib/active_scaffold/extensions/routing_mapper.rb +6 -45
- data/lib/active_scaffold/extensions/to_label.rb +3 -2
- data/lib/active_scaffold/extensions/unsaved_record.rb +2 -4
- data/lib/active_scaffold/finder.rb +104 -73
- data/lib/active_scaffold/helpers/action_link_helpers.rb +62 -36
- data/lib/active_scaffold/helpers/association_helpers.rb +21 -19
- data/lib/active_scaffold/helpers/controller_helpers.rb +23 -10
- data/lib/active_scaffold/helpers/form_column_helpers.rb +157 -121
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/id_helpers.rb +6 -2
- data/lib/active_scaffold/helpers/list_column_helpers.rb +82 -53
- data/lib/active_scaffold/helpers/pagination_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/search_column_helpers.rb +29 -34
- data/lib/active_scaffold/helpers/show_column_helpers.rb +3 -5
- data/lib/active_scaffold/helpers/view_helpers.rb +38 -35
- data/lib/active_scaffold/marked_model.rb +2 -2
- data/lib/active_scaffold/orm_checks.rb +3 -7
- data/lib/active_scaffold/paginator.rb +7 -7
- data/lib/active_scaffold/registry.rb +33 -0
- data/lib/active_scaffold/responds_to_parent.rb +8 -11
- data/lib/active_scaffold/tableless.rb +67 -65
- data/lib/active_scaffold/version.rb +2 -2
- data/lib/generators/active_scaffold/controller_generator.rb +2 -2
- data/lib/generators/active_scaffold/install_generator.rb +1 -1
- data/lib/generators/active_scaffold/resource_generator.rb +2 -2
- data/shoulda_macros/macros.rb +3 -1
- data/test/bridges/date_picker_test.rb +1 -2
- data/test/bridges/paperclip_test.rb +6 -6
- data/test/class_with_finder.rb +2 -2
- data/test/company.rb +4 -4
- data/test/config/create_test.rb +4 -2
- data/test/config/nested_test.rb +1 -1
- data/test/config/show_test.rb +1 -1
- data/test/config/update_test.rb +7 -6
- data/test/data_structures/action_columns_test.rb +2 -2
- data/test/data_structures/action_links_test.rb +1 -1
- data/test/data_structures/column_test.rb +3 -6
- data/test/data_structures/columns_test.rb +2 -2
- data/test/data_structures/sorting_test.rb +7 -0
- 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 +3 -11
- data/test/misc/attribute_params_test.rb +12 -8
- data/test/misc/calculation_test.rb +1 -1
- data/test/misc/configurable_test.rb +10 -10
- data/test/misc/constraints_test.rb +2 -2
- data/test/misc/convert_numbers_format_test.rb +7 -3
- data/test/misc/lang_test.rb +1 -1
- data/test/misc/parse_datetime_test.rb +3 -4
- data/test/misc/tableless_test.rb +6 -0
- data/test/mock_app/Rakefile +1 -1
- 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 +2 -1
- data/test/mock_app/config/boot.rb +1 -1
- data/test/mock_app/config/environment.rb +2 -2
- 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 +10 -2
- metadata +56 -15
- data/app/assets/javascripts/prototype/rico_corner.js +0 -370
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +0 -7
@@ -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
|
|
@@ -74,7 +74,7 @@ module ActiveScaffold::DataStructures
|
|
74
74
|
column = parent_scaffold.active_scaffold_config.columns[params[:association].to_sym]
|
75
75
|
@param_name = column.model.name.foreign_key.to_sym
|
76
76
|
@parent_id = params[@param_name]
|
77
|
-
@association = column
|
77
|
+
@association = column&.association
|
78
78
|
@child_association = association.reverse_association(model) if association
|
79
79
|
setup_constrained_fields
|
80
80
|
end
|
@@ -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
|
|
@@ -7,6 +7,10 @@ module ActiveScaffold::DataStructures
|
|
7
7
|
set_values(*args)
|
8
8
|
end
|
9
9
|
|
10
|
+
def initialize_dup(other)
|
11
|
+
@set = other.set.dup
|
12
|
+
end
|
13
|
+
|
10
14
|
def set_values(*args)
|
11
15
|
@set = []
|
12
16
|
add(*args)
|
@@ -56,5 +60,9 @@ module ActiveScaffold::DataStructures
|
|
56
60
|
def empty?
|
57
61
|
@set.empty?
|
58
62
|
end
|
63
|
+
|
64
|
+
protected
|
65
|
+
|
66
|
+
attr_reader :set
|
59
67
|
end
|
60
68
|
end
|
@@ -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
|
@@ -55,6 +56,9 @@ module ActiveScaffold::DataStructures
|
|
55
56
|
# set({column => direction}, {column => direction})
|
56
57
|
# set([column, direction], [column, direction])
|
57
58
|
def set(*args)
|
59
|
+
# TODO: add deprecation unless args.size == 1 && args[0].is_a? Hash
|
60
|
+
# when deprecation is removed:
|
61
|
+
# * change list#sorting= to sorting.set(val)
|
58
62
|
clear
|
59
63
|
if args.first.is_a?(Enumerable)
|
60
64
|
args.each do |h|
|
@@ -103,6 +107,10 @@ module ActiveScaffold::DataStructures
|
|
103
107
|
@clauses.each { |clause| yield clause }
|
104
108
|
end
|
105
109
|
|
110
|
+
def each_column
|
111
|
+
@clauses.each { |clause| yield clause[0] }
|
112
|
+
end
|
113
|
+
|
106
114
|
# provides quick access to the first (and sometimes only) clause
|
107
115
|
def first
|
108
116
|
@clauses.first
|
@@ -120,7 +128,7 @@ module ActiveScaffold::DataStructures
|
|
120
128
|
order = []
|
121
129
|
each do |sort_column, sort_direction|
|
122
130
|
next if constraint_columns.include? sort_column.name
|
123
|
-
sql = grouped_columns_calculations
|
131
|
+
sql = grouped_columns_calculations&.dig(sort_column.name) || sort_column.sort[:sql]
|
124
132
|
next if sql.blank?
|
125
133
|
sql = sql.to_sql if sql.respond_to?(:to_sql)
|
126
134
|
|
@@ -200,7 +208,7 @@ module ActiveScaffold::DataStructures
|
|
200
208
|
end
|
201
209
|
|
202
210
|
def postgres?
|
203
|
-
model.connection
|
211
|
+
model.connection&.adapter_name == 'PostgreSQL'
|
204
212
|
end
|
205
213
|
|
206
214
|
def setup_primary_key_order_clause
|
@@ -11,14 +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
|
-
|
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
|
22
33
|
end
|
23
34
|
|
24
35
|
def active_scaffold_config
|
@@ -5,9 +5,10 @@ module ActiveScaffold
|
|
5
5
|
if self.class.uses_active_scaffold? && params[:adapter] && @rendering_adapter.nil? && request.xhr?
|
6
6
|
@rendering_adapter = true # recursion control
|
7
7
|
# if we need an adapter, then we render the actual stuff to a string and insert it into the adapter template
|
8
|
-
opts = args.
|
8
|
+
opts = args.any? ? args.first : {}
|
9
|
+
|
9
10
|
render :partial => params[:adapter][1..-1],
|
10
|
-
: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
|
11
12
|
:use_full_path => true, :layout => false, :content_type => :html
|
12
13
|
@rendering_adapter = nil # recursion control
|
13
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(
|
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
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'cow_proxy'
|
2
|
+
|
3
|
+
module CowProxy
|
4
|
+
module ActiveScaffold
|
5
|
+
module DataStructures
|
6
|
+
class Column < ::CowProxy::WrapClass(::ActiveScaffold::DataStructures::Column)
|
7
|
+
# readonly and called many times in list action
|
8
|
+
delegate :name, :cache_key, :delegated_association, :association, to: :__getobj__
|
9
|
+
|
10
|
+
def link
|
11
|
+
return @link if defined?(@link)
|
12
|
+
if __getobj__.frozen?
|
13
|
+
link_var = __getobj__.instance_variable_get(:@link)
|
14
|
+
if link_var.is_a?(Proc)
|
15
|
+
@link = link_var.call self
|
16
|
+
return @link
|
17
|
+
end
|
18
|
+
end
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Set < ::CowProxy::WrapClass(::ActiveScaffold::DataStructures::Set)
|
24
|
+
protected
|
25
|
+
|
26
|
+
# Copy wrapped values to duplicated wrapped object
|
27
|
+
# @see CowProxy::Base#__copy_on_write__
|
28
|
+
# @return duplicated wrapped object
|
29
|
+
def __copy_on_write__(*)
|
30
|
+
super.tap do
|
31
|
+
new_set = __getobj__.instance_variable_get(:@set).dup
|
32
|
+
__getobj__.instance_variable_set(:@set, new_set)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class ActionColumns < ::CowProxy::WrapClass(::ActiveScaffold::DataStructures::ActionColumns)
|
38
|
+
def each_column(options = {})
|
39
|
+
__getobj__.each_column(options.reverse_merge(core_columns: action.core.columns)) do |column|
|
40
|
+
if column.is_a?(::ActiveScaffold::DataStructures::ActionColumns)
|
41
|
+
yield ::CowProxy.wrap(column).tap { |group| group.action = action }
|
42
|
+
else
|
43
|
+
yield column
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class ActionLinks < ::CowProxy::WrapClass(::ActiveScaffold::DataStructures::ActionLinks)
|
50
|
+
def method_missing(name, *args, &block)
|
51
|
+
CowProxy.debug { "method missing #{name} in #{__getobj__.name}" }
|
52
|
+
return super if name =~ /[!?]$/
|
53
|
+
subgroup =
|
54
|
+
if _instance_variable_defined?("@#{name}")
|
55
|
+
_instance_variable_get("@#{name}")
|
56
|
+
else
|
57
|
+
__copy_on_write__ if __getobj__.frozen?
|
58
|
+
group = __getobj__.subgroup(name, args.first)
|
59
|
+
if group.frozen?
|
60
|
+
group = __wrap__(group)
|
61
|
+
else
|
62
|
+
CowProxy.debug { "created subgroup #{group.name}" }
|
63
|
+
end
|
64
|
+
_instance_variable_set("@#{name}", group)
|
65
|
+
end
|
66
|
+
yield subgroup if block
|
67
|
+
subgroup
|
68
|
+
end
|
69
|
+
|
70
|
+
def respond_to_missing?(name, *)
|
71
|
+
name !~ /[!?]$/
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
|
76
|
+
# Copy wrapped values to duplicated wrapped object
|
77
|
+
# @see CowProxy::Base#__copy_on_write__
|
78
|
+
# @return duplicated wrapped object
|
79
|
+
def __copy_on_write__(*)
|
80
|
+
index = @parent_proxy.instance_variable_get(:@set).index(__getobj__) if @parent_proxy
|
81
|
+
super.tap do
|
82
|
+
CowProxy.debug { "replace #{index} with proxy obj in parent #{@parent_proxy.name}" } if index
|
83
|
+
@parent_proxy.instance_variable_get(:@set)[index] = self if index
|
84
|
+
new_set = __getobj__.instance_variable_get(:@set).dup
|
85
|
+
__getobj__.instance_variable_set(:@set, new_set)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module IceNine
|
2
|
+
class Freezer
|
3
|
+
def self.find(name)
|
4
|
+
freezer = name.split('::').reduce(self) do |mod, const|
|
5
|
+
mod.const_lookup(const) or break mod # rubocop:disable Style/AndOr
|
6
|
+
end
|
7
|
+
freezer if freezer < self # only return a descendant freezer
|
8
|
+
end
|
9
|
+
|
10
|
+
class ObjectWithExclussion < Object
|
11
|
+
class_attribute :excluded_vars
|
12
|
+
self.excluded_vars = []
|
13
|
+
def self.freeze_instance_variables(object, recursion_guard)
|
14
|
+
object.instance_variables.each do |ivar_name|
|
15
|
+
next if excluded_vars.include? ivar_name
|
16
|
+
Freezer.guarded_deep_freeze(
|
17
|
+
object.instance_variable_get(ivar_name),
|
18
|
+
recursion_guard
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
private_class_method :freeze_instance_variables
|
23
|
+
end
|
24
|
+
|
25
|
+
class ActiveScaffold < ::IceNine::Freezer::Object
|
26
|
+
class DataStructures < ::IceNine::Freezer::Object
|
27
|
+
class Column < ::IceNine::Freezer::ObjectWithExclussion
|
28
|
+
self.excluded_vars = %i[@active_record_class @column]
|
29
|
+
end
|
30
|
+
|
31
|
+
class Association < ::IceNine::Freezer::NoFreeze
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -18,11 +18,6 @@ if Rails.version < '5.0.0'
|
|
18
18
|
end
|
19
19
|
alias left_joins left_outer_joins
|
20
20
|
|
21
|
-
def outer_joins(*args)
|
22
|
-
ActiveSupport::Deprecation.warn 'use left_outer_joins or left_joins which is added to Rails 5.0.0'
|
23
|
-
left_outer_joins(*args)
|
24
|
-
end
|
25
|
-
|
26
21
|
def left_outer_joins!(*args)
|
27
22
|
self.joins_values += [''] # HACK: for using left_outer_joins in update_all/delete_all
|
28
23
|
self.left_outer_joins_values += args
|
@@ -30,39 +25,19 @@ if Rails.version < '5.0.0'
|
|
30
25
|
end
|
31
26
|
alias left_joins! left_outer_joins!
|
32
27
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
if left_outer_joins_values.empty?
|
41
|
-
super
|
42
|
-
else
|
43
|
-
relation = except(:left_outer_joins)
|
44
|
-
join_dependency = ActiveRecord::Associations::JoinDependency.new(@klass, left_outer_joins_values, [])
|
45
|
-
join_dependency.join_associations.each do |association|
|
46
|
-
relation = association.join_relation(relation)
|
47
|
-
end
|
48
|
-
relation.build_arel
|
49
|
-
end
|
50
|
-
end
|
51
|
-
else
|
52
|
-
def build_arel
|
53
|
-
if left_outer_joins_values.empty?
|
54
|
-
super
|
55
|
-
else
|
56
|
-
relation = except(:left_outer_joins)
|
57
|
-
relation.joins! ActiveRecord::Associations::JoinDependency.new(@klass, left_outer_joins_values, [])
|
58
|
-
relation.build_arel
|
59
|
-
end
|
28
|
+
def build_arel
|
29
|
+
if left_outer_joins_values.empty?
|
30
|
+
super
|
31
|
+
else
|
32
|
+
relation = except(:left_outer_joins)
|
33
|
+
relation.joins! ActiveRecord::Associations::JoinDependency.new(@klass, left_outer_joins_values, [])
|
34
|
+
relation.build_arel
|
60
35
|
end
|
61
36
|
end
|
62
37
|
end
|
63
38
|
end
|
64
39
|
ActiveRecord::Relation.send :include, ActiveScaffold::OuterJoins
|
65
40
|
module ActiveRecord::Querying
|
66
|
-
delegate :left_outer_joins, :left_joins, :
|
41
|
+
delegate :left_outer_joins, :left_joins, :to => :all
|
67
42
|
end
|
68
43
|
end
|