avo 2.45.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 +3 -2
- data/app/components/avo/index/resource_table_component.rb +8 -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 +1 -1
- data/app/components/avo/paginator_component.rb +6 -6
- 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 -86
- 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 -180
- 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 +139 -91
- 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 +5 -3
- 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/_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/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 +82 -66
- data/lib/avo/base_resource.rb +285 -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/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 +2 -1
- data/lib/generators/avo/templates/locales/avo.en.yml +4 -3
- data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
- data/lib/generators/avo/templates/locales/avo.ro.yml +6 -5
- data/lib/generators/avo/templates/locales/avo.tr.yml +1 -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 +104 -113
- 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,150 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
module Concerns
|
3
|
-
module FetchesThings
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
class_methods do
|
7
|
-
# Returns the Avo dashboard by id
|
8
|
-
#
|
9
|
-
# get_dashboard_by_id(:dashy) -> Dashy
|
10
|
-
def get_dashboard_by_id(id)
|
11
|
-
dashboards.find do |dashboard|
|
12
|
-
dashboard.id == id
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Returns the Avo dashboard by name
|
17
|
-
#
|
18
|
-
# get_dashboard_by_name(:dashy) -> instance of Dashy
|
19
|
-
def get_dashboard_by_name(name)
|
20
|
-
dashboards.find do |dashboard|
|
21
|
-
dashboard.name == name
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# Filters out the resources that are missing the model_class
|
26
|
-
def valid_resources
|
27
|
-
resources.select { |resource| resource.model_class.present? }.sort_by(&:name)
|
28
|
-
end
|
29
|
-
|
30
|
-
# Returns the Avo resource by camelized name
|
31
|
-
#
|
32
|
-
# get_resource_by_name('User') => instance of UserResource
|
33
|
-
def get_resource(resource)
|
34
|
-
possible_resource = "#{resource}Resource".gsub "ResourceResource", "Resource"
|
35
|
-
|
36
|
-
resources.find do |available_resource|
|
37
|
-
possible_resource.to_s == available_resource.class.to_s
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
# Returns the Avo resource by singular snake_cased name
|
42
|
-
#
|
43
|
-
# get_resource_by_name('user') => instance of UserResource
|
44
|
-
def get_resource_by_name(name)
|
45
|
-
get_resource name.singularize.camelize
|
46
|
-
end
|
47
|
-
|
48
|
-
# Returns the Avo resource by singular snake_cased name
|
49
|
-
# From all the resources that use the same model_class, it will fetch the first one in alphabetical order
|
50
|
-
#
|
51
|
-
# get_resource_by_name('User') => instance of UserResource
|
52
|
-
# get_resource_by_name(User) => instance of UserResource
|
53
|
-
|
54
|
-
def get_resource_by_model_name(klass)
|
55
|
-
# Fetch the mappings imposed by the user.
|
56
|
-
# If they are present, use those ones.
|
57
|
-
mapping = get_mapping_for_model klass
|
58
|
-
return get_resource(mapping) if mapping.present?
|
59
|
-
|
60
|
-
valid_resources
|
61
|
-
.find do |resource|
|
62
|
-
resource.model_class.model_name.name == klass.to_s
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Returns the Avo resource by singular snake_cased name
|
67
|
-
#
|
68
|
-
# get_resource_by_controller_name('delayed_backend_active_record_jobs') => instance of DelayedJobResource
|
69
|
-
# get_resource_by_controller_name('users') => instance of UserResource
|
70
|
-
def get_resource_by_controller_name(name)
|
71
|
-
valid_resources
|
72
|
-
.find do |resource|
|
73
|
-
resource.model_class.to_s.pluralize.underscore.tr("/", "_") == name.to_s
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
# Returns the Avo resource by some name
|
78
|
-
def guess_resource(name)
|
79
|
-
get_resource_by_name(name.to_s) || get_resource_by_model_name(name)
|
80
|
-
end
|
81
|
-
|
82
|
-
# Returns the Rails model class by singular snake_cased name
|
83
|
-
#
|
84
|
-
# get_model_class_by_name('user') => User
|
85
|
-
def get_model_class_by_name(name)
|
86
|
-
name.to_s.camelize.singularize
|
87
|
-
end
|
88
|
-
|
89
|
-
def get_available_resources(user = nil)
|
90
|
-
valid_resources
|
91
|
-
.select do |resource|
|
92
|
-
resource.authorization.class.authorize(
|
93
|
-
user,
|
94
|
-
resource.model_class,
|
95
|
-
Avo.configuration.authorization_methods.stringify_keys["index"],
|
96
|
-
raise_exception: false
|
97
|
-
)
|
98
|
-
end
|
99
|
-
.sort_by { |r| r.name }
|
100
|
-
end
|
101
|
-
|
102
|
-
def get_available_dashboards(user = nil)
|
103
|
-
dashboards.sort_by { |r| r.name }
|
104
|
-
end
|
105
|
-
|
106
|
-
def resources_for_navigation(user = nil)
|
107
|
-
get_available_resources(current_user)
|
108
|
-
.select do |resource|
|
109
|
-
resource.visible_on_sidebar
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def dashboards_for_navigation(user = nil)
|
114
|
-
return [] if App.license.lacks_with_trial(:resource_ordering)
|
115
|
-
|
116
|
-
get_available_dashboards(user).select do |dashboard|
|
117
|
-
dashboard.is_visible?
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
# Insert any partials that we find in app/views/avo/sidebar/items.
|
122
|
-
def get_sidebar_partials
|
123
|
-
Dir.glob(Rails.root.join("app", "views", "avo", "sidebar", "items", "*.html.erb"))
|
124
|
-
.map do |path|
|
125
|
-
File.basename path
|
126
|
-
end
|
127
|
-
.map do |filename|
|
128
|
-
# remove the leading underscore (_)
|
129
|
-
filename[0] = ""
|
130
|
-
# remove the extension
|
131
|
-
filename.gsub!(".html.erb", "")
|
132
|
-
filename
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def tools_for_navigation
|
137
|
-
return [] if Avo::App.license.lacks_with_trial(:custom_tools)
|
138
|
-
|
139
|
-
get_sidebar_partials
|
140
|
-
end
|
141
|
-
|
142
|
-
private
|
143
|
-
|
144
|
-
def get_mapping_for_model(klass)
|
145
|
-
(Avo.configuration.model_resource_mapping || {}).stringify_keys.transform_values(&:to_s)[klass.to_s]
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
module Concerns
|
3
|
-
module HandlesFieldArgs
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
private
|
7
|
-
|
8
|
-
# Add an instance variable from args
|
9
|
-
# That may be a string, boolean, or array
|
10
|
-
# Each args should also have a default value
|
11
|
-
def add_prop_from_args(args = {}, name: nil, type: :string, default: nil)
|
12
|
-
value = default
|
13
|
-
|
14
|
-
if type == :boolean
|
15
|
-
case args[name.to_sym]
|
16
|
-
when nil
|
17
|
-
value = default
|
18
|
-
when false
|
19
|
-
value = false
|
20
|
-
when true
|
21
|
-
value = true
|
22
|
-
end
|
23
|
-
else
|
24
|
-
value = args[name.to_sym] unless args.dig(name.to_sym).nil?
|
25
|
-
end
|
26
|
-
|
27
|
-
instance_variable_set(:"@#{name}", value)
|
28
|
-
end
|
29
|
-
|
30
|
-
def add_boolean_prop(args, name, default = false)
|
31
|
-
add_prop_from_args args, name: name, default: default, type: :boolean
|
32
|
-
end
|
33
|
-
|
34
|
-
def add_array_prop(args, name, default = [])
|
35
|
-
add_prop_from_args args, name: name, default: default, type: :array
|
36
|
-
end
|
37
|
-
|
38
|
-
def add_object_prop(args, name, default = {})
|
39
|
-
add_prop_from_args args, name: name, default: default, type: :object
|
40
|
-
end
|
41
|
-
|
42
|
-
def add_string_prop(args, name, default = nil)
|
43
|
-
add_prop_from_args args, name: name, default: default, type: :string
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
module Concerns
|
3
|
-
module HasEditableControls
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
class_attribute :show_controls
|
8
|
-
class_attribute :show_controls_holder
|
9
|
-
class_attribute :show_controls_holder_called, default: false
|
10
|
-
end
|
11
|
-
|
12
|
-
def has_show_controls?
|
13
|
-
return false if ::Avo::App.license.lacks_with_trial(:resource_show_controls)
|
14
|
-
|
15
|
-
self.class.show_controls.present?
|
16
|
-
end
|
17
|
-
|
18
|
-
def render_show_controls
|
19
|
-
return [] if ::Avo::App.license.lacks_with_trial(:resource_show_controls)
|
20
|
-
|
21
|
-
if show_controls.present?
|
22
|
-
Avo::Resources::Controls::ExecutionContext.new(
|
23
|
-
block: show_controls,
|
24
|
-
resource: self,
|
25
|
-
record: model,
|
26
|
-
view: view
|
27
|
-
).handle&.items || []
|
28
|
-
else
|
29
|
-
[]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,334 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
module Concerns
|
3
|
-
module HasFields
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
class_attribute :items_holder
|
8
|
-
class_attribute :items_index, default: 0
|
9
|
-
class_attribute :tabs_holder
|
10
|
-
class_attribute :tabs_tabs_holder
|
11
|
-
class_attribute :raw_tabs
|
12
|
-
class_attribute :tools_holder
|
13
|
-
end
|
14
|
-
|
15
|
-
class_methods do
|
16
|
-
# DSL methods
|
17
|
-
def field(name, **args, &block)
|
18
|
-
ensure_items_holder_initialized
|
19
|
-
|
20
|
-
items_holder.field name, **args, &block
|
21
|
-
end
|
22
|
-
|
23
|
-
def panel(name = nil, **args, &block)
|
24
|
-
ensure_items_holder_initialized
|
25
|
-
|
26
|
-
items_holder.panel name, **args, &block
|
27
|
-
end
|
28
|
-
|
29
|
-
def row(**args, &block)
|
30
|
-
ensure_items_holder_initialized
|
31
|
-
|
32
|
-
items_holder.row(**args, &block)
|
33
|
-
end
|
34
|
-
|
35
|
-
def tabs(**args, &block)
|
36
|
-
ensure_items_holder_initialized
|
37
|
-
|
38
|
-
items_holder.tabs Avo::TabGroupBuilder.parse_block(**args, &block)
|
39
|
-
end
|
40
|
-
|
41
|
-
def tool(klass, **args)
|
42
|
-
ensure_items_holder_initialized
|
43
|
-
|
44
|
-
items_holder.tool klass, **args
|
45
|
-
end
|
46
|
-
|
47
|
-
def heading(body, **args)
|
48
|
-
ensure_items_holder_initialized
|
49
|
-
|
50
|
-
items_holder.heading body, **args
|
51
|
-
end
|
52
|
-
|
53
|
-
def sidebar(**args, &block)
|
54
|
-
ensure_items_holder_initialized
|
55
|
-
|
56
|
-
items_holder.sidebar Avo::SidebarBuilder.parse_block(**args, &block)
|
57
|
-
end
|
58
|
-
# END DSL methods
|
59
|
-
|
60
|
-
def items
|
61
|
-
if items_holder.present?
|
62
|
-
items_holder.items
|
63
|
-
else
|
64
|
-
[]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def tools
|
69
|
-
tools_holder
|
70
|
-
end
|
71
|
-
|
72
|
-
# Dives deep into panels and tabs to fetch all the fields for a resource.
|
73
|
-
def fields(only_root: false)
|
74
|
-
fields = []
|
75
|
-
|
76
|
-
items.each do |item|
|
77
|
-
next if item.nil?
|
78
|
-
|
79
|
-
unless only_root
|
80
|
-
# Dive into panels to fetch their fields
|
81
|
-
if item.is_panel?
|
82
|
-
fields << extract_fields_from_items(item)
|
83
|
-
end
|
84
|
-
|
85
|
-
# Dive into tabs to fetch their fields
|
86
|
-
if item.is_tab_group?
|
87
|
-
item.items.map do |tab|
|
88
|
-
fields << extract_fields_from_items(tab)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# Dive into sidebar to fetch their fields
|
93
|
-
if item.is_sidebar?
|
94
|
-
fields << extract_fields_from_items(item)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
if item.is_field?
|
99
|
-
fields << item
|
100
|
-
end
|
101
|
-
|
102
|
-
if item.is_row?
|
103
|
-
fields << extract_fields_from_items(tab)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
fields.flatten
|
108
|
-
end
|
109
|
-
|
110
|
-
def tab_groups
|
111
|
-
items.select do |item|
|
112
|
-
item.instance_of? Avo::TabGroup
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
private
|
117
|
-
|
118
|
-
def extract_fields_from_items(thing)
|
119
|
-
fields = []
|
120
|
-
|
121
|
-
thing.items.each do |item|
|
122
|
-
if item.is_field?
|
123
|
-
fields << item
|
124
|
-
elsif item.is_panel? || item.is_row?
|
125
|
-
fields << extract_fields_from_items(item)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
fields
|
130
|
-
end
|
131
|
-
|
132
|
-
def ensure_items_holder_initialized
|
133
|
-
self.items_holder ||= Avo::ItemsHolder.new
|
134
|
-
end
|
135
|
-
|
136
|
-
def add_to_fields(instance)
|
137
|
-
self.items ||= []
|
138
|
-
self.items << instance
|
139
|
-
increment_order_index
|
140
|
-
end
|
141
|
-
|
142
|
-
def increment_order_index
|
143
|
-
self.items_index += 1
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
delegate :invalid_fields, to: :items_holder
|
148
|
-
delegate :items, to: :items_holder
|
149
|
-
|
150
|
-
def hydrate_fields(model: nil, view: nil)
|
151
|
-
fields.map do |field|
|
152
|
-
field.hydrate(model: @model, view: @view, resource: self)
|
153
|
-
end
|
154
|
-
|
155
|
-
self
|
156
|
-
end
|
157
|
-
|
158
|
-
def get_tabs
|
159
|
-
tabs_holder
|
160
|
-
end
|
161
|
-
|
162
|
-
def fields(**args)
|
163
|
-
self.class.fields(**args)
|
164
|
-
end
|
165
|
-
|
166
|
-
def tab_groups
|
167
|
-
self.class.tab_groups
|
168
|
-
end
|
169
|
-
|
170
|
-
def get_field_definitions(only_root: false)
|
171
|
-
fields = self.fields(only_root: only_root)
|
172
|
-
|
173
|
-
return [] if fields.blank?
|
174
|
-
|
175
|
-
fields.map do |field|
|
176
|
-
field.hydrate(resource: self, user: user, view: view)
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
def get_fields(panel: nil, reflection: nil, only_root: false)
|
181
|
-
fields = get_field_definitions(only_root: only_root)
|
182
|
-
.select do |field|
|
183
|
-
field.visible_on?(view)
|
184
|
-
end
|
185
|
-
.select do |field|
|
186
|
-
field.visible?
|
187
|
-
end
|
188
|
-
.select do |field|
|
189
|
-
is_valid = true
|
190
|
-
|
191
|
-
# Strip out the reflection field in index queries with a parent association.
|
192
|
-
if reflection.present?
|
193
|
-
# regular non-polymorphic association
|
194
|
-
# we're matching the reflection inverse_of foriegn key with the field's foreign_key
|
195
|
-
if field.is_a?(Avo::Fields::BelongsToField)
|
196
|
-
if field.respond_to?(:foreign_key) &&
|
197
|
-
reflection.inverse_of.present? &&
|
198
|
-
reflection.inverse_of.respond_to?(:foreign_key) &&
|
199
|
-
reflection.inverse_of.foreign_key == field.foreign_key
|
200
|
-
is_valid = false
|
201
|
-
end
|
202
|
-
|
203
|
-
# polymorphic association
|
204
|
-
if field.respond_to?(:foreign_key) &&
|
205
|
-
field.is_polymorphic? &&
|
206
|
-
reflection.respond_to?(:polymorphic?) &&
|
207
|
-
reflection.inverse_of.respond_to?(:foreign_key) &&
|
208
|
-
reflection.inverse_of.foreign_key == field.reflection.foreign_key
|
209
|
-
is_valid = false
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
is_valid
|
215
|
-
end
|
216
|
-
|
217
|
-
if panel.present?
|
218
|
-
fields = fields.select do |field|
|
219
|
-
field.panel_name == panel
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
hydrate_fields(model: @model, view: @view)
|
224
|
-
|
225
|
-
fields
|
226
|
-
end
|
227
|
-
|
228
|
-
def get_field(id)
|
229
|
-
get_field_definitions.find do |f|
|
230
|
-
f.id == id.to_sym
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
def tools
|
235
|
-
check_license
|
236
|
-
|
237
|
-
return [] if App.license.lacks_with_trial :resource_tools
|
238
|
-
return [] if self.class.tools.blank?
|
239
|
-
|
240
|
-
self.items
|
241
|
-
.select do |item|
|
242
|
-
next if item.nil?
|
243
|
-
|
244
|
-
item.is_tool?
|
245
|
-
end
|
246
|
-
.map do |tool|
|
247
|
-
tool.hydrate view: view
|
248
|
-
tool
|
249
|
-
end
|
250
|
-
.select do |item|
|
251
|
-
item.visible_on?(view)
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
# Separates the fields that are in a panel and those that are just hanging out.
|
256
|
-
# Take the ones that aren't placed into a panel and add them to the "default" panel.
|
257
|
-
# This is to keep compatibility with the versions before 2.10 when you didn't have the ability to add fields to panels.
|
258
|
-
def get_items
|
259
|
-
panelless_items = []
|
260
|
-
panelfull_items = []
|
261
|
-
|
262
|
-
items.each do |item|
|
263
|
-
if item.respond_to? :hydrate
|
264
|
-
item.hydrate(view: view)
|
265
|
-
end
|
266
|
-
|
267
|
-
# fields and tabs can be hidden on some views
|
268
|
-
if item.respond_to? :visible_on?
|
269
|
-
next unless item.visible_on?(view)
|
270
|
-
end
|
271
|
-
# each field has it's own visibility checker
|
272
|
-
if item.respond_to? :visible?
|
273
|
-
item.hydrate(view: view) if item.view.nil?
|
274
|
-
|
275
|
-
next unless item.visible?
|
276
|
-
end
|
277
|
-
# check if the user is authorized to view it
|
278
|
-
if item.respond_to? :authorized?
|
279
|
-
next unless item.hydrate(model: @model).authorized?
|
280
|
-
end
|
281
|
-
|
282
|
-
if item.is_field?
|
283
|
-
if item.has_own_panel?
|
284
|
-
panelfull_items << item
|
285
|
-
else
|
286
|
-
panelless_items << item
|
287
|
-
end
|
288
|
-
else
|
289
|
-
panelfull_items << item
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
# Make sure all tabs panelfull_items are setted as inside tabs
|
294
|
-
panelfull_items.grep(Avo::TabGroup).each do |tab_group|
|
295
|
-
tab_group.items.grep(Avo::Tab).each do |tab|
|
296
|
-
tab.items.grep(Avo::Panel).each do |panel|
|
297
|
-
set_target_to_top panel.items.grep(Avo::Fields::BelongsToField)
|
298
|
-
|
299
|
-
panel.items.grep(Avo::Row).each do |row|
|
300
|
-
set_target_to_top row.items.grep(Avo::Fields::BelongsToField)
|
301
|
-
end
|
302
|
-
end
|
303
|
-
end
|
304
|
-
end
|
305
|
-
|
306
|
-
# Add all the panelles fields to a new panel
|
307
|
-
main_panel_holder = Avo::ItemsHolder.new
|
308
|
-
main_panel_holder.items = panelless_items
|
309
|
-
|
310
|
-
# Add that panel to the main panel
|
311
|
-
main_panel = Avo::MainPanel.new
|
312
|
-
main_panel.items_holder = main_panel_holder
|
313
|
-
|
314
|
-
# Return all the items but this time with all the panelless ones inside the main panel
|
315
|
-
[main_panel, *panelfull_items]
|
316
|
-
end
|
317
|
-
|
318
|
-
private
|
319
|
-
|
320
|
-
def set_target_to_top(fields)
|
321
|
-
fields.each do |field|
|
322
|
-
field.target = :_top
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
def check_license
|
327
|
-
if !Rails.env.production? && App.license.present? && App.license.lacks(:resource_tools)
|
328
|
-
# Add error message to let the developer know the resource tool will not be available in a production environment.
|
329
|
-
Avo::App.error_messages.push "Warning: Your license is invalid or doesn't support resource tools. The resource tools will not be visible in a production environment."
|
330
|
-
end
|
331
|
-
end
|
332
|
-
end
|
333
|
-
end
|
334
|
-
end
|
@@ -1,108 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
module Concerns
|
3
|
-
module HasHTMLAttributes
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
attr_reader :html
|
7
|
-
|
8
|
-
# Used to get attributes for elements and views
|
9
|
-
#
|
10
|
-
# examples:
|
11
|
-
# get_html :data, view: :edit, element: :input
|
12
|
-
# get_html :classes, view: :show, element: :wrapper
|
13
|
-
# get_html :styles, view: :index, element: :wrapper
|
14
|
-
def get_html(name = nil, element:, view:)
|
15
|
-
if [view, element].any?(&:nil?) || Avo::App.license.lacks_with_trial(:stimulus_js_integration)
|
16
|
-
default_attribute_value name
|
17
|
-
end
|
18
|
-
|
19
|
-
parsed = parse_html
|
20
|
-
|
21
|
-
attributes = if parsed.is_a? Hash
|
22
|
-
get_html_from_hash name, element: element, hash: parsed, view: view
|
23
|
-
elsif parsed.is_a? Avo::HTML::Builder
|
24
|
-
get_html_from_block name, element: element, html_builder: parsed, view: view
|
25
|
-
elsif parsed.nil?
|
26
|
-
# Handle empty parsed by returning an empty state
|
27
|
-
default_attribute_value name
|
28
|
-
end
|
29
|
-
|
30
|
-
add_default_data_attributes attributes, name, element, view
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
# Returns Hash, HTML::Builder, or nil.
|
36
|
-
def parse_html
|
37
|
-
return if @html.nil?
|
38
|
-
|
39
|
-
if @html.is_a? Hash
|
40
|
-
@html
|
41
|
-
elsif @html.respond_to? :call
|
42
|
-
Avo::HTML::Builder.parse_block(record: model, resource: resource, &@html)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def default_attribute_value(name)
|
47
|
-
name == :data ? {} : ""
|
48
|
-
end
|
49
|
-
|
50
|
-
def add_default_data_attributes(attributes, name, element, view)
|
51
|
-
if !attributes.nil? && name == :data && element == :input && view.in?([:edit, :new]) && resource.present? && resource.respond_to?(:get_stimulus_controllers)
|
52
|
-
extra_attributes = resource.get_stimulus_controllers
|
53
|
-
.split(" ")
|
54
|
-
.map do |controller|
|
55
|
-
[:"#{controller}-target", "#{id.to_s.underscore}_#{type.to_s.underscore}_input".camelize(:lower)]
|
56
|
-
end
|
57
|
-
.to_h
|
58
|
-
|
59
|
-
attributes.merge extra_attributes
|
60
|
-
else
|
61
|
-
attributes
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def get_html_from_block(name = nil, element:, html_builder:, view:)
|
66
|
-
values = []
|
67
|
-
|
68
|
-
# get view ancestor
|
69
|
-
values << html_builder.dig_stack(view, element, name)
|
70
|
-
# get element ancestor
|
71
|
-
values << html_builder.dig_stack(element, name)
|
72
|
-
# get direct ancestor
|
73
|
-
values << html_builder.dig_stack(name)
|
74
|
-
|
75
|
-
values_type = if name == :data
|
76
|
-
:hash
|
77
|
-
else
|
78
|
-
:string
|
79
|
-
end
|
80
|
-
|
81
|
-
merge_values_as(as: values_type, values: values)
|
82
|
-
end
|
83
|
-
|
84
|
-
def get_html_from_hash(name = nil, element:, hash:, view:)
|
85
|
-
# @todo: what if this is not a Hash but a string?
|
86
|
-
hash.dig(view, element, name) || {}
|
87
|
-
end
|
88
|
-
|
89
|
-
# Merge the values from all possible locations.
|
90
|
-
# If the result is "blank", return nil so the attributes are not outputted to the DOM.
|
91
|
-
#
|
92
|
-
# Ex: if the style attribute is empty return `nil` instead of an empty space `" "`
|
93
|
-
def merge_values_as(as: :array, values: [])
|
94
|
-
result = if as == :array
|
95
|
-
values.flatten
|
96
|
-
elsif as == :string
|
97
|
-
values.select do |value|
|
98
|
-
value.is_a? String
|
99
|
-
end.join " "
|
100
|
-
elsif as == :hash
|
101
|
-
values.reduce({}, :merge)
|
102
|
-
end
|
103
|
-
|
104
|
-
result if result.present?
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Avo
|
2
|
-
module Concerns
|
3
|
-
module PolicyHelpers
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
class_methods do
|
7
|
-
def inherit_association_from_policy(association_name, policy_class)
|
8
|
-
[:create, :edit, :update, :destroy, :show, :reorder, :act_on].each do |method_action|
|
9
|
-
define_policy_method(method_action, association_name, policy_class)
|
10
|
-
end
|
11
|
-
|
12
|
-
define_policy_method("view", association_name, policy_class, "index")
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
# Define a method for the given action and association name.
|
18
|
-
# Call the policy class with the given action passing the user and record.
|
19
|
-
# Example:
|
20
|
-
# def create_team_members?
|
21
|
-
# TeamMemberPolicy.new(user, record).create?
|
22
|
-
# end
|
23
|
-
def define_policy_method(method_action, association_name, policy_class, policy_action = method_action)
|
24
|
-
define_method "#{method_action}_#{association_name}?" do
|
25
|
-
policy_class.new(user, record).send "#{policy_action}?"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|