avo 2.49.0 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of avo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +26 -25
- data/Gemfile.lock +179 -147
- data/README.md +1 -1
- data/app/assets/stylesheets/avo.base.css +0 -1
- data/app/assets/svgs/font.svg +1 -0
- data/app/assets/svgs/triangle-up.svg +1 -0
- data/app/components/avo/actions_component.html.erb +19 -5
- data/app/components/avo/actions_component.rb +37 -17
- data/app/components/avo/asset_manager/javascript_component.html.erb +3 -0
- data/app/components/avo/asset_manager/javascript_component.rb +13 -0
- data/app/components/avo/asset_manager/stylesheet_component.html.erb +3 -0
- data/app/components/avo/asset_manager/stylesheet_component.rb +13 -0
- data/app/components/avo/base_component.rb +15 -12
- data/app/components/avo/button_component.rb +20 -3
- data/app/components/avo/empty_state_component.rb +1 -1
- data/app/components/avo/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/field_wrapper_component.rb +15 -26
- data/app/components/avo/fields/area_field/edit_component.html.erb +2 -2
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +96 -118
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +6 -17
- data/app/components/avo/fields/belongs_to_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/belongs_to_field/show_component.rb +2 -2
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +3 -3
- data/app/components/avo/fields/common/badge_viewer_component.html.erb +24 -1
- data/app/components/avo/fields/common/badge_viewer_component.rb +0 -24
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files/list_viewer_component.rb +3 -3
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.html.erb → grid_component.html.erb} +2 -2
- data/app/components/avo/fields/common/files/view_type/{grid_item_component.rb → grid_component.rb} +4 -5
- data/app/components/avo/fields/common/files/view_type/{list_item_component.rb → list_component.rb} +1 -1
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +3 -2
- data/app/components/avo/fields/has_one_field/show_component.rb +2 -2
- data/app/components/avo/fields/hidden_field/edit_component.html.erb +1 -2
- data/app/components/avo/fields/index_component.rb +5 -5
- data/app/components/avo/fields/preview_field/index_component.html.erb +10 -0
- data/app/components/avo/fields/preview_field/index_component.rb +4 -0
- data/app/components/avo/fields/select_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/show_component.rb +4 -1
- data/app/components/avo/fields/trix_field/edit_component.rb +1 -1
- data/app/components/avo/filters_component.html.erb +9 -3
- data/app/components/avo/filters_component.rb +4 -4
- data/app/components/avo/index/field_wrapper_component.rb +0 -12
- data/app/components/avo/index/grid_item_component.html.erb +13 -36
- data/app/components/avo/index/grid_item_component.rb +43 -16
- data/app/components/avo/index/resource_controls_component.html.erb +3 -81
- data/app/components/avo/index/resource_controls_component.rb +124 -17
- data/app/components/avo/index/resource_grid_component.html.erb +5 -3
- data/app/components/avo/index/resource_grid_component.rb +5 -2
- data/app/components/avo/index/resource_map_component.html.erb +1 -1
- data/app/components/avo/index/resource_map_component.rb +3 -3
- data/app/components/avo/index/resource_table_component.html.erb +5 -4
- data/app/components/avo/index/resource_table_component.rb +14 -20
- data/app/components/avo/index/table_row_component.html.erb +8 -4
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/item_switcher_component.rb +2 -2
- data/app/components/avo/modal_component.html.erb +7 -12
- data/app/components/avo/modal_component.rb +0 -21
- data/app/components/avo/paginator_component.html.erb +40 -29
- data/app/components/avo/paginator_component.rb +5 -23
- data/app/components/avo/panel_component.html.erb +8 -6
- data/app/components/avo/referrer_params_component.html.erb +1 -2
- data/app/components/avo/resource_component.rb +189 -14
- data/app/components/avo/resource_sidebar_component.html.erb +6 -2
- data/app/components/avo/resource_sidebar_component.rb +1 -1
- data/app/components/avo/sidebar/link_component.rb +1 -1
- data/app/components/avo/sidebar_component.html.erb +10 -3
- data/app/components/avo/sidebar_component.rb +5 -3
- data/app/components/avo/sidebar_profile_component.html.erb +15 -8
- data/app/components/avo/tab_group_component.html.erb +13 -7
- data/app/components/avo/tab_group_component.rb +1 -6
- data/app/components/avo/tab_switcher_component.html.erb +17 -40
- data/app/components/avo/tab_switcher_component.rb +4 -39
- data/app/components/avo/views/resource_edit_component.html.erb +12 -48
- data/app/components/avo/views/resource_edit_component.rb +7 -18
- data/app/components/avo/views/resource_index_component.html.erb +41 -47
- data/app/components/avo/views/resource_index_component.rb +62 -12
- data/app/components/avo/views/resource_show_component.html.erb +6 -149
- data/app/components/avo/views/resource_show_component.rb +6 -11
- data/app/controllers/avo/actions_controller.rb +27 -24
- data/app/controllers/avo/application_controller.rb +105 -151
- data/app/controllers/avo/associations_controller.rb +34 -43
- data/app/controllers/avo/attachments_controller.rb +4 -4
- data/app/controllers/avo/base_controller.rb +102 -102
- data/app/controllers/avo/debug_controller.rb +17 -5
- data/app/controllers/avo/home_controller.rb +1 -1
- data/app/controllers/avo/search_controller.rb +30 -51
- data/app/controllers/avo/team_users_controller.rb +4 -0
- data/app/controllers/concerns/avo/initializes_avo.rb +21 -0
- data/app/helpers/avo/application_helper.rb +15 -9
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +27 -11
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/application.js +0 -3
- data/app/javascript/js/controllers/action_controller.js +5 -3
- data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
- data/app/javascript/js/controllers/fields/date_field_controller.js +3 -7
- data/app/javascript/js/controllers/fields/key_value_controller.js +1 -2
- data/app/javascript/js/controllers/filter_controller.js +1 -1
- data/app/javascript/js/controllers/input_autofocus_controller.js +12 -0
- data/app/javascript/js/controllers/preview_controller.js +24 -0
- data/app/javascript/js/controllers/search_controller.js +2 -2
- data/app/javascript/js/controllers/self_destroy_controller.js +7 -0
- data/app/javascript/js/controllers/toggle_controller.js +48 -0
- data/app/javascript/js/controllers.js +10 -6
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/actions/keep_modal_open.turbo_stream.erb +5 -0
- data/app/views/avo/actions/show.html.erb +10 -7
- data/app/views/avo/associations/new.html.erb +2 -2
- data/app/views/avo/base/index.html.erb +3 -2
- data/app/views/avo/base/new.html.erb +2 -1
- data/app/views/avo/base/preview.html.erb +19 -0
- data/app/views/avo/base/show.html.erb +1 -1
- data/app/views/avo/debug/_valid_indicator.html.erb +9 -0
- data/app/views/avo/debug/report.html.erb +32 -17
- data/app/views/avo/debug/{index.html.erb → status.html.erb} +31 -14
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_footer.html.erb +1 -1
- data/app/views/avo/partials/_javascript.html.erb +5 -0
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +3 -5
- data/app/views/avo/partials/_table_header.html.erb +5 -11
- data/app/views/layouts/avo/application.html.erb +4 -2
- data/avo.gemspec +11 -12
- data/bin/dev +1 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +0 -2
- data/config/master.key +1 -0
- data/config/routes.rb +6 -10
- data/db/factories.rb +7 -1
- data/lib/avo/action_model.rb +20 -0
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +57 -42
- data/lib/avo/base_resource.rb +264 -227
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/breadcrumbs.rb +2 -2
- data/lib/avo/concerns/{can_replace_fields.rb → can_replace_items.rb} +5 -9
- data/lib/avo/concerns/filters_session_handler.rb +5 -3
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_description.rb +23 -0
- data/lib/avo/concerns/has_item_type.rb +42 -0
- data/lib/avo/concerns/has_items.rb +325 -0
- data/lib/avo/concerns/{has_resource_stimulus_controllers.rb → has_stimulus_controllers.rb} +1 -1
- data/lib/avo/concerns/is_resource_item.rb +24 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/model_class_constantized.rb +0 -2
- data/lib/avo/concerns/visible_in_different_views.rb +126 -0
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +1 -37
- data/lib/avo/current.rb +39 -0
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/dynamic_router.rb +18 -3
- data/lib/avo/engine.rb +35 -30
- data/lib/avo/error_manager.rb +25 -0
- data/lib/avo/execution_context.rb +10 -14
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +91 -106
- data/lib/avo/fields/belongs_to_field.rb +18 -22
- data/lib/avo/fields/concerns/file_authorization.rb +2 -2
- data/lib/avo/fields/concerns/handles_field_args.rb +49 -0
- data/lib/avo/fields/concerns/has_default.rb +1 -5
- data/lib/avo/fields/concerns/has_field_name.rb +22 -0
- data/lib/avo/fields/concerns/has_html_attributes.rb +110 -0
- data/lib/avo/fields/concerns/is_disabled.rb +1 -5
- data/lib/avo/fields/concerns/is_readonly.rb +1 -5
- data/lib/avo/fields/concerns/is_required.rb +5 -7
- data/lib/avo/fields/concerns/is_searchable.rb +13 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_time_field.rb +3 -14
- data/lib/avo/fields/field_manager.rb +55 -0
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +12 -15
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +6 -10
- data/lib/avo/fields/heading_field.rb +4 -1
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +1 -1
- data/lib/avo/fields/location_field.rb +8 -8
- data/lib/avo/fields/password_field.rb +1 -1
- data/lib/avo/fields/preview_field.rb +14 -0
- data/lib/avo/fields/select_field.rb +12 -8
- data/lib/avo/fields/status_field.rb +4 -0
- data/lib/avo/filters/base_filter.rb +8 -4
- data/lib/avo/html/builder.rb +7 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +8 -67
- data/lib/avo/licensing/license.rb +1 -1
- data/lib/avo/licensing/pro_license.rb +1 -7
- data/lib/avo/loaders/fields_loader.rb +7 -1
- data/lib/avo/plugin.rb +16 -0
- data/lib/avo/plugin_manager.rb +56 -0
- data/lib/avo/prefixed_test_helpers.rb +20 -0
- data/lib/avo/reloader.rb +3 -0
- data/lib/avo/resources/controls/actions_list.rb +7 -12
- data/lib/avo/resources/controls/attach_button.rb +15 -0
- data/lib/avo/resources/controls/back_button.rb +1 -1
- data/lib/avo/resources/controls/base_control.rb +15 -49
- data/lib/avo/resources/controls/create_button.rb +15 -0
- data/lib/avo/resources/controls/delete_button.rb +5 -1
- data/lib/avo/resources/controls/detach_button.rb +4 -1
- data/lib/avo/resources/controls/edit_button.rb +4 -1
- data/lib/avo/resources/controls/order_controls.rb +8 -0
- data/lib/avo/resources/controls/save_button.rb +13 -0
- data/lib/avo/resources/controls/show_button.rb +15 -0
- data/lib/avo/resources/items/holder.rb +84 -0
- data/lib/avo/resources/items/item_group.rb +49 -0
- data/lib/avo/resources/items/main_panel.rb +2 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/row.rb +54 -0
- data/lib/avo/resources/items/sidebar.rb +47 -0
- data/lib/avo/resources/items/tab.rb +60 -0
- data/lib/avo/resources/items/tab_group.rb +68 -0
- data/lib/avo/resources/resource_manager.rb +174 -0
- data/lib/avo/services/authorization_service.rb +11 -110
- data/lib/avo/services/debug_service.rb +93 -0
- data/lib/avo/services/encryption_service.rb +5 -1
- data/lib/avo/services/telemetry_service.rb +85 -0
- data/lib/avo/test_helpers.rb +362 -0
- data/lib/avo/tools/tool_manager.rb +30 -0
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +115 -24
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/resource_generator.rb +4 -4
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +1 -15
- data/lib/generators/avo/templates/action.tt +8 -6
- data/lib/generators/avo/templates/cards/chartkick_card.tt +1 -1
- data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card.tt +1 -1
- data/lib/generators/avo/templates/cards/metric_card_sample.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card.tt +1 -1
- data/lib/generators/avo/templates/cards/partial_card_sample.tt +1 -1
- data/lib/generators/avo/templates/dashboards/dashboard.tt +5 -3
- data/lib/generators/avo/templates/field/%singular_name%_field.rb.tt +1 -1
- data/lib/generators/avo/templates/filters/boolean_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/multiple_select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/select_filter.tt +1 -1
- data/lib/generators/avo/templates/filters/text_filter.tt +1 -1
- data/lib/generators/avo/templates/initializer/avo.tt +1 -9
- data/lib/generators/avo/templates/locales/avo.ar.yml +6 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +4 -5
- data/lib/generators/avo/templates/locales/avo.fr.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nb.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.nn.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.pt.yml +1 -2
- data/lib/generators/avo/templates/locales/avo.ro.yml +6 -7
- data/lib/generators/avo/templates/locales/avo.tr.yml +1 -2
- data/lib/generators/avo/templates/resource/resource.tt +7 -7
- data/lib/generators/avo/templates/resource_tools/partial.tt +4 -4
- data/lib/generators/avo/templates/resource_tools/resource_tool.tt +1 -1
- data/lib/generators/avo/templates/scope.tt +6 -0
- data/lib/generators/avo/templates/tool/view.tt +2 -2
- data/lib/tasks/avo_tasks.rake +27 -0
- data/public/avo-assets/avo.base.css +1810 -1189
- data/public/avo-assets/avo.base.js +217 -307
- data/public/avo-assets/avo.base.js.map +3 -3
- data/public/avo-assets/avo.css +9744 -0
- data/public/avo-assets/avo.js +513 -0
- data/public/avo-assets/avo.js.map +7 -0
- metadata +102 -146
- data/app/assets/stylesheets/css/tags.css +0 -32
- data/app/components/avo/card_component.html.erb +0 -46
- data/app/components/avo/card_component.rb +0 -25
- data/app/components/avo/dashboards/divider_component.html.erb +0 -9
- data/app/components/avo/dashboards/divider_component.rb +0 -19
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +0 -47
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +0 -95
- data/app/components/avo/fields/tags_field/edit_component.html.erb +0 -35
- data/app/components/avo/fields/tags_field/edit_component.rb +0 -4
- data/app/components/avo/fields/tags_field/index_component.html.erb +0 -10
- data/app/components/avo/fields/tags_field/index_component.rb +0 -9
- data/app/components/avo/fields/tags_field/show_component.html.erb +0 -7
- data/app/components/avo/fields/tags_field/show_component.rb +0 -5
- data/app/components/avo/fields/tags_field/tag_component.html.erb +0 -9
- data/app/components/avo/fields/tags_field/tag_component.rb +0 -11
- data/app/components/avo/index/ordering/base_component.rb +0 -9
- data/app/components/avo/index/ordering/button_component.html.erb +0 -11
- data/app/components/avo/index/ordering/button_component.rb +0 -23
- data/app/components/avo/index/ordering/buttons_component.html.erb +0 -32
- data/app/components/avo/index/ordering/buttons_component.rb +0 -47
- data/app/components/avo/sidebar/item_switcher_component.html.erb +0 -16
- data/app/components/avo/sidebar/item_switcher_component.rb +0 -15
- data/app/controllers/avo/dashboards/cards_controller.rb +0 -37
- data/app/controllers/avo/dashboards_controller.rb +0 -22
- data/app/controllers/avo/reorder_controller.rb +0 -25
- data/app/javascript/js/controllers/base_controller.js +0 -22
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +0 -51
- data/app/javascript/js/controllers/fields/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- data/app/views/avo/base/_new_via_belongs_to.html.erb +0 -12
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +0 -8
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +0 -13
- data/app/views/avo/dashboards/cards/_chartkick_card.html.erb +0 -3
- data/app/views/avo/dashboards/cards/_metric_card.html.erb +0 -5
- data/app/views/avo/dashboards/cards/chartkick_missing.html.erb +0 -14
- data/app/views/avo/dashboards/cards/show.html.erb +0 -3
- data/app/views/avo/dashboards/show.html.erb +0 -38
- data/app/views/avo/partials/_flash_alerts.turbo_stream.erb +0 -3
- data/app/views/avo/partials/_global_search.html.erb +0 -19
- data/app/views/avo/sidebar/_license_warnings.html.erb +0 -6
- data/lib/avo/app.rb +0 -237
- data/lib/avo/base_card.rb +0 -161
- data/lib/avo/concerns/fetches_things.rb +0 -150
- data/lib/avo/concerns/handles_field_args.rb +0 -47
- data/lib/avo/concerns/has_action_stimulus_controllers.rb +0 -15
- data/lib/avo/concerns/has_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_fields.rb +0 -334
- data/lib/avo/concerns/has_html_attributes.rb +0 -123
- data/lib/avo/concerns/pagination.rb +0 -53
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- data/lib/avo/concerns/visible_items.rb +0 -51
- data/lib/avo/dashboards/base_dashboard.rb +0 -89
- data/lib/avo/dashboards/base_divider.rb +0 -35
- data/lib/avo/dashboards/chartkick_card.rb +0 -77
- data/lib/avo/dashboards/dashboard_card.rb +0 -6
- data/lib/avo/dashboards/metric_card.rb +0 -9
- data/lib/avo/dashboards/partial_card.rb +0 -7
- data/lib/avo/fields/field_extensions/has_field_name.rb +0 -19
- data/lib/avo/fields/field_extensions/visible_in_different_views.rb +0 -111
- data/lib/avo/fields/tags_field.rb +0 -102
- data/lib/avo/grid_collector.rb +0 -42
- data/lib/avo/hosts/association_scope_host.rb +0 -8
- data/lib/avo/hosts/base_host.rb +0 -25
- data/lib/avo/hosts/card_visibility.rb +0 -20
- data/lib/avo/hosts/dashboard_card.rb +0 -22
- data/lib/avo/hosts/dashboard_visibility.rb +0 -19
- data/lib/avo/hosts/ordering.rb +0 -22
- data/lib/avo/hosts/record_host.rb +0 -7
- data/lib/avo/hosts/resource_record_host.rb +0 -7
- data/lib/avo/hosts/resource_view_record_host.rb +0 -7
- data/lib/avo/hosts/search_scope_host.rb +0 -7
- data/lib/avo/hosts/view_record_host.rb +0 -7
- data/lib/avo/hosts/visibility_host.rb +0 -12
- data/lib/avo/items_holder.rb +0 -96
- data/lib/avo/main_panel.rb +0 -3
- data/lib/avo/menu/base_item.rb +0 -25
- data/lib/avo/menu/builder.rb +0 -82
- data/lib/avo/menu/dashboard.rb +0 -22
- data/lib/avo/menu/group.rb +0 -2
- data/lib/avo/menu/link.rb +0 -6
- data/lib/avo/menu/menu.rb +0 -2
- data/lib/avo/menu/resource.rb +0 -22
- data/lib/avo/menu/section.rb +0 -2
- data/lib/avo/panel.rb +0 -24
- data/lib/avo/panel_builder.rb +0 -25
- data/lib/avo/resources/controls/action.rb +0 -38
- data/lib/avo/resources/controls/execution_context.rb +0 -58
- data/lib/avo/resources/controls/items_holder.rb +0 -19
- data/lib/avo/resources/controls/link_to.rb +0 -27
- data/lib/avo/row.rb +0 -26
- data/lib/avo/row_builder.rb +0 -24
- data/lib/avo/services/authorization_clients/nil_client.rb +0 -37
- data/lib/avo/services/authorization_clients/pundit_client.rb +0 -51
- data/lib/avo/sidebar.rb +0 -30
- data/lib/avo/sidebar_builder.rb +0 -24
- data/lib/avo/tab.rb +0 -72
- data/lib/avo/tab_builder.rb +0 -25
- data/lib/avo/tab_group.rb +0 -42
- data/lib/avo/tab_group_builder.rb +0 -43
- data/lib/avo/tools_manager.rb +0 -11
- data/lib/generators/avo/card/chartkick_generator.rb +0 -18
- data/lib/generators/avo/card/metric_generator.rb +0 -18
- data/lib/generators/avo/card/partial_generator.rb +0 -19
- data/lib/generators/avo/templates/locales/avo.es.yml +0 -126
- data/lib/generators/avo/templates/standalone_action.tt +0 -8
- /data/app/components/avo/fields/common/files/view_type/{list_item_component.html.erb → list_component.html.erb} +0 -0
@@ -5,41 +5,23 @@ class Avo::PaginatorComponent < ViewComponent::Base
|
|
5
5
|
attr_reader :turbo_frame
|
6
6
|
attr_reader :index_params
|
7
7
|
attr_reader :resource
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :parent_record
|
9
9
|
attr_reader :discreet_pagination
|
10
10
|
|
11
|
-
def initialize(resource: nil,
|
11
|
+
def initialize(resource: nil, parent_record: nil, pagy: nil, turbo_frame: nil, index_params: nil, discreet_pagination: nil)
|
12
12
|
@pagy = pagy
|
13
13
|
@turbo_frame = turbo_frame
|
14
14
|
@index_params = index_params
|
15
15
|
@resource = resource
|
16
|
-
@
|
16
|
+
@parent_record = parent_record
|
17
17
|
@discreet_pagination = discreet_pagination
|
18
18
|
end
|
19
19
|
|
20
20
|
def change_items_per_page_url(option)
|
21
|
-
if
|
22
|
-
helpers.related_resources_path(
|
21
|
+
if parent_record.present?
|
22
|
+
helpers.related_resources_path(parent_record, parent_record, per_page: option, keep_query_params: true, page: 1)
|
23
23
|
else
|
24
24
|
helpers.resources_path(resource: resource, per_page: option, keep_query_params: true, page: 1)
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
28
|
-
def render?
|
29
|
-
return false if discreet_pagination && pagy.pages <= 1
|
30
|
-
|
31
|
-
@pagy.items > 0
|
32
|
-
end
|
33
|
-
|
34
|
-
def per_page_options
|
35
|
-
@per_page_options ||= begin
|
36
|
-
options = [*Avo.configuration.per_page_steps, Avo.configuration.per_page.to_i, index_params[:per_page].to_i]
|
37
|
-
|
38
|
-
if parent_model.present?
|
39
|
-
options.prepend Avo.configuration.via_per_page
|
40
|
-
end
|
41
|
-
|
42
|
-
options.sort.uniq
|
43
|
-
end
|
44
|
-
end
|
45
27
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= content_tag :div, data: data_attributes, class: classes do %>
|
2
2
|
<% if render_header? %>
|
3
|
-
<div class="flex-1 flex flex-col xl:flex-row justify-between mb-4">
|
3
|
+
<div data-target="panel-header" class="flex-1 flex flex-col xl:flex-row justify-between mb-4">
|
4
4
|
<div class="overflow-hidden flex flex-col">
|
5
5
|
<% if display_breadcrumbs? %>
|
6
6
|
<div class="breadcrumbs truncate mb-2">
|
@@ -24,7 +24,7 @@
|
|
24
24
|
</div>
|
25
25
|
<% end %>
|
26
26
|
<% if body? %>
|
27
|
-
<div class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:gap-4 w-full">
|
27
|
+
<div data-target="panel-body" class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:gap-4 w-full">
|
28
28
|
<div class="relative flex-1 w-full <% if sidebar? %> sm:w-2/3 <% end %>">
|
29
29
|
<% # The body is wrapped inside another div in order to avoid long & tall panels next to sidebars when the sidebar taller. %>
|
30
30
|
<div class="relative <%= white_panel_classes %> <%= @body_classes %>">
|
@@ -32,24 +32,26 @@
|
|
32
32
|
</div>
|
33
33
|
</div>
|
34
34
|
<% if sidebar? %>
|
35
|
-
<div class="
|
35
|
+
<div class="w-full sm:w-1/3 flex-shrink-0 h-full <%= white_panel_classes %>">
|
36
36
|
<%= sidebar %>
|
37
37
|
</div>
|
38
38
|
<% end %>
|
39
39
|
<% if bare_sidebar? %>
|
40
|
-
<div class="
|
40
|
+
<div class="w-full sm:w-1/3 flex-shrink-0 h-full">
|
41
41
|
<%= bare_sidebar %>
|
42
42
|
</div>
|
43
43
|
<% end %>
|
44
44
|
</div>
|
45
45
|
<% end %>
|
46
46
|
<% if bare_content? %>
|
47
|
-
<div class="relative">
|
47
|
+
<div data-target="panel-bare-content" class="relative">
|
48
48
|
<%= bare_content %>
|
49
49
|
</div>
|
50
50
|
<% end %>
|
51
51
|
<% if footer_tools? %>
|
52
|
-
<div
|
52
|
+
<div
|
53
|
+
data-target="panel-footer-tools"
|
54
|
+
class="flex-1 w-full flex flex-col sm:flex-row xl:justify-end sm:items-end space-y-2 sm:space-y-0 sm:space-x-2 mt-4 xl:mt-0">
|
53
55
|
<%= footer_tools %>
|
54
56
|
</div>
|
55
57
|
<% end %>
|
@@ -1,7 +1,6 @@
|
|
1
1
|
<%# via_association_type is used in has_one create actions %>
|
2
2
|
<%= hidden_field_tag :via_association_type, params[:via_association_type] if params[:via_association_type] %>
|
3
3
|
<%= hidden_field_tag :via_resource_class, params[:via_resource_class] if params[:via_resource_class] %>
|
4
|
-
<%= hidden_field_tag :
|
4
|
+
<%= hidden_field_tag :via_record_id, params[:via_record_id] if params[:via_record_id] %>
|
5
5
|
<%= hidden_field_tag :via_relation, params[:via_relation] if params[:via_relation] %>
|
6
|
-
<%= hidden_field_tag :via_belongs_to_resource_class, params[:via_belongs_to_resource_class] if params[:via_belongs_to_resource_class] %>
|
7
6
|
<%= hidden_field_tag :referrer, back_path if params[:via_resource_class] %>
|
@@ -20,7 +20,7 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def can_detach?
|
23
|
-
return false if @reflection.blank? || @resource.
|
23
|
+
return false if @reflection.blank? || @resource.record.blank? || !authorize_association_for(:detach)
|
24
24
|
|
25
25
|
# If the inverse_of is a belongs_to, we need to check if it's optional in order to know if we can detach it.
|
26
26
|
if inverse_of.is_a?(ActiveRecord::Reflection::BelongsToReflection)
|
@@ -33,7 +33,7 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
33
33
|
def detach_path
|
34
34
|
return "/" if @reflection.blank?
|
35
35
|
|
36
|
-
helpers.resource_detach_path(params[:resource_name], params[:id], @reflection.name.to_s, @resource.
|
36
|
+
helpers.resource_detach_path(params[:resource_name], params[:id], @reflection.name.to_s, @resource.record.to_param)
|
37
37
|
end
|
38
38
|
|
39
39
|
def can_see_the_edit_button?
|
@@ -44,7 +44,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
44
44
|
@resource.authorization.authorize_action(:destroy, raise_exception: false)
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
47
|
+
def can_see_the_actions_button?
|
48
|
+
return false if @actions.blank?
|
49
|
+
|
48
50
|
return authorize_association_for(:act_on) if @reflection.present?
|
49
51
|
|
50
52
|
@resource.authorization.authorize_action(:act_on, raise_exception: false) && !has_reflection_and_is_read_only
|
@@ -52,9 +54,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
52
54
|
|
53
55
|
def destroy_path
|
54
56
|
if params[:via_resource_class].present?
|
55
|
-
helpers.resource_path(
|
57
|
+
helpers.resource_path(record: @resource.record, resource: @resource, referrer: back_path)
|
56
58
|
else
|
57
|
-
helpers.resource_path(
|
59
|
+
helpers.resource_path(record: @resource.record, resource: @resource)
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
@@ -65,9 +67,9 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
65
67
|
if @reflection.present?
|
66
68
|
# Fetch the appropiate resource
|
67
69
|
reflection_resource = field.resource
|
68
|
-
# Fetch the
|
69
|
-
# Hydrate the resource with the
|
70
|
-
reflection_resource.hydrate(
|
70
|
+
# Fetch the record
|
71
|
+
# Hydrate the resource with the record if we have one
|
72
|
+
reflection_resource.hydrate(record: @parent_record) if @parent_record.present?
|
71
73
|
# Use the related_name as the base of the association
|
72
74
|
association_name = @reflection.name
|
73
75
|
|
@@ -80,16 +82,17 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
80
82
|
if service.has_method?(method_name, raise_exception: false)
|
81
83
|
# Some policy methods should get the parent record in order to have the necessarry information to do the authorization
|
82
84
|
# Example: Post->has_many->Comments
|
85
|
+
#
|
83
86
|
# When you want to authorize the creation/attaching of a Comment, you don't have the Comment instance.
|
84
87
|
# But you do have the Post instance and you can get that in your policy to authorize against.
|
85
88
|
parent_policy_methods = [:view, :create, :attach, :act_on]
|
86
89
|
|
87
90
|
record = if parent_policy_methods.include?(policy_method)
|
88
91
|
# Use the parent record (Post)
|
89
|
-
reflection_resource.
|
92
|
+
reflection_resource.record
|
90
93
|
else
|
91
94
|
# Override the record with the child record (Comment)
|
92
|
-
resource.
|
95
|
+
resource.record
|
93
96
|
end
|
94
97
|
policy_result = service.authorize_action(method_name, record: record, raise_exception: false)
|
95
98
|
end
|
@@ -106,7 +109,7 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
106
109
|
end
|
107
110
|
|
108
111
|
def sidebar
|
109
|
-
return if Avo
|
112
|
+
return if Avo.license.lacks_with_trial(:resource_sidebar)
|
110
113
|
|
111
114
|
@sidebar ||= search_for_sidebar
|
112
115
|
end
|
@@ -117,23 +120,28 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
117
120
|
|
118
121
|
def has_reflection_and_is_read_only
|
119
122
|
if @reflection.present? && @reflection.active_record.name && @reflection.name
|
120
|
-
|
123
|
+
resource = Avo.resource_manager.get_resource_by_model_class(@reflection.active_record.name).new(params: helpers.params, view: view, user: helpers._current_user)
|
124
|
+
fields = resource.get_field_definitions
|
121
125
|
filtered_fields = fields.filter { |f| f.id == @reflection.name }
|
122
126
|
else
|
123
127
|
return false
|
124
128
|
end
|
125
129
|
|
126
130
|
if filtered_fields.present?
|
127
|
-
filtered_fields.find { |f| f.id == @reflection.name }.
|
131
|
+
filtered_fields.find { |f| f.id == @reflection.name }.is_disabled?
|
128
132
|
else
|
129
133
|
false
|
130
134
|
end
|
131
135
|
end
|
132
136
|
|
137
|
+
def render_control(control)
|
138
|
+
send "render_#{control.type}", control
|
139
|
+
end
|
140
|
+
|
133
141
|
private
|
134
142
|
|
135
143
|
def via_resource?
|
136
|
-
(params[:via_resource_class].present? || params[:via_relation_class].present?) && params[:
|
144
|
+
(params[:via_resource_class].present? || params[:via_relation_class].present?) && params[:via_record_id].present?
|
137
145
|
end
|
138
146
|
|
139
147
|
def search_for_sidebar
|
@@ -144,6 +152,173 @@ class Avo::ResourceComponent < Avo::BaseComponent
|
|
144
152
|
item&.hydrate(view: view)
|
145
153
|
end
|
146
154
|
|
155
|
+
def render_back_button(control)
|
156
|
+
return if is_a_related_resource?
|
157
|
+
|
158
|
+
tippy = control.title ? :tooltip : nil
|
159
|
+
a_link back_path,
|
160
|
+
style: :text,
|
161
|
+
title: control.title,
|
162
|
+
data: {tippy: tippy},
|
163
|
+
icon: "arrow-left" do
|
164
|
+
control.label
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def render_actions_list(actions_list)
|
169
|
+
return unless can_see_the_actions_button?
|
170
|
+
|
171
|
+
render Avo::ActionsComponent.new(
|
172
|
+
actions: @actions,
|
173
|
+
resource: @resource,
|
174
|
+
view: @view,
|
175
|
+
exclude: actions_list.exclude,
|
176
|
+
include: actions_list.include,
|
177
|
+
style: actions_list.style,
|
178
|
+
color: actions_list.color,
|
179
|
+
label: actions_list.label,
|
180
|
+
size: actions_list.size,
|
181
|
+
as_row_control: instance_of?(Avo::Index::ResourceControlsComponent)
|
182
|
+
)
|
183
|
+
end
|
184
|
+
|
185
|
+
def render_delete_button(control)
|
186
|
+
# If the resource is a related resource, we use the can_delete? policy method because it uses
|
187
|
+
# authorize_association_for(:destroy).
|
188
|
+
# Otherwise we use the can_see_the_destroy_button? policy method becuse it do no check for assiciation
|
189
|
+
# only for authorize_action .
|
190
|
+
policy_method = is_a_related_resource? ? :can_delete? : :can_see_the_destroy_button?
|
191
|
+
return unless send policy_method
|
192
|
+
|
193
|
+
a_link destroy_path,
|
194
|
+
style: :text,
|
195
|
+
color: :red,
|
196
|
+
icon: "trash",
|
197
|
+
form_class: "flex flex-col sm:flex-row sm:inline-flex",
|
198
|
+
title: control.title,
|
199
|
+
data: {
|
200
|
+
turbo_confirm: t("avo.are_you_sure", item: @resource.record.model_name.name.downcase),
|
201
|
+
turbo_method: :delete,
|
202
|
+
target: "control:destroy",
|
203
|
+
control: :destroy,
|
204
|
+
tippy: control.title ? :tooltip : nil,
|
205
|
+
"resource-id": @resource.record.id,
|
206
|
+
} do
|
207
|
+
control.label
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def render_save_button(control)
|
212
|
+
return unless can_see_the_save_button?
|
213
|
+
|
214
|
+
a_button color: :primary,
|
215
|
+
style: :primary,
|
216
|
+
loading: true,
|
217
|
+
type: :submit,
|
218
|
+
icon: "save" do
|
219
|
+
control.label
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def render_edit_button(control)
|
224
|
+
return unless can_see_the_edit_button?
|
225
|
+
|
226
|
+
a_link edit_path,
|
227
|
+
color: :primary,
|
228
|
+
style: :primary,
|
229
|
+
title: control.title,
|
230
|
+
data: {tippy: control.title ? :tooltip : nil},
|
231
|
+
icon: "edit" do
|
232
|
+
control.label
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def render_detach_button(control)
|
237
|
+
return unless is_a_related_resource? && can_detach?
|
238
|
+
|
239
|
+
a_button url: detach_path,
|
240
|
+
icon: "detach",
|
241
|
+
method: :delete,
|
242
|
+
form_class: "flex flex-col sm:flex-row sm:inline-flex",
|
243
|
+
style: :text,
|
244
|
+
data: {
|
245
|
+
confirm: "Are you sure you want to detach this #{title}."
|
246
|
+
} do
|
247
|
+
control.label || t("avo.detach_item", item: title).humanize
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
def render_create_button(control)
|
252
|
+
return unless can_see_the_create_button?
|
253
|
+
|
254
|
+
a_link create_path,
|
255
|
+
color: :primary,
|
256
|
+
style: :primary,
|
257
|
+
icon: "heroicons/outline/plus",
|
258
|
+
data: {
|
259
|
+
target: :create
|
260
|
+
} do
|
261
|
+
control.label
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
def render_attach_button(control)
|
266
|
+
return unless can_attach?
|
267
|
+
|
268
|
+
a_link attach_path,
|
269
|
+
icon: "heroicons/outline/link",
|
270
|
+
color: :primary,
|
271
|
+
style: :text,
|
272
|
+
data: {
|
273
|
+
turbo_frame: :attach_modal,
|
274
|
+
target: :attach
|
275
|
+
} do
|
276
|
+
control.label
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
def render_link_to(link)
|
281
|
+
a_link link.path,
|
282
|
+
color: link.color,
|
283
|
+
style: link.style,
|
284
|
+
icon: link.icon,
|
285
|
+
icon_class: link.icon_class,
|
286
|
+
title: link.title, target: link.target,
|
287
|
+
class: link.classes,
|
288
|
+
size: link.size,
|
289
|
+
data: {
|
290
|
+
**link.data,
|
291
|
+
tippy: link.title ? :tooltip : nil,
|
292
|
+
} do
|
293
|
+
link.label
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
def render_action(action)
|
298
|
+
return if !can_see_the_actions_button?
|
299
|
+
return if !action.action.visible_in_view(parent_resource: @parent_resource)
|
300
|
+
|
301
|
+
a_link action.path,
|
302
|
+
color: action.color,
|
303
|
+
style: action.style,
|
304
|
+
icon: action.icon,
|
305
|
+
icon_class: action.icon_class,
|
306
|
+
title: action.title,
|
307
|
+
size: action.size,
|
308
|
+
data: {
|
309
|
+
turbo_frame: "actions_show",
|
310
|
+
action_name: action.action.action_name,
|
311
|
+
tippy: action.title ? :tooltip : nil,
|
312
|
+
action: "click->actions-picker#visitAction",
|
313
|
+
} do
|
314
|
+
action.label
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
def is_a_related_resource?
|
319
|
+
@reflection.present? && @resource.record.present?
|
320
|
+
end
|
321
|
+
|
147
322
|
def inverse_of
|
148
323
|
current_reflection = @reflection.active_record.reflect_on_all_associations.find do |reflection|
|
149
324
|
reflection.name == @reflection.name.to_sym
|
@@ -1,9 +1,13 @@
|
|
1
|
-
<div class="resource-sidebar-component divide-y"
|
1
|
+
<div class="resource-sidebar-component divide-y"
|
2
|
+
data-component-name="<%= self.class.to_s.underscore%>"
|
3
|
+
data-resource-name="<%= @resource.class.to_s %>"
|
4
|
+
data-record-id="<%= @resource.record.id %>"
|
5
|
+
>
|
2
6
|
<% fields.each_with_index do |field, index| %>
|
3
7
|
<%= render field
|
4
8
|
.hydrate(
|
5
9
|
resource: resource,
|
6
|
-
|
10
|
+
record: resource.record,
|
7
11
|
user: resource.user,
|
8
12
|
view: view
|
9
13
|
).component_for_view(view)
|
@@ -19,7 +19,7 @@ class Avo::Sidebar::LinkComponent < ViewComponent::Base
|
|
19
19
|
|
20
20
|
def is_external?
|
21
21
|
# If the path contains the scheme, check if it includes the root path or not
|
22
|
-
return !path.include?(Avo
|
22
|
+
return !path.include?(Avo.mount_path) if URI(path).scheme.present?
|
23
23
|
|
24
24
|
false
|
25
25
|
end
|
@@ -13,8 +13,8 @@
|
|
13
13
|
<div class="space-y-6 mb-4">
|
14
14
|
<%= render Avo::Sidebar::LinkComponent.new label: 'Get started', path: helpers.avo.root_path, active: :exclusive if Rails.env.development? && Avo.configuration.home_path.nil? %>
|
15
15
|
|
16
|
-
<% if Avo
|
17
|
-
<% Avo
|
16
|
+
<% if Avo.plugin_manager.installed?("avo-menu") && Avo.has_main_menu? %>
|
17
|
+
<% Avo.main_menu.items.each do |item| %>
|
18
18
|
<%= render Avo::Sidebar::ItemSwitcherComponent.new item: item %>
|
19
19
|
<% end %>
|
20
20
|
<% else %>
|
@@ -57,7 +57,14 @@
|
|
57
57
|
<%= render partial: "/avo/partials/sidebar_extra" %>
|
58
58
|
</div>
|
59
59
|
</div>
|
60
|
-
|
60
|
+
<% if Rails.env.development? %>
|
61
|
+
<div class="p-4 border-t group">
|
62
|
+
<%= link_to helpers.avo.avo_private_status_path, class: "block px-4 py-2 border rounded flex justify-between items-center w-full text-black text-sm" do %>
|
63
|
+
<span>Avo Status</span> <span><div class="rounded-full w-4 h-4 <%= Avo.app_status ? "bg-green-400" : "bg-orange-400" %>"></div></span>
|
64
|
+
<% end %>
|
65
|
+
<div class="absolute text-xs text-gray-700 group-hover:block hidden text-center w-full -ml-4">👆Visible only in development👆</div>
|
66
|
+
</div>
|
67
|
+
<% end %>
|
61
68
|
<%= render Avo::SidebarProfileComponent.new user: helpers._current_user %>
|
62
69
|
</div>
|
63
70
|
</div>
|
@@ -7,15 +7,17 @@ class Avo::SidebarComponent < ViewComponent::Base
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def dashboards
|
10
|
-
Avo
|
10
|
+
return [] unless Avo.plugin_manager.installed?("avo-dashboards")
|
11
|
+
|
12
|
+
Avo::Dashboards.dashboard_manager.dashboards_for_navigation
|
11
13
|
end
|
12
14
|
|
13
15
|
def resources
|
14
|
-
Avo
|
16
|
+
Avo.resource_manager.resources_for_navigation helpers._current_user
|
15
17
|
end
|
16
18
|
|
17
19
|
def tools
|
18
|
-
Avo
|
20
|
+
Avo.tool_manager.tools_for_navigation
|
19
21
|
end
|
20
22
|
|
21
23
|
def stimulus_target
|
@@ -16,24 +16,31 @@
|
|
16
16
|
<% end %>
|
17
17
|
</div>
|
18
18
|
</div>
|
19
|
-
<div class="relative" data-controller="toggle
|
20
|
-
<a class="flex items-center h-full cursor-pointer" data-control="profile-dots" data-action="click->toggle
|
19
|
+
<div class="relative" data-controller="toggle">
|
20
|
+
<a class="flex items-center h-full cursor-pointer" data-control="profile-dots" data-action="click->toggle#togglePanel">
|
21
21
|
<%= helpers.svg 'three-dots', class: 'h-4' %>
|
22
22
|
</a>
|
23
23
|
<div
|
24
24
|
class="hidden absolute flex flex-col inset-auto right-0 -mt-12 bg-white rounded min-w-[200px] shadow-context -translate-y-full z-40"
|
25
|
-
data-toggle-
|
25
|
+
data-toggle-target="panel"
|
26
|
+
data-transition-enter="transition ease-out duration-100"
|
27
|
+
data-transition-enter-start="transform opacity-0 translate-y-1"
|
28
|
+
data-transition-enter-end="transform opacity-100 translate-y-0"
|
29
|
+
data-transition-leave="transition ease-in duration-75"
|
30
|
+
data-transition-leave-start="transform opacity-100 translate-y-0"
|
31
|
+
data-transition-leave-end="transform opacity-0 translate-y-1"
|
26
32
|
>
|
27
|
-
<% if Avo
|
28
|
-
<div class="text-black">
|
29
|
-
<% Avo
|
33
|
+
<% if Avo.plugin_manager.installed?("avo-menu") && Avo.has_profile_menu? %>
|
34
|
+
<div class="text-black space-y-4">
|
35
|
+
<% Avo.profile_menu.items.each do |item| %>
|
30
36
|
<% if item.is_a? Avo::Menu::Link %>
|
31
37
|
<%= render Avo::ProfileItemComponent.new label: item.name, path: item.path, icon: item.icon, method: item.method, params: item.params %>
|
32
38
|
<% end %>
|
33
39
|
<% end %>
|
34
40
|
</div>
|
35
41
|
<% end %>
|
36
|
-
|
42
|
+
<%# Example link below %>
|
43
|
+
<%#= render Avo::ProfileItemComponent.new label: 'Profile', path: '/profile', icon: 'user-circle' %>
|
37
44
|
<% if can_destroy_user? %>
|
38
45
|
<%= button_to helpers.main_app.send(destroy_user_session_path),
|
39
46
|
form: { "data-turbo" => "false" },
|
@@ -45,7 +52,7 @@
|
|
45
52
|
form_class: 'flex-1' do %>
|
46
53
|
<%= helpers.svg 'logout', class: 'h-4 mr-1' %> <%= t('avo.sign_out') %>
|
47
54
|
<% end %>
|
48
|
-
|
55
|
+
<% end %>
|
49
56
|
</div>
|
50
57
|
</div>
|
51
58
|
</div>
|
@@ -32,19 +32,25 @@
|
|
32
32
|
end
|
33
33
|
|
34
34
|
if should_lazy_load
|
35
|
-
args[:src] = helpers.resource_path(resource: resource,
|
35
|
+
args[:src] = helpers.resource_path(resource: resource, record: resource.record, keep_query_params: true, active_tab_name: tab.name, tab_turbo_frame: group.turbo_frame_id)
|
36
36
|
args[:loading] = :lazy
|
37
37
|
end
|
38
38
|
%>
|
39
39
|
<%= turbo_frame_tag tab.turbo_frame_id(parent: @group), **args do %>
|
40
40
|
<div class="border rounded-lg p-2 -mx-2 -my-2 lg:p-4 lg:-mx-4 lg:-my-4 space-y-4">
|
41
|
-
<%= render Avo::TabSwitcherComponent.new resource: resource, current_tab: tab, group: group, active_tab_name: active_tab_name, view: view
|
42
|
-
<% if
|
43
|
-
<div class="
|
44
|
-
|
45
|
-
<%= render Avo::ItemSwitcherComponent.new resource: resource, item: item, index: index, form: form, view: @view %>
|
46
|
-
<% end %>
|
41
|
+
<%= render Avo::TabSwitcherComponent.new resource: resource, current_tab: tab, group: group, active_tab_name: active_tab_name, view: view %>
|
42
|
+
<% if should_lazy_load %>
|
43
|
+
<div class="block w-full">
|
44
|
+
<%= render Avo::LoadingComponent.new title: "#{tab.name}" %>
|
47
45
|
</div>
|
46
|
+
<% else %>
|
47
|
+
<% if !tab.is_empty? %>
|
48
|
+
<div class="space-y-12">
|
49
|
+
<% tab.visible_items.each do |item| %>
|
50
|
+
<%= render Avo::ItemSwitcherComponent.new resource: resource, item: item, index: index, form: form, view: @view %>
|
51
|
+
<% end %>
|
52
|
+
</div>
|
53
|
+
<% end %>
|
48
54
|
<% end %>
|
49
55
|
</div>
|
50
56
|
<% end %>
|
@@ -7,14 +7,13 @@ class Avo::TabGroupComponent < Avo::BaseComponent
|
|
7
7
|
attr_reader :form
|
8
8
|
attr_reader :resource
|
9
9
|
|
10
|
-
def initialize(resource:, group:, index:, form:, params:, view
|
10
|
+
def initialize(resource:, group:, index:, form:, params:, view:)
|
11
11
|
@resource = resource
|
12
12
|
@group = group
|
13
13
|
@index = index
|
14
14
|
@form = form
|
15
15
|
@params = params
|
16
16
|
@view = view
|
17
|
-
@tabs_style = tabs_style
|
18
17
|
|
19
18
|
@group.index = index
|
20
19
|
end
|
@@ -50,8 +49,4 @@ class Avo::TabGroupComponent < Avo::BaseComponent
|
|
50
49
|
tab.name.to_s == active_tab_name.to_s
|
51
50
|
end
|
52
51
|
end
|
53
|
-
|
54
|
-
def tabs_style
|
55
|
-
@tabs_style || Avo.configuration.tabs_style
|
56
|
-
end
|
57
52
|
end
|
@@ -1,41 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
} do %>
|
17
|
-
<%= tab.name %>
|
18
|
-
<% end %>
|
19
|
-
<% end %>
|
20
|
-
</div>
|
21
|
-
</div>
|
22
|
-
<% else %>
|
23
|
-
<div class="flex flex-wrap gap-2 p-2 <%= white_panel_classes %>" data-target="tab-switcher" data-style="pills">
|
24
|
-
<% visible_items.each do |tab| %>
|
25
|
-
<%= a_link tab_path(tab),
|
26
|
-
color: selected?(tab) ? :primary : :gray,
|
27
|
-
style: selected?(tab) ? :outline : :text,
|
28
|
-
size: :sm,
|
29
|
-
class: selected?(tab) ? "z-20 bg-primary-100" : "",
|
30
|
-
title: tab.description,
|
31
|
-
data: {
|
32
|
-
tippy: tab.description.present? ? 'tooltip' : '',
|
33
|
-
selected: selected?(tab),
|
34
|
-
action: 'click->tabs#changeTab',
|
35
|
-
tabs_id_param: tab.name
|
36
|
-
} do %>
|
37
|
-
<%= tab.name %>
|
38
|
-
<% end %>
|
1
|
+
<div class="flex flex-wrap gap-2 p-2 <%= white_panel_classes %>" data-target="tab-switcher">
|
2
|
+
<% group.visible_items.each do |tab| %>
|
3
|
+
<%= a_link tab_path(tab),
|
4
|
+
color: selected?(tab) ? :primary : :gray,
|
5
|
+
style: selected?(tab) ? :outline : :text,
|
6
|
+
size: :sm,
|
7
|
+
class: selected?(tab) ? "z-20 bg-primary-100" : "",
|
8
|
+
title: tab.description,
|
9
|
+
data: {
|
10
|
+
tippy: tab.description.present? ? 'tooltip' : '',
|
11
|
+
selected: selected?(tab),
|
12
|
+
action: 'click->tabs#changeTab',
|
13
|
+
tabs_id_param: tab.name
|
14
|
+
} do %>
|
15
|
+
<%= tab.name %>
|
39
16
|
<% end %>
|
40
|
-
|
41
|
-
|
17
|
+
<% end %>
|
18
|
+
</div>
|