active_scaffold 3.7.12 → 4.0.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.rdoc +9 -23
- data/README.md +3 -2
- data/app/assets/config/active_scaffold_manifest.js +3 -0
- data/app/assets/javascripts/active_scaffold.js.erb +24 -34
- data/app/assets/javascripts/jquery/active_scaffold.js +41 -58
- data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +1 -1
- data/app/assets/stylesheets/active_scaffold_colors.scss +0 -7
- data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -2
- data/app/assets/stylesheets/active_scaffold_jquery_ui.css.erb +7 -7
- data/app/assets/stylesheets/active_scaffold_layout.css +57 -30
- data/app/views/active_scaffold_overrides/_add_existing_form.html.erb +10 -10
- data/app/views/active_scaffold_overrides/_base_form.html.erb +21 -21
- data/app/views/active_scaffold_overrides/_create_form.html.erb +10 -7
- data/app/views/active_scaffold_overrides/_create_form_on_list.html.erb +5 -5
- data/app/views/active_scaffold_overrides/_field_search.html.erb +6 -6
- data/app/views/active_scaffold_overrides/_form.html.erb +11 -14
- data/app/views/active_scaffold_overrides/_form_association.html.erb +21 -12
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +19 -10
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +15 -21
- data/app/views/active_scaffold_overrides/_form_messages.html.erb +2 -2
- data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +7 -6
- data/app/views/active_scaffold_overrides/_human_conditions.html.erb +2 -2
- data/app/views/active_scaffold_overrides/_list.html.erb +15 -8
- data/app/views/active_scaffold_overrides/_list_calculations.html.erb +2 -3
- data/app/views/active_scaffold_overrides/_list_header.html.erb +2 -2
- data/app/views/active_scaffold_overrides/_list_inline_adapter.html.erb +5 -5
- data/app/views/active_scaffold_overrides/_list_messages.html.erb +12 -3
- data/app/views/active_scaffold_overrides/_list_pagination.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_list_pagination_links.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_list_record.html.erb +6 -6
- data/app/views/active_scaffold_overrides/_list_with_header.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_messages.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +2 -2
- data/app/views/active_scaffold_overrides/_render_field.js.erb +4 -4
- data/app/views/active_scaffold_overrides/_row.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_search.html.erb +6 -5
- data/app/views/active_scaffold_overrides/_show.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_show_actions.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_show_association.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_show_association_horizontal.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_show_association_vertical.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_show_horizontal_record.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_actions.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_calculations.js.erb +2 -2
- data/app/views/active_scaffold_overrides/_update_column.js.erb +8 -7
- data/app/views/active_scaffold_overrides/_update_form.html.erb +5 -5
- data/app/views/active_scaffold_overrides/_update_messages.js.erb +1 -1
- data/app/views/active_scaffold_overrides/_vertical_subform.html.erb +4 -3
- data/app/views/active_scaffold_overrides/action_confirmation.html.erb +3 -3
- data/app/views/active_scaffold_overrides/add_existing.js.erb +6 -6
- data/app/views/active_scaffold_overrides/add_existing_form.html.erb +1 -1
- data/app/views/active_scaffold_overrides/add_tab.js.erb +15 -0
- data/app/views/active_scaffold_overrides/create.html.erb +1 -1
- data/app/views/active_scaffold_overrides/delete.html.erb +4 -4
- data/app/views/active_scaffold_overrides/destroy.js.erb +15 -13
- data/app/views/active_scaffold_overrides/edit_associated.js.erb +3 -3
- data/app/views/active_scaffold_overrides/field_search.html.erb +1 -1
- data/app/views/active_scaffold_overrides/form_messages.js.erb +1 -1
- data/app/views/active_scaffold_overrides/list.html.erb +1 -1
- data/app/views/active_scaffold_overrides/on_action_update.js.erb +13 -8
- data/app/views/active_scaffold_overrides/on_create.js.erb +34 -6
- data/app/views/active_scaffold_overrides/on_mark.js.erb +3 -3
- data/app/views/active_scaffold_overrides/on_update.js.erb +9 -9
- data/app/views/active_scaffold_overrides/render_field.js.erb +1 -1
- data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +1 -1
- data/app/views/active_scaffold_overrides/row.js.erb +2 -2
- data/app/views/active_scaffold_overrides/search.html.erb +1 -1
- data/app/views/active_scaffold_overrides/show.html.erb +3 -3
- data/app/views/active_scaffold_overrides/update.html.erb +2 -2
- data/app/views/active_scaffold_overrides/update_column.js.erb +4 -4
- data/app/views/active_scaffold_overrides/update_row.js.erb +1 -1
- data/lib/active_scaffold/actions/common_search.rb +5 -3
- data/lib/active_scaffold/actions/core.rb +57 -32
- data/lib/active_scaffold/actions/create.rb +19 -17
- data/lib/active_scaffold/actions/delete.rb +10 -12
- data/lib/active_scaffold/actions/field_search.rb +28 -13
- data/lib/active_scaffold/actions/list.rb +34 -34
- data/lib/active_scaffold/actions/mark.rb +5 -5
- data/lib/active_scaffold/actions/nested.rb +64 -56
- data/lib/active_scaffold/actions/search.rb +2 -2
- data/lib/active_scaffold/actions/show.rb +5 -5
- data/lib/active_scaffold/actions/subform.rb +15 -4
- data/lib/active_scaffold/actions/update.rb +20 -20
- data/lib/active_scaffold/active_record_permissions.rb +4 -3
- data/lib/active_scaffold/attribute_params.rb +51 -50
- data/lib/active_scaffold/bridges/active_storage/active_storage_bridge.rb +4 -4
- data/lib/active_scaffold/bridges/active_storage/active_storage_helpers.rb +6 -2
- data/lib/active_scaffold/bridges/active_storage.rb +1 -1
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +3 -3
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +4 -1
- data/lib/active_scaffold/bridges/bitfields.rb +1 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/cancan.rb +8 -8
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +1 -1
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +4 -3
- data/lib/active_scaffold/bridges/carrierwave.rb +2 -2
- data/lib/active_scaffold/bridges/chosen.rb +1 -5
- data/lib/active_scaffold/bridges/country_select/country_select_bridge_helper.rb +4 -2
- data/lib/active_scaffold/bridges/date_picker/ext.rb +20 -12
- data/lib/active_scaffold/bridges/date_picker/helper.rb +37 -33
- data/lib/active_scaffold/bridges/date_picker.rb +1 -4
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +3 -2
- data/lib/active_scaffold/bridges/dragonfly.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +3 -2
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -1
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +4 -9
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +6 -3
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +3 -3
- data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +1 -4
- data/lib/active_scaffold/bridges/file_column.rb +1 -0
- data/lib/active_scaffold/bridges/paper_trail/actions.rb +4 -2
- data/lib/active_scaffold/bridges/paper_trail/config.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/helper.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +2 -1
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +3 -2
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +10 -9
- data/lib/active_scaffold/bridges/paperclip.rb +2 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +10 -11
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +3 -1
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -7
- data/lib/active_scaffold/bridges/tiny_mce.rb +2 -7
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +7 -7
- data/lib/active_scaffold/bridges.rb +7 -5
- data/lib/active_scaffold/config/base.rb +20 -24
- data/lib/active_scaffold/config/core.rb +27 -39
- data/lib/active_scaffold/config/create.rb +1 -1
- data/lib/active_scaffold/config/delete.rb +9 -9
- data/lib/active_scaffold/config/field_search.rb +4 -9
- data/lib/active_scaffold/config/form.rb +3 -1
- data/lib/active_scaffold/config/list.rb +19 -15
- data/lib/active_scaffold/config/nested.rb +2 -2
- data/lib/active_scaffold/config/search.rb +5 -5
- data/lib/active_scaffold/config/show.rb +1 -1
- data/lib/active_scaffold/config/subform.rb +1 -1
- data/lib/active_scaffold/config/update.rb +4 -5
- data/lib/active_scaffold/configurable.rb +2 -1
- data/lib/active_scaffold/constraints.rb +16 -11
- data/lib/active_scaffold/core.rb +25 -27
- data/lib/active_scaffold/data_structures/action_columns.rb +10 -3
- data/lib/active_scaffold/data_structures/action_link.rb +19 -9
- data/lib/active_scaffold/data_structures/action_links.rb +20 -26
- data/lib/active_scaffold/data_structures/actions.rb +3 -3
- data/lib/active_scaffold/data_structures/association/abstract.rb +8 -4
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +1 -0
- data/lib/active_scaffold/data_structures/association/active_record.rb +1 -4
- data/lib/active_scaffold/data_structures/column.rb +368 -327
- data/lib/active_scaffold/data_structures/columns.rb +3 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +6 -5
- data/lib/active_scaffold/data_structures/proxy_column.rb +68 -0
- data/lib/active_scaffold/data_structures/set.rb +7 -4
- data/lib/active_scaffold/data_structures/sorting.rb +21 -12
- data/lib/active_scaffold/engine.rb +12 -12
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +5 -5
- data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +29 -31
- data/lib/active_scaffold/extensions/ice_nine.rb +2 -1
- data/lib/active_scaffold/extensions/localize.rb +2 -2
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +1 -1
- data/lib/active_scaffold/extensions/routing_mapper.rb +5 -4
- data/lib/active_scaffold/extensions/unsaved_associated.rb +3 -2
- data/lib/active_scaffold/finder.rb +71 -78
- data/lib/active_scaffold/helpers/action_link_helpers.rb +37 -49
- data/lib/active_scaffold/helpers/association_helpers.rb +3 -2
- data/lib/active_scaffold/helpers/controller_helpers.rb +18 -16
- data/lib/active_scaffold/helpers/form_column_helpers.rb +69 -53
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +17 -15
- data/lib/active_scaffold/helpers/id_helpers.rb +5 -5
- data/lib/active_scaffold/helpers/list_column_helpers.rb +35 -38
- data/lib/active_scaffold/helpers/pagination_helpers.rb +4 -4
- data/lib/active_scaffold/helpers/search_column_helpers.rb +25 -34
- data/lib/active_scaffold/helpers/show_column_helpers.rb +7 -4
- data/lib/active_scaffold/helpers/tabs_helpers.rb +88 -0
- data/lib/active_scaffold/helpers/view_helpers.rb +15 -13
- data/lib/active_scaffold/marked_model.rb +1 -2
- data/lib/active_scaffold/orm_checks.rb +6 -4
- data/lib/active_scaffold/paginator.rb +3 -2
- data/lib/active_scaffold/registry.rb +5 -0
- data/lib/active_scaffold/tableless.rb +24 -14
- data/lib/active_scaffold/version.rb +4 -4
- data/lib/active_scaffold.rb +8 -34
- data/lib/generators/active_scaffold/controller_generator.rb +20 -20
- data/lib/generators/active_scaffold/install_generator.rb +4 -8
- data/lib/generators/active_scaffold/resource_generator.rb +31 -31
- data/lib/tasks/brakeman.rake +1 -1
- data/shoulda_macros/macros.rb +14 -14
- metadata +11 -232
- data/app/assets/javascripts/prototype/active_scaffold.js +0 -1249
- data/app/assets/javascripts/prototype/active_scaffold_chosen.js +0 -0
- data/app/assets/javascripts/prototype/dhtml_history.js +0 -870
- data/app/assets/javascripts/prototype/form_enhancements.js +0 -117
- data/app/assets/javascripts/prototype/tiny_mce_bridge.js +0 -17
- data/app/views/active_scaffold_overrides/_list_messages_content.html.erb +0 -8
- data/app/views/active_scaffold_overrides/_new_record.js.erb +0 -15
- data/app/views/active_scaffold_overrides/_popup_adapter.html.erb +0 -20
- data/app/views/active_scaffold_overrides/_refresh_create_form.js.erb +0 -12
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +0 -58
- data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -17
- data/lib/active_scaffold/data_structures/action_link_separator.rb +0 -13
- data/lib/active_scaffold/extensions/cow_proxy.rb +0 -102
- data/test/active_scaffold_config_mock.rb +0 -33
- data/test/bridges/bridge_test.rb +0 -88
- data/test/bridges/date_picker_test.rb +0 -31
- data/test/bridges/paper_trail_test.rb +0 -16
- data/test/bridges/paperclip_test.rb +0 -85
- data/test/bridges/tiny_mce_test.rb +0 -61
- data/test/class_with_finder.rb +0 -42
- data/test/company.rb +0 -97
- data/test/config/base_test.rb +0 -17
- data/test/config/core_test.rb +0 -66
- data/test/config/create_test.rb +0 -72
- data/test/config/delete_test.rb +0 -35
- data/test/config/field_search_test.rb +0 -49
- data/test/config/list_test.rb +0 -134
- data/test/config/nested_test.rb +0 -55
- data/test/config/search_test.rb +0 -62
- data/test/config/show_test.rb +0 -45
- data/test/config/subform_test.rb +0 -19
- data/test/config/update_test.rb +0 -52
- data/test/const_mocker.rb +0 -32
- data/test/data_structures/action_columns_test.rb +0 -112
- data/test/data_structures/action_link_test.rb +0 -79
- data/test/data_structures/action_links_test.rb +0 -78
- data/test/data_structures/actions_test.rb +0 -25
- data/test/data_structures/association_column_test.rb +0 -41
- data/test/data_structures/column_test.rb +0 -186
- data/test/data_structures/columns_test.rb +0 -68
- data/test/data_structures/set_test.rb +0 -84
- data/test/data_structures/sorting_test.rb +0 -148
- data/test/data_structures/standard_column_test.rb +0 -23
- data/test/data_structures/validation_reflection_test.rb +0 -69
- data/test/data_structures/virtual_column_test.rb +0 -23
- data/test/extensions/action_view_rendering_test.rb +0 -20
- data/test/extensions/active_record_test.rb +0 -44
- data/test/extensions/routing_mapper_test.rb +0 -73
- data/test/helpers/form_column_helpers_test.rb +0 -34
- data/test/helpers/list_column_helpers_test.rb +0 -53
- data/test/helpers/pagination_helpers_test.rb +0 -65
- data/test/helpers/search_column_helpers_test.rb +0 -15
- data/test/misc/active_record_permissions_test.rb +0 -193
- data/test/misc/attribute_params_test.rb +0 -460
- data/test/misc/calculation_test.rb +0 -39
- data/test/misc/configurable_test.rb +0 -97
- data/test/misc/constraints_test.rb +0 -209
- data/test/misc/convert_numbers_format_test.rb +0 -171
- data/test/misc/finder_test.rb +0 -124
- data/test/misc/lang_test.rb +0 -10
- data/test/misc/parse_datetime_test.rb +0 -159
- data/test/misc/render_test.rb +0 -9
- data/test/misc/tableless_test.rb +0 -56
- data/test/mock_app/.gitignore +0 -2
- data/test/mock_app/Rakefile +0 -7
- data/test/mock_app/app/assets/config/manifest.js +0 -0
- data/test/mock_app/app/controllers/addresses_controller.rb +0 -4
- data/test/mock_app/app/controllers/application_controller.rb +0 -10
- data/test/mock_app/app/controllers/buildings_controller.rb +0 -4
- data/test/mock_app/app/controllers/cars_controller.rb +0 -5
- data/test/mock_app/app/controllers/contacts_controller.rb +0 -4
- data/test/mock_app/app/controllers/floors_controller.rb +0 -6
- data/test/mock_app/app/controllers/people_controller.rb +0 -8
- data/test/mock_app/app/controllers/roles_controller.rb +0 -4
- data/test/mock_app/app/helpers/application_helper.rb +0 -3
- data/test/mock_app/app/models/address.rb +0 -3
- data/test/mock_app/app/models/building.rb +0 -9
- data/test/mock_app/app/models/car.rb +0 -3
- data/test/mock_app/app/models/contact.rb +0 -3
- data/test/mock_app/app/models/file_model.rb +0 -31
- data/test/mock_app/app/models/floor.rb +0 -8
- data/test/mock_app/app/models/person.rb +0 -12
- data/test/mock_app/app/models/role.rb +0 -3
- data/test/mock_app/app/views/active_scaffold_overrides/_form.html.erb +0 -2
- data/test/mock_app/app/views/active_scaffold_overrides/list.html.erb +0 -2
- data/test/mock_app/app/views/people/_first_name_form_column.html.erb +0 -2
- data/test/mock_app/app/views/people/_form.html.erb +0 -2
- data/test/mock_app/app/views/people/list.html.erb +0 -2
- data/test/mock_app/config/application.rb +0 -14
- data/test/mock_app/config/boot.rb +0 -7
- data/test/mock_app/config/database.yml +0 -16
- data/test/mock_app/config/environment.rb +0 -6
- data/test/mock_app/config/environments/development.rb +0 -24
- data/test/mock_app/config/environments/production.rb +0 -49
- data/test/mock_app/config/environments/test.rb +0 -34
- data/test/mock_app/config/initializers/backtrace_silencers.rb +0 -7
- data/test/mock_app/config/initializers/inflections.rb +0 -10
- data/test/mock_app/config/initializers/mime_types.rb +0 -5
- data/test/mock_app/config/initializers/secret_token.rb +0 -11
- data/test/mock_app/config/initializers/session_store.rb +0 -8
- data/test/mock_app/config/initializers/wrap_parameters.rb +0 -14
- data/test/mock_app/config/locales/en.yml +0 -5
- data/test/mock_app/config/routes.rb +0 -17
- data/test/mock_app/config.ru +0 -4
- data/test/mock_app/db/schema.rb +0 -68
- data/test/mock_app/db/test.sqlite3 +0 -1
- data/test/model_stub.rb +0 -64
- data/test/performance/list_cars_performance_test.rb +0 -34
- data/test/performance/list_people_performance_test.rb +0 -31
- data/test/performance_test_help.rb +0 -3
- data/test/run_all.rb +0 -6
- data/test/test_helper.rb +0 -71
- data/vendor/assets/javascripts/getprototypeof.js +0 -12
@@ -7,6 +7,7 @@ module ActiveScaffold
|
|
7
7
|
module ClassMethods
|
8
8
|
def self.extended(klass)
|
9
9
|
return unless klass.active_scaffold_config
|
10
|
+
|
10
11
|
if klass.active_scaffold_config.active_record?
|
11
12
|
klass.extend ActiveRecord
|
12
13
|
elsif klass.active_scaffold_config.mongoid?
|
@@ -103,14 +104,15 @@ module ActiveScaffold
|
|
103
104
|
if respond_to?(column_method)
|
104
105
|
args = [column, value, like_pattern]
|
105
106
|
args << session if method(column_method).arity == 4
|
106
|
-
return send("condition_for_#{column.name}_column", *args)
|
107
|
+
return send(:"condition_for_#{column.name}_column", *args)
|
107
108
|
end
|
108
|
-
return unless column
|
109
|
+
return unless column.search_sql && value.present?
|
110
|
+
|
109
111
|
search_ui = column.search_ui || column.column_type
|
110
112
|
begin
|
111
113
|
sql, *values =
|
112
|
-
if search_ui && respond_to?("condition_for_#{search_ui}_type")
|
113
|
-
send("condition_for_#{search_ui}_type", column, value, like_pattern)
|
114
|
+
if search_ui && respond_to?(:"condition_for_#{search_ui}_type")
|
115
|
+
send(:"condition_for_#{search_ui}_type", column, value, like_pattern)
|
114
116
|
elsif column.search_sql.instance_of? Proc
|
115
117
|
column.search_sql.call(value)
|
116
118
|
else
|
@@ -126,7 +128,7 @@ module ActiveScaffold
|
|
126
128
|
sql_conditions << subquery_sql
|
127
129
|
where_values.concat subquery_values
|
128
130
|
else
|
129
|
-
sql_conditions << sql % {:
|
131
|
+
sql_conditions << (sql % {search_sql: search_sql})
|
130
132
|
where_values.concat values
|
131
133
|
end
|
132
134
|
end
|
@@ -139,14 +141,14 @@ module ActiveScaffold
|
|
139
141
|
|
140
142
|
def subquery_condition(column, sql, options, values)
|
141
143
|
relation, *columns = options[:subquery]
|
142
|
-
conditions = [columns.map { |search_sql| sql % {:
|
144
|
+
conditions = [columns.map { |search_sql| sql % {search_sql: search_sql} }.join(' OR ')]
|
143
145
|
conditions += values * columns.size if values.present?
|
144
146
|
subquery = relation.where(conditions)
|
145
147
|
subquery = subquery.select(relation.primary_key) if subquery.select_values.blank?
|
146
148
|
|
147
149
|
conditions = [["#{options[:field] || column.field} IN (?)", options[:conditions]&.first].compact.join(' AND ')]
|
148
150
|
conditions << subquery
|
149
|
-
conditions.concat options[:conditions][1
|
151
|
+
conditions.concat options[:conditions][1..] if options[:conditions]
|
150
152
|
if column.association&.polymorphic?
|
151
153
|
conditions[0] << " AND #{column.quoted_foreign_type} = ?"
|
152
154
|
conditions << relation.base_class.sti_name
|
@@ -176,7 +178,7 @@ module ActiveScaffold
|
|
176
178
|
if value.is_a?(Hash)
|
177
179
|
condition_for_range(column, value, like_pattern)
|
178
180
|
else
|
179
|
-
values = Array(value).
|
181
|
+
values = Array(value).compact_blank
|
180
182
|
['%<search_sql>s in (?)', values] if values.present?
|
181
183
|
end
|
182
184
|
else
|
@@ -189,7 +191,7 @@ module ActiveScaffold
|
|
189
191
|
['%<search_sql>s = ?', condition_value_for_numeric(column, value)]
|
190
192
|
elsif ActiveScaffold::Finder::NULL_COMPARATORS.include?(value[:opt])
|
191
193
|
condition_for_null_type(column, value[:opt])
|
192
|
-
elsif value[:from].blank? ||
|
194
|
+
elsif value[:from].blank? || ActiveScaffold::Finder::NUMERIC_COMPARATORS.exclude?(value[:opt])
|
193
195
|
nil
|
194
196
|
elsif value[:opt] == 'BETWEEN'
|
195
197
|
['(%<search_sql>s BETWEEN ? AND ?)', condition_value_for_numeric(column, value[:from]), condition_value_for_numeric(column, value[:to])]
|
@@ -200,7 +202,7 @@ module ActiveScaffold
|
|
200
202
|
|
201
203
|
def condition_for_single_value(column, value, like_pattern = nil)
|
202
204
|
if column.text?
|
203
|
-
value = column.
|
205
|
+
value = column.active_record_class.sanitize_sql_like(value) if column.active_record?
|
204
206
|
["%<search_sql>s #{ActiveScaffold::Finder.like_operator} ?", like_pattern.sub('?', value)]
|
205
207
|
else
|
206
208
|
['%<search_sql>s = ?', ActiveScaffold::Core.column_type_cast(value, column.column)]
|
@@ -211,11 +213,11 @@ module ActiveScaffold
|
|
211
213
|
if ActiveScaffold::Finder::NULL_COMPARATORS.include?(value[:opt])
|
212
214
|
condition_for_null_type(column, value[:opt], like_pattern)
|
213
215
|
elsif value[:from].is_a?(Array) # opt can be only =
|
214
|
-
from = Array(value[:from]).
|
216
|
+
from = Array(value[:from]).compact_blank
|
215
217
|
['%<search_sql>s in (?)', from] if from.present?
|
216
218
|
elsif value[:from].blank?
|
217
219
|
nil
|
218
|
-
elsif ActiveScaffold::Finder::STRING_COMPARATORS.
|
220
|
+
elsif ActiveScaffold::Finder::STRING_COMPARATORS.value?(value[:opt])
|
219
221
|
text = column.active_record? ? column.active_record_class.sanitize_sql_like(value[:from]) : value[:from]
|
220
222
|
[
|
221
223
|
"%<search_sql>s #{'NOT ' if value[:opt].start_with?('not_')}#{ActiveScaffold::Finder.like_operator} ?",
|
@@ -229,18 +231,16 @@ module ActiveScaffold
|
|
229
231
|
end
|
230
232
|
|
231
233
|
def tables_for_translating_days_and_months(format)
|
232
|
-
# rubocop:disable Style/FormatStringToken
|
233
234
|
keys = {
|
234
235
|
'%A' => 'date.day_names',
|
235
236
|
'%a' => 'date.abbr_day_names',
|
236
237
|
'%B' => 'date.month_names',
|
237
238
|
'%b' => 'date.abbr_month_names'
|
238
239
|
}
|
239
|
-
|
240
|
-
key_index = keys.keys.map { |key| [key, format.index(key)] }.to_h
|
240
|
+
key_index = keys.keys.index_with { |key| format.index(key) }
|
241
241
|
keys.select! { |k, _| key_index[k] }
|
242
242
|
keys.sort_by { |k, _| key_index[k] }.map do |_, k|
|
243
|
-
I18n.t(k).compact.zip(I18n.t(k, :
|
243
|
+
I18n.t(k).compact.zip(I18n.t(k, locale: :en).compact).to_h
|
244
244
|
end
|
245
245
|
end
|
246
246
|
|
@@ -250,6 +250,7 @@ module ActiveScaffold
|
|
250
250
|
regexp = Regexp.union(table.keys)
|
251
251
|
index = value.index(regexp)
|
252
252
|
next unless index
|
253
|
+
|
253
254
|
translated << value.slice!(0...index)
|
254
255
|
value.sub!(regexp) do |str|
|
255
256
|
translated << table[str]
|
@@ -259,23 +260,12 @@ module ActiveScaffold
|
|
259
260
|
translated << value
|
260
261
|
end
|
261
262
|
|
262
|
-
def format_for_datetime(column, value)
|
263
|
+
def format_for_datetime(column, value, ui_name, ui_options)
|
263
264
|
parts = Date._parse(value)
|
264
|
-
|
265
|
-
|
266
|
-
end
|
267
|
-
|
268
|
-
if format.blank?
|
269
|
-
time_parts = [[:hour, '%H'], [:min, '%M'], [:sec, '%S']].map do |part, format_part|
|
270
|
-
format_part if parts[part].present?
|
271
|
-
end.compact
|
272
|
-
format = "#{I18n.t('date.formats.default')} #{time_parts.join(':')} #{'%z' if parts[:offset].present?}"
|
273
|
-
else
|
274
|
-
[[:hour, '%H'], [:min, ':%M'], [:sec, ':%S']].each do |part, f|
|
275
|
-
format.gsub!(f, '') if parts[part].blank?
|
276
|
-
end
|
277
|
-
format += ' %z' if parts[:offset].present? && format !~ /%z/i
|
265
|
+
time_parts = [[:hour, '%H'], [:min, '%M'], [:sec, '%S']].filter_map do |part, format_part|
|
266
|
+
format_part if parts[part].present?
|
278
267
|
end
|
268
|
+
format = "%Y-%m-%d #{time_parts.join(':')} #{'%z' if parts[:offset].present?}"
|
279
269
|
|
280
270
|
format.gsub!(/.*(?=%H)/, '') if !parts[:year] && !parts[:month] && !parts[:mday]
|
281
271
|
[format, parts[:offset]]
|
@@ -290,9 +280,9 @@ module ActiveScaffold
|
|
290
280
|
nil
|
291
281
|
end
|
292
282
|
|
293
|
-
def format_for_date(column, value,
|
294
|
-
if
|
295
|
-
format = I18n.t("date.formats.#{
|
283
|
+
def format_for_date(column, value, ui_name, ui_options)
|
284
|
+
if ui_options[:format]
|
285
|
+
format = I18n.t("date.formats.#{ui_options[:format]}")
|
296
286
|
format.gsub!(/%-d|%-m|%_m/) { |s| s.gsub(/[-_]/, '') } # strptime fails with %-d, %-m, %_m
|
297
287
|
en_value = I18n.locale == :en ? value : translate_days_and_months(value, format)
|
298
288
|
end
|
@@ -321,8 +311,10 @@ module ActiveScaffold
|
|
321
311
|
nil
|
322
312
|
end
|
323
313
|
|
324
|
-
def condition_value_for_datetime(column, value, conversion = :to_time)
|
314
|
+
def condition_value_for_datetime(column, value, conversion = :to_time, ui_method: :search_ui, ui_options: nil)
|
325
315
|
return if value.nil? || value.blank?
|
316
|
+
|
317
|
+
ui_options ||= column.send(:"#{ui_method}_options") || column.options
|
326
318
|
if value.is_a? Hash
|
327
319
|
local_time_from_hash(value, conversion)
|
328
320
|
elsif value.respond_to?(:strftime)
|
@@ -334,20 +326,21 @@ module ActiveScaffold
|
|
334
326
|
value.send(conversion)
|
335
327
|
end
|
336
328
|
elsif conversion == :to_date
|
337
|
-
parse_date_with_format(*format_for_date(column, value))
|
329
|
+
parse_date_with_format(*format_for_date(column, value, column.send(ui_method), ui_options))
|
338
330
|
elsif value.include?('T')
|
339
331
|
Time.zone.parse(value)
|
340
332
|
else # datetime
|
341
|
-
time = parse_time_with_format(value, *format_for_datetime(column, value))
|
333
|
+
time = parse_time_with_format(value, *format_for_datetime(column, value, column.send(ui_method), ui_options))
|
342
334
|
conversion == :to_time ? time : time.send(conversion)
|
343
335
|
end
|
344
336
|
end
|
345
337
|
|
346
338
|
def condition_value_for_numeric(column, value)
|
347
339
|
return value if value.nil?
|
340
|
+
|
348
341
|
value = column.number_to_native(value) if column.options[:format] && column.search_ui != :number
|
349
|
-
case
|
350
|
-
when :integer
|
342
|
+
case column.search_ui || column.column_type
|
343
|
+
when :integer
|
351
344
|
if value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
352
345
|
value ? 1 : 0
|
353
346
|
else
|
@@ -443,15 +436,16 @@ module ActiveScaffold
|
|
443
436
|
else
|
444
437
|
range_type, range = value['range'].downcase.split('_')
|
445
438
|
raise ArgumentError unless %w[week month year].include?(range)
|
439
|
+
|
446
440
|
case range_type
|
447
441
|
when 'this'
|
448
|
-
|
442
|
+
[datetime_now.send(:"beginning_of_#{range}"), datetime_now.send(:"end_of_#{range}")]
|
449
443
|
when 'prev'
|
450
|
-
|
444
|
+
[datetime_now.ago(1.send(range.to_sym)).send(:"beginning_of_#{range}"), datetime_now.ago(1.send(range.to_sym)).send(:"end_of_#{range}")]
|
451
445
|
when 'next'
|
452
|
-
|
446
|
+
[datetime_now.in(1.send(range.to_sym)).send(:"beginning_of_#{range}"), datetime_now.in(1.send(range.to_sym)).send(:"end_of_#{range}")]
|
453
447
|
else
|
454
|
-
|
448
|
+
[nil, nil]
|
455
449
|
end
|
456
450
|
end
|
457
451
|
end
|
@@ -462,7 +456,7 @@ module ActiveScaffold
|
|
462
456
|
|
463
457
|
def condition_for_record_select_type(column, value, like_pattern = nil)
|
464
458
|
if value.is_a?(Array)
|
465
|
-
value = value.
|
459
|
+
value = value.compact_blank
|
466
460
|
['%<search_sql>s IN (?)', value] if value.present?
|
467
461
|
else
|
468
462
|
['%<search_sql>s = ?', value]
|
@@ -489,12 +483,12 @@ module ActiveScaffold
|
|
489
483
|
'BETWEEN'
|
490
484
|
].freeze
|
491
485
|
STRING_COMPARATORS = {
|
492
|
-
:
|
493
|
-
:
|
494
|
-
:
|
495
|
-
:
|
496
|
-
:
|
497
|
-
:
|
486
|
+
contains: '%?%',
|
487
|
+
begins_with: '?%',
|
488
|
+
ends_with: '%?',
|
489
|
+
doesnt_contain: 'not_%?%',
|
490
|
+
doesnt_begin_with: 'not_?%',
|
491
|
+
doesnt_end_with: 'not_%?'
|
498
492
|
}.freeze
|
499
493
|
NULL_COMPARATORS = %w[null not_null].freeze
|
500
494
|
DATE_COMPARATORS = %w[PAST FUTURE RANGE].freeze
|
@@ -508,27 +502,24 @@ module ActiveScaffold
|
|
508
502
|
|
509
503
|
protected
|
510
504
|
|
511
|
-
attr_writer :active_scaffold_conditions
|
505
|
+
attr_writer :active_scaffold_conditions, :active_scaffold_preload, :active_scaffold_habtm_joins, :active_scaffold_outer_joins, :active_scaffold_references
|
506
|
+
|
512
507
|
def active_scaffold_conditions
|
513
508
|
@active_scaffold_conditions ||= []
|
514
509
|
end
|
515
510
|
|
516
|
-
attr_writer :active_scaffold_preload
|
517
511
|
def active_scaffold_preload
|
518
512
|
@active_scaffold_preload ||= []
|
519
513
|
end
|
520
514
|
|
521
|
-
attr_writer :active_scaffold_habtm_joins
|
522
515
|
def active_scaffold_habtm_joins
|
523
516
|
@active_scaffold_habtm_joins ||= []
|
524
517
|
end
|
525
518
|
|
526
|
-
attr_writer :active_scaffold_outer_joins
|
527
519
|
def active_scaffold_outer_joins
|
528
520
|
@active_scaffold_outer_joins ||= []
|
529
521
|
end
|
530
522
|
|
531
|
-
attr_writer :active_scaffold_references
|
532
523
|
def active_scaffold_references
|
533
524
|
@active_scaffold_references ||= []
|
534
525
|
end
|
@@ -550,15 +541,15 @@ module ActiveScaffold
|
|
550
541
|
params_hash active_scaffold_embedded_params[:conditions]
|
551
542
|
end
|
552
543
|
|
553
|
-
def all_conditions(
|
544
|
+
def all_conditions(id_condition: true)
|
554
545
|
[
|
555
|
-
(id_condition if
|
546
|
+
(self.id_condition if id_condition), # for list with id (e.g. /users/:id/index)
|
556
547
|
active_scaffold_conditions, # from the search modules
|
557
548
|
conditions_for_collection, # from the dev
|
558
549
|
conditions_from_params, # from the parameters (e.g. /users/list?first_name=Fred)
|
559
550
|
conditions_from_constraints, # from any constraints (embedded scaffolds)
|
560
551
|
active_scaffold_embedded_conditions # embedding conditions (weaker constraints)
|
561
|
-
].
|
552
|
+
].compact_blank
|
562
553
|
end
|
563
554
|
|
564
555
|
def id_condition
|
@@ -570,14 +561,15 @@ module ActiveScaffold
|
|
570
561
|
# accomplishes this by checking model.#{action}_authorized?
|
571
562
|
def find_if_allowed(id, security_options, klass = beginning_of_chain)
|
572
563
|
record = klass.find(id)
|
573
|
-
security_options = {:
|
564
|
+
security_options = {crud_type: security_options.to_sym} unless security_options.is_a? Hash
|
574
565
|
raise ActiveScaffold::RecordNotAllowed, "#{klass} with id = #{id}" unless record.authorized_for? security_options
|
566
|
+
|
575
567
|
record
|
576
568
|
end
|
577
569
|
|
578
570
|
# valid options may include:
|
579
571
|
# * :sorting - a Sorting DataStructure (basically an array of hashes of field => direction,
|
580
|
-
# e.g. [{:
|
572
|
+
# e.g. [{field1: 'asc'}, {field2: 'desc'}]).
|
581
573
|
# please note that multi-column sorting has some limitations: if any column in a multi-field
|
582
574
|
# sort uses method-based sorting, it will be ignored. method sorting only works for single-column sorting.
|
583
575
|
# * :per_page
|
@@ -586,22 +578,22 @@ module ActiveScaffold
|
|
586
578
|
search_conditions = all_conditions
|
587
579
|
|
588
580
|
sorting = options[:sorting]&.clause
|
589
|
-
sorting = sorting.map
|
581
|
+
sorting = sorting.map { |part| Arel.sql(part) } if sorting && active_scaffold_config.active_record?
|
590
582
|
# create a general-use options array that's compatible with Rails finders
|
591
583
|
finder_options = {
|
592
|
-
:
|
593
|
-
:
|
584
|
+
reorder: sorting,
|
585
|
+
conditions: search_conditions
|
594
586
|
}
|
595
587
|
if active_scaffold_config.mongoid?
|
596
588
|
finder_options[:includes] = [active_scaffold_references, active_scaffold_preload].compact.flatten.uniq.presence
|
597
589
|
else
|
598
590
|
finder_options.merge!(
|
599
|
-
:
|
600
|
-
:
|
601
|
-
:
|
602
|
-
:
|
603
|
-
:
|
604
|
-
:
|
591
|
+
joins: joins_for_finder,
|
592
|
+
left_joins: active_scaffold_outer_joins,
|
593
|
+
preload: active_scaffold_preload,
|
594
|
+
includes: active_scaffold_references.presence,
|
595
|
+
references: active_scaffold_references.presence,
|
596
|
+
select: options[:select]
|
605
597
|
)
|
606
598
|
end
|
607
599
|
|
@@ -611,7 +603,7 @@ module ActiveScaffold
|
|
611
603
|
|
612
604
|
def count_items(query, find_options = {}, count_includes = nil)
|
613
605
|
count_includes ||= find_options[:includes] if find_options[:conditions].present?
|
614
|
-
options = find_options.
|
606
|
+
options = find_options.except(:select, :reorder, :order)
|
615
607
|
# NOTE: we must use includes in the count query, because some conditions may reference other tables
|
616
608
|
options[:includes] = count_includes
|
617
609
|
|
@@ -650,7 +642,7 @@ module ActiveScaffold
|
|
650
642
|
end
|
651
643
|
else
|
652
644
|
::Paginator.new(count, options[:per_page]) do |offset, per_page|
|
653
|
-
query = append_to_query(query, :
|
645
|
+
query = append_to_query(query, offset: offset, limit: per_page) if options[:pagination]
|
654
646
|
calculate_last_modified(query)
|
655
647
|
query
|
656
648
|
end
|
@@ -660,29 +652,30 @@ module ActiveScaffold
|
|
660
652
|
|
661
653
|
def calculate_last_modified(query)
|
662
654
|
return unless conditional_get_support? && ActiveScaffold::OrmChecks.columns_hash(query.klass)['updated_at']
|
655
|
+
|
663
656
|
@last_modified = query.maximum(:updated_at)
|
664
657
|
end
|
665
658
|
|
666
|
-
def calculate_subquery(id_condition
|
667
|
-
conditions = all_conditions(id_condition)
|
659
|
+
def calculate_subquery(id_condition: true)
|
660
|
+
conditions = all_conditions(id_condition: id_condition)
|
668
661
|
includes = active_scaffold_config.list.count_includes
|
669
662
|
includes ||= active_scaffold_references if conditions.present?
|
670
663
|
left_joins = active_scaffold_outer_joins
|
671
664
|
left_joins += includes if includes
|
672
665
|
primary_key = active_scaffold_config.primary_key
|
673
|
-
subquery = append_to_query(beginning_of_chain, :
|
666
|
+
subquery = append_to_query(beginning_of_chain, conditions: conditions, joins: joins_for_finder, left_joins: left_joins, select: active_scaffold_config.columns[primary_key].field)
|
674
667
|
subquery.unscope(:order)
|
675
668
|
end
|
676
669
|
|
677
|
-
def calculate_query(id_condition
|
678
|
-
active_scaffold_config.model.where(active_scaffold_config.primary_key => calculate_subquery(id_condition))
|
670
|
+
def calculate_query(id_condition: true)
|
671
|
+
active_scaffold_config.model.where(active_scaffold_config.primary_key => calculate_subquery(id_condition: id_condition))
|
679
672
|
end
|
680
673
|
|
681
674
|
def append_to_query(relation, options)
|
682
675
|
options.assert_valid_keys :where, :select, :having, :group, :reorder, :order, :limit, :offset,
|
683
676
|
:joins, :left_joins, :left_outer_joins, :includes, :lock, :readonly,
|
684
677
|
:from, :conditions, :preload, :references
|
685
|
-
relation = options.
|
678
|
+
relation = options.compact_blank.inject(relation) do |rel, (k, v)|
|
686
679
|
k == :conditions ? apply_conditions(rel, *v) : rel.send(k, v)
|
687
680
|
end
|
688
681
|
relation.distinct_value = true if options[:left_outer_joins].present? || options[:left_joins].present?
|
@@ -701,7 +694,7 @@ module ActiveScaffold
|
|
701
694
|
end
|
702
695
|
|
703
696
|
def apply_conditions(relation, *conditions)
|
704
|
-
conditions.
|
697
|
+
conditions.compact_blank.inject(relation) do |rel, condition|
|
705
698
|
if condition.is_a?(Array) && !condition.first.is_a?(String) # multiple conditions
|
706
699
|
apply_conditions(rel, *condition)
|
707
700
|
else
|
@@ -15,7 +15,7 @@ module ActiveScaffold
|
|
15
15
|
if link.security_method_set? || controller.respond_to?(link.security_method, true)
|
16
16
|
controller.send(link.security_method, *args)
|
17
17
|
else
|
18
|
-
args.empty? ? true : args.first.authorized_for?(:
|
18
|
+
args.empty? ? true : args.first.authorized_for?(crud_type: link.crud_type, action: link.action, reason: true)
|
19
19
|
end
|
20
20
|
[auth, reason]
|
21
21
|
end
|
@@ -35,63 +35,47 @@ module ActiveScaffold
|
|
35
35
|
options[:level] ||= 0
|
36
36
|
options[:first_action] = true
|
37
37
|
output = ActiveSupport::SafeBuffer.new
|
38
|
-
prev_link = separator = nil
|
39
38
|
|
40
39
|
action_links.each(reverse: options.delete(:reverse), groups: true) do |link|
|
41
|
-
if link == :separator
|
42
|
-
separator = true if prev_link
|
43
|
-
next
|
44
|
-
end
|
45
|
-
content = nil
|
46
40
|
if link.is_a? ActiveScaffold::DataStructures::ActionLinks
|
47
|
-
|
41
|
+
unless link.empty?
|
42
|
+
options[:level] += 1
|
43
|
+
content = display_action_links(link, record, options, &block)
|
44
|
+
options[:level] -= 1
|
45
|
+
if content.present?
|
46
|
+
output << display_action_link(link, content, record, options)
|
47
|
+
options[:first_action] = false
|
48
|
+
end
|
49
|
+
end
|
48
50
|
elsif !skip_action_link?(link, *Array(options[:for]))
|
49
51
|
authorized, reason = action_link_authorized?(link, *Array(options[:for]))
|
50
52
|
next if !authorized && options[:skip_unauthorized]
|
51
53
|
|
52
|
-
|
54
|
+
output << display_action_link(link, nil, record, options.merge(authorized: authorized, not_authorized_reason: reason))
|
53
55
|
options[:first_action] = false
|
54
56
|
end
|
55
|
-
next if content.blank?
|
56
|
-
|
57
|
-
prev_link = true
|
58
|
-
output << display_action_link_separator(options) if separator
|
59
|
-
output << content
|
60
|
-
separator = false
|
61
57
|
end
|
62
58
|
output
|
63
59
|
end
|
64
60
|
|
65
|
-
def display_action_link_group(link, record, options, &block)
|
66
|
-
options[:level] += 1
|
67
|
-
content = display_action_links(link, record, options, &block)
|
68
|
-
options[:level] -= 1
|
69
|
-
display_action_link(link, content, record, options).tap { options[:first_action] = false } if content.present?
|
70
|
-
end
|
71
|
-
|
72
|
-
def display_action_link_separator(options)
|
73
|
-
tag = options[:level_0_tag] || :a if options[:level].zero?
|
74
|
-
content_tag(tag || :li, ' '.html_safe, class: 'separator') # rubocop:disable Rails/OutputSafety
|
75
|
-
end
|
76
|
-
|
77
61
|
def display_action_link(link, content, record, options)
|
78
62
|
if content
|
79
63
|
html_classes = hover_via_click? ? 'hover_click ' : ''
|
80
|
-
if options[:level].zero?
|
64
|
+
if (options[:level]).zero?
|
81
65
|
html_classes << 'action_group'
|
82
66
|
group_tag = :div
|
83
67
|
else
|
84
68
|
html_classes << 'top' if options[:first_action]
|
85
69
|
group_tag = :li
|
86
70
|
end
|
87
|
-
content = content_tag(group_tag, :
|
88
|
-
content_tag(:div, as_(link.label(record)), :
|
71
|
+
content = content_tag(group_tag, class: html_classes.presence, onclick: ('' if hover_via_click?)) do
|
72
|
+
content_tag(:div, as_(link.label(record)), class: link.css_class) << content_tag(:ul, content)
|
89
73
|
end
|
90
74
|
else
|
91
75
|
content = render_action_link(link, record, options)
|
92
|
-
content = content_tag(:li, content, class: ('top' if options[:first_action])) unless options[:level].zero?
|
76
|
+
content = content_tag(:li, content, class: ('top' if options[:first_action])) unless (options[:level]).zero?
|
93
77
|
end
|
94
|
-
content = content_tag(options[:level_0_tag], content, options[:options_level_0_tag]) if options[:level].zero? && options[:level_0_tag]
|
78
|
+
content = content_tag(options[:level_0_tag], content, options[:options_level_0_tag]) if (options[:level]).zero? && options[:level_0_tag]
|
95
79
|
content
|
96
80
|
end
|
97
81
|
|
@@ -103,7 +87,7 @@ module ActiveScaffold
|
|
103
87
|
end
|
104
88
|
if link.action.nil? || (link.type == :member && options.key?(:authorized) && !options[:authorized])
|
105
89
|
html_class = "disabled #{link.action}#{" #{link.html_options[:class]}" if link.html_options[:class].present?}"
|
106
|
-
html_options = {:
|
90
|
+
html_options = {link: action_link_text(link, record, options), class: html_class, title: options[:not_authorized_reason]}
|
107
91
|
action_link_html(link, nil, html_options, record)
|
108
92
|
else
|
109
93
|
url = action_link_url(link, record)
|
@@ -161,9 +145,9 @@ module ActiveScaffold
|
|
161
145
|
else
|
162
146
|
associated
|
163
147
|
end
|
164
|
-
authorized, reason = associated_for_authorized.authorized_for?(:
|
148
|
+
authorized, reason = associated_for_authorized.authorized_for?(crud_type: link.crud_type, reason: true)
|
165
149
|
if link.crud_type == :create && authorized
|
166
|
-
authorized, reason = record.authorized_for?(:
|
150
|
+
authorized, reason = record.authorized_for?(crud_type: :update, column: column.name, reason: true)
|
167
151
|
end
|
168
152
|
[authorized, reason]
|
169
153
|
else
|
@@ -172,7 +156,8 @@ module ActiveScaffold
|
|
172
156
|
end
|
173
157
|
|
174
158
|
def sti_record?(record)
|
175
|
-
return unless active_scaffold_config.active_record?
|
159
|
+
return false unless active_scaffold_config.active_record?
|
160
|
+
|
176
161
|
model = active_scaffold_config.model
|
177
162
|
record && model.columns_hash.include?(model.inheritance_column) &&
|
178
163
|
record[model.inheritance_column].present? && !record.instance_of?(model)
|
@@ -213,7 +198,7 @@ module ActiveScaffold
|
|
213
198
|
|
214
199
|
def add_query_string_to_cached_url(link, url)
|
215
200
|
query_string, non_nested_query_string = query_string_for_action_links(link)
|
216
|
-
nested_params =
|
201
|
+
nested_params = !link.nested_link? && non_nested_query_string
|
217
202
|
if query_string || nested_params
|
218
203
|
url << (url.include?('?') ? '&' : '?')
|
219
204
|
url << query_string if query_string
|
@@ -230,7 +215,7 @@ module ActiveScaffold
|
|
230
215
|
|
231
216
|
def column_in_params_conditions?(key)
|
232
217
|
if key.match?(/!$/)
|
233
|
-
conditions_from_params[1
|
218
|
+
conditions_from_params[1..].any? { |node| node.left.name.to_s == key[0..-2] }
|
234
219
|
else
|
235
220
|
conditions_from_params[0].include?(key)
|
236
221
|
end
|
@@ -244,6 +229,7 @@ module ActiveScaffold
|
|
244
229
|
if defined?(@query_string) && link.parameters.none? { |k, _| @query_string_params.include? k }
|
245
230
|
return [@query_string, @non_nested_query_string]
|
246
231
|
end
|
232
|
+
|
247
233
|
keep = true
|
248
234
|
@query_string_params ||= Set.new
|
249
235
|
query_string_options = {}
|
@@ -286,15 +272,13 @@ module ActiveScaffold
|
|
286
272
|
@action_links_url_options ||= {}
|
287
273
|
@action_links_url_options[link.name_to_cache.to_s] || begin
|
288
274
|
options = action_link_url_options(link, record)
|
289
|
-
if cache_action_link_url_options?(link, record)
|
290
|
-
@action_links_url_options[link.name_to_cache.to_s] = options
|
291
|
-
end
|
275
|
+
@action_links_url_options[link.name_to_cache.to_s] = options if cache_action_link_url_options?(link, record)
|
292
276
|
options
|
293
277
|
end
|
294
278
|
end
|
295
279
|
|
296
280
|
def action_link_url_options(link, record)
|
297
|
-
url_options = {:
|
281
|
+
url_options = {action: link.action}
|
298
282
|
url_options[:id] = '--ID--' unless record.nil?
|
299
283
|
url_options[:controller] = link.controller.to_s if link.controller
|
300
284
|
url_options.merge! link.parameters if link.parameters
|
@@ -316,7 +300,10 @@ module ActiveScaffold
|
|
316
300
|
end
|
317
301
|
|
318
302
|
def action_link_text(link, record, options)
|
319
|
-
|
303
|
+
if link.image
|
304
|
+
title = options[:link] || link.label(record)
|
305
|
+
text = image_tag(link.image[:name], size: link.image[:size], alt: title, title: title)
|
306
|
+
end
|
320
307
|
text || options[:link]
|
321
308
|
end
|
322
309
|
|
@@ -345,7 +332,7 @@ module ActiveScaffold
|
|
345
332
|
|
346
333
|
def action_link_html_options(link, record, options)
|
347
334
|
link_id = get_action_link_id(link, record)
|
348
|
-
html_options = link.html_options.merge(:
|
335
|
+
html_options = link.html_options.merge(class: [link.html_options[:class], link.action.to_s].compact.join(' '))
|
349
336
|
html_options[:link] = action_link_text(link, record, options)
|
350
337
|
|
351
338
|
# Needs to be in html_options to as the adding _method to the url is no longer supported by Rails
|
@@ -397,8 +384,10 @@ module ActiveScaffold
|
|
397
384
|
end
|
398
385
|
id ||= record&.id&.to_s || (nested? ? nested_parent_id.to_s : '')
|
399
386
|
action_link_id = ActiveScaffold::Registry.cache :action_link_id, link.name_to_cache.to_s do
|
400
|
-
|
401
|
-
|
387
|
+
if params[:parent_controller] || (link.controller && link.controller != controller.controller_path)
|
388
|
+
controller_id = id_from_controller("#{link.controller}-")
|
389
|
+
end
|
390
|
+
action_link_id("#{controller_id}#{link.action}", '--ID--')
|
402
391
|
end
|
403
392
|
action_link_id.sub('--ID--', id)
|
404
393
|
end
|
@@ -417,9 +406,7 @@ module ActiveScaffold
|
|
417
406
|
if column&.association
|
418
407
|
url_options[:parent_scaffold] = controller_path
|
419
408
|
url_options[column.model.name.foreign_key.to_sym] = url_options.delete(:id)
|
420
|
-
url_options[:id] = if column.association.singular? && url_options[:action].to_sym != :index
|
421
|
-
'--CHILD_ID--'
|
422
|
-
end
|
409
|
+
url_options[:id] = ('--CHILD_ID--' if column.association.singular? && url_options[:action].to_sym != :index)
|
423
410
|
elsif link.parameters&.dig(:named_scope)
|
424
411
|
url_options[:parent_scaffold] = controller_path
|
425
412
|
url_options[active_scaffold_config.model.name.foreign_key.to_sym] = url_options.delete(:id)
|
@@ -434,6 +421,7 @@ module ActiveScaffold
|
|
434
421
|
# however that will not work if a sti parent is a singular association inline autolink
|
435
422
|
return unless link.column.nil?
|
436
423
|
return if (sti_controller_path = controller_path_for_activerecord(record.class)).nil?
|
424
|
+
|
437
425
|
url_options[:controller] = sti_controller_path
|
438
426
|
url_options[:parent_sti] = controller_path
|
439
427
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module ActiveScaffold
|
3
2
|
module Helpers
|
4
3
|
module AssociationHelpers
|
@@ -23,6 +22,7 @@ module ActiveScaffold
|
|
23
22
|
if klass.nil? && association.polymorphic?
|
24
23
|
class_name = record.send(association.foreign_type) if association.belongs_to?
|
25
24
|
return [] if class_name.blank?
|
25
|
+
|
26
26
|
klass = class_name.constantize
|
27
27
|
cache = !block_given?
|
28
28
|
else
|
@@ -96,12 +96,13 @@ module ActiveScaffold
|
|
96
96
|
def options_for_association_conditions(association, record = nil)
|
97
97
|
return nil if association.through?
|
98
98
|
return nil unless association.has_one? || association.has_many?
|
99
|
+
|
99
100
|
# Find only orphaned objects
|
100
101
|
{association.foreign_key => nil}
|
101
102
|
end
|
102
103
|
|
103
104
|
def record_select_params_for_add_existing(association, edit_associated_url_options, record)
|
104
|
-
{:
|
105
|
+
{onselect: "ActiveScaffold.record_select_onselect(#{url_for(edit_associated_url_options).to_json}, #{active_scaffold_id.to_json}, id);"}
|
105
106
|
end
|
106
107
|
end
|
107
108
|
end
|