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
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveScaffold::Actions
|
2
2
|
module List
|
3
3
|
def self.included(base)
|
4
|
-
base.before_action :list_authorized_filter, :
|
4
|
+
base.before_action :list_authorized_filter, only: :index
|
5
5
|
base.helper_method :list_columns, :count_on_association_class?
|
6
6
|
end
|
7
7
|
|
@@ -32,19 +32,19 @@ module ActiveScaffold::Actions
|
|
32
32
|
|
33
33
|
def list_respond_to_html
|
34
34
|
if loading_embedded?
|
35
|
-
render :
|
35
|
+
render action: 'list', layout: false
|
36
36
|
else
|
37
|
-
render :
|
37
|
+
render action: 'list'
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def list_respond_to_js
|
42
42
|
if params[:adapter] || loading_embedded?
|
43
|
-
render
|
43
|
+
render partial: 'list_with_header'
|
44
44
|
else
|
45
45
|
@auto_pagination = params[:auto_pagination]
|
46
46
|
@popstate = params.delete(:_popstate)
|
47
|
-
render :
|
47
|
+
render partial: 'refresh_list', formats: [:js]
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -57,22 +57,17 @@ module ActiveScaffold::Actions
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def row_respond_to_html
|
60
|
-
render
|
60
|
+
render partial: 'row', locals: {record: @record}
|
61
61
|
end
|
62
62
|
|
63
63
|
def row_respond_to_js
|
64
|
-
render :
|
64
|
+
render action: 'row'
|
65
65
|
end
|
66
66
|
|
67
67
|
# The actual algorithm to prepare for the list view
|
68
68
|
def set_includes_for_columns(action = :list, sorting = active_scaffold_config.list.user.sorting)
|
69
69
|
@cache_associations = true
|
70
|
-
columns =
|
71
|
-
if respond_to?(:"#{action}_columns", true)
|
72
|
-
send(:"#{action}_columns")
|
73
|
-
else
|
74
|
-
active_scaffold_config.send(action).columns.visible_columns(flatten: true)
|
75
|
-
end
|
70
|
+
columns = columns_for_action(action)
|
76
71
|
joins_cols, preload_cols = columns.select { |c| c.includes.present? }.partition do |col|
|
77
72
|
includes_need_join?(col, sorting) && !grouped_search?
|
78
73
|
end
|
@@ -81,10 +76,19 @@ module ActiveScaffold::Actions
|
|
81
76
|
set_includes_for_sorting(columns, sorting) if sorting.sorts_by_sql?
|
82
77
|
end
|
83
78
|
|
79
|
+
def columns_for_action(action)
|
80
|
+
if respond_to?(:"#{action}_columns", true)
|
81
|
+
send(:"#{action}_columns")
|
82
|
+
else
|
83
|
+
active_scaffold_config.send(action).columns.visible_columns(flatten: true)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
84
87
|
def set_includes_for_sorting(columns, sorting)
|
85
88
|
sorting.each_column do |col|
|
86
89
|
next if sorting.constraint_columns.include? col.name
|
87
|
-
next unless col.includes.present? &&
|
90
|
+
next unless col.includes.present? && columns.exclude?(col)
|
91
|
+
|
88
92
|
if active_scaffold_config.model.connection.needs_order_expressions_in_select?
|
89
93
|
active_scaffold_references << col.includes
|
90
94
|
else
|
@@ -130,11 +134,7 @@ module ActiveScaffold::Actions
|
|
130
134
|
end
|
131
135
|
|
132
136
|
def columns_to_cache_counts
|
133
|
-
list_columns.select
|
134
|
-
col.association&.collection? && col.includes.blank? && col.associated_number? &&
|
135
|
-
!ActiveScaffold::OrmChecks.tableless?(col.association.klass) &&
|
136
|
-
!col.association.reverse_association&.counter_cache
|
137
|
-
end
|
137
|
+
list_columns.select(&:cache_count?)
|
138
138
|
end
|
139
139
|
|
140
140
|
def cache_column_counts(records)
|
@@ -166,18 +166,18 @@ module ActiveScaffold::Actions
|
|
166
166
|
if column.association.as
|
167
167
|
query.where!(column.association.reverse_association.foreign_type => active_scaffold_config.model.name)
|
168
168
|
end
|
169
|
-
if column.association.scope
|
170
|
-
query = query.instance_exec(&column.association.scope)
|
171
|
-
end
|
169
|
+
query = query.instance_exec(&column.association.scope) if column.association.scope
|
172
170
|
query.group(column.association.foreign_key)
|
173
171
|
end
|
174
172
|
|
175
173
|
def count_query_with_join(column, records)
|
176
174
|
klass = column.association.klass
|
177
175
|
query = active_scaffold_config.model.where(active_scaffold_config.primary_key => records.map(&:id))
|
178
|
-
|
179
|
-
|
180
|
-
|
176
|
+
.joins(column.name).group(active_scaffold_config.primary_key)
|
177
|
+
.select("#{klass.quoted_table_name}.#{klass.quoted_primary_key}")
|
178
|
+
if column.association.scope && klass.instance_exec(&column.association.scope).values[:distinct]
|
179
|
+
query = query.distinct
|
180
|
+
end
|
181
181
|
query
|
182
182
|
end
|
183
183
|
|
@@ -195,8 +195,8 @@ module ActiveScaffold::Actions
|
|
195
195
|
|
196
196
|
def find_page_options
|
197
197
|
options = {
|
198
|
-
:
|
199
|
-
:
|
198
|
+
sorting: active_scaffold_config.list.user.sorting,
|
199
|
+
count_includes: active_scaffold_config.list.user.count_includes
|
200
200
|
}
|
201
201
|
|
202
202
|
paginate = params[:format].nil? ? accepts?(:html, :js) : %w[html js].include?(params[:format])
|
@@ -208,7 +208,7 @@ module ActiveScaffold::Actions
|
|
208
208
|
|
209
209
|
if active_scaffold_config.list.auto_select_columns
|
210
210
|
auto_select_columns = list_columns + [active_scaffold_config.columns[active_scaffold_config.model.primary_key]]
|
211
|
-
options[:select] = auto_select_columns.
|
211
|
+
options[:select] = auto_select_columns.filter_map { |c| quoted_select_columns(c.select_columns) }.flatten
|
212
212
|
end
|
213
213
|
|
214
214
|
options
|
@@ -227,12 +227,12 @@ module ActiveScaffold::Actions
|
|
227
227
|
do_list
|
228
228
|
end
|
229
229
|
|
230
|
-
def each_record_in_page
|
231
|
-
page_items.each
|
230
|
+
def each_record_in_page(&block)
|
231
|
+
page_items.each(&block)
|
232
232
|
end
|
233
233
|
|
234
|
-
def each_record_in_scope
|
235
|
-
scoped_query.each
|
234
|
+
def each_record_in_scope(&block)
|
235
|
+
scoped_query.each(&block)
|
236
236
|
end
|
237
237
|
|
238
238
|
def page_items
|
@@ -257,7 +257,7 @@ module ActiveScaffold::Actions
|
|
257
257
|
# The default security delegates to ActiveRecordPermissions.
|
258
258
|
# You may override the method to customize.
|
259
259
|
def list_authorized?
|
260
|
-
authorized_for?(:
|
260
|
+
authorized_for?(crud_type: :read)
|
261
261
|
end
|
262
262
|
|
263
263
|
def action_update_respond_to_js
|
@@ -271,7 +271,7 @@ module ActiveScaffold::Actions
|
|
271
271
|
if active_scaffold_config.list.calculate_etag
|
272
272
|
@records.to_a
|
273
273
|
elsif active_scaffold_config.list.user.sorting
|
274
|
-
{:
|
274
|
+
{etag: active_scaffold_config.list.user.sorting.clause}
|
275
275
|
end
|
276
276
|
end
|
277
277
|
objects.presence || super
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveScaffold::Actions
|
2
2
|
module Mark
|
3
3
|
def self.included(base)
|
4
|
-
base.before_action :mark_authorized_filter, :
|
4
|
+
base.before_action :mark_authorized_filter, only: :mark
|
5
5
|
base.before_action :assign_marked_records_to_model
|
6
6
|
base.helper_method :marked_records
|
7
7
|
end
|
@@ -14,7 +14,7 @@ module ActiveScaffold::Actions
|
|
14
14
|
end
|
15
15
|
if marked_records.any?
|
16
16
|
count = marked_records.length
|
17
|
-
flash[:info] = as_(:records_marked, :
|
17
|
+
flash[:info] = as_(:records_marked, count: count, model: active_scaffold_config.label(count: count))
|
18
18
|
end
|
19
19
|
respond_to_action(:mark)
|
20
20
|
end
|
@@ -30,11 +30,11 @@ module ActiveScaffold::Actions
|
|
30
30
|
if params.delete(:id) # so find_page doesn't filter by :id
|
31
31
|
do_search if respond_to? :do_search, true
|
32
32
|
set_includes_for_columns if active_scaffold_config.actions.include? :list
|
33
|
-
@page = find_page(:
|
34
|
-
render :
|
33
|
+
@page = find_page(pagination: active_scaffold_config.mark.mark_all_mode != :page)
|
34
|
+
render action: 'on_mark'
|
35
35
|
else
|
36
36
|
@include_checkboxes = true
|
37
|
-
render :
|
37
|
+
render action: 'on_mark', locals: {checked: mark?}
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -8,9 +8,8 @@ module ActiveScaffold::Actions
|
|
8
8
|
base.module_eval do
|
9
9
|
before_action :set_nested
|
10
10
|
before_action :configure_nested
|
11
|
-
include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.columns.
|
11
|
+
include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.columns.filter_map(&:association).any?(&:habtm?)
|
12
12
|
end
|
13
|
-
base.before_action :include_habtm_actions
|
14
13
|
base.helper_method :nested
|
15
14
|
base.helper_method :nested_parent_record
|
16
15
|
end
|
@@ -29,65 +28,39 @@ module ActiveScaffold::Actions
|
|
29
28
|
def set_nested
|
30
29
|
@nested = nil
|
31
30
|
return unless params[:parent_scaffold] && (params[:association] || params[:named_scope])
|
31
|
+
|
32
32
|
@nested = ActiveScaffold::DataStructures::NestedInfo.get(self.class.active_scaffold_config.model, params)
|
33
33
|
end
|
34
34
|
|
35
35
|
def configure_nested
|
36
36
|
return unless nested?
|
37
|
+
|
37
38
|
register_constraints_with_action_columns(nested.constrained_fields)
|
38
39
|
return unless active_scaffold_config.actions.include? :list
|
40
|
+
|
39
41
|
active_scaffold_config.list.user.label = nested_label
|
40
42
|
return if active_scaffold_config.nested.ignore_order_from_association
|
43
|
+
|
41
44
|
chain = beginning_of_chain
|
42
45
|
active_scaffold_config.list.user.nested_default_sorting = nested_default_sorting(chain) if nested.sorted?(chain)
|
43
46
|
end
|
44
47
|
|
45
48
|
def nested_label
|
46
49
|
if nested.belongs_to?
|
47
|
-
as_(:nested_of_model, :
|
50
|
+
as_(:nested_of_model, nested_model: active_scaffold_config.model.model_name.human, parent_model: ERB::Util.h(nested_parent_record.to_label))
|
48
51
|
else
|
49
|
-
as_(:nested_for_model, :
|
52
|
+
as_(:nested_for_model, nested_model: active_scaffold_config.list.label, parent_model: ERB::Util.h(nested_parent_record.to_label))
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
53
56
|
def nested_default_sorting(chain)
|
54
|
-
{:
|
57
|
+
{table_name: active_scaffold_config._table_name, default_sorting: nested.default_sorting(chain)}
|
55
58
|
end
|
56
59
|
|
57
60
|
def nested_authorized?(record = nil)
|
58
61
|
true
|
59
62
|
end
|
60
63
|
|
61
|
-
def include_habtm_actions
|
62
|
-
if nested&.habtm?
|
63
|
-
# Production mode is ok with adding a link everytime the scaffold is nested - we are not ok with that.
|
64
|
-
unless active_scaffold_config.action_links['new_existing']
|
65
|
-
active_scaffold_config.action_links.add('new_existing', :label => :add_existing, :type => :collection, :security_method => :add_existing_authorized?)
|
66
|
-
end
|
67
|
-
add_shallow_links if active_scaffold_config.nested.shallow_delete
|
68
|
-
elsif !ActiveScaffold.threadsafe
|
69
|
-
# Production mode is caching this link into a non nested scaffold, when threadsafe is disabled
|
70
|
-
active_scaffold_config.action_links.delete('new_existing')
|
71
|
-
restore_shallow_links if active_scaffold_config.nested.shallow_delete
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def add_shallow_links
|
76
|
-
unless active_scaffold_config.action_links['destroy_existing']
|
77
|
-
link_options = {:label => :remove, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :position => false, :security_method => :delete_existing_authorized?}
|
78
|
-
active_scaffold_config.action_links.add('destroy_existing', link_options)
|
79
|
-
end
|
80
|
-
active_scaffold_config.action_links.delete('destroy') if active_scaffold_config.actions.include?(:delete)
|
81
|
-
end
|
82
|
-
|
83
|
-
def restore_shallow_links
|
84
|
-
if active_scaffold_config.actions.include?(:delete) && active_scaffold_config.delete.link
|
85
|
-
link = active_scaffold_config.delete.link
|
86
|
-
active_scaffold_config.action_links.add(link) unless active_scaffold_config.action_links[link.action]
|
87
|
-
end
|
88
|
-
active_scaffold_config.action_links.delete('destroy_existing')
|
89
|
-
end
|
90
|
-
|
91
64
|
def beginning_of_chain
|
92
65
|
# only if nested is related to current controller, e.g. not when adding record in subform inside subform
|
93
66
|
if nested? && nested.match_model?(active_scaffold_config.model)
|
@@ -118,24 +91,26 @@ module ActiveScaffold::Actions
|
|
118
91
|
@nested_parent_record ||= find_if_allowed(nested.parent_id, crud, nested.parent_model)
|
119
92
|
end
|
120
93
|
|
121
|
-
def create_association_with_parent?(check_match
|
94
|
+
def create_association_with_parent?(check_match: false)
|
122
95
|
# has_many is done by beginning_of_chain and rails if direct association, not in through associations
|
123
96
|
return false unless nested.create_with_parent?
|
124
97
|
return false if check_match && !nested.match_model?(active_scaffold_config.model)
|
98
|
+
|
125
99
|
nested_parent_record.present?
|
126
100
|
end
|
127
101
|
|
128
|
-
def create_association_with_parent(record, check_match
|
129
|
-
return unless create_association_with_parent?(check_match)
|
102
|
+
def create_association_with_parent(record, check_match: false)
|
103
|
+
return unless create_association_with_parent?(check_match: check_match)
|
104
|
+
|
130
105
|
if nested.child_association&.singular?
|
131
|
-
record.send("#{nested.child_association.name}=", nested_parent_record)
|
106
|
+
record.send(:"#{nested.child_association.name}=", nested_parent_record)
|
132
107
|
elsif nested.create_through_singular?
|
133
108
|
through = nested_parent_record.send(nested.association.through_reflection.name) ||
|
134
|
-
nested_parent_record.send("build_#{nested.association.through_reflection.name}")
|
109
|
+
nested_parent_record.send(:"build_#{nested.association.through_reflection.name}")
|
135
110
|
if nested.source_reflection.reverse_association.collection?
|
136
111
|
record.send(nested.source_reflection.reverse) << through
|
137
112
|
else
|
138
|
-
record.send("#{nested.source_reflection.reverse}=", through)
|
113
|
+
record.send(:"#{nested.source_reflection.reverse}=", through)
|
139
114
|
end
|
140
115
|
else
|
141
116
|
record.send(nested.child_association.name) << nested_parent_record
|
@@ -154,6 +129,25 @@ module ActiveScaffold::Actions::Nested
|
|
154
129
|
module ChildMethods
|
155
130
|
def self.included(base)
|
156
131
|
super
|
132
|
+
include_habtm_actions base.active_scaffold_config
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.include_habtm_actions(config)
|
136
|
+
# Production mode is ok with adding a link everytime the scaffold is nested - we are not ok with that.
|
137
|
+
unless config.action_links['new_existing']
|
138
|
+
config.action_links.add('new_existing', label: :add_existing, type: :collection,
|
139
|
+
security_method: :add_existing_authorized?,
|
140
|
+
ignore_method: :add_existing_ignore?)
|
141
|
+
end
|
142
|
+
return unless config.nested.shallow_delete
|
143
|
+
|
144
|
+
unless config.action_links['destroy_existing']
|
145
|
+
config.action_links.add('destroy_existing', label: :remove, type: :member, confirm: :are_you_sure_to_delete,
|
146
|
+
method: :delete, position: false,
|
147
|
+
security_method: :add_existing_authorized?,
|
148
|
+
ignore_method: :add_existing_ignore?)
|
149
|
+
end
|
150
|
+
config.action_links['destroy'].ignore_method = :habtm_delete_ignore? if config.actions.include?(:delete)
|
157
151
|
end
|
158
152
|
|
159
153
|
def new_existing
|
@@ -167,7 +161,8 @@ module ActiveScaffold::Actions::Nested
|
|
167
161
|
end
|
168
162
|
|
169
163
|
def destroy_existing
|
170
|
-
return redirect_to(params.merge(:
|
164
|
+
return redirect_to(params.merge(action: :delete, only_path: true)) if request.get? || request.head?
|
165
|
+
|
171
166
|
do_destroy_existing
|
172
167
|
respond_to_action(:destroy_existing)
|
173
168
|
end
|
@@ -176,68 +171,81 @@ module ActiveScaffold::Actions::Nested
|
|
176
171
|
|
177
172
|
def new_existing_respond_to_html
|
178
173
|
if successful?
|
179
|
-
render
|
174
|
+
render action: 'add_existing_form'
|
180
175
|
else
|
181
176
|
return_to_main
|
182
177
|
end
|
183
178
|
end
|
184
179
|
|
185
180
|
def new_existing_respond_to_js
|
186
|
-
render
|
181
|
+
render partial: 'add_existing_form'
|
187
182
|
end
|
188
183
|
|
189
184
|
def add_existing_respond_to_html
|
190
185
|
if successful?
|
191
|
-
flash[:info] = as_(:created_model, :
|
186
|
+
flash[:info] = as_(:created_model, model: ERB::Util.h(@record.to_label))
|
192
187
|
return_to_main
|
193
188
|
else
|
194
|
-
render
|
189
|
+
render action: 'add_existing_form'
|
195
190
|
end
|
196
191
|
end
|
197
192
|
|
198
193
|
def add_existing_respond_to_js
|
199
194
|
if successful?
|
200
|
-
render :
|
195
|
+
render action: 'add_existing'
|
201
196
|
else
|
202
|
-
render :
|
197
|
+
render action: 'form_messages'
|
203
198
|
end
|
204
199
|
end
|
205
200
|
|
206
201
|
def add_existing_respond_to_xml
|
207
|
-
render :
|
202
|
+
render xml: response_object, only: active_scaffold_config.list.columns.visible_columns_names, status: response_status
|
208
203
|
end
|
209
204
|
|
210
205
|
def add_existing_respond_to_json
|
211
|
-
render :
|
206
|
+
render json: response_object, only: active_scaffold_config.list.columns.visible_columns_names, status: response_status
|
212
207
|
end
|
213
208
|
|
214
209
|
def destroy_existing_respond_to_html
|
215
|
-
flash[:info] = as_(:deleted_model, :
|
210
|
+
flash[:info] = as_(:deleted_model, model: ERB::Util.h(@record.to_label))
|
216
211
|
return_to_main
|
217
212
|
end
|
218
213
|
|
219
214
|
def destroy_existing_respond_to_js
|
220
|
-
render
|
215
|
+
render action: 'destroy'
|
221
216
|
end
|
222
217
|
|
223
218
|
def destroy_existing_respond_to_xml
|
224
|
-
render :
|
219
|
+
render xml: successful? ? '' : response_object, only: active_scaffold_config.list.columns.visible_columns_names, status: response_status
|
225
220
|
end
|
226
221
|
|
227
222
|
def destroy_existing_respond_to_json
|
228
|
-
render :
|
223
|
+
render json: successful? ? '' : response_object, only: active_scaffold_config.list.columns.visible_columns_names, status: response_status
|
229
224
|
end
|
230
225
|
|
231
226
|
def add_existing_authorized?(record = nil)
|
232
|
-
nested_parent_record.authorized_for?(:
|
227
|
+
nested_parent_record.authorized_for?(crud_type: :update, column: nested.association.try(:name))
|
233
228
|
end
|
234
229
|
|
235
230
|
def delete_existing_authorized?(record = nil)
|
236
|
-
nested_parent_record.authorized_for?(:
|
231
|
+
nested_parent_record.authorized_for?(crud_type: :update, column: nested.association.try(:name), reason: true)
|
232
|
+
end
|
233
|
+
|
234
|
+
def add_existing_ignore?(record = nil)
|
235
|
+
!nested&.habtm?
|
236
|
+
end
|
237
|
+
|
238
|
+
def delete_existing_ignore?(record = nil)
|
239
|
+
!nested&.habtm?
|
240
|
+
end
|
241
|
+
|
242
|
+
def habtm_delete_ignore?(record = nil)
|
243
|
+
!delete_existing_ignore?(record) || delete_ignore?(record)
|
237
244
|
end
|
238
245
|
|
239
246
|
def after_create_save(record)
|
240
247
|
return unless params[:association_macro] == :has_and_belongs_to_many
|
248
|
+
|
241
249
|
params[:associated_id] = record
|
242
250
|
do_add_existing
|
243
251
|
end
|
@@ -9,11 +9,11 @@ module ActiveScaffold::Actions
|
|
9
9
|
protected
|
10
10
|
|
11
11
|
def search_respond_to_html
|
12
|
-
render
|
12
|
+
render action: 'search'
|
13
13
|
end
|
14
14
|
|
15
15
|
def search_respond_to_js
|
16
|
-
render
|
16
|
+
render partial: 'search'
|
17
17
|
end
|
18
18
|
|
19
19
|
def do_search
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveScaffold::Actions
|
2
2
|
module Show
|
3
3
|
def self.included(base)
|
4
|
-
base.before_action :show_authorized_filter, :
|
4
|
+
base.before_action :show_authorized_filter, only: :show
|
5
5
|
end
|
6
6
|
|
7
7
|
def show
|
@@ -27,11 +27,11 @@ module ActiveScaffold::Actions
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def show_respond_to_js
|
30
|
-
render :
|
30
|
+
render partial: 'show'
|
31
31
|
end
|
32
32
|
|
33
33
|
def show_respond_to_html
|
34
|
-
render :
|
34
|
+
render action: 'show'
|
35
35
|
end
|
36
36
|
|
37
37
|
def show_columns_names
|
@@ -52,14 +52,14 @@ module ActiveScaffold::Actions
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def show_ignore?(record = nil)
|
55
|
-
!send(:authorized_for?, :
|
55
|
+
!send(:authorized_for?, crud_type: :read)
|
56
56
|
end
|
57
57
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def show_authorized_filter
|
61
61
|
link = active_scaffold_config.show.link || self.class.active_scaffold_config.show.class.link
|
62
|
-
raise ActiveScaffold::ActionNotAllowed unless
|
62
|
+
raise ActiveScaffold::ActionNotAllowed unless action_link_authorized?(link)
|
63
63
|
end
|
64
64
|
|
65
65
|
def show_formats
|
@@ -3,7 +3,7 @@ module ActiveScaffold::Actions
|
|
3
3
|
def edit_associated
|
4
4
|
do_edit_associated
|
5
5
|
respond_to do |format|
|
6
|
-
format.js { render :
|
6
|
+
format.js { render action: 'edit_associated', formats: [:js], readonly: @column.association.readonly? }
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
@@ -13,7 +13,7 @@ module ActiveScaffold::Actions
|
|
13
13
|
parent_record = new_model
|
14
14
|
# don't apply if scope, subform inside subform, because constraints won't apply to parent_record
|
15
15
|
apply_constraints_to_record parent_record unless @scope
|
16
|
-
create_association_with_parent parent_record, true if nested?
|
16
|
+
create_association_with_parent parent_record, check_match: true if nested?
|
17
17
|
parent_record
|
18
18
|
end
|
19
19
|
|
@@ -24,8 +24,19 @@ module ActiveScaffold::Actions
|
|
24
24
|
cache_generated_id(@parent_record, params[:generated_id]) if @parent_record.new_record?
|
25
25
|
@column = active_scaffold_config.columns[params[:child_association]]
|
26
26
|
|
27
|
-
@record = find_associated_record if params[:associated_id]
|
28
|
-
|
27
|
+
@record = (find_associated_record if params[:associated_id]) ||
|
28
|
+
build_associated(@column.association, @parent_record) do |blank_record|
|
29
|
+
if params[:tabbed_by] && params[:value]
|
30
|
+
assign_tabbed_by(blank_record, @column, params[:tabbed_by], params[:value], params[:value_type])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def assign_tabbed_by(record, parent_column, tabbed_by, value, value_type)
|
36
|
+
if (association = tabbed_by_association(parent_column, tabbed_by))
|
37
|
+
klass = value_type&.constantize || association.klass
|
38
|
+
end
|
39
|
+
record.send :"#{tabbed_by}=", klass&.find(value) || value
|
29
40
|
end
|
30
41
|
|
31
42
|
def find_associated_record
|