avo 2.46.0 → 3.0.0.pre2
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 +12 -23
- 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 +12 -11
- 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 -36
- data/lib/avo/base_resource.rb +108 -96
- 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/{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/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 -124
- 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 +4 -68
- 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 +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 +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 +82 -161
- 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_action_stimulus_controllers.rb +0 -15
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- 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/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/configuration.rb
CHANGED
@@ -2,10 +2,8 @@ module Avo
|
|
2
2
|
class Configuration
|
3
3
|
include ResourceConfiguration
|
4
4
|
|
5
|
-
attr_writer :app_name
|
6
|
-
attr_writer :branding
|
7
5
|
attr_writer :root_path
|
8
|
-
|
6
|
+
attr_accessor :app_name
|
9
7
|
attr_accessor :timezone
|
10
8
|
attr_accessor :per_page
|
11
9
|
attr_accessor :per_page_steps
|
@@ -38,13 +36,12 @@ module Avo
|
|
38
36
|
attr_accessor :main_menu
|
39
37
|
attr_accessor :profile_menu
|
40
38
|
attr_accessor :model_resource_mapping
|
41
|
-
attr_accessor :tabs_style
|
42
39
|
attr_accessor :resource_default_view
|
43
40
|
attr_accessor :authorization_client
|
44
41
|
attr_accessor :field_wrapper_layout
|
45
42
|
attr_accessor :sign_out_path_name
|
46
43
|
attr_accessor :resources
|
47
|
-
|
44
|
+
attr_writer :branding
|
48
45
|
|
49
46
|
def initialize
|
50
47
|
@root_path = "/avo"
|
@@ -91,13 +88,10 @@ module Avo
|
|
91
88
|
@main_menu = nil
|
92
89
|
@profile_menu = nil
|
93
90
|
@model_resource_mapping = {}
|
94
|
-
@tabs_style = :tabs
|
95
91
|
@resource_default_view = :show
|
96
92
|
@authorization_client = :pundit
|
97
93
|
@field_wrapper_layout = :inline
|
98
94
|
@resources = nil
|
99
|
-
@prefix_path = nil
|
100
|
-
@cache_store = computed_cache_store
|
101
95
|
end
|
102
96
|
|
103
97
|
def current_user_method(&block)
|
@@ -121,8 +115,8 @@ module Avo
|
|
121
115
|
end
|
122
116
|
|
123
117
|
def namespace
|
124
|
-
if
|
125
|
-
|
118
|
+
if computed_root_path.present?
|
119
|
+
computed_root_path.delete "/"
|
126
120
|
else
|
127
121
|
root_path.delete "/"
|
128
122
|
end
|
@@ -134,6 +128,10 @@ module Avo
|
|
134
128
|
@root_path
|
135
129
|
end
|
136
130
|
|
131
|
+
def computed_root_path
|
132
|
+
Avo.configuration.root_path
|
133
|
+
end
|
134
|
+
|
137
135
|
def feature_enabled?(feature)
|
138
136
|
!@disabled_features.map(&:to_sym).include?(feature.to_sym)
|
139
137
|
end
|
@@ -141,41 +139,6 @@ module Avo
|
|
141
139
|
def branding
|
142
140
|
Avo::Configuration::Branding.new(**@branding || {})
|
143
141
|
end
|
144
|
-
|
145
|
-
def app_name
|
146
|
-
if @app_name.respond_to? :call
|
147
|
-
Avo::Hosts::BaseHost.new(block: @app_name).handle
|
148
|
-
else
|
149
|
-
@app_name
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def cache_store
|
154
|
-
Avo::ExecutionContext.new(
|
155
|
-
target: @cache_store,
|
156
|
-
production_rejected_cache_stores: %w[ActiveSupport::Cache::MemoryStore ActiveSupport::Cache::NullStore]
|
157
|
-
).handle
|
158
|
-
end
|
159
|
-
|
160
|
-
# When not in production or test we'll just use the MemoryStore which is good enough.
|
161
|
-
# When running in production we'll use Rails.cache if it's not ActiveSupport::Cache::MemoryStore or ActiveSupport::Cache::NullStore.
|
162
|
-
# If it's one of rejected cache stores, we'll use the FileStore.
|
163
|
-
# We decided against the MemoryStore in production because it will not be shared between multiple processes (when using Puma).
|
164
|
-
def computed_cache_store
|
165
|
-
-> {
|
166
|
-
if Rails.env.production?
|
167
|
-
if Rails.cache.class.to_s.in?(production_rejected_cache_stores)
|
168
|
-
ActiveSupport::Cache.lookup_store(:file_store, Rails.root.join("tmp", "cache"))
|
169
|
-
else
|
170
|
-
Rails.cache
|
171
|
-
end
|
172
|
-
elsif Rails.env.test?
|
173
|
-
Rails.cache
|
174
|
-
else
|
175
|
-
ActiveSupport::Cache.lookup_store(:memory_store)
|
176
|
-
end
|
177
|
-
}
|
178
|
-
end
|
179
142
|
end
|
180
143
|
|
181
144
|
def self.configuration
|
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,43 +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
|
-
@action = args[:action]
|
89
85
|
|
90
86
|
@args = args
|
91
87
|
|
88
|
+
@updatable = !readonly
|
92
89
|
@computable = true
|
93
90
|
@computed = block.present?
|
94
91
|
@computed_value = nil
|
95
92
|
|
96
|
-
|
97
|
-
show_on args[:show_on] if args[:show_on].present?
|
98
|
-
hide_on args[:hide_on] if args[:hide_on].present?
|
99
|
-
only_on args[:only_on] if args[:only_on].present?
|
100
|
-
except_on args[:except_on] if args[:except_on].present?
|
93
|
+
post_initialize if respond_to?(:post_initialize)
|
101
94
|
end
|
102
95
|
|
103
|
-
def
|
104
|
-
|
105
|
-
permited_kwargs_keys = %i[model resource action view panel_name user]
|
106
|
-
|
107
|
-
# Check for unrecognized keys
|
108
|
-
unrecognized_keys = kwargs.keys - permited_kwargs_keys
|
109
|
-
raise ArgumentError, "Unrecognized argument(s): #{unrecognized_keys.join(', ')}" if unrecognized_keys.any?
|
110
|
-
|
111
|
-
# Set instance variables with provided values
|
112
|
-
kwargs.each do |key, value|
|
113
|
-
instance_variable_set("@#{key}", value)
|
114
|
-
end
|
115
|
-
|
116
|
-
# Return self for method chaining, if desired
|
117
|
-
self
|
96
|
+
def translation_key
|
97
|
+
@translation_key || "avo.field_translations.#{@id}"
|
118
98
|
end
|
119
99
|
|
120
|
-
def
|
121
|
-
|
100
|
+
def translated_name(default:)
|
101
|
+
t(translation_key, count: 1, default: default).capitalize
|
102
|
+
end
|
122
103
|
|
123
|
-
|
104
|
+
def translated_plural_name(default:)
|
105
|
+
t(translation_key, count: 2, default: default).capitalize
|
124
106
|
end
|
125
107
|
|
126
108
|
# Getting the name of the resource (user/users, post/posts)
|
@@ -130,8 +112,8 @@ module Avo
|
|
130
112
|
def name
|
131
113
|
return @name if custom_name?
|
132
114
|
|
133
|
-
if translation_key
|
134
|
-
|
115
|
+
if translation_key
|
116
|
+
translated_name default: default_name
|
135
117
|
else
|
136
118
|
default_name
|
137
119
|
end
|
@@ -140,15 +122,19 @@ module Avo
|
|
140
122
|
def plural_name
|
141
123
|
default = name.pluralize
|
142
124
|
|
143
|
-
if translation_key
|
144
|
-
|
125
|
+
if translation_key
|
126
|
+
translated_plural_name default: default
|
145
127
|
else
|
146
128
|
default
|
147
129
|
end
|
148
130
|
end
|
149
131
|
|
132
|
+
def table_header_label
|
133
|
+
name
|
134
|
+
end
|
135
|
+
|
150
136
|
def custom_name?
|
151
|
-
|
137
|
+
!@name.nil?
|
152
138
|
end
|
153
139
|
|
154
140
|
def default_name
|
@@ -156,21 +142,7 @@ module Avo
|
|
156
142
|
end
|
157
143
|
|
158
144
|
def placeholder
|
159
|
-
|
160
|
-
return Avo::Hosts::ResourceViewRecordHost.new(block: @placeholder, record: @model, resource: @resource, view: @view).handle
|
161
|
-
end
|
162
|
-
|
163
|
-
@placeholder || name
|
164
|
-
end
|
165
|
-
|
166
|
-
def visible?
|
167
|
-
return true if visible.nil?
|
168
|
-
|
169
|
-
if visible.respond_to?(:call)
|
170
|
-
visible.call resource: @resource
|
171
|
-
else
|
172
|
-
visible
|
173
|
-
end
|
145
|
+
Avo::ExecutionContext.new(target: @placeholder || name, record: record, resource: @resource, view: @view).handle
|
174
146
|
end
|
175
147
|
|
176
148
|
def value(property = nil)
|
@@ -178,8 +150,8 @@ module Avo
|
|
178
150
|
|
179
151
|
property ||= id
|
180
152
|
|
181
|
-
# Get
|
182
|
-
final_value =
|
153
|
+
# Get record value
|
154
|
+
final_value = record.send(property) if is_model?(record) && record.respond_to?(property)
|
183
155
|
|
184
156
|
# On new views and actions modals we need to prefill the fields with the default value
|
185
157
|
if should_fill_with_default_value? && default.present?
|
@@ -188,50 +160,21 @@ module Avo
|
|
188
160
|
|
189
161
|
# Run computable callback block if present
|
190
162
|
if computable && block.present?
|
191
|
-
final_value = instance_exec(
|
163
|
+
final_value = instance_exec(record, @resource, @view, self, &block)
|
192
164
|
end
|
193
165
|
|
194
|
-
if
|
195
|
-
|
196
|
-
Avo::ExecutionContext.new(
|
197
|
-
target: @format_using,
|
198
|
-
model: model,
|
199
|
-
key: property,
|
200
|
-
value: final_value,
|
201
|
-
resource: resource,
|
202
|
-
view: view,
|
203
|
-
field: self,
|
204
|
-
delegate_missing_to: :view_context,
|
205
|
-
include: self.class.included_modules
|
206
|
-
).handle
|
207
|
-
else
|
208
|
-
final_value
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
# Fills the model with the received value on create and update actions.
|
213
|
-
def fill_field(model, key, value, params)
|
214
|
-
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?
|
215
168
|
|
216
|
-
|
217
|
-
|
218
|
-
end
|
169
|
+
final_value
|
170
|
+
end
|
219
171
|
|
220
|
-
|
172
|
+
def fill_field(record, key, value, params)
|
173
|
+
return record unless record.methods.include? key.to_sym
|
221
174
|
|
222
|
-
|
223
|
-
end
|
175
|
+
record.send("#{key}=", value)
|
224
176
|
|
225
|
-
|
226
|
-
Avo::ExecutionContext.new(
|
227
|
-
target: @update_using,
|
228
|
-
model: model,
|
229
|
-
key: key,
|
230
|
-
value: value,
|
231
|
-
resource: resource,
|
232
|
-
field: self,
|
233
|
-
include: self.class.included_modules
|
234
|
-
).handle
|
177
|
+
record
|
235
178
|
end
|
236
179
|
|
237
180
|
# Try to see if the field has a different database ID than it's name
|
@@ -257,21 +200,31 @@ module Avo
|
|
257
200
|
"#{type.camelize}Field"
|
258
201
|
end
|
259
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
|
+
|
260
208
|
# Try and build the component class or fallback to a blank one
|
261
209
|
def component_for_view(view = :index)
|
262
210
|
# Use the edit variant for all "update" views
|
263
211
|
view = :edit if view.in? [:new, :create, :update]
|
264
212
|
|
265
|
-
component_class = "
|
213
|
+
component_class = "#{view_component_namespace}::#{view.to_s.camelize}Component"
|
266
214
|
component_class.constantize
|
267
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
|
268
219
|
# When returning nil, a race condition happens and throws an error in some environments.
|
269
220
|
# See https://github.com/avo-hq/avo/pull/365
|
270
221
|
::Avo::BlankFieldComponent
|
271
222
|
end
|
272
223
|
|
273
|
-
def
|
274
|
-
|
224
|
+
def record_errors
|
225
|
+
return {} if record.nil?
|
226
|
+
|
227
|
+
record.errors
|
275
228
|
end
|
276
229
|
|
277
230
|
def type
|
@@ -292,23 +245,18 @@ module Avo
|
|
292
245
|
!visible_in_reflection?
|
293
246
|
end
|
294
247
|
|
295
|
-
def
|
296
|
-
|
297
|
-
end
|
298
|
-
|
299
|
-
# Used by Avo to fill the record with the default value on :new and :edit views
|
300
|
-
def assign_value(record:, value:)
|
301
|
-
id = type == "belongs_to" ? foreign_key : database_id
|
302
|
-
|
303
|
-
if record.send(id).nil?
|
304
|
-
record.send("#{id}=", value)
|
305
|
-
end
|
248
|
+
def options_for_filter
|
249
|
+
options
|
306
250
|
end
|
307
251
|
|
308
252
|
private
|
309
253
|
|
310
254
|
def model_or_class(model)
|
311
|
-
model.instance_of?(String)
|
255
|
+
if model.instance_of?(String)
|
256
|
+
"class"
|
257
|
+
else
|
258
|
+
"model"
|
259
|
+
end
|
312
260
|
end
|
313
261
|
|
314
262
|
def is_model?(model)
|