active_scaffold 3.4.43 → 3.5.0
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 +39 -0
- data/{LICENSE → LICENSE.md} +1 -1
- data/README.md +27 -19
- data/app/assets/javascripts/active_scaffold.js.erb +1 -1
- data/app/assets/javascripts/jquery/active_scaffold.js +95 -43
- data/app/assets/javascripts/jquery/tiny_mce_bridge.js +30 -6
- data/app/assets/javascripts/prototype/tiny_mce_bridge.js +11 -1
- data/app/assets/stylesheets/active_scaffold_colors.scss +2 -2
- data/app/assets/stylesheets/active_scaffold_layout.css +36 -28
- data/app/views/active_scaffold_overrides/_base_form.html.erb +2 -3
- data/app/views/active_scaffold_overrides/_field_search.html.erb +8 -7
- data/app/views/active_scaffold_overrides/_form_association.html.erb +9 -9
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +6 -6
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +52 -50
- 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/_human_conditions.html.erb +3 -1
- data/app/views/active_scaffold_overrides/_list_calculations.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +2 -0
- data/app/views/active_scaffold_overrides/_list_messages.html.erb +5 -3
- data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -1
- data/app/views/active_scaffold_overrides/_list_with_header.html.erb +9 -9
- data/app/views/active_scaffold_overrides/_messages.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +18 -10
- data/app/views/active_scaffold_overrides/_render_field.js.erb +3 -3
- data/app/views/active_scaffold_overrides/_search.html.erb +7 -6
- data/app/views/active_scaffold_overrides/_show_actions.html.erb +14 -0
- data/app/views/active_scaffold_overrides/_show_association.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_actions.html.erb +6 -2
- data/app/views/active_scaffold_overrides/_update_column.js.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_form.html.erb +1 -1
- data/app/views/active_scaffold_overrides/destroy.js.erb +2 -3
- data/app/views/active_scaffold_overrides/edit_associated.js.erb +4 -3
- data/app/views/active_scaffold_overrides/on_action_update.js.erb +5 -3
- data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
- data/app/views/active_scaffold_overrides/on_update.js.erb +6 -6
- data/app/views/active_scaffold_overrides/show.html.erb +6 -0
- data/app/views/active_scaffold_overrides/update.html.erb +1 -1
- data/app/views/active_scaffold_overrides/update_column.js.erb +1 -1
- data/config/brakeman.ignore +26 -0
- data/config/brakeman.yml +3 -0
- data/config/i18n-tasks.yml +121 -0
- data/config/locales/de.yml +81 -70
- data/config/locales/en.yml +83 -74
- data/config/locales/es.yml +82 -73
- data/config/locales/fr.yml +86 -75
- data/config/locales/hu.yml +81 -70
- data/config/locales/ja.yml +71 -60
- data/config/locales/ru.yml +85 -74
- data/lib/active_scaffold.rb +3 -0
- data/lib/active_scaffold/actions/common_search.rb +11 -7
- data/lib/active_scaffold/actions/core.rb +119 -47
- data/lib/active_scaffold/actions/create.rb +1 -1
- data/lib/active_scaffold/actions/delete.rb +11 -8
- data/lib/active_scaffold/actions/field_search.rb +104 -6
- data/lib/active_scaffold/actions/list.rb +25 -21
- data/lib/active_scaffold/actions/mark.rb +12 -4
- data/lib/active_scaffold/actions/nested.rb +26 -26
- data/lib/active_scaffold/actions/search.rb +2 -2
- data/lib/active_scaffold/actions/show.rb +4 -5
- data/lib/active_scaffold/actions/subform.rb +9 -7
- data/lib/active_scaffold/actions/update.rb +20 -13
- data/lib/active_scaffold/active_record_permissions.rb +24 -5
- data/lib/active_scaffold/attribute_params.rb +68 -49
- data/lib/active_scaffold/bridges.rb +1 -1
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +15 -19
- data/lib/active_scaffold/bridges/bitfields.rb +1 -1
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +10 -14
- data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -7
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +19 -22
- data/lib/active_scaffold/bridges/cancan.rb +4 -3
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +11 -21
- data/lib/active_scaffold/bridges/carrierwave.rb +2 -1
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +2 -6
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +6 -39
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/chosen.rb +4 -1
- data/lib/active_scaffold/bridges/chosen/helpers.rb +3 -2
- data/lib/active_scaffold/bridges/country_select/country_select_bridge_helper.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker.rb +3 -0
- data/lib/active_scaffold/bridges/date_picker/ext.rb +43 -38
- data/lib/active_scaffold/bridges/date_picker/helper.rb +24 -23
- data/lib/active_scaffold/bridges/dragonfly.rb +1 -1
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +3 -25
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +2 -2
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +6 -8
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +0 -2
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +2 -1
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/actions.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/helper.rb +1 -2
- data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/paperclip.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +3 -28
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/record_select.rb +2 -0
- data/lib/active_scaffold/bridges/record_select/helpers.rb +14 -18
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +4 -8
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +20 -20
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +7 -22
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +14 -14
- data/lib/active_scaffold/config/base.rb +9 -6
- data/lib/active_scaffold/config/core.rb +30 -21
- data/lib/active_scaffold/config/create.rb +2 -1
- data/lib/active_scaffold/config/delete.rb +2 -2
- data/lib/active_scaffold/config/field_search.rb +9 -3
- data/lib/active_scaffold/config/form.rb +4 -4
- data/lib/active_scaffold/config/list.rb +27 -23
- data/lib/active_scaffold/config/nested.rb +4 -4
- data/lib/active_scaffold/config/search.rb +6 -6
- data/lib/active_scaffold/config/show.rb +11 -1
- data/lib/active_scaffold/config/subform.rb +1 -1
- data/lib/active_scaffold/config/update.rb +4 -2
- data/lib/active_scaffold/constraints.rb +39 -36
- data/lib/active_scaffold/core.rb +36 -15
- data/lib/active_scaffold/data_structures/action_columns.rb +14 -9
- data/lib/active_scaffold/data_structures/action_link.rb +4 -5
- data/lib/active_scaffold/data_structures/action_links.rb +5 -4
- data/lib/active_scaffold/data_structures/actions.rb +2 -2
- data/lib/active_scaffold/data_structures/association.rb +8 -0
- data/lib/active_scaffold/data_structures/association/abstract.rb +147 -0
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +42 -0
- data/lib/active_scaffold/data_structures/association/active_record.rb +94 -0
- data/lib/active_scaffold/data_structures/association/mongoid.rb +45 -0
- data/lib/active_scaffold/data_structures/bridge.rb +3 -6
- data/lib/active_scaffold/data_structures/column.rb +100 -82
- data/lib/active_scaffold/data_structures/columns.rb +21 -3
- data/lib/active_scaffold/data_structures/nested_info.rb +22 -37
- data/lib/active_scaffold/data_structures/set.rb +4 -4
- data/lib/active_scaffold/data_structures/sorting.rb +29 -15
- data/lib/active_scaffold/engine.rb +3 -1
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +10 -5
- data/lib/active_scaffold/extensions/action_view_rendering.rb +65 -59
- data/lib/active_scaffold/extensions/left_outer_joins.rb +48 -53
- data/lib/active_scaffold/extensions/localize.rb +3 -4
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +7 -11
- data/lib/active_scaffold/extensions/paginator_extensions.rb +20 -18
- data/lib/active_scaffold/extensions/routing_mapper.rb +104 -40
- data/lib/active_scaffold/extensions/to_label.rb +1 -1
- data/lib/active_scaffold/extensions/unsaved_associated.rb +4 -13
- data/lib/active_scaffold/extensions/unsaved_record.rb +12 -1
- data/lib/active_scaffold/finder.rb +200 -134
- data/lib/active_scaffold/helpers/action_link_helpers.rb +398 -0
- data/lib/active_scaffold/helpers/association_helpers.rb +12 -30
- data/lib/active_scaffold/helpers/controller_helpers.rb +74 -24
- data/lib/active_scaffold/helpers/form_column_helpers.rb +205 -112
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +21 -11
- data/lib/active_scaffold/helpers/id_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/list_column_helpers.rb +117 -39
- data/lib/active_scaffold/helpers/pagination_helpers.rb +11 -14
- data/lib/active_scaffold/helpers/search_column_helpers.rb +69 -32
- data/lib/active_scaffold/helpers/show_column_helpers.rb +9 -3
- data/lib/active_scaffold/helpers/view_helpers.rb +41 -426
- data/lib/active_scaffold/orm_checks.rb +109 -0
- data/lib/active_scaffold/paginator.rb +1 -1
- data/lib/active_scaffold/responds_to_parent.rb +12 -10
- data/lib/active_scaffold/tableless.rb +81 -43
- data/lib/active_scaffold/version.rb +2 -2
- data/lib/generators/active_scaffold/controller_generator.rb +49 -0
- data/lib/generators/active_scaffold/install_generator.rb +45 -0
- data/lib/generators/active_scaffold/resource_generator.rb +56 -0
- data/lib/generators/{active_scaffold_controller/templates → templates}/controller.rb +0 -0
- data/lib/generators/{active_scaffold_controller/templates → templates}/helper.rb +0 -0
- data/shoulda_macros/macros.rb +3 -3
- data/test/active_scaffold_config_mock.rb +33 -0
- data/test/bridges/bridge_test.rb +9 -9
- data/test/bridges/date_picker_test.rb +3 -1
- data/test/bridges/paper_trail_test.rb +2 -3
- data/test/bridges/paperclip_test.rb +21 -10
- data/test/bridges/tiny_mce_test.rb +20 -21
- data/test/class_with_finder.rb +42 -0
- data/test/company.rb +6 -4
- data/test/config/core_test.rb +1 -1
- data/test/config/create_test.rb +1 -1
- data/test/config/list_test.rb +3 -3
- data/test/config/update_test.rb +3 -3
- data/test/data_structures/action_columns_test.rb +3 -3
- data/test/data_structures/association_column_test.rb +5 -5
- data/test/data_structures/column_test.rb +14 -14
- data/test/data_structures/columns_test.rb +2 -2
- data/test/data_structures/set_test.rb +2 -2
- data/test/data_structures/sorting_test.rb +6 -4
- data/test/extensions/active_record_test.rb +1 -1
- data/test/extensions/routing_mapper_test.rb +64 -13
- data/test/helpers/form_column_helpers_test.rb +6 -6
- data/test/helpers/list_column_helpers_test.rb +9 -5
- data/test/helpers/pagination_helpers_test.rb +1 -0
- data/test/misc/active_record_permissions_test.rb +18 -1
- data/test/misc/attribute_params_test.rb +26 -17
- data/test/misc/calculation_test.rb +8 -31
- data/test/misc/configurable_test.rb +3 -2
- data/test/misc/constraints_test.rb +33 -22
- data/test/misc/convert_numbers_format_test.rb +28 -10
- data/test/misc/finder_test.rb +6 -29
- data/test/misc/parse_datetime_test.rb +160 -0
- data/test/misc/render_test.rb +1 -1
- data/test/misc/tableless_test.rb +24 -0
- data/test/mock_app/app/models/building.rb +2 -1
- data/test/mock_app/config.ru +1 -1
- data/test/mock_app/config/environments/test.rb +1 -1
- data/test/mock_app/config/routes.rb +11 -3
- data/test/model_stub.rb +11 -6
- data/test/run_all.rb +1 -1
- data/test/test_helper.rb +19 -4
- metadata +42 -23
- data/lib/active_scaffold/data_structures/error_message.rb +0 -22
- data/lib/active_scaffold/extensions/reverse_associations.rb +0 -119
- data/lib/generators/active_scaffold/USAGE +0 -29
- data/lib/generators/active_scaffold/active_scaffold_generator.rb +0 -21
- data/lib/generators/active_scaffold_controller/USAGE +0 -19
- data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +0 -29
- data/test/data_structures/error_message_test.rb +0 -25
@@ -0,0 +1,94 @@
|
|
1
|
+
module ActiveScaffold::DataStructures::Association
|
2
|
+
class ActiveRecord < Abstract
|
3
|
+
def self.reflect_on_all_associations(klass)
|
4
|
+
klass.reflect_on_all_associations
|
5
|
+
end
|
6
|
+
|
7
|
+
delegate :collection?, :polymorphic?, :association_primary_key, :foreign_type, :table_name, to: :@association
|
8
|
+
|
9
|
+
def through?
|
10
|
+
@association.options[:through].present?
|
11
|
+
end
|
12
|
+
|
13
|
+
def readonly?
|
14
|
+
scope_values[:readonly]
|
15
|
+
end
|
16
|
+
|
17
|
+
def through_reflection
|
18
|
+
@association.through_reflection if through?
|
19
|
+
end
|
20
|
+
|
21
|
+
def source_reflection
|
22
|
+
@association.source_reflection if through?
|
23
|
+
end
|
24
|
+
|
25
|
+
def scope
|
26
|
+
@association.scope
|
27
|
+
end
|
28
|
+
|
29
|
+
def inverse_klass
|
30
|
+
@association.active_record
|
31
|
+
end
|
32
|
+
|
33
|
+
def primary_key
|
34
|
+
@association.options[:primary_key]
|
35
|
+
end
|
36
|
+
|
37
|
+
def counter_cache
|
38
|
+
@association.options[:counter_cache]
|
39
|
+
end
|
40
|
+
|
41
|
+
def as
|
42
|
+
@association.options[:as]
|
43
|
+
end
|
44
|
+
|
45
|
+
def dependent
|
46
|
+
@association.options[:dependent]
|
47
|
+
end
|
48
|
+
|
49
|
+
# name of inverse
|
50
|
+
def inverse
|
51
|
+
@association.inverse_of.try(:name)
|
52
|
+
end
|
53
|
+
|
54
|
+
def quoted_table_name
|
55
|
+
@association.klass.quoted_table_name
|
56
|
+
end
|
57
|
+
|
58
|
+
def quoted_primary_key
|
59
|
+
@association.klass.quoted_primary_key
|
60
|
+
end
|
61
|
+
|
62
|
+
def respond_to_target?
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
66
|
+
def counter_cache_hack?
|
67
|
+
if has_many?
|
68
|
+
Rails.version < '5.0' && as
|
69
|
+
elsif belongs_to?
|
70
|
+
counter_cache && (Rails.version >= '5.0' || !polymorphic?)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
|
76
|
+
def scope_values
|
77
|
+
return {} unless @association.scope
|
78
|
+
@scope_values ||= @association.klass.instance_exec(&@association.scope).values rescue {}
|
79
|
+
end
|
80
|
+
|
81
|
+
def reverse_through_match?(assoc)
|
82
|
+
assoc.options[:through] && assoc.through_reflection.class_name == through_reflection.class_name
|
83
|
+
end
|
84
|
+
|
85
|
+
def reverse_habtm_match?(assoc)
|
86
|
+
super && assoc.options[:join_table] == @association.options[:join_table]
|
87
|
+
end
|
88
|
+
|
89
|
+
def reverse_direct_match?(assoc)
|
90
|
+
# skip over has_many :through associations
|
91
|
+
!assoc.options[:through] && super
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module ActiveScaffold::DataStructures::Association
|
2
|
+
class Mongoid < Abstract
|
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
|
+
|
8
|
+
# polymorphic belongs_to
|
9
|
+
def polymorphic?
|
10
|
+
belongs_to? && @association.polymorphic?
|
11
|
+
end
|
12
|
+
|
13
|
+
def primary_key
|
14
|
+
@association[:primary_key]
|
15
|
+
end
|
16
|
+
|
17
|
+
def association_primary_key
|
18
|
+
@association.primary_key
|
19
|
+
end
|
20
|
+
|
21
|
+
def foreign_type
|
22
|
+
@association.type
|
23
|
+
end
|
24
|
+
|
25
|
+
def counter_cache
|
26
|
+
@association[:counter_cache]
|
27
|
+
end
|
28
|
+
|
29
|
+
def table_name
|
30
|
+
@association.klass.collection.name
|
31
|
+
end
|
32
|
+
|
33
|
+
def quoted_table_name
|
34
|
+
table_name
|
35
|
+
end
|
36
|
+
|
37
|
+
def quoted_primary_key
|
38
|
+
'_id'
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.reflect_on_all_associations(klass)
|
42
|
+
klass.relations.values
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -4,8 +4,7 @@ module ActiveScaffold::DataStructures
|
|
4
4
|
raise RunTimeError, "install not defined for bridge #{name}"
|
5
5
|
end
|
6
6
|
|
7
|
-
def self.prepare
|
8
|
-
end
|
7
|
+
def self.prepare; end
|
9
8
|
|
10
9
|
# by convention and default, use the bridge name as the required constant for installation
|
11
10
|
def self.install?
|
@@ -16,10 +15,8 @@ module ActiveScaffold::DataStructures
|
|
16
15
|
install if install?
|
17
16
|
end
|
18
17
|
|
19
|
-
def self.stylesheets
|
20
|
-
end
|
18
|
+
def self.stylesheets; end
|
21
19
|
|
22
|
-
def self.javascripts
|
23
|
-
end
|
20
|
+
def self.javascripts; end
|
24
21
|
end
|
25
22
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
module ActiveScaffold::DataStructures
|
2
2
|
class Column
|
3
3
|
include ActiveScaffold::Configurable
|
4
|
+
include ActiveScaffold::OrmChecks
|
4
5
|
|
5
6
|
attr_reader :active_record_class
|
7
|
+
alias model active_record_class
|
6
8
|
|
7
9
|
# 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.
|
8
10
|
attr_accessor :name
|
@@ -76,7 +78,7 @@ module ActiveScaffold::DataStructures
|
|
76
78
|
end
|
77
79
|
|
78
80
|
# send all the form instead of only new value when this column change
|
79
|
-
cattr_accessor :send_form_on_update_column
|
81
|
+
cattr_accessor :send_form_on_update_column, instance_accessor: false
|
80
82
|
attr_accessor :send_form_on_update_column
|
81
83
|
|
82
84
|
# sorting on a column can be configured four ways:
|
@@ -132,11 +134,11 @@ module ActiveScaffold::DataStructures
|
|
132
134
|
|
133
135
|
attr_writer :search_ui
|
134
136
|
def search_ui
|
135
|
-
@search_ui || @form_ui || (
|
137
|
+
@search_ui || @form_ui || (:select if association && !association.polymorphic?)
|
136
138
|
end
|
137
139
|
|
138
140
|
# a place to store dev's column specific options
|
139
|
-
|
141
|
+
attr_writer :options
|
140
142
|
def options
|
141
143
|
@options ||= {}
|
142
144
|
end
|
@@ -181,8 +183,8 @@ module ActiveScaffold::DataStructures
|
|
181
183
|
attr_reader :includes
|
182
184
|
def includes=(value)
|
183
185
|
@includes = case value
|
184
|
-
|
185
|
-
|
186
|
+
when Array then value
|
187
|
+
else value ? [value] : value # not convert nil to [nil]
|
186
188
|
end
|
187
189
|
end
|
188
190
|
|
@@ -193,8 +195,8 @@ module ActiveScaffold::DataStructures
|
|
193
195
|
|
194
196
|
def search_joins=(value)
|
195
197
|
@search_joins = case value
|
196
|
-
|
197
|
-
|
198
|
+
when Array then value
|
199
|
+
else [value] # automatically convert to an array
|
198
200
|
end
|
199
201
|
end
|
200
202
|
|
@@ -227,12 +229,12 @@ module ActiveScaffold::DataStructures
|
|
227
229
|
attr_accessor :weight
|
228
230
|
|
229
231
|
# to set how many associated records a column with plural association must show in list
|
230
|
-
cattr_accessor :associated_limit
|
232
|
+
cattr_accessor :associated_limit, instance_accessor: false
|
231
233
|
@@associated_limit = 3
|
232
234
|
attr_accessor :associated_limit
|
233
235
|
|
234
236
|
# whether the number of associated records must be shown or not
|
235
|
-
cattr_accessor :associated_number
|
237
|
+
cattr_accessor :associated_number, instance_accessor: false
|
236
238
|
@@associated_number = true
|
237
239
|
attr_writer :associated_number
|
238
240
|
def associated_number?
|
@@ -240,18 +242,18 @@ module ActiveScaffold::DataStructures
|
|
240
242
|
end
|
241
243
|
|
242
244
|
# whether a blank row must be shown in the subform
|
243
|
-
cattr_accessor :show_blank_record
|
245
|
+
cattr_accessor :show_blank_record, instance_accessor: false
|
244
246
|
@@show_blank_record = true
|
245
247
|
attr_writer :show_blank_record
|
246
248
|
def show_blank_record?(associated)
|
247
249
|
return false unless @show_blank_record
|
248
|
-
return false unless association.klass.authorized_for?(:crud_type => :create) && !association.
|
249
|
-
|
250
|
+
return false unless association.klass.authorized_for?(:crud_type => :create) && !association.readonly?
|
251
|
+
association.collection? || (association.singular? && associated.blank?)
|
250
252
|
end
|
251
253
|
|
252
254
|
# methods for automatic links in singular association columns
|
253
|
-
cattr_accessor :actions_for_association_links
|
254
|
-
@@actions_for_association_links = [
|
255
|
+
cattr_accessor :actions_for_association_links, instance_accessor: false
|
256
|
+
@@actions_for_association_links = %i[new edit show]
|
255
257
|
attr_accessor :actions_for_association_links
|
256
258
|
|
257
259
|
cattr_accessor :association_form_ui
|
@@ -266,30 +268,9 @@ module ActiveScaffold::DataStructures
|
|
266
268
|
|
267
269
|
# the association from the ActiveRecord class
|
268
270
|
attr_reader :association
|
269
|
-
def singular_association?
|
270
|
-
association && !association.collection?
|
271
|
-
end
|
272
|
-
|
273
|
-
def plural_association?
|
274
|
-
association && association.collection?
|
275
|
-
end
|
276
271
|
|
277
|
-
|
278
|
-
|
279
|
-
end
|
280
|
-
|
281
|
-
def polymorphic_association?
|
282
|
-
association && association.options[:polymorphic]
|
283
|
-
end
|
284
|
-
|
285
|
-
def readonly_association?
|
286
|
-
return false unless association
|
287
|
-
if association.options.key? :readonly
|
288
|
-
association.options[:readonly]
|
289
|
-
else
|
290
|
-
self.through_association?
|
291
|
-
end
|
292
|
-
end
|
272
|
+
# the singular association which this column belongs to
|
273
|
+
attr_reader :delegated_association
|
293
274
|
|
294
275
|
# an interpreted property. the column is virtual if it isn't from the active record model or any associated models
|
295
276
|
def virtual?
|
@@ -310,54 +291,57 @@ module ActiveScaffold::DataStructures
|
|
310
291
|
# another column
|
311
292
|
if other.respond_to?(:name) && other.class == self.class
|
312
293
|
name == other.name.to_sym
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
else
|
318
|
-
|
294
|
+
elsif other.is_a? Symbol
|
295
|
+
name == other
|
296
|
+
elsif other.is_a? String
|
297
|
+
name.to_s == other # avoid creating new symbols
|
298
|
+
else # unknown
|
299
|
+
eql? other
|
319
300
|
end
|
320
301
|
end
|
321
302
|
|
322
303
|
# instantiation is handled internally through the DataStructures::Columns object
|
323
|
-
def initialize(name, active_record_class) #:nodoc:
|
304
|
+
def initialize(name, active_record_class, delegated_association = nil) #:nodoc:
|
324
305
|
self.name = name.to_sym
|
325
|
-
@tableless = active_record_class < ActiveScaffold::Tableless
|
326
|
-
@column = active_record_class.columns_hash[self.name.to_s]
|
327
|
-
@association = active_record_class.reflect_on_association(self.name)
|
328
|
-
@autolink = !@association.nil?
|
329
306
|
@active_record_class = active_record_class
|
330
|
-
@
|
307
|
+
@column = _columns_hash[self.name.to_s]
|
308
|
+
@delegated_association = delegated_association
|
309
|
+
setup_association_info
|
310
|
+
|
311
|
+
@autolink = self.association.present?
|
312
|
+
@table = _table_name
|
331
313
|
@associated_limit = self.class.associated_limit
|
332
314
|
@associated_number = self.class.associated_number
|
333
315
|
@show_blank_record = self.class.show_blank_record
|
334
316
|
@send_form_on_update_column = self.class.send_form_on_update_column
|
335
|
-
@actions_for_association_links = self.class.actions_for_association_links.clone if
|
317
|
+
@actions_for_association_links = self.class.actions_for_association_links.clone if self.association
|
336
318
|
@select_columns = default_select_columns
|
337
319
|
|
338
|
-
@text = @column.nil? || [:string, :text].include?(
|
320
|
+
@text = @column.nil? || [:string, :text, String].include?(column_type)
|
321
|
+
@number = false
|
339
322
|
if @column
|
340
323
|
if active_record_class.respond_to?(:defined_enums) && active_record_class.defined_enums[name.to_s]
|
341
324
|
@form_ui = :select
|
342
|
-
@options = {:options => active_record_class.send(name.to_s.pluralize).keys}
|
343
|
-
elsif
|
325
|
+
@options = {:options => active_record_class.send(name.to_s.pluralize).keys.map(&:to_sym)}
|
326
|
+
elsif column_number?
|
344
327
|
@number = true
|
345
328
|
@form_ui = :number
|
346
329
|
@options = {:format => :i18n_number}
|
347
330
|
else
|
348
331
|
@form_ui = case @column.type
|
349
|
-
|
350
|
-
|
332
|
+
when :boolean then :checkbox
|
333
|
+
when :text then :textarea
|
351
334
|
end
|
352
335
|
end
|
353
336
|
end
|
354
337
|
@allow_add_existing = true
|
355
338
|
@form_ui = self.class.association_form_ui if @association && self.class.association_form_ui
|
356
339
|
|
357
|
-
if association &&
|
358
|
-
|
359
|
-
self.
|
340
|
+
self.includes = [association.name] if association && association.allow_join?
|
341
|
+
if delegated_association
|
342
|
+
self.includes = includes ? [delegated_association.name => includes] : [delegated_association.name]
|
360
343
|
end
|
344
|
+
self.search_joins = includes.clone if includes
|
361
345
|
|
362
346
|
# default all the configurable variables
|
363
347
|
self.css_class = ''
|
@@ -373,12 +357,12 @@ module ActiveScaffold::DataStructures
|
|
373
357
|
# just the field (not table.field)
|
374
358
|
def field_name
|
375
359
|
return nil if virtual?
|
376
|
-
@field_name ||= column ?
|
360
|
+
@field_name ||= column ? quoted_field_name(column.name) : association.foreign_key
|
377
361
|
end
|
378
362
|
|
379
363
|
def <=>(other)
|
380
364
|
order_weight = weight <=> other.weight
|
381
|
-
order_weight
|
365
|
+
order_weight.nonzero? ? order_weight : name.to_s <=> other.name.to_s
|
382
366
|
end
|
383
367
|
|
384
368
|
def number_to_native(value)
|
@@ -386,12 +370,12 @@ module ActiveScaffold::DataStructures
|
|
386
370
|
native = '.' # native ruby separator
|
387
371
|
format = {:separator => '', :delimiter => ''}.merge! I18n.t('number.format', :default => {})
|
388
372
|
specific = case options[:format]
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
373
|
+
when :currency
|
374
|
+
I18n.t('number.currency.format', :default => nil)
|
375
|
+
when :size
|
376
|
+
I18n.t('number.human.format', :default => nil)
|
377
|
+
when :percentage
|
378
|
+
I18n.t('number.percentage.format', :default => nil)
|
395
379
|
end
|
396
380
|
format.merge! specific unless specific.nil?
|
397
381
|
if format[:separator].blank? || !value.include?(format[:separator]) && value.include?(native) && (format[:delimiter] != native || value !~ /\.\d{3}$/)
|
@@ -412,8 +396,29 @@ module ActiveScaffold::DataStructures
|
|
412
396
|
@field ||= quoted_field(field_name)
|
413
397
|
end
|
414
398
|
|
399
|
+
def type_for_attribute
|
400
|
+
ActiveScaffold::OrmChecks.type_for_attribute active_record_class, name
|
401
|
+
end
|
402
|
+
|
403
|
+
def column_type
|
404
|
+
ActiveScaffold::OrmChecks.column_type active_record_class, name
|
405
|
+
end
|
406
|
+
|
415
407
|
protected
|
416
408
|
|
409
|
+
def setup_association_info
|
410
|
+
assoc = active_record_class.reflect_on_association(self.name)
|
411
|
+
@association = if assoc
|
412
|
+
case
|
413
|
+
when active_record? then Association::ActiveRecord.new(assoc)
|
414
|
+
when mongoid? then Association::Mongoid.new(assoc)
|
415
|
+
end
|
416
|
+
elsif defined?(ActiveMongoid) && model < ActiveMongoid::Associations
|
417
|
+
assoc = active_record_class.reflect_on_am_association(name)
|
418
|
+
Association::ActiveMongoid.new(assoc) if assoc
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
417
422
|
def validator_force_required?(val)
|
418
423
|
return false if val.options[:if] || val.options[:unless]
|
419
424
|
case val
|
@@ -433,34 +438,47 @@ module ActiveScaffold::DataStructures
|
|
433
438
|
def default_select_columns
|
434
439
|
if association.nil? && column
|
435
440
|
[field]
|
436
|
-
elsif
|
437
|
-
[field, quoted_field(
|
441
|
+
elsif association.try(:polymorphic?)
|
442
|
+
[field, quoted_field(quoted_field_name(association.foreign_type))]
|
438
443
|
elsif association
|
439
444
|
if association.belongs_to?
|
440
445
|
[field]
|
441
446
|
else
|
442
447
|
columns = []
|
443
|
-
if
|
444
|
-
columns << quoted_field(
|
448
|
+
if _columns_hash[count_column = "#{association.name}_count"]
|
449
|
+
columns << quoted_field(quoted_field_name(count_column))
|
445
450
|
end
|
446
451
|
if association.through_reflection.try(:belongs_to?)
|
447
|
-
columns << quoted_field(
|
452
|
+
columns << quoted_field(quoted_field_name(association.through_reflection.foreign_key))
|
448
453
|
end
|
449
454
|
columns
|
450
455
|
end
|
451
456
|
end
|
452
457
|
end
|
453
458
|
|
459
|
+
def column_number?
|
460
|
+
return %i[float decimal integer].include? @column.type if active_record?
|
461
|
+
return @column.type < Numeric if mongoid?
|
462
|
+
end
|
463
|
+
|
464
|
+
def quoted_field_name(column_name)
|
465
|
+
if active_record?
|
466
|
+
@active_record_class.connection.quote_column_name(column_name)
|
467
|
+
else
|
468
|
+
column_name.to_s
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
454
472
|
def quoted_field(name)
|
455
|
-
[
|
473
|
+
active_record? ? [_quoted_table_name, name].compact.join('.') : name
|
456
474
|
end
|
457
475
|
|
458
476
|
def initialize_sort
|
459
|
-
if
|
477
|
+
if virtual?
|
460
478
|
# we don't automatically enable method sorting for virtual columns because it's slow, and we expect fewer complaints this way.
|
461
479
|
self.sort = false
|
462
480
|
else
|
463
|
-
if column &&
|
481
|
+
if column && !tableless?
|
464
482
|
self.sort = {:sql => field}
|
465
483
|
else
|
466
484
|
self.sort = false
|
@@ -470,11 +488,11 @@ module ActiveScaffold::DataStructures
|
|
470
488
|
|
471
489
|
def initialize_search_sql
|
472
490
|
self.search_sql =
|
473
|
-
unless
|
491
|
+
unless virtual?
|
474
492
|
if association.nil?
|
475
|
-
field.to_s unless
|
476
|
-
elsif
|
477
|
-
[association.
|
493
|
+
field.to_s unless tableless?
|
494
|
+
elsif association.allow_join?
|
495
|
+
[association.quoted_table_name, association.quoted_primary_key].join('.') unless association.klass < ActiveScaffold::Tableless
|
478
496
|
end
|
479
497
|
end
|
480
498
|
end
|
@@ -483,13 +501,13 @@ module ActiveScaffold::DataStructures
|
|
483
501
|
attr_reader :table
|
484
502
|
|
485
503
|
def estimate_weight
|
486
|
-
if
|
504
|
+
if association.try(:singular?)
|
487
505
|
400
|
488
|
-
elsif
|
506
|
+
elsif association.try(:collection?)
|
489
507
|
500
|
490
|
-
elsif [
|
508
|
+
elsif %i[created_at updated_at].include?(name)
|
491
509
|
600
|
492
|
-
elsif [
|
510
|
+
elsif %i[name label title].include?(name)
|
493
511
|
100
|
494
512
|
elsif required?
|
495
513
|
200
|