avo 2.49.0 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of avo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +26 -25
- data/Gemfile.lock +179 -147
- data/README.md +1 -1
- data/app/assets/stylesheets/avo.base.css +0 -1
- data/app/assets/svgs/font.svg +1 -0
- data/app/assets/svgs/triangle-up.svg +1 -0
- data/app/components/avo/actions_component.html.erb +19 -5
- data/app/components/avo/actions_component.rb +37 -17
- data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
- data/app/components/avo/asset_manager/javascript_component.rb +13 -0
- data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
- data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
- data/app/components/avo/base_component.rb +15 -12
- data/app/components/avo/button_component.rb +20 -3
- data/app/components/avo/empty_state_component.rb +1 -1
- data/app/components/avo/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/field_wrapper_component.rb +15 -26
- data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
- data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
- data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
- data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
- data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
- data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/index_component.rb +5 -5
- data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
- data/app/components/avo/fields/preview_field/index_component.rb +4 -0
- data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/show_component.rb +4 -1
- data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
- data/app/components/avo/filters_component.html.erb +9 -3
- data/app/components/avo/filters_component.rb +4 -4
- data/app/components/avo/index/field_wrapper_component.rb +0 -12
- data/app/components/avo/index/grid_item_component.html.erb +13 -36
- data/app/components/avo/index/grid_item_component.rb +43 -16
- data/app/components/avo/index/resource_controls_component.html.erb +3 -81
- data/app/components/avo/index/resource_controls_component.rb +124 -17
- data/app/components/avo/index/resource_grid_component.html.erb +5 -3
- data/app/components/avo/index/resource_grid_component.rb +5 -2
- data/app/components/avo/index/resource_map_component.html.erb +1 -1
- data/app/components/avo/index/resource_map_component.rb +3 -3
- data/app/components/avo/index/resource_table_component.html.erb +5 -4
- data/app/components/avo/index/resource_table_component.rb +14 -20
- data/app/components/avo/index/table_row_component.html.erb +8 -4
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/item_switcher_component.rb +2 -2
- data/app/components/avo/modal_component.html.erb +7 -12
- data/app/components/avo/modal_component.rb +0 -21
- data/app/components/avo/paginator_component.html.erb +40 -29
- data/app/components/avo/paginator_component.rb +5 -23
- data/app/components/avo/panel_component.html.erb +8 -6
- data/app/components/avo/referrer_params_component.html.erb +1 -2
- data/app/components/avo/resource_component.rb +189 -14
- data/app/components/avo/resource_sidebar_component.html.erb +6 -2
- data/app/components/avo/resource_sidebar_component.rb +1 -1
- data/app/components/avo/sidebar/link_component.rb +1 -1
- data/app/components/avo/sidebar_component.html.erb +10 -3
- data/app/components/avo/sidebar_component.rb +5 -3
- data/app/components/avo/sidebar_profile_component.html.erb +15 -8
- data/app/components/avo/tab_group_component.html.erb +13 -7
- data/app/components/avo/tab_group_component.rb +1 -6
- data/app/components/avo/tab_switcher_component.html.erb +17 -40
- data/app/components/avo/tab_switcher_component.rb +4 -39
- data/app/components/avo/views/resource_edit_component.html.erb +12 -48
- data/app/components/avo/views/resource_edit_component.rb +7 -18
- data/app/components/avo/views/resource_index_component.html.erb +41 -47
- data/app/components/avo/views/resource_index_component.rb +62 -12
- data/app/components/avo/views/resource_show_component.html.erb +6 -149
- data/app/components/avo/views/resource_show_component.rb +6 -11
- data/app/controllers/avo/actions_controller.rb +27 -24
- data/app/controllers/avo/application_controller.rb +105 -151
- data/app/controllers/avo/associations_controller.rb +34 -43
- data/app/controllers/avo/attachments_controller.rb +4 -4
- data/app/controllers/avo/base_controller.rb +102 -102
- data/app/controllers/avo/debug_controller.rb +17 -5
- data/app/controllers/avo/home_controller.rb +1 -1
- data/app/controllers/avo/search_controller.rb +30 -51
- data/app/controllers/avo/team_users_controller.rb +4 -0
- data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
- data/app/helpers/avo/application_helper.rb +15 -9
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +27 -11
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/application.js +0 -3
- data/app/javascript/js/controllers/action_controller.js +5 -3
- data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
- data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
- data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
- data/app/javascript/js/controllers/filter_controller.js +1 -1
- data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
- data/app/javascript/js/controllers/preview_controller.js +24 -0
- data/app/javascript/js/controllers/search_controller.js +2 -2
- data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
- data/app/javascript/js/controllers/toggle_controller.js +48 -0
- data/app/javascript/js/controllers.js +10 -6
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
- data/app/views/avo/actions/show.html.erb +10 -7
- data/app/views/avo/associations/new.html.erb +2 -2
- data/app/views/avo/base/index.html.erb +3 -2
- data/app/views/avo/base/new.html.erb +2 -1
- data/app/views/avo/base/preview.html.erb +19 -0
- data/app/views/avo/base/show.html.erb +1 -1
- data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
- data/app/views/avo/debug/report.html.erb +32 -17
- data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_footer.html.erb +1 -1
- data/app/views/avo/partials/_javascript.html.erb +5 -0
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +3 -5
- data/app/views/avo/partials/_table_header.html.erb +5 -11
- data/app/views/layouts/avo/application.html.erb +4 -2
- data/avo.gemspec +11 -12
- data/bin/dev +1 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +0 -2
- data/config/master.key +1 -0
- data/config/routes.rb +6 -10
- data/db/factories.rb +7 -1
- data/lib/avo/action_model.rb +20 -0
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +57 -42
- data/lib/avo/base_resource.rb +264 -227
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/breadcrumbs.rb +2 -2
- data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
- data/lib/avo/concerns/filters_session_handler.rb +5 -3
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_description.rb +23 -0
- data/lib/avo/concerns/has_item_type.rb +42 -0
- data/lib/avo/concerns/has_items.rb +325 -0
- data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
- data/lib/avo/concerns/is_resource_item.rb +24 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/model_class_constantized.rb +0 -2
- data/lib/avo/concerns/visible_in_different_views.rb +126 -0
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +1 -37
- data/lib/avo/current.rb +39 -0
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +18 -3
- data/lib/avo/engine.rb +35 -30
- data/lib/avo/error_manager.rb +25 -0
- data/lib/avo/execution_context.rb +10 -14
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +91 -106
- data/lib/avo/fields/belongs_to_field.rb +18 -22
- data/lib/avo/fields/concerns/file_authorization.rb +2 -2
- data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
- data/lib/avo/fields/concerns/has_default.rb +1 -5
- data/lib/avo/fields/concerns/has_field_name.rb +22 -0
- data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
- data/lib/avo/fields/concerns/is_disabled.rb +1 -5
- data/lib/avo/fields/concerns/is_readonly.rb +1 -5
- data/lib/avo/fields/concerns/is_required.rb +5 -7
- data/lib/avo/fields/concerns/is_searchable.rb +13 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_time_field.rb +3 -14
- data/lib/avo/fields/field_manager.rb +55 -0
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +12 -15
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +6 -10
- data/lib/avo/fields/heading_field.rb +4 -1
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +1 -1
- data/lib/avo/fields/location_field.rb +8 -8
- data/lib/avo/fields/password_field.rb +1 -1
- data/lib/avo/fields/preview_field.rb +14 -0
- data/lib/avo/fields/select_field.rb +12 -8
- data/lib/avo/fields/status_field.rb +4 -0
- data/lib/avo/filters/base_filter.rb +8 -4
- data/lib/avo/html/builder.rb +7 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +8 -67
- data/lib/avo/licensing/license.rb +1 -1
- data/lib/avo/licensing/pro_license.rb +1 -7
- data/lib/avo/loaders/fields_loader.rb +7 -1
- data/lib/avo/plugin.rb +16 -0
- data/lib/avo/plugin_manager.rb +56 -0
- data/lib/avo/prefixed_test_helpers.rb +20 -0
- data/lib/avo/reloader.rb +3 -0
- data/lib/avo/resources/controls/actions_list.rb +7 -12
- data/lib/avo/resources/controls/attach_button.rb +15 -0
- data/lib/avo/resources/controls/back_button.rb +1 -1
- data/lib/avo/resources/controls/base_control.rb +15 -49
- data/lib/avo/resources/controls/create_button.rb +15 -0
- data/lib/avo/resources/controls/delete_button.rb +5 -1
- data/lib/avo/resources/controls/detach_button.rb +4 -1
- data/lib/avo/resources/controls/edit_button.rb +4 -1
- data/lib/avo/resources/controls/order_controls.rb +8 -0
- data/lib/avo/resources/controls/save_button.rb +13 -0
- data/lib/avo/resources/controls/show_button.rb +15 -0
- data/lib/avo/resources/items/holder.rb +84 -0
- data/lib/avo/resources/items/item_group.rb +49 -0
- data/lib/avo/resources/items/main_panel.rb +2 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/row.rb +54 -0
- data/lib/avo/resources/items/sidebar.rb +47 -0
- data/lib/avo/resources/items/tab.rb +60 -0
- data/lib/avo/resources/items/tab_group.rb +68 -0
- data/lib/avo/resources/resource_manager.rb +174 -0
- data/lib/avo/services/authorization_service.rb +11 -110
- data/lib/avo/services/debug_service.rb +93 -0
- data/lib/avo/services/encryption_service.rb +5 -1
- data/lib/avo/services/telemetry_service.rb +85 -0
- data/lib/avo/test_helpers.rb +362 -0
- data/lib/avo/tools/tool_manager.rb +30 -0
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +115 -24
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/resource_generator.rb +4 -4
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
- data/lib/generators/avo/templates/action.tt +8 -6
- data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
- data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
- data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
- data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
- data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
- data/lib/generators/avo/templates/initializer/avo.tt +1 -9
- data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
- data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
- data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
- data/lib/generators/avo/templates/resource/resource.tt +7 -7
- data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
- data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
- data/lib/generators/avo/templates/scope.tt +6 -0
- data/lib/generators/avo/templates/tool/view.tt +2 -2
- data/lib/tasks/avo_tasks.rake +27 -0
- data/public/avo-assets/avo.base.css +1810 -1189
- data/public/avo-assets/avo.base.js +217 -307
- data/public/avo-assets/avo.base.js.map +3 -3
- data/public/avo-assets/avo.css +9744 -0
- data/public/avo-assets/avo.js +513 -0
- data/public/avo-assets/avo.js.map +7 -0
- metadata +102 -146
- data/app/assets/stylesheets/css/tags.css +0 -32
- data/app/components/avo/card_component.html.erb +0 -46
- data/app/components/avo/card_component.rb +0 -25
- data/app/components/avo/dashboards/divider_component.html.erb +0 -9
- data/app/components/avo/dashboards/divider_component.rb +0 -19
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
- data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
- data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
- data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
- data/app/components/avo/fields/tags_field/index_component.rb +0 -9
- data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/tags_field/show_component.rb +0 -5
- data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
- data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
- data/app/components/avo/index/ordering/base_component.rb +0 -9
- data/app/components/avo/index/ordering/button_component.html.erb +0 -11
- data/app/components/avo/index/ordering/button_component.rb +0 -23
- data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
- data/app/components/avo/index/ordering/buttons_component.rb +0 -47
- data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
- data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
- data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
- data/app/controllers/avo/dashboards_controller.rb +0 -22
- data/app/controllers/avo/reorder_controller.rb +0 -25
- data/app/javascript/js/controllers/base_controller.js +0 -22
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
- data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
- data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
- data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
- data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
- data/app/views/avo/dashboards/cards/show.html.erb +0 -3
- data/app/views/avo/dashboards/show.html.erb +0 -38
- data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
- data/app/views/avo/partials/_global_search.html.erb +0 -19
- data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
- data/lib/avo/app.rb +0 -237
- data/lib/avo/base_card.rb +0 -161
- data/lib/avo/concerns/fetches_things.rb +0 -150
- data/lib/avo/concerns/handles_field_args.rb +0 -47
- data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_fields.rb +0 -334
- data/lib/avo/concerns/has_html_attributes.rb +0 -123
- data/lib/avo/concerns/pagination.rb +0 -53
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- data/lib/avo/concerns/visible_items.rb +0 -51
- data/lib/avo/dashboards/base_dashboard.rb +0 -89
- data/lib/avo/dashboards/base_divider.rb +0 -35
- data/lib/avo/dashboards/chartkick_card.rb +0 -77
- data/lib/avo/dashboards/dashboard_card.rb +0 -6
- data/lib/avo/dashboards/metric_card.rb +0 -9
- data/lib/avo/dashboards/partial_card.rb +0 -7
- data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
- data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
- data/lib/avo/fields/tags_field.rb +0 -102
- data/lib/avo/grid_collector.rb +0 -42
- data/lib/avo/hosts/association_scope_host.rb +0 -8
- data/lib/avo/hosts/base_host.rb +0 -25
- data/lib/avo/hosts/card_visibility.rb +0 -20
- data/lib/avo/hosts/dashboard_card.rb +0 -22
- data/lib/avo/hosts/dashboard_visibility.rb +0 -19
- data/lib/avo/hosts/ordering.rb +0 -22
- data/lib/avo/hosts/record_host.rb +0 -7
- data/lib/avo/hosts/resource_record_host.rb +0 -7
- data/lib/avo/hosts/resource_view_record_host.rb +0 -7
- data/lib/avo/hosts/search_scope_host.rb +0 -7
- data/lib/avo/hosts/view_record_host.rb +0 -7
- data/lib/avo/hosts/visibility_host.rb +0 -12
- data/lib/avo/items_holder.rb +0 -96
- data/lib/avo/main_panel.rb +0 -3
- data/lib/avo/menu/base_item.rb +0 -25
- data/lib/avo/menu/builder.rb +0 -82
- data/lib/avo/menu/dashboard.rb +0 -22
- data/lib/avo/menu/group.rb +0 -2
- data/lib/avo/menu/link.rb +0 -6
- data/lib/avo/menu/menu.rb +0 -2
- data/lib/avo/menu/resource.rb +0 -22
- data/lib/avo/menu/section.rb +0 -2
- data/lib/avo/panel.rb +0 -24
- data/lib/avo/panel_builder.rb +0 -25
- data/lib/avo/resources/controls/action.rb +0 -38
- data/lib/avo/resources/controls/execution_context.rb +0 -58
- data/lib/avo/resources/controls/items_holder.rb +0 -19
- data/lib/avo/resources/controls/link_to.rb +0 -27
- data/lib/avo/row.rb +0 -26
- data/lib/avo/row_builder.rb +0 -24
- data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
- data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
- data/lib/avo/sidebar.rb +0 -30
- data/lib/avo/sidebar_builder.rb +0 -24
- data/lib/avo/tab.rb +0 -72
- data/lib/avo/tab_builder.rb +0 -25
- data/lib/avo/tab_group.rb +0 -42
- data/lib/avo/tab_group_builder.rb +0 -43
- data/lib/avo/tools_manager.rb +0 -11
- data/lib/generators/avo/card/chartkick_generator.rb +0 -18
- data/lib/generators/avo/card/metric_generator.rb +0 -18
- data/lib/generators/avo/card/partial_generator.rb +0 -19
- data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
- data/lib/generators/avo/templates/standalone_action.tt +0 -8
- /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -6,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)
|
@@ -52,7 +46,7 @@ module Avo
|
|
52
46
|
field_id = @index_params[:sort_by].to_sym
|
53
47
|
field = @resource.get_field_definitions.find { |field| field.id == field_id }
|
54
48
|
@query = if field&.sortable.is_a?(Proc)
|
55
|
-
field.sortable
|
49
|
+
Avo::ExecutionContext.new(target: field.sortable, query: @query, direction: @index_params[:sort_direction]).handle
|
56
50
|
else
|
57
51
|
@query.order("#{@resource.model_class.table_name}.#{@index_params[:sort_by]} #{@index_params[:sort_direction]}")
|
58
52
|
end
|
@@ -65,57 +59,62 @@ module Avo
|
|
65
59
|
).apply_query request, @query, filter_value
|
66
60
|
end
|
67
61
|
|
68
|
-
|
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
|
71
|
+
|
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)
|
69
73
|
|
70
|
-
# Create resources for each
|
71
|
-
@resources = @
|
72
|
-
@resource.hydrate(
|
74
|
+
# Create resources for each record
|
75
|
+
@resources = @records.map do |record|
|
76
|
+
@resource.hydrate(record: record, params: params).dup
|
73
77
|
end
|
74
78
|
end
|
75
79
|
|
76
80
|
def show
|
77
|
-
@resource.hydrate(
|
81
|
+
@resource.hydrate(record: @record, view: :show, user: _current_user, params: params).detect_fields
|
78
82
|
|
79
83
|
set_actions
|
80
84
|
|
81
85
|
@page_title = @resource.default_panel_name.to_s
|
82
86
|
|
83
87
|
# If we're accessing this resource via another resource add the parent to the breadcrumbs.
|
84
|
-
if params[:via_resource_class].present? && params[:
|
85
|
-
via_resource = Avo
|
86
|
-
|
87
|
-
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
|
88
92
|
|
89
93
|
add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
|
90
|
-
add_breadcrumb via_resource.
|
94
|
+
add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
|
91
95
|
else
|
92
96
|
add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
|
93
97
|
end
|
94
98
|
|
95
|
-
add_breadcrumb @resource.
|
99
|
+
add_breadcrumb @resource.record_title
|
96
100
|
add_breadcrumb I18n.t("avo.details").upcase_first
|
97
101
|
end
|
98
102
|
|
99
103
|
def new
|
100
|
-
@
|
101
|
-
@resource = @resource.hydrate(
|
102
|
-
|
103
|
-
# Handle special cases when creating a new record via a belongs_to relationship
|
104
|
-
if params[:via_belongs_to_resource_class].present?
|
105
|
-
return render turbo_stream: turbo_stream.append('attach_modal', partial: 'avo/base/new_via_belongs_to')
|
106
|
-
end
|
104
|
+
@record = @resource.model_class.new
|
105
|
+
@resource = @resource.hydrate(record: @record, view: :new, user: _current_user)
|
107
106
|
|
108
107
|
set_actions
|
109
108
|
|
110
109
|
@page_title = @resource.default_panel_name.to_s
|
111
110
|
|
112
111
|
if is_associated_record?
|
113
|
-
via_resource = Avo
|
114
|
-
|
115
|
-
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
|
116
115
|
|
117
116
|
add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
|
118
|
-
add_breadcrumb via_resource.
|
117
|
+
add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
|
119
118
|
end
|
120
119
|
|
121
120
|
add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
|
@@ -123,37 +122,37 @@ module Avo
|
|
123
122
|
end
|
124
123
|
|
125
124
|
def create
|
126
|
-
#
|
127
|
-
saved =
|
128
|
-
@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)
|
129
128
|
|
130
129
|
# This means that the record has been created through another parent record and we need to attach it somehow.
|
131
|
-
if params[:
|
132
|
-
@reflection = @
|
130
|
+
if params[:via_record_id].present?
|
131
|
+
@reflection = @record._reflections[params[:via_relation]]
|
133
132
|
# Figure out what kind of association does the record have with the parent record
|
134
133
|
|
135
134
|
# Fills in the required infor for belongs_to and has_many
|
136
135
|
# Get the foreign key and set it to the id we received in the params
|
137
136
|
if @reflection.is_a?(ActiveRecord::Reflection::BelongsToReflection) || @reflection.is_a?(ActiveRecord::Reflection::HasManyReflection)
|
138
|
-
related_resource = Avo
|
139
|
-
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
|
140
139
|
|
141
|
-
@
|
142
|
-
@
|
140
|
+
@record.send("#{@reflection.foreign_key}=", related_record.id)
|
141
|
+
@record.save
|
143
142
|
end
|
144
143
|
|
145
144
|
# For when working with has_one, has_one_through, has_many_through, has_and_belongs_to_many, polymorphic
|
146
145
|
if @reflection.is_a? ActiveRecord::Reflection::ThroughReflection
|
147
146
|
# find the record
|
148
|
-
via_resource =
|
149
|
-
@related_record = via_resource.find_record params[:
|
150
|
-
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])
|
151
150
|
|
152
151
|
if params[:via_association_type] == "has_one"
|
153
152
|
# On has_one scenarios we should switch the @record and @related_record
|
154
|
-
@related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @
|
153
|
+
@related_record.send("#{@reflection.parent_reflection.inverse_of.name}=", @record)
|
155
154
|
else
|
156
|
-
@
|
155
|
+
@record.send(association_name) << @related_record
|
157
156
|
end
|
158
157
|
end
|
159
158
|
end
|
@@ -174,9 +173,9 @@ module Avo
|
|
174
173
|
end
|
175
174
|
|
176
175
|
def update
|
177
|
-
#
|
178
|
-
saved =
|
179
|
-
@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)
|
180
179
|
set_actions
|
181
180
|
|
182
181
|
if saved
|
@@ -194,55 +193,46 @@ module Avo
|
|
194
193
|
end
|
195
194
|
end
|
196
195
|
|
197
|
-
def
|
198
|
-
|
196
|
+
def preview
|
197
|
+
@resource.hydrate(record: @record, view: :show, user: _current_user, params: params)
|
199
198
|
|
200
|
-
|
201
|
-
@resource
|
202
|
-
.hydrate(model: @model, params: params)
|
203
|
-
.ordering_host
|
204
|
-
.order direction
|
205
|
-
end
|
206
|
-
|
207
|
-
respond_to do |format|
|
208
|
-
format.html { redirect_to params[:referrer] || resources_path(resource: @resource) }
|
209
|
-
end
|
199
|
+
render layout: params[:turbo_frame].blank?
|
210
200
|
end
|
211
201
|
|
212
202
|
private
|
213
203
|
|
214
|
-
def
|
204
|
+
def save_record
|
215
205
|
perform_action_and_record_errors do
|
216
|
-
|
206
|
+
save_record_action
|
217
207
|
end
|
218
208
|
end
|
219
209
|
|
220
|
-
def
|
221
|
-
@
|
210
|
+
def save_record_action
|
211
|
+
@record.save!
|
222
212
|
end
|
223
213
|
|
224
214
|
def destroy_model
|
225
215
|
perform_action_and_record_errors do
|
226
|
-
|
216
|
+
destroy_record_action
|
227
217
|
end
|
228
218
|
end
|
229
219
|
|
230
|
-
def
|
231
|
-
@
|
220
|
+
def destroy_record_action
|
221
|
+
@record.destroy!
|
232
222
|
end
|
233
223
|
|
234
224
|
def perform_action_and_record_errors(&block)
|
235
225
|
begin
|
236
226
|
succeeded = block.call
|
237
227
|
rescue => exception
|
238
|
-
# In case there's an error somewhere else than the
|
228
|
+
# In case there's an error somewhere else than the record
|
239
229
|
# Example: When you save a license that should create a user for it and creating that user throws and error.
|
240
230
|
# Example: When you Try to delete a record and has a foreign key constraint.
|
241
231
|
exception_message = exception.message
|
242
232
|
end
|
243
233
|
|
244
|
-
# Add the errors from the
|
245
|
-
@errors = @
|
234
|
+
# Add the errors from the record
|
235
|
+
@errors = @record.errors.full_messages.reject { |error| exception_message.include? error }.unshift exception_message
|
246
236
|
|
247
237
|
succeeded
|
248
238
|
end
|
@@ -300,7 +290,7 @@ module Avo
|
|
300
290
|
@index_params[:per_page] = cookies[:per_page]
|
301
291
|
end
|
302
292
|
|
303
|
-
if @
|
293
|
+
if @parent_record.present?
|
304
294
|
@index_params[:per_page] = Avo.configuration.via_per_page
|
305
295
|
end
|
306
296
|
|
@@ -319,8 +309,20 @@ module Avo
|
|
319
309
|
@index_params[:sort_direction] = params[:sort_direction] || :desc
|
320
310
|
|
321
311
|
# View types
|
322
|
-
|
323
|
-
@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
|
324
326
|
end
|
325
327
|
|
326
328
|
def set_filters
|
@@ -338,7 +340,7 @@ module Avo
|
|
338
340
|
@actions = @resource
|
339
341
|
.get_actions
|
340
342
|
.map do |action|
|
341
|
-
action[:class].new(
|
343
|
+
action[:class].new(record: @record, resource: @resource, view: @view, arguments: action[:arguments])
|
342
344
|
end
|
343
345
|
.select do |action|
|
344
346
|
action.visible_in_view(parent_resource: @parent_resource)
|
@@ -392,45 +394,41 @@ module Avo
|
|
392
394
|
end
|
393
395
|
|
394
396
|
def set_edit_title_and_breadcrumbs
|
395
|
-
@resource = @resource.hydrate(
|
397
|
+
@resource = @resource.hydrate(record: @record, view: :edit, user: _current_user)
|
396
398
|
@page_title = @resource.default_panel_name.to_s
|
397
399
|
|
398
400
|
last_crumb_args = {}
|
399
401
|
# If we're accessing this resource via another resource add the parent to the breadcrumbs.
|
400
|
-
if params[:via_resource_class].present? && params[:
|
401
|
-
via_resource = Avo
|
402
|
-
|
403
|
-
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
|
404
406
|
|
405
407
|
add_breadcrumb via_resource.plural_name, resources_path(resource: @resource)
|
406
|
-
add_breadcrumb via_resource.
|
408
|
+
add_breadcrumb via_resource.record_title, resource_path(record: via_record, resource: via_resource)
|
407
409
|
|
408
410
|
last_crumb_args = {
|
409
411
|
via_resource_class: params[:via_resource_class],
|
410
|
-
|
412
|
+
via_record_id: params[:via_record_id]
|
411
413
|
}
|
412
414
|
else
|
413
415
|
add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
|
414
416
|
end
|
415
417
|
|
416
|
-
add_breadcrumb @resource.
|
418
|
+
add_breadcrumb @resource.record_title, resource_path(record: @resource.record, resource: @resource, **last_crumb_args)
|
417
419
|
add_breadcrumb t("avo.edit").humanize
|
418
420
|
end
|
419
421
|
|
420
422
|
def create_success_action
|
421
|
-
return render "close_modal_and_reload_field" if params[:via_belongs_to_resource_class].present?
|
422
|
-
|
423
423
|
respond_to do |format|
|
424
424
|
format.html { redirect_to after_create_path, notice: create_success_message}
|
425
425
|
end
|
426
426
|
end
|
427
427
|
|
428
428
|
def create_fail_action
|
429
|
-
flash.now[:error] = create_fail_message
|
430
|
-
|
431
429
|
respond_to do |format|
|
430
|
+
flash.now[:error] = create_fail_message
|
432
431
|
format.html { render :new, status: :unprocessable_entity }
|
433
|
-
format.turbo_stream { render "create_fail_action" }
|
434
432
|
end
|
435
433
|
end
|
436
434
|
|
@@ -445,13 +443,13 @@ module Avo
|
|
445
443
|
def after_create_path
|
446
444
|
# If this is an associated record return to the association show page
|
447
445
|
if is_associated_record?
|
448
|
-
parent_resource =
|
449
|
-
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])
|
450
448
|
|
451
449
|
return resource_view_path(
|
452
|
-
|
450
|
+
record: @record.send(association_name),
|
453
451
|
resource: parent_resource,
|
454
|
-
resource_id: params[:
|
452
|
+
resource_id: params[:via_record_id]
|
455
453
|
)
|
456
454
|
end
|
457
455
|
|
@@ -487,7 +485,7 @@ module Avo
|
|
487
485
|
|
488
486
|
# Needs a different name, otwherwise, in some places, this can be called instead helpers.resource_view_path
|
489
487
|
def resource_view_response_path
|
490
|
-
helpers.resource_view_path(
|
488
|
+
helpers.resource_view_path(record: @record, resource: @resource)
|
491
489
|
end
|
492
490
|
|
493
491
|
def destroy_success_action
|
@@ -497,10 +495,8 @@ module Avo
|
|
497
495
|
end
|
498
496
|
|
499
497
|
def destroy_fail_action
|
500
|
-
flash[:error] = destroy_fail_message
|
501
|
-
|
502
498
|
respond_to do |format|
|
503
|
-
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 }
|
504
500
|
end
|
505
501
|
end
|
506
502
|
|
@@ -522,14 +518,14 @@ module Avo
|
|
522
518
|
if @resource.class.send(action) == :index
|
523
519
|
resources_path(resource: @resource)
|
524
520
|
elsif @resource.class.send(action) == :edit || Avo.configuration.resource_default_view == :edit
|
525
|
-
edit_resource_path(resource: @resource,
|
521
|
+
edit_resource_path(resource: @resource, record: @resource.record)
|
526
522
|
else
|
527
|
-
resource_path(
|
523
|
+
resource_path(record: @record, resource: @resource)
|
528
524
|
end
|
529
525
|
end
|
530
526
|
|
531
527
|
def is_associated_record?
|
532
|
-
params[:via_relation_class].present? && params[:
|
528
|
+
params[:via_relation_class].present? && params[:via_record_id].present?
|
533
529
|
end
|
534
530
|
|
535
531
|
# Set pagy locale from params or from avo configuration, if both nil locale = "en"
|
@@ -537,8 +533,12 @@ module Avo
|
|
537
533
|
@pagy_locale = locale.to_s || Avo.configuration.locale || "en"
|
538
534
|
end
|
539
535
|
|
540
|
-
def
|
541
|
-
|
536
|
+
def safe_call(method)
|
537
|
+
send(method) if respond_to?(method, true)
|
538
|
+
end
|
539
|
+
|
540
|
+
def pagy_query
|
541
|
+
@query
|
542
542
|
end
|
543
543
|
end
|
544
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
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Avo
|
2
|
+
module InitializesAvo
|
3
|
+
def init_app
|
4
|
+
Avo::Current.license = Avo::Licensing::NilLicense.new
|
5
|
+
Avo::Current.context = context
|
6
|
+
Avo::Current.user = _current_user
|
7
|
+
Avo::Current.view_context = view_context
|
8
|
+
Avo.init
|
9
|
+
Avo::Current.license = Licensing::LicenseManager.new(Licensing::HQ.new(request).response).license
|
10
|
+
Avo.plugin_manager.init_plugins
|
11
|
+
end
|
12
|
+
|
13
|
+
def _current_user
|
14
|
+
instance_eval(&Avo.configuration.current_user)
|
15
|
+
end
|
16
|
+
|
17
|
+
def context
|
18
|
+
instance_eval(&Avo.configuration.context)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|