avo 2.44.0 → 3.0.2
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 +28 -26
- data/Gemfile.lock +231 -161
- data/README.md +19 -27
- data/Rakefile +2 -0
- data/app/assets/stylesheets/avo.base.css +1 -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 +39 -19
- 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 +9 -15
- 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 +75 -79
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
- 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_field/index_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.rb +1 -1
- data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
- data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
- data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
- data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
- data/app/components/avo/fields/common/heading_component.html.erb +3 -8
- data/app/components/avo/fields/common/heading_component.rb +1 -3
- data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
- data/app/components/avo/fields/common/key_value_component.rb +2 -2
- data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
- data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
- data/app/components/avo/fields/edit_component.rb +2 -2
- data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
- data/app/components/avo/fields/gravatar_field/index_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/heading_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/index_component.rb +6 -6
- data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
- 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 +5 -2
- data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -2
- data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
- data/app/components/avo/fields/trix_field/show_component.html.erb +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 +1 -13
- 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 +125 -18
- 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 +24 -7
- data/app/components/avo/index/table_row_component.html.erb +9 -5
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/items/panel_component.html.erb +25 -0
- data/app/components/avo/items/panel_component.rb +43 -0
- data/app/components/avo/items/switcher_component.html.erb +17 -0
- data/app/components/avo/items/switcher_component.rb +79 -0
- data/app/components/avo/items/visible_items_component.html.erb +10 -0
- data/app/components/avo/items/visible_items_component.rb +11 -0
- data/app/components/avo/modal_component.html.erb +3 -4
- data/app/components/avo/paginator_component.html.erb +29 -40
- data/app/components/avo/paginator_component.rb +23 -5
- data/app/components/avo/panel_component.html.erb +7 -5
- data/app/components/avo/referrer_params_component.html.erb +1 -1
- data/app/components/avo/resource_component.rb +205 -26
- data/app/components/avo/resource_sidebar_component.html.erb +15 -18
- data/app/components/avo/resource_sidebar_component.rb +5 -3
- 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 +18 -12
- data/app/components/avo/tab_group_component.html.erb +14 -8
- 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 +6 -41
- data/app/components/avo/views/resource_edit_component.html.erb +23 -84
- data/app/components/avo/views/resource_edit_component.rb +20 -19
- data/app/components/avo/views/resource_index_component.html.erb +42 -47
- data/app/components/avo/views/resource_index_component.rb +76 -13
- data/app/components/avo/views/resource_show_component.html.erb +16 -177
- data/app/components/avo/views/resource_show_component.rb +16 -10
- data/app/controllers/avo/actions_controller.rb +29 -31
- data/app/controllers/avo/application_controller.rb +119 -181
- 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 +145 -98
- 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 +56 -50
- data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
- data/app/helpers/avo/application_helper.rb +18 -8
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +28 -12
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/controllers/action_controller.js +3 -1
- data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
- 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 +4 -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 +11 -5
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/actions/show.html.erb +9 -5
- data/app/views/avo/associations/new.html.erb +2 -2
- data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
- data/app/views/avo/base/edit.html.erb +1 -1
- data/app/views/avo/base/index.html.erb +4 -3
- 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 +2 -2
- 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/_flash_alerts.turbo_stream.erb +1 -1
- 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/_resource_search.html.erb +1 -0
- data/app/views/avo/partials/_table_header.html.erb +5 -11
- data/app/views/layouts/avo/application.html.erb +5 -4
- data/avo.gemspec +10 -8
- data/bin/dev +3 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +2 -0
- data/config/master.key +1 -0
- data/config/routes.rb +7 -10
- data/db/factories.rb +6 -0
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +78 -60
- data/lib/avo/base_resource.rb +286 -225
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/borrow_items_holder.rb +35 -0
- 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 +7 -5
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_description.rb +23 -0
- data/lib/avo/concerns/has_helpers.rb +18 -0
- data/lib/avo/concerns/has_item_type.rb +42 -0
- data/lib/avo/concerns/has_items.rb +339 -0
- data/lib/avo/concerns/hydration.rb +17 -0
- data/lib/avo/concerns/is_resource_item.rb +16 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/model_class_constantized.rb +0 -2
- data/lib/avo/concerns/pagination.rb +53 -0
- data/lib/avo/concerns/visible_in_different_views.rb +132 -0
- data/lib/avo/concerns/visible_items.rb +7 -38
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +28 -11
- data/lib/avo/current.rb +39 -0
- data/lib/avo/dsl/field_parser.rb +3 -3
- 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 +14 -15
- data/lib/avo/fields/base_field.rb +84 -121
- data/lib/avo/fields/belongs_to_field.rb +19 -23
- 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 +112 -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 +15 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/concerns/use_view_components.rb +45 -0
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_time_field.rb +1 -5
- data/lib/avo/fields/external_image_field.rb +2 -2
- data/lib/avo/fields/field_manager.rb +55 -0
- data/lib/avo/fields/file_field.rb +2 -2
- data/lib/avo/fields/gravatar_field.rb +2 -2
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +21 -17
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +8 -12
- data/lib/avo/fields/heading_field.rb +9 -14
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +3 -3
- data/lib/avo/fields/location_field.rb +10 -10
- 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 +7 -1
- data/lib/avo/fields/text_field.rb +2 -2
- data/lib/avo/filters/base_filter.rb +9 -4
- data/lib/avo/html/builder.rb +8 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +11 -73
- data/lib/avo/licensing/license.rb +5 -1
- data/lib/avo/licensing/license_manager.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 +36 -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 +96 -0
- data/lib/avo/resources/items/item_group.rb +44 -0
- data/lib/avo/resources/items/main_panel.rb +12 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/row.rb +42 -0
- data/lib/avo/resources/items/sidebar.rb +46 -0
- data/lib/avo/resources/items/tab.rb +54 -0
- data/lib/avo/resources/items/tab_group.rb +62 -0
- data/lib/avo/resources/resource_manager.rb +179 -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 +8 -12
- 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/view_inquirer.rb +36 -0
- data/lib/avo.rb +109 -24
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/concerns/parent_controller.rb +20 -0
- data/lib/generators/avo/controller_generator.rb +3 -0
- data/lib/generators/avo/eject_generator.rb +180 -15
- data/lib/generators/avo/field_generator.rb +49 -2
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/js/install_generator.rb +2 -2
- data/lib/generators/avo/resource_generator.rb +12 -9
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
- 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 +7 -3
- data/lib/generators/avo/templates/locales/avo.ar.yml +7 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +6 -3
- data/lib/generators/avo/templates/locales/avo.es.yml +127 -0
- data/lib/generators/avo/templates/locales/avo.fr.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.nb.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.nn.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.pt.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.ro.yml +8 -5
- data/lib/generators/avo/templates/locales/avo.tr.yml +3 -0
- data/lib/generators/avo/templates/resource/controller.tt +1 -1
- data/lib/generators/avo/templates/resource/resource.tt +7 -7
- data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
- 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/tailwindcss/Procfile.dev +1 -1
- data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
- data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
- data/lib/tasks/avo_tasks.rake +72 -4
- data/public/avo-assets/avo.base.css +1893 -1187
- data/public/avo-assets/avo.base.js +217 -305
- 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
- data/tailwind.custom.js +47 -0
- data/tailwind.preset.js +152 -0
- metadata +107 -114
- 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/item_switcher_component.html.erb +0 -27
- data/app/components/avo/item_switcher_component.rb +0 -48
- 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/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- 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/_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_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_fields.rb +0 -334
- data/lib/avo/concerns/has_html_attributes.rb +0 -108
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- 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/js/avo.custom.js +0 -2
- data/lib/generators/avo/templates/standalone_action.tt +0 -8
- /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
@@ -6,7 +6,7 @@ module Avo
|
|
6
6
|
Avo::ApplicationController.include Pundit
|
7
7
|
end
|
8
8
|
|
9
|
-
include
|
9
|
+
include Avo::InitializesAvo
|
10
10
|
include Avo::ApplicationHelper
|
11
11
|
include Avo::UrlHelpers
|
12
12
|
include Avo::Concerns::Breadcrumbs
|
@@ -16,7 +16,7 @@ module Avo
|
|
16
16
|
around_action :set_force_locale, if: -> { params[:force_locale].present? }
|
17
17
|
before_action :set_default_locale, if: -> { params[:set_locale].present? }
|
18
18
|
before_action :init_app
|
19
|
-
before_action :
|
19
|
+
before_action :set_active_storage_current_host
|
20
20
|
before_action :set_resource_name
|
21
21
|
before_action :_authenticate!
|
22
22
|
before_action :set_authorization
|
@@ -24,19 +24,14 @@ module Avo
|
|
24
24
|
before_action :add_initial_breadcrumbs
|
25
25
|
before_action :set_view
|
26
26
|
before_action :set_sidebar_open
|
27
|
+
before_action :set_stylesheet_assets_path
|
27
28
|
|
28
29
|
rescue_from Avo::NotAuthorizedError, with: :render_unauthorized
|
29
30
|
rescue_from ActiveRecord::RecordInvalid, with: :exception_logger
|
30
31
|
|
31
|
-
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
|
32
33
|
add_flash_types :info, :warning, :success, :error
|
33
34
|
|
34
|
-
def init_app
|
35
|
-
Avo::App.init request: request, context: context, current_user: _current_user, view_context: view_context, params: params
|
36
|
-
|
37
|
-
@license = Avo::App.license
|
38
|
-
end
|
39
|
-
|
40
35
|
def exception_logger(exception)
|
41
36
|
respond_to do |format|
|
42
37
|
format.html { raise exception }
|
@@ -50,49 +45,6 @@ module Avo
|
|
50
45
|
end
|
51
46
|
end
|
52
47
|
|
53
|
-
def render(*args)
|
54
|
-
raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:check_avo_license).source_location.first.match?(/.*\/app\/controllers\/avo\/application_controller\.rb/)
|
55
|
-
|
56
|
-
if params[:controller] == "avo/search" && params[:action] == "index"
|
57
|
-
raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:index).source_location.first.match?(/.*\/app\/controllers\/avo\/search_controller\.rb/)
|
58
|
-
end
|
59
|
-
|
60
|
-
if params[:controller] == "avo/dashboards" && params[:action] == "show"
|
61
|
-
raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:show).source_location.first.match?(/.*\/app\/controllers\/avo\/dashboards_controller\.rb/)
|
62
|
-
end
|
63
|
-
|
64
|
-
if params[:controller] == "avo/dashboards" && params[:action] == "card"
|
65
|
-
raise Avo::LicenseVerificationTemperedError, "License verification mechanism tempered with." unless method(:card).source_location.first.match?(/.*\/app\/controllers\/avo\/dashboards_controller\.rb/)
|
66
|
-
end
|
67
|
-
|
68
|
-
super(*args)
|
69
|
-
end
|
70
|
-
|
71
|
-
def check_avo_license
|
72
|
-
# Check to see if the path is a custom tool
|
73
|
-
if on_custom_tool_page
|
74
|
-
if @license.lacks(:custom_tools) || @license.invalid?
|
75
|
-
message = "Your license is invalid or doesn't support custom tools."
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# Check to see if the path is a dashboard
|
80
|
-
if on_dashboards_path
|
81
|
-
if @license.lacks(:dashboards) || @license.invalid?
|
82
|
-
message = "Your license is invalid or doesn't support dashboards."
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
if message.present?
|
87
|
-
if Rails.env.development? || Rails.env.test?
|
88
|
-
@custom_tools_alert_visible = message
|
89
|
-
elsif @license.lacks_with_trial(:custom_tools)
|
90
|
-
# Raise error in non-development environments.
|
91
|
-
raise Avo::LicenseInvalidError, message
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
48
|
def _current_user
|
97
49
|
instance_eval(&Avo.configuration.current_user)
|
98
50
|
end
|
@@ -109,6 +61,49 @@ module Avo
|
|
109
61
|
|
110
62
|
private
|
111
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
|
+
|
112
107
|
def set_resource_name
|
113
108
|
@resource_name = resource_name
|
114
109
|
end
|
@@ -120,66 +115,78 @@ module Avo
|
|
120
115
|
def set_resource
|
121
116
|
raise ActionController::RoutingError.new "No route matches" if resource.nil?
|
122
117
|
|
123
|
-
@resource = resource.
|
124
|
-
end
|
118
|
+
@resource = resource.new(view: params[:view] || action_name.to_s, user: _current_user, params: params)
|
125
119
|
|
126
|
-
|
127
|
-
@related_resource = related_resource.hydrate(params: params)
|
120
|
+
set_authorization
|
128
121
|
end
|
129
122
|
|
130
|
-
def
|
131
|
-
@
|
123
|
+
def detect_fields
|
124
|
+
@resource.detect_fields
|
132
125
|
end
|
133
126
|
|
134
|
-
def
|
135
|
-
|
127
|
+
def set_related_resource
|
128
|
+
@related_resource = related_resource.new(params: params, view: action_name.to_sym, user: _current_user, record: @related_record).detect_fields
|
136
129
|
end
|
137
130
|
|
138
|
-
def
|
139
|
-
@resource.
|
131
|
+
def set_record
|
132
|
+
@record = @resource.find_record(params[:id], query: model_scope, params: params)
|
133
|
+
@resource.hydrate(record: @record)
|
140
134
|
end
|
141
135
|
|
142
|
-
def
|
143
|
-
association_name = BaseResource.valid_association_name(@
|
144
|
-
@
|
145
|
-
@
|
136
|
+
def set_related_record
|
137
|
+
association_name = BaseResource.valid_association_name(@record, params[:related_name])
|
138
|
+
@related_record = if @field.is_a? Avo::Fields::HasOneField
|
139
|
+
@record.send association_name
|
146
140
|
else
|
147
|
-
@related_resource.find_record params[:related_id], query:
|
141
|
+
@related_resource.find_record params[:related_id], query: @record.send(association_name), params: params
|
148
142
|
end
|
143
|
+
@related_resource.hydrate(record: @related_record)
|
144
|
+
end
|
145
|
+
|
146
|
+
def model_scope
|
147
|
+
# abort @resource.inspect
|
148
|
+
@resource.class.find_scope
|
149
149
|
end
|
150
150
|
|
151
151
|
def set_view
|
152
|
-
@view = action_name.
|
152
|
+
@view = Avo::ViewInquirer.new(action_name.to_s)
|
153
153
|
end
|
154
154
|
|
155
|
-
def
|
156
|
-
@
|
157
|
-
@
|
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?
|
158
158
|
|
159
|
-
# If resource.
|
160
|
-
# In that case, to access resource.
|
161
|
-
|
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?
|
162
163
|
end
|
163
164
|
|
164
|
-
def
|
165
|
-
# We have to skip filling the the
|
166
|
-
|
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?
|
167
168
|
|
168
|
-
|
169
|
-
|
170
|
-
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?
|
171
171
|
end
|
172
172
|
|
173
|
-
def
|
174
|
-
|
173
|
+
def is_attach_action?
|
174
|
+
params[model_param_key].blank? && params[:related_name].present? && params[:fields].present?
|
175
175
|
end
|
176
176
|
|
177
|
-
def
|
178
|
-
@
|
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
|
179
186
|
end
|
180
187
|
|
181
188
|
def authorize_base_action
|
182
|
-
class_to_authorize = @
|
189
|
+
class_to_authorize = @record || @resource.model_class
|
183
190
|
|
184
191
|
authorize_action class_to_authorize
|
185
192
|
end
|
@@ -191,80 +198,11 @@ module Avo
|
|
191
198
|
@authorization.set_record(class_to_authorize).authorize_action action_to_authorize.to_sym
|
192
199
|
end
|
193
200
|
|
194
|
-
# Get the pluralized resource name for this request
|
195
|
-
# Ex: projects, teams, users
|
196
|
-
def resource_name
|
197
|
-
return params[:resource_name] if params[:resource_name].present?
|
198
|
-
|
199
|
-
return controller_name if controller_name.present?
|
200
|
-
|
201
|
-
begin
|
202
|
-
request.path
|
203
|
-
.match(/\/?#{Avo::App.root_path.delete('/')}\/resources\/([a-z1-9\-_]*)\/?/mi)
|
204
|
-
.captures
|
205
|
-
.first
|
206
|
-
rescue
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
def related_resource_name
|
211
|
-
params[:related_name]
|
212
|
-
end
|
213
|
-
|
214
|
-
# Gets the Avo resource for this request based on the request from the `resource_name` "param"
|
215
|
-
# Ex: Avo::Resources::Project, Avo::Resources::Team, Avo::Resources::User
|
216
|
-
def resource
|
217
|
-
resource = App.get_resource @resource_name.to_s.camelize.singularize
|
218
|
-
|
219
|
-
return resource if resource.present?
|
220
|
-
|
221
|
-
App.get_resource_by_controller_name @resource_name
|
222
|
-
end
|
223
|
-
|
224
|
-
def related_resource
|
225
|
-
# Find the field from the parent resource
|
226
|
-
field = @resource.get_field params[:related_name]
|
227
|
-
|
228
|
-
return field.use_resource if field&.use_resource.present?
|
229
|
-
|
230
|
-
reflection = @model._reflections[params[:related_name]]
|
231
|
-
|
232
|
-
reflected_model = reflection.klass
|
233
|
-
|
234
|
-
App.get_resource_by_model_name reflected_model
|
235
|
-
end
|
236
|
-
|
237
|
-
def eager_load_files(resource, query)
|
238
|
-
# Get the non-computed file fields and try to eager load them
|
239
|
-
attachment_fields = resource
|
240
|
-
.attachment_fields
|
241
|
-
.reject do |field|
|
242
|
-
field.computed
|
243
|
-
end
|
244
|
-
|
245
|
-
if attachment_fields.present?
|
246
|
-
attachment_fields.map do |field|
|
247
|
-
attachment = case field.class.to_s
|
248
|
-
when "Avo::Fields::FileField"
|
249
|
-
"attachment"
|
250
|
-
when "Avo::Fields::FilesField"
|
251
|
-
"attachments"
|
252
|
-
else
|
253
|
-
"attachment"
|
254
|
-
end
|
255
|
-
|
256
|
-
return query.includes "#{field.id}_#{attachment}": :blob
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
query
|
261
|
-
end
|
262
|
-
|
263
201
|
def _authenticate!
|
264
202
|
instance_eval(&Avo.configuration.authenticate)
|
265
203
|
end
|
266
204
|
|
267
|
-
def render_unauthorized(
|
205
|
+
def render_unauthorized(exception)
|
268
206
|
flash[:notice] = t "avo.not_authorized"
|
269
207
|
|
270
208
|
redirect_url = if request.referrer.blank? || (request.referrer == request.url)
|
@@ -279,8 +217,8 @@ module Avo
|
|
279
217
|
def set_authorization
|
280
218
|
# We need to set @resource_name for the #resource method to work properly
|
281
219
|
set_resource_name
|
282
|
-
@authorization = if resource
|
283
|
-
resource.authorization(user: _current_user)
|
220
|
+
@authorization = if @resource
|
221
|
+
@resource.authorization(user: _current_user)
|
284
222
|
else
|
285
223
|
Services::AuthorizationService.new _current_user
|
286
224
|
end
|
@@ -302,30 +240,6 @@ module Avo
|
|
302
240
|
instance_eval(&Avo.configuration.initial_breadcrumbs) if Avo.configuration.initial_breadcrumbs.present?
|
303
241
|
end
|
304
242
|
|
305
|
-
def on_root_path
|
306
|
-
[Avo.configuration.root_path, "#{Avo.configuration.root_path}/"].include?(request.original_fullpath)
|
307
|
-
end
|
308
|
-
|
309
|
-
def on_resources_path
|
310
|
-
request.original_url.match?(/.*#{Avo.configuration.root_path}\/resources\/.*/)
|
311
|
-
end
|
312
|
-
|
313
|
-
def on_api_path
|
314
|
-
request.original_url.match?(/.*#{Avo.configuration.root_path}\/avo_api\/.*/)
|
315
|
-
end
|
316
|
-
|
317
|
-
def on_dashboards_path
|
318
|
-
request.original_url.match?(/.*#{Avo.configuration.root_path}\/dashboards\/.*/)
|
319
|
-
end
|
320
|
-
|
321
|
-
def on_debug_path
|
322
|
-
request.original_url.match?(/.*#{Avo.configuration.root_path}\/avo_private\/debug.*/)
|
323
|
-
end
|
324
|
-
|
325
|
-
def on_custom_tool_page
|
326
|
-
!(on_root_path || on_resources_path || on_api_path || on_dashboards_path || on_debug_path)
|
327
|
-
end
|
328
|
-
|
329
243
|
def model_param_key
|
330
244
|
@resource.form_scope
|
331
245
|
end
|
@@ -361,5 +275,29 @@ module Avo
|
|
361
275
|
value = cookies["#{Avo::COOKIES_KEY}.sidebar.open"]
|
362
276
|
@sidebar_open = value.blank? || value == "1"
|
363
277
|
end
|
278
|
+
|
279
|
+
# Set the current host for ActiveStorage
|
280
|
+
def set_active_storage_current_host
|
281
|
+
if defined?(ActiveStorage::Current)
|
282
|
+
if Rails::VERSION::MAJOR === 6
|
283
|
+
ActiveStorage::Current.host = request.base_url
|
284
|
+
elsif Rails::VERSION::MAJOR === 7
|
285
|
+
ActiveStorage::Current.url_options = {protocol: request.protocol, host: request.host, port: request.port}
|
286
|
+
end
|
287
|
+
end
|
288
|
+
rescue => exception
|
289
|
+
Avo.logger.debug "Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
|
290
|
+
end
|
291
|
+
|
292
|
+
def set_stylesheet_assets_path
|
293
|
+
# Prefer the user's tailwind config if it exists, otherwise use the default one from Avo
|
294
|
+
@stylesheet_assets_path = if Rails.root.join("config", "avo", "tailwind.config.js").exist?
|
295
|
+
"avo.tailwind"
|
296
|
+
elsif Avo::PACKED
|
297
|
+
"/avo-assets/avo.base"
|
298
|
+
else
|
299
|
+
"avo.base"
|
300
|
+
end
|
301
|
+
end
|
364
302
|
end
|
365
303
|
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
|