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
@@ -57,6 +57,7 @@ module ActiveScaffold::DataStructures
|
|
57
57
|
klass = column.association.klass
|
58
58
|
columns.each do |col|
|
59
59
|
next if find_by_name col
|
60
|
+
|
60
61
|
@set[col.to_sym] = ActiveScaffold::DataStructures::Column.new(col, klass, column.association)
|
61
62
|
end
|
62
63
|
end
|
@@ -77,8 +78,8 @@ module ActiveScaffold::DataStructures
|
|
77
78
|
end
|
78
79
|
alias [] find_by_name
|
79
80
|
|
80
|
-
def each
|
81
|
-
@set.each_value
|
81
|
+
def each(&block)
|
82
|
+
@set.each_value(&block)
|
82
83
|
end
|
83
84
|
|
84
85
|
def _inheritable
|
@@ -18,7 +18,7 @@ module ActiveScaffold::DataStructures
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def to_params
|
21
|
-
{:
|
21
|
+
{parent_scaffold: parent_scaffold.controller_path}
|
22
22
|
end
|
23
23
|
|
24
24
|
def new_instance?
|
@@ -87,7 +87,7 @@ module ActiveScaffold::DataStructures
|
|
87
87
|
setup_constrained_fields
|
88
88
|
end
|
89
89
|
|
90
|
-
delegate :name, :belongs_to?, :has_one?, :has_many?, :habtm?, :readonly?, :
|
90
|
+
delegate :name, :belongs_to?, :has_one?, :has_many?, :habtm?, :readonly?, to: :association
|
91
91
|
|
92
92
|
# A through association with has_one or has_many as source association
|
93
93
|
# create cannot be called in nested through associations, and not-nested through associations, unless:
|
@@ -108,7 +108,7 @@ module ActiveScaffold::DataStructures
|
|
108
108
|
return false unless association.source_reflection.collection? # create allowed if source is singular, rails creates joint model
|
109
109
|
|
110
110
|
# create allowed only if through reflection in record to be created is included in create columns
|
111
|
-
!child_association ||
|
111
|
+
!child_association || columns.exclude?(child_association.through_reflection.name)
|
112
112
|
end
|
113
113
|
|
114
114
|
def create_through_singular?
|
@@ -146,13 +146,14 @@ module ActiveScaffold::DataStructures
|
|
146
146
|
def default_sorting(chain)
|
147
147
|
return @default_sorting if defined? @default_sorting
|
148
148
|
return unless association.scope.is_a?(Proc) && chain.respond_to?(:values) && chain.values[:order]
|
149
|
+
|
149
150
|
@default_sorting = chain.values[:order]
|
150
151
|
@default_sorting = @default_sorting.map(&:to_sql) if @default_sorting[0].is_a? Arel::Nodes::Node
|
151
152
|
@default_sorting = @default_sorting.join(', ')
|
152
153
|
end
|
153
154
|
|
154
155
|
def to_params
|
155
|
-
super.merge(:
|
156
|
+
super.merge(association: @association.name, @param_name => parent_id)
|
156
157
|
end
|
157
158
|
|
158
159
|
protected
|
@@ -177,7 +178,7 @@ module ActiveScaffold::DataStructures
|
|
177
178
|
end
|
178
179
|
|
179
180
|
def to_params
|
180
|
-
super.merge(:
|
181
|
+
super.merge(named_scope: @scope)
|
181
182
|
end
|
182
183
|
|
183
184
|
def name
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveScaffold::DataStructures
|
4
|
+
class ProxyColumn
|
5
|
+
COPY_VARS = %i[@list_ui @list_ui_options @show_ui @show_ui_options @search_ui @search_ui_options @search_joins].freeze
|
6
|
+
def initialize(column)
|
7
|
+
@column = column
|
8
|
+
# without override_or_delegate, the methods won't use column's values if they are set
|
9
|
+
# with override_or_delegate, if they had no value, they won't return overrided form_ui
|
10
|
+
# the easier way is copying variables to proxy object
|
11
|
+
(column.instance_variables & COPY_VARS).each do |var|
|
12
|
+
instance_variable_set(var, column.instance_variable_get(var))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.attr_reader(*names)
|
17
|
+
names.each do |name|
|
18
|
+
define_method name do
|
19
|
+
instance_variable_defined?(:"@#{name}") ? instance_variable_get(:"@#{name}") : @column.send(name)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.attr_accessor(*names)
|
25
|
+
attr_reader(*names)
|
26
|
+
attr_writer(*names)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.override_or_delegate(*names)
|
30
|
+
location = caller_locations(1, 1).first
|
31
|
+
method_def = names.map do |name|
|
32
|
+
"def #{name}(...)
|
33
|
+
instance_variable_defined?(\"@#{name.to_s.gsub(/\?$/, '')}\") ? super : @column.send(\"#{name}\", ...)
|
34
|
+
end"
|
35
|
+
end
|
36
|
+
|
37
|
+
module_eval method_def.join(';'), location.path, location.lineno
|
38
|
+
names
|
39
|
+
end
|
40
|
+
|
41
|
+
include Column::ProxyableMethods
|
42
|
+
|
43
|
+
def method_missing(name, ...)
|
44
|
+
if respond_to_missing?(name, true)
|
45
|
+
@column.send(name, ...)
|
46
|
+
else
|
47
|
+
super
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def respond_to_missing?(name, include_all = false)
|
52
|
+
(!name.match?(/[!=]$/) && @column.respond_to?(name, include_all)) || super
|
53
|
+
end
|
54
|
+
|
55
|
+
def params=(value)
|
56
|
+
@params = Set.new(*value)
|
57
|
+
end
|
58
|
+
attr_reader :params, :options
|
59
|
+
|
60
|
+
override_or_delegate :required?, :label, :description, :placeholder, :sort, :associated_number?,
|
61
|
+
:show_blank_record?, :number?, :search_sql, :link
|
62
|
+
delegate :==, to: :@column
|
63
|
+
|
64
|
+
def is_a?(klass)
|
65
|
+
super || @column.is_a?(klass)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -43,13 +43,12 @@ module ActiveScaffold::DataStructures
|
|
43
43
|
# returns the item of the given name.
|
44
44
|
def find_by_name(name)
|
45
45
|
# this works because of `def item.=='
|
46
|
-
|
47
|
-
item
|
46
|
+
@set.find { |c| c == name }
|
48
47
|
end
|
49
48
|
alias [] find_by_name
|
50
49
|
|
51
|
-
def each
|
52
|
-
@set.each
|
50
|
+
def each(&block)
|
51
|
+
@set.each(&block)
|
53
52
|
end
|
54
53
|
|
55
54
|
# returns the number of items in the set
|
@@ -61,6 +60,10 @@ module ActiveScaffold::DataStructures
|
|
61
60
|
@set.empty?
|
62
61
|
end
|
63
62
|
|
63
|
+
def +(other)
|
64
|
+
self.class.new(@set, *other)
|
65
|
+
end
|
66
|
+
|
64
67
|
protected
|
65
68
|
|
66
69
|
attr_reader :set
|
@@ -4,8 +4,7 @@ module ActiveScaffold::DataStructures
|
|
4
4
|
include Enumerable
|
5
5
|
include ActiveScaffold::OrmChecks
|
6
6
|
|
7
|
-
attr_accessor :constraint_columns
|
8
|
-
attr_accessor :sorting_by_primary_key # enabled by default for postgres
|
7
|
+
attr_accessor :constraint_columns, :sorting_by_primary_key # sorting_by_primary_key enabled by default for postgres
|
9
8
|
attr_reader :model
|
10
9
|
alias active_record_class model
|
11
10
|
|
@@ -19,11 +18,13 @@ module ActiveScaffold::DataStructures
|
|
19
18
|
|
20
19
|
def set_default_sorting
|
21
20
|
return unless active_record?
|
21
|
+
|
22
22
|
# fallback to setting primary key ordering
|
23
23
|
setup_primary_key_order_clause
|
24
24
|
model_scope = model.send(:build_default_scope)
|
25
25
|
order_clause = model_scope.order_values.join(',') if model_scope
|
26
26
|
return unless order_clause
|
27
|
+
|
27
28
|
# If an ORDER BY clause is found set default sorting according to it
|
28
29
|
set_sorting_from_order_clause(order_clause, model.table_name)
|
29
30
|
@default_sorting = true
|
@@ -41,6 +42,7 @@ module ActiveScaffold::DataStructures
|
|
41
42
|
column = get_column(column_name)
|
42
43
|
raise ArgumentError, "Could not find column #{column_name}" if column.nil?
|
43
44
|
raise ArgumentError, 'Sorting direction unknown' unless %i[ASC DESC].include? direction.to_sym
|
45
|
+
|
44
46
|
@clauses << [column, direction] if column.sortable?
|
45
47
|
raise ArgumentError, "Can't mix :method- and :sql-based sorting" if mixed_sorting?
|
46
48
|
end
|
@@ -83,11 +85,12 @@ module ActiveScaffold::DataStructures
|
|
83
85
|
def direction_of(column)
|
84
86
|
clause = get_clause(column)
|
85
87
|
return if clause.nil?
|
88
|
+
|
86
89
|
clause[1]
|
87
90
|
end
|
88
91
|
|
89
|
-
SORTING_STAGES =
|
90
|
-
DEFAULT_SORTING_STAGES =
|
92
|
+
SORTING_STAGES = %w[reset ASC DESC reset].each_cons(2).to_h.freeze
|
93
|
+
DEFAULT_SORTING_STAGES = %w[ASC DESC ASC].each_cons(2).to_h.freeze
|
91
94
|
def next_sorting_of(column, sorted_by_default)
|
92
95
|
stages = sorted_by_default ? DEFAULT_SORTING_STAGES : SORTING_STAGES
|
93
96
|
stages[direction_of(column)] || 'ASC'
|
@@ -103,8 +106,8 @@ module ActiveScaffold::DataStructures
|
|
103
106
|
end
|
104
107
|
|
105
108
|
# iterate over the clauses
|
106
|
-
def each
|
107
|
-
@clauses.each
|
109
|
+
def each(&block)
|
110
|
+
@clauses.each(&block)
|
108
111
|
end
|
109
112
|
|
110
113
|
def each_column
|
@@ -128,8 +131,10 @@ module ActiveScaffold::DataStructures
|
|
128
131
|
order = []
|
129
132
|
each do |sort_column, sort_direction|
|
130
133
|
next if constraint_columns.include? sort_column.name
|
134
|
+
|
131
135
|
sql = grouped_columns ? grouped_columns[sort_column.name] : sort_column.sort[:sql]
|
132
136
|
next if sql.blank?
|
137
|
+
|
133
138
|
sql = sql.to_sql if sql.respond_to?(:to_sql)
|
134
139
|
|
135
140
|
parts = Array(sql).map do |column|
|
@@ -155,6 +160,7 @@ module ActiveScaffold::DataStructures
|
|
155
160
|
def get_column(name_or_column)
|
156
161
|
# it's a column
|
157
162
|
return name_or_column if name_or_column.is_a? ActiveScaffold::DataStructures::Column
|
163
|
+
|
158
164
|
# it's a name
|
159
165
|
name_or_column = name_or_column.to_s.split('.').last if name_or_column.to_s.include? '.'
|
160
166
|
@columns[name_or_column]
|
@@ -171,18 +177,20 @@ module ActiveScaffold::DataStructures
|
|
171
177
|
def set_sorting_from_order_clause(order_clause, model_table_name = nil)
|
172
178
|
clear
|
173
179
|
order_clause.to_s.split(',').each do |criterion|
|
174
|
-
if criterion.
|
175
|
-
|
176
|
-
|
180
|
+
next if criterion.blank?
|
181
|
+
|
182
|
+
parts = extract_order_parts(criterion)
|
183
|
+
unless different_table?(model_table_name, parts[:table_name]) || get_column(parts[:column_name]).nil?
|
184
|
+
add(parts[:column_name], parts[:direction])
|
177
185
|
end
|
178
186
|
end
|
179
187
|
end
|
180
188
|
|
181
189
|
def extract_order_parts(criterion_parts)
|
182
|
-
column_name_part, direction_part = criterion_parts.strip.split(' ')
|
190
|
+
column_name_part, direction_part = criterion_parts.strip.split(' ') # rubocop:disable Style/RedundantArgument
|
183
191
|
column_name_parts = column_name_part.split('.')
|
184
|
-
order = {:
|
185
|
-
:
|
192
|
+
order = {direction: extract_direction(direction_part),
|
193
|
+
column_name: remove_quotes(column_name_parts.last)}
|
186
194
|
order[:table_name] = remove_quotes(column_name_parts[-2]) if column_name_parts.length >= 2
|
187
195
|
order
|
188
196
|
end
|
@@ -213,6 +221,7 @@ module ActiveScaffold::DataStructures
|
|
213
221
|
|
214
222
|
def setup_primary_key_order_clause
|
215
223
|
return unless model.column_names.include?(model.primary_key)
|
224
|
+
|
216
225
|
set([model.primary_key, 'ASC'])
|
217
226
|
@primary_key_order_clause = clause
|
218
227
|
@sorting_by_primary_key = postgres? # mandatory for postgres, so enabled by default
|
@@ -30,29 +30,29 @@ module ActiveScaffold
|
|
30
30
|
require 'active_scaffold/extensions/unsaved_associated'
|
31
31
|
require 'active_scaffold/extensions/unsaved_record'
|
32
32
|
include ActiveScaffold::ActiveRecordPermissions::ModelUserAccess::Model
|
33
|
-
|
34
|
-
Association.
|
35
|
-
CollectionAssociation.
|
36
|
-
SingularAssociation.
|
33
|
+
ActiveRecord::Associations.module_eval do
|
34
|
+
self::Association.include ActiveScaffold::Tableless::Association
|
35
|
+
self::CollectionAssociation.include ActiveScaffold::Tableless::CollectionAssociation
|
36
|
+
self::SingularAssociation.include ActiveScaffold::Tableless::SingularAssociation
|
37
37
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
|
39
|
+
ActiveRecord::ConnectionAdapters.module_eval do
|
40
|
+
self::AbstractAdapter.include ActiveScaffold::ConnectionAdapters::AbstractAdapter
|
41
|
+
if const_defined?(:PostgreSQLAdapter)
|
42
|
+
self::PostgreSQLAdapter.include ActiveScaffold::ConnectionAdapters::PostgreSQLAdapter
|
42
43
|
end
|
43
|
-
if
|
44
|
-
SQLServerAdapter.
|
44
|
+
if const_defined?(:SQLServerAdapter)
|
45
|
+
self::SQLServerAdapter.include ActiveScaffold::ConnectionAdapters::SQLServerAdapter
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
50
51
|
initializer 'active_scaffold.assets' do
|
51
|
-
config.assets.precompile << '
|
52
|
+
config.assets.precompile << 'active_scaffold_manifest.js' if Rails::VERSION::MAJOR < 7
|
52
53
|
end
|
53
54
|
|
54
55
|
initializer 'active_scaffold.extensions' do
|
55
|
-
require 'active_scaffold/extensions/cow_proxy'
|
56
56
|
require 'active_scaffold/extensions/ice_nine'
|
57
57
|
require 'active_scaffold/extensions/localize'
|
58
58
|
require 'active_scaffold/extensions/paginator_extensions'
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# wrap the action rendering for ActiveScaffold controllers
|
2
2
|
module ActiveScaffold
|
3
|
-
module ActionController
|
3
|
+
module ActionController # :nodoc:
|
4
4
|
def render(*args, &block)
|
5
5
|
if self.class.uses_active_scaffold? && params[:adapter] && @rendering_adapter.nil? && request.xhr?
|
6
6
|
@rendering_adapter = true # recursion control
|
7
7
|
# if we need an adapter, then we render the actual stuff to a string and insert it into the adapter template
|
8
8
|
opts = args.any? ? args.first : {}
|
9
9
|
|
10
|
-
render :
|
11
|
-
:
|
12
|
-
:
|
10
|
+
render partial: params[:adapter][1..],
|
11
|
+
locals: {payload: render_to_string(opts.merge(layout: false), &block).html_safe}, # rubocop:disable Rails/OutputSafety
|
12
|
+
use_full_path: true, layout: false, content_type: :html
|
13
13
|
@rendering_adapter = nil # recursion control
|
14
14
|
else
|
15
|
-
super
|
15
|
+
super
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -2,14 +2,14 @@ module ActiveScaffold
|
|
2
2
|
module LookupContext
|
3
3
|
attr_accessor :last_template
|
4
4
|
|
5
|
-
def find_template(name, prefixes = [], partial = false, keys = [], options = {})
|
6
|
-
self.last_template = super
|
5
|
+
def find_template(name, prefixes = [], partial = false, keys = [], options = {}) # rubocop:disable Metrics, Style
|
6
|
+
self.last_template = super
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
# wrap the action rendering for ActiveScaffold views
|
12
|
-
module ActiveScaffold
|
12
|
+
module ActiveScaffold # :nodoc:
|
13
13
|
module RenderingHelper
|
14
14
|
#
|
15
15
|
# Adds two rendering options.
|
@@ -19,7 +19,7 @@ module ActiveScaffold #:nodoc:
|
|
19
19
|
# This syntax skips all template overrides and goes directly to the provided ActiveScaffold templates.
|
20
20
|
# Useful if you want to wrap an existing template. Just call super!
|
21
21
|
#
|
22
|
-
# ==render :
|
22
|
+
# ==render active_scaffold: #{controller.to_s}, options+
|
23
23
|
#
|
24
24
|
# Lets you embed an ActiveScaffold by referencing the controller where it's configured.
|
25
25
|
#
|
@@ -45,7 +45,7 @@ module ActiveScaffold #:nodoc:
|
|
45
45
|
@_view_paths ||= lookup_context.view_paths.clone
|
46
46
|
@_last_template ||= lookup_context.last_template
|
47
47
|
end
|
48
|
-
result = super
|
48
|
+
result = super(options_for_render_super(args[1]))
|
49
49
|
@lookup_context = @_lookup_context if @_lookup_context # rails 6
|
50
50
|
lookup_context.view_paths = @_view_paths if @_view_paths # rails < 6
|
51
51
|
lookup_context.last_template = @_last_template if @_last_template # rails < 6
|
@@ -74,7 +74,7 @@ module ActiveScaffold #:nodoc:
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def view_stack
|
77
|
-
@
|
77
|
+
@view_stack ||= []
|
78
78
|
end
|
79
79
|
|
80
80
|
private
|
@@ -91,11 +91,11 @@ module ActiveScaffold #:nodoc:
|
|
91
91
|
options[:template] = parts.pop
|
92
92
|
prefix = parts.join('/')
|
93
93
|
# if prefix is active_scaffold_overrides we must try to render with this prefix in following paths
|
94
|
-
if prefix
|
95
|
-
options[:prefixes] = lookup_context.prefixes.drop((lookup_context.prefixes.find_index(prefix) || -1) + 1)
|
96
|
-
else
|
94
|
+
if prefix == 'active_scaffold_overrides'
|
97
95
|
options[:prefixes] = ['active_scaffold_overrides']
|
98
96
|
update_view_paths
|
97
|
+
else
|
98
|
+
options[:prefixes] = lookup_context.prefixes.drop((lookup_context.prefixes.find_index(prefix) || -1) + 1)
|
99
99
|
end
|
100
100
|
options
|
101
101
|
end
|
@@ -145,7 +145,7 @@ module ActiveScaffold #:nodoc:
|
|
145
145
|
eid_info[:conditions] = options[:conditions] if options[:conditions]
|
146
146
|
eid_info[:label] = options[:label] if options[:label]
|
147
147
|
options[:params] ||= {}
|
148
|
-
options[:params].merge! :
|
148
|
+
options[:params].merge! eid: eid, embedded: eid_info
|
149
149
|
|
150
150
|
id = "as_#{eid}-embedded"
|
151
151
|
url_options = {controller: remote_controller.to_s, action: 'index', id: nil}.merge(options[:params])
|
@@ -154,8 +154,8 @@ module ActiveScaffold #:nodoc:
|
|
154
154
|
controller.send(:render_component_into_view, url_options)
|
155
155
|
else
|
156
156
|
url = url_for(url_options)
|
157
|
-
content_tag(:div, :
|
158
|
-
content_tag(:div, :
|
157
|
+
content_tag(:div, id: id, class: 'active-scaffold-component', data: {refresh: url}) do
|
158
|
+
content_tag(:div, class: 'active-scaffold-header') do
|
159
159
|
content_tag(:h2) do
|
160
160
|
label = options[:label] || remote_controller_config(remote_controller).list.label
|
161
161
|
link_to(label, url, remote: true, class: 'load-embedded', data: {error_msg: as_(:error_500)}) <<
|
@@ -178,27 +178,25 @@ module ActionView
|
|
178
178
|
include ActiveScaffold::RenderingHelper
|
179
179
|
end
|
180
180
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
temp_renderer.render(self, options)
|
197
|
-
end
|
181
|
+
RenderingHelper.class_eval do
|
182
|
+
# override the render method to use our @lookup_context instead of the
|
183
|
+
# memoized @_lookup_context
|
184
|
+
def render(options = {}, locals = {}, &block)
|
185
|
+
case options
|
186
|
+
when Hash
|
187
|
+
in_rendering_context(options) do |_|
|
188
|
+
# previously set view paths and lookup context are lost here
|
189
|
+
# if you use view_renderer, so instead create a new renderer
|
190
|
+
# with our context
|
191
|
+
temp_renderer = ActionView::Renderer.new(@lookup_context)
|
192
|
+
if block_given?
|
193
|
+
temp_renderer.render_partial(self, options.merge(partial: options[:layout]), &block)
|
194
|
+
else
|
195
|
+
temp_renderer.render(self, options)
|
198
196
|
end
|
199
|
-
else
|
200
|
-
view_renderer.render_partial(self, partial: options, locals: locals, &block)
|
201
197
|
end
|
198
|
+
else
|
199
|
+
view_renderer.render_partial(self, partial: options, locals: locals, &block)
|
202
200
|
end
|
203
201
|
end
|
204
202
|
end
|
@@ -2,7 +2,7 @@ module IceNine
|
|
2
2
|
class Freezer
|
3
3
|
def self.find(name)
|
4
4
|
freezer = name.split('::').reduce(self) do |mod, const|
|
5
|
-
mod.const_lookup(const) or break mod
|
5
|
+
mod.const_lookup(const) or break mod
|
6
6
|
end
|
7
7
|
freezer if freezer < self # only return a descendant freezer
|
8
8
|
end
|
@@ -13,6 +13,7 @@ module IceNine
|
|
13
13
|
def self.freeze_instance_variables(object, recursion_guard)
|
14
14
|
object.instance_variables.each do |ivar_name|
|
15
15
|
next if excluded_vars.include? ivar_name
|
16
|
+
|
16
17
|
Freezer.guarded_deep_freeze(
|
17
18
|
object.instance_variable_get(ivar_name),
|
18
19
|
recursion_guard
|
@@ -2,8 +2,8 @@ class Object
|
|
2
2
|
def as_(key, options = {})
|
3
3
|
if key.present?
|
4
4
|
scope = [:active_scaffold, *options.delete(:scope)]
|
5
|
-
options = options.reverse_merge(:
|
6
|
-
text = I18n.
|
5
|
+
options = options.reverse_merge(scope: scope, default: key.is_a?(String) ? key : key.to_s.titleize)
|
6
|
+
text = I18n.t(key.to_s, **options).html_safe
|
7
7
|
# text = nil if text.include?('translation missing:')
|
8
8
|
end
|
9
9
|
text || key
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module ActiveScaffold
|
2
2
|
module Routing
|
3
3
|
ACTIVE_SCAFFOLD_CORE_ROUTING = {
|
4
|
-
:
|
5
|
-
:
|
4
|
+
collection: {show_search: :get, render_field: :post, mark: :post},
|
5
|
+
member: {update_column: :post, render_field: %i[get post], mark: :post}
|
6
6
|
}.freeze
|
7
7
|
ACTIVE_SCAFFOLD_ASSOCIATION_ROUTING = {
|
8
|
-
:
|
9
|
-
:
|
8
|
+
collection: {edit_associated: :get, new_existing: :get, add_existing: :post},
|
9
|
+
member: {edit_associated: :get, destroy_existing: :delete}
|
10
10
|
}.freeze
|
11
11
|
|
12
12
|
class Association
|
@@ -44,6 +44,7 @@ module ActiveScaffold
|
|
44
44
|
|
45
45
|
class Basic < Association
|
46
46
|
def initialize(defaults = {})
|
47
|
+
super()
|
47
48
|
@defaults = defaults
|
48
49
|
end
|
49
50
|
|
@@ -2,6 +2,7 @@
|
|
2
2
|
class ActiveRecord::Base
|
3
3
|
def associated_valid?(path = [])
|
4
4
|
return true if path.include?(self) # prevent recursion (if associated and parent are new records)
|
5
|
+
|
5
6
|
path << self
|
6
7
|
# using [].all? syntax to avoid a short-circuit
|
7
8
|
# errors to associated record can be added by update_record_from_params when association fails to set and ActiveRecord::RecordNotSaved is raised
|
@@ -47,14 +48,14 @@ class ActiveRecord::Base
|
|
47
48
|
# yields every associated object that has been instantiated and is flagged as unsaved.
|
48
49
|
# returns false if any yield returns false.
|
49
50
|
# returns true otherwise, even when none of the associations have been instantiated. build wrapper methods accordingly.
|
50
|
-
def with_unsaved_associated
|
51
|
+
def with_unsaved_associated(&block)
|
51
52
|
associations_for_update.map do |assoc|
|
52
53
|
association_proxy = association(assoc.name)
|
53
54
|
if association_proxy.target.present?
|
54
55
|
records = association_proxy.target
|
55
56
|
records = [records] unless records.is_a? Array # convert singular associations into collections for ease of use
|
56
57
|
# must use select instead of find_all, which Rails overrides on association proxies for db access
|
57
|
-
records.select { |r| r.unsaved? && !r.readonly? }.map
|
58
|
+
records.select { |r| r.unsaved? && !r.readonly? }.map(&block).all?
|
58
59
|
else
|
59
60
|
true
|
60
61
|
end
|