avo 2.44.0 → 3.0.2
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 +28 -26
- data/Gemfile.lock +231 -161
- data/README.md +19 -27
- data/Rakefile +2 -0
- data/app/assets/stylesheets/avo.base.css +1 -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 +39 -19
- 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 +9 -15
- 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 +75 -79
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +7 -7
- 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_field/index_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.rb +1 -1
- data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
- data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files/view_type/grid_item_component.rb +2 -2
- data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
- data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
- data/app/components/avo/fields/common/heading_component.html.erb +3 -8
- data/app/components/avo/fields/common/heading_component.rb +1 -3
- data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
- data/app/components/avo/fields/common/key_value_component.rb +2 -2
- data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
- data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
- data/app/components/avo/fields/edit_component.rb +2 -2
- data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
- data/app/components/avo/fields/gravatar_field/index_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/heading_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/index_component.rb +6 -6
- data/app/components/avo/fields/location_field/edit_component.html.erb +12 -10
- 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 +5 -2
- data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/trix_field/edit_component.html.erb +2 -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.rb +1 -13
- 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 +125 -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_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 +24 -7
- data/app/components/avo/index/table_row_component.html.erb +9 -5
- data/app/components/avo/index/table_row_component.rb +3 -2
- data/app/components/avo/items/panel_component.html.erb +25 -0
- data/app/components/avo/items/panel_component.rb +43 -0
- data/app/components/avo/items/switcher_component.html.erb +17 -0
- data/app/components/avo/items/switcher_component.rb +79 -0
- data/app/components/avo/items/visible_items_component.html.erb +10 -0
- data/app/components/avo/items/visible_items_component.rb +11 -0
- data/app/components/avo/modal_component.html.erb +3 -4
- data/app/components/avo/paginator_component.html.erb +29 -40
- data/app/components/avo/paginator_component.rb +23 -5
- data/app/components/avo/panel_component.html.erb +7 -5
- data/app/components/avo/referrer_params_component.html.erb +1 -1
- data/app/components/avo/resource_component.rb +205 -26
- data/app/components/avo/resource_sidebar_component.html.erb +15 -18
- data/app/components/avo/resource_sidebar_component.rb +5 -3
- 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 +18 -12
- data/app/components/avo/tab_group_component.html.erb +14 -8
- 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 +6 -41
- data/app/components/avo/views/resource_edit_component.html.erb +23 -84
- data/app/components/avo/views/resource_edit_component.rb +20 -19
- data/app/components/avo/views/resource_index_component.html.erb +42 -47
- data/app/components/avo/views/resource_index_component.rb +76 -13
- data/app/components/avo/views/resource_show_component.html.erb +16 -177
- data/app/components/avo/views/resource_show_component.rb +16 -10
- data/app/controllers/avo/actions_controller.rb +29 -31
- data/app/controllers/avo/application_controller.rb +119 -181
- 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 +145 -98
- 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 +56 -50
- data/app/controllers/concerns/avo/initializes_avo.rb +22 -0
- data/app/helpers/avo/application_helper.rb +18 -8
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +28 -12
- data/app/javascript/avo.base.js +1 -0
- data/app/javascript/js/controllers/action_controller.js +3 -1
- data/app/javascript/js/controllers/actions_overflow_controller.js +62 -0
- data/app/javascript/js/controllers/fields/reload_belongs_to_field_controller.js +7 -7
- 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 +4 -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 +11 -5
- data/app/javascript/js/custom-stream-actions.js +15 -0
- data/app/views/avo/actions/show.html.erb +9 -5
- data/app/views/avo/associations/new.html.erb +2 -2
- data/app/views/avo/base/_new_via_belongs_to.html.erb +1 -1
- data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +3 -3
- data/app/views/avo/base/create_fail_action.turbo_stream.erb +2 -2
- data/app/views/avo/base/edit.html.erb +1 -1
- data/app/views/avo/base/index.html.erb +4 -3
- 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 +2 -2
- 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/_flash_alerts.turbo_stream.erb +1 -1
- 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/_resource_search.html.erb +1 -0
- data/app/views/avo/partials/_table_header.html.erb +5 -11
- data/app/views/layouts/avo/application.html.erb +5 -4
- data/avo.gemspec +10 -8
- data/bin/dev +3 -1
- data/bin/prod +0 -0
- data/config/i18n-tasks.yml +1 -1
- data/config/initializers/pagy.rb +2 -0
- data/config/master.key +1 -0
- data/config/routes.rb +7 -10
- data/db/factories.rb +6 -0
- data/lib/avo/asset_manager.rb +30 -0
- data/lib/avo/base_action.rb +78 -60
- data/lib/avo/base_resource.rb +286 -225
- data/lib/avo/base_resource_tool.rb +9 -16
- data/lib/avo/concerns/borrow_items_holder.rb +35 -0
- 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 +7 -5
- data/lib/avo/concerns/has_controls.rb +37 -0
- data/lib/avo/concerns/has_description.rb +23 -0
- data/lib/avo/concerns/has_helpers.rb +18 -0
- data/lib/avo/concerns/has_item_type.rb +42 -0
- data/lib/avo/concerns/has_items.rb +339 -0
- data/lib/avo/concerns/hydration.rb +17 -0
- data/lib/avo/concerns/is_resource_item.rb +16 -36
- data/lib/avo/concerns/is_visible.rb +15 -0
- data/lib/avo/concerns/model_class_constantized.rb +0 -2
- data/lib/avo/concerns/pagination.rb +53 -0
- data/lib/avo/concerns/visible_in_different_views.rb +132 -0
- data/lib/avo/concerns/visible_items.rb +7 -38
- data/lib/avo/configuration/branding.rb +0 -12
- data/lib/avo/configuration.rb +28 -11
- data/lib/avo/current.rb +39 -0
- data/lib/avo/dsl/field_parser.rb +3 -3
- 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 +14 -15
- data/lib/avo/fields/base_field.rb +84 -121
- data/lib/avo/fields/belongs_to_field.rb +19 -23
- 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 +112 -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 +15 -0
- data/lib/avo/fields/concerns/use_resource.rb +5 -1
- data/lib/avo/fields/concerns/use_view_components.rb +45 -0
- data/lib/avo/fields/country_field.rb +4 -0
- data/lib/avo/fields/date_time_field.rb +1 -5
- data/lib/avo/fields/external_image_field.rb +2 -2
- data/lib/avo/fields/field_manager.rb +55 -0
- data/lib/avo/fields/file_field.rb +2 -2
- data/lib/avo/fields/gravatar_field.rb +2 -2
- data/lib/avo/fields/has_and_belongs_to_many_field.rb +1 -2
- data/lib/avo/fields/has_base_field.rb +21 -17
- data/lib/avo/fields/has_many_field.rb +5 -2
- data/lib/avo/fields/has_one_field.rb +8 -12
- data/lib/avo/fields/heading_field.rb +9 -14
- data/lib/avo/fields/hidden_field.rb +1 -1
- data/lib/avo/fields/id_field.rb +3 -3
- data/lib/avo/fields/location_field.rb +10 -10
- 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 +7 -1
- data/lib/avo/fields/text_field.rb +2 -2
- data/lib/avo/filters/base_filter.rb +9 -4
- data/lib/avo/html/builder.rb +8 -8
- data/lib/avo/item_grapher.rb +78 -0
- data/lib/avo/licensing/h_q.rb +11 -73
- data/lib/avo/licensing/license.rb +5 -1
- data/lib/avo/licensing/license_manager.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 +36 -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 +96 -0
- data/lib/avo/resources/items/item_group.rb +44 -0
- data/lib/avo/resources/items/main_panel.rb +12 -0
- data/lib/avo/resources/items/panel.rb +2 -0
- data/lib/avo/resources/items/row.rb +42 -0
- data/lib/avo/resources/items/sidebar.rb +46 -0
- data/lib/avo/resources/items/tab.rb +54 -0
- data/lib/avo/resources/items/tab_group.rb +62 -0
- data/lib/avo/resources/resource_manager.rb +179 -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 +8 -12
- 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/view_inquirer.rb +36 -0
- data/lib/avo.rb +109 -24
- data/lib/generators/avo/action_generator.rb +8 -8
- data/lib/generators/avo/card_generator.rb +27 -0
- data/lib/generators/avo/concerns/parent_controller.rb +20 -0
- data/lib/generators/avo/controller_generator.rb +3 -0
- data/lib/generators/avo/eject_generator.rb +180 -15
- data/lib/generators/avo/field_generator.rb +49 -2
- data/lib/generators/avo/filter_generator.rb +8 -8
- data/lib/generators/avo/js/install_generator.rb +2 -2
- data/lib/generators/avo/resource_generator.rb +12 -9
- data/lib/generators/avo/scope_generator.rb +15 -0
- data/lib/generators/avo/tailwindcss/install_generator.rb +70 -26
- 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 +7 -3
- data/lib/generators/avo/templates/locales/avo.ar.yml +7 -6
- data/lib/generators/avo/templates/locales/avo.en.yml +6 -3
- data/lib/generators/avo/templates/locales/avo.es.yml +127 -0
- data/lib/generators/avo/templates/locales/avo.fr.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.nb.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.nn.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.pt.yml +3 -0
- data/lib/generators/avo/templates/locales/avo.ro.yml +8 -5
- data/lib/generators/avo/templates/locales/avo.tr.yml +3 -0
- data/lib/generators/avo/templates/resource/controller.tt +1 -1
- data/lib/generators/avo/templates/resource/resource.tt +7 -7
- data/lib/generators/avo/templates/resource_tools/partial.tt +2 -2
- 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/tailwindcss/Procfile.dev +1 -1
- data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
- data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
- data/lib/tasks/avo_tasks.rake +72 -4
- data/public/avo-assets/avo.base.css +1893 -1187
- data/public/avo-assets/avo.base.js +217 -305
- 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
- data/tailwind.custom.js +47 -0
- data/tailwind.preset.js +152 -0
- metadata +107 -114
- 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/item_switcher_component.html.erb +0 -27
- data/app/components/avo/item_switcher_component.rb +0 -48
- 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/tags_field_controller.js +0 -127
- data/app/javascript/js/controllers/toggle_panel_controller.js +0 -18
- 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/_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_editable_controls.rb +0 -34
- data/lib/avo/concerns/has_fields.rb +0 -334
- data/lib/avo/concerns/has_html_attributes.rb +0 -108
- data/lib/avo/concerns/policy_helpers.rb +0 -31
- data/lib/avo/concerns/visible_in_dashboard.rb +0 -31
- 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/js/avo.custom.js +0 -2
- data/lib/generators/avo/templates/standalone_action.tt +0 -8
- /data/app/assets/stylesheets/css/{tags.css → fields/tags.css} +0 -0
data/README.md
CHANGED
@@ -13,7 +13,7 @@ Avo is a beautiful next-generation framework that empowers you, the developer, t
|
|
13
13
|
|
14
14
|
## Get started
|
15
15
|
|
16
|
-
⚡️ **Install**: [docs.avohq.io/
|
16
|
+
⚡️ **Install**: [docs.avohq.io/3.0/installation](https://docs.avohq.io/3.0/installation.html)\
|
17
17
|
✨ **Website**: [avohq.io](https://avohq.io)\
|
18
18
|
📚 **Documentation**: [docs.avohq.io](https://docs.avohq.io)\
|
19
19
|
🗺 **Roadmap**: [GitHub Roadmap](https://github.com/orgs/avo-hq/projects/3)\
|
@@ -26,23 +26,23 @@ Avo is a beautiful next-generation framework that empowers you, the developer, t
|
|
26
26
|
## Features
|
27
27
|
|
28
28
|
- **Powered by Hotwire** - Rails ❤️ Hotwire
|
29
|
-
- **Code driven configuration** - Configure your Rails dashboard entirely by writing Ruby code. [docs](https://docs.avohq.io/
|
29
|
+
- **Code driven configuration** - Configure your Rails dashboard entirely by writing Ruby code. [docs](https://docs.avohq.io/3.0/resources.html#defining-resources)
|
30
30
|
- **Resource Management** - Create a CRUD interface for Active Record from one command. No more copy-pasting view and controller files around.
|
31
|
-
- **Dashboard widgets and metrics** - Create metrics, charts, and custom cards amazingly fast. [docs](https://docs.avohq.io/
|
32
|
-
- **Resource Search** - Quickly run a search through one or more resources at once. [docs](https://docs.avohq.io/
|
33
|
-
- **Associations enabled** - Link your models together with all types of associations (belongs_to, has_many, polymorphic, etc.). [docs](https://docs.avohq.io/
|
34
|
-
- **Fuzzy-searchable associations** - Do you have a ton of records and don't want to scroll through a big dropdown? Avo's got you covered. [docs](https://docs.avohq.io/
|
35
|
-
- **Active Storage support** - Amazingly easy, **one-line**, single or multi-file integration with **ActiveStorage**. [docs](https://docs.avohq.io/
|
36
|
-
- **Records Ordering** - Sorting records is a breeze. [docs](https://docs.avohq.io/
|
37
|
-
- **Grid view** - Beautiful card layout to showcase your content. [docs](https://docs.avohq.io/
|
38
|
-
- **Actions** - Run custom actions to one or more of your resources with as little as pressing a button 💪 [docs](https://docs.avohq.io/
|
39
|
-
- **Filters** - Write your own custom filters to quickly segment your data. [docs](https://docs.avohq.io/
|
40
|
-
- **Keeps your app clean** - You don't need to change your app to use Avo. Drop it in your existing app or add it to a new one and you're done 🙌 [docs](https://docs.avohq.io/
|
41
|
-
- **Custom fields**- No worries if we missed a field you need. Generate a custom field in a jiffy. [docs](https://docs.avohq.io/
|
42
|
-
- **Custom tools** - Break out of the CRUD. Do you need to add a page with something completely new? You've got it! [docs](https://docs.avohq.io/
|
43
|
-
- **Authorization** - Leverage Pundit policies to build a robust and scalable authorization system. [docs](https://docs.avohq.io/
|
44
|
-
- **Localization** - Have it available in any language you need. [docs](https://docs.avohq.io/
|
45
|
-
- **No asset pipeline pollution** - Bring your own asset pipeline. [docs](https://docs.avohq.io/
|
31
|
+
- **Dashboard widgets and metrics** - Create metrics, charts, and custom cards amazingly fast. [docs](https://docs.avohq.io/3.0/dashboards.html)
|
32
|
+
- **Resource Search** - Quickly run a search through one or more resources at once. [docs](https://docs.avohq.io/3.0/search.html)
|
33
|
+
- **Associations enabled** - Link your models together with all types of associations (belongs_to, has_many, polymorphic, etc.). [docs](https://docs.avohq.io/3.0/associations.html)
|
34
|
+
- **Fuzzy-searchable associations** - Do you have a ton of records and don't want to scroll through a big dropdown? Avo's got you covered. [docs](https://docs.avohq.io/3.0/associations/belongs_to.html#searchable)
|
35
|
+
- **Active Storage support** - Amazingly easy, **one-line**, single or multi-file integration with **ActiveStorage**. [docs](https://docs.avohq.io/3.0/fields/file.html)
|
36
|
+
- **Records Ordering** - Sorting records is a breeze. [docs](https://docs.avohq.io/3.0/records-reordering.html)
|
37
|
+
- **Grid view** - Beautiful card layout to showcase your content. [docs](https://docs.avohq.io/3.0/grid-view.html)
|
38
|
+
- **Actions** - Run custom actions to one or more of your resources with as little as pressing a button 💪 [docs](https://docs.avohq.io/3.0/actions.html)
|
39
|
+
- **Filters** - Write your own custom filters to quickly segment your data. [docs](https://docs.avohq.io/3.0/filters.html)
|
40
|
+
- **Keeps your app clean** - You don't need to change your app to use Avo. Drop it in your existing app or add it to a new one and you're done 🙌 [docs](https://docs.avohq.io/3.0/installation.html)
|
41
|
+
- **Custom fields**- No worries if we missed a field you need. Generate a custom field in a jiffy. [docs](https://docs.avohq.io/3.0/custom-fields.html)
|
42
|
+
- **Custom tools** - Break out of the CRUD. Do you need to add a page with something completely new? You've got it! [docs](https://docs.avohq.io/3.0/custom-tools.html)
|
43
|
+
- **Authorization** - Leverage Pundit policies to build a robust and scalable authorization system. [docs](https://docs.avohq.io/3.0/authorization.html)
|
44
|
+
- **Localization** - Have it available in any language you need. [docs](https://docs.avohq.io/3.0/localization.html)
|
45
|
+
- **No asset pipeline pollution** - Bring your own asset pipeline. [docs](https://docs.avohq.io/3.0/custom-asset-pipeline.html)
|
46
46
|
- **Mobile interface** - Check your data on the go from any mobile device.
|
47
47
|
- **Tabbed interface** - Conditionally show the data you need
|
48
48
|
- **Menu builder** - Group and surface information as you need to
|
@@ -56,7 +56,7 @@ For more up-to-date info check out our 🗺 [Roadmap](https://github.com/orgs/av
|
|
56
56
|
|
57
57
|
# Installation
|
58
58
|
|
59
|
-
Use this RailsBytes template to get started quick `rails app:template LOCATION='https://avohq.io/app-template'`. If you need a more detailed guide, follow [this page](https://docs.avohq.io/
|
59
|
+
Use this RailsBytes template to get started quick `rails app:template LOCATION='https://avohq.io/app-template'`. If you need a more detailed guide, follow [this page](https://docs.avohq.io/3.0/installation.html).
|
60
60
|
|
61
61
|
# Contributing
|
62
62
|
|
@@ -64,7 +64,7 @@ Please read [CONTRIBUTING.MD](./CONTRIBUTING.MD)
|
|
64
64
|
|
65
65
|
# Upgrade Guide
|
66
66
|
|
67
|
-
Please read the [UPGRADE_GUIDE.MD](https://docs.avohq.io/
|
67
|
+
Please read the [UPGRADE_GUIDE.MD](https://docs.avohq.io/3.0/upgrade.html)
|
68
68
|
|
69
69
|
# Release schedule
|
70
70
|
|
@@ -81,14 +81,6 @@ Please read the [RELEASE.MD](./RELEASE.MD)
|
|
81
81
|
|
82
82
|
<table>
|
83
83
|
<tr>
|
84
|
-
<td>
|
85
|
-
<a href="https://equipetechnique.com/?utm_source=github&utm_medium=link&utm_campaign=avo" target="_blank">
|
86
|
-
<picture>
|
87
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://avohq.io/img/sponsors/ET-dark.jpeg">
|
88
|
-
<img alt="Equipe Technique Busines Sponsor" src="https://avohq.io/img/sponsors/ET-light.jpeg" width="180px">
|
89
|
-
</picture>
|
90
|
-
</a>
|
91
|
-
</td>
|
92
84
|
<td>
|
93
85
|
<a href="https://www.greenhats.com/?utm_source=github&utm_medium=link&utm_campaign=avo" target="_blank">
|
94
86
|
<picture>
|
data/Rakefile
CHANGED
@@ -19,12 +19,12 @@
|
|
19
19
|
@import './css/scrollbar.css';
|
20
20
|
@import './css/sidebar.css';
|
21
21
|
@import './css/spinner.css';
|
22
|
-
@import './css/tags.css';
|
23
22
|
|
24
23
|
@import './css/fields/status.css';
|
25
24
|
@import './css/fields/code.css';
|
26
25
|
@import './css/fields/progress.css';
|
27
26
|
@import './css/fields/trix.css';
|
27
|
+
@import './css/fields/tags.css';
|
28
28
|
|
29
29
|
@import 'tailwindcss/components';
|
30
30
|
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" fill="currentColor"><path d="M432 432h-33.32l-135-389.24A16 16 0 0 0 248.55 32h-49.1a16 16 0 0 0-15.12 10.76L49.32 432H16a16 16 0 0 0-16 16v16a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-16a16 16 0 0 0-16-16h-35.44l33.31-96h164.26l33.31 96H304a16 16 0 0 0-16 16v16a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-16a16 16 0 0 0-16-16zM158.53 288L224 99.31 289.47 288z"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="21" height="9" role="presentation"><g fill="none" fill-rule="evenodd"><path fill="#C9CBCF" fill-opacity="1" d="M1 9.092h19l-6.402-6.74c-1.717-1.806-4.485-1.8-6.196 0L1 9.093zM20.342 8l-6.02-6.336c-2.108-2.22-5.538-2.218-7.645 0L.658 8h19.684z"></path><path fill="currentcolor" d="M7.402 2.353c1.711-1.801 4.48-1.807 6.196 0L20 9.093H1l6.402-6.74z"></path></g></svg>
|
@@ -1,26 +1,40 @@
|
|
1
1
|
<div class="relative flex flex-col w-full sm:w-auto js-actions-dropdown"
|
2
|
-
data-
|
2
|
+
data-component-name="<%= self.class.to_s.underscore %>"
|
3
|
+
data-controller="toggle actions-picker"
|
3
4
|
data-actions-picker-enabled-class="text-black hover:bg-primary-500 hover:text-white"
|
4
5
|
data-actions-picker-disabled-class="cursor-wait text-gray-500"
|
6
|
+
data-resource-name="<%= @resource.class.to_s %>"
|
7
|
+
<% if @resource.record.present? %> data-record-id="<%= @resource.record.id %>" <% end %>
|
5
8
|
>
|
6
9
|
<%= a_button style: @style,
|
7
10
|
type: :button,
|
8
11
|
color: @color,
|
12
|
+
size: size,
|
9
13
|
class: "focus:outline-none",
|
10
14
|
icon: 'arrow-circle-right',
|
11
15
|
icon_class: 'transform rotate-90',
|
12
|
-
'data-action': "click->toggle
|
16
|
+
'data-action': "click->toggle#togglePanel",
|
13
17
|
'data-actions-dropdown-button': @resource.model_key do %>
|
14
18
|
<%= label %>
|
15
19
|
<% end %>
|
16
20
|
<div
|
17
21
|
class="absolute flex inset-auto xl:right-0 top-full bg-white w-full sm:w-auto sm:min-w-[300px] mt-2 z-40 shadow-modal rounded overflow-hidden hidden"
|
18
|
-
data-toggle-
|
22
|
+
data-toggle-target="panel"
|
23
|
+
data-controller="actions-overflow"
|
24
|
+
data-actions-overflow-panel-list-value="<%= !@as_row_control %>"
|
25
|
+
data-actions-overflow-target="content"
|
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"
|
19
32
|
>
|
20
|
-
<div class="w-full space divide-y">
|
33
|
+
<div data-target="actions-list" class="w-full space divide-y">
|
21
34
|
<% actions.each_with_index do |action, index| %>
|
22
|
-
<%= link_to action_path(action
|
35
|
+
<%= link_to action_path(action),
|
23
36
|
data: {
|
37
|
+
action_name: action.action_name,
|
24
38
|
'turbo-frame': 'actions_show',
|
25
39
|
'action': 'click->actions-picker#visitAction',
|
26
40
|
'actions-picker-target': action.standalone ? 'standaloneAction' : 'resourceAction',
|
@@ -2,17 +2,19 @@
|
|
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
|
11
|
-
@exclude = exclude
|
11
|
+
@exclude = Array(exclude)
|
12
12
|
@include = include
|
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
|
@@ -51,24 +54,41 @@ class Avo::ActionsComponent < ViewComponent::Base
|
|
51
54
|
private
|
52
55
|
|
53
56
|
def on_record_page?
|
54
|
-
@view.in?([
|
57
|
+
@view.in?(%w[show edit new])
|
55
58
|
end
|
56
59
|
|
57
60
|
def on_index_page?
|
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.to_param,
|
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 md:w-full <% 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,6 +36,7 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
|
|
35
36
|
@full_width = full_width
|
36
37
|
@label = label
|
37
38
|
@resource = resource
|
39
|
+
@short = short
|
38
40
|
@stacked = stacked
|
39
41
|
@style = style
|
40
42
|
@view = view
|
@@ -52,26 +54,14 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
|
|
52
54
|
@label || @field.name
|
53
55
|
end
|
54
56
|
|
55
|
-
|
56
|
-
view == :show
|
57
|
-
end
|
58
|
-
|
59
|
-
def on_edit?
|
60
|
-
view == :edit
|
61
|
-
end
|
57
|
+
delegate :show?, :edit?, to: :view, prefix: :on
|
62
58
|
|
63
59
|
def help
|
64
|
-
|
65
|
-
|
66
|
-
if help_value.respond_to?(:call)
|
67
|
-
return Avo::Hosts::ResourceViewRecordHost.new(block: help_value, record: record, resource: resource, view: view).handle
|
68
|
-
end
|
69
|
-
|
70
|
-
help_value
|
60
|
+
Avo::ExecutionContext.new(target: @help || @field.help, record: record, resource: resource, view: view).handle
|
71
61
|
end
|
72
62
|
|
73
63
|
def record
|
74
|
-
resource.present? ? resource.
|
64
|
+
resource.present? ? resource.record : nil
|
75
65
|
end
|
76
66
|
|
77
67
|
def data
|
@@ -112,6 +102,10 @@ class Avo::FieldWrapperComponent < ViewComponent::Base
|
|
112
102
|
@compact
|
113
103
|
end
|
114
104
|
|
105
|
+
def short?
|
106
|
+
@short
|
107
|
+
end
|
108
|
+
|
115
109
|
def full_width?
|
116
110
|
@full_width
|
117
111
|
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 %>
|