avo 2.43.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 +30 -26
- data/Gemfile.lock +235 -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 +37 -41
- 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/application.js +3 -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 +10 -7
- 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 +11 -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 +84 -82
- 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 -115
- 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 +223 -311
- 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 +121 -116
- 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/controllers/avo/team_users_controller.rb +0 -4
- 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/action_model.rb +0 -20
- 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
@@ -2,21 +2,26 @@ module Avo
|
|
2
2
|
module Fields
|
3
3
|
class BaseField
|
4
4
|
extend ActiveSupport::DescendantsTracker
|
5
|
-
extend Avo::Fields::FieldExtensions::HasFieldName
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
include
|
11
|
-
include Avo::
|
12
|
-
|
13
|
-
include Avo::Concerns::
|
14
|
-
include Avo::Fields::Concerns::
|
6
|
+
prepend Avo::Concerns::HasItemType
|
7
|
+
prepend Avo::Concerns::IsResourceItem
|
8
|
+
include Avo::Concerns::IsVisible
|
9
|
+
include Avo::Concerns::VisibleInDifferentViews
|
10
|
+
include Avo::Concerns::HasHelpers
|
11
|
+
include Avo::Fields::Concerns::HasFieldName
|
12
|
+
include Avo::Fields::Concerns::HasDefault
|
13
|
+
include Avo::Fields::Concerns::HasHTMLAttributes
|
14
|
+
include Avo::Fields::Concerns::HandlesFieldArgs
|
15
15
|
include Avo::Fields::Concerns::IsReadonly
|
16
16
|
include Avo::Fields::Concerns::IsDisabled
|
17
|
-
include Avo::Fields::Concerns::
|
17
|
+
include Avo::Fields::Concerns::IsRequired
|
18
|
+
include Avo::Fields::Concerns::UseViewComponents
|
18
19
|
|
19
|
-
|
20
|
+
include ActionView::Helpers::UrlHelper
|
21
|
+
|
22
|
+
delegate :app, to: ::Avo::Current
|
23
|
+
delegate :view_context, to: :app
|
24
|
+
delegate :context, to: :app
|
20
25
|
delegate :simple_format, :content_tag, to: :view_context
|
21
26
|
delegate :main_app, to: :view_context
|
22
27
|
delegate :avo, to: :view_context
|
@@ -33,12 +38,9 @@ module Avo
|
|
33
38
|
attr_reader :autocomplete
|
34
39
|
attr_reader :help
|
35
40
|
attr_reader :default
|
36
|
-
attr_reader :visible
|
37
|
-
attr_reader :as_label
|
38
41
|
attr_reader :as_avatar
|
39
|
-
attr_reader :as_description
|
40
|
-
attr_reader :index_text_align
|
41
42
|
attr_reader :stacked
|
43
|
+
attr_reader :for_presentation_only
|
42
44
|
|
43
45
|
# Private options
|
44
46
|
attr_reader :computable # if allowed to be computable
|
@@ -46,19 +48,14 @@ module Avo
|
|
46
48
|
attr_reader :computed_value # the value after computation
|
47
49
|
|
48
50
|
# Hydrated payload
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
attr_reader :user
|
54
|
-
attr_reader :panel_name
|
51
|
+
attr_accessor :record
|
52
|
+
attr_accessor :action
|
53
|
+
attr_accessor :user
|
54
|
+
attr_accessor :panel_name
|
55
55
|
|
56
56
|
class_attribute :field_name_attribute
|
57
|
-
class_attribute :item_type, default: :field
|
58
57
|
|
59
58
|
def initialize(id, **args, &block)
|
60
|
-
super(id, **args, &block)
|
61
|
-
|
62
59
|
@id = id
|
63
60
|
@name = args[:name]
|
64
61
|
@translation_key = args[:translation_key]
|
@@ -76,15 +73,14 @@ module Avo
|
|
76
73
|
@help = args[:help] || nil
|
77
74
|
@default = args[:default] || nil
|
78
75
|
@visible = args[:visible]
|
79
|
-
@as_label = args[:as_label] || false
|
80
76
|
@as_avatar = args[:as_avatar] || false
|
81
|
-
@as_description = args[:as_description] || false
|
82
|
-
@index_text_align = args[:index_text_align] || :left
|
83
77
|
@html = args[:html] || nil
|
84
|
-
@view = args[:view] || nil
|
78
|
+
@view = Avo::ViewInquirer.new(args[:view]) || nil
|
85
79
|
@value = args[:value] || nil
|
86
80
|
@stacked = args[:stacked] || nil
|
81
|
+
@for_presentation_only = args[:for_presentation_only] || false
|
87
82
|
@resource = args[:resource]
|
83
|
+
@components = args[:components] || {}
|
88
84
|
|
89
85
|
@args = args
|
90
86
|
|
@@ -92,28 +88,19 @@ module Avo
|
|
92
88
|
@computed = block.present?
|
93
89
|
@computed_value = nil
|
94
90
|
|
95
|
-
|
96
|
-
show_on args[:show_on] if args[:show_on].present?
|
97
|
-
hide_on args[:hide_on] if args[:hide_on].present?
|
98
|
-
only_on args[:only_on] if args[:only_on].present?
|
99
|
-
except_on args[:except_on] if args[:except_on].present?
|
91
|
+
post_initialize if respond_to?(:post_initialize)
|
100
92
|
end
|
101
93
|
|
102
|
-
def
|
103
|
-
@
|
104
|
-
@view = view if view.present?
|
105
|
-
@resource = resource if resource.present?
|
106
|
-
@action = action if action.present?
|
107
|
-
@user = user if user.present?
|
108
|
-
@panel_name = panel_name if panel_name.present?
|
109
|
-
|
110
|
-
self
|
94
|
+
def translation_key
|
95
|
+
@translation_key || "avo.field_translations.#{@id}"
|
111
96
|
end
|
112
97
|
|
113
|
-
def
|
114
|
-
|
98
|
+
def translated_name(default:)
|
99
|
+
t(translation_key, count: 1, default: default).humanize
|
100
|
+
end
|
115
101
|
|
116
|
-
|
102
|
+
def translated_plural_name(default:)
|
103
|
+
t(translation_key, count: 2, default: default).humanize
|
117
104
|
end
|
118
105
|
|
119
106
|
# Getting the name of the resource (user/users, post/posts)
|
@@ -123,8 +110,8 @@ module Avo
|
|
123
110
|
def name
|
124
111
|
return @name if custom_name?
|
125
112
|
|
126
|
-
if translation_key
|
127
|
-
|
113
|
+
if translation_key
|
114
|
+
translated_name default: default_name
|
128
115
|
else
|
129
116
|
default_name
|
130
117
|
end
|
@@ -133,15 +120,19 @@ module Avo
|
|
133
120
|
def plural_name
|
134
121
|
default = name.pluralize
|
135
122
|
|
136
|
-
if translation_key
|
137
|
-
|
123
|
+
if translation_key
|
124
|
+
translated_plural_name default: default
|
138
125
|
else
|
139
126
|
default
|
140
127
|
end
|
141
128
|
end
|
142
129
|
|
130
|
+
def table_header_label
|
131
|
+
name
|
132
|
+
end
|
133
|
+
|
143
134
|
def custom_name?
|
144
|
-
|
135
|
+
!@name.nil?
|
145
136
|
end
|
146
137
|
|
147
138
|
def default_name
|
@@ -149,21 +140,7 @@ module Avo
|
|
149
140
|
end
|
150
141
|
|
151
142
|
def placeholder
|
152
|
-
|
153
|
-
return Avo::Hosts::ResourceViewRecordHost.new(block: @placeholder, record: @model, resource: @resource, view: @view).handle
|
154
|
-
end
|
155
|
-
|
156
|
-
@placeholder || name
|
157
|
-
end
|
158
|
-
|
159
|
-
def visible?
|
160
|
-
return true if visible.nil?
|
161
|
-
|
162
|
-
if visible.respond_to?(:call)
|
163
|
-
visible.call resource: @resource
|
164
|
-
else
|
165
|
-
visible
|
166
|
-
end
|
143
|
+
Avo::ExecutionContext.new(target: @placeholder || name, record: record, resource: @resource, view: @view).handle
|
167
144
|
end
|
168
145
|
|
169
146
|
def value(property = nil)
|
@@ -171,8 +148,8 @@ module Avo
|
|
171
148
|
|
172
149
|
property ||= id
|
173
150
|
|
174
|
-
# Get
|
175
|
-
final_value =
|
151
|
+
# Get record value
|
152
|
+
final_value = record.send(property) if is_model?(record) && record.respond_to?(property)
|
176
153
|
|
177
154
|
# On new views and actions modals we need to prefill the fields with the default value
|
178
155
|
if should_fill_with_default_value? && default.present?
|
@@ -181,52 +158,57 @@ module Avo
|
|
181
158
|
|
182
159
|
# Run computable callback block if present
|
183
160
|
if computable && block.present?
|
184
|
-
final_value =
|
161
|
+
final_value = execute_block
|
185
162
|
end
|
186
163
|
|
187
|
-
if
|
188
|
-
|
189
|
-
Avo::ExecutionContext.new(
|
190
|
-
target:
|
191
|
-
model: model,
|
192
|
-
key: property,
|
164
|
+
# Run the value through resolver if present
|
165
|
+
if format_using.present?
|
166
|
+
final_value = Avo::ExecutionContext.new(
|
167
|
+
target: format_using,
|
193
168
|
value: final_value,
|
169
|
+
record: record,
|
194
170
|
resource: resource,
|
195
171
|
view: view,
|
196
172
|
field: self,
|
197
|
-
delegate_missing_to: :view_context,
|
198
173
|
include: self.class.included_modules
|
199
174
|
).handle
|
200
|
-
else
|
201
|
-
final_value
|
202
175
|
end
|
203
|
-
end
|
204
176
|
|
205
|
-
|
206
|
-
def fill_field(model, key, value, params)
|
207
|
-
return model unless model.methods.include? key.to_sym
|
208
|
-
|
209
|
-
if @update_using.present?
|
210
|
-
value = update_using(model, key, value, params)
|
211
|
-
end
|
212
|
-
|
213
|
-
model.public_send("#{key}=", value)
|
214
|
-
|
215
|
-
model
|
177
|
+
final_value
|
216
178
|
end
|
217
179
|
|
218
|
-
def
|
180
|
+
def execute_block
|
219
181
|
Avo::ExecutionContext.new(
|
220
|
-
target:
|
221
|
-
|
222
|
-
key: key,
|
223
|
-
value: value,
|
182
|
+
target: block,
|
183
|
+
record: record,
|
224
184
|
resource: resource,
|
185
|
+
view: view,
|
225
186
|
field: self,
|
226
187
|
include: self.class.included_modules
|
227
188
|
).handle
|
228
189
|
end
|
229
190
|
|
191
|
+
# Fills the record with the received value on create and update actions.
|
192
|
+
def fill_field(record, key, value, params)
|
193
|
+
return record unless record.methods.include? key.to_sym
|
194
|
+
|
195
|
+
if @update_using.present?
|
196
|
+
value = Avo::ExecutionContext.new(
|
197
|
+
target: @update_using,
|
198
|
+
record: record,
|
199
|
+
key: key,
|
200
|
+
value: value,
|
201
|
+
resource: resource,
|
202
|
+
field: self,
|
203
|
+
include: self.class.included_modules
|
204
|
+
).handle
|
205
|
+
end
|
206
|
+
|
207
|
+
record.public_send("#{key}=", value)
|
208
|
+
|
209
|
+
record
|
210
|
+
end
|
211
|
+
|
230
212
|
# Try to see if the field has a different database ID than it's name
|
231
213
|
def database_id
|
232
214
|
foreign_key
|
@@ -246,25 +228,8 @@ module Avo
|
|
246
228
|
id.to_sym
|
247
229
|
end
|
248
230
|
|
249
|
-
def
|
250
|
-
|
251
|
-
end
|
252
|
-
|
253
|
-
# Try and build the component class or fallback to a blank one
|
254
|
-
def component_for_view(view = :index)
|
255
|
-
# Use the edit variant for all "update" views
|
256
|
-
view = :edit if view.in? [:new, :create, :update]
|
257
|
-
|
258
|
-
component_class = "::Avo::Fields::#{view_component_name}::#{view.to_s.camelize}Component"
|
259
|
-
component_class.constantize
|
260
|
-
rescue
|
261
|
-
# When returning nil, a race condition happens and throws an error in some environments.
|
262
|
-
# See https://github.com/avo-hq/avo/pull/365
|
263
|
-
::Avo::BlankFieldComponent
|
264
|
-
end
|
265
|
-
|
266
|
-
def model_errors
|
267
|
-
model.nil? ? {} : model.errors
|
231
|
+
def record_errors
|
232
|
+
record.nil? ? {} : record.errors
|
268
233
|
end
|
269
234
|
|
270
235
|
def type
|
@@ -285,8 +250,12 @@ module Avo
|
|
285
250
|
!visible_in_reflection?
|
286
251
|
end
|
287
252
|
|
253
|
+
def options_for_filter
|
254
|
+
options
|
255
|
+
end
|
256
|
+
|
288
257
|
def updatable
|
289
|
-
!
|
258
|
+
!is_disabled? && visible?
|
290
259
|
end
|
291
260
|
|
292
261
|
# Used by Avo to fill the record with the default value on :new and :edit views
|
@@ -313,7 +282,7 @@ module Avo
|
|
313
282
|
end
|
314
283
|
|
315
284
|
def on_create?
|
316
|
-
@view.in?([
|
285
|
+
@view.in?(%w[new create])
|
317
286
|
end
|
318
287
|
|
319
288
|
def in_action?
|
@@ -57,6 +57,7 @@ module Avo
|
|
57
57
|
# - is_disabled?
|
58
58
|
|
59
59
|
class BelongsToField < BaseField
|
60
|
+
include Avo::Fields::Concerns::IsSearchable
|
60
61
|
include Avo::Fields::Concerns::UseResource
|
61
62
|
|
62
63
|
attr_accessor :target
|
@@ -84,10 +85,6 @@ module Avo
|
|
84
85
|
@use_resource = args[:use_resource] || nil
|
85
86
|
end
|
86
87
|
|
87
|
-
def searchable
|
88
|
-
@searchable && ::Avo::App.license.has_with_trial(:searchable_associations)
|
89
|
-
end
|
90
|
-
|
91
88
|
def value
|
92
89
|
if is_polymorphic?
|
93
90
|
# Get the value from the pre-filled assoociation record
|
@@ -107,9 +104,7 @@ module Avo
|
|
107
104
|
|
108
105
|
# What the user sees in the text field
|
109
106
|
def field_label
|
110
|
-
|
111
|
-
rescue
|
112
|
-
nil
|
107
|
+
label
|
113
108
|
end
|
114
109
|
|
115
110
|
def options
|
@@ -118,16 +113,16 @@ module Avo
|
|
118
113
|
|
119
114
|
def values_for_type(model = nil)
|
120
115
|
resource = target_resource
|
121
|
-
resource =
|
116
|
+
resource = Avo.resource_manager.get_resource_by_model_class model if model.present?
|
122
117
|
|
123
|
-
query = resource.
|
118
|
+
query = resource.query_scope
|
124
119
|
|
125
120
|
if attach_scope.present?
|
126
|
-
query = Avo::
|
121
|
+
query = Avo::ExecutionContext.new(target: attach_scope, query: query, parent: get_model).handle
|
127
122
|
end
|
128
123
|
|
129
|
-
query.all.map do |
|
130
|
-
[
|
124
|
+
query.all.map do |record|
|
125
|
+
[resource.new(record: record).record_title, record.id]
|
131
126
|
end
|
132
127
|
end
|
133
128
|
|
@@ -160,8 +155,8 @@ module Avo
|
|
160
155
|
def foreign_key
|
161
156
|
return polymorphic_as if polymorphic_as.present?
|
162
157
|
|
163
|
-
if @
|
164
|
-
get_model_class(@
|
158
|
+
if @record.present?
|
159
|
+
get_model_class(@record).reflections[@relation_method].foreign_key
|
165
160
|
elsif @resource.present? && @resource.model_class.reflections[@relation_method].present?
|
166
161
|
@resource.model_class.reflections[@relation_method].foreign_key
|
167
162
|
end
|
@@ -185,7 +180,8 @@ module Avo
|
|
185
180
|
end
|
186
181
|
|
187
182
|
def label
|
188
|
-
|
183
|
+
return if target_resource.blank?
|
184
|
+
target_resource.new(record: value)&.record_title
|
189
185
|
end
|
190
186
|
|
191
187
|
def to_permitted_param
|
@@ -237,7 +233,7 @@ module Avo
|
|
237
233
|
|
238
234
|
if is_polymorphic?
|
239
235
|
if value.present?
|
240
|
-
return
|
236
|
+
return Avo.resource_manager.get_resource_by_model_class(value.class)
|
241
237
|
else
|
242
238
|
return nil
|
243
239
|
end
|
@@ -245,25 +241,25 @@ module Avo
|
|
245
241
|
|
246
242
|
reflection_key = polymorphic_as || id
|
247
243
|
|
248
|
-
if @
|
249
|
-
|
250
|
-
elsif @
|
251
|
-
|
244
|
+
if @record._reflections[reflection_key.to_s].klass.present?
|
245
|
+
Avo.resource_manager.get_resource_by_model_class @record._reflections[reflection_key.to_s].klass.to_s
|
246
|
+
elsif @record._reflections[reflection_key.to_s].options[:class_name].present?
|
247
|
+
Avo.resource_manager.get_resource_by_model_class @record._reflections[reflection_key.to_s].options[:class_name]
|
252
248
|
else
|
253
249
|
App.get_resource_by_name reflection_key.to_s
|
254
250
|
end
|
255
251
|
end
|
256
252
|
|
257
253
|
def get_model
|
258
|
-
return @
|
254
|
+
return @record if @record.present?
|
259
255
|
|
260
|
-
@resource.
|
256
|
+
@resource.record
|
261
257
|
rescue
|
262
258
|
nil
|
263
259
|
end
|
264
260
|
|
265
261
|
def name
|
266
|
-
return polymorphic_as.to_s.humanize if polymorphic_as.present? && view
|
262
|
+
return polymorphic_as.to_s.humanize if polymorphic_as.present? && view.index?
|
267
263
|
|
268
264
|
super
|
269
265
|
end
|
@@ -6,7 +6,7 @@ module Avo
|
|
6
6
|
|
7
7
|
delegate :authorization, to: :@resource
|
8
8
|
delegate :authorize_action, to: :authorization
|
9
|
-
delegate :id, :
|
9
|
+
delegate :id, :record, to: :@field
|
10
10
|
|
11
11
|
def can_upload_file?
|
12
12
|
authorize_file_action(:upload)
|
@@ -23,7 +23,7 @@ module Avo
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def authorize_file_action(action)
|
26
|
-
authorize_action("#{action}_#{id}?", record:
|
26
|
+
authorize_action("#{action}_#{id}?", record: record, raise_exception: false)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Avo
|
2
|
+
module Fields
|
3
|
+
module Concerns
|
4
|
+
module HandlesFieldArgs
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
# Add an instance variable from args
|
10
|
+
# That may be a string, boolean, or array
|
11
|
+
# Each args should also have a default value
|
12
|
+
def add_prop_from_args(args = {}, name: nil, type: :string, default: nil)
|
13
|
+
value = default
|
14
|
+
|
15
|
+
if type == :boolean
|
16
|
+
case args[name.to_sym]
|
17
|
+
when nil
|
18
|
+
value = default
|
19
|
+
when false
|
20
|
+
value = false
|
21
|
+
when true
|
22
|
+
value = true
|
23
|
+
end
|
24
|
+
else
|
25
|
+
value = args[name.to_sym] unless args.dig(name.to_sym).nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
instance_variable_set(:"@#{name}", value)
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_boolean_prop(args, name, default = false)
|
32
|
+
add_prop_from_args args, name: name, default: default, type: :boolean
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_array_prop(args, name, default = [])
|
36
|
+
add_prop_from_args args, name: name, default: default, type: :array
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_object_prop(args, name, default = {})
|
40
|
+
add_prop_from_args args, name: name, default: default, type: :object
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_string_prop(args, name, default = nil)
|
44
|
+
add_prop_from_args args, name: name, default: default, type: :string
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -5,11 +5,7 @@ module Avo
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
def computed_default_value
|
8
|
-
|
9
|
-
Avo::Hosts::ResourceViewRecordHost.new(block: default, record: model, view: view, resource: resource).handle
|
10
|
-
else
|
11
|
-
default
|
12
|
-
end
|
8
|
+
Avo::ExecutionContext.new(target: default, record: record, view: view, resource: resource).handle
|
13
9
|
end
|
14
10
|
end
|
15
11
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Avo
|
2
|
+
module Fields
|
3
|
+
module Concerns
|
4
|
+
module HasFieldName
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
class_methods do
|
8
|
+
def field_name(name)
|
9
|
+
self.field_name_attribute = name
|
10
|
+
end
|
11
|
+
|
12
|
+
# Get the field name
|
13
|
+
def get_field_name
|
14
|
+
return field_name_attribute if field_name_attribute.present?
|
15
|
+
|
16
|
+
to_s.demodulize.underscore.gsub "_field", ""
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Avo
|
2
|
+
module Fields
|
3
|
+
module Concerns
|
4
|
+
module HasHTMLAttributes
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
attr_reader :html
|
8
|
+
|
9
|
+
# Used to get attributes for elements and views
|
10
|
+
#
|
11
|
+
# examples:
|
12
|
+
# get_html :data, view: :edit, element: :input
|
13
|
+
# get_html :classes, view: :show, element: :wrapper
|
14
|
+
# get_html :styles, view: :index, element: :wrapper
|
15
|
+
def get_html(name = nil, element:, view:)
|
16
|
+
view = view.to_sym if view.present?
|
17
|
+
|
18
|
+
if [view, element].any?(&:nil?)
|
19
|
+
default_attribute_value name
|
20
|
+
end
|
21
|
+
|
22
|
+
parsed = parse_html
|
23
|
+
|
24
|
+
attributes = if parsed.is_a? Hash
|
25
|
+
get_html_from_hash name, element: element, hash: parsed, view: view
|
26
|
+
elsif parsed.is_a? Avo::HTML::Builder
|
27
|
+
get_html_from_block name, element: element, html_builder: parsed, view: view
|
28
|
+
elsif parsed.nil?
|
29
|
+
# Handle empty parsed by returning an empty state
|
30
|
+
default_attribute_value name
|
31
|
+
end
|
32
|
+
|
33
|
+
add_default_data_attributes attributes, name, element, view
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Returns Hash, HTML::Builder, or nil.
|
39
|
+
def parse_html
|
40
|
+
return if @html.nil?
|
41
|
+
|
42
|
+
if @html.is_a? Hash
|
43
|
+
@html
|
44
|
+
elsif @html.respond_to? :call
|
45
|
+
Avo::HTML::Builder.parse_block(record: record, resource: resource, &@html)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_attribute_value(name)
|
50
|
+
name == :data ? {} : ""
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_default_data_attributes(attributes, name, element, view)
|
54
|
+
if !attributes.nil? && name == :data && element == :input && view.in?([:edit, :new]) && resource.present? && resource.respond_to?(:get_stimulus_controllers)
|
55
|
+
extra_attributes = resource.get_stimulus_controllers
|
56
|
+
.split(" ")
|
57
|
+
.map do |controller|
|
58
|
+
[:"#{controller}-target", "#{id.to_s.underscore}_#{type.to_s.underscore}_input".camelize(:lower)]
|
59
|
+
end
|
60
|
+
.to_h
|
61
|
+
|
62
|
+
attributes.merge extra_attributes
|
63
|
+
else
|
64
|
+
attributes
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_html_from_block(name = nil, element:, html_builder:, view:)
|
69
|
+
values = []
|
70
|
+
|
71
|
+
# get view ancestor
|
72
|
+
values << html_builder.dig_stack(view, element, name)
|
73
|
+
# get element ancestor
|
74
|
+
values << html_builder.dig_stack(element, name)
|
75
|
+
# get direct ancestor
|
76
|
+
values << html_builder.dig_stack(name)
|
77
|
+
|
78
|
+
values_type = if name == :data
|
79
|
+
:hash
|
80
|
+
else
|
81
|
+
:string
|
82
|
+
end
|
83
|
+
|
84
|
+
merge_values_as(as: values_type, values: values)
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_html_from_hash(name = nil, element:, hash:, view:)
|
88
|
+
# @todo: what if this is not a Hash but a string?
|
89
|
+
hash.dig(view, element, name) || {}
|
90
|
+
end
|
91
|
+
|
92
|
+
# Merge the values from all possible locations.
|
93
|
+
# If the result is "blank", return nil so the attributes are not outputted to the DOM.
|
94
|
+
#
|
95
|
+
# Ex: if the style attribute is empty return `nil` instead of an empty space `" "`
|
96
|
+
def merge_values_as(as: :array, values: [])
|
97
|
+
result = if as == :array
|
98
|
+
values.flatten
|
99
|
+
elsif as == :string
|
100
|
+
values.select do |value|
|
101
|
+
value.is_a? String
|
102
|
+
end.join " "
|
103
|
+
elsif as == :hash
|
104
|
+
values.reduce({}, :merge)
|
105
|
+
end
|
106
|
+
|
107
|
+
result if result.present?
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -7,11 +7,7 @@ module Avo
|
|
7
7
|
attr_reader :disabled
|
8
8
|
|
9
9
|
def is_disabled?
|
10
|
-
|
11
|
-
Avo::Hosts::ResourceViewRecordHost.new(block: disabled, record: model, view: view, resource: resource).handle
|
12
|
-
else
|
13
|
-
disabled
|
14
|
-
end
|
10
|
+
Avo::ExecutionContext.new(target: disabled, record: record, view: view, resource: resource).handle
|
15
11
|
end
|
16
12
|
end
|
17
13
|
end
|
@@ -5,11 +5,7 @@ module Avo
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
def is_readonly?
|
8
|
-
|
9
|
-
Avo::Hosts::ResourceViewRecordHost.new(block: readonly, record: model, view: view, resource: resource).handle
|
10
|
-
else
|
11
|
-
readonly
|
12
|
-
end
|
8
|
+
Avo::ExecutionContext.new(target: readonly, record: record, view: view, resource: resource).handle
|
13
9
|
end
|
14
10
|
end
|
15
11
|
end
|