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
@@ -1,36 +1,29 @@
|
|
1
1
|
module Avo
|
2
2
|
class BaseResourceTool
|
3
|
-
|
4
|
-
|
3
|
+
prepend Avo::Concerns::IsResourceItem
|
4
|
+
|
5
|
+
include Avo::Concerns::HasItemType
|
6
|
+
include Avo::Concerns::IsVisible
|
7
|
+
include Avo::Concerns::VisibleInDifferentViews
|
5
8
|
|
6
9
|
class_attribute :name
|
7
10
|
class_attribute :partial
|
8
|
-
class_attribute :item_type, default: :tool
|
9
11
|
|
10
12
|
attr_accessor :params
|
11
|
-
attr_accessor :resource
|
12
|
-
attr_accessor :view
|
13
13
|
|
14
14
|
def initialize(**args)
|
15
15
|
# Set the visibility
|
16
|
-
|
17
|
-
|
18
|
-
show_on args[:show_on] if args[:show_on].present?
|
19
|
-
hide_on args[:hide_on] if args[:hide_on].present?
|
20
|
-
only_on args[:only_on] if args[:only_on].present?
|
21
|
-
except_on args[:except_on] if args[:except_on].present?
|
22
|
-
end
|
16
|
+
only_on Avo.configuration.resource_default_view
|
23
17
|
|
24
|
-
|
25
|
-
@view = view if view.present?
|
18
|
+
@args = args
|
26
19
|
|
27
|
-
|
20
|
+
post_initialize if respond_to?(:post_initialize)
|
28
21
|
end
|
29
22
|
|
30
23
|
def partial
|
31
24
|
return self.class.partial if self.class.partial.present?
|
32
25
|
|
33
|
-
|
26
|
+
self.class.to_s.underscore
|
34
27
|
end
|
35
28
|
end
|
36
29
|
end
|
@@ -50,7 +50,7 @@ module Avo
|
|
50
50
|
when Symbol
|
51
51
|
context.send(name)
|
52
52
|
when Proc
|
53
|
-
|
53
|
+
Avo::ExecutionContext.new(target: name, context: context).handle
|
54
54
|
else
|
55
55
|
name.to_s
|
56
56
|
end
|
@@ -61,7 +61,7 @@ module Avo
|
|
61
61
|
when Symbol
|
62
62
|
context.send(path)
|
63
63
|
when Proc
|
64
|
-
|
64
|
+
Avo::ExecutionContext.new(target: path, context: context).handle
|
65
65
|
else
|
66
66
|
context.url_for(path)
|
67
67
|
end
|
@@ -1,28 +1,24 @@
|
|
1
1
|
module Avo
|
2
2
|
module Concerns
|
3
|
-
module
|
3
|
+
module CanReplaceItems
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
class_attribute :
|
7
|
+
class_attribute :temporary_items
|
8
8
|
end
|
9
9
|
|
10
10
|
class_methods do
|
11
11
|
def with_temporary_items(&block)
|
12
12
|
# back-up the previous items
|
13
|
-
self.
|
14
|
-
|
15
|
-
self.items_holder = Avo::ItemsHolder.new
|
16
|
-
|
17
|
-
instance_eval(&block)
|
13
|
+
self.temporary_items = block
|
18
14
|
end
|
19
15
|
|
20
16
|
def restore_items_from_backup
|
21
|
-
self.
|
17
|
+
self.temporary_items = nil
|
22
18
|
end
|
23
19
|
|
24
20
|
def with_new_items(&block)
|
25
|
-
self.items_holder = Avo::
|
21
|
+
self.items_holder = Avo::Resources::Items::Holder.new
|
26
22
|
|
27
23
|
instance_eval(&block)
|
28
24
|
end
|
@@ -33,9 +33,11 @@ module Avo
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def cache_resource_filters?
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
Avo::ExecutionContext.new(
|
37
|
+
target: Avo.configuration.cache_resource_filters,
|
38
|
+
current_user: current_user,
|
39
|
+
resource: @resource
|
40
|
+
).handle
|
39
41
|
end
|
40
42
|
end
|
41
43
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Avo
|
2
|
+
module Concerns
|
3
|
+
module HasControls
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
include Avo::Resources::Controls
|
6
|
+
|
7
|
+
included do
|
8
|
+
class_attribute :show_controls
|
9
|
+
class_attribute :edit_controls
|
10
|
+
class_attribute :index_controls
|
11
|
+
class_attribute :row_controls
|
12
|
+
end
|
13
|
+
|
14
|
+
def render_show_controls
|
15
|
+
[BackButton.new, DeleteButton.new, DetachButton.new, ActionsList.new, EditButton.new]
|
16
|
+
end
|
17
|
+
|
18
|
+
def render_edit_controls
|
19
|
+
[BackButton.new(label: I18n.t("avo.cancel").capitalize), DeleteButton.new, ActionsList.new, SaveButton.new]
|
20
|
+
end
|
21
|
+
|
22
|
+
def render_index_controls(item:)
|
23
|
+
[AttachButton.new(item: item), ActionsList.new(as_index_control: true), CreateButton.new(item: item)]
|
24
|
+
end
|
25
|
+
|
26
|
+
def render_row_controls(item:)
|
27
|
+
[
|
28
|
+
OrderControls.new,
|
29
|
+
ShowButton.new(item: item),
|
30
|
+
EditButton.new(item: item),
|
31
|
+
DetachButton.new(item: item),
|
32
|
+
DeleteButton.new(item: item)
|
33
|
+
]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Adds the ability to set the visibility of an item in the execution context.
|
2
|
+
module Avo
|
3
|
+
module Concerns
|
4
|
+
module HasDescription
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
class_methods do
|
8
|
+
attr_accessor :description
|
9
|
+
end
|
10
|
+
|
11
|
+
def description
|
12
|
+
Avo::ExecutionContext.new(target: @description || self.class.description, **description_attributes).handle
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# Override this method to add custom attributes to the description execution context.
|
18
|
+
def description_attributes
|
19
|
+
{}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# This concern helps us figure out what kind of items (field, tool, tab_group, or panel) have been passed to the resource or action.
|
2
|
+
module Avo
|
3
|
+
module Concerns
|
4
|
+
module HasItemType
|
5
|
+
def is_field?
|
6
|
+
self.class.ancestors.include?(Avo::Fields::BaseField)
|
7
|
+
end
|
8
|
+
|
9
|
+
def is_heading?
|
10
|
+
self.class.ancestors.include?(Avo::Fields::HeadingField)
|
11
|
+
end
|
12
|
+
|
13
|
+
def is_panel?
|
14
|
+
self.class.ancestors.include?(Avo::Resources::Items::Panel)
|
15
|
+
end
|
16
|
+
|
17
|
+
def is_main_panel?
|
18
|
+
self.class.ancestors.include?(Avo::Resources::Items::MainPanel)
|
19
|
+
end
|
20
|
+
|
21
|
+
def is_tool?
|
22
|
+
self.class.ancestors.include?(Avo::BaseResourceTool)
|
23
|
+
end
|
24
|
+
|
25
|
+
def is_tab?
|
26
|
+
self.class.ancestors.include?(Avo::Resources::Items::Tab)
|
27
|
+
end
|
28
|
+
|
29
|
+
def is_tab_group?
|
30
|
+
self.class.ancestors.include?(Avo::Resources::Items::TabGroup)
|
31
|
+
end
|
32
|
+
|
33
|
+
def is_sidebar?
|
34
|
+
self.class.ancestors.include?(Avo::Resources::Items::Sidebar)
|
35
|
+
end
|
36
|
+
|
37
|
+
def is_row?
|
38
|
+
self.class.respond_to?(:item_type) && self.class.item_type == :row
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,325 @@
|
|
1
|
+
module Avo
|
2
|
+
module Concerns
|
3
|
+
module HasItems
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
class_methods do
|
7
|
+
def deprecated_dsl_api(name, method)
|
8
|
+
message = "This API was deprecated. Please use the `#{name}` method inside the `#{method}` method."
|
9
|
+
raise DeprecatedAPIError.new message
|
10
|
+
end
|
11
|
+
|
12
|
+
# DSL methods
|
13
|
+
def field(name, as: :text, **args, &block)
|
14
|
+
deprecated_dsl_api __method__, "fields"
|
15
|
+
end
|
16
|
+
|
17
|
+
def panel(name = nil, **args, &block)
|
18
|
+
deprecated_dsl_api __method__, "fields"
|
19
|
+
end
|
20
|
+
|
21
|
+
def row(**args, &block)
|
22
|
+
deprecated_dsl_api __method__, "fields"
|
23
|
+
end
|
24
|
+
|
25
|
+
def tabs(**args, &block)
|
26
|
+
deprecated_dsl_api __method__, "fields"
|
27
|
+
end
|
28
|
+
|
29
|
+
def tool(klass, **args)
|
30
|
+
deprecated_dsl_api __method__, "fields"
|
31
|
+
end
|
32
|
+
|
33
|
+
def heading(body, **args)
|
34
|
+
deprecated_dsl_api __method__, "fields"
|
35
|
+
end
|
36
|
+
|
37
|
+
def sidebar(**args, &block)
|
38
|
+
deprecated_dsl_api __method__, "fields"
|
39
|
+
end
|
40
|
+
# END DSL methods
|
41
|
+
end
|
42
|
+
|
43
|
+
attr_writer :items_holder
|
44
|
+
|
45
|
+
delegate :invalid_fields, to: :items_holder
|
46
|
+
|
47
|
+
delegate :field, to: :items_holder
|
48
|
+
delegate :panel, to: :items_holder
|
49
|
+
delegate :row, to: :items_holder
|
50
|
+
delegate :tabs, to: :items_holder
|
51
|
+
delegate :tool, to: :items_holder
|
52
|
+
delegate :heading, to: :items_holder
|
53
|
+
delegate :sidebar, to: :items_holder
|
54
|
+
|
55
|
+
def items_holder
|
56
|
+
@items_holder || Avo::Resources::Items::Holder.new
|
57
|
+
end
|
58
|
+
|
59
|
+
# def items
|
60
|
+
# items_holder.items
|
61
|
+
# end
|
62
|
+
|
63
|
+
def invalid_fields
|
64
|
+
items_holder.invalid_fields
|
65
|
+
end
|
66
|
+
|
67
|
+
def fields(**args)
|
68
|
+
self.class.fields(**args)
|
69
|
+
end
|
70
|
+
|
71
|
+
def tab_groups
|
72
|
+
self.class.tab_groups
|
73
|
+
end
|
74
|
+
|
75
|
+
# Dives deep into panels and tabs to fetch all the fields for a resource.
|
76
|
+
def only_fields(only_root: false)
|
77
|
+
fields = []
|
78
|
+
|
79
|
+
items.each do |item|
|
80
|
+
next if item.nil?
|
81
|
+
|
82
|
+
unless only_root
|
83
|
+
# Dive into panels to fetch their fields
|
84
|
+
if item.is_panel?
|
85
|
+
fields << extract_fields_from_items(item)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Dive into tabs to fetch their fields
|
89
|
+
if item.is_tab_group?
|
90
|
+
item.items.map do |tab|
|
91
|
+
fields << extract_fields_from_items(tab)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Dive into sidebar to fetch their fields
|
96
|
+
if item.is_sidebar?
|
97
|
+
fields << extract_fields_from_items(item)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
if item.is_field?
|
102
|
+
fields << item
|
103
|
+
end
|
104
|
+
|
105
|
+
if item.is_row?
|
106
|
+
fields << extract_fields_from_items(tab)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
fields.flatten
|
111
|
+
end
|
112
|
+
|
113
|
+
def get_field_definitions(only_root: false)
|
114
|
+
only_fields(only_root: only_root).map do |field|
|
115
|
+
field.hydrate(resource: self, user: user, view: view)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def get_preview_fields
|
120
|
+
get_field_definitions.select do |field|
|
121
|
+
field.visible_in_view?(view: :preview)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def get_fields(panel: nil, reflection: nil, only_root: false)
|
126
|
+
fields = get_field_definitions(only_root: only_root)
|
127
|
+
.select do |field|
|
128
|
+
# Get the fields for this view
|
129
|
+
field.visible_in_view?(view: view)
|
130
|
+
end
|
131
|
+
.select do |field|
|
132
|
+
field.visible?
|
133
|
+
end
|
134
|
+
.select do |field|
|
135
|
+
is_valid = true
|
136
|
+
|
137
|
+
# Strip out the reflection field in index queries with a parent association.
|
138
|
+
if reflection.present?
|
139
|
+
# regular non-polymorphic association
|
140
|
+
# we're matching the reflection inverse_of foriegn key with the field's foreign_key
|
141
|
+
if field.is_a?(Avo::Fields::BelongsToField)
|
142
|
+
if field.respond_to?(:foreign_key) &&
|
143
|
+
reflection.inverse_of.present? &&
|
144
|
+
reflection.inverse_of.respond_to?(:foreign_key) &&
|
145
|
+
reflection.inverse_of.foreign_key == field.foreign_key
|
146
|
+
is_valid = false
|
147
|
+
end
|
148
|
+
|
149
|
+
# polymorphic association
|
150
|
+
if field.respond_to?(:foreign_key) &&
|
151
|
+
field.is_polymorphic? &&
|
152
|
+
reflection.respond_to?(:polymorphic?) &&
|
153
|
+
reflection.inverse_of.respond_to?(:foreign_key) &&
|
154
|
+
reflection.inverse_of.foreign_key == field.reflection.foreign_key
|
155
|
+
is_valid = false
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
is_valid
|
161
|
+
end
|
162
|
+
|
163
|
+
if panel.present?
|
164
|
+
fields = fields.select do |field|
|
165
|
+
field.panel_name == panel
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# hydrate_fields fields
|
170
|
+
fields.each do |field|
|
171
|
+
field.hydrate(record: @record, view: @view, resource: self)
|
172
|
+
end
|
173
|
+
|
174
|
+
fields
|
175
|
+
end
|
176
|
+
|
177
|
+
def get_field(id)
|
178
|
+
get_field_definitions.find do |f|
|
179
|
+
f.id == id.to_sym
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def tools
|
184
|
+
return [] if self.class.tools.blank?
|
185
|
+
|
186
|
+
items
|
187
|
+
.select do |item|
|
188
|
+
next if item.nil?
|
189
|
+
|
190
|
+
item.is_tool?
|
191
|
+
end
|
192
|
+
.map do |tool|
|
193
|
+
tool.hydrate view: view
|
194
|
+
tool
|
195
|
+
end
|
196
|
+
.select do |item|
|
197
|
+
item.visible_in_view?(view: view)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# Separates the fields that are in a panel and those that are just hanging out.
|
202
|
+
# Take the ones that aren't placed into a panel and add them to the "default" panel.
|
203
|
+
# This is to keep compatibility with the versions before 2.10 when you didn't have the ability to add fields to panels.
|
204
|
+
def get_items
|
205
|
+
panelless_items = []
|
206
|
+
panelfull_items = []
|
207
|
+
|
208
|
+
visible_items
|
209
|
+
.each do |item|
|
210
|
+
if item.is_field?
|
211
|
+
if item.has_own_panel?
|
212
|
+
panelfull_items << item
|
213
|
+
else
|
214
|
+
panelless_items << item
|
215
|
+
end
|
216
|
+
else
|
217
|
+
panelfull_items << item
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
# Make sure all tabs panelfull_items are setted as inside tabs
|
222
|
+
panelfull_items.grep(Avo::Resources::Items::TabGroup).each do |tab_group|
|
223
|
+
tab_group.items.grep(Avo::Resources::Items::Tab).each do |tab|
|
224
|
+
tab.items.grep(Avo::Resources::Items::Panel).each do |panel|
|
225
|
+
set_target_to_top panel.items.grep(Avo::Fields::BelongsToField)
|
226
|
+
|
227
|
+
panel.items.grep(Avo::Resources::Items::Row).each do |row|
|
228
|
+
set_target_to_top row.items.grep(Avo::Fields::BelongsToField)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# Add all the panelles fields to a new panel
|
235
|
+
main_panel_holder = Avo::Resources::Items::Holder.new
|
236
|
+
main_panel_holder.items = panelless_items
|
237
|
+
|
238
|
+
# Add that panel to the main panel
|
239
|
+
main_panel = Avo::Resources::Items::MainPanel.new
|
240
|
+
main_panel.items_holder = main_panel_holder
|
241
|
+
|
242
|
+
# Return all the items but this time with all the panelless ones inside the main panel
|
243
|
+
[main_panel, *panelfull_items]
|
244
|
+
end
|
245
|
+
|
246
|
+
def items
|
247
|
+
if items_holder.present?
|
248
|
+
items_holder.items
|
249
|
+
else
|
250
|
+
[]
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def visible_items
|
255
|
+
items
|
256
|
+
.map do |item|
|
257
|
+
if view.present?
|
258
|
+
res = self.class.ancestors.include?(Avo::BaseResource) ? self : resource
|
259
|
+
item.hydrate(view: view, resource: res)
|
260
|
+
end
|
261
|
+
|
262
|
+
item
|
263
|
+
end
|
264
|
+
.select do |item|
|
265
|
+
item.visible?
|
266
|
+
end
|
267
|
+
.select do |item|
|
268
|
+
if item.respond_to?(:visible_in_view?)
|
269
|
+
item.visible_in_view? view: view
|
270
|
+
else
|
271
|
+
true
|
272
|
+
end
|
273
|
+
end
|
274
|
+
.select do |item|
|
275
|
+
# On location field we can have field coordinates and setters with different names like latitude and longitude
|
276
|
+
if !item.is_a?(Avo::Fields::LocationField) && !item.is_heading? && view.in?([:edit, :update, :new, :create])
|
277
|
+
if item.respond_to?(:id)
|
278
|
+
item.resource.record.respond_to?("#{item.id}=")
|
279
|
+
else
|
280
|
+
true
|
281
|
+
end
|
282
|
+
else
|
283
|
+
true
|
284
|
+
end
|
285
|
+
end
|
286
|
+
.select do |item|
|
287
|
+
# Check if the user is authorized to view it.
|
288
|
+
# This is usually used for has_* fields
|
289
|
+
if item.respond_to? :authorized?
|
290
|
+
item.authorized?
|
291
|
+
else
|
292
|
+
true
|
293
|
+
end
|
294
|
+
end
|
295
|
+
.compact
|
296
|
+
end
|
297
|
+
|
298
|
+
def is_empty?
|
299
|
+
visible_items.blank?
|
300
|
+
end
|
301
|
+
|
302
|
+
private
|
303
|
+
|
304
|
+
def set_target_to_top(fields)
|
305
|
+
fields.each do |field|
|
306
|
+
field.target = :_top
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def extract_fields_from_items(thing)
|
311
|
+
fields = []
|
312
|
+
|
313
|
+
thing.items.each do |item|
|
314
|
+
if item.is_field?
|
315
|
+
fields << item
|
316
|
+
elsif item.is_panel? || item.is_row?
|
317
|
+
fields << extract_fields_from_items(item)
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
fields
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
@@ -2,42 +2,30 @@
|
|
2
2
|
module Avo
|
3
3
|
module Concerns
|
4
4
|
module IsResourceItem
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
self
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
self.class.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
def is_tab_group?
|
32
|
-
self.class.item_type == :tab_group
|
33
|
-
end
|
34
|
-
|
35
|
-
def is_sidebar?
|
36
|
-
self.class.item_type == :sidebar
|
37
|
-
end
|
38
|
-
|
39
|
-
def is_row?
|
40
|
-
self.class.item_type == :row
|
5
|
+
# These attributes are required to be hydrated in order to properly find the visible_items
|
6
|
+
attr_accessor :resource
|
7
|
+
attr_accessor :view
|
8
|
+
|
9
|
+
def hydrate(**args)
|
10
|
+
args.each do |key, value|
|
11
|
+
if respond_to?("#{key}=")
|
12
|
+
send("#{key}=", value)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the final state of if an item is visible or not
|
20
|
+
# For items that have children it checks to see if it contains any visible children.
|
21
|
+
def visible?
|
22
|
+
# For items that may contains other items like tabs and panels we should also check
|
23
|
+
# if any on their children have visible items.
|
24
|
+
if self.class.ancestors.include?(Avo::Concerns::HasItems)
|
25
|
+
return false unless visible_items.any?
|
26
|
+
end
|
27
|
+
|
28
|
+
super
|
41
29
|
end
|
42
30
|
end
|
43
31
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Adds the ability to set the visibility of an item in the execution context.
|
2
|
+
module Avo
|
3
|
+
module Concerns
|
4
|
+
module IsVisible
|
5
|
+
attr_accessor :visible
|
6
|
+
|
7
|
+
def visible?
|
8
|
+
# Default to true
|
9
|
+
return true if visible.nil?
|
10
|
+
|
11
|
+
Avo::ExecutionContext.new(target: visible, resource: @resource).handle
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|