avo 2.53.0 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of avo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +26 -25
- data/Gemfile.lock +179 -147
- data/README.md +1 -1
- data/app/assets/stylesheets/avo.base.css +0 -1
- data/app/assets/svgs/font.svg +1 -0
- data/app/assets/svgs/triangle-up.svg +1 -0
- data/app/components/avo/actions_component.html.erb +19 -5
- data/app/components/avo/actions_component.rb +37 -17
- data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
- data/app/components/avo/asset_manager/javascript_component.rb +13 -0
- data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
- data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
- data/app/components/avo/base_component.rb +15 -12
- data/app/components/avo/button_component.rb +20 -3
- data/app/components/avo/empty_state_component.rb +1 -1
- data/app/components/avo/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/field_wrapper_component.rb +15 -26
- data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
- data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
- data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
- data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
- data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +3 -3
- data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/index_component.rb +5 -5
- data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
- data/app/components/avo/fields/preview_field/index_component.rb +4 -0
- data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/show_component.rb +4 -1
- data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
- data/app/components/avo/filters_component.html.erb +9 -3
- data/app/components/avo/filters_component.rb +4 -4
- data/app/components/avo/index/field_wrapper_component.rb +0 -12
- data/app/components/avo/index/grid_item_component.html.erb +13 -36
- data/app/components/avo/index/grid_item_component.rb +43 -16
- data/app/components/avo/index/resource_controls_component.html.erb +3 -81
- data/app/components/avo/index/resource_controls_component.rb +125 -22
- data/app/components/avo/index/resource_grid_component.html.erb +5 -3
- data/app/components/avo/index/resource_grid_component.rb +5 -2
- data/app/components/avo/index/resource_map_component.html.erb +1 -1
- data/app/components/avo/index/resource_map_component.rb +3 -3
- data/app/components/avo/index/resource_table_component.html.erb +5 -4
- data/app/components/avo/index/resource_table_component.rb +14 -20
- data/app/components/avo/index/table_row_component.html.erb +8 -4
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/item_switcher_component.rb +2 -2
- data/app/components/avo/modal_component.html.erb +7 -12
- data/app/components/avo/modal_component.rb +0 -21
- data/app/components/avo/paginator_component.html.erb +40 -29
- data/app/components/avo/paginator_component.rb +5 -23
- data/app/components/avo/panel_component.html.erb +8 -6
- data/app/components/avo/referrer_params_component.html.erb +1 -2
- data/app/components/avo/resource_component.rb +189 -14
- data/app/components/avo/resource_sidebar_component.html.erb +6 -2
- data/app/components/avo/resource_sidebar_component.rb +1 -1
- data/app/components/avo/sidebar/link_component.rb +1 -1
- data/app/components/avo/sidebar_component.html.erb +10 -3
- data/app/components/avo/sidebar_component.rb +5 -3
- data/app/components/avo/sidebar_profile_component.html.erb +15 -8
- data/app/components/avo/tab_group_component.html.erb +13 -7
- data/app/components/avo/tab_group_component.rb +1 -6
- data/app/components/avo/tab_switcher_component.html.erb +17 -40
- data/app/components/avo/tab_switcher_component.rb +4 -39
- data/app/components/avo/views/resource_edit_component.html.erb +12 -48
- data/app/components/avo/views/resource_edit_component.rb +7 -18
- data/app/components/avo/views/resource_index_component.html.erb +41 -47
- data/app/components/avo/views/resource_index_component.rb +65 -25
- data/app/components/avo/views/resource_show_component.html.erb +6 -149
- data/app/components/avo/views/resource_show_component.rb +6 -11
- data/app/controllers/avo/actions_controller.rb +27 -24
- data/app/controllers/avo/application_controller.rb +105 -151
- data/app/controllers/avo/associations_controller.rb +43 -56
- data/app/controllers/avo/attachments_controller.rb +4 -4
- data/app/controllers/avo/base_controller.rb +106 -111
- data/app/controllers/avo/debug_controller.rb +17 -5
- data/app/controllers/avo/home_controller.rb +1 -1
- data/app/controllers/avo/search_controller.rb +30 -51
- data/app/controllers/avo/team_users_controller.rb +4 -0
- data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
- data/app/helpers/avo/application_helper.rb +15 -9
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +27 -11
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/application.js +0 -3
- data/app/javascript/js/controllers/action_controller.js +5 -3
- data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
- data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
- data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
- data/app/javascript/js/controllers/filter_controller.js +1 -1
- data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
- data/app/javascript/js/controllers/preview_controller.js +24 -0
- data/app/javascript/js/controllers/search_controller.js +2 -2
- data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
- data/app/javascript/js/controllers/toggle_controller.js +48 -0
- data/app/javascript/js/controllers.js +10 -6
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
- data/app/views/avo/actions/show.html.erb +10 -7
- data/app/views/avo/associations/new.html.erb +2 -2
- data/app/views/avo/base/index.html.erb +3 -2
- data/app/views/avo/base/new.html.erb +2 -1
- data/app/views/avo/base/preview.html.erb +19 -0
- data/app/views/avo/base/show.html.erb +1 -1
- data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
- data/app/views/avo/debug/report.html.erb +32 -17
- data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_footer.html.erb +1 -1
- data/app/views/avo/partials/_javascript.html.erb +5 -0
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +3 -5
- data/app/views/avo/partials/_table_header.html.erb +5 -11
- data/app/views/layouts/avo/application.html.erb +4 -2
- data/avo.gemspec +11 -12
- data/bin/dev +1 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +0 -2
- data/config/master.key +1 -0
- data/config/routes.rb +6 -10
- data/db/factories.rb +7 -1
- data/lib/avo/action_model.rb +20 -0
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +57 -42
- data/lib/avo/base_resource.rb +265 -228
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/breadcrumbs.rb +2 -2
- data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
- data/lib/avo/concerns/filters_session_handler.rb +5 -3
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_description.rb +23 -0
- data/lib/avo/concerns/has_item_type.rb +42 -0
- data/lib/avo/concerns/has_items.rb +325 -0
- data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
- data/lib/avo/concerns/is_resource_item.rb +24 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/model_class_constantized.rb +0 -2
- data/lib/avo/concerns/visible_in_different_views.rb +126 -0
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +1 -37
- data/lib/avo/current.rb +39 -0
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +18 -3
- data/lib/avo/engine.rb +35 -30
- data/lib/avo/error_manager.rb +25 -0
- data/lib/avo/execution_context.rb +10 -14
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +91 -106
- data/lib/avo/fields/belongs_to_field.rb +18 -22
- data/lib/avo/fields/concerns/file_authorization.rb +2 -2
- data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
- data/lib/avo/fields/concerns/has_default.rb +1 -5
- data/lib/avo/fields/concerns/has_field_name.rb +22 -0
- data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
- data/lib/avo/fields/concerns/is_disabled.rb +1 -5
- data/lib/avo/fields/concerns/is_readonly.rb +1 -5
- data/lib/avo/fields/concerns/is_required.rb +5 -7
- data/lib/avo/fields/concerns/is_searchable.rb +13 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_time_field.rb +3 -14
- data/lib/avo/fields/field_manager.rb +55 -0
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +12 -15
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +6 -10
- data/lib/avo/fields/heading_field.rb +4 -1
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +1 -1
- data/lib/avo/fields/location_field.rb +8 -8
- data/lib/avo/fields/password_field.rb +1 -1
- data/lib/avo/fields/preview_field.rb +14 -0
- data/lib/avo/fields/select_field.rb +12 -8
- data/lib/avo/fields/status_field.rb +4 -0
- data/lib/avo/filters/base_filter.rb +8 -4
- data/lib/avo/html/builder.rb +7 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +8 -67
- data/lib/avo/licensing/license.rb +1 -1
- data/lib/avo/licensing/pro_license.rb +1 -7
- data/lib/avo/loaders/fields_loader.rb +7 -1
- data/lib/avo/plugin.rb +16 -0
- data/lib/avo/plugin_manager.rb +56 -0
- data/lib/avo/prefixed_test_helpers.rb +20 -0
- data/lib/avo/reloader.rb +3 -0
- data/lib/avo/resources/controls/actions_list.rb +7 -12
- data/lib/avo/resources/controls/attach_button.rb +15 -0
- data/lib/avo/resources/controls/back_button.rb +1 -1
- data/lib/avo/resources/controls/base_control.rb +15 -49
- data/lib/avo/resources/controls/create_button.rb +15 -0
- data/lib/avo/resources/controls/delete_button.rb +5 -1
- data/lib/avo/resources/controls/detach_button.rb +4 -1
- data/lib/avo/resources/controls/edit_button.rb +4 -1
- data/lib/avo/resources/controls/order_controls.rb +8 -0
- data/lib/avo/resources/controls/save_button.rb +13 -0
- data/lib/avo/resources/controls/show_button.rb +15 -0
- data/lib/avo/resources/items/holder.rb +84 -0
- data/lib/avo/resources/items/item_group.rb +49 -0
- data/lib/avo/resources/items/main_panel.rb +2 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/row.rb +54 -0
- data/lib/avo/resources/items/sidebar.rb +47 -0
- data/lib/avo/resources/items/tab.rb +60 -0
- data/lib/avo/resources/items/tab_group.rb +68 -0
- data/lib/avo/resources/resource_manager.rb +174 -0
- data/lib/avo/services/authorization_service.rb +11 -110
- data/lib/avo/services/debug_service.rb +93 -0
- data/lib/avo/services/encryption_service.rb +5 -1
- data/lib/avo/services/telemetry_service.rb +85 -0
- data/lib/avo/test_helpers.rb +362 -0
- data/lib/avo/tools/tool_manager.rb +30 -0
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +115 -24
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/resource_generator.rb +4 -4
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
- data/lib/generators/avo/templates/action.tt +8 -6
- data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
- data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
- data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
- data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
- data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
- data/lib/generators/avo/templates/initializer/avo.tt +1 -9
- data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
- data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
- data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
- data/lib/generators/avo/templates/resource/resource.tt +7 -7
- data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
- data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
- data/lib/generators/avo/templates/scope.tt +6 -0
- data/lib/generators/avo/templates/tool/view.tt +2 -2
- data/lib/tasks/avo_tasks.rake +27 -0
- data/public/avo-assets/avo.base.css +1810 -1189
- data/public/avo-assets/avo.base.js +217 -307
- data/public/avo-assets/avo.base.js.map +3 -3
- data/public/avo-assets/avo.css +9744 -0
- data/public/avo-assets/avo.js +513 -0
- data/public/avo-assets/avo.js.map +7 -0
- metadata +102 -146
- data/app/assets/stylesheets/css/tags.css +0 -32
- data/app/components/avo/card_component.html.erb +0 -46
- data/app/components/avo/card_component.rb +0 -25
- data/app/components/avo/dashboards/divider_component.html.erb +0 -9
- data/app/components/avo/dashboards/divider_component.rb +0 -19
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
- data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
- data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
- data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
- data/app/components/avo/fields/tags_field/index_component.rb +0 -9
- data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/tags_field/show_component.rb +0 -5
- data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
- data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
- data/app/components/avo/index/ordering/base_component.rb +0 -9
- data/app/components/avo/index/ordering/button_component.html.erb +0 -11
- data/app/components/avo/index/ordering/button_component.rb +0 -23
- data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
- data/app/components/avo/index/ordering/buttons_component.rb +0 -47
- data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
- data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
- data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
- data/app/controllers/avo/dashboards_controller.rb +0 -22
- data/app/controllers/avo/reorder_controller.rb +0 -25
- data/app/javascript/js/controllers/base_controller.js +0 -22
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
- data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
- data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
- data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
- data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
- data/app/views/avo/dashboards/cards/show.html.erb +0 -3
- data/app/views/avo/dashboards/show.html.erb +0 -38
- data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
- data/app/views/avo/partials/_global_search.html.erb +0 -19
- data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
- data/lib/avo/app.rb +0 -237
- data/lib/avo/base_card.rb +0 -161
- data/lib/avo/concerns/fetches_things.rb +0 -150
- data/lib/avo/concerns/handles_field_args.rb +0 -47
- data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_fields.rb +0 -334
- data/lib/avo/concerns/has_html_attributes.rb +0 -123
- data/lib/avo/concerns/pagination.rb +0 -53
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- data/lib/avo/concerns/visible_items.rb +0 -51
- data/lib/avo/dashboards/base_dashboard.rb +0 -89
- data/lib/avo/dashboards/base_divider.rb +0 -35
- data/lib/avo/dashboards/chartkick_card.rb +0 -77
- data/lib/avo/dashboards/dashboard_card.rb +0 -6
- data/lib/avo/dashboards/metric_card.rb +0 -9
- data/lib/avo/dashboards/partial_card.rb +0 -7
- data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
- data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
- data/lib/avo/fields/tags_field.rb +0 -102
- data/lib/avo/grid_collector.rb +0 -42
- data/lib/avo/hosts/association_scope_host.rb +0 -8
- data/lib/avo/hosts/base_host.rb +0 -25
- data/lib/avo/hosts/card_visibility.rb +0 -20
- data/lib/avo/hosts/dashboard_card.rb +0 -22
- data/lib/avo/hosts/dashboard_visibility.rb +0 -19
- data/lib/avo/hosts/ordering.rb +0 -22
- data/lib/avo/hosts/record_host.rb +0 -7
- data/lib/avo/hosts/resource_record_host.rb +0 -7
- data/lib/avo/hosts/resource_view_record_host.rb +0 -7
- data/lib/avo/hosts/search_scope_host.rb +0 -7
- data/lib/avo/hosts/view_record_host.rb +0 -7
- data/lib/avo/hosts/visibility_host.rb +0 -12
- data/lib/avo/items_holder.rb +0 -96
- data/lib/avo/main_panel.rb +0 -3
- data/lib/avo/menu/base_item.rb +0 -25
- data/lib/avo/menu/builder.rb +0 -82
- data/lib/avo/menu/dashboard.rb +0 -22
- data/lib/avo/menu/group.rb +0 -2
- data/lib/avo/menu/link.rb +0 -6
- data/lib/avo/menu/menu.rb +0 -4
- data/lib/avo/menu/resource.rb +0 -22
- data/lib/avo/menu/section.rb +0 -2
- data/lib/avo/panel.rb +0 -24
- data/lib/avo/panel_builder.rb +0 -25
- data/lib/avo/resources/controls/action.rb +0 -38
- data/lib/avo/resources/controls/execution_context.rb +0 -58
- data/lib/avo/resources/controls/items_holder.rb +0 -19
- data/lib/avo/resources/controls/link_to.rb +0 -27
- data/lib/avo/row.rb +0 -26
- data/lib/avo/row_builder.rb +0 -24
- data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
- data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
- data/lib/avo/sidebar.rb +0 -30
- data/lib/avo/sidebar_builder.rb +0 -24
- data/lib/avo/tab.rb +0 -72
- data/lib/avo/tab_builder.rb +0 -25
- data/lib/avo/tab_group.rb +0 -42
- data/lib/avo/tab_group_builder.rb +0 -43
- data/lib/avo/tools_manager.rb +0 -11
- data/lib/generators/avo/card/chartkick_generator.rb +0 -18
- data/lib/generators/avo/card/metric_generator.rb +0 -18
- data/lib/generators/avo/card/partial_generator.rb +0 -19
- data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
- data/lib/generators/avo/templates/standalone_action.tt +0 -8
- /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -6,14 +6,13 @@ module Avo
|
|
6
6
|
|
7
7
|
before_action :set_resource_name
|
8
8
|
before_action :set_resource
|
9
|
-
before_action :hydrate_resource
|
10
9
|
before_action :set_applied_filters, only: :index
|
11
|
-
before_action :
|
12
|
-
before_action :
|
10
|
+
before_action :set_record, only: [:show, :edit, :destroy, :update, :preview]
|
11
|
+
before_action :set_record_to_fill
|
13
12
|
before_action :set_edit_title_and_breadcrumbs, only: [:edit, :update]
|
14
|
-
before_action :
|
13
|
+
before_action :fill_record, only: [:create, :update]
|
15
14
|
# Don't run base authorizations for associations
|
16
|
-
before_action :authorize_base_action, if: -> { controller_name != "associations" }
|
15
|
+
before_action :authorize_base_action, except: :preview, if: -> { controller_name != "associations" }
|
17
16
|
before_action :set_pagy_locale, only: :index
|
18
17
|
|
19
18
|
def index
|
@@ -29,11 +28,6 @@ module Avo
|
|
29
28
|
@query = @resource.class.query_scope
|
30
29
|
end
|
31
30
|
|
32
|
-
# Remove default_scope for index view if no parent_resource present
|
33
|
-
if @resource.unscoped_queries_on_index && @parent_resource.blank?
|
34
|
-
@query = @query.unscoped
|
35
|
-
end
|
36
|
-
|
37
31
|
# Eager load the associations
|
38
32
|
if @resource.includes.present?
|
39
33
|
@query = @query.includes(*@resource.includes)
|
@@ -48,18 +42,13 @@ module Avo
|
|
48
42
|
@query = @query.unscope(:order)
|
49
43
|
end
|
50
44
|
|
51
|
-
sanitized_sort_direction = @index_params[:sort_direction].presence_in(["asc", "desc"])
|
52
|
-
|
53
45
|
# Check if the sortable field option is actually a proc and we need to do a custom sort
|
54
|
-
|
55
|
-
field = @resource.
|
46
|
+
field_id = @index_params[:sort_by].to_sym
|
47
|
+
field = @resource.get_field_definitions.find { |field| field.id == field_id }
|
56
48
|
@query = if field&.sortable.is_a?(Proc)
|
57
|
-
field.sortable
|
58
|
-
elsif field.present? && sanitized_sort_direction
|
59
|
-
@query.order("#{@resource.model_class.table_name}.#{sort_by} #{sanitized_sort_direction}")
|
60
|
-
# Transform Model to ActiveRecord::Relation because Avo expects one.
|
49
|
+
Avo::ExecutionContext.new(target: field.sortable, query: @query, direction: @index_params[:sort_direction]).handle
|
61
50
|
else
|
62
|
-
@query.
|
51
|
+
@query.order("#{@resource.model_class.table_name}.#{@index_params[:sort_by]} #{@index_params[:sort_direction]}")
|
63
52
|
end
|
64
53
|
end
|
65
54
|
|
@@ -70,57 +59,62 @@ module Avo
|
|
70
59
|
).apply_query request, @query, filter_value
|
71
60
|
end
|
72
61
|
|
73
|
-
|
62
|
+
extra_pagy_params = {}
|
63
|
+
|
64
|
+
# Reset open filters when a user navigates to a new page
|
65
|
+
extra_pagy_params[:keep_filters_panel_open] = if params[:keep_filters_panel_open] == "1"
|
66
|
+
"0"
|
67
|
+
end
|
68
|
+
|
69
|
+
safe_call :set_and_apply_scopes
|
70
|
+
safe_call :apply_dynamic_filters
|
74
71
|
|
75
|
-
#
|
76
|
-
|
77
|
-
|
72
|
+
@pagy, @records = pagy(pagy_query, items: @index_params[:per_page], link_extra: "data-turbo-frame=\"#{params[:turbo_frame]}\"", size: [1, 2, 2, 1], params: extra_pagy_params)
|
73
|
+
|
74
|
+
# Create resources for each record
|
75
|
+
@resources = @records.map do |record|
|
76
|
+
@resource.hydrate(record: record, params: params).dup
|
78
77
|
end
|
79
78
|
end
|
80
79
|
|
81
80
|
def show
|
82
|
-
@resource.hydrate(
|
81
|
+
@resource.hydrate(record: @record, view: :show, user: _current_user, params: params).detect_fields
|
83
82
|
|
84
83
|
set_actions
|
85
84
|
|
86
85
|
@page_title = @resource.default_panel_name.to_s
|
87
86
|
|
88
87
|
# If we're accessing this resource via another resource add the parent to the breadcrumbs.
|
89
|
-
if params[:via_resource_class].present? && params[:
|
90
|
-
via_resource = Avo
|
91
|
-
|
92
|
-
via_resource.
|
88
|
+
if params[:via_resource_class].present? && params[:via_record_id].present?
|
89
|
+
via_resource = Avo.resource_manager.get_resource(params[:via_resource_class])
|
90
|
+
via_record = via_resource.find_record params[:via_record_id], params: params
|
91
|
+
via_resource = via_resource.new record: via_record
|
93
92
|
|
94
93
|
add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
|
95
|
-
add_breadcrumb via_resource.
|
94
|
+
add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
|
96
95
|
else
|
97
96
|
add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
|
98
97
|
end
|
99
98
|
|
100
|
-
add_breadcrumb @resource.
|
99
|
+
add_breadcrumb @resource.record_title
|
101
100
|
add_breadcrumb I18n.t("avo.details").upcase_first
|
102
101
|
end
|
103
102
|
|
104
103
|
def new
|
105
|
-
@
|
106
|
-
@resource = @resource.hydrate(
|
107
|
-
|
108
|
-
# Handle special cases when creating a new record via a belongs_to relationship
|
109
|
-
if params[:via_belongs_to_resource_class].present?
|
110
|
-
return render turbo_stream: turbo_stream.append('attach_modal', partial: 'avo/base/new_via_belongs_to')
|
111
|
-
end
|
104
|
+
@record = @resource.model_class.new
|
105
|
+
@resource = @resource.hydrate(record: @record, view: :new, user: _current_user)
|
112
106
|
|
113
107
|
set_actions
|
114
108
|
|
115
109
|
@page_title = @resource.default_panel_name.to_s
|
116
110
|
|
117
111
|
if is_associated_record?
|
118
|
-
via_resource = Avo
|
119
|
-
|
120
|
-
via_resource.
|
112
|
+
via_resource = Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
|
113
|
+
via_record = via_resource.find_record params[:via_record_id], params: params
|
114
|
+
via_resource = via_resource.new record: via_record
|
121
115
|
|
122
116
|
add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
|
123
|
-
add_breadcrumb via_resource.
|
117
|
+
add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
|
124
118
|
end
|
125
119
|
|
126
120
|
add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
|
@@ -128,37 +122,37 @@ module Avo
|
|
128
122
|
end
|
129
123
|
|
130
124
|
def create
|
131
|
-
#
|
132
|
-
saved =
|
133
|
-
@resource.hydrate(
|
125
|
+
# record gets instantiated and filled in the fill_record method
|
126
|
+
saved = save_record
|
127
|
+
@resource.hydrate(record: @record, view: :new, user: _current_user)
|
134
128
|
|
135
129
|
# This means that the record has been created through another parent record and we need to attach it somehow.
|
136
|
-
if params[:
|
137
|
-
@reflection = @
|
130
|
+
if params[:via_record_id].present?
|
131
|
+
@reflection = @record._reflections[params[:via_relation]]
|
138
132
|
# Figure out what kind of association does the record have with the parent record
|
139
133
|
|
140
134
|
# Fills in the required infor for belongs_to and has_many
|
141
135
|
# Get the foreign key and set it to the id we received in the params
|
142
136
|
if @reflection.is_a?(ActiveRecord::Reflection::BelongsToReflection) || @reflection.is_a?(ActiveRecord::Reflection::HasManyReflection)
|
143
|
-
related_resource = Avo
|
144
|
-
related_record = related_resource.find_record params[:
|
137
|
+
related_resource = Avo.resource_manager.get_resource_by_model_class params[:via_relation_class]
|
138
|
+
related_record = related_resource.find_record params[:via_record_id], params: params
|
145
139
|
|
146
|
-
@
|
147
|
-
@
|
140
|
+
@record.send("#{@reflection.foreign_key}=", related_record.id)
|
141
|
+
@record.save
|
148
142
|
end
|
149
143
|
|
150
144
|
# For when working with has_one, has_one_through, has_many_through, has_and_belongs_to_many, polymorphic
|
151
|
-
if @reflection.is_a?
|
145
|
+
if @reflection.is_a? ActiveRecord::Reflection::ThroughReflection
|
152
146
|
# find the record
|
153
|
-
via_resource =
|
154
|
-
@related_record = via_resource.find_record params[:
|
155
|
-
association_name = BaseResource.valid_association_name(@
|
147
|
+
via_resource = Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
|
148
|
+
@related_record = via_resource.find_record params[:via_record_id], params: params
|
149
|
+
association_name = BaseResource.valid_association_name(@record, params[:via_relation])
|
156
150
|
|
157
151
|
if params[:via_association_type] == "has_one"
|
158
152
|
# On has_one scenarios we should switch the @record and @related_record
|
159
|
-
@related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @
|
153
|
+
@related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @record)
|
160
154
|
else
|
161
|
-
@
|
155
|
+
@record.send(association_name) << @related_record
|
162
156
|
end
|
163
157
|
end
|
164
158
|
end
|
@@ -179,9 +173,9 @@ module Avo
|
|
179
173
|
end
|
180
174
|
|
181
175
|
def update
|
182
|
-
#
|
183
|
-
saved =
|
184
|
-
@resource = @resource.hydrate(
|
176
|
+
# record gets instantiated and filled in the fill_record method
|
177
|
+
saved = save_record
|
178
|
+
@resource = @resource.hydrate(record: @record, view: :edit, user: _current_user)
|
185
179
|
set_actions
|
186
180
|
|
187
181
|
if saved
|
@@ -199,55 +193,46 @@ module Avo
|
|
199
193
|
end
|
200
194
|
end
|
201
195
|
|
202
|
-
def
|
203
|
-
|
196
|
+
def preview
|
197
|
+
@resource.hydrate(record: @record, view: :show, user: _current_user, params: params)
|
204
198
|
|
205
|
-
|
206
|
-
@resource
|
207
|
-
.hydrate(model: @model, params: params)
|
208
|
-
.ordering_host
|
209
|
-
.order direction
|
210
|
-
end
|
211
|
-
|
212
|
-
respond_to do |format|
|
213
|
-
format.html { redirect_to params[:referrer] || resources_path(resource: @resource) }
|
214
|
-
end
|
199
|
+
render layout: params[:turbo_frame].blank?
|
215
200
|
end
|
216
201
|
|
217
202
|
private
|
218
203
|
|
219
|
-
def
|
204
|
+
def save_record
|
220
205
|
perform_action_and_record_errors do
|
221
|
-
|
206
|
+
save_record_action
|
222
207
|
end
|
223
208
|
end
|
224
209
|
|
225
|
-
def
|
226
|
-
@
|
210
|
+
def save_record_action
|
211
|
+
@record.save!
|
227
212
|
end
|
228
213
|
|
229
214
|
def destroy_model
|
230
215
|
perform_action_and_record_errors do
|
231
|
-
|
216
|
+
destroy_record_action
|
232
217
|
end
|
233
218
|
end
|
234
219
|
|
235
|
-
def
|
236
|
-
@
|
220
|
+
def destroy_record_action
|
221
|
+
@record.destroy!
|
237
222
|
end
|
238
223
|
|
239
224
|
def perform_action_and_record_errors(&block)
|
240
225
|
begin
|
241
226
|
succeeded = block.call
|
242
227
|
rescue => exception
|
243
|
-
# In case there's an error somewhere else than the
|
228
|
+
# In case there's an error somewhere else than the record
|
244
229
|
# Example: When you save a license that should create a user for it and creating that user throws and error.
|
245
230
|
# Example: When you Try to delete a record and has a foreign key constraint.
|
246
231
|
exception_message = exception.message
|
247
232
|
end
|
248
233
|
|
249
|
-
# Add the errors from the
|
250
|
-
@errors = @
|
234
|
+
# Add the errors from the record
|
235
|
+
@errors = @record.errors.full_messages.reject { |error| exception_message.include? error }.unshift exception_message
|
251
236
|
|
252
237
|
succeeded
|
253
238
|
end
|
@@ -305,7 +290,7 @@ module Avo
|
|
305
290
|
@index_params[:per_page] = cookies[:per_page]
|
306
291
|
end
|
307
292
|
|
308
|
-
if @
|
293
|
+
if @parent_record.present?
|
309
294
|
@index_params[:per_page] = Avo.configuration.via_per_page
|
310
295
|
end
|
311
296
|
|
@@ -324,8 +309,20 @@ module Avo
|
|
324
309
|
@index_params[:sort_direction] = params[:sort_direction] || :desc
|
325
310
|
|
326
311
|
# View types
|
327
|
-
|
328
|
-
@index_params[:available_view_types] =
|
312
|
+
available_view_types = @resource.available_view_types
|
313
|
+
@index_params[:available_view_types] = available_view_types
|
314
|
+
|
315
|
+
@index_params[:view_type] = if params[:view_type].present?
|
316
|
+
params[:view_type]
|
317
|
+
elsif available_view_types.size == 1
|
318
|
+
available_view_types.first
|
319
|
+
else
|
320
|
+
@resource.default_view_type || Avo.configuration.default_view_type
|
321
|
+
end
|
322
|
+
|
323
|
+
if available_view_types.exclude? @index_params[:view_type].to_sym
|
324
|
+
raise "View type '#{@index_params[:view_type]}' is unavailable for #{@resource.class}."
|
325
|
+
end
|
329
326
|
end
|
330
327
|
|
331
328
|
def set_filters
|
@@ -343,7 +340,7 @@ module Avo
|
|
343
340
|
@actions = @resource
|
344
341
|
.get_actions
|
345
342
|
.map do |action|
|
346
|
-
action[:class].new(
|
343
|
+
action[:class].new(record: @record, resource: @resource, view: @view, arguments: action[:arguments])
|
347
344
|
end
|
348
345
|
.select do |action|
|
349
346
|
action.visible_in_view(parent_resource: @parent_resource)
|
@@ -397,45 +394,41 @@ module Avo
|
|
397
394
|
end
|
398
395
|
|
399
396
|
def set_edit_title_and_breadcrumbs
|
400
|
-
@resource = @resource.hydrate(
|
397
|
+
@resource = @resource.hydrate(record: @record, view: :edit, user: _current_user)
|
401
398
|
@page_title = @resource.default_panel_name.to_s
|
402
399
|
|
403
400
|
last_crumb_args = {}
|
404
401
|
# If we're accessing this resource via another resource add the parent to the breadcrumbs.
|
405
|
-
if params[:via_resource_class].present? && params[:
|
406
|
-
via_resource = Avo
|
407
|
-
|
408
|
-
via_resource.
|
402
|
+
if params[:via_resource_class].present? && params[:via_record_id].present?
|
403
|
+
via_resource = Avo.resource_manager.get_resource(params[:via_resource_class])
|
404
|
+
via_record = via_resource.find_record params[:via_record_id], params: params
|
405
|
+
via_resource = via_resource.new record: via_record
|
409
406
|
|
410
407
|
add_breadcrumb via_resource.plural_name, resources_path(resource: @resource)
|
411
|
-
add_breadcrumb via_resource.
|
408
|
+
add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
|
412
409
|
|
413
410
|
last_crumb_args = {
|
414
411
|
via_resource_class: params[:via_resource_class],
|
415
|
-
|
412
|
+
via_record_id: params[:via_record_id]
|
416
413
|
}
|
417
414
|
else
|
418
415
|
add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
|
419
416
|
end
|
420
417
|
|
421
|
-
add_breadcrumb @resource.
|
418
|
+
add_breadcrumb @resource.record_title, resource_path(record: @resource.record, resource: @resource, **last_crumb_args)
|
422
419
|
add_breadcrumb t("avo.edit").humanize
|
423
420
|
end
|
424
421
|
|
425
422
|
def create_success_action
|
426
|
-
return render "close_modal_and_reload_field" if params[:via_belongs_to_resource_class].present?
|
427
|
-
|
428
423
|
respond_to do |format|
|
429
424
|
format.html { redirect_to after_create_path, notice: create_success_message}
|
430
425
|
end
|
431
426
|
end
|
432
427
|
|
433
428
|
def create_fail_action
|
434
|
-
flash.now[:error] = create_fail_message
|
435
|
-
|
436
429
|
respond_to do |format|
|
430
|
+
flash.now[:error] = create_fail_message
|
437
431
|
format.html { render :new, status: :unprocessable_entity }
|
438
|
-
format.turbo_stream { render "create_fail_action" }
|
439
432
|
end
|
440
433
|
end
|
441
434
|
|
@@ -450,13 +443,13 @@ module Avo
|
|
450
443
|
def after_create_path
|
451
444
|
# If this is an associated record return to the association show page
|
452
445
|
if is_associated_record?
|
453
|
-
parent_resource =
|
454
|
-
association_name = BaseResource.valid_association_name(@
|
446
|
+
parent_resource = Avo.resource_manager.get_resource_by_model_class(params[:via_relation_class])
|
447
|
+
association_name = BaseResource.valid_association_name(@record, params[:via_relation])
|
455
448
|
|
456
449
|
return resource_view_path(
|
457
|
-
|
450
|
+
record: @record.send(association_name),
|
458
451
|
resource: parent_resource,
|
459
|
-
resource_id: params[:
|
452
|
+
resource_id: params[:via_record_id]
|
460
453
|
)
|
461
454
|
end
|
462
455
|
|
@@ -492,7 +485,7 @@ module Avo
|
|
492
485
|
|
493
486
|
# Needs a different name, otwherwise, in some places, this can be called instead helpers.resource_view_path
|
494
487
|
def resource_view_response_path
|
495
|
-
helpers.resource_view_path(
|
488
|
+
helpers.resource_view_path(record: @record, resource: @resource)
|
496
489
|
end
|
497
490
|
|
498
491
|
def destroy_success_action
|
@@ -502,10 +495,8 @@ module Avo
|
|
502
495
|
end
|
503
496
|
|
504
497
|
def destroy_fail_action
|
505
|
-
flash[:error] = destroy_fail_message
|
506
|
-
|
507
498
|
respond_to do |format|
|
508
|
-
format.
|
499
|
+
format.html { redirect_back fallback_location: params[:referrer] || resources_path(resource: @resource, turbo_frame: params[:turbo_frame], view_type: params[:view_type]), error: destroy_fail_message }
|
509
500
|
end
|
510
501
|
end
|
511
502
|
|
@@ -527,14 +518,14 @@ module Avo
|
|
527
518
|
if @resource.class.send(action) == :index
|
528
519
|
resources_path(resource: @resource)
|
529
520
|
elsif @resource.class.send(action) == :edit || Avo.configuration.resource_default_view == :edit
|
530
|
-
edit_resource_path(resource: @resource,
|
521
|
+
edit_resource_path(resource: @resource, record: @resource.record)
|
531
522
|
else
|
532
|
-
resource_path(
|
523
|
+
resource_path(record: @record, resource: @resource)
|
533
524
|
end
|
534
525
|
end
|
535
526
|
|
536
527
|
def is_associated_record?
|
537
|
-
params[:via_relation_class].present? && params[:
|
528
|
+
params[:via_relation_class].present? && params[:via_record_id].present?
|
538
529
|
end
|
539
530
|
|
540
531
|
# Set pagy locale from params or from avo configuration, if both nil locale = "en"
|
@@ -542,8 +533,12 @@ module Avo
|
|
542
533
|
@pagy_locale = locale.to_s || Avo.configuration.locale || "en"
|
543
534
|
end
|
544
535
|
|
545
|
-
def
|
546
|
-
|
536
|
+
def safe_call(method)
|
537
|
+
send(method) if respond_to?(method, true)
|
538
|
+
end
|
539
|
+
|
540
|
+
def pagy_query
|
541
|
+
@query
|
547
542
|
end
|
548
543
|
end
|
549
544
|
end
|
@@ -2,7 +2,19 @@ require_dependency "avo/application_controller"
|
|
2
2
|
|
3
3
|
module Avo
|
4
4
|
class DebugController < ApplicationController
|
5
|
-
def
|
5
|
+
def status
|
6
|
+
end
|
7
|
+
|
8
|
+
def send_to_hq
|
9
|
+
url = "#{ENV["HQ_URL"]}/api/v3/debug_requests"
|
10
|
+
timeout = 10 # seconds
|
11
|
+
license_key = Avo::Services::DebugService.debug_report(request)[:hq_payload][:license_key]
|
12
|
+
body = params[:body]
|
13
|
+
body = {license_key: license_key, body: body, payload: Avo::Services::DebugService.debug_report(request).to_json}.to_json
|
14
|
+
|
15
|
+
HTTParty.post url, body: body, headers: {"Content-Type": "application/json"}, timeout: timeout
|
16
|
+
|
17
|
+
render turbo_stream: turbo_stream.replace(:send_to_hq, plain: "Payload sent to Avo HQ.")
|
6
18
|
end
|
7
19
|
|
8
20
|
def report
|
@@ -13,13 +25,13 @@ module Avo
|
|
13
25
|
|
14
26
|
if license.valid?
|
15
27
|
flash[:notice] = "avohq.io responded: \"#{license.id.humanize} license is valid\"."
|
16
|
-
elsif license.response[
|
17
|
-
flash[:error] = "avohq.io responded: \"#{license.response[
|
28
|
+
elsif license.response["reason"].present?
|
29
|
+
flash[:error] = "avohq.io responded: \"#{license.response["reason"]}\"."
|
18
30
|
else
|
19
|
-
flash[:error] = license.response[
|
31
|
+
flash[:error] = license.response["error"]
|
20
32
|
end
|
21
33
|
|
22
|
-
redirect_back fallback_location: avo.
|
34
|
+
redirect_back fallback_location: avo.avo_private_status_path
|
23
35
|
end
|
24
36
|
end
|
25
37
|
end
|
@@ -14,7 +14,7 @@ module Avo
|
|
14
14
|
redirect_to computed_path
|
15
15
|
elsif !Rails.env.development?
|
16
16
|
@page_title = "Get started"
|
17
|
-
resource = Avo
|
17
|
+
resource = Avo.resource_manager.all.min_by { |resource| resource.model_key }
|
18
18
|
redirect_to resources_path(resource: resource)
|
19
19
|
end
|
20
20
|
end
|
@@ -4,18 +4,8 @@ module Avo
|
|
4
4
|
class SearchController < ApplicationController
|
5
5
|
include Rails.application.routes.url_helpers
|
6
6
|
|
7
|
-
before_action :set_resource_name, only:
|
8
|
-
before_action :set_resource, only:
|
9
|
-
|
10
|
-
def index
|
11
|
-
raise ActionController::BadRequest.new("This feature requires the pro license https://avohq.io/purchase/pro") if App.license.lacks_with_trial(:global_search)
|
12
|
-
|
13
|
-
resources = Avo::App.resources.reject do |resource|
|
14
|
-
resource.class.hide_from_global_search
|
15
|
-
end
|
16
|
-
|
17
|
-
render json: search_resources(resources)
|
18
|
-
end
|
7
|
+
before_action :set_resource_name, only: :show
|
8
|
+
before_action :set_resource, only: :show
|
19
9
|
|
20
10
|
def show
|
21
11
|
render json: search_resources([resource])
|
@@ -28,7 +18,6 @@ module Avo
|
|
28
18
|
.map do |resource|
|
29
19
|
# Apply authorization
|
30
20
|
next unless @authorization.set_record(resource.model_class).authorize_action(:search, raise_exception: false)
|
31
|
-
|
32
21
|
# Filter out the models without a search_query
|
33
22
|
next if resource.search_query.nil?
|
34
23
|
|
@@ -45,20 +34,20 @@ module Avo
|
|
45
34
|
end
|
46
35
|
|
47
36
|
def search_resource(resource)
|
48
|
-
query = Avo::
|
49
|
-
|
37
|
+
query = Avo::ExecutionContext.new(
|
38
|
+
target: resource.search_query,
|
50
39
|
params: params,
|
51
|
-
|
40
|
+
query: resource.query_scope
|
52
41
|
).handle
|
53
42
|
|
54
|
-
query = apply_scope(query) if should_apply_any_scope?
|
55
|
-
|
56
43
|
# Get the count
|
57
44
|
results_count = query.reselect(resource.model_class.primary_key).count
|
58
45
|
|
59
46
|
# Get the results
|
60
47
|
query = query.limit(8)
|
61
48
|
|
49
|
+
query = apply_scope(query) if should_apply_any_scope?
|
50
|
+
|
62
51
|
results = apply_search_metadata(query, resource)
|
63
52
|
|
64
53
|
header = resource.plural_name
|
@@ -69,9 +58,9 @@ module Avo
|
|
69
58
|
|
70
59
|
result_object = {
|
71
60
|
header: header,
|
72
|
-
help: resource.
|
61
|
+
help: resource.fetch_search(:help) || "",
|
73
62
|
results: results,
|
74
|
-
count:
|
63
|
+
count: results.count
|
75
64
|
}
|
76
65
|
|
77
66
|
[resource.name.pluralize.downcase, result_object]
|
@@ -96,9 +85,9 @@ module Avo
|
|
96
85
|
# to scope the query.
|
97
86
|
# Example usage: Got to a project, create a new review, and search for a user.
|
98
87
|
if parent.blank? && params[:via_parent_resource_id].present? && params[:via_parent_resource_class].present? && params[:via_relation].present?
|
99
|
-
parent_resource_class = BaseResource.
|
88
|
+
parent_resource_class = BaseResource.get_model_by_name params[:via_parent_resource_class]
|
100
89
|
|
101
|
-
reflection_class = BaseResource.
|
90
|
+
reflection_class = BaseResource.get_model_by_name params[:via_reflection_class]
|
102
91
|
|
103
92
|
grandparent = parent_resource_class.find params[:via_parent_resource_id]
|
104
93
|
parent = reflection_class.new(
|
@@ -106,7 +95,7 @@ module Avo
|
|
106
95
|
)
|
107
96
|
end
|
108
97
|
|
109
|
-
Avo::
|
98
|
+
Avo::ExecutionContext.new(target: attach_scope, query: query, parent: parent).handle
|
110
99
|
end
|
111
100
|
|
112
101
|
# This scope is applied if the search is being performed on a has_many association
|
@@ -114,44 +103,34 @@ module Avo
|
|
114
103
|
association_name = BaseResource.valid_association_name(parent, params[:via_association_id])
|
115
104
|
|
116
105
|
# Get association records
|
117
|
-
|
106
|
+
query = parent.send(association_name)
|
118
107
|
|
119
108
|
# Apply policy scope if authorization is present
|
120
|
-
|
109
|
+
query = resource.authorization&.apply_policy query
|
121
110
|
|
122
|
-
Avo::
|
111
|
+
Avo::ExecutionContext.new(target: @resource.class.search_query, params: params, query: query).handle
|
123
112
|
end
|
124
113
|
|
125
|
-
def apply_search_metadata(
|
126
|
-
|
127
|
-
resource = avo_resource.
|
128
|
-
|
129
|
-
record_path = if resource.search_result_path.present?
|
130
|
-
Avo::Hosts::ResourceRecordHost.new(block: resource.search_result_path, resource: resource, record: model).handle
|
131
|
-
else
|
132
|
-
resource.record_path
|
133
|
-
end
|
114
|
+
def apply_search_metadata(records, avo_resource)
|
115
|
+
records.map do |record|
|
116
|
+
resource = avo_resource.new(record: record)
|
134
117
|
|
135
|
-
|
136
|
-
_id: model.id,
|
137
|
-
_label: resource.label,
|
138
|
-
_url: record_path
|
139
|
-
}
|
140
|
-
|
141
|
-
if App.license.has_with_trial(:enhanced_search_results)
|
142
|
-
result[:_description] = resource.description
|
143
|
-
result[:_avatar] = resource.avatar.present? ? main_app.url_for(resource.avatar) : nil
|
144
|
-
result[:_avatar_type] = resource.avatar_type
|
145
|
-
end
|
146
|
-
|
147
|
-
result
|
118
|
+
fetch_result_information record, resource, resource.class.fetch_search(:item, record: record)
|
148
119
|
end
|
149
120
|
end
|
150
121
|
|
151
122
|
private
|
152
123
|
|
124
|
+
def fetch_result_information(record, resource, item)
|
125
|
+
{
|
126
|
+
_id: record.id,
|
127
|
+
_label: item&.dig(:title) || resource.record_title,
|
128
|
+
_url: resource.class.fetch_search(:result_path, record: resource.record) || resource.record_path
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
153
132
|
def should_apply_has_many_scope?
|
154
|
-
params[:via_association] == "has_many" && @resource.search_query.present?
|
133
|
+
params[:via_association] == "has_many" && @resource.class.search_query.present?
|
155
134
|
end
|
156
135
|
|
157
136
|
def should_apply_attach_scope?
|
@@ -175,14 +154,14 @@ module Avo
|
|
175
154
|
end
|
176
155
|
|
177
156
|
def fetch_field
|
178
|
-
fields =
|
157
|
+
fields = Avo.resource_manager.get_resource_by_model_class(params[:via_reflection_class]).new.get_field_definitions
|
179
158
|
fields.find { |f| f.id.to_s == params[:via_association_id] }
|
180
159
|
end
|
181
160
|
|
182
161
|
def fetch_parent
|
183
162
|
return unless params[:via_reflection_id].present?
|
184
163
|
|
185
|
-
parent_resource =
|
164
|
+
parent_resource = Avo.resource_manager.get_resource_by_model_class params[:via_reflection_class]
|
186
165
|
parent_resource.find_record params[:via_reflection_id], params: params
|
187
166
|
end
|
188
167
|
end
|