avo 2.48.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/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 +7 -7
- 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 +1 -5
- 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 +97 -139
- 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
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
class Avo::ActionsComponent < ViewComponent::Base
|
4
4
|
include Avo::ApplicationHelper
|
5
|
-
attr_reader :label
|
5
|
+
attr_reader :label, :size, :as_row_control
|
6
6
|
|
7
|
-
def initialize(actions: [], resource: nil, view: nil, exclude: [], include: [], style: :outline, color: :primary, label: nil)
|
7
|
+
def initialize(actions: [], resource: nil, view: nil, exclude: [], include: [], style: :outline, color: :primary, label: nil, size: :md, as_row_control: false)
|
8
8
|
@actions = actions || []
|
9
9
|
@resource = resource
|
10
10
|
@view = view
|
@@ -13,6 +13,8 @@ class Avo::ActionsComponent < ViewComponent::Base
|
|
13
13
|
@color = color
|
14
14
|
@style = style
|
15
15
|
@label = label || I18n.t("avo.actions")
|
16
|
+
@size = size
|
17
|
+
@as_row_control = as_row_control
|
16
18
|
end
|
17
19
|
|
18
20
|
def render?
|
@@ -30,20 +32,21 @@ class Avo::ActionsComponent < ViewComponent::Base
|
|
30
32
|
end
|
31
33
|
|
32
34
|
# When running an action for one record we should do it on a special path.
|
33
|
-
# We do that so we get the `
|
34
|
-
def action_path(
|
35
|
-
return
|
35
|
+
# We do that so we get the `record` param inside the action so we can prefill fields.
|
36
|
+
def action_path(action)
|
37
|
+
return single_record_path(action) if as_row_control
|
38
|
+
return many_records_path(action) unless @resource.has_record_id?
|
36
39
|
|
37
40
|
if on_record_page?
|
38
|
-
single_record_path
|
41
|
+
single_record_path action
|
39
42
|
else
|
40
|
-
many_records_path
|
43
|
+
many_records_path action
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
44
47
|
# How should the action be displayed by default
|
45
48
|
def is_disabled?(action)
|
46
|
-
return false if action.standalone
|
49
|
+
return false if action.standalone || as_row_control
|
47
50
|
|
48
51
|
on_index_page?
|
49
52
|
end
|
@@ -58,17 +61,34 @@ class Avo::ActionsComponent < ViewComponent::Base
|
|
58
61
|
!on_record_page?
|
59
62
|
end
|
60
63
|
|
61
|
-
def single_record_path(
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
def single_record_path(action)
|
65
|
+
action_url(action, @resource.record_path)
|
66
|
+
end
|
67
|
+
|
68
|
+
def many_records_path(action)
|
69
|
+
action_url(action, @resource.records_path)
|
66
70
|
end
|
67
71
|
|
68
|
-
def
|
69
|
-
Avo::Services::URIService.parse(
|
72
|
+
def action_url(action, path)
|
73
|
+
Avo::Services::URIService.parse(path)
|
70
74
|
.append_paths("actions")
|
71
|
-
.append_query(
|
72
|
-
|
75
|
+
.append_query(
|
76
|
+
{
|
77
|
+
action_id: action.param_id,
|
78
|
+
arguments: encrypted_arguments(action)
|
79
|
+
}.compact
|
80
|
+
).to_s
|
81
|
+
end
|
82
|
+
|
83
|
+
# Encrypt the arguments so we can pass them as a query param.
|
84
|
+
# EncryptionService can generate special characters that can break the URL.
|
85
|
+
# We use Base64 to encode the encrypted string so we can safely pass it as a query param and don't break the URL.
|
86
|
+
def encrypted_arguments(action)
|
87
|
+
return if action.arguments.blank?
|
88
|
+
|
89
|
+
Base64.encode64 Avo::Services::EncryptionService.encrypt(
|
90
|
+
message: action.arguments,
|
91
|
+
purpose: :action_arguments
|
92
|
+
)
|
73
93
|
end
|
74
94
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Avo::AssetManager::JavascriptComponent < ViewComponent::Base
|
4
|
+
attr_reader :asset_manager
|
5
|
+
|
6
|
+
def initialize(asset_manager:)
|
7
|
+
@asset_manager = asset_manager
|
8
|
+
end
|
9
|
+
|
10
|
+
def javascripts
|
11
|
+
asset_manager.javascripts
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Avo::AssetManager::StylesheetComponent < ViewComponent::Base
|
4
|
+
attr_reader :asset_manager
|
5
|
+
|
6
|
+
def initialize(asset_manager:)
|
7
|
+
@asset_manager = asset_manager
|
8
|
+
end
|
9
|
+
|
10
|
+
def stylesheets
|
11
|
+
asset_manager.stylesheets
|
12
|
+
end
|
13
|
+
end
|
@@ -4,7 +4,7 @@ class Avo::BaseComponent < ViewComponent::Base
|
|
4
4
|
include Turbo::FramesHelper
|
5
5
|
|
6
6
|
def has_with_trial(ability)
|
7
|
-
|
7
|
+
Avo.license.has_with_trial(ability)
|
8
8
|
end
|
9
9
|
|
10
10
|
private
|
@@ -16,39 +16,42 @@ class Avo::BaseComponent < ViewComponent::Base
|
|
16
16
|
nil
|
17
17
|
end
|
18
18
|
|
19
|
-
# Fetch the resource and hydrate it with the
|
19
|
+
# Fetch the resource and hydrate it with the record
|
20
20
|
def association_resource
|
21
|
-
resource =
|
22
|
-
model_class_name = params[:via_relation_class] || resource.model_class
|
21
|
+
resource = Avo.resource_manager.get_resource(params[:via_resource_class])
|
23
22
|
|
24
|
-
|
23
|
+
model_class = if params[:via_relation_class].present?
|
24
|
+
::Avo::BaseResource.get_model_by_name params[:via_relation_class]
|
25
|
+
else
|
26
|
+
resource.model_class
|
27
|
+
end
|
25
28
|
|
26
|
-
resource =
|
29
|
+
resource = Avo.resource_manager.get_resource_by_model_class model_class if resource.blank?
|
27
30
|
|
28
|
-
|
31
|
+
record = resource.find_record params[:via_record_id], query: model_class, params: params
|
29
32
|
|
30
|
-
resource.
|
33
|
+
resource.new record: record
|
31
34
|
end
|
32
35
|
|
33
36
|
# Get the resource for the resource using the klass attribute so we get the namespace too
|
34
37
|
def reflection_resource
|
35
|
-
|
38
|
+
Avo.resource_manager.get_resource_by_model_class(@reflection.klass.to_s)
|
36
39
|
rescue
|
37
40
|
nil
|
38
41
|
end
|
39
42
|
|
40
43
|
# Get the resource for the resource using the klass attribute so we get the namespace too
|
41
44
|
def reflection_parent_resource
|
42
|
-
|
45
|
+
Avo.resource_manager.get_resource_by_model_class(@reflection.active_record.to_s)
|
43
46
|
rescue
|
44
47
|
nil
|
45
48
|
end
|
46
49
|
|
47
50
|
def parent_or_child_resource
|
48
51
|
return @resource unless link_to_child_resource_is_enabled?
|
49
|
-
return @resource if @resource.
|
52
|
+
return @resource if @resource.record.class.base_class == @resource.record.class
|
50
53
|
|
51
|
-
|
54
|
+
Avo.resource_manager.get_resource_by_model_class(@resource.record.class) || @resource
|
52
55
|
end
|
53
56
|
|
54
57
|
def link_to_child_resource_is_enabled?
|
@@ -40,7 +40,10 @@ class Avo::ButtonComponent < ViewComponent::Base
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def button_classes
|
43
|
-
classes = "button-component inline-flex flex-grow-0 items-center font-semibold leading-6 fill-current whitespace-nowrap transition duration-100 transform transition duration-100 cursor-pointer disabled:cursor-not-allowed disabled:opacity-70
|
43
|
+
classes = "button-component inline-flex flex-grow-0 items-center font-semibold leading-6 fill-current whitespace-nowrap transition duration-100 transform transition duration-100 cursor-pointer disabled:cursor-not-allowed disabled:opacity-70 justify-center #{@class}"
|
44
|
+
|
45
|
+
# For non-icon-styled buttons we should not add borders.
|
46
|
+
classes += " border active:outline active:outline-1" unless is_icon?
|
44
47
|
|
45
48
|
classes += " rounded" if @rounded.present?
|
46
49
|
classes += style_classes
|
@@ -55,18 +58,26 @@ class Avo::ButtonComponent < ViewComponent::Base
|
|
55
58
|
@is_link
|
56
59
|
end
|
57
60
|
|
61
|
+
def is_icon?
|
62
|
+
@style == :icon
|
63
|
+
end
|
64
|
+
|
65
|
+
def is_not_icon?
|
66
|
+
!is_icon?
|
67
|
+
end
|
68
|
+
|
58
69
|
def full_content
|
59
70
|
result = ""
|
60
71
|
icon_classes = @icon_class
|
61
72
|
# space out the icon from the text if text is present
|
62
|
-
icon_classes += " mr-1" if content.present?
|
73
|
+
icon_classes += " mr-1" if content.present? && is_not_icon?
|
63
74
|
# add the icon height
|
64
75
|
icon_classes += icon_size_classes
|
65
76
|
|
66
77
|
# Add the icon
|
67
78
|
result += helpers.svg(@icon, class: icon_classes) if @icon.present?
|
68
79
|
|
69
|
-
if content.present?
|
80
|
+
if is_not_icon? && content.present?
|
70
81
|
result += "<span>#{content}</span>"
|
71
82
|
end
|
72
83
|
|
@@ -102,6 +113,8 @@ class Avo::ButtonComponent < ViewComponent::Base
|
|
102
113
|
private
|
103
114
|
|
104
115
|
def vertical_padding_classes
|
116
|
+
return " py-0" if is_icon?
|
117
|
+
|
105
118
|
case @size.to_sym
|
106
119
|
when :xs
|
107
120
|
" py-0"
|
@@ -119,6 +132,7 @@ class Avo::ButtonComponent < ViewComponent::Base
|
|
119
132
|
end
|
120
133
|
|
121
134
|
def horizontal_padding_classes
|
135
|
+
return " px-0" if is_icon?
|
122
136
|
return " px-1" if @compact
|
123
137
|
|
124
138
|
case @size.to_sym
|
@@ -154,6 +168,8 @@ class Avo::ButtonComponent < ViewComponent::Base
|
|
154
168
|
" bg-white text-#{@color}-500 border-#{@color}-500 hover:bg-#{@color}-100 active:bg-#{@color}-100 active:border-#{@color}-500 active:outline-#{@color}-500"
|
155
169
|
when :text
|
156
170
|
" text-#{@color}-500 active:outline-#{@color}-500 hover:bg-gray-100 border-transparent"
|
171
|
+
when :icon
|
172
|
+
" text-#{@color}-600"
|
157
173
|
else
|
158
174
|
""
|
159
175
|
end
|
@@ -161,6 +177,7 @@ class Avo::ButtonComponent < ViewComponent::Base
|
|
161
177
|
|
162
178
|
def icon_size_classes
|
163
179
|
icon_classes = ""
|
180
|
+
return icon_classes if is_icon?
|
164
181
|
|
165
182
|
case @size
|
166
183
|
when :xs
|
@@ -2,7 +2,7 @@
|
|
2
2
|
class: classes,
|
3
3
|
style: style,
|
4
4
|
data: data do %>
|
5
|
-
<div class="h-full <% if stacked? %> md:pt-4 <% else %> md:pt-0 md:h-14 <% end %> pt-4 flex self-start items-center flex-shrink-0 <%= @field.get_html(:classes, view: view, element: :label) %> w-48 <% if compact? %> md:w-48 xl:w-64 <% else %> md:w-64 <% end %> px-6 uppercase font-semibold text-gray-500 text-sm" data-slot="label">
|
5
|
+
<div class="h-full <% if stacked? %> md:pt-4 <% else %> md:pt-0 <% if short? %> md:h-10 <% else %> md:h-14 <% end %> <% end %> pt-4 flex self-start items-center flex-shrink-0 <%= @field.get_html(:classes, view: view, element: :label) %> w-48 <% if compact? %> md:w-48 xl:w-64 <% else %> md:w-64 <% end %> px-6 uppercase font-semibold text-gray-500 text-sm" data-slot="label">
|
6
6
|
<% if form.present? %>
|
7
7
|
<%= form.label field.id, label %>
|
8
8
|
<% else %>
|
@@ -19,6 +19,7 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
|
|
19
19
|
full_width: false,
|
20
20
|
label: nil, # do we really need it?
|
21
21
|
resource: nil,
|
22
|
+
short: false,
|
22
23
|
stacked: nil,
|
23
24
|
style: "",
|
24
25
|
view: :show,
|
@@ -35,7 +36,7 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
|
|
35
36
|
@full_width = full_width
|
36
37
|
@label = label
|
37
38
|
@resource = resource
|
38
|
-
@
|
39
|
+
@short = short
|
39
40
|
@stacked = stacked
|
40
41
|
@style = style
|
41
42
|
@view = view
|
@@ -62,17 +63,11 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
|
|
62
63
|
end
|
63
64
|
|
64
65
|
def help
|
65
|
-
|
66
|
-
|
67
|
-
if help_value.respond_to?(:call)
|
68
|
-
return Avo::Hosts::ResourceViewRecordHost.new(block: help_value, record: record, resource: resource, view: view).handle
|
69
|
-
end
|
70
|
-
|
71
|
-
help_value
|
66
|
+
Avo::ExecutionContext.new(target: @help || @field.help, record: record, resource: resource, view: view).handle
|
72
67
|
end
|
73
68
|
|
74
69
|
def record
|
75
|
-
resource.present? ? resource.
|
70
|
+
resource.present? ? resource.record : nil
|
76
71
|
end
|
77
72
|
|
78
73
|
def data
|
@@ -82,19 +77,17 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
|
|
82
77
|
**@data
|
83
78
|
}
|
84
79
|
|
85
|
-
# Fetch the data attributes off the html option
|
86
|
-
wrapper_data_attributes = @field.get_html :data, view: view, element: :wrapper
|
87
|
-
if wrapper_data_attributes.present?
|
88
|
-
attributes.merge! wrapper_data_attributes
|
89
|
-
end
|
90
|
-
|
91
80
|
# Add the built-in stimulus integration data tags.
|
92
81
|
if @resource.present?
|
93
|
-
|
82
|
+
@resource.get_stimulus_controllers.split(" ").each do |controller|
|
83
|
+
attributes["#{controller}-target"] = "#{@field.id.to_s.underscore}_#{@field.type.to_s.underscore}_wrapper".camelize(:lower)
|
84
|
+
end
|
94
85
|
end
|
95
86
|
|
96
|
-
|
97
|
-
|
87
|
+
# Fetch the data attributes off the html option
|
88
|
+
wrapper_data_attributes = @field.get_html :data, view: view, element: :wrapper
|
89
|
+
if wrapper_data_attributes.present?
|
90
|
+
attributes.merge! wrapper_data_attributes
|
98
91
|
end
|
99
92
|
|
100
93
|
attributes
|
@@ -115,15 +108,11 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
|
|
115
108
|
@compact
|
116
109
|
end
|
117
110
|
|
118
|
-
def
|
119
|
-
@
|
111
|
+
def short?
|
112
|
+
@short
|
120
113
|
end
|
121
114
|
|
122
|
-
|
123
|
-
|
124
|
-
def add_stimulus_attributes_for(entity, attributes)
|
125
|
-
entity.get_stimulus_controllers.split(" ").each do |controller|
|
126
|
-
attributes["#{controller}-target"] = "#{@field.id.to_s.underscore}_#{@field.type.to_s.underscore}_wrapper".camelize(:lower)
|
127
|
-
end
|
115
|
+
def full_width?
|
116
|
+
@full_width
|
128
117
|
end
|
129
118
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= field_wrapper **field_wrapper_args do %>
|
2
|
-
<%= @form.text_field
|
2
|
+
<%= @form.text_field field.id,
|
3
3
|
value: field.value.to_s,
|
4
4
|
class: classes("w-full"),
|
5
|
-
placeholder:
|
5
|
+
placeholder: field.placeholder,
|
6
6
|
disabled: disabled? %>
|
7
7
|
<% end %>
|
@@ -1,137 +1,115 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
%>
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
1
|
+
<% if is_polymorphic? %>
|
2
|
+
<%
|
3
|
+
# Set the model keys so we can pass them over
|
4
|
+
model_keys = @field.types.map do |type|
|
5
|
+
resource = Avo.resource_manager.get_resource_by_model_class(type.to_s)
|
6
|
+
[type.to_s, resource.model_key]
|
7
|
+
end.to_h
|
8
|
+
%>
|
9
|
+
<div class="divide-y"
|
10
|
+
data-controller="belongs-to-field"
|
11
|
+
data-searchable="<%= @field.is_searchable? %>"
|
12
|
+
data-association="<%= @field.id %>"
|
13
|
+
data-association-class="<%= @field&.target_resource&.model_class || nil %>"
|
14
|
+
>
|
15
|
+
<%= field_wrapper **field_wrapper_args, help: @field.polymorphic_help || '' do %>
|
16
|
+
<%= @form.select @field.type_input_foreign_key, @field.types.map { |type| [Avo.resource_manager.get_resource_by_model_class(type.to_s).name, type.to_s] },
|
17
|
+
{
|
18
|
+
value: @field.value,
|
19
|
+
include_blank: @field.placeholder,
|
20
|
+
},
|
21
|
+
{
|
22
|
+
class: classes("w-full"),
|
23
|
+
data: {
|
24
|
+
**@field.get_html(:data, view: view, element: :input),
|
25
|
+
action: "change->belongs-to-field#changeType #{field_html_action}",
|
26
|
+
'belongs-to-field-target': "select",
|
27
27
|
},
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
}
|
37
|
-
%>
|
38
|
-
<%
|
39
|
-
# If the select field is disabled, no value will be sent. It's how HTML works.
|
40
|
-
# Thus the extra hidden field to actually send the related id to the server.
|
41
|
-
if disabled %>
|
42
|
-
<%= @form.hidden_field @field.type_input_foreign_key %>
|
43
|
-
<% end %>
|
44
|
-
<% end %>
|
45
|
-
<% @field.types.each do |type| %>
|
46
|
-
<div class="hidden"
|
47
|
-
data-belongs-to-field-target="type"
|
48
|
-
data-type="<%= type %>"
|
49
|
-
>
|
50
|
-
<%= field_wrapper **field_wrapper_args, label: ::Avo::App.get_resource_by_model_name(type.to_s).name do %>
|
51
|
-
<div class="flex flex-col gap-1">
|
52
|
-
<% if @field.searchable %>
|
53
|
-
<%= render Avo::Fields::BelongsToField::AutocompleteComponent.new form: @form,
|
54
|
-
disabled: disabled,
|
55
|
-
field: @field,
|
56
|
-
foreign_key: @field.id_input_foreign_key,
|
57
|
-
model_key: model_keys[type.to_s],
|
58
|
-
polymorphic_record: polymorphic_record,
|
59
|
-
resource: @resource,
|
60
|
-
style: @field.get_html(:style, view: view, element: :input),
|
61
|
-
type: type,
|
62
|
-
classes: classes("w-full"),
|
63
|
-
view: view
|
64
|
-
%>
|
65
|
-
<% else %>
|
66
|
-
<%= @form.select @field.id_input_foreign_key,
|
67
|
-
options_for_select(@field.values_for_type(type), @resource.present? && @resource.model.present? ? @resource.model[@field.id_input_foreign_key] : nil),
|
68
|
-
{
|
69
|
-
value: @resource.model[@field.id_input_foreign_key].to_s,
|
70
|
-
include_blank: @field.placeholder,
|
71
|
-
},
|
72
|
-
{
|
73
|
-
class: classes("w-full"),
|
74
|
-
data: @field.get_html(:data, view: view, element: :input),
|
75
|
-
disabled: disabled
|
76
|
-
}
|
77
|
-
%>
|
78
|
-
<%
|
79
|
-
# If the select field is disabled, no value will be sent. It's how HTML works.
|
80
|
-
# Thus the extra hidden field to actually send the related id to the server.
|
81
|
-
if disabled %>
|
82
|
-
<%= @form.hidden_field @field.id_input_foreign_key %>
|
83
|
-
<% end %>
|
84
|
-
<% end %>
|
85
|
-
<% create_href = create_path(::Avo::App.get_resource_by_model_name(type.to_s)) %>
|
86
|
-
<% if !disabled && create_href.present? %>
|
87
|
-
<%= link_to t("avo.create_new_item", item: type.to_s.downcase),
|
88
|
-
create_href,
|
89
|
-
class: "text-sm"
|
90
|
-
%>
|
91
|
-
<% end %>
|
92
|
-
</div>
|
93
|
-
<% end %>
|
94
|
-
</div>
|
28
|
+
disabled: disabled
|
29
|
+
}
|
30
|
+
%>
|
31
|
+
<%
|
32
|
+
# If the select field is disabled, no value will be sent. It's how HTML works.
|
33
|
+
# Thus the extra hidden field to actually send the related id to the server.
|
34
|
+
if disabled %>
|
35
|
+
<%= @form.hidden_field @field.type_input_foreign_key %>
|
95
36
|
<% end %>
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
37
|
+
<% end %>
|
38
|
+
<% @field.types.each do |type| %>
|
39
|
+
<div class="hidden"
|
40
|
+
data-belongs-to-field-target="type"
|
41
|
+
data-type="<%= type %>"
|
42
|
+
>
|
43
|
+
<%= field_wrapper **field_wrapper_args, label: Avo.resource_manager.get_resource_by_model_class(type.to_s).name do %>
|
44
|
+
<% if @field.is_searchable? %>
|
45
|
+
<%= render Avo::Pro::SearchableAssociations::AutocompleteComponent.new form: @form,
|
46
|
+
disabled: disabled,
|
47
|
+
field: @field,
|
48
|
+
foreign_key: @field.id_input_foreign_key,
|
49
|
+
model_key: model_keys[type.to_s],
|
50
|
+
polymorphic_record: polymorphic_record,
|
51
|
+
resource: @resource,
|
52
|
+
style: @field.get_html(:style, view: view, element: :input),
|
53
|
+
type: type,
|
54
|
+
classes: classes("w-full"),
|
55
|
+
view: view
|
110
56
|
%>
|
111
|
-
|
112
|
-
|
57
|
+
<% else %>
|
58
|
+
<%= @form.select @field.id_input_foreign_key,
|
59
|
+
options_for_select(@field.values_for_type(type), @resource.present? && @resource.record.present? ? @resource.record[@field.id_input_foreign_key] : nil),
|
113
60
|
{
|
61
|
+
value: @resource.record[@field.id_input_foreign_key].to_s,
|
114
62
|
include_blank: @field.placeholder,
|
115
|
-
value: @field.value
|
116
63
|
},
|
117
64
|
{
|
118
65
|
class: classes("w-full"),
|
119
66
|
data: @field.get_html(:data, view: view, element: :input),
|
120
|
-
disabled: disabled
|
121
|
-
style: @field.get_html(:style, view: view, element: :input)
|
67
|
+
disabled: disabled
|
122
68
|
}
|
123
69
|
%>
|
124
|
-
|
70
|
+
<%
|
125
71
|
# If the select field is disabled, no value will be sent. It's how HTML works.
|
126
72
|
# Thus the extra hidden field to actually send the related id to the server.
|
127
73
|
if disabled %>
|
128
|
-
|
74
|
+
<%= @form.hidden_field @field.id_input_foreign_key %>
|
75
|
+
<% end %>
|
129
76
|
<% end %>
|
130
77
|
<% end %>
|
131
|
-
<% if !disabled && create_path.present? %>
|
132
|
-
<%= link_to t("avo.create_new_item", item: @field.name.downcase), create_path, class: "text-sm" %>
|
133
|
-
<% end %>
|
134
78
|
</div>
|
135
79
|
<% end %>
|
80
|
+
</div>
|
81
|
+
<% else %>
|
82
|
+
<%= field_wrapper **field_wrapper_args do %>
|
83
|
+
<% if @field.is_searchable? %>
|
84
|
+
<%= render Avo::Pro::SearchableAssociations::AutocompleteComponent.new form: @form,
|
85
|
+
field: @field,
|
86
|
+
model_key: @field.target_resource&.model_key,
|
87
|
+
foreign_key: @field.id_input_foreign_key,
|
88
|
+
resource: @resource,
|
89
|
+
disabled: disabled,
|
90
|
+
classes: classes("w-full"),
|
91
|
+
view: view,
|
92
|
+
style: @field.get_html(:style, view: view, element: :input)
|
93
|
+
%>
|
94
|
+
<% else %>
|
95
|
+
<%= @form.select @field.id_input_foreign_key, @field.options,
|
96
|
+
{
|
97
|
+
include_blank: @field.placeholder,
|
98
|
+
value: @field.value
|
99
|
+
},
|
100
|
+
{
|
101
|
+
class: classes("w-full"),
|
102
|
+
data: @field.get_html(:data, view: view, element: :input),
|
103
|
+
disabled: disabled,
|
104
|
+
style: @field.get_html(:style, view: view, element: :input)
|
105
|
+
}
|
106
|
+
%>
|
107
|
+
<%
|
108
|
+
# If the select field is disabled, no value will be sent. It's how HTML works.
|
109
|
+
# Thus the extra hidden field to actually send the related id to the server.
|
110
|
+
if disabled %>
|
111
|
+
<%= @form.hidden_field @field.id_input_foreign_key %>
|
112
|
+
<% end %>
|
113
|
+
<% end %>
|
136
114
|
<% end %>
|
137
|
-
|
115
|
+
<% end %>
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Avo::Fields::BelongsToField::EditComponent < Avo::Fields::EditComponent
|
4
|
-
def initialize(
|
5
|
-
super(
|
4
|
+
def initialize(...)
|
5
|
+
super(...)
|
6
6
|
|
7
7
|
@polymorphic_record = nil
|
8
8
|
end
|
@@ -28,16 +28,16 @@ class Avo::Fields::BelongsToField::EditComponent < Avo::Fields::EditComponent
|
|
28
28
|
|
29
29
|
# Get the polymorphic class
|
30
30
|
def polymorphic_class
|
31
|
-
@resource.
|
31
|
+
@resource.record["#{@field.foreign_key}_type"]
|
32
32
|
end
|
33
33
|
|
34
34
|
def polymorphic_resource
|
35
|
-
|
35
|
+
Avo.resource_manager.get_resource_by_model_class(polymorphic_class)
|
36
36
|
end
|
37
37
|
|
38
38
|
# Get the polymorphic id
|
39
39
|
def polymorphic_id
|
40
|
-
@resource.
|
40
|
+
@resource.record["#{@field.foreign_key}_id"]
|
41
41
|
end
|
42
42
|
|
43
43
|
# Get the actual resource
|
@@ -57,20 +57,9 @@ class Avo::Fields::BelongsToField::EditComponent < Avo::Fields::EditComponent
|
|
57
57
|
@field.get_html(:data, view: view, element: :input).fetch(:action, nil)
|
58
58
|
end
|
59
59
|
|
60
|
-
def create_path(target_resource = nil)
|
61
|
-
return nil if @resource.blank?
|
62
|
-
|
63
|
-
helpers.new_resource_path(**{
|
64
|
-
via_relation: @field.id.to_s,
|
65
|
-
resource: target_resource || @field.target_resource,
|
66
|
-
via_resource_id: resource.model.persisted? ? resource.model.to_param : nil,
|
67
|
-
via_belongs_to_resource_class: resource.class.name
|
68
|
-
}.compact)
|
69
|
-
end
|
70
|
-
|
71
60
|
private
|
72
61
|
|
73
62
|
def visit_through_association?
|
74
|
-
@field.target_resource.
|
63
|
+
@field.target_resource.to_s == params[:via_resource_class].to_s
|
75
64
|
end
|
76
65
|
end
|