avo 2.46.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 +12 -29
- 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 +3 -2
- data/app/components/avo/index/resource_table_component.rb +8 -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 +1 -1
- data/app/components/avo/paginator_component.rb +6 -6
- 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 -86
- 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 -180
- 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 +139 -91
- 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 +5 -3
- 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 +10 -6
- 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/_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/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 +82 -67
- data/lib/avo/base_resource.rb +286 -226
- 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/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
- 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/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 -122
- 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 +1 -0
- data/lib/generators/avo/templates/locales/avo.en.yml +4 -3
- data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.ro.yml +6 -5
- data/lib/generators/avo/templates/locales/avo.tr.yml +1 -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 +106 -116
- 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_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/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,6 +6,7 @@ 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
|
@@ -15,7 +16,7 @@ module Avo
|
|
15
16
|
around_action :set_force_locale, if: -> { params[:force_locale].present? }
|
16
17
|
before_action :set_default_locale, if: -> { params[:set_locale].present? }
|
17
18
|
before_action :init_app
|
18
|
-
before_action :
|
19
|
+
before_action :set_active_storage_current_host
|
19
20
|
before_action :set_resource_name
|
20
21
|
before_action :_authenticate!
|
21
22
|
before_action :set_authorization
|
@@ -23,19 +24,14 @@ module Avo
|
|
23
24
|
before_action :add_initial_breadcrumbs
|
24
25
|
before_action :set_view
|
25
26
|
before_action :set_sidebar_open
|
27
|
+
before_action :set_stylesheet_assets_path
|
26
28
|
|
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,66 +115,78 @@ module Avo
|
|
119
115
|
def set_resource
|
120
116
|
raise ActionController::RoutingError.new "No route matches" if resource.nil?
|
121
117
|
|
122
|
-
@resource = resource.
|
123
|
-
end
|
118
|
+
@resource = resource.new(view: params[:view] || action_name.to_s, user: _current_user, params: params)
|
124
119
|
|
125
|
-
|
126
|
-
@related_resource = related_resource.hydrate(params: params)
|
120
|
+
set_authorization
|
127
121
|
end
|
128
122
|
|
129
|
-
def
|
130
|
-
@
|
123
|
+
def detect_fields
|
124
|
+
@resource.detect_fields
|
131
125
|
end
|
132
126
|
|
133
|
-
def
|
134
|
-
|
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
|
135
129
|
end
|
136
130
|
|
137
|
-
def
|
138
|
-
@resource.
|
131
|
+
def set_record
|
132
|
+
@record = @resource.find_record(params[:id], query: model_scope, params: params)
|
133
|
+
@resource.hydrate(record: @record)
|
139
134
|
end
|
140
135
|
|
141
|
-
def
|
142
|
-
association_name = BaseResource.valid_association_name(@
|
143
|
-
@
|
144
|
-
@
|
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
|
145
140
|
else
|
146
|
-
@related_resource.find_record params[:related_id], query:
|
141
|
+
@related_resource.find_record params[:related_id], query: @record.send(association_name), params: params
|
147
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
|
148
149
|
end
|
149
150
|
|
150
151
|
def set_view
|
151
|
-
@view = action_name.
|
152
|
+
@view = Avo::ViewInquirer.new(action_name.to_s)
|
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,80 +198,11 @@ 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
|
-
def eager_load_files(resource, query)
|
237
|
-
# Get the non-computed file fields and try to eager load them
|
238
|
-
attachment_fields = resource
|
239
|
-
.attachment_fields
|
240
|
-
.reject do |field|
|
241
|
-
field.computed
|
242
|
-
end
|
243
|
-
|
244
|
-
if attachment_fields.present?
|
245
|
-
attachment_fields.map do |field|
|
246
|
-
attachment = case field.class.to_s
|
247
|
-
when "Avo::Fields::FileField"
|
248
|
-
"attachment"
|
249
|
-
when "Avo::Fields::FilesField"
|
250
|
-
"attachments"
|
251
|
-
else
|
252
|
-
"attachment"
|
253
|
-
end
|
254
|
-
|
255
|
-
return query.includes "#{field.id}_#{attachment}": :blob
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
query
|
260
|
-
end
|
261
|
-
|
262
201
|
def _authenticate!
|
263
202
|
instance_eval(&Avo.configuration.authenticate)
|
264
203
|
end
|
265
204
|
|
266
|
-
def render_unauthorized(
|
205
|
+
def render_unauthorized(exception)
|
267
206
|
flash[:notice] = t "avo.not_authorized"
|
268
207
|
|
269
208
|
redirect_url = if request.referrer.blank? || (request.referrer == request.url)
|
@@ -278,8 +217,8 @@ module Avo
|
|
278
217
|
def set_authorization
|
279
218
|
# We need to set @resource_name for the #resource method to work properly
|
280
219
|
set_resource_name
|
281
|
-
@authorization = if resource
|
282
|
-
resource.authorization(user: _current_user)
|
220
|
+
@authorization = if @resource
|
221
|
+
@resource.authorization(user: _current_user)
|
283
222
|
else
|
284
223
|
Services::AuthorizationService.new _current_user
|
285
224
|
end
|
@@ -301,30 +240,6 @@ module Avo
|
|
301
240
|
instance_eval(&Avo.configuration.initial_breadcrumbs) if Avo.configuration.initial_breadcrumbs.present?
|
302
241
|
end
|
303
242
|
|
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
243
|
def model_param_key
|
329
244
|
@resource.form_scope
|
330
245
|
end
|
@@ -360,5 +275,29 @@ module Avo
|
|
360
275
|
value = cookies["#{Avo::COOKIES_KEY}.sidebar.open"]
|
361
276
|
@sidebar_open = value.blank? || value == "1"
|
362
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
|
363
302
|
end
|
364
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
|