avo 2.49.0 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of avo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +26 -25
- data/Gemfile.lock +179 -147
- data/README.md +1 -1
- data/app/assets/stylesheets/avo.base.css +0 -1
- data/app/assets/svgs/font.svg +1 -0
- data/app/assets/svgs/triangle-up.svg +1 -0
- data/app/components/avo/actions_component.html.erb +19 -5
- data/app/components/avo/actions_component.rb +37 -17
- data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
- data/app/components/avo/asset_manager/javascript_component.rb +13 -0
- data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
- data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
- data/app/components/avo/base_component.rb +15 -12
- data/app/components/avo/button_component.rb +20 -3
- data/app/components/avo/empty_state_component.rb +1 -1
- data/app/components/avo/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/field_wrapper_component.rb +15 -26
- data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
- data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
- data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
- data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
- data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
- data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/index_component.rb +5 -5
- data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
- data/app/components/avo/fields/preview_field/index_component.rb +4 -0
- data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/show_component.rb +4 -1
- data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
- data/app/components/avo/filters_component.html.erb +9 -3
- data/app/components/avo/filters_component.rb +4 -4
- data/app/components/avo/index/field_wrapper_component.rb +0 -12
- data/app/components/avo/index/grid_item_component.html.erb +13 -36
- data/app/components/avo/index/grid_item_component.rb +43 -16
- data/app/components/avo/index/resource_controls_component.html.erb +3 -81
- data/app/components/avo/index/resource_controls_component.rb +124 -17
- data/app/components/avo/index/resource_grid_component.html.erb +5 -3
- data/app/components/avo/index/resource_grid_component.rb +5 -2
- data/app/components/avo/index/resource_map_component.html.erb +1 -1
- data/app/components/avo/index/resource_map_component.rb +3 -3
- data/app/components/avo/index/resource_table_component.html.erb +5 -4
- data/app/components/avo/index/resource_table_component.rb +14 -20
- data/app/components/avo/index/table_row_component.html.erb +8 -4
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/item_switcher_component.rb +2 -2
- data/app/components/avo/modal_component.html.erb +7 -12
- data/app/components/avo/modal_component.rb +0 -21
- data/app/components/avo/paginator_component.html.erb +40 -29
- data/app/components/avo/paginator_component.rb +5 -23
- data/app/components/avo/panel_component.html.erb +8 -6
- data/app/components/avo/referrer_params_component.html.erb +1 -2
- data/app/components/avo/resource_component.rb +189 -14
- data/app/components/avo/resource_sidebar_component.html.erb +6 -2
- data/app/components/avo/resource_sidebar_component.rb +1 -1
- data/app/components/avo/sidebar/link_component.rb +1 -1
- data/app/components/avo/sidebar_component.html.erb +10 -3
- data/app/components/avo/sidebar_component.rb +5 -3
- data/app/components/avo/sidebar_profile_component.html.erb +15 -8
- data/app/components/avo/tab_group_component.html.erb +13 -7
- data/app/components/avo/tab_group_component.rb +1 -6
- data/app/components/avo/tab_switcher_component.html.erb +17 -40
- data/app/components/avo/tab_switcher_component.rb +4 -39
- data/app/components/avo/views/resource_edit_component.html.erb +12 -48
- data/app/components/avo/views/resource_edit_component.rb +7 -18
- data/app/components/avo/views/resource_index_component.html.erb +41 -47
- data/app/components/avo/views/resource_index_component.rb +62 -12
- data/app/components/avo/views/resource_show_component.html.erb +6 -149
- data/app/components/avo/views/resource_show_component.rb +6 -11
- data/app/controllers/avo/actions_controller.rb +27 -24
- data/app/controllers/avo/application_controller.rb +105 -151
- data/app/controllers/avo/associations_controller.rb +34 -43
- data/app/controllers/avo/attachments_controller.rb +4 -4
- data/app/controllers/avo/base_controller.rb +102 -102
- data/app/controllers/avo/debug_controller.rb +17 -5
- data/app/controllers/avo/home_controller.rb +1 -1
- data/app/controllers/avo/search_controller.rb +30 -51
- data/app/controllers/avo/team_users_controller.rb +4 -0
- data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
- data/app/helpers/avo/application_helper.rb +15 -9
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +27 -11
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/application.js +0 -3
- data/app/javascript/js/controllers/action_controller.js +5 -3
- data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
- data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
- data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
- data/app/javascript/js/controllers/filter_controller.js +1 -1
- data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
- data/app/javascript/js/controllers/preview_controller.js +24 -0
- data/app/javascript/js/controllers/search_controller.js +2 -2
- data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
- data/app/javascript/js/controllers/toggle_controller.js +48 -0
- data/app/javascript/js/controllers.js +10 -6
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
- data/app/views/avo/actions/show.html.erb +10 -7
- data/app/views/avo/associations/new.html.erb +2 -2
- data/app/views/avo/base/index.html.erb +3 -2
- data/app/views/avo/base/new.html.erb +2 -1
- data/app/views/avo/base/preview.html.erb +19 -0
- data/app/views/avo/base/show.html.erb +1 -1
- data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
- data/app/views/avo/debug/report.html.erb +32 -17
- data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_footer.html.erb +1 -1
- data/app/views/avo/partials/_javascript.html.erb +5 -0
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +3 -5
- data/app/views/avo/partials/_table_header.html.erb +5 -11
- data/app/views/layouts/avo/application.html.erb +4 -2
- data/avo.gemspec +11 -12
- data/bin/dev +1 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +0 -2
- data/config/master.key +1 -0
- data/config/routes.rb +6 -10
- data/db/factories.rb +7 -1
- data/lib/avo/action_model.rb +20 -0
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +57 -42
- data/lib/avo/base_resource.rb +264 -227
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/breadcrumbs.rb +2 -2
- data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
- data/lib/avo/concerns/filters_session_handler.rb +5 -3
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_description.rb +23 -0
- data/lib/avo/concerns/has_item_type.rb +42 -0
- data/lib/avo/concerns/has_items.rb +325 -0
- data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
- data/lib/avo/concerns/is_resource_item.rb +24 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/model_class_constantized.rb +0 -2
- data/lib/avo/concerns/visible_in_different_views.rb +126 -0
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +1 -37
- data/lib/avo/current.rb +39 -0
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +18 -3
- data/lib/avo/engine.rb +35 -30
- data/lib/avo/error_manager.rb +25 -0
- data/lib/avo/execution_context.rb +10 -14
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +91 -106
- data/lib/avo/fields/belongs_to_field.rb +18 -22
- data/lib/avo/fields/concerns/file_authorization.rb +2 -2
- data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
- data/lib/avo/fields/concerns/has_default.rb +1 -5
- data/lib/avo/fields/concerns/has_field_name.rb +22 -0
- data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
- data/lib/avo/fields/concerns/is_disabled.rb +1 -5
- data/lib/avo/fields/concerns/is_readonly.rb +1 -5
- data/lib/avo/fields/concerns/is_required.rb +5 -7
- data/lib/avo/fields/concerns/is_searchable.rb +13 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_time_field.rb +3 -14
- data/lib/avo/fields/field_manager.rb +55 -0
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +12 -15
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +6 -10
- data/lib/avo/fields/heading_field.rb +4 -1
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +1 -1
- data/lib/avo/fields/location_field.rb +8 -8
- data/lib/avo/fields/password_field.rb +1 -1
- data/lib/avo/fields/preview_field.rb +14 -0
- data/lib/avo/fields/select_field.rb +12 -8
- data/lib/avo/fields/status_field.rb +4 -0
- data/lib/avo/filters/base_filter.rb +8 -4
- data/lib/avo/html/builder.rb +7 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +8 -67
- data/lib/avo/licensing/license.rb +1 -1
- data/lib/avo/licensing/pro_license.rb +1 -7
- data/lib/avo/loaders/fields_loader.rb +7 -1
- data/lib/avo/plugin.rb +16 -0
- data/lib/avo/plugin_manager.rb +56 -0
- data/lib/avo/prefixed_test_helpers.rb +20 -0
- data/lib/avo/reloader.rb +3 -0
- data/lib/avo/resources/controls/actions_list.rb +7 -12
- data/lib/avo/resources/controls/attach_button.rb +15 -0
- data/lib/avo/resources/controls/back_button.rb +1 -1
- data/lib/avo/resources/controls/base_control.rb +15 -49
- data/lib/avo/resources/controls/create_button.rb +15 -0
- data/lib/avo/resources/controls/delete_button.rb +5 -1
- data/lib/avo/resources/controls/detach_button.rb +4 -1
- data/lib/avo/resources/controls/edit_button.rb +4 -1
- data/lib/avo/resources/controls/order_controls.rb +8 -0
- data/lib/avo/resources/controls/save_button.rb +13 -0
- data/lib/avo/resources/controls/show_button.rb +15 -0
- data/lib/avo/resources/items/holder.rb +84 -0
- data/lib/avo/resources/items/item_group.rb +49 -0
- data/lib/avo/resources/items/main_panel.rb +2 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/row.rb +54 -0
- data/lib/avo/resources/items/sidebar.rb +47 -0
- data/lib/avo/resources/items/tab.rb +60 -0
- data/lib/avo/resources/items/tab_group.rb +68 -0
- data/lib/avo/resources/resource_manager.rb +174 -0
- data/lib/avo/services/authorization_service.rb +11 -110
- data/lib/avo/services/debug_service.rb +93 -0
- data/lib/avo/services/encryption_service.rb +5 -1
- data/lib/avo/services/telemetry_service.rb +85 -0
- data/lib/avo/test_helpers.rb +362 -0
- data/lib/avo/tools/tool_manager.rb +30 -0
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +115 -24
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/resource_generator.rb +4 -4
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
- data/lib/generators/avo/templates/action.tt +8 -6
- data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
- data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
- data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
- data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
- data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
- data/lib/generators/avo/templates/initializer/avo.tt +1 -9
- data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
- data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
- data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
- data/lib/generators/avo/templates/resource/resource.tt +7 -7
- data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
- data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
- data/lib/generators/avo/templates/scope.tt +6 -0
- data/lib/generators/avo/templates/tool/view.tt +2 -2
- data/lib/tasks/avo_tasks.rake +27 -0
- data/public/avo-assets/avo.base.css +1810 -1189
- data/public/avo-assets/avo.base.js +217 -307
- data/public/avo-assets/avo.base.js.map +3 -3
- data/public/avo-assets/avo.css +9744 -0
- data/public/avo-assets/avo.js +513 -0
- data/public/avo-assets/avo.js.map +7 -0
- metadata +102 -146
- data/app/assets/stylesheets/css/tags.css +0 -32
- data/app/components/avo/card_component.html.erb +0 -46
- data/app/components/avo/card_component.rb +0 -25
- data/app/components/avo/dashboards/divider_component.html.erb +0 -9
- data/app/components/avo/dashboards/divider_component.rb +0 -19
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
- data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
- data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
- data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
- data/app/components/avo/fields/tags_field/index_component.rb +0 -9
- data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/tags_field/show_component.rb +0 -5
- data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
- data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
- data/app/components/avo/index/ordering/base_component.rb +0 -9
- data/app/components/avo/index/ordering/button_component.html.erb +0 -11
- data/app/components/avo/index/ordering/button_component.rb +0 -23
- data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
- data/app/components/avo/index/ordering/buttons_component.rb +0 -47
- data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
- data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
- data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
- data/app/controllers/avo/dashboards_controller.rb +0 -22
- data/app/controllers/avo/reorder_controller.rb +0 -25
- data/app/javascript/js/controllers/base_controller.js +0 -22
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
- data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
- data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
- data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
- data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
- data/app/views/avo/dashboards/cards/show.html.erb +0 -3
- data/app/views/avo/dashboards/show.html.erb +0 -38
- data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
- data/app/views/avo/partials/_global_search.html.erb +0 -19
- data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
- data/lib/avo/app.rb +0 -237
- data/lib/avo/base_card.rb +0 -161
- data/lib/avo/concerns/fetches_things.rb +0 -150
- data/lib/avo/concerns/handles_field_args.rb +0 -47
- data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_fields.rb +0 -334
- data/lib/avo/concerns/has_html_attributes.rb +0 -123
- data/lib/avo/concerns/pagination.rb +0 -53
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- data/lib/avo/concerns/visible_items.rb +0 -51
- data/lib/avo/dashboards/base_dashboard.rb +0 -89
- data/lib/avo/dashboards/base_divider.rb +0 -35
- data/lib/avo/dashboards/chartkick_card.rb +0 -77
- data/lib/avo/dashboards/dashboard_card.rb +0 -6
- data/lib/avo/dashboards/metric_card.rb +0 -9
- data/lib/avo/dashboards/partial_card.rb +0 -7
- data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
- data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
- data/lib/avo/fields/tags_field.rb +0 -102
- data/lib/avo/grid_collector.rb +0 -42
- data/lib/avo/hosts/association_scope_host.rb +0 -8
- data/lib/avo/hosts/base_host.rb +0 -25
- data/lib/avo/hosts/card_visibility.rb +0 -20
- data/lib/avo/hosts/dashboard_card.rb +0 -22
- data/lib/avo/hosts/dashboard_visibility.rb +0 -19
- data/lib/avo/hosts/ordering.rb +0 -22
- data/lib/avo/hosts/record_host.rb +0 -7
- data/lib/avo/hosts/resource_record_host.rb +0 -7
- data/lib/avo/hosts/resource_view_record_host.rb +0 -7
- data/lib/avo/hosts/search_scope_host.rb +0 -7
- data/lib/avo/hosts/view_record_host.rb +0 -7
- data/lib/avo/hosts/visibility_host.rb +0 -12
- data/lib/avo/items_holder.rb +0 -96
- data/lib/avo/main_panel.rb +0 -3
- data/lib/avo/menu/base_item.rb +0 -25
- data/lib/avo/menu/builder.rb +0 -82
- data/lib/avo/menu/dashboard.rb +0 -22
- data/lib/avo/menu/group.rb +0 -2
- data/lib/avo/menu/link.rb +0 -6
- data/lib/avo/menu/menu.rb +0 -2
- data/lib/avo/menu/resource.rb +0 -22
- data/lib/avo/menu/section.rb +0 -2
- data/lib/avo/panel.rb +0 -24
- data/lib/avo/panel_builder.rb +0 -25
- data/lib/avo/resources/controls/action.rb +0 -38
- data/lib/avo/resources/controls/execution_context.rb +0 -58
- data/lib/avo/resources/controls/items_holder.rb +0 -19
- data/lib/avo/resources/controls/link_to.rb +0 -27
- data/lib/avo/row.rb +0 -26
- data/lib/avo/row_builder.rb +0 -24
- data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
- data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
- data/lib/avo/sidebar.rb +0 -30
- data/lib/avo/sidebar_builder.rb +0 -24
- data/lib/avo/tab.rb +0 -72
- data/lib/avo/tab_builder.rb +0 -25
- data/lib/avo/tab_group.rb +0 -42
- data/lib/avo/tab_group_builder.rb +0 -43
- data/lib/avo/tools_manager.rb +0 -11
- data/lib/generators/avo/card/chartkick_generator.rb +0 -18
- data/lib/generators/avo/card/metric_generator.rb +0 -18
- data/lib/generators/avo/card/partial_generator.rb +0 -19
- data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
- data/lib/generators/avo/templates/standalone_action.tt +0 -8
- /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -6,16 +6,18 @@ module Avo
|
|
6
6
|
Avo::ApplicationController.include Pundit
|
7
7
|
end
|
8
8
|
|
9
|
+
include Avo::InitializesAvo
|
9
10
|
include Avo::ApplicationHelper
|
10
11
|
include Avo::UrlHelpers
|
11
12
|
include Avo::Concerns::Breadcrumbs
|
13
|
+
include Pagy::Backend
|
12
14
|
|
13
15
|
protect_from_forgery with: :exception
|
14
16
|
around_action :set_avo_locale
|
15
17
|
around_action :set_force_locale, if: -> { params[:force_locale].present? }
|
16
18
|
before_action :set_default_locale, if: -> { params[:set_locale].present? }
|
17
19
|
before_action :init_app
|
18
|
-
before_action :
|
20
|
+
before_action :set_active_storage_current_host
|
19
21
|
before_action :set_resource_name
|
20
22
|
before_action :_authenticate!
|
21
23
|
before_action :set_authorization
|
@@ -27,15 +29,9 @@ module Avo
|
|
27
29
|
rescue_from Avo::NotAuthorizedError, with: :render_unauthorized
|
28
30
|
rescue_from ActiveRecord::RecordInvalid, with: :exception_logger
|
29
31
|
|
30
|
-
helper_method :_current_user, :resources_path, :resource_path, :new_resource_path, :edit_resource_path, :resource_attach_path, :resource_detach_path, :related_resources_path, :turbo_frame_request?, :resource_view_path
|
32
|
+
helper_method :_current_user, :resources_path, :resource_path, :new_resource_path, :edit_resource_path, :resource_attach_path, :resource_detach_path, :related_resources_path, :turbo_frame_request?, :resource_view_path, :preview_resource_path
|
31
33
|
add_flash_types :info, :warning, :success, :error
|
32
34
|
|
33
|
-
def init_app
|
34
|
-
Avo::App.init request: request, context: context, current_user: _current_user, view_context: view_context, params: params
|
35
|
-
|
36
|
-
@license = Avo::App.license
|
37
|
-
end
|
38
|
-
|
39
35
|
def exception_logger(exception)
|
40
36
|
respond_to do |format|
|
41
37
|
format.html { raise exception }
|
@@ -49,49 +45,6 @@ module Avo
|
|
49
45
|
end
|
50
46
|
end
|
51
47
|
|
52
|
-
def render(*args)
|
53
|
-
raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:check_avo_license).source_location.first.match?(/.*\/app\/controllers\/avo\/application_controller\.rb/)
|
54
|
-
|
55
|
-
if params[:controller] == "avo/search" && params[:action] == "index"
|
56
|
-
raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:index).source_location.first.match?(/.*\/app\/controllers\/avo\/search_controller\.rb/)
|
57
|
-
end
|
58
|
-
|
59
|
-
if params[:controller] == "avo/dashboards" && params[:action] == "show"
|
60
|
-
raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:show).source_location.first.match?(/.*\/app\/controllers\/avo\/dashboards_controller\.rb/)
|
61
|
-
end
|
62
|
-
|
63
|
-
if params[:controller] == "avo/dashboards" && params[:action] == "card"
|
64
|
-
raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:card).source_location.first.match?(/.*\/app\/controllers\/avo\/dashboards_controller\.rb/)
|
65
|
-
end
|
66
|
-
|
67
|
-
super(*args)
|
68
|
-
end
|
69
|
-
|
70
|
-
def check_avo_license
|
71
|
-
# Check to see if the path is a custom tool
|
72
|
-
if on_custom_tool_page
|
73
|
-
if @license.lacks(:custom_tools) || @license.invalid?
|
74
|
-
message = "Your license is invalid or doesn't support custom tools."
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Check to see if the path is a dashboard
|
79
|
-
if on_dashboards_path
|
80
|
-
if @license.lacks(:dashboards) || @license.invalid?
|
81
|
-
message = "Your license is invalid or doesn't support dashboards."
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
if message.present?
|
86
|
-
if Rails.env.development? || Rails.env.test?
|
87
|
-
@custom_tools_alert_visible = message
|
88
|
-
elsif @license.lacks_with_trial(:custom_tools)
|
89
|
-
# Raise error in non-development environments.
|
90
|
-
raise Avo::LicenseInvalidError, message
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
48
|
def _current_user
|
96
49
|
instance_eval(&Avo.configuration.current_user)
|
97
50
|
end
|
@@ -108,6 +61,49 @@ module Avo
|
|
108
61
|
|
109
62
|
private
|
110
63
|
|
64
|
+
# Get the pluralized resource name for this request
|
65
|
+
# Ex: projects, teams, users
|
66
|
+
def resource_name
|
67
|
+
return params[:resource_name] if params[:resource_name].present?
|
68
|
+
|
69
|
+
return controller_name if controller_name.present?
|
70
|
+
|
71
|
+
begin
|
72
|
+
request.path
|
73
|
+
.match(/\/?#{Avo.root_path.delete('/')}\/resources\/([a-z1-9\-_]*)\/?/mi)
|
74
|
+
.captures
|
75
|
+
.first
|
76
|
+
rescue
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def related_resource_name
|
81
|
+
params[:related_name]
|
82
|
+
end
|
83
|
+
|
84
|
+
# Gets the Avo resource for this request based on the request from the `resource_name` "param"
|
85
|
+
# Ex: Avo::Resources::Project, Avo::Resources::Team, Avo::Resources::User
|
86
|
+
def resource
|
87
|
+
resource = Avo.resource_manager.get_resource @resource_name.to_s.camelize.singularize
|
88
|
+
|
89
|
+
return resource if resource.present?
|
90
|
+
|
91
|
+
Avo.resource_manager.get_resource_by_controller_name @resource_name
|
92
|
+
end
|
93
|
+
|
94
|
+
def related_resource
|
95
|
+
# Find the field from the parent resource
|
96
|
+
field = @resource.get_field params[:related_name]
|
97
|
+
|
98
|
+
return field.use_resource if field&.use_resource.present?
|
99
|
+
|
100
|
+
reflection = @record._reflections[params[:related_name]]
|
101
|
+
|
102
|
+
reflected_model = reflection.klass
|
103
|
+
|
104
|
+
Avo.resource_manager.get_resource_by_model_class reflected_model
|
105
|
+
end
|
106
|
+
|
111
107
|
def set_resource_name
|
112
108
|
@resource_name = resource_name
|
113
109
|
end
|
@@ -119,15 +115,28 @@ module Avo
|
|
119
115
|
def set_resource
|
120
116
|
raise ActionController::RoutingError.new "No route matches" if resource.nil?
|
121
117
|
|
122
|
-
@resource = resource.
|
118
|
+
@resource = resource.new(view: action_name.to_sym, user: _current_user, params: params)
|
119
|
+
|
120
|
+
set_authorization
|
123
121
|
end
|
124
122
|
|
125
123
|
def set_related_resource
|
126
|
-
@related_resource = related_resource.
|
124
|
+
@related_resource = related_resource.new(params: params, view: action_name.to_sym, user: _current_user, record: @related_record)
|
127
125
|
end
|
128
126
|
|
129
|
-
def
|
130
|
-
@
|
127
|
+
def set_record
|
128
|
+
@record = @resource.find_record(params[:id], query: model_find_scope, params: params)
|
129
|
+
@resource.hydrate(record: @record)
|
130
|
+
end
|
131
|
+
|
132
|
+
def set_related_record
|
133
|
+
association_name = BaseResource.valid_association_name(@record, params[:related_name])
|
134
|
+
@related_record = if @field.is_a? Avo::Fields::HasOneField
|
135
|
+
@record.send association_name
|
136
|
+
else
|
137
|
+
@related_resource.find_record params[:related_id], query: eager_load_files(@related_resource, @record.send(association_name)), params: params
|
138
|
+
end
|
139
|
+
@related_resource.hydrate(record: @related_record)
|
131
140
|
end
|
132
141
|
|
133
142
|
def model_find_scope
|
@@ -135,50 +144,49 @@ module Avo
|
|
135
144
|
end
|
136
145
|
|
137
146
|
def model_scope
|
147
|
+
# abort @resource.inspect
|
138
148
|
@resource.class.find_scope
|
139
149
|
end
|
140
150
|
|
141
|
-
def set_related_model
|
142
|
-
association_name = BaseResource.valid_association_name(@model, params[:related_name])
|
143
|
-
@related_model = if @field.is_a? Avo::Fields::HasOneField
|
144
|
-
@model.send association_name
|
145
|
-
else
|
146
|
-
@related_resource.find_record params[:related_id], query: eager_load_files(@related_resource, @model.send(association_name)), params: params
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
151
|
def set_view
|
151
152
|
@view = action_name.to_sym
|
152
153
|
end
|
153
154
|
|
154
|
-
def
|
155
|
-
@
|
156
|
-
@
|
155
|
+
def set_record_to_fill
|
156
|
+
@record_to_fill = @resource.model_class.new if @view == :create
|
157
|
+
@record_to_fill = @record if @view == :update
|
157
158
|
|
158
|
-
# If resource.
|
159
|
-
# In that case, to access resource.
|
160
|
-
|
159
|
+
# If resource.record is nil, most likely the user is creating a new record.
|
160
|
+
# In that case, to access resource.record in visible and readonly blocks we hydrate the resource with a new record.
|
161
|
+
# TODO: commented this
|
162
|
+
@resource.hydrate(record: @record_to_fill) if @resource.record.nil?
|
161
163
|
end
|
162
164
|
|
163
|
-
def
|
164
|
-
# We have to skip filling the the
|
165
|
-
|
165
|
+
def fill_record
|
166
|
+
# We have to skip filling the the record if this is an attach action
|
167
|
+
return if is_attach_action?
|
166
168
|
|
167
|
-
|
168
|
-
|
169
|
-
end
|
169
|
+
@record = @resource.fill_record(@record_to_fill, cast_nullable(model_params), extra_params: extra_params)
|
170
|
+
assign_default_value_to_disabled_fields if @view == :create
|
170
171
|
end
|
171
172
|
|
172
|
-
def
|
173
|
-
|
173
|
+
def is_attach_action?
|
174
|
+
params[model_param_key].blank? && params[:related_name].present? && params[:fields].present?
|
174
175
|
end
|
175
176
|
|
176
|
-
def
|
177
|
-
@
|
177
|
+
def assign_default_value_to_disabled_fields
|
178
|
+
@resource.get_field_definitions.select do |field|
|
179
|
+
field.is_disabled? && field.visible? && !field.computed
|
180
|
+
end.each do |field|
|
181
|
+
# Get the default value from the field default definition
|
182
|
+
# If there is no default value specified on the resource, get the value from the record (DB, Callbacks, etc.)
|
183
|
+
default_value = field.default || @record.send(field.id)
|
184
|
+
field.fill_field @record, field.id, default_value, params
|
185
|
+
end
|
178
186
|
end
|
179
187
|
|
180
188
|
def authorize_base_action
|
181
|
-
class_to_authorize = @
|
189
|
+
class_to_authorize = @record || @resource.model_class
|
182
190
|
|
183
191
|
authorize_action class_to_authorize
|
184
192
|
end
|
@@ -190,49 +198,6 @@ module Avo
|
|
190
198
|
@authorization.set_record(class_to_authorize).authorize_action action_to_authorize.to_sym
|
191
199
|
end
|
192
200
|
|
193
|
-
# Get the pluralized resource name for this request
|
194
|
-
# Ex: projects, teams, users
|
195
|
-
def resource_name
|
196
|
-
return params[:resource_name] if params[:resource_name].present?
|
197
|
-
|
198
|
-
return controller_name if controller_name.present?
|
199
|
-
|
200
|
-
begin
|
201
|
-
request.path
|
202
|
-
.match(/\/?#{Avo::App.root_path.delete('/')}\/resources\/([a-z1-9\-_]*)\/?/mi)
|
203
|
-
.captures
|
204
|
-
.first
|
205
|
-
rescue
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
def related_resource_name
|
210
|
-
params[:related_name]
|
211
|
-
end
|
212
|
-
|
213
|
-
# Gets the Avo resource for this request based on the request from the `resource_name` "param"
|
214
|
-
# Ex: Avo::Resources::Project, Avo::Resources::Team, Avo::Resources::User
|
215
|
-
def resource
|
216
|
-
resource = App.get_resource @resource_name.to_s.camelize.singularize
|
217
|
-
|
218
|
-
return resource if resource.present?
|
219
|
-
|
220
|
-
App.get_resource_by_controller_name @resource_name
|
221
|
-
end
|
222
|
-
|
223
|
-
def related_resource
|
224
|
-
# Find the field from the parent resource
|
225
|
-
field = @resource.get_field params[:related_name]
|
226
|
-
|
227
|
-
return field.use_resource if field&.use_resource.present?
|
228
|
-
|
229
|
-
reflection = @model._reflections[params[:related_name]]
|
230
|
-
|
231
|
-
reflected_model = reflection.klass
|
232
|
-
|
233
|
-
App.get_resource_by_model_name reflected_model
|
234
|
-
end
|
235
|
-
|
236
201
|
def eager_load_files(resource, query)
|
237
202
|
# Get the non-computed file fields and try to eager load them
|
238
203
|
attachment_fields = resource
|
@@ -263,7 +228,7 @@ module Avo
|
|
263
228
|
instance_eval(&Avo.configuration.authenticate)
|
264
229
|
end
|
265
230
|
|
266
|
-
def render_unauthorized(
|
231
|
+
def render_unauthorized(exception)
|
267
232
|
flash[:notice] = t "avo.not_authorized"
|
268
233
|
|
269
234
|
redirect_url = if request.referrer.blank? || (request.referrer == request.url)
|
@@ -278,8 +243,8 @@ module Avo
|
|
278
243
|
def set_authorization
|
279
244
|
# We need to set @resource_name for the #resource method to work properly
|
280
245
|
set_resource_name
|
281
|
-
@authorization = if resource
|
282
|
-
resource.authorization(user: _current_user)
|
246
|
+
@authorization = if @resource
|
247
|
+
@resource.authorization(user: _current_user)
|
283
248
|
else
|
284
249
|
Services::AuthorizationService.new _current_user
|
285
250
|
end
|
@@ -301,30 +266,6 @@ module Avo
|
|
301
266
|
instance_eval(&Avo.configuration.initial_breadcrumbs) if Avo.configuration.initial_breadcrumbs.present?
|
302
267
|
end
|
303
268
|
|
304
|
-
def on_root_path
|
305
|
-
[Avo.configuration.root_path, "#{Avo.configuration.root_path}/"].include?(request.original_fullpath)
|
306
|
-
end
|
307
|
-
|
308
|
-
def on_resources_path
|
309
|
-
request.original_url.match?(/.*#{Avo.configuration.root_path}\/resources\/.*/)
|
310
|
-
end
|
311
|
-
|
312
|
-
def on_api_path
|
313
|
-
request.original_url.match?(/.*#{Avo.configuration.root_path}\/avo_api\/.*/)
|
314
|
-
end
|
315
|
-
|
316
|
-
def on_dashboards_path
|
317
|
-
request.original_url.match?(/.*#{Avo.configuration.root_path}\/dashboards\/.*/)
|
318
|
-
end
|
319
|
-
|
320
|
-
def on_debug_path
|
321
|
-
request.original_url.match?(/.*#{Avo.configuration.root_path}\/avo_private\/debug.*/)
|
322
|
-
end
|
323
|
-
|
324
|
-
def on_custom_tool_page
|
325
|
-
!(on_root_path || on_resources_path || on_api_path || on_dashboards_path || on_debug_path)
|
326
|
-
end
|
327
|
-
|
328
269
|
def model_param_key
|
329
270
|
@resource.form_scope
|
330
271
|
end
|
@@ -360,5 +301,18 @@ module Avo
|
|
360
301
|
value = cookies["#{Avo::COOKIES_KEY}.sidebar.open"]
|
361
302
|
@sidebar_open = value.blank? || value == "1"
|
362
303
|
end
|
304
|
+
|
305
|
+
# Set the current host for ActiveStorage
|
306
|
+
def set_active_storage_current_host
|
307
|
+
if defined?(ActiveStorage::Current)
|
308
|
+
if Rails::VERSION::MAJOR === 6
|
309
|
+
ActiveStorage::Current.host = request.base_url
|
310
|
+
elsif Rails::VERSION::MAJOR === 7
|
311
|
+
ActiveStorage::Current.url_options = {protocol: request.protocol, host: request.host, port: request.port}
|
312
|
+
end
|
313
|
+
end
|
314
|
+
rescue => exception
|
315
|
+
Avo.logger.debug "Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
|
316
|
+
end
|
363
317
|
end
|
364
318
|
end
|
@@ -2,18 +2,16 @@ require_dependency "avo/base_controller"
|
|
2
2
|
|
3
3
|
module Avo
|
4
4
|
class AssociationsController < BaseController
|
5
|
-
before_action :
|
6
|
-
before_action :hydrate_resource, only: [:show, :index, :new, :create, :destroy, :order]
|
5
|
+
before_action :set_record, only: [:show, :index, :new, :create, :destroy]
|
7
6
|
before_action :set_related_resource_name
|
8
|
-
before_action :set_related_resource, only: [:show, :index, :new, :create, :destroy
|
7
|
+
before_action :set_related_resource, only: [:show, :index, :new, :create, :destroy]
|
9
8
|
before_action :set_related_authorization
|
10
9
|
before_action :set_reflection_field
|
11
|
-
before_action :
|
12
|
-
before_action :hydrate_related_resource, only: [:show, :index, :create, :destroy, :order]
|
10
|
+
before_action :set_related_record, only: [:show]
|
13
11
|
before_action :set_reflection
|
14
|
-
before_action :set_attachment_class, only: [:show, :index, :new, :create, :destroy
|
15
|
-
before_action :set_attachment_resource, only: [:show, :index, :new, :create, :destroy
|
16
|
-
before_action :
|
12
|
+
before_action :set_attachment_class, only: [:show, :index, :new, :create, :destroy]
|
13
|
+
before_action :set_attachment_resource, only: [:show, :index, :new, :create, :destroy]
|
14
|
+
before_action :set_attachment_record, only: [:create, :destroy]
|
17
15
|
before_action :authorize_index_action, only: :index
|
18
16
|
before_action :authorize_attach_action, only: :new
|
19
17
|
before_action :authorize_detach_action, only: :destroy
|
@@ -21,55 +19,55 @@ module Avo
|
|
21
19
|
def index
|
22
20
|
@parent_resource = @resource.dup
|
23
21
|
@resource = @related_resource
|
24
|
-
@
|
25
|
-
@parent_resource.hydrate(
|
26
|
-
association_name = BaseResource.valid_association_name(@
|
27
|
-
@query = @related_authorization.apply_policy @
|
22
|
+
@parent_record = @parent_resource.find_record(params[:id], params: params)
|
23
|
+
@parent_resource.hydrate(record: @parent_record)
|
24
|
+
association_name = BaseResource.valid_association_name(@parent_record, params[:related_name])
|
25
|
+
@query = @related_authorization.apply_policy @parent_record.send(association_name)
|
28
26
|
@association_field = @parent_resource.get_field params[:related_name]
|
29
27
|
|
30
28
|
if @association_field.present? && @association_field.scope.present?
|
31
|
-
@query = Avo::
|
29
|
+
@query = Avo::ExecutionContext.new(target: @association_field.scope, query: @query, parent: @parent_record).handle
|
32
30
|
end
|
33
31
|
|
34
32
|
super
|
35
33
|
end
|
36
34
|
|
37
35
|
def show
|
38
|
-
@parent_resource, @
|
36
|
+
@parent_resource, @parent_record = @resource, @record
|
39
37
|
|
40
|
-
@resource, @
|
38
|
+
@resource, @record = @related_resource, @related_record
|
41
39
|
|
42
40
|
super
|
43
41
|
end
|
44
42
|
|
45
43
|
def new
|
46
|
-
@resource.hydrate(
|
44
|
+
@resource.hydrate(record: @record)
|
47
45
|
|
48
|
-
if @field.present? && !@field.
|
46
|
+
if @field.present? && !@field.is_searchable?
|
49
47
|
query = @related_authorization.apply_policy @attachment_class
|
50
48
|
|
51
49
|
# Add the association scope to the query scope
|
52
50
|
if @field.attach_scope.present?
|
53
|
-
query = Avo::
|
51
|
+
query = Avo::ExecutionContext.new(target: @field.attach_scope, query: query, parent: @record).handle
|
54
52
|
end
|
55
53
|
|
56
|
-
@options = query.all.map do |
|
57
|
-
[
|
54
|
+
@options = query.all.map do |record|
|
55
|
+
[@attachment_resource.new(record: record).record_title, record.id]
|
58
56
|
end
|
59
57
|
end
|
60
58
|
end
|
61
59
|
|
62
60
|
def create
|
63
|
-
association_name = BaseResource.valid_association_name(@
|
61
|
+
association_name = BaseResource.valid_association_name(@record, params[:related_name])
|
64
62
|
|
65
63
|
if reflection_class == "HasManyReflection"
|
66
|
-
@
|
64
|
+
@record.send(association_name) << @attachment_record
|
67
65
|
else
|
68
|
-
@
|
66
|
+
@record.send("#{association_name}=", @attachment_record)
|
69
67
|
end
|
70
68
|
|
71
69
|
respond_to do |format|
|
72
|
-
if @
|
70
|
+
if @record.save
|
73
71
|
format.html { redirect_back fallback_location: resource_view_response_path, notice: t("avo.attachment_class_attached", attachment_class: @related_resource.name) }
|
74
72
|
else
|
75
73
|
format.html { render :new }
|
@@ -78,12 +76,12 @@ module Avo
|
|
78
76
|
end
|
79
77
|
|
80
78
|
def destroy
|
81
|
-
association_name = BaseResource.valid_association_name(@
|
79
|
+
association_name = BaseResource.valid_association_name(@record, params[:related_name])
|
82
80
|
|
83
81
|
if reflection_class == "HasManyReflection"
|
84
|
-
@
|
82
|
+
@record.send(association_name).destroy @attachment_record
|
85
83
|
else
|
86
|
-
@
|
84
|
+
@record.send("#{association_name}=", nil)
|
87
85
|
end
|
88
86
|
|
89
87
|
respond_to do |format|
|
@@ -91,17 +89,10 @@ module Avo
|
|
91
89
|
end
|
92
90
|
end
|
93
91
|
|
94
|
-
def order
|
95
|
-
@parent_resource = @resource.dup
|
96
|
-
@resource, @model = @related_resource, @related_model
|
97
|
-
|
98
|
-
super
|
99
|
-
end
|
100
|
-
|
101
92
|
private
|
102
93
|
|
103
94
|
def set_reflection
|
104
|
-
@reflection = @
|
95
|
+
@reflection = @record._reflections[params[:related_name].to_s]
|
105
96
|
end
|
106
97
|
|
107
98
|
def set_attachment_class
|
@@ -109,16 +100,16 @@ module Avo
|
|
109
100
|
end
|
110
101
|
|
111
102
|
def set_attachment_resource
|
112
|
-
@attachment_resource = @field.use_resource || (
|
103
|
+
@attachment_resource = @field.use_resource || (Avo.resource_manager.get_resource_by_model_class @attachment_class)
|
113
104
|
end
|
114
105
|
|
115
|
-
def
|
116
|
-
@
|
106
|
+
def set_attachment_record
|
107
|
+
@attachment_record = @related_resource.find_record attachment_id, params: params
|
117
108
|
end
|
118
109
|
|
119
110
|
def set_reflection_field
|
120
111
|
@field = @resource.get_field_definitions.find { |f| f.id == @related_resource_name.to_sym }
|
121
|
-
@field.hydrate(resource: @resource,
|
112
|
+
@field.hydrate(resource: @resource, record: @record, view: :new)
|
122
113
|
rescue
|
123
114
|
end
|
124
115
|
|
@@ -127,7 +118,7 @@ module Avo
|
|
127
118
|
end
|
128
119
|
|
129
120
|
def reflection_class
|
130
|
-
reflection = @
|
121
|
+
reflection = @record._reflections[params[:related_name]]
|
131
122
|
|
132
123
|
klass = reflection.class.name.demodulize.to_s
|
133
124
|
klass = reflection.through_reflection.class.name.demodulize.to_s if klass == "ThroughReflection"
|
@@ -136,7 +127,7 @@ module Avo
|
|
136
127
|
end
|
137
128
|
|
138
129
|
def authorize_if_defined(method)
|
139
|
-
@authorization.set_record(@
|
130
|
+
@authorization.set_record(@record)
|
140
131
|
|
141
132
|
if @authorization.has_method?(method.to_sym)
|
142
133
|
@authorization.authorize_action method.to_sym
|
@@ -158,8 +149,8 @@ module Avo
|
|
158
149
|
private
|
159
150
|
|
160
151
|
def set_related_authorization
|
161
|
-
@related_authorization = if related_resource
|
162
|
-
related_resource.authorization(user: _current_user)
|
152
|
+
@related_authorization = if @related_resource.present?
|
153
|
+
@related_resource.authorization(user: _current_user)
|
163
154
|
else
|
164
155
|
Services::AuthorizationService.new _current_user
|
165
156
|
end
|
@@ -4,17 +4,17 @@ module Avo
|
|
4
4
|
class AttachmentsController < ApplicationController
|
5
5
|
before_action :set_resource_name, only: [:destroy, :create]
|
6
6
|
before_action :set_resource, only: [:destroy, :create]
|
7
|
-
before_action :
|
7
|
+
before_action :set_record, only: [:destroy, :create]
|
8
8
|
|
9
9
|
def create
|
10
10
|
blob = ActiveStorage::Blob.create_and_upload! io: params[:file].to_io, filename: params[:filename]
|
11
|
-
association_name = BaseResource.valid_attachment_name(@
|
11
|
+
association_name = BaseResource.valid_attachment_name(@record, params[:attachment_key])
|
12
12
|
|
13
13
|
if association_name.blank?
|
14
14
|
raise ActionController::BadRequest.new("Could not find the attachment association for #{params[:attachment_key]} (check the `attachment_key` for this Trix field)")
|
15
15
|
end
|
16
16
|
|
17
|
-
@
|
17
|
+
@record.send(association_name).attach blob
|
18
18
|
|
19
19
|
render json: {
|
20
20
|
url: main_app.url_for(blob),
|
@@ -47,7 +47,7 @@ module Avo
|
|
47
47
|
private
|
48
48
|
|
49
49
|
def authorized_to(action)
|
50
|
-
@resource.authorization.authorize_action("#{action}_#{params[:attachment_name]}?", record: @
|
50
|
+
@resource.authorization.authorize_action("#{action}_#{params[:attachment_name]}?", record: @record, raise_exception: false)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|