avo 2.45.0 → 3.0.0.pre1
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 +23 -22
- data/Gemfile.lock +181 -160
- data/README.md +1 -1
- data/{public/avo-assets → app/assets/builds}/avo.base.css +479 -698
- data/app/assets/builds/avo.base.js +93804 -0
- data/app/assets/builds/avo.base.js.map +7 -0
- data/app/assets/stylesheets/avo.base.css +2 -2
- data/app/assets/svgs/failed_to_load.svg +1 -0
- data/app/assets/svgs/font.svg +1 -0
- data/app/assets/svgs/grid-empty-state.svg +1 -0
- data/app/assets/svgs/table-empty-state.svg +1 -0
- data/app/assets/svgs/triangle-up.svg +1 -0
- data/app/components/avo/actions_component.html.erb +18 -4
- data/app/components/avo/actions_component.rb +12 -18
- data/app/components/avo/alert_component.html.erb +1 -1
- 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 +14 -11
- 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 +4 -4
- data/app/components/avo/field_wrapper_component.rb +9 -9
- 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 +5 -20
- 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 -2
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
- data/app/components/avo/fields/code_field/edit_component.html.erb +0 -1
- 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.html.erb +5 -0
- data/app/components/avo/fields/common/files_list_viewer_component.rb +8 -0
- data/app/components/avo/fields/common/heading_component.html.erb +1 -1
- data/app/components/avo/fields/common/single_file_viewer_component.html.erb +56 -0
- data/app/components/avo/fields/common/single_file_viewer_component.rb +55 -0
- data/app/components/avo/fields/country_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +2 -4
- data/app/components/avo/fields/file_field/edit_component.rb +0 -1
- data/app/components/avo/fields/file_field/index_component.rb +2 -2
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/files_field/edit_component.html.erb +2 -4
- data/app/components/avo/fields/files_field/edit_component.rb +0 -1
- data/app/components/avo/fields/files_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_many_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 +2 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +3 -7
- data/app/components/avo/fields/index_component.rb +5 -6
- data/app/components/avo/fields/markdown_field/edit_component.html.erb +3 -4
- data/app/components/avo/fields/markdown_field/show_component.html.erb +3 -3
- data/app/components/avo/fields/number_field/edit_component.html.erb +1 -3
- data/app/components/avo/fields/password_field/edit_component.html.erb +1 -3
- 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/progress_bar_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/select_field/edit_component.html.erb +2 -3
- data/app/components/avo/fields/show_component.rb +4 -1
- data/app/components/avo/fields/status_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/text_field/edit_component.html.erb +2 -3
- data/app/components/avo/fields/textarea_field/edit_component.html.erb +0 -1
- data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
- data/app/components/avo/fields/trix_field/show_component.html.erb +1 -1
- data/app/components/avo/filters_component.html.erb +9 -3
- data/app/components/avo/filters_component.rb +4 -4
- data/app/components/avo/index/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/index/grid_item_component.html.erb +5 -2
- data/app/components/avo/index/grid_item_component.rb +7 -6
- data/app/components/avo/index/resource_controls_component.html.erb +3 -81
- data/app/components/avo/index/resource_controls_component.rb +128 -18
- data/app/components/avo/index/resource_grid_component.html.erb +5 -3
- data/app/components/avo/index/resource_grid_component.rb +5 -2
- data/app/components/avo/index/resource_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.html.erb +5 -10
- data/app/components/avo/item_switcher_component.rb +2 -3
- 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 -11
- data/app/components/avo/panel_component.rb +0 -1
- data/app/components/avo/profile_item_component.html.erb +2 -17
- data/app/components/avo/profile_item_component.rb +1 -13
- data/app/components/avo/referrer_params_component.html.erb +1 -4
- data/app/components/avo/resource_component.rb +142 -30
- data/app/components/avo/resource_sidebar_component.html.erb +6 -2
- data/app/components/avo/sidebar/link_component.html.erb +0 -2
- data/app/components/avo/sidebar/link_component.rb +3 -5
- data/app/components/avo/sidebar_component.html.erb +9 -2
- data/app/components/avo/sidebar_component.rb +5 -3
- data/app/components/avo/sidebar_profile_component.html.erb +27 -20
- 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 +16 -52
- data/app/components/avo/views/resource_edit_component.rb +7 -18
- data/app/components/avo/views/resource_index_component.html.erb +38 -53
- data/app/components/avo/views/resource_index_component.rb +60 -16
- data/app/components/avo/views/resource_show_component.html.erb +8 -151
- data/app/components/avo/views/resource_show_component.rb +6 -11
- data/app/controllers/avo/actions_controller.rb +19 -16
- data/app/controllers/avo/application_controller.rb +40 -109
- data/app/controllers/avo/associations_controller.rb +34 -41
- data/app/controllers/avo/attachments_controller.rb +10 -25
- data/app/controllers/avo/base_controller.rb +91 -103
- data/app/controllers/avo/debug_controller.rb +17 -5
- data/app/controllers/avo/search_controller.rb +29 -54
- data/app/controllers/avo/team_users_controller.rb +4 -0
- data/app/controllers/concerns/avo/initializes_avo.rb +26 -0
- data/app/helpers/avo/application_helper.rb +20 -21
- 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 -5
- 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/{easy_mde_controller.js → simple_mde_controller.js} +3 -4
- 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 +1 -3
- 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 +12 -8
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/{attachments/destroy.turbo_stream.erb → actions/keep_modal_open.turbo_stream.erb} +0 -2
- data/app/views/avo/actions/show.html.erb +11 -10
- data/app/views/avo/associations/new.html.erb +4 -4
- 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 -15
- data/app/views/avo/home/index.html.erb +1 -1
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- 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 -3
- data/app/views/avo/partials/_view_toggle_button.html.erb +0 -9
- data/app/views/avo/private/design.html.erb +2 -2
- data/app/views/layouts/avo/application.html.erb +3 -0
- data/avo.gemspec +6 -7
- data/bin/dev +1 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +10 -14
- data/config/master.key +1 -0
- data/config/routes.rb +8 -12
- data/db/factories.rb +7 -18
- data/lib/avo/action_model.rb +20 -0
- data/lib/avo/app.rb +90 -162
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +38 -35
- data/lib/avo/base_resource.rb +107 -95
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +3 -3
- data/lib/avo/concerns/filters_session_handler.rb +1 -0
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_item_type.rb +38 -0
- data/lib/avo/concerns/{has_fields.rb → has_items.rb} +110 -97
- data/lib/avo/concerns/is_resource_item.rb +24 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/visible_in_different_views.rb +126 -0
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +8 -45
- data/lib/avo/current.rb +5 -0
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +6 -2
- data/lib/avo/engine.rb +37 -30
- data/lib/avo/error_manager.rb +25 -0
- data/lib/avo/execution_context.rb +9 -15
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +72 -123
- data/lib/avo/fields/belongs_to_field.rb +14 -25
- 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_field.rb +3 -16
- data/lib/avo/fields/date_time_field.rb +1 -5
- data/lib/avo/fields/field_manager.rb +45 -0
- data/lib/avo/fields/file_field.rb +0 -2
- data/lib/avo/fields/files_field.rb +0 -6
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +11 -14
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +5 -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 +2 -3
- 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 +3 -8
- data/lib/avo/grid_collector.rb +7 -9
- data/lib/avo/html/builder.rb +5 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +3 -67
- data/lib/avo/licensing/license.rb +2 -2
- data/lib/avo/licensing/license_manager.rb +1 -1
- data/lib/avo/licensing/{nil_license.rb → null_license.rb} +1 -1
- data/lib/avo/licensing/pro_license.rb +1 -7
- data/lib/avo/plugin.rb +6 -0
- data/lib/avo/plugin_manager.rb +58 -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 +6 -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 +76 -0
- data/lib/avo/resources/items/item_group.rb +48 -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/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 +181 -0
- data/lib/avo/services/authorization_service.rb +11 -110
- data/lib/avo/services/debug_service.rb +92 -0
- data/lib/avo/services/telemetry_service.rb +84 -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 +7 -0
- data/lib/generators/avo/eject_generator.rb +0 -1
- data/lib/generators/avo/install_generator.rb +1 -11
- data/lib/generators/avo/resource_generator.rb +5 -23
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -18
- data/lib/generators/avo/templates/action.tt +1 -1
- 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 +1 -1
- 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 -11
- data/lib/generators/avo/templates/locales/avo.ar.yml +5 -5
- 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 +1 -1
- 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/standalone_action.tt +1 -1
- data/lib/generators/avo/templates/tailwindcss/Procfile.dev +1 -1
- data/lib/generators/avo/templates/tool/view.tt +2 -2
- data/lib/tasks/avo_tasks.rake +22 -0
- metadata +81 -159
- data/app/assets/stylesheets/css/tags.css +0 -32
- data/app/assets/svgs/map-empty-state.svg +0 -35
- data/app/assets/svgs/map-view-type.svg +0 -3
- 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/area_field/edit_component.html.erb +0 -7
- data/app/components/avo/fields/area_field/edit_component.rb +0 -4
- data/app/components/avo/fields/area_field/show_component.html.erb +0 -8
- data/app/components/avo/fields/area_field/show_component.rb +0 -4
- 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/common/files/controls_component.html.erb +0 -29
- data/app/components/avo/fields/common/files/controls_component.rb +0 -19
- data/app/components/avo/fields/common/files/list_viewer_component.html.erb +0 -20
- data/app/components/avo/fields/common/files/list_viewer_component.rb +0 -41
- data/app/components/avo/fields/common/files/view_type/grid_item_component.html.erb +0 -27
- data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +0 -52
- data/app/components/avo/fields/common/files/view_type/list_item_component.html.erb +0 -22
- data/app/components/avo/fields/common/files/view_type/list_item_component.rb +0 -15
- data/app/components/avo/fields/location_field/edit_component.html.erb +0 -22
- data/app/components/avo/fields/location_field/edit_component.rb +0 -4
- data/app/components/avo/fields/location_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/location_field/show_component.rb +0 -4
- 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/index/resource_map_component.html.erb +0 -16
- data/app/components/avo/index/resource_map_component.rb +0 -109
- data/app/components/avo/row_component.html.erb +0 -3
- data/app/components/avo/row_component.rb +0 -12
- 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/partials/_profile_menu_extra.html.erb +0 -2
- data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
- data/lib/avo/base_card.rb +0 -161
- data/lib/avo/concerns/fetches_things.rb +0 -150
- data/lib/avo/concerns/handles_field_args.rb +0 -47
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_html_attributes.rb +0 -108
- 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/area_field.rb +0 -39
- data/lib/avo/fields/concerns/file_authorization.rb +0 -31
- 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/location_field.rb +0 -86
- data/lib/avo/fields/tags_field.rb +0 -102
- 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/templates/locales/avo.es.yml +0 -126
- data/public/avo-assets/avo.base.js +0 -1037
- data/public/avo-assets/avo.base.js.map +0 -7
data/lib/avo/current.rb
ADDED
data/lib/avo/dsl/field_parser.rb
CHANGED
data/lib/avo/dynamic_router.rb
CHANGED
@@ -9,7 +9,7 @@ module Avo
|
|
9
9
|
Avo::App.eager_load(:resources) unless Rails.application.config.eager_load
|
10
10
|
end
|
11
11
|
|
12
|
-
Avo::
|
12
|
+
Avo::Resources::ResourceManager.fetch_resources
|
13
13
|
.select do |resource|
|
14
14
|
resource != :BaseResource
|
15
15
|
end
|
@@ -17,7 +17,11 @@ module Avo
|
|
17
17
|
resource.is_a? Class
|
18
18
|
end
|
19
19
|
.map do |resource|
|
20
|
-
resources resource.new.route_key
|
20
|
+
resources resource.new.route_key do
|
21
|
+
member do
|
22
|
+
get :preview
|
23
|
+
end
|
24
|
+
end
|
21
25
|
end
|
22
26
|
end
|
23
27
|
end
|
data/lib/avo/engine.rb
CHANGED
@@ -7,34 +7,59 @@ Gem.loaded_specs["avo"].dependencies.each do |d|
|
|
7
7
|
require "action_view/railtie"
|
8
8
|
when "activestorage"
|
9
9
|
require "active_storage/engine"
|
10
|
-
when "actiontext"
|
11
|
-
require "action_text/engine"
|
12
10
|
else
|
13
11
|
require d.name
|
14
12
|
end
|
15
13
|
end
|
16
14
|
|
15
|
+
# In development we should load the engine so we get the autoload for components
|
16
|
+
if ENV["RAILS_ENV"] === "development"
|
17
|
+
require "view_component/engine"
|
18
|
+
end
|
19
|
+
|
17
20
|
module Avo
|
18
21
|
class Engine < ::Rails::Engine
|
19
22
|
isolate_namespace Avo
|
20
23
|
|
21
24
|
config.after_initialize do
|
25
|
+
# Reset before reloads in development
|
26
|
+
::Avo.asset_manager.reset
|
27
|
+
|
28
|
+
# Boot Avo
|
29
|
+
::Avo::App.boot
|
30
|
+
::Avo.plugin_manager.boot_plugins
|
31
|
+
|
32
|
+
# After deploy we want to make sure the license response is being cleared.
|
33
|
+
# We need a fresh license response.
|
34
|
+
# This is disabled in development because the initialization process might be triggered more than once.
|
35
|
+
unless Rails.env.development?
|
36
|
+
begin
|
37
|
+
Licensing::HQ.new.clear_response
|
38
|
+
rescue => exception
|
39
|
+
Avo.logger.info "Failed to clear Avo HQ response: #{exception.message}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Ensure we reboot the app when something changes
|
45
|
+
config.to_prepare do
|
22
46
|
# Boot Avo
|
23
47
|
::Avo::App.boot
|
24
48
|
end
|
25
49
|
|
26
50
|
initializer "avo.autoload" do |app|
|
27
|
-
|
28
|
-
|
51
|
+
# This undoes Rails' previous nested directories behavior in the `app` dir.
|
52
|
+
# More on this: https://github.com/fxn/zeitwerk/issues/250
|
53
|
+
avo_directory = Rails.root.join("app", "avo").to_s
|
54
|
+
ActiveSupport::Dependencies.autoload_paths.delete(avo_directory)
|
29
55
|
|
30
|
-
|
31
|
-
|
32
|
-
|
56
|
+
if Dir.exist?(avo_directory)
|
57
|
+
Rails.autoloaders.main.push_dir(avo_directory, namespace: Avo)
|
58
|
+
app.config.watchable_dirs[avo_directory] = [:rb]
|
33
59
|
end
|
34
60
|
end
|
35
61
|
|
36
62
|
initializer "avo.init_fields" do |app|
|
37
|
-
# Init the fields
|
38
63
|
::Avo::App.init_fields
|
39
64
|
end
|
40
65
|
|
@@ -46,17 +71,16 @@ module Avo
|
|
46
71
|
end
|
47
72
|
end
|
48
73
|
|
49
|
-
initializer "debug_exception_response_format" do |app|
|
50
|
-
app.config.debug_exception_response_format = :api
|
51
|
-
# app.config.logger = ::Logger.new(STDOUT)
|
52
|
-
end
|
53
|
-
|
54
74
|
initializer "avo.test_buddy" do |app|
|
55
75
|
if Avo::IN_DEVELOPMENT
|
56
76
|
Rails.autoloaders.main.push_dir Avo::Engine.root.join("spec", "helpers")
|
57
77
|
end
|
58
78
|
end
|
59
79
|
|
80
|
+
initializer "debug_exception_response_format" do |app|
|
81
|
+
app.config.debug_exception_response_format = :api
|
82
|
+
end
|
83
|
+
|
60
84
|
config.app_middleware.use(
|
61
85
|
Rack::Static,
|
62
86
|
urls: ["/avo-assets"],
|
@@ -71,22 +95,5 @@ module Avo
|
|
71
95
|
Rails::Generators.configure! app.config.generators
|
72
96
|
require_relative "../generators/model_generator"
|
73
97
|
end
|
74
|
-
|
75
|
-
initializer "avo.locales" do |app|
|
76
|
-
I18n.load_path += Dir[Avo::Engine.root.join("lib", "generators", "avo", "templates", "locales", "*.{rb,yml}")]
|
77
|
-
end
|
78
|
-
|
79
|
-
# After deploy we want to make sure the license response is being cleared.
|
80
|
-
# We need a fresh license response.
|
81
|
-
# This is disabled in development because the initialization process might be triggered more than once.
|
82
|
-
config.after_initialize do
|
83
|
-
unless Rails.env.development?
|
84
|
-
begin
|
85
|
-
Licensing::HQ.new.clear_response
|
86
|
-
rescue => exception
|
87
|
-
puts "Failed to clear Avo HQ response: #{exception.message}"
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
98
|
end
|
92
99
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Avo
|
2
|
+
class ErrorManager
|
3
|
+
class << self
|
4
|
+
def build
|
5
|
+
new
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :errors
|
10
|
+
|
11
|
+
alias_method :all, :errors
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@errors = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def add(error)
|
18
|
+
errors << error
|
19
|
+
end
|
20
|
+
|
21
|
+
def has_errors?
|
22
|
+
errors.present?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Avo
|
2
2
|
class ExecutionContext
|
3
|
-
attr_accessor :target, :context, :params, :view_context, :current_user, :request, :include
|
3
|
+
attr_accessor :target, :context, :params, :view_context, :current_user, :request, :include
|
4
4
|
|
5
5
|
def initialize(**args)
|
6
6
|
# Extend the class with custom modules if required.
|
@@ -10,13 +10,6 @@ module Avo
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
# If you want this block to behave like a view you can delegate the missing methods to the view_context
|
14
|
-
#
|
15
|
-
# Ex: Avo::ExecutionContext.new(target: ..., delegate_missing_to: :view_context).handle
|
16
|
-
if args[:delegate_missing_to].present?
|
17
|
-
self.class.send(:delegate_missing_to, args[:delegate_missing_to])
|
18
|
-
end
|
19
|
-
|
20
13
|
# If target doesn't respond to call, we don't need to initialize the others attr_accessors.
|
21
14
|
return unless (@target = args[:target]).respond_to? :call
|
22
15
|
|
@@ -26,15 +19,16 @@ module Avo
|
|
26
19
|
end
|
27
20
|
|
28
21
|
# Set defaults on not initialized accessors
|
29
|
-
@context ||= Avo::
|
30
|
-
@
|
31
|
-
@
|
32
|
-
@
|
33
|
-
@
|
34
|
-
@main_app ||= view_context&.main_app
|
35
|
-
@avo ||= view_context&.avo
|
22
|
+
@context ||= Avo::Current.context
|
23
|
+
@current_user ||= Avo::Current.current_user
|
24
|
+
@params ||= Avo::Current.params
|
25
|
+
@request ||= Avo::Current.request
|
26
|
+
@view_context ||= Avo::Current.view_context
|
36
27
|
end
|
37
28
|
|
29
|
+
delegate :result, to: :card
|
30
|
+
delegate :authorize, to: Avo::Services::AuthorizationService
|
31
|
+
|
38
32
|
# Return target if target is not callable, otherwise, execute target on this instance context
|
39
33
|
def handle
|
40
34
|
target.respond_to?(:call) ? instance_exec(&target) : target
|
@@ -8,7 +8,7 @@ module Avo
|
|
8
8
|
|
9
9
|
hide_on [:edit, :new]
|
10
10
|
|
11
|
-
default_options = {info: :info, success: :success, danger: :danger, warning: :warning
|
11
|
+
default_options = {info: :info, success: :success, danger: :danger, warning: :warning}
|
12
12
|
@options = args[:options].present? ? default_options.merge(args[:options]) : default_options
|
13
13
|
end
|
14
14
|
end
|
@@ -2,21 +2,24 @@ module Avo
|
|
2
2
|
module Fields
|
3
3
|
class BaseField
|
4
4
|
extend ActiveSupport::DescendantsTracker
|
5
|
-
extend Avo::Fields::FieldExtensions::HasFieldName
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
include
|
11
|
-
include Avo::Fields::
|
12
|
-
|
13
|
-
include Avo::Concerns::HasHTMLAttributes
|
14
|
-
include Avo::Fields::Concerns::
|
6
|
+
prepend Avo::Concerns::HasItemType
|
7
|
+
prepend Avo::Concerns::IsResourceItem
|
8
|
+
include Avo::Concerns::IsVisible
|
9
|
+
include Avo::Concerns::VisibleInDifferentViews
|
10
|
+
include Avo::Fields::Concerns::HasFieldName
|
11
|
+
include Avo::Fields::Concerns::HasDefault
|
12
|
+
include Avo::Fields::Concerns::HasHTMLAttributes
|
13
|
+
include Avo::Fields::Concerns::HandlesFieldArgs
|
15
14
|
include Avo::Fields::Concerns::IsReadonly
|
16
15
|
include Avo::Fields::Concerns::IsDisabled
|
17
|
-
include Avo::Fields::Concerns::
|
16
|
+
include Avo::Fields::Concerns::IsRequired
|
17
|
+
|
18
|
+
include ActionView::Helpers::UrlHelper
|
18
19
|
|
19
|
-
delegate :
|
20
|
+
delegate :app, to: ::Avo::Current
|
21
|
+
delegate :view_context, to: :app
|
22
|
+
delegate :context, to: :app
|
20
23
|
delegate :simple_format, :content_tag, to: :view_context
|
21
24
|
delegate :main_app, to: :view_context
|
22
25
|
delegate :avo, to: :view_context
|
@@ -30,35 +33,30 @@ module Avo
|
|
30
33
|
attr_reader :nullable
|
31
34
|
attr_reader :null_values
|
32
35
|
attr_reader :format_using
|
33
|
-
attr_reader :autocomplete
|
34
36
|
attr_reader :help
|
35
37
|
attr_reader :default
|
36
|
-
attr_reader :visible
|
37
38
|
attr_reader :as_label
|
38
39
|
attr_reader :as_avatar
|
39
40
|
attr_reader :as_description
|
40
41
|
attr_reader :index_text_align
|
41
42
|
attr_reader :stacked
|
43
|
+
attr_reader :for_presentation_only
|
42
44
|
|
43
45
|
# Private options
|
46
|
+
attr_reader :updatable
|
44
47
|
attr_reader :computable # if allowed to be computable
|
45
48
|
attr_reader :computed # if block is present
|
46
49
|
attr_reader :computed_value # the value after computation
|
47
50
|
|
48
51
|
# Hydrated payload
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
attr_reader :user
|
54
|
-
attr_reader :panel_name
|
52
|
+
attr_accessor :record
|
53
|
+
attr_accessor :action
|
54
|
+
attr_accessor :user
|
55
|
+
attr_accessor :panel_name
|
55
56
|
|
56
57
|
class_attribute :field_name_attribute
|
57
|
-
class_attribute :item_type, default: :field
|
58
58
|
|
59
59
|
def initialize(id, **args, &block)
|
60
|
-
super(id, **args, &block)
|
61
|
-
|
62
60
|
@id = id
|
63
61
|
@name = args[:name]
|
64
62
|
@translation_key = args[:translation_key]
|
@@ -70,12 +68,10 @@ module Avo
|
|
70
68
|
@nullable = args[:nullable] || false
|
71
69
|
@null_values = args[:null_values] || [nil, ""]
|
72
70
|
@format_using = args[:format_using] || nil
|
73
|
-
@update_using = args[:update_using] || nil
|
74
71
|
@placeholder = args[:placeholder]
|
75
|
-
@autocomplete = args[:autocomplete] || nil
|
76
72
|
@help = args[:help] || nil
|
77
73
|
@default = args[:default] || nil
|
78
|
-
@visible = args[:visible]
|
74
|
+
@visible = args[:visible] || true
|
79
75
|
@as_label = args[:as_label] || false
|
80
76
|
@as_avatar = args[:as_avatar] || false
|
81
77
|
@as_description = args[:as_description] || false
|
@@ -84,42 +80,29 @@ module Avo
|
|
84
80
|
@view = args[:view] || nil
|
85
81
|
@value = args[:value] || nil
|
86
82
|
@stacked = args[:stacked] || nil
|
83
|
+
@for_presentation_only = args[:for_presentation_only] || false
|
87
84
|
@resource = args[:resource]
|
88
85
|
|
89
86
|
@args = args
|
90
87
|
|
88
|
+
@updatable = !readonly
|
91
89
|
@computable = true
|
92
90
|
@computed = block.present?
|
93
91
|
@computed_value = nil
|
94
92
|
|
95
|
-
|
96
|
-
show_on args[:show_on] if args[:show_on].present?
|
97
|
-
hide_on args[:hide_on] if args[:hide_on].present?
|
98
|
-
only_on args[:only_on] if args[:only_on].present?
|
99
|
-
except_on args[:except_on] if args[:except_on].present?
|
93
|
+
post_initialize if respond_to?(:post_initialize)
|
100
94
|
end
|
101
95
|
|
102
|
-
def
|
103
|
-
|
104
|
-
permited_kwargs_keys = %i[model resource action view panel_name user]
|
105
|
-
|
106
|
-
# Check for unrecognized keys
|
107
|
-
unrecognized_keys = kwargs.keys - permited_kwargs_keys
|
108
|
-
raise ArgumentError, "Unrecognized argument(s): #{unrecognized_keys.join(', ')}" if unrecognized_keys.any?
|
109
|
-
|
110
|
-
# Set instance variables with provided values
|
111
|
-
kwargs.each do |key, value|
|
112
|
-
instance_variable_set("@#{key}", value)
|
113
|
-
end
|
114
|
-
|
115
|
-
# Return self for method chaining, if desired
|
116
|
-
self
|
96
|
+
def translation_key
|
97
|
+
@translation_key || "avo.field_translations.#{@id}"
|
117
98
|
end
|
118
99
|
|
119
|
-
def
|
120
|
-
|
100
|
+
def translated_name(default:)
|
101
|
+
t(translation_key, count: 1, default: default).capitalize
|
102
|
+
end
|
121
103
|
|
122
|
-
|
104
|
+
def translated_plural_name(default:)
|
105
|
+
t(translation_key, count: 2, default: default).capitalize
|
123
106
|
end
|
124
107
|
|
125
108
|
# Getting the name of the resource (user/users, post/posts)
|
@@ -129,8 +112,8 @@ module Avo
|
|
129
112
|
def name
|
130
113
|
return @name if custom_name?
|
131
114
|
|
132
|
-
if translation_key
|
133
|
-
|
115
|
+
if translation_key
|
116
|
+
translated_name default: default_name
|
134
117
|
else
|
135
118
|
default_name
|
136
119
|
end
|
@@ -139,15 +122,19 @@ module Avo
|
|
139
122
|
def plural_name
|
140
123
|
default = name.pluralize
|
141
124
|
|
142
|
-
if translation_key
|
143
|
-
|
125
|
+
if translation_key
|
126
|
+
translated_plural_name default: default
|
144
127
|
else
|
145
128
|
default
|
146
129
|
end
|
147
130
|
end
|
148
131
|
|
132
|
+
def table_header_label
|
133
|
+
name
|
134
|
+
end
|
135
|
+
|
149
136
|
def custom_name?
|
150
|
-
|
137
|
+
!@name.nil?
|
151
138
|
end
|
152
139
|
|
153
140
|
def default_name
|
@@ -155,21 +142,7 @@ module Avo
|
|
155
142
|
end
|
156
143
|
|
157
144
|
def placeholder
|
158
|
-
|
159
|
-
return Avo::Hosts::ResourceViewRecordHost.new(block: @placeholder, record: @model, resource: @resource, view: @view).handle
|
160
|
-
end
|
161
|
-
|
162
|
-
@placeholder || name
|
163
|
-
end
|
164
|
-
|
165
|
-
def visible?
|
166
|
-
return true if visible.nil?
|
167
|
-
|
168
|
-
if visible.respond_to?(:call)
|
169
|
-
visible.call resource: @resource
|
170
|
-
else
|
171
|
-
visible
|
172
|
-
end
|
145
|
+
Avo::ExecutionContext.new(target: @placeholder || name, record: record, resource: @resource, view: @view).handle
|
173
146
|
end
|
174
147
|
|
175
148
|
def value(property = nil)
|
@@ -177,8 +150,8 @@ module Avo
|
|
177
150
|
|
178
151
|
property ||= id
|
179
152
|
|
180
|
-
# Get
|
181
|
-
final_value =
|
153
|
+
# Get record value
|
154
|
+
final_value = record.send(property) if is_model?(record) && record.respond_to?(property)
|
182
155
|
|
183
156
|
# On new views and actions modals we need to prefill the fields with the default value
|
184
157
|
if should_fill_with_default_value? && default.present?
|
@@ -187,50 +160,21 @@ module Avo
|
|
187
160
|
|
188
161
|
# Run computable callback block if present
|
189
162
|
if computable && block.present?
|
190
|
-
final_value = instance_exec(
|
163
|
+
final_value = instance_exec(record, @resource, @view, self, &block)
|
191
164
|
end
|
192
165
|
|
193
|
-
if
|
194
|
-
|
195
|
-
Avo::ExecutionContext.new(
|
196
|
-
target: @format_using,
|
197
|
-
model: model,
|
198
|
-
key: property,
|
199
|
-
value: final_value,
|
200
|
-
resource: resource,
|
201
|
-
view: view,
|
202
|
-
field: self,
|
203
|
-
delegate_missing_to: :view_context,
|
204
|
-
include: self.class.included_modules
|
205
|
-
).handle
|
206
|
-
else
|
207
|
-
final_value
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
# Fills the model with the received value on create and update actions.
|
212
|
-
def fill_field(model, key, value, params)
|
213
|
-
return model unless model.methods.include? key.to_sym
|
166
|
+
# Run the value through resolver if present
|
167
|
+
final_value = instance_exec(final_value, &@format_using) if @format_using.present?
|
214
168
|
|
215
|
-
|
216
|
-
|
217
|
-
end
|
169
|
+
final_value
|
170
|
+
end
|
218
171
|
|
219
|
-
|
172
|
+
def fill_field(record, key, value, params)
|
173
|
+
return record unless record.methods.include? key.to_sym
|
220
174
|
|
221
|
-
|
222
|
-
end
|
175
|
+
record.send("#{key}=", value)
|
223
176
|
|
224
|
-
|
225
|
-
Avo::ExecutionContext.new(
|
226
|
-
target: @update_using,
|
227
|
-
model: model,
|
228
|
-
key: key,
|
229
|
-
value: value,
|
230
|
-
resource: resource,
|
231
|
-
field: self,
|
232
|
-
include: self.class.included_modules
|
233
|
-
).handle
|
177
|
+
record
|
234
178
|
end
|
235
179
|
|
236
180
|
# Try to see if the field has a different database ID than it's name
|
@@ -256,21 +200,31 @@ module Avo
|
|
256
200
|
"#{type.camelize}Field"
|
257
201
|
end
|
258
202
|
|
203
|
+
# For custom components the namespace will be different than Avo::Fields so we should take that into account.
|
204
|
+
def view_component_namespace
|
205
|
+
"#{self.class.to_s.deconstantize}::#{view_component_name}"
|
206
|
+
end
|
207
|
+
|
259
208
|
# Try and build the component class or fallback to a blank one
|
260
209
|
def component_for_view(view = :index)
|
261
210
|
# Use the edit variant for all "update" views
|
262
211
|
view = :edit if view.in? [:new, :create, :update]
|
263
212
|
|
264
|
-
component_class = "
|
213
|
+
component_class = "#{view_component_namespace}::#{view.to_s.camelize}Component"
|
265
214
|
component_class.constantize
|
266
215
|
rescue
|
216
|
+
unless Rails.env.test?
|
217
|
+
Avo.logger.info "Failed to find component for the `#{self.class}` field on the `#{view}` view."
|
218
|
+
end
|
267
219
|
# When returning nil, a race condition happens and throws an error in some environments.
|
268
220
|
# See https://github.com/avo-hq/avo/pull/365
|
269
221
|
::Avo::BlankFieldComponent
|
270
222
|
end
|
271
223
|
|
272
|
-
def
|
273
|
-
|
224
|
+
def record_errors
|
225
|
+
return {} if record.nil?
|
226
|
+
|
227
|
+
record.errors
|
274
228
|
end
|
275
229
|
|
276
230
|
def type
|
@@ -291,23 +245,18 @@ module Avo
|
|
291
245
|
!visible_in_reflection?
|
292
246
|
end
|
293
247
|
|
294
|
-
def
|
295
|
-
|
296
|
-
end
|
297
|
-
|
298
|
-
# Used by Avo to fill the record with the default value on :new and :edit views
|
299
|
-
def assign_value(record:, value:)
|
300
|
-
id = type == "belongs_to" ? foreign_key : database_id
|
301
|
-
|
302
|
-
if record.send(id).nil?
|
303
|
-
record.send("#{id}=", value)
|
304
|
-
end
|
248
|
+
def options_for_filter
|
249
|
+
options
|
305
250
|
end
|
306
251
|
|
307
252
|
private
|
308
253
|
|
309
254
|
def model_or_class(model)
|
310
|
-
model.instance_of?(String)
|
255
|
+
if model.instance_of?(String)
|
256
|
+
"class"
|
257
|
+
else
|
258
|
+
"model"
|
259
|
+
end
|
311
260
|
end
|
312
261
|
|
313
262
|
def is_model?(model)
|
@@ -57,6 +57,7 @@ module Avo
|
|
57
57
|
# - is_disabled?
|
58
58
|
|
59
59
|
class BelongsToField < BaseField
|
60
|
+
include Avo::Fields::Concerns::IsSearchable
|
60
61
|
include Avo::Fields::Concerns::UseResource
|
61
62
|
|
62
63
|
attr_accessor :target
|
@@ -84,10 +85,6 @@ module Avo
|
|
84
85
|
@use_resource = args[:use_resource] || nil
|
85
86
|
end
|
86
87
|
|
87
|
-
def searchable
|
88
|
-
@searchable && ::Avo::App.license.has_with_trial(:searchable_associations)
|
89
|
-
end
|
90
|
-
|
91
88
|
def value
|
92
89
|
if is_polymorphic?
|
93
90
|
# Get the value from the pre-filled assoociation record
|
@@ -118,12 +115,12 @@ module Avo
|
|
118
115
|
|
119
116
|
def values_for_type(model = nil)
|
120
117
|
resource = target_resource
|
121
|
-
resource = App.
|
118
|
+
resource = Avo::App.resources.get_resource_by_model_class model if model.present?
|
122
119
|
|
123
120
|
query = resource.class.query_scope
|
124
121
|
|
125
122
|
if attach_scope.present?
|
126
|
-
query = Avo::
|
123
|
+
query = Avo::ExecutionContext.new(target: attach_scope, query: query, parent: get_model).handle
|
127
124
|
end
|
128
125
|
|
129
126
|
query.all.map do |model|
|
@@ -160,8 +157,8 @@ module Avo
|
|
160
157
|
def foreign_key
|
161
158
|
return polymorphic_as if polymorphic_as.present?
|
162
159
|
|
163
|
-
if @
|
164
|
-
get_model_class(@
|
160
|
+
if @record.present?
|
161
|
+
get_model_class(@record).reflections[@relation_method].foreign_key
|
165
162
|
elsif @resource.present? && @resource.model_class.reflections[@relation_method].present?
|
166
163
|
@resource.model_class.reflections[@relation_method].foreign_key
|
167
164
|
end
|
@@ -200,12 +197,10 @@ module Avo
|
|
200
197
|
return model unless model.methods.include? key.to_sym
|
201
198
|
|
202
199
|
if polymorphic_as.present?
|
203
|
-
|
204
|
-
|
205
|
-
model.send("#{polymorphic_as}_type=", valid_model_class)
|
200
|
+
model.send("#{polymorphic_as}_type=", params["#{polymorphic_as}_type"])
|
206
201
|
|
207
202
|
# If the type is blank, reset the id too.
|
208
|
-
if
|
203
|
+
if params["#{polymorphic_as}_type"].blank?
|
209
204
|
model.send("#{polymorphic_as}_id=", nil)
|
210
205
|
else
|
211
206
|
model.send("#{polymorphic_as}_id=", params["#{polymorphic_as}_id"])
|
@@ -217,12 +212,6 @@ module Avo
|
|
217
212
|
model
|
218
213
|
end
|
219
214
|
|
220
|
-
def valid_polymorphic_class(possible_class)
|
221
|
-
types.find do |type|
|
222
|
-
type.to_s == possible_class.to_s
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
215
|
def database_id
|
227
216
|
# If the field is a polymorphic value, return the polymorphic_type as key and pre-fill the _id in fill_field.
|
228
217
|
return "#{polymorphic_as}_type" if polymorphic_as.present?
|
@@ -237,7 +226,7 @@ module Avo
|
|
237
226
|
|
238
227
|
if is_polymorphic?
|
239
228
|
if value.present?
|
240
|
-
return App.
|
229
|
+
return Avo::App.resources.get_resource_by_model_class(value.class)
|
241
230
|
else
|
242
231
|
return nil
|
243
232
|
end
|
@@ -245,19 +234,19 @@ module Avo
|
|
245
234
|
|
246
235
|
reflection_key = polymorphic_as || id
|
247
236
|
|
248
|
-
if @
|
249
|
-
App.
|
250
|
-
elsif @
|
251
|
-
App.
|
237
|
+
if @record._reflections[reflection_key.to_s].klass.present?
|
238
|
+
Avo::App.resources.get_resource_by_model_class @record._reflections[reflection_key.to_s].klass.to_s
|
239
|
+
elsif @record._reflections[reflection_key.to_s].options[:class_name].present?
|
240
|
+
Avo::App.resources.get_resource_by_model_class @record._reflections[reflection_key.to_s].options[:class_name]
|
252
241
|
else
|
253
242
|
App.get_resource_by_name reflection_key.to_s
|
254
243
|
end
|
255
244
|
end
|
256
245
|
|
257
246
|
def get_model
|
258
|
-
return @
|
247
|
+
return @record if @record.present?
|
259
248
|
|
260
|
-
@resource.
|
249
|
+
@resource.record
|
261
250
|
rescue
|
262
251
|
nil
|
263
252
|
end
|