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
@@ -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
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Avo
|
2
|
+
module Concerns
|
3
|
+
module BorrowItemsHolder
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
attr_reader :items_holder
|
8
|
+
end
|
9
|
+
|
10
|
+
class_methods do
|
11
|
+
def parse_block(parent:, **args, &block)
|
12
|
+
# item = Avo::Resources::Items:: ...
|
13
|
+
item = new(parent: parent, **args)
|
14
|
+
|
15
|
+
# Borrow the current items holder to the parent (parent = Action || Resource, etc.)
|
16
|
+
# Save parent's items holder to restore it after the block is parsed
|
17
|
+
# This is useful when you execute parent's methods like `some_fields_method` inside some DSL block.
|
18
|
+
# When you do that, Docile will not find the method in the current object (item), but in the parent.
|
19
|
+
# So we need to temporarily replace the parent's items holder with the current one because the parent's methods
|
20
|
+
# will be executed in the parent's context.
|
21
|
+
# For more context: https://github.com/ms-ati/docile/issues/107
|
22
|
+
parent_item_holder = parent.items_holder
|
23
|
+
parent.items_holder = item.items_holder
|
24
|
+
|
25
|
+
dsl_evaluation = Docile.dsl_eval(item, &block).build
|
26
|
+
|
27
|
+
# Restore the parent's items holder
|
28
|
+
parent.items_holder = parent_item_holder
|
29
|
+
|
30
|
+
dsl_evaluation
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
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
|
@@ -26,16 +26,18 @@ module Avo
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def filters_session_key
|
29
|
-
@filters_session_key ||=
|
29
|
+
@filters_session_key ||= "/filters/" << %w[
|
30
30
|
turbo_frame controller resource_name related_name
|
31
31
|
action id
|
32
|
-
].map { |key| params[key] }.compact.join(
|
32
|
+
].map { |key| params[key] }.compact.join("/")
|
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,18 @@
|
|
1
|
+
module Avo
|
2
|
+
module Concerns
|
3
|
+
module HasHelpers
|
4
|
+
def helpers
|
5
|
+
@helpers ||= Class.new do
|
6
|
+
def initialize
|
7
|
+
helper_names = ActionController::Base.all_helpers_from_path Rails.root.join("app", "helpers")
|
8
|
+
helpers = ActionController::Base.modules_for_helpers helper_names
|
9
|
+
|
10
|
+
helpers.each do |helper|
|
11
|
+
extend helper
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end.new
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
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,339 @@
|
|
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 sidebar(**args, &block)
|
34
|
+
deprecated_dsl_api __method__, "fields"
|
35
|
+
end
|
36
|
+
# END DSL methods
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_writer :items_holder
|
40
|
+
|
41
|
+
delegate :invalid_fields, to: :items_holder
|
42
|
+
|
43
|
+
delegate :field, to: :items_holder
|
44
|
+
delegate :panel, to: :items_holder
|
45
|
+
delegate :row, to: :items_holder
|
46
|
+
delegate :tabs, to: :items_holder
|
47
|
+
delegate :tool, to: :items_holder
|
48
|
+
delegate :heading, to: :items_holder
|
49
|
+
delegate :sidebar, to: :items_holder
|
50
|
+
delegate :main_panel, to: :items_holder
|
51
|
+
|
52
|
+
def items_holder
|
53
|
+
@items_holder || Avo::Resources::Items::Holder.new
|
54
|
+
end
|
55
|
+
|
56
|
+
# def items
|
57
|
+
# items_holder.items
|
58
|
+
# end
|
59
|
+
|
60
|
+
def invalid_fields
|
61
|
+
invalid_fields = items_holder.invalid_fields
|
62
|
+
|
63
|
+
items_holder.items.each do |item|
|
64
|
+
if item.respond_to? :items
|
65
|
+
invalid_fields += item.invalid_fields
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
invalid_fields
|
70
|
+
end
|
71
|
+
|
72
|
+
def fields(**args)
|
73
|
+
self.class.fields(**args)
|
74
|
+
end
|
75
|
+
|
76
|
+
def tab_groups
|
77
|
+
self.class.tab_groups
|
78
|
+
end
|
79
|
+
|
80
|
+
# Dives deep into panels and tabs to fetch all the fields for a resource.
|
81
|
+
def only_fields(only_root: false)
|
82
|
+
fields = []
|
83
|
+
|
84
|
+
items.each do |item|
|
85
|
+
next if item.nil?
|
86
|
+
|
87
|
+
unless only_root
|
88
|
+
# Dive into panels to fetch their fields
|
89
|
+
if item.is_panel?
|
90
|
+
fields << extract_fields_from_items(item)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Dive into tabs to fetch their fields
|
94
|
+
if item.is_tab_group?
|
95
|
+
item.items.map do |tab|
|
96
|
+
fields << extract_fields_from_items(tab)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Dive into sidebar to fetch their fields
|
101
|
+
if item.is_sidebar?
|
102
|
+
fields << extract_fields_from_items(item)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
if item.is_field?
|
107
|
+
fields << item
|
108
|
+
end
|
109
|
+
|
110
|
+
if item.is_row?
|
111
|
+
fields << extract_fields_from_items(tab)
|
112
|
+
end
|
113
|
+
|
114
|
+
if item.is_main_panel?
|
115
|
+
fields << extract_fields_from_items(item)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
fields.flatten
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_field_definitions(only_root: false)
|
123
|
+
only_fields(only_root: only_root).map do |field|
|
124
|
+
field.hydrate(resource: self, user: user, view: view)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def get_preview_fields
|
129
|
+
get_field_definitions.select do |field|
|
130
|
+
field.visible_in_view?(view: :preview)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def get_fields(panel: nil, reflection: nil, only_root: false)
|
135
|
+
fields = get_field_definitions(only_root: only_root)
|
136
|
+
.select do |field|
|
137
|
+
# Get the fields for this view
|
138
|
+
field.visible_in_view?(view: view)
|
139
|
+
end
|
140
|
+
.select do |field|
|
141
|
+
field.visible?
|
142
|
+
end
|
143
|
+
.select do |field|
|
144
|
+
is_valid = true
|
145
|
+
|
146
|
+
# Strip out the reflection field in index queries with a parent association.
|
147
|
+
if reflection.present?
|
148
|
+
# regular non-polymorphic association
|
149
|
+
# we're matching the reflection inverse_of foriegn key with the field's foreign_key
|
150
|
+
if field.is_a?(Avo::Fields::BelongsToField)
|
151
|
+
if field.respond_to?(:foreign_key) &&
|
152
|
+
reflection.inverse_of.present? &&
|
153
|
+
reflection.inverse_of.respond_to?(:foreign_key) &&
|
154
|
+
reflection.inverse_of.foreign_key == field.foreign_key
|
155
|
+
is_valid = false
|
156
|
+
end
|
157
|
+
|
158
|
+
# polymorphic association
|
159
|
+
if field.respond_to?(:foreign_key) &&
|
160
|
+
field.is_polymorphic? &&
|
161
|
+
reflection.respond_to?(:polymorphic?) &&
|
162
|
+
reflection.inverse_of.respond_to?(:foreign_key) &&
|
163
|
+
reflection.inverse_of.foreign_key == field.reflection.foreign_key
|
164
|
+
is_valid = false
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
is_valid
|
170
|
+
end
|
171
|
+
|
172
|
+
if panel.present?
|
173
|
+
fields = fields.select do |field|
|
174
|
+
field.panel_name == panel
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
# hydrate_fields fields
|
179
|
+
fields.each do |field|
|
180
|
+
field.hydrate(record: @record, view: @view, resource: self)
|
181
|
+
end
|
182
|
+
|
183
|
+
fields
|
184
|
+
end
|
185
|
+
|
186
|
+
def get_field(id)
|
187
|
+
get_field_definitions.find do |f|
|
188
|
+
f.id == id.to_sym
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def tools
|
193
|
+
return [] if self.class.tools.blank?
|
194
|
+
|
195
|
+
items
|
196
|
+
.select do |item|
|
197
|
+
next if item.nil?
|
198
|
+
|
199
|
+
item.is_tool?
|
200
|
+
end
|
201
|
+
.map do |tool|
|
202
|
+
tool.hydrate view: view
|
203
|
+
tool
|
204
|
+
end
|
205
|
+
.select do |item|
|
206
|
+
item.visible_in_view?(view: view)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def get_items
|
211
|
+
# Each group is built only by standalone items or items that have their own panel, keeping the items order
|
212
|
+
grouped_items = visible_items.slice_when do |prev, curr|
|
213
|
+
# Slice when the item type changes from standalone to panel or vice-versa
|
214
|
+
is_standalone?(prev) != is_standalone?(curr)
|
215
|
+
end.to_a.map do |group|
|
216
|
+
{ elements: group, is_standalone: is_standalone?(group.first) }
|
217
|
+
end
|
218
|
+
|
219
|
+
# Creates a main panel if it's missing and adds first standalone group of items if present
|
220
|
+
if items.none? { |item| item.is_main_panel? }
|
221
|
+
if (standalone_group = grouped_items.find { |group| group[:is_standalone] }).present?
|
222
|
+
calculated_main_panel = Avo::Resources::Items::MainPanel.new
|
223
|
+
hydrate_item calculated_main_panel
|
224
|
+
calculated_main_panel.items_holder.items = standalone_group[:elements]
|
225
|
+
grouped_items[grouped_items.index standalone_group] = { elements: [calculated_main_panel], is_standalone: false }
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
# For each standalone group, wrap items in a panel
|
230
|
+
grouped_items.select { |group| group[:is_standalone] }.each do |group|
|
231
|
+
calculated_panel = Avo::Resources::Items::Panel.new
|
232
|
+
calculated_panel.items_holder.items = group[:elements]
|
233
|
+
hydrate_item calculated_panel
|
234
|
+
group[:elements] = calculated_panel
|
235
|
+
end
|
236
|
+
|
237
|
+
grouped_items.flat_map { |group| group[:elements] }
|
238
|
+
end
|
239
|
+
|
240
|
+
def items
|
241
|
+
items_holder&.items || []
|
242
|
+
end
|
243
|
+
|
244
|
+
def visible_items
|
245
|
+
items
|
246
|
+
.map do |item|
|
247
|
+
hydrate_item item
|
248
|
+
|
249
|
+
if item.is_a? Avo::Resources::Items::TabGroup
|
250
|
+
# Set the target to _top for all belongs_to fields in the tab group
|
251
|
+
item.items.grep(Avo::Resources::Items::Tab).each do |tab|
|
252
|
+
tab.items.grep(Avo::Resources::Items::Panel).each do |panel|
|
253
|
+
set_target_to_top panel.items.grep(Avo::Fields::BelongsToField)
|
254
|
+
|
255
|
+
panel.items.grep(Avo::Resources::Items::Row).each do |row|
|
256
|
+
set_target_to_top row.items.grep(Avo::Fields::BelongsToField)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
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?(%w[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
|
+
.select do |item|
|
296
|
+
!item.is_a?(Avo::Resources::Items::Sidebar)
|
297
|
+
end.compact
|
298
|
+
end
|
299
|
+
|
300
|
+
def is_empty?
|
301
|
+
visible_items.blank?
|
302
|
+
end
|
303
|
+
|
304
|
+
private
|
305
|
+
|
306
|
+
def set_target_to_top(fields)
|
307
|
+
fields.each do |field|
|
308
|
+
field.target = :_top
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
def extract_fields_from_items(thing)
|
313
|
+
fields = []
|
314
|
+
|
315
|
+
thing.items.each do |item|
|
316
|
+
if item.is_field?
|
317
|
+
fields << item
|
318
|
+
elsif item.is_panel? || item.is_row?
|
319
|
+
fields << extract_fields_from_items(item)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
fields
|
324
|
+
end
|
325
|
+
|
326
|
+
# Standalone items are fields that don't have their own panel
|
327
|
+
def is_standalone?(item)
|
328
|
+
item.is_field? && !item.has_own_panel?
|
329
|
+
end
|
330
|
+
|
331
|
+
def hydrate_item(item)
|
332
|
+
return unless item.respond_to? :hydrate
|
333
|
+
|
334
|
+
res = self.class.ancestors.include?(Avo::BaseResource) ? self : resource
|
335
|
+
item.hydrate(view: view, resource: res)
|
336
|
+
end
|
337
|
+
end
|
338
|
+
end
|
339
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Avo
|
2
|
+
module Concerns
|
3
|
+
module Hydration
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def hydrate(**args)
|
7
|
+
args.each do |key, value|
|
8
|
+
value = Avo::ViewInquirer.new value if key == :view
|
9
|
+
|
10
|
+
send("#{key}=", value) if respond_to?("#{key}=")
|
11
|
+
end
|
12
|
+
|
13
|
+
self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -2,42 +2,22 @@
|
|
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.class.
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
def is_tool?
|
24
|
-
self.class.item_type == :tool
|
25
|
-
end
|
26
|
-
|
27
|
-
def is_tab?
|
28
|
-
self.class.item_type == :tab
|
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
|
+
include Avo::Concerns::Hydration
|
6
|
+
|
7
|
+
# These attributes are required to be hydrated in order to properly find the visible_items
|
8
|
+
attr_accessor :resource
|
9
|
+
attr_accessor :view
|
10
|
+
|
11
|
+
# Returns the final state of if an item is visible or not
|
12
|
+
# For items that have children it checks to see if it contains any visible children.
|
13
|
+
def visible?
|
14
|
+
# For items that may contains other items like tabs and panels we should also check
|
15
|
+
# if any on their children have visible items.
|
16
|
+
if self.class.ancestors.include?(Avo::Concerns::HasItems)
|
17
|
+
return false unless visible_items.any?
|
18
|
+
end
|
19
|
+
|
20
|
+
super
|
41
21
|
end
|
42
22
|
end
|
43
23
|
end
|